anydi 0.37.4a0__tar.gz → 0.38.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. anydi-0.38.1/.readthedocs.yaml +20 -0
  2. {anydi-0.37.4a0 → anydi-0.38.1}/PKG-INFO +1 -1
  3. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/_container.py +4 -0
  4. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/pytest_plugin.py +4 -15
  5. {anydi-0.37.4a0 → anydi-0.38.1}/pyproject.toml +1 -1
  6. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/test_pytest_plugin.py +0 -7
  7. {anydi-0.37.4a0 → anydi-0.38.1}/uv.lock +1 -1
  8. anydi-0.37.4a0/.readthedocs.yml +0 -15
  9. {anydi-0.37.4a0 → anydi-0.38.1}/.editorconfig +0 -0
  10. {anydi-0.37.4a0 → anydi-0.38.1}/.github/workflows/ci.yml +0 -0
  11. {anydi-0.37.4a0 → anydi-0.38.1}/.gitignore +0 -0
  12. {anydi-0.37.4a0 → anydi-0.38.1}/LICENSE +0 -0
  13. {anydi-0.37.4a0 → anydi-0.38.1}/Makefile +0 -0
  14. {anydi-0.37.4a0 → anydi-0.38.1}/README.md +0 -0
  15. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/__init__.py +0 -0
  16. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/_context.py +0 -0
  17. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/_provider.py +0 -0
  18. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/_types.py +0 -0
  19. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/_utils.py +0 -0
  20. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/__init__.py +0 -0
  21. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/_utils.py +0 -0
  22. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/__init__.py +0 -0
  23. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/_container.py +0 -0
  24. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/_settings.py +0 -0
  25. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/_utils.py +0 -0
  26. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/apps.py +0 -0
  27. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/middleware.py +0 -0
  28. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/ninja/__init__.py +0 -0
  29. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/ninja/_operation.py +0 -0
  30. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/django/ninja/_signature.py +0 -0
  31. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/fastapi.py +0 -0
  32. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/faststream.py +0 -0
  33. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/pydantic_settings.py +0 -0
  34. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/starlette/__init__.py +0 -0
  35. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/ext/starlette/middleware.py +0 -0
  36. {anydi-0.37.4a0 → anydi-0.38.1}/anydi/py.typed +0 -0
  37. {anydi-0.37.4a0 → anydi-0.38.1}/docs/examples/basic.md +0 -0
  38. {anydi-0.37.4a0 → anydi-0.38.1}/docs/extensions/django.md +0 -0
  39. {anydi-0.37.4a0 → anydi-0.38.1}/docs/extensions/fastapi.md +0 -0
  40. {anydi-0.37.4a0 → anydi-0.38.1}/docs/extensions/faststream.md +0 -0
  41. {anydi-0.37.4a0 → anydi-0.38.1}/docs/extensions/pydantic_settings.md +0 -0
  42. {anydi-0.37.4a0 → anydi-0.38.1}/docs/index.md +0 -0
  43. {anydi-0.37.4a0 → anydi-0.38.1}/docs/usage.md +0 -0
  44. {anydi-0.37.4a0 → anydi-0.38.1}/mkdocs.yml +0 -0
  45. {anydi-0.37.4a0 → anydi-0.38.1}/tests/__init__.py +0 -0
  46. {anydi-0.37.4a0 → anydi-0.38.1}/tests/conftest.py +0 -0
  47. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/__init__.py +0 -0
  48. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/__init__.py +0 -0
  49. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/api/__init__.py +0 -0
  50. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/api/router.py +0 -0
  51. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/api/test_router.py +0 -0
  52. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/api/urls.py +0 -0
  53. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/conftest.py +0 -0
  54. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/container.py +0 -0
  55. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/scan/__init__.py +0 -0
  56. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/services.py +0 -0
  57. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/settings.py +0 -0
  58. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/test_views.py +0 -0
  59. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/urls.py +0 -0
  60. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/django/views.py +0 -0
  61. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fastapi/__init__.py +0 -0
  62. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fastapi/app.py +0 -0
  63. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fastapi/conftest.py +0 -0
  64. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fastapi/test_auto_register.py +0 -0
  65. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fastapi/test_ext.py +0 -0
  66. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fastapi/test_routes.py +0 -0
  67. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/faststream/__init__.py +0 -0
  68. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/faststream/test_ext.py +0 -0
  69. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/faststream/test_subscribers.py +0 -0
  70. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/fixtures.py +0 -0
  71. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/starlette/__init__.py +0 -0
  72. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/starlette/app.py +0 -0
  73. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/starlette/conftest.py +0 -0
  74. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/starlette/test_routes.py +0 -0
  75. {anydi-0.37.4a0 → anydi-0.38.1}/tests/ext/test_pydantic.py +0 -0
  76. {anydi-0.37.4a0 → anydi-0.38.1}/tests/fixtures.py +0 -0
  77. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/__init__.py +0 -0
  78. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/__init__.py +0 -0
  79. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a1/__init__.py +0 -0
  80. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a1/handlers.py +0 -0
  81. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a2/__init__.py +0 -0
  82. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a2/a21/__init__.py +0 -0
  83. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a2/a21/handlers.py +0 -0
  84. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a3/__init__.py +0 -0
  85. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/a/a3/handlers.py +0 -0
  86. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/b/__init__.py +0 -0
  87. {anydi-0.37.4a0 → anydi-0.38.1}/tests/scan_app/b/handlers.py +0 -0
  88. {anydi-0.37.4a0 → anydi-0.38.1}/tests/test_container.py +0 -0
  89. {anydi-0.37.4a0 → anydi-0.38.1}/tests/test_provider.py +0 -0
  90. {anydi-0.37.4a0 → anydi-0.38.1}/tests/test_utils.py +0 -0
