Source code for tet.services

"""
Dependency injection support for Tet applications.

This module provides dependency injection via ``pyramid_di``. It is included
automatically when using the ``services`` feature.

The DI primitives (:func:`service`, :class:`RequestScopedBaseService`,
:class:`ApplicationScopedBaseService`, :class:`BaseService`,
:func:`autowired`) are re-exported here so application code can import
them from a single, stable location -- ``tet.services`` -- rather than
reaching into ``pyramid_di`` directly.

Example
-------

Defining a service::

    from tet.services import service, RequestScopedBaseService, autowired

    @service()
    class UserService(RequestScopedBaseService):
        def get_user(self, user_id):
            return self.request.dbsession.query(User).get(user_id)

    @service()
    class OrderService(RequestScopedBaseService):
        user_service = autowired(UserService)

        def get_user_orders(self, user_id):
            user = self.user_service.get_user(user_id)
            return user.orders

Setup and scanning services::

    from tet.config import application_factory

    @application_factory(included_features=["services"])
    def main(config):
        config.scan_services("myapp.services")
        config.scan()

Using services in class-based views::

    from pyramid.view import view_config
    from tet.services import autowired
    from myapp.services import UserService

    class UserViews:
        user_service = autowired(UserService)

        def __init__(self, request):
            self.request = request

        @view_config(route_name="user", renderer="json")
        def get_user(self):
            return self.user_service.get_user(self.request.matchdict["id"])

Using services in function-based views::

    from pyramid.view import view_config
    from myapp.services import UserService

    @view_config(route_name="user", renderer="json")
    def get_user(request):
        user_service = request.find_service(UserService)
        return user_service.get_user(request.matchdict["id"])
"""
from pyramid.config import Configurator
from pyramid_di import (  # noqa: F401
    ApplicationScopedBaseService,
    BaseService,
    RequestScopedBaseService,
    autowired,
    service,
)

__all__ = [
    "ApplicationScopedBaseService",
    "BaseService",
    "RequestScopedBaseService",
    "autowired",
    "includeme",
    "service",
]


[docs] def includeme(config: Configurator) -> None: """Include pyramid_di for dependency injection support.""" config.include("pyramid_di")