Skip to content

Commit cebccce

Browse files
committed
Add wirio
1 parent 37a5c11 commit cebccce

10 files changed

Lines changed: 225 additions & 241 deletions

File tree

notebooks/notebook.ipynb

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"cells": [
33
{
44
"cell_type": "code",
5-
"execution_count": null,
5+
"execution_count": 1,
66
"metadata": {},
77
"outputs": [],
88
"source": [
@@ -12,20 +12,11 @@
1212
},
1313
{
1414
"cell_type": "code",
15-
"execution_count": null,
15+
"execution_count": 2,
1616
"metadata": {},
1717
"outputs": [],
1818
"source": [
19-
"service_provider = await services.build_service_provider().__aenter__()"
20-
]
21-
},
22-
{
23-
"cell_type": "code",
24-
"execution_count": null,
25-
"metadata": {},
26-
"outputs": [],
27-
"source": [
28-
"email_service = await service_provider.get_required_service(EmailService)\n",
19+
"email_service = await services.get(EmailService)\n",
2920
"await email_service.send_email()"
3021
]
3122
}

pyproject.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ version = "0.1.0"
44
requires-python = ">=3.14"
55
dependencies = [
66
"aiohttp>=3.13.3",
7-
"aspy-dependency-injection>=0.5.0",
87
"asyncpg>=0.31.0",
9-
"azure-monitor-opentelemetry>=1.8.4",
8+
"azure-monitor-opentelemetry>=1.8.5",
109
"fastapi[standard-no-fastapi-cloud-cli]>=0.128.0",
1110
"greenlet>=3.3.1",
1211
"pydantic>=2.12.5",
1312
"pydantic-settings[azure-key-vault]>=2.12.0",
1413
"sqlmodel>=0.0.31",
14+
"wirio>=0.7.0",
1515
]
1616

1717
[dependency-groups]
@@ -22,7 +22,7 @@ dev = [
2222
"pytest-cov>=7.0.0",
2323
"pytest-mock>=3.15.1",
2424
"ruff>=0.14.14",
25-
"ty>=0.0.13",
25+
"ty>=0.0.14",
2626
]
2727

2828
[build-system]

scripts/script.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66

77
async def main() -> None:
8-
async with services.build_service_provider() as service_provider:
9-
email_service = await service_provider.get_required_service(EmailService)
8+
async with services:
9+
email_service = await services.get(EmailService)
1010
await email_service.send_email()
1111

1212

src/python_template/api/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
from aspy_dependency_injection.service_collection import ServiceCollection
21
from fastapi import FastAPI
2+
from wirio.service_container import ServiceContainer
33

44
from python_template.api.application_settings import ApplicationSettings
55
from python_template.api.service_collection_extensions import (
@@ -24,7 +24,7 @@
2424
app = FastAPI(openapi_url=openapi_url)
2525
app.include_router(product_router)
2626

27-
services = ServiceCollection()
27+
services = ServiceContainer()
2828
application_settings = ApplicationSettings() # ty:ignore[missing-argument]
2929
services.add_singleton(ApplicationSettings, application_settings)
3030
add_observability(services, application_settings)

src/python_template/api/service_collection_extensions.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import logging
22
from logging import Logger
33

4-
from aspy_dependency_injection.service_collection import ServiceCollection
54
from azure.identity import DefaultAzureCredential
65
from azure.monitor.opentelemetry import configure_azure_monitor
76
from sqlalchemy.ext.asyncio import (
@@ -10,13 +9,14 @@
109
async_sessionmaker,
1110
create_async_engine,
1211
)
12+
from wirio.service_container import ServiceContainer
1313

1414
from python_template.api.application_settings import ApplicationSettings
1515
from python_template.common.application_environment import ApplicationEnvironment
1616

1717

1818
def add_observability(
19-
services: ServiceCollection, application_settings: ApplicationSettings
19+
services: ServiceContainer, application_settings: ApplicationSettings
2020
) -> None:
2121
def inject_logging() -> Logger:
2222
return logging.getLogger(__name__)
@@ -32,7 +32,7 @@ def inject_logging() -> Logger:
3232
)
3333

3434

35-
def add_sqlmodel(services: ServiceCollection) -> None:
35+
def add_sqlmodel(services: ServiceContainer) -> None:
3636
def inject_async_engine(application_settings: ApplicationSettings) -> AsyncEngine:
3737
return create_async_engine(application_settings.postgresql_connection_string)
3838

src/python_template/api/workflows/products/product_router.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Annotated
22

3-
from aspy_dependency_injection.annotations import Inject
43
from fastapi import APIRouter
4+
from wirio.annotations import FromServices
55

66
from python_template.api.workflows.products.discontinue_product.discontinue_product_request import (
77
DiscontinueProductRequest,
@@ -28,14 +28,14 @@
2828
@product_router.post("")
2929
async def publish_product(
3030
request: PublishProductRequest,
31-
workflow: Annotated[PublishProductWorkflow, Inject()],
31+
workflow: Annotated[PublishProductWorkflow, FromServices()],
3232
) -> PublishProductResponse:
3333
return await workflow.execute(request)
3434

3535

3636
@product_router.post("/discontinue")
3737
async def discontinue_product(
3838
request: DiscontinueProductRequest,
39-
workflow: Annotated[DiscontinueProductWorkflow, Inject()],
39+
workflow: Annotated[DiscontinueProductWorkflow, FromServices()],
4040
) -> None:
4141
await workflow.execute(request)

tests/integration/api/conftest.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from collections.abc import AsyncGenerator
22

33
import pytest
4-
from aspy_dependency_injection.service_provider import ServiceProvider
4+
from wirio.service_container import ServiceContainer
55

66
from python_template.api.main import services
77

88

99
@pytest.fixture
10-
async def service_provider() -> AsyncGenerator[ServiceProvider]:
11-
async with services.build_service_provider() as service_provider:
12-
yield service_provider
10+
async def services_fixture() -> AsyncGenerator[ServiceContainer]:
11+
async with services:
12+
yield services

tests/integration/api/workflows/products/discontinue_product/test_discontinue_product_workflow.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
2-
from aspy_dependency_injection.service_provider import ServiceProvider
32
from sqlalchemy.ext.asyncio import AsyncSession
3+
from wirio.service_container import ServiceContainer
44

55
from python_template.api.workflows.products.discontinue_product.discontinue_product_request import (
66
DiscontinueProductRequest,
@@ -14,11 +14,9 @@
1414

1515
class TestDiscontinueProductWorkflow:
1616
@pytest.fixture(autouse=True)
17-
async def setup(self, service_provider: ServiceProvider) -> None:
18-
self.workflow = await service_provider.get_required_service(
19-
DiscontinueProductWorkflow
20-
)
21-
self.sql_session = await service_provider.get_required_service(AsyncSession)
17+
async def setup(self, services_fixture: ServiceContainer) -> None:
18+
self.workflow = await services_fixture.get(DiscontinueProductWorkflow)
19+
self.sql_session = await services_fixture.get(AsyncSession)
2220

2321
async def test_discontinue_product(self) -> None:
2422
product = ProductBuilder().build()

tests/integration/api/workflows/products/publish_product/test_publish_product_workflow.py

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import pytest
2-
from aspy_dependency_injection.service_provider import ServiceProvider
2+
from wirio.service_container import ServiceContainer
33

44
from python_template.api.workflows.products.publish_product.publish_product_workflow import (
55
PublishProductWorkflow,
@@ -11,10 +11,8 @@
1111

1212
class TestPublishProductWorkflow:
1313
@pytest.fixture(autouse=True)
14-
async def setup(self, service_provider: ServiceProvider) -> None:
15-
self.workflow = await service_provider.get_required_service(
16-
PublishProductWorkflow
17-
)
14+
async def setup(self, services_fixture: ServiceContainer) -> None:
15+
self.workflow = await services_fixture.get(PublishProductWorkflow)
1816

1917
async def test_publish_product(self) -> None:
2018
request = PublishProductRequestBuilder().build()

0 commit comments

Comments
 (0)