@@ -0,0 +1,20 @@
1
+ version: 2
2
+
3
+ build:
4
+ os: ubuntu-24.04
5
+ tools:
6
+ python: "3.13"
7
+ jobs:
8
+ create_environment:
9
+ - asdf plugin add uv
10
+ - asdf install uv latest
11
+ - asdf global uv latest
12
+ - uv venv
13
+ install:
14
+ - uv sync --frozen --group docs
15
+ build:
16
+ html:
17
+ - NO_COLOR=1 uv run mkdocs build --strict --site-dir $READTHEDOCS_OUTPUT/html
18
+
19
+ mkdocs:
20
+ configuration: mkdocs.yml
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anydi
3
- Version: 0.37.4a0
3
+ Version: 0.38.1
4
4
  Summary: Dependency Injection library
5
5
  Project-URL: Repository, https://github.com/antonrh/anydi
6
6
  Author-email: Anton Ruhlov <antonruhlov@gmail.com>
@@ -504,6 +504,8 @@ class Container:
504
504
  instance = self._create_instance(provider, context, **defaults)
505
505
  else:
506
506
  instance = self._create_instance(provider, context, **defaults)
507
+ if self.testing:
508
+ instance = self._patch_test_resolver(provider.interface, instance)
507
509
  return cast(T, instance)
508
510
 
509
511
  async def acreate(self, interface: type[T], **defaults: Any) -> T:
@@ -520,6 +522,8 @@ class Container:
520
522
  )
521
523
  else:
522
524
  instance = await self._acreate_instance(provider, context, **defaults)
525
+ if self.testing:
526
+ instance = self._patch_test_resolver(provider.interface, instance)
523
527
  return cast(T, instance)
524
528
 
