diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0f58873 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,53 @@ +name: main + +on: + push: + branches: + - main + pull_request: {} + +concurrency: + group: ${{ github.head_ref || github.run_id }} + cancel-in-progress: true + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + - uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "**/pyproject.toml" + - run: uv python install 3.10 + - run: just install lint-ci + + pytest: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: + - "3.10" + - "3.11" + - "3.12" + - "3.13" + - "3.14" + steps: + - uses: actions/checkout@v4 + - uses: extractions/setup-just@v2 + - uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "**/pyproject.toml" + - run: uv python install ${{ matrix.python-version }} + - run: just install + - run: just test . --cov=. --cov-report xml + - uses: codecov/codecov-action@v4.0.1 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + with: + files: ./coverage.xml + flags: unittests + name: codecov-${{ matrix.python-version }} diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml deleted file mode 100644 index c7bf5e4..0000000 --- a/.github/workflows/lint.yml +++ /dev/null @@ -1,21 +0,0 @@ -name: lint - -on: - push: - branches: - - main - pull_request: {} - -concurrency: - group: ${{ github.head_ref || github.run_id }} core lint - cancel-in-progress: true - -jobs: - lint: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: extractions/setup-just@v2 - - uses: astral-sh/setup-uv@v5 - - run: uv python install 3.10 - - run: just install lint-ci diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 5b8b049..b637272 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: publish +name: Publish Package on: release: @@ -11,9 +11,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: extractions/setup-just@v2 - - uses: astral-sh/setup-uv@v5 - - run: | - (cd packages/modern-di && uv version $GITHUB_REF_NAME && just publish modern-di) - (cd packages/modern-di-faststream && uv version $GITHUB_REF_NAME && just publish modern-di-faststream) + - uses: astral-sh/setup-uv@v3 + - run: just publish env: PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} diff --git a/.github/workflows/test-core.yml b/.github/workflows/test-core.yml deleted file mode 100644 index e431a3c..0000000 --- a/.github/workflows/test-core.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: test core - -on: - push: - branches: - - main - paths: - - 'packages/modern-di/**' - - '.github/workflows/test-core.yml' - pull_request: - paths: - - 'packages/modern-di/**' - - '.github/workflows/test-core.yml' - -concurrency: - group: ${{ github.head_ref || github.run_id }} core test - cancel-in-progress: true - -jobs: - pytest: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - python-version: - - "3.10" - - "3.11" - - "3.12" - - "3.13" - - "3.14" - steps: - - uses: actions/checkout@v4 - - uses: extractions/setup-just@v2 - - uses: astral-sh/setup-uv@v5 - - run: uv python install ${{ matrix.python-version }} - - run: | - just install-ci modern-di - just test-core diff --git a/.github/workflows/test-faststream.yml b/.github/workflows/test-faststream.yml deleted file mode 100644 index c95d574..0000000 --- a/.github/workflows/test-faststream.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: test faststream - -on: - push: - branches: - - main - paths: - - 'packages/modern-di-faststream/**' - - '.github/workflows/test-faststream.yml' - pull_request: - paths: - - 'packages/modern-di-faststream/**' - - '.github/workflows/test-faststream.yml' - -concurrency: - group: ${{ github.head_ref || github.run_id }} fastapi - cancel-in-progress: false - -jobs: - pytest: - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - python-version: - - "3.10" - - "3.11" - - "3.12" - - "3.13" - - "3.14" - steps: - - uses: actions/checkout@v4 - - uses: extractions/setup-just@v2 - - uses: astral-sh/setup-uv@v5 - - run: uv python install ${{ matrix.python-version }} - - run: | - just install-ci modern-di-faststream - just test-faststream diff --git a/Justfile b/Justfile index 03b2f09..fabf8c0 100644 --- a/Justfile +++ b/Justfile @@ -2,34 +2,28 @@ default: install lint test install: uv lock --upgrade - uv sync --all-extras --all-packages --frozen - -install-ci package: - uv lock --upgrade - uv sync --all-extras --package {{ package }} --frozen + uv sync --all-extras --frozen --group lint lint: uv run eof-fixer . - uv run ruff format . - uv run ruff check . --fix + uv run ruff format + uv run ruff check --fix uv run mypy . lint-ci: uv run eof-fixer . --check - uv run ruff format . --check - uv run ruff check . --no-fix + uv run ruff format --check + uv run ruff check --no-fix uv run mypy . test *args: - uv run pytest {{ args }} - -test-core *args: - uv run --directory=packages/modern-di pytest {{ args }} + uv run --no-sync pytest {{ args }} -test-faststream *args: - uv run --directory=packages/modern-di-faststream pytest {{ args }} +test-branch: + @just test --cov-branch -publish package: +publish: rm -rf dist - uv build --package {{ package }} + uv version $GITHUB_REF_NAME + uv build uv publish --token $PYPI_TOKEN diff --git a/README.md b/README.md index d5e87df..5fdfcea 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ "Modern-DI" == -| Project | Badges | -|----------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| common | [![MyPy Strict](https://img.shields.io/badge/mypy-strict-blue)](https://mypy.readthedocs.io/en/stable/getting_started.html#strict-mode-and-configuration) [![GitHub stars](https://img.shields.io/github/stars/modern-python/modern-di)](https://github.com/modern-python/modern-di/stargazers) | -| modern-di | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di.svg)](https://pypi.python.org/pypi/modern-di ) [![downloads](https://img.shields.io/pypi/dm/modern-di.svg)](https://pypistats.org/packages/modern-di) | -| [modern-di-fastapi](https://github.com/modern-python/modern-di-fastapi) | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-fastapi.svg)](https://pypi.python.org/pypi/modern-di-fastapi) [![downloads](https://img.shields.io/pypi/dm/modern-di-fastapi.svg)](https://pypistats.org/packages/modern-di-fastapi) | -| modern-di-faststream | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-faststream.svg)](https://pypi.python.org/pypi/modern-di-faststream) [![downloads](https://img.shields.io/pypi/dm/modern-di-faststream.svg)](https://pypistats.org/packages/modern-di-faststream) | -| [modern-di-litestar ](https://github.com/modern-python/modern-di-litestar) | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-litestar.svg)](https://pypi.python.org/pypi/modern-di-litestar) [![downloads](https://img.shields.io/pypi/dm/modern-di-litestar.svg)](https://pypistats.org/packages/modern-di-litestar) | +| Project | Badges | +|---------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| common | [![MyPy Strict](https://img.shields.io/badge/mypy-strict-blue)](https://mypy.readthedocs.io/en/stable/getting_started.html#strict-mode-and-configuration) [![GitHub stars](https://img.shields.io/github/stars/modern-python/modern-di)](https://github.com/modern-python/modern-di/stargazers) | +| modern-di | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di.svg)](https://pypi.python.org/pypi/modern-di ) [![downloads](https://img.shields.io/pypi/dm/modern-di.svg)](https://pypistats.org/packages/modern-di) | +| [modern-di-fastapi](https://github.com/modern-python/modern-di-fastapi) | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-fastapi.svg)](https://pypi.python.org/pypi/modern-di-fastapi) [![downloads](https://img.shields.io/pypi/dm/modern-di-fastapi.svg)](https://pypistats.org/packages/modern-di-fastapi) | +| [modern-di-faststream ](https://github.com/modern-python/modern-di-faststream) | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-faststream.svg)](https://pypi.python.org/pypi/modern-di-faststream) [![downloads](https://img.shields.io/pypi/dm/modern-di-faststream.svg)](https://pypistats.org/packages/modern-di-faststream) | +| [modern-di-litestar ](https://github.com/modern-python/modern-di-litestar) | [![Supported versions](https://img.shields.io/pypi/pyversions/modern-di-litestar.svg)](https://pypi.python.org/pypi/modern-di-litestar) [![downloads](https://img.shields.io/pypi/dm/modern-di-litestar.svg)](https://pypistats.org/packages/modern-di-litestar) | `modern-di` is a python dependency injection framework which supports the following: diff --git a/packages/modern-di/modern_di/__init__.py b/modern_di/__init__.py similarity index 100% rename from packages/modern-di/modern_di/__init__.py rename to modern_di/__init__.py diff --git a/packages/modern-di/modern_di/container.py b/modern_di/container.py similarity index 100% rename from packages/modern-di/modern_di/container.py rename to modern_di/container.py diff --git a/packages/modern-di/modern_di/group.py b/modern_di/group.py similarity index 100% rename from packages/modern-di/modern_di/group.py rename to modern_di/group.py diff --git a/packages/modern-di/modern_di/providers/__init__.py b/modern_di/providers/__init__.py similarity index 100% rename from packages/modern-di/modern_di/providers/__init__.py rename to modern_di/providers/__init__.py diff --git a/packages/modern-di/modern_di/providers/abstract.py b/modern_di/providers/abstract.py similarity index 100% rename from packages/modern-di/modern_di/providers/abstract.py rename to modern_di/providers/abstract.py diff --git a/packages/modern-di/modern_di/providers/container_provider.py b/modern_di/providers/container_provider.py similarity index 100% rename from packages/modern-di/modern_di/providers/container_provider.py rename to modern_di/providers/container_provider.py diff --git a/packages/modern-di/modern_di/providers/context_provider.py b/modern_di/providers/context_provider.py similarity index 100% rename from packages/modern-di/modern_di/providers/context_provider.py rename to modern_di/providers/context_provider.py diff --git a/packages/modern-di/modern_di/providers/factory.py b/modern_di/providers/factory.py similarity index 100% rename from packages/modern-di/modern_di/providers/factory.py rename to modern_di/providers/factory.py diff --git a/packages/modern-di-faststream/modern_di_faststream/py.typed b/modern_di/py.typed similarity index 100% rename from packages/modern-di-faststream/modern_di_faststream/py.typed rename to modern_di/py.typed diff --git a/packages/modern-di-faststream/tests_faststream/__init__.py b/modern_di/registries/__init__.py similarity index 100% rename from packages/modern-di-faststream/tests_faststream/__init__.py rename to modern_di/registries/__init__.py diff --git a/packages/modern-di/modern_di/registries/cache_registry.py b/modern_di/registries/cache_registry.py similarity index 100% rename from packages/modern-di/modern_di/registries/cache_registry.py rename to modern_di/registries/cache_registry.py diff --git a/packages/modern-di/modern_di/registries/context_registry.py b/modern_di/registries/context_registry.py similarity index 100% rename from packages/modern-di/modern_di/registries/context_registry.py rename to modern_di/registries/context_registry.py diff --git a/packages/modern-di/modern_di/registries/overrides_registry.py b/modern_di/registries/overrides_registry.py similarity index 100% rename from packages/modern-di/modern_di/registries/overrides_registry.py rename to modern_di/registries/overrides_registry.py diff --git a/packages/modern-di/modern_di/registries/providers_registry.py b/modern_di/registries/providers_registry.py similarity index 100% rename from packages/modern-di/modern_di/registries/providers_registry.py rename to modern_di/registries/providers_registry.py diff --git a/packages/modern-di/modern_di/scope.py b/modern_di/scope.py similarity index 100% rename from packages/modern-di/modern_di/scope.py rename to modern_di/scope.py diff --git a/packages/modern-di/modern_di/types.py b/modern_di/types.py similarity index 100% rename from packages/modern-di/modern_di/types.py rename to modern_di/types.py diff --git a/packages/modern-di/modern_di/types_parser.py b/modern_di/types_parser.py similarity index 100% rename from packages/modern-di/modern_di/types_parser.py rename to modern_di/types_parser.py diff --git a/packages/modern-di-faststream/README.md b/packages/modern-di-faststream/README.md deleted file mode 100644 index b492f83..0000000 --- a/packages/modern-di-faststream/README.md +++ /dev/null @@ -1,6 +0,0 @@ -"Modern-DI-FastStream" -== - -Integration of [Modern-DI](https://github.com/modern-python/modern-di) to FastStream - -📚 [Documentation](https://modern-di.readthedocs.io) diff --git a/packages/modern-di-faststream/modern_di_faststream/__init__.py b/packages/modern-di-faststream/modern_di_faststream/__init__.py deleted file mode 100644 index 778557d..0000000 --- a/packages/modern-di-faststream/modern_di_faststream/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from modern_di_faststream.main import FromDI, faststream_message_provider, fetch_di_container, setup_di - - -__all__ = [ - "FromDI", - "faststream_message_provider", - "fetch_di_container", - "setup_di", -] diff --git a/packages/modern-di-faststream/modern_di_faststream/main.py b/packages/modern-di-faststream/modern_di_faststream/main.py deleted file mode 100644 index 7c9a62d..0000000 --- a/packages/modern-di-faststream/modern_di_faststream/main.py +++ /dev/null @@ -1,102 +0,0 @@ -import dataclasses -import typing -from collections.abc import Awaitable, Callable -from importlib.metadata import version - -import faststream -import modern_di -from faststream.asgi import AsgiFastStream -from faststream.types import DecodedMessage -from modern_di import Container, Scope, providers - - -T_co = typing.TypeVar("T_co", covariant=True) -P = typing.ParamSpec("P") - - -faststream_message_provider = providers.ContextProvider(scope=Scope.REQUEST, context_type=faststream.StreamMessage) - - -_major, _minor, *_ = version("faststream").split(".") -_OLD_MIDDLEWARES = int(_major) == 0 and int(_minor) < 6 # noqa: PLR2004 - - -class _DIMiddlewareFactory: - __slots__ = ("di_container",) - - def __init__(self, di_container: Container) -> None: - self.di_container = di_container - - def __call__(self, *args: P.args, **kwargs: P.kwargs) -> "_DiMiddleware[P]": - return _DiMiddleware(self.di_container, *args, **kwargs) - - -class _DiMiddleware(faststream.BaseMiddleware, typing.Generic[P]): - def __init__(self, di_container: Container, *args: P.args, **kwargs: P.kwargs) -> None: - self.di_container = di_container - super().__init__(*args, **kwargs) # type: ignore[arg-type] - - async def consume_scope( - self, - call_next: Callable[[typing.Any], Awaitable[typing.Any]], - msg: faststream.StreamMessage[typing.Any], - ) -> typing.AsyncIterator[DecodedMessage]: - request_container = self.di_container.build_child_container( - scope=modern_di.Scope.REQUEST, context={faststream.StreamMessage: msg} - ) - try: - with self.faststream_context.scope("request_container", request_container): - return typing.cast( - typing.AsyncIterator[DecodedMessage], - await call_next(msg), - ) - finally: - await request_container.close_async() - - if _OLD_MIDDLEWARES: # pragma: no cover - - @property - def faststream_context(self) -> faststream.ContextRepo: - return typing.cast(faststream.ContextRepo, faststream.context) # type: ignore[attr-defined] - - else: - - @property - def faststream_context(self) -> faststream.ContextRepo: - return self.context - - -def fetch_di_container(app_: faststream.FastStream | AsgiFastStream) -> Container: - return typing.cast(Container, app_.context.get("di_container")) - - -def setup_di( - app: faststream.FastStream | AsgiFastStream, - container: Container, -) -> Container: - if not app.broker: - msg = "Broker must be defined to setup DI" - raise RuntimeError(msg) - - container.providers_registry.add_providers(faststream_message_provider) - app.context.set_global("di_container", container) - app.after_shutdown(container.close_async) - app.broker.add_middleware(_DIMiddlewareFactory(container)) - return container - - -@dataclasses.dataclass(slots=True, frozen=True) -class Dependency(typing.Generic[T_co]): - dependency: providers.AbstractProvider[T_co] | type[T_co] - - async def __call__(self, context: faststream.ContextRepo) -> T_co: - request_container: Container = context.get("request_container") - if isinstance(self.dependency, providers.AbstractProvider): - return request_container.resolve_provider(self.dependency) - return request_container.resolve(dependency_type=self.dependency) - - -def FromDI( # noqa: N802 - dependency: providers.AbstractProvider[T_co] | type[T_co], *, use_cache: bool = True, cast: bool = False -) -> T_co: - return typing.cast(T_co, faststream.Depends(dependency=Dependency(dependency), use_cache=use_cache, cast=cast)) diff --git a/packages/modern-di-faststream/pyproject.toml b/packages/modern-di-faststream/pyproject.toml deleted file mode 100644 index 82a5087..0000000 --- a/packages/modern-di-faststream/pyproject.toml +++ /dev/null @@ -1,51 +0,0 @@ -[project] -name = "modern-di-faststream" -description = "Modern-DI integration for FastStream" -authors = [{ name = "Artur Shiriev", email = "me@shiriev.ru" }] -requires-python = ">=3.10,<4" -license = "MIT" -readme = "README.md" -keywords = ["DI", "dependency injector", "ioc-container", "FastStream", "python"] -classifiers = [ - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Typing :: Typed", - "Topic :: Software Development :: Libraries", -] -dependencies = ["faststream>=0.5,<1", "modern-di>=2"] -version = "0" - -[project.urls] -repository = "https://github.com/modern-python/modern-di" -docs = "https://modern-di.readthedocs.io" - -[dependency-groups] -dev = [ - "faststream[nats]", - "pytest", - "pytest-cov", - "pytest-asyncio", - "ruff", - "mypy", - "typing-extensions", - "httpx", - "asgi-lifespan", -] - -[build-system] -requires = ["hatchling"] -build-backend = "hatchling.build" - -[tool.hatch.build] -include = ["modern_di_faststream"] - -[tool.pytest.ini_options] -addopts = "--cov=. --cov-report term-missing" -asyncio_mode = "auto" -asyncio_default_fixture_loop_scope = "function" - -[tool.coverage.report] -exclude_also = ["if typing.TYPE_CHECKING:"] diff --git a/packages/modern-di-faststream/tests_faststream/conftest.py b/packages/modern-di-faststream/tests_faststream/conftest.py deleted file mode 100644 index ac38427..0000000 --- a/packages/modern-di-faststream/tests_faststream/conftest.py +++ /dev/null @@ -1,14 +0,0 @@ -import faststream -import pytest -from faststream.nats import NatsBroker -from modern_di import Container -from modern_di_faststream import setup_di - -from tests_faststream.dependencies import Dependencies - - -@pytest.fixture -async def app() -> faststream.FastStream: - app_ = faststream.FastStream(NatsBroker()) - setup_di(app_, container=Container(groups=[Dependencies])) - return app_ diff --git a/packages/modern-di-faststream/tests_faststream/dependencies.py b/packages/modern-di-faststream/tests_faststream/dependencies.py deleted file mode 100644 index 0a78d17..0000000 --- a/packages/modern-di-faststream/tests_faststream/dependencies.py +++ /dev/null @@ -1,26 +0,0 @@ -import dataclasses -import typing - -from faststream import StreamMessage -from modern_di import Group, Scope, providers - - -@dataclasses.dataclass(kw_only=True, slots=True) -class SimpleCreator: - dep1: str - - -@dataclasses.dataclass(kw_only=True, slots=True) -class DependentCreator: - dep1: SimpleCreator - - -def fetch_message_is_processed_from_request(message: StreamMessage[typing.Any] | None = None) -> bool: - return message.processed if message else False - - -class Dependencies(Group): - app_factory = providers.Factory(creator=SimpleCreator, kwargs={"dep1": "original"}) - request_factory = providers.Factory(scope=Scope.REQUEST, creator=DependentCreator, bound_type=None) - action_factory = providers.Factory(scope=Scope.ACTION, creator=DependentCreator, bound_type=None) - message_is_processed = providers.Factory(scope=Scope.REQUEST, creator=fetch_message_is_processed_from_request) diff --git a/packages/modern-di-faststream/tests_faststream/test_faststream_di.py b/packages/modern-di-faststream/tests_faststream/test_faststream_di.py deleted file mode 100644 index e06f0b6..0000000 --- a/packages/modern-di-faststream/tests_faststream/test_faststream_di.py +++ /dev/null @@ -1,57 +0,0 @@ -import typing - -import faststream -import modern_di_faststream -import pytest -from faststream import TestApp -from faststream.nats import NatsBroker, TestNatsBroker -from modern_di import Container -from modern_di_faststream import FromDI - -from tests_faststream.dependencies import Dependencies, DependentCreator, SimpleCreator - - -TEST_SUBJECT = "test" - - -async def test_factories(app: faststream.FastStream) -> None: - broker = typing.cast(NatsBroker, app.broker) - - @broker.subscriber(TEST_SUBJECT) - async def index_subscriber( - message: str, - app_factory_instance: typing.Annotated[SimpleCreator, FromDI(SimpleCreator)], - request_factory_instance: typing.Annotated[DependentCreator, FromDI(Dependencies.request_factory)], - ) -> None: - assert message == "test" - assert isinstance(app_factory_instance, SimpleCreator) - assert isinstance(request_factory_instance, DependentCreator) - assert request_factory_instance.dep1 is not app_factory_instance - - async with TestNatsBroker(broker) as br, TestApp(app): - await br.publish("test", TEST_SUBJECT) - - -async def test_context_adapter(app: faststream.FastStream) -> None: - broker = typing.cast(NatsBroker, app.broker) - - @broker.subscriber(TEST_SUBJECT) - async def index_subscriber( - message_is_processed: typing.Annotated[bool, FromDI(Dependencies.message_is_processed)], - ) -> None: - assert message_is_processed is False - - async with TestNatsBroker(broker) as br, TestApp(app): - result = await br.request(None, TEST_SUBJECT) - result_str = await result.decode() - assert result_str == b"" - - -async def test_app_without_broker() -> None: - with pytest.raises(RuntimeError, match="Broker must be defined to setup DI"): - modern_di_faststream.setup_di(faststream.FastStream(), container=Container()) - - -def test_fetch_di_container(app: faststream.FastStream) -> None: - di_container = modern_di_faststream.fetch_di_container(app) - assert isinstance(di_container, Container) diff --git a/packages/modern-di/modern_di/py.typed b/packages/modern-di/modern_di/py.typed deleted file mode 100644 index e69de29..0000000 diff --git a/packages/modern-di/pyproject.toml b/packages/modern-di/pyproject.toml deleted file mode 100644 index c6d7998..0000000 --- a/packages/modern-di/pyproject.toml +++ /dev/null @@ -1,54 +0,0 @@ -[project] -name = "modern-di" -description = "Dependency Injection framework with IOC-container and scopes" -authors = [{ name = "Artur Shiriev", email = "me@shiriev.ru" }] -requires-python = ">=3.10,<4" -license = "MIT" -keywords = ["DI", "dependency injector", "ioc-container", "mocks", "python"] -classifiers = [ - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: 3.13", - "Programming Language :: Python :: 3.14", - "Typing :: Typed", - "Topic :: Software Development :: Libraries", -] -version = "0" -dynamic = ["readme"] - -[project.urls] -repository = "https://github.com/modern-python/modern-di" -docs = "https://modern-di.readthedocs.io" - -[dependency-groups] -dev = [ - "pytest", - "pytest-cov", - "pytest-asyncio", - "pytest-repeat", - "ruff", - "mypy", - "typing-extensions", -] - -[build-system] -requires = ["hatchling", "hatch-fancy-pypi-readme"] -build-backend = "hatchling.build" - -[tool.hatch.build] -include = ["modern_di"] - -[tool.hatch.metadata.hooks.fancy-pypi-readme] -content-type = "text/markdown" - -[[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] -path = "../../README.md" - -[tool.pytest.ini_options] -addopts = "--cov=. --cov-report term-missing" -asyncio_mode = "auto" -asyncio_default_fixture_loop_scope = "function" - -[tool.coverage.report] -exclude_also = ["if typing.TYPE_CHECKING:"] diff --git a/packages/modern-di/tests_core/registries/__init__.py b/packages/modern-di/tests_core/registries/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/pyproject.toml b/pyproject.toml index 528dd01..c54df43 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,28 +1,39 @@ [project] -name = "modern-di-workspace" +name = "modern-di" +description = "Dependency Injection framework with IOC-container and scopes" +authors = [{ name = "Artur Shiriev", email = "me@shiriev.ru" }] requires-python = ">=3.10,<4" +license = "MIT" +keywords = ["DI", "dependency injector", "ioc-container", "mocks", "python"] +classifiers = [ + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", + "Typing :: Typed", + "Topic :: Software Development :: Libraries", +] version = "0" +dynamic = ["readme"] + +[project.urls] +repository = "https://github.com/modern-python/modern-di" +docs = "https://modern-di.readthedocs.io" [dependency-groups] dev = [ "pytest", "pytest-cov", "pytest-asyncio", +] +lint = [ "ruff", "mypy", "eof-fixer", "typing-extensions", ] -[tool.uv] -package = false - -[tool.uv.workspace] -members = ["packages/*"] - -[tool.uv.sources] -modern-di = { workspace = true } - [tool.mypy] python_version = "3.10" strict = true diff --git a/packages/modern-di/modern_di/registries/__init__.py b/tests/__init__.py similarity index 100% rename from packages/modern-di/modern_di/registries/__init__.py rename to tests/__init__.py diff --git a/packages/modern-di/tests_core/__init__.py b/tests/providers/__init__.py similarity index 100% rename from packages/modern-di/tests_core/__init__.py rename to tests/providers/__init__.py diff --git a/packages/modern-di/tests_core/providers/test_container_provider.py b/tests/providers/test_container_provider.py similarity index 100% rename from packages/modern-di/tests_core/providers/test_container_provider.py rename to tests/providers/test_container_provider.py diff --git a/packages/modern-di/tests_core/providers/test_context_provider.py b/tests/providers/test_context_provider.py similarity index 100% rename from packages/modern-di/tests_core/providers/test_context_provider.py rename to tests/providers/test_context_provider.py diff --git a/packages/modern-di/tests_core/providers/test_factory.py b/tests/providers/test_factory.py similarity index 99% rename from packages/modern-di/tests_core/providers/test_factory.py rename to tests/providers/test_factory.py index 8d21f36..784fb72 100644 --- a/packages/modern-di/tests_core/providers/test_factory.py +++ b/tests/providers/test_factory.py @@ -2,6 +2,7 @@ import re import pytest + from modern_di import Container, Group, Scope, providers diff --git a/packages/modern-di/tests_core/providers/test_singleton.py b/tests/providers/test_singleton.py similarity index 99% rename from packages/modern-di/tests_core/providers/test_singleton.py rename to tests/providers/test_singleton.py index 49817de..b27d533 100644 --- a/packages/modern-di/tests_core/providers/test_singleton.py +++ b/tests/providers/test_singleton.py @@ -4,6 +4,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed import pytest + from modern_di import Container, Group, Scope, providers diff --git a/packages/modern-di/tests_core/providers/__init__.py b/tests/registries/__init__.py similarity index 100% rename from packages/modern-di/tests_core/providers/__init__.py rename to tests/registries/__init__.py diff --git a/packages/modern-di/tests_core/registries/test_providers_registry.py b/tests/registries/test_providers_registry.py similarity index 99% rename from packages/modern-di/tests_core/registries/test_providers_registry.py rename to tests/registries/test_providers_registry.py index fb56fa5..30f9539 100644 --- a/packages/modern-di/tests_core/registries/test_providers_registry.py +++ b/tests/registries/test_providers_registry.py @@ -1,4 +1,5 @@ import pytest + from modern_di import providers from modern_di.registries.providers_registry import ProvidersRegistry diff --git a/packages/modern-di/tests_core/test_container.py b/tests/test_container.py similarity index 99% rename from packages/modern-di/tests_core/test_container.py rename to tests/test_container.py index e43d3cf..e76ee89 100644 --- a/packages/modern-di/tests_core/test_container.py +++ b/tests/test_container.py @@ -1,6 +1,7 @@ import copy import pytest + from modern_di import Container, Scope, providers diff --git a/packages/modern-di/tests_core/test_group.py b/tests/test_group.py similarity index 99% rename from packages/modern-di/tests_core/test_group.py rename to tests/test_group.py index fef3867..99a5a9c 100644 --- a/packages/modern-di/tests_core/test_group.py +++ b/tests/test_group.py @@ -1,4 +1,5 @@ import pytest + from modern_di import Group diff --git a/packages/modern-di/tests_core/test_types_parser.py b/tests/test_types_parser.py similarity index 99% rename from packages/modern-di/tests_core/test_types_parser.py rename to tests/test_types_parser.py index 7b4750d..40d8698 100644 --- a/packages/modern-di/tests_core/test_types_parser.py +++ b/tests/test_types_parser.py @@ -2,6 +2,7 @@ import typing import pytest + from modern_di import types from modern_di.types_parser import SignatureItem, parse_creator