GeneralManager 0.40.2__tar.gz → 0.40.4__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 (194) hide show
  1. {generalmanager-0.40.2/src/GeneralManager.egg-info → generalmanager-0.40.4}/PKG-INFO +1 -1
  2. {generalmanager-0.40.2 → generalmanager-0.40.4}/pyproject.toml +1 -1
  3. {generalmanager-0.40.2 → generalmanager-0.40.4/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bucket/calculation_bucket.py +81 -24
  5. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/factory/factories.py +35 -3
  6. {generalmanager-0.40.2 → generalmanager-0.40.4}/LICENSE +0 -0
  7. {generalmanager-0.40.2 → generalmanager-0.40.4}/README.md +0 -0
  8. {generalmanager-0.40.2 → generalmanager-0.40.4}/setup.cfg +0 -0
  9. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  10. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  11. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/GeneralManager.egg-info/requires.txt +0 -0
  12. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/GeneralManager.egg-info/top_level.txt +0 -0
  13. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/__init__.py +0 -0
  14. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/__init__.py +0 -0
  15. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/api.py +0 -0
  16. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/bucket.py +0 -0
  17. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/cache.py +0 -0
  18. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/factory.py +0 -0
  19. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/general_manager.py +0 -0
  20. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/interface.py +0 -0
  21. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/manager.py +0 -0
  22. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/measurement.py +0 -0
  23. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/permission.py +0 -0
  24. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/rule.py +0 -0
  25. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/search.py +0 -0
  26. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/_types/utils.py +0 -0
  27. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/__init__.py +0 -0
  28. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql.py +0 -0
  29. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_errors.py +0 -0
  30. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_mutations.py +0 -0
  31. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_resolvers.py +0 -0
  32. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_search.py +0 -0
  33. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  34. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_subscriptions.py +0 -0
  35. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/graphql_view.py +0 -0
  36. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/mutation.py +0 -0
  37. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/property.py +0 -0
  38. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/registry.py +0 -0
  39. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/remote_api.py +0 -0
  40. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/remote_invalidation.py +0 -0
  41. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/api/remote_invalidation_client.py +0 -0
  42. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/apps.py +0 -0
  43. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bootstrap.py +0 -0
  44. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bucket/__init__.py +0 -0
  45. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bucket/base_bucket.py +0 -0
  46. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bucket/database_bucket.py +0 -0
  47. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bucket/group_bucket.py +0 -0
  48. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/bucket/request_bucket.py +0 -0
  49. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/cache/__init__.py +0 -0
  50. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/cache/cache_decorator.py +0 -0
  51. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/cache/cache_tracker.py +0 -0
  52. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/cache/dependency_index.py +0 -0
  53. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/cache/model_dependency_collector.py +0 -0
  54. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/cache/signals.py +0 -0
  55. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/conf.py +0 -0
  56. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/factory/__init__.py +0 -0
  57. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/factory/auto_factory.py +0 -0
  58. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/factory/factory_methods.py +0 -0
  59. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/__init__.py +0 -0
  60. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/base_interface.py +0 -0
  61. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/bundles/__init__.py +0 -0
  62. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/bundles/calculation.py +0 -0
  63. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/bundles/database.py +0 -0
  64. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  65. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/bundles/request.py +0 -0
  66. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/__init__.py +0 -0
  67. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/base.py +0 -0
  68. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/builtin.py +0 -0
  69. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  70. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  71. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  72. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/configuration.py +0 -0
  73. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  74. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  75. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  76. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  77. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  78. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  79. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/factory.py +0 -0
  80. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  81. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  82. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  83. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  84. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  85. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  86. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  87. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  88. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  89. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  90. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  91. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  92. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  93. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  94. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/registry.py +0 -0
  95. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  96. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  97. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  98. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  99. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/__init__.py +0 -0
  100. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/calculation.py +0 -0
  101. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/database.py +0 -0
  102. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  103. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/read_only.py +0 -0
  104. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  105. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/interfaces/request.py +0 -0
  106. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/manifests/__init__.py +0 -0
  107. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  108. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  109. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/manifests/capability_models.py +0 -0
  110. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/orm_interface.py +0 -0
  111. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/requests.py +0 -0
  112. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/utils/__init__.py +0 -0
  113. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  114. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/utils/errors.py +0 -0
  115. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/interface/utils/models.py +0 -0
  116. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/logging.py +0 -0
  117. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/management/commands/search_index.py +0 -0
  118. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  119. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/management/commands/shell.py +0 -0
  120. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  121. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  122. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/manager/__init__.py +0 -0
  123. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/manager/general_manager.py +0 -0
  124. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/manager/group_manager.py +0 -0
  125. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/manager/input.py +0 -0
  126. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/manager/meta.py +0 -0
  127. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/measurement/__init__.py +0 -0
  128. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/measurement/measurement.py +0 -0
  129. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/measurement/measurement_field.py +0 -0
  130. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/metrics/__init__.py +0 -0
  131. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/metrics/graphql.py +0 -0
  132. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/migrations/0001_initial.py +0 -0
  133. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  134. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  135. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/migrations/__init__.py +0 -0
  136. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/models.py +0 -0
  137. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/__init__.py +0 -0
  138. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/audit.py +0 -0
  139. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/base_permission.py +0 -0
  140. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/graphql_capabilities.py +0 -0
  141. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/manager_based_permission.py +0 -0
  142. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/mutation_permission.py +0 -0
  143. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/permission_checks.py +0 -0
  144. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/permission_data_manager.py +0 -0
  145. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/permission/utils.py +0 -0
  146. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/public_api_registry.py +0 -0
  147. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/py.typed +0 -0
  148. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/rule/__init__.py +0 -0
  149. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/rule/handler.py +0 -0
  150. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/rule/rule.py +0 -0
  151. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/__init__.py +0 -0
  152. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/async_tasks.py +0 -0
  153. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backend.py +0 -0
  154. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backend_registry.py +0 -0
  155. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backends/__init__.py +0 -0
  156. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backends/dev.py +0 -0
  157. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backends/meilisearch.py +0 -0
  158. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backends/opensearch.py +0 -0
  159. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/backends/typesense.py +0 -0
  160. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/config.py +0 -0
  161. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/indexer.py +0 -0
  162. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/registry.py +0 -0
  163. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/search/utils.py +0 -0
  164. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/seeding/__init__.py +0 -0
  165. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/seeding/manager_landscape.py +0 -0
  166. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/__init__.py +0 -0
  167. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/args_to_kwargs.py +0 -0
  168. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/filter_parser.py +0 -0
  169. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/format_string.py +0 -0
  170. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/json_encoder.py +0 -0
  171. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/make_cache_key.py +0 -0
  172. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/none_to_zero.py +0 -0
  173. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/path_mapping.py +0 -0
  174. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/public_api.py +0 -0
  175. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/testing.py +0 -0
  176. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/utils/type_checks.py +0 -0
  177. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/__init__.py +0 -0
  178. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/actions.py +0 -0
  179. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/backend_registry.py +0 -0
  180. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/backends/__init__.py +0 -0
  181. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/backends/celery.py +0 -0
  182. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/backends/local.py +0 -0
  183. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/backends/n8n.py +0 -0
  184. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/config.py +0 -0
  185. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/engine.py +0 -0
  186. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/event_registry.py +0 -0
  187. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/events.py +0 -0
  188. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/models.py +0 -0
  189. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/signal_bridge.py +0 -0
  190. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/tasks.py +0 -0
  191. {generalmanager-0.40.2 → generalmanager-0.40.4}/src/general_manager/workflow/telemetry.py +0 -0
  192. {generalmanager-0.40.2 → generalmanager-0.40.4}/tests/test_settings.py +0 -0
  193. {generalmanager-0.40.2 → generalmanager-0.40.4}/tests/test_urls.py +0 -0
  194. {generalmanager-0.40.2 → generalmanager-0.40.4}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.40.2
3
+ Version: 0.40.4
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "GeneralManager"
7
- version = "0.40.2"
7
+ version = "0.40.4"
8
8
  description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.40.2
3
+ Version: 0.40.4
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -453,6 +453,51 @@ class CalculationBucket(Bucket[GeneralManagerType]):
453
453
  "input_excludes": input_excludes,
454
454
  }