525
529
  def _get_or_create_instance(
@@ -57,27 +57,20 @@ def _anydi_should_inject(request: pytest.FixtureRequest) -> bool:
57
57
  return marker is not None or inject_all
58
58
 
59
59
 
60
- @pytest.fixture(scope="session")
61
- def _anydi_unresolved() -> Iterator[list[Any]]:
62
- unresolved: list[Any] = []
63
- yield unresolved
64
- unresolved.clear()
65
-
66
-
67
60
  @pytest.fixture
68
61
  def _anydi_injected_parameter_iterator(
69
62
  request: pytest.FixtureRequest,
70
- _anydi_unresolved: list[str],
71
63
  ) -> Callable[[], Iterator[tuple[str, Any]]]:
72
- registered_fixtures = request.session._fixturemanager._arg2fixturedefs # noqa
64
+ fixturenames = set(request.node._fixtureinfo.initialnames) - set(
65
+ request.node._fixtureinfo.name2fixturedefs.keys()
66
+ )
73
67
 
74
68
  def _iterator() -> Iterator[tuple[str, inspect.Parameter]]:
75
69
  for parameter in get_typed_parameters(request.function):
76
70
  interface = parameter.annotation
77
71
  if (
78
72
  interface is inspect.Parameter.empty
79
- or interface in _anydi_unresolved
80
- or parameter.name in registered_fixtures
73
+ or parameter.name not in fixturenames
81
74
  ):
82
75
  continue
83
76
  yield parameter.name, interface
@@ -90,7 +83,6 @@ def _anydi_inject(
90
83
  request: pytest.FixtureRequest,
91
84
  _anydi_should_inject: bool,
92
85
  _anydi_injected_parameter_iterator: Callable[[], Iterator[tuple[str, Any]]],
93
- _anydi_unresolved: list[str],
94
86
  ) -> None:
95
87
  """Inject dependencies into the test function."""
96
88
 
@@ -111,7 +103,6 @@ def _anydi_inject(
111
103
  logger.warning(
112
104
  f"Failed to resolve dependency for argument '{argname}'.", exc_info=exc
113
105
  )
114
- _anydi_unresolved.append(interface)
115
106
 
116
107
 
117
108
  @pytest.fixture(autouse=True)
@@ -119,7 +110,6 @@ def _anydi_ainject(
119
110
  request: pytest.FixtureRequest,
120
111
  _anydi_should_inject: bool,
121
112
  _anydi_injected_parameter_iterator: Callable[[], Iterator[tuple[str, Any]]],
122
- _anydi_unresolved: list[str],
123
113
  ) -> None:
124
114
  """Inject dependencies into the test function."""
125
115
  if (
@@ -149,7 +139,6 @@ def _anydi_ainject(
149
139
  f"Failed to resolve dependency for argument '{argname}'.",
150
140
  exc_info=exc,
151
141
  )
152
- _anydi_unresolved.append(interface)
153
142
 
154
143
  anyio_backend = request.getfixturevalue("anyio_backend")
155
144
  backend_name, backend_options = extract_backend_and_options(anyio_backend)
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "anydi"
3
- version = "0.37.4a0"
3
+ version = "0.38.1"
4
4
  description = "Dependency Injection library"
5
5
  authors = [{ name = "Anton Ruhlov", email = "antonruhlov@gmail.com" }]
6
6
  requires-python = "~=3.9"
@@ -1,5 +1,3 @@
1
- from typing import Any
2
-
3
1
  import pytest
4
2
 
5
3
  from anydi import Container
@@ -39,11 +37,6 @@ def test_no_container_setup(
39
37
  )
40
38
 
41
39
 
42
- @pytest.fixture(autouse=True)
43
- def _clean_unresolved(_anydi_unresolved: list[Any]) -> None:
44
- _anydi_unresolved.clear()
45
-
46
-
47
40
  @pytest.mark.inject
48
41
  def test_inject_service(service: Service) -> None:
49
42
  assert isinstance(service, Service)
@@ -12,7 +12,7 @@ wheels = [
12
12
 
13
13
  [[package]]
14
14
  name = "anydi"
15
- version = "0.37.3"
15
+ version = "0.38.1"
16
16
  source = { editable = "." }
17
17
  dependencies = [
18
18
  { name = "anyio" },
@@ -1,15 +0,0 @@
1
- version: 2
2
-
3
- build:
4
- os: ubuntu-20.04
5
- tools:
6
- python: "3.10"
7
- jobs:
8
- post_create_environment:
9
- - pip install poetry
10
- - poetry config virtualenvs.create false
11
- post_install:
12
- - VIRTUAL_ENV=$READTHEDOCS_VIRTUALENV_PATH poetry install -E docs
13
-
14
- mkdocs:
15
- configuration: mkdocs.yml
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes