anydi 0.66.0__tar.gz → 0.67.0__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 (26) hide show
  1. {anydi-0.66.0 → anydi-0.67.0}/PKG-INFO +12 -12
  2. {anydi-0.66.0 → anydi-0.67.0}/README.md +11 -11
  3. {anydi-0.66.0 → anydi-0.67.0}/anydi/_container.py +22 -13
  4. {anydi-0.66.0 → anydi-0.67.0}/anydi/_resolver.py +1 -1
  5. {anydi-0.66.0 → anydi-0.67.0}/pyproject.toml +1 -1
  6. {anydi-0.66.0 → anydi-0.67.0}/anydi/__init__.py +0 -0
  7. {anydi-0.66.0 → anydi-0.67.0}/anydi/_async_lock.py +0 -0
  8. {anydi-0.66.0 → anydi-0.67.0}/anydi/_context.py +0 -0
  9. {anydi-0.66.0 → anydi-0.67.0}/anydi/_decorators.py +0 -0
  10. {anydi-0.66.0 → anydi-0.67.0}/anydi/_injector.py +0 -0
  11. {anydi-0.66.0 → anydi-0.67.0}/anydi/_marker.py +0 -0
  12. {anydi-0.66.0 → anydi-0.67.0}/anydi/_module.py +0 -0
  13. {anydi-0.66.0 → anydi-0.67.0}/anydi/_provider.py +0 -0
  14. {anydi-0.66.0 → anydi-0.67.0}/anydi/_scanner.py +0 -0
  15. {anydi-0.66.0 → anydi-0.67.0}/anydi/_types.py +0 -0
  16. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/__init__.py +0 -0
  17. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/django/__init__.py +0 -0
  18. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/fastapi.py +0 -0
  19. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/faststream.py +0 -0
  20. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/pydantic_settings.py +0 -0
  21. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/pytest_plugin.py +0 -0
  22. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/starlette/__init__.py +0 -0
  23. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/starlette/middleware.py +0 -0
  24. {anydi-0.66.0 → anydi-0.67.0}/anydi/ext/typer.py +0 -0
  25. {anydi-0.66.0 → anydi-0.67.0}/anydi/py.typed +0 -0
  26. {anydi-0.66.0 → anydi-0.67.0}/anydi/testing.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: anydi
3
- Version: 0.66.0
3
+ Version: 0.67.0
4
4
  Summary: Dependency Injection library
5
5
  Keywords: dependency injection,dependencies,di,async,asyncio,application
6
6
  Author: Anton Ruhlov
@@ -41,7 +41,7 @@ Simple Dependency Injection library that uses Python type annotations.
41
41
 
42
42
  [![CI](https://github.com/antonrh/anydi/actions/workflows/ci.yml/badge.svg)](https://github.com/antonrh/anydi/actions/workflows/ci.yml)
43
43
  [![Coverage](https://codecov.io/gh/antonrh/anydi/branch/main/graph/badge.svg)](https://codecov.io/gh/antonrh/anydi)
44
- [![Documentation](https://readthedocs.org/projects/anydi/badge/?version=latest)](https://anydi.readthedocs.io/en/latest/)
44
+ [![Documentation](https://readthedocs.org/projects/anydi/badge/?version=latest)](https://anydi.readthedocs.io/en/stable/)
45
45
  [![CodSpeed](https://img.shields.io/endpoint?url=https://codspeed.io/badge.json)](https://codspeed.io/antonrh/anydi?utm_source=badge)
46
46
 
47
47
  </div>
@@ -271,18 +271,18 @@ urlpatterns = [
271
271
  Want to know more? Here are helpful resources:
272
272
 
273
273
  **Core Documentation:**
274
- - [Core Concepts](https://anydi.readthedocs.io/en/latest/concepts/) - Learn about containers, providers, scopes, and dependency injection
275
- - [Providers](https://anydi.readthedocs.io/en/latest/usage/providers/) - How to register providers and manage resources
276
- - [Scopes](https://anydi.readthedocs.io/en/latest/usage/scopes/) - How to use built-in and custom scopes
277
- - [Dependency Injection](https://anydi.readthedocs.io/en/latest/usage/injection/) - Different ways to inject dependencies
278
- - [Testing](https://anydi.readthedocs.io/en/latest/usage/testing/) - How to test your code with provider overrides
274
+ - [Core Concepts](https://anydi.readthedocs.io/en/stable/concepts/) - Learn about containers, providers, scopes, and dependency injection
275
+ - [Providers](https://anydi.readthedocs.io/en/stable/usage/providers/) - How to register providers and manage resources
276
+ - [Scopes](https://anydi.readthedocs.io/en/stable/usage/scopes/) - How to use built-in and custom scopes
277
+ - [Dependency Injection](https://anydi.readthedocs.io/en/stable/usage/injection/) - Different ways to inject dependencies
278
+ - [Testing](https://anydi.readthedocs.io/en/stable/usage/testing/) - How to test your code with provider overrides
279
279
 
280
280
  **Framework Integrations:**
281
- - [FastAPI](https://anydi.readthedocs.io/en/latest/extensions/fastapi/) - How to use with FastAPI
282
- - [Django](https://anydi.readthedocs.io/en/latest/extensions/django/) - How to use with Django and Django Ninja
283
- - [FastStream](https://anydi.readthedocs.io/en/latest/extensions/faststream/) - How to use with message brokers
284
- - [Typer](https://anydi.readthedocs.io/en/latest/extensions/typer/) - How to use in CLI applications
285
- - [Pydantic Settings](https://anydi.readthedocs.io/en/latest/extensions/pydantic_settings/) - How to manage configuration
281
+ - [FastAPI](https://anydi.readthedocs.io/en/stable/extensions/fastapi/) - How to use with FastAPI
282
+ - [Django](https://anydi.readthedocs.io/en/stable/extensions/django/) - How to use with Django and Django Ninja
283
+ - [FastStream](https://anydi.readthedocs.io/en/stable/extensions/faststream/) - How to use with message brokers
284
+ - [Typer](https://anydi.readthedocs.io/en/stable/extensions/typer/) - How to use in CLI applications
285
+ - [Pydantic Settings](https://anydi.readthedocs.io/en/stable/extensions/pydantic_settings/) - How to manage configuration
286
286
 
287
287
  **Full Documentation:**
288
288
  - [Read the Docs](https://anydi.readthedocs.io/) - All documentation with examples and guides
@@ -6,7 +6,7 @@ Simple Dependency Injection library that uses Python type annotations.
6
6
 
7
7
  [![CI](https://github.com/antonrh/anydi/actions/workflows/ci.yml/badge.svg)](https://github.com/antonrh/anydi/actions/workflows/ci.yml)
8
8
  [![Coverage](https://codecov.io/gh/antonrh/anydi/branch/main/graph/badge.svg)](https://codecov.io/gh/antonrh/anydi)
9
- [![Documentation](https://readthedocs.org/projects/anydi/badge/?version=latest)](https://anydi.readthedocs.io/en/latest/)
9
+ [![Documentation](https://readthedocs.org/projects/anydi/badge/?version=latest)](https://anydi.readthedocs.io/en/stable/)
10
10
  [![CodSpeed](https://img.shields.io/endpoint?url=https://codspeed.io/badge.json)](https://codspeed.io/antonrh/anydi?utm_source=badge)
11
11
 
12
12
  </div>
@@ -236,18 +236,18 @@ urlpatterns = [
236
236
  Want to know more? Here are helpful resources:
237
237
 
238
238
  **Core Documentation:**
239
- - [Core Concepts](https://anydi.readthedocs.io/en/latest/concepts/) - Learn about containers, providers, scopes, and dependency injection
240
- - [Providers](https://anydi.readthedocs.io/en/latest/usage/providers/) - How to register providers and manage resources
241
- - [Scopes](https://anydi.readthedocs.io/en/latest/usage/scopes/) - How to use built-in and custom scopes
242
- - [Dependency Injection](https://anydi.readthedocs.io/en/latest/usage/injection/) - Different ways to inject dependencies
243
- - [Testing](https://anydi.readthedocs.io/en/latest/usage/testing/) - How to test your code with provider overrides
239
+ - [Core Concepts](https://anydi.readthedocs.io/en/stable/concepts/) - Learn about containers, providers, scopes, and dependency injection
240
+ - [Providers](https://anydi.readthedocs.io/en/stable/usage/providers/) - How to register providers and manage resources
241
+ - [Scopes](https://anydi.readthedocs.io/en/stable/usage/scopes/) - How to use built-in and custom scopes
242
+ - [Dependency Injection](https://anydi.readthedocs.io/en/stable/usage/injection/) - Different ways to inject dependencies
243
+ - [Testing](https://anydi.readthedocs.io/en/stable/usage/testing/) - How to test your code with provider overrides
244
244
 
245
245
  **Framework Integrations:**
246
- - [FastAPI](https://anydi.readthedocs.io/en/latest/extensions/fastapi/) - How to use with FastAPI
247
- - [Django](https://anydi.readthedocs.io/en/latest/extensions/django/) - How to use with Django and Django Ninja
248
- - [FastStream](https://anydi.readthedocs.io/en/latest/extensions/faststream/) - How to use with message brokers
249
- - [Typer](https://anydi.readthedocs.io/en/latest/extensions/typer/) - How to use in CLI applications
250
- - [Pydantic Settings](https://anydi.readthedocs.io/en/latest/extensions/pydantic_settings/) - How to manage configuration
246
+ - [FastAPI](https://anydi.readthedocs.io/en/stable/extensions/fastapi/) - How to use with FastAPI
247
+ - [Django](https://anydi.readthedocs.io/en/stable/extensions/django/) - How to use with Django and Django Ninja
248
+ - [FastStream](https://anydi.readthedocs.io/en/stable/extensions/faststream/) - How to use with message brokers
249
+ - [Typer](https://anydi.readthedocs.io/en/stable/extensions/typer/) - How to use in CLI applications
250
+ - [Pydantic Settings](https://anydi.readthedocs.io/en/stable/extensions/pydantic_settings/) - How to manage configuration
251
251
 
252
252
  **Full Documentation:**
253
253
  - [Read the Docs](https://anydi.readthedocs.io/) - All documentation with examples and guides
@@ -458,21 +458,14 @@ class Container:
458
458
  )
459
459
  has_default = default is not NOT_SET
460
460
 
461
- # Check if provider exists before attempting to register (for scoped only)
462
- was_auto_registered = (
463
- is_scoped and parameter.annotation not in self._providers
464
- )
465
-
466
461
  try:
467
462
  sub_provider = self._get_or_register_provider(parameter.annotation)
468
463
  except LookupError as exc:
469
464
  if (has_defaults and parameter.name in defaults) or has_default:
470
465
  continue
471
- # For request/custom scopes, allow unregistered dependencies
472
- # They might be provided via context.set()
466
+ # For scoped (request/custom) dependencies, allow unresolved parameters
467
+ # that will be provided via context.set()
473
468
  if is_scoped:
474
- # Add to unresolved list to provide better error messages
475
- # and prevent infinite recursion
476
469
  self._resolver.add_unresolved(parameter.annotation)
477
470
  parameters.append(
478
471
  ProviderParameter(
@@ -480,8 +473,8 @@ class Container:
480
473
  annotation=parameter.annotation,
481
474
  default=default,
482
475
  has_default=has_default,
483
- provider=None, # Will check context at runtime
484
- shared_scope=True, # Same scope, check context
476
+ provider=None,
477
+ shared_scope=True,
485
478
  )
486
479
  )
487
480
  continue
@@ -493,9 +486,25 @@ class Container:
493
486
  if sub_provider.scope not in scope_provider:
494
487
  scope_provider[sub_provider.scope] = sub_provider
495
488
 
496
- # If provider was auto-registered and has same scope, mark as unresolved
497
- if was_auto_registered and sub_provider.scope == scope:
489
+ # For scoped dependencies with same scope: if auto-registered provider
490
+ # has unresolved parameters, defer to context.set() instead
491
+ if (
492
+ is_scoped
493
+ and sub_provider.scope == scope
494
+ and any(p.provider is None for p in sub_provider.parameters)
495
+ ):
498
496
  self._resolver.add_unresolved(parameter.annotation)
497
+ parameters.append(
498
+ ProviderParameter(
499
+ name=parameter.name,
500
+ annotation=parameter.annotation,
501
+ default=default,
502
+ has_default=has_default,
503
+ provider=None,
504
+ shared_scope=True,
505
+ )
506
+ )
507
+ continue
499
508
 
500
509
  parameters.append(
501
510
  ProviderParameter(
@@ -299,7 +299,7 @@ class Resolver:
299
299
  create_lines.append(" if compiled is None:")
300
300
  create_lines.append(
301
301
  " provider = "
302
- "container._get_or_register_provider(_param_annotations[{idx}])"
302
+ f"container._get_or_register_provider(_param_annotations[{idx}])"
303
303
  )
304
304
  create_lines.append(
305
305
  " compiled = "
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "anydi"
3
- version = "0.66.0"
3
+ version = "0.67.0"
4
4
  description = "Dependency Injection library"
5
5
  authors = [{ name = "Anton Ruhlov", email = "antonruhlov@gmail.com" }]
6
6
  requires-python = ">=3.10.0, <3.15"
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