455
455
 
456
+ def _normalized_sort_key(self) -> tuple[str, ...] | None:
457
+ """Return the configured sort key as a tuple, or None when unsorted."""
458
+ if self.sort_key is None:
459
+ return None
460
+ if isinstance(self.sort_key, str):
461
+ return (self.sort_key,)
462
+ return self.sort_key
463
+
464
+ def _sort_uses_only_inputs(self, sort_key: tuple[str, ...] | None) -> bool:
465
+ """Return whether a sort can be applied to raw input dictionaries."""
466
+ if sort_key is None:
467
+ return True
468
+ return all(key in self.input_fields for key in sort_key)
469
+
470
+ def _sort_dict_combinations(
471
+ self,
472
+ combinations: list[dict[str, Any]],
473
+ sort_key: tuple[str, ...],
474
+ ) -> list[dict[str, Any]]:
475
+ """
476
+ Sort input dictionaries while tolerating missing optional inputs.
477
+
478
+ Present values sort before missing values in ascending order. Missing
479
+ keys use None as the explicit placeholder, guarded by a presence flag so
480
+ they are not compared directly with concrete input values.
481
+ """
482
+ return sorted(
483
+ combinations,
484
+ key=lambda combo: tuple(
485
+ (key not in combo, combo.get(key, None)) for key in sort_key
486
+ ),
487
+ )
488
+
489
+ def _manager_combinations(
490
+ self,
491
+ combinations: list[dict[str, Any]],
492
+ ) -> list[GeneralManagerType]:
493
+ return [self._manager_class(**combo) for combo in combinations]
494
+
495
+ @staticmethod
496
+ def _manager_identifications(
497
+ managers: list[GeneralManagerType],
498
+ ) -> list[dict[str, Any]]:
499
+ return [manager.identification for manager in managers]
500
+
456
501
  def generate_combinations(self) -> List[dict[str, Any]]:
457
502
  """
458
503
  Compute (and cache) the list of valid input combinations.
@@ -461,10 +506,6 @@ class CalculationBucket(Bucket[GeneralManagerType]):
461
506
  list[dict[str, Any]]: Cached list of input dictionaries satisfying filters, excludes, and ordering.
462
507
  """
463
508
 
464
- def key_func(manager_obj: GeneralManagerType) -> tuple:
465
- getters = [attrgetter(key) for key in sort_key]
466
- return tuple(getter(manager_obj) for getter in getters)
467
-
468
509
  if self._data is None:
469
510
  sorted_inputs = self.topological_sort_inputs()
470
511
  sorted_filters = self._sort_filters(sorted_inputs)
@@ -473,23 +514,40 @@ class CalculationBucket(Bucket[GeneralManagerType]):
473
514
  sorted_filters["input_filters"],
474
515
  sorted_filters["input_excludes"],
475
516
  )
476
- manager_combinations = self._generate_prop_combinations(
477
- current_combinations,
478
- sorted_filters["prop_filters"],
479
- sorted_filters["prop_excludes"],
517
+ sort_key = self._normalized_sort_key()
518
+ needs_manager_access = (
519
+ bool(sorted_filters["prop_filters"])
520
+ or bool(sorted_filters["prop_excludes"])
521
+ or not self._sort_uses_only_inputs(sort_key)
480
522
  )
481
523
 
482
- if self.sort_key is not None:
483
- sort_key = self.sort_key
484
- if isinstance(sort_key, str):
485
- sort_key = (sort_key,)
486
- manager_combinations = sorted(
524
+ if needs_manager_access:
525
+ manager_combinations = self._manager_combinations(current_combinations)
526
+ manager_combinations = self._filter_prop_combinations(
487
527
  manager_combinations,
488
- key=key_func,
528
+ sorted_filters["prop_filters"],
529
+ sorted_filters["prop_excludes"],
489
530
  )
531
+ if sort_key is not None:
532
+ getters = [attrgetter(key) for key in sort_key]
533
+ manager_combinations = sorted(
534
+ manager_combinations,
535
+ key=lambda manager_obj: tuple(
536
+ getter(manager_obj) for getter in getters
537
+ ),
538
+ )
539
+ identifications = self._manager_identifications(manager_combinations)
540
+ else:
541
+ identifications = current_combinations
542
+ if sort_key is not None:
543
+ identifications = self._sort_dict_combinations(
544
+ identifications,
545
+ sort_key,
546
+ )
547
+
490
548
  if self.reverse:
491
- manager_combinations.reverse()
492
- self._data = [manager.identification for manager in manager_combinations]
549
+ identifications.reverse()
550
+ self._data = identifications
493
551
 
494
552
  return self._data
495
553
 
@@ -670,9 +728,9 @@ class CalculationBucket(Bucket[GeneralManagerType]):
670
728
 
671
729
  return list(helper(0, {}))
672
730
 
673
- def _generate_prop_combinations(
731
+ def _filter_prop_combinations(
674
732
  self,
675
- current_combos: list[dict[str, Any]],
733
+ manager_combinations: list[GeneralManagerType],
676
734
  prop_filters: dict[str, Any],
677
735
  prop_excludes: dict[str, Any],
678
736
  ) -> list[GeneralManagerType]:
@@ -680,23 +738,22 @@ class CalculationBucket(Bucket[GeneralManagerType]):
680
738
  Apply property-level filters and excludes to manager combinations.
681
739
 
682
740
  Parameters:
683
- current_combos (list[dict[str, Any]]): Input combinations already passing input filters.
741
+ manager_combinations (list[GeneralManagerType]): Managers built from
742
+ input combinations already passing input filters.
684
743
  prop_filters (dict[str, Any]): Filter definitions keyed by property name.
685
744
  prop_excludes (dict[str, Any]): Exclude definitions keyed by property name.
686
745
 
687
746
  Returns:
688
- list[GeneralManagerType]: Manager instances that satisfy property constraints.
747
+ list[GeneralManagerType]: Manager instances that satisfy property
748
+ constraints.
689
749
  """
690
750
 
691
751
  prop_filter_needed = set(prop_filters.keys()) | set(prop_excludes.keys())
692
- manager_combinations = [
693
- self._manager_class(**combo) for combo in current_combos
694
- ]
695
752
  if not prop_filter_needed:
696
753
  return manager_combinations
697
754
 
698
755
  # Apply property filters and exclusions
699
- filtered_combos = []
756
+ filtered_combos: list[GeneralManagerType] = []
700
757
  for manager in manager_combinations:
701
758
  keep = True
702
759
  # include filters
@@ -7,6 +7,7 @@ from typing import Any, cast
7
7
  from factory.declarations import LazyFunction
8
8
  from factory.faker import Faker
9
9
  import exrex # type: ignore[import-untyped]
10
+ from django.apps import apps
10
11
  from django.core.validators import RegexValidator
11
12
  from django.db import models
12
13
  from datetime import date, datetime, timezone, timedelta
@@ -18,6 +19,7 @@ from general_manager.manager.general_manager import GeneralManager
18
19
 
19
20
 
20
21
  _RNG = SystemRandom()
22
+ _NO_DEFAULT = object()
21
23
 
22
24
 
23
25
  class MissingFactoryOrInstancesError(ValueError):
@@ -96,6 +98,13 @@ def get_field_value(
96
98
  MissingRelatedModelError: When a relational field does not declare a related model.
97
99
  InvalidRelatedModelTypeError: When a relational field's related value is not a Django model class.
98
100
  """
101
+ if (
102
+ getattr(field, "null", False)
103
+ and getattr(field, "default", _NO_DEFAULT) is None
104
+ and getattr(field, "is_relation", False)
105
+ ):
106
+ return None
107
+
99
108
  if field.null:
100
109
  if _RNG.choice([True] + 9 * [False]):
101
110
  return None
@@ -246,11 +255,11 @@ def get_related_model(
246
255
  MissingRelatedModelError: If the field does not declare a related model.
247
256
  InvalidRelatedModelTypeError: If the resolved related model is not a Django model class.
248
257
  """
249
- related_model = field.related_model
258
+ related_model: object = field.related_model
250
259
  if related_model is None:
251
260
  raise MissingRelatedModelError(field.name)
252
- if related_model == "self":
253
- related_model = field.model
261
+ if isinstance(related_model, str):
262
+ related_model = _resolve_related_model_string(field, related_model)
254
263
  if not isinstance(related_model, type) or not issubclass(
255
264
  related_model, models.Model
256
265
  ):
@@ -258,6 +267,29 @@ def get_related_model(
258
267
  return cast(type[models.Model], related_model)
259
268
 
260
269
 
270
+ def _resolve_related_model_string(
271
+ field: models.ForeignObjectRel | models.Field[Any, Any],
272
+ related_model: str,
273
+ ) -> object:
274
+ if related_model == "self":
275
+ return field.model
276
+ app_label: str | None
277
+ if "." in related_model:
278
+ app_label, model_name = related_model.split(".", 1)
279
+ else:
280
+ model = getattr(field, "model", None)
281
+ opts = getattr(model, "_meta", None)
282
+ app_label_value = getattr(opts, "app_label", None)
283
+ app_label = app_label_value if isinstance(app_label_value, str) else None
284
+ model_name = related_model
285
+ if not app_label:
286
+ return related_model
287
+ try:
288
+ return apps.get_model(app_label, model_name)
289
+ except LookupError:
290
+ return related_model
291
+
292
+
261
293
  def get_many_to_many_field_value(
262
294
  field: models.ManyToManyField,
263
295
  ) -> list[models.Model]:
File without changes