base-api-utils 1.1.108__tar.gz → 1.1.110.dev1__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 (112) hide show
  1. {base_api_utils-1.1.108/src/base_api_utils.egg-info → base_api_utils-1.1.110.dev1}/PKG-INFO +1 -1
  2. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/pyproject.toml +1 -1
  3. base_api_utils-1.1.110.dev1/src/base_api_utils/__init__.py +1 -0
  4. base_api_utils-1.1.110.dev1/src/base_api_utils/serializers/__init__.py +5 -0
  5. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/v2/abstract_serializer.py +14 -1
  6. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/expand_queryset_optimization_mixin.py +4 -5
  7. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1/src/base_api_utils.egg-info}/PKG-INFO +1 -1
  8. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils.egg-info/SOURCES.txt +2 -1
  9. base_api_utils-1.1.110.dev1/tests/test_lazy_imports.py +58 -0
  10. base_api_utils-1.1.108/src/base_api_utils/__init__.py +0 -1
  11. base_api_utils-1.1.108/src/base_api_utils/serializers/__init__.py +0 -5
  12. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/LICENSE +0 -0
  13. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/README.md +0 -0
  14. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/setup.cfg +0 -0
  15. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/commands/__init__.py +0 -0
  16. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/commands/failed_task_management_mixin.py +0 -0
  17. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/domain/__init__.py +0 -0
  18. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/domain/event_message.py +0 -0
  19. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/domain/event_message_factory.py +0 -0
  20. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/domain/events.py +0 -0
  21. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/dtos/__init__.py +0 -0
  22. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/dtos/authz_user.py +0 -0
  23. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/fields/__init__.py +0 -0
  24. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/fields/email_list_field.py +0 -0
  25. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/filters/__init__.py +0 -0
  26. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/filters/base_filter.py +0 -0
  27. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/filters/custom_ordering_filter.py +0 -0
  28. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/filters/filter_utils_mixin.py +0 -0
  29. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/handlers/__init__.py +0 -0
  30. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/handlers/base_event_handler.py +0 -0
  31. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/handlers/sponsor_event_handler.py +0 -0
  32. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/handlers/sponsorship_addon_event_handler.py +0 -0
  33. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/handlers/sponsorship_event_handler.py +0 -0
  34. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/handlers/summit_event_handler.py +0 -0
  35. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/ioc/__init__.py +0 -0
  36. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/ioc/container.py +0 -0
  37. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/models/__init__.py +0 -0
  38. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/models/item_image.py +0 -0
  39. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/__init__.py +0 -0
  40. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/abstract_access_token_service.py +0 -0
  41. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/abstract_oauth2_api_client.py +0 -0
  42. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/access_token_service.py +0 -0
  43. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/check_sponsor_user_permissions.py +0 -0
  44. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/group_required.py +0 -0
  45. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/oauth2_authentication.py +0 -0
  46. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/oauth2_client_factory.py +0 -0
  47. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/oauth2_scope_required.py +0 -0
  48. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/permission_event_handler.py +0 -0
  49. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/shared.py +0 -0
  50. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/security/user_permissions_service.py +0 -0
  51. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/base_model_serializer.py +0 -0
  52. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/email_list_char_field.py +0 -0
  53. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/nullable_slug_related_field.py +0 -0
  54. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/serializers_registry.py +0 -0
  55. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/task_result_serializer.py +0 -0
  56. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/timestamp_field.py +0 -0
  57. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/v2/__init__.py +0 -0
  58. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/v2/base_model_serializer.py +0 -0
  59. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/v2/expands.py +0 -0
  60. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/serializers/v2/query_params.py +0 -0
  61. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/__init__.py +0 -0
  62. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/abstract_domain_events_service.py +0 -0
  63. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/abstract_event_dispatcher.py +0 -0
  64. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/abstract_images_service.py +0 -0
  65. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/abstract_sponsor_metadata_service.py +0 -0
  66. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/abstract_storage_service.py +0 -0
  67. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/abstract_summit_metadata_service.py +0 -0
  68. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/amqp_service.py +0 -0
  69. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/celery_failed.py +0 -0
  70. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/event_dispatcher.py +0 -0
  71. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/images_service.py +0 -0
  72. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/s3_service.py +0 -0
  73. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/strategies/__init__.py +0 -0
  74. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/strategies/abstract_task_runner_strategy.py +0 -0
  75. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/services/strategies/publish_domain_event_strategy.py +0 -0
  76. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/tests/__init__.py +0 -0
  77. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/tests/test_failed_celery_task_management.py +0 -0
  78. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/urls.py +0 -0
  79. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/__init__.py +0 -0
  80. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/async_helpers.py +0 -0
  81. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/circuit_breaker.py +0 -0
  82. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/config.py +0 -0
  83. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/custom_auto_schema.py +0 -0
  84. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/db_connection_helpers.py +0 -0
  85. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/debounce_helpers.py +0 -0
  86. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/enums.py +0 -0
  87. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/env_var_eval.py +0 -0
  88. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/exceptions.py +0 -0
  89. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/external_errors.py +0 -0
  90. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/file_lock.py +0 -0
  91. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/fingerprint_helpers.py +0 -0
  92. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/http_helpers.py +0 -0
  93. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/inject_job.py +0 -0
  94. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/look_up_value_mixin.py +0 -0
  95. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/model_helpers.py +0 -0
  96. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/oauth2_custom_schema_base.py +0 -0
  97. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/pagination.py +0 -0
  98. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/rate_utils.py +0 -0
  99. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/read_write_serializer_mixin.py +0 -0
  100. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/serializers.py +0 -0
  101. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/service_utils.py +0 -0
  102. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/string.py +0 -0
  103. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/utils/tests.py +0 -0
  104. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/views/__init__.py +0 -0
  105. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/views/base_view.py +0 -0
  106. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/views/parent_children_crud.py +0 -0
  107. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/views/root_entity_crud.py +0 -0
  108. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils/views/tasks_result_view.py +0 -0
  109. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils.egg-info/dependency_links.txt +0 -0
  110. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils.egg-info/requires.txt +0 -0
  111. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/src/base_api_utils.egg-info/top_level.txt +0 -0
  112. {base_api_utils-1.1.108 → base_api_utils-1.1.110.dev1}/tests/test_circuit_breaker.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: base-api-utils
3
- Version: 1.1.108
3
+ Version: 1.1.110.dev1
4
4
  Summary: Django Rest Framework micro services common utilities
5
5
  Author-email: Román Gutierrez <roman@tipit.net>, Sebastian Marcet <sebastian@tipit.net>
6
6
  Project-URL: Homepage, https://github.com/fntechgit/base-api-utils
@@ -7,7 +7,7 @@ where = ["src"]
7
7
 
8
8
  [project]
9
9
  name = "base-api-utils"
10
- version = "1.1.108"
10
+ version = "1.1.110.dev1"
11
11
  dependencies = [
12
12
  "boto3",
13
13
  "celery",
@@ -0,0 +1 @@
1
+ from .urls import private_tasks_admin_patterns # noqa: F401
@@ -0,0 +1,5 @@
1
+ from .base_model_serializer import BaseModelSerializer # noqa: F401
2
+ from .email_list_char_field import EmailListCharField # noqa: F401
3
+ from .serializers_registry import SerializersRegistry # noqa: F401
4
+ from .task_result_serializer import TaskResultSerializer # noqa: F401
5
+ from .timestamp_field import TimestampField # noqa: F401
@@ -156,4 +156,17 @@ class AbstractSerializer:
156
156
  context=self._own_context,
157
157
  )
158
158
 
159
- return fields
159
+ return fields
160
+
161
+ def get_expand(self):
162
+ """Return relation names requested for expansion at this serializer's level."""
163
+ return list(self._own_context.get("expand_tree", {}).keys())
164
+
165
+ def get_child_context(self, attr):
166
+ """Build a scoped context for a child serializer being expanded at *attr*.
167
+
168
+ Use in custom SerializerMethodField getters:
169
+ return ChildSerializer(context=self.get_child_context('field_name')).to_representation(obj)
170
+ """
171
+ from .expands import _child_context
172
+ return _child_context(self._own_context, attr)
@@ -2,17 +2,14 @@ from typing import Any, Iterable, List, Set, Tuple
2
2
 
3
3
  from rest_framework.response import Response
4
4
 
5
- from base_api_utils.serializers.v2.query_params import (
6
- parse_request_trees,
7
- should_expand,
8
- subtree,
9
- )
10
5
 
11
6
  class ExpandQuerysetOptimizationMixin:
12
7
  # Auto-optimizes queryset from serializer.expand_mappings (recursive),
13
8
  # plus runs bulk hooks for computed relations."""
14
9
 
15
10
  def _parse_trees(self):
11
+ from base_api_utils.serializers.v2.query_params import parse_request_trees
12
+
16
13
  return parse_request_trees(self.request)
17
14
 
18
15
  def _include_field(self, fields_tree: dict | None, attr: str) -> bool:
@@ -29,6 +26,8 @@ class ExpandQuerysetOptimizationMixin:
29
26
  relations_tree: dict | None,
30
27
  prefix: str = "",
31
28
  ) -> Tuple[Set[str], Set[str], List[Tuple[str, dict, dict | None, dict | None]]]:
29
+ from base_api_utils.serializers.v2.query_params import should_expand, subtree
30
+
32
31
  select_paths: Set[str] = set()
33
32
  prefetch_paths: Set[str] = set()
34
33
  bulk_hooks: List[Tuple[str, dict, dict | None, dict | None]] = []
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: base-api-utils
3
- Version: 1.1.108
3
+ Version: 1.1.110.dev1
4
4
  Summary: Django Rest Framework micro services common utilities
5
5
  Author-email: Román Gutierrez <roman@tipit.net>, Sebastian Marcet <sebastian@tipit.net>
6
6
  Project-URL: Homepage, https://github.com/fntechgit/base-api-utils
@@ -104,4 +104,5 @@ src/base_api_utils/views/base_view.py
104
104
  src/base_api_utils/views/parent_children_crud.py
105
105
  src/base_api_utils/views/root_entity_crud.py
106
106
  src/base_api_utils/views/tasks_result_view.py
107
- tests/test_circuit_breaker.py
107
+ tests/test_circuit_breaker.py
108
+ tests/test_lazy_imports.py
@@ -0,0 +1,58 @@
1
+ import importlib.util
2
+ import sys
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+
7
+
8
+ def _load_module(name, file_path):
9
+ """Load a module directly from file path, bypassing package __init__.py."""
10
+ spec = importlib.util.spec_from_file_location(name, file_path)
11
+ if spec is None or spec.loader is None:
12
+ raise ImportError(f"Could not load module {name} from {file_path}")
13
+ module = importlib.util.module_from_spec(spec)
14
+ sys.modules[name] = module
15
+ spec.loader.exec_module(module)
16
+ return module
17
+
18
+
19
+ _utils_dir = Path(__file__).resolve().parent.parent / "src" / "base_api_utils" / "utils"
20
+
21
+
22
+ @pytest.mark.unit
23
+ class TestExpandQuerysetOptimizationMixinImports:
24
+ """Regression: ExpandQuerysetOptimizationMixin must not trigger
25
+ serializers/__init__.py at module load time, because that chain
26
+ reaches django_celery_results.models.TaskResult (a Django model
27
+ that requires the app registry to be ready).
28
+ """
29
+
30
+ def test_mixin_module_loads_without_triggering_serializers_init(self):
31
+ """Loading the mixin module should NOT execute serializers/__init__.py."""
32
+ # Clear any cached state
33
+ mod_name = "base_api_utils.utils.expand_queryset_optimization_mixin"
34
+ for key in list(sys.modules):
35
+ if key.startswith("base_api_utils.serializers"):
36
+ del sys.modules[key]
37
+ if mod_name in sys.modules:
38
+ del sys.modules[mod_name]
39
+
40
+ module = _load_module(mod_name, _utils_dir / "expand_queryset_optimization_mixin.py")
41
+
42
+ # Module should load successfully and define the mixin class
43
+ assert hasattr(module, "ExpandQuerysetOptimizationMixin")
44
+
45
+ # serializers/__init__.py should NOT have been executed during load
46
+ assert "base_api_utils.serializers" not in sys.modules
47
+ assert "base_api_utils.serializers.task_result_serializer" not in sys.modules
48
+
49
+ def test_mixin_has_no_module_level_query_params_import(self):
50
+ """The query_params import should be deferred to method level."""
51
+ mod_name = "base_api_utils.utils.expand_queryset_optimization_mixin"
52
+ if mod_name in sys.modules:
53
+ del sys.modules[mod_name]
54
+
55
+ module = _load_module(mod_name, _utils_dir / "expand_queryset_optimization_mixin.py")
56
+
57
+ # query_params should NOT be loaded at module level
58
+ assert "base_api_utils.serializers.v2.query_params" not in sys.modules
@@ -1 +0,0 @@
1
- from .urls import private_tasks_admin_patterns
@@ -1,5 +0,0 @@
1
- from .base_model_serializer import BaseModelSerializer
2
- from .email_list_char_field import EmailListCharField
3
- from .serializers_registry import SerializersRegistry
4
- from .task_result_serializer import TaskResultSerializer
5
- from .timestamp_field import TimestampField