GeneralManager 0.52.0__tar.gz → 0.52.2__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 (202) hide show
  1. {generalmanager-0.52.0/src/GeneralManager.egg-info → generalmanager-0.52.2}/PKG-INFO +1 -1
  2. {generalmanager-0.52.0 → generalmanager-0.52.2}/pyproject.toml +1 -1
  3. {generalmanager-0.52.0 → generalmanager-0.52.2/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_mutations.py +27 -3
  5. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/dependency_shards.py +199 -50
  6. {generalmanager-0.52.0 → generalmanager-0.52.2}/LICENSE +0 -0
  7. {generalmanager-0.52.0 → generalmanager-0.52.2}/README.md +0 -0
  8. {generalmanager-0.52.0 → generalmanager-0.52.2}/setup.cfg +0 -0
  9. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  10. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  11. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/GeneralManager.egg-info/requires.txt +0 -0
  12. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/GeneralManager.egg-info/top_level.txt +0 -0
  13. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/__init__.py +0 -0
  14. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/__init__.py +0 -0
  15. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/api.py +0 -0
  16. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/bucket.py +0 -0
  17. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/cache.py +0 -0
  18. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/factory.py +0 -0
  19. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/general_manager.py +0 -0
  20. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/interface.py +0 -0
  21. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/manager.py +0 -0
  22. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/measurement.py +0 -0
  23. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/permission.py +0 -0
  24. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/rule.py +0 -0
  25. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/search.py +0 -0
  26. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/_types/utils.py +0 -0
  27. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/__init__.py +0 -0
  28. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql.py +0 -0
  29. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_errors.py +0 -0
  30. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_prefetch.py +0 -0
  31. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_resolvers.py +0 -0
  32. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_search.py +0 -0
  33. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  34. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_subscriptions.py +0 -0
  35. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/graphql_view.py +0 -0
  36. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/mutation.py +0 -0
  37. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/property.py +0 -0
  38. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/registry.py +0 -0
  39. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/remote_api.py +0 -0
  40. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/remote_invalidation.py +0 -0
  41. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/api/remote_invalidation_client.py +0 -0
  42. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/apps.py +0 -0
  43. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bootstrap.py +0 -0
  44. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/__init__.py +0 -0
  45. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/base_bucket.py +0 -0
  46. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/calculation_bucket.py +0 -0
  47. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/database_bucket.py +0 -0
  48. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/group_bucket.py +0 -0
  49. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/indexing.py +0 -0
  50. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/bucket/request_bucket.py +0 -0
  51. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/__init__.py +0 -0
  52. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/cache_decorator.py +0 -0
  53. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/cache_tracker.py +0 -0
  54. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/dependency_cache.py +0 -0
  55. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/dependency_index.py +0 -0
  56. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/dependency_matching.py +0 -0
  57. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/dependency_publish.py +0 -0
  58. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/model_dependency_collector.py +0 -0
  59. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/run_context.py +0 -0
  60. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/cache/signals.py +0 -0
  61. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/conf.py +0 -0
  62. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/factory/__init__.py +0 -0
  63. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/factory/auto_factory.py +0 -0
  64. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/factory/factories.py +0 -0
  65. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/factory/factory_methods.py +0 -0
  66. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/__init__.py +0 -0
  67. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/base_interface.py +0 -0
  68. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/bundles/__init__.py +0 -0
  69. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/bundles/calculation.py +0 -0
  70. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/bundles/database.py +0 -0
  71. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  72. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/bundles/request.py +0 -0
  73. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/__init__.py +0 -0
  74. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/base.py +0 -0
  75. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/builtin.py +0 -0
  76. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  77. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  78. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  79. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/configuration.py +0 -0
  80. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  81. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  82. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  83. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  84. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  85. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  86. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/factory.py +0 -0
  87. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  88. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  89. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  90. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  91. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  92. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  93. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  94. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  95. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  96. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  97. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  98. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  99. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  100. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  101. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/registry.py +0 -0
  102. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  103. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  104. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  105. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  106. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  107. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/__init__.py +0 -0
  108. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/calculation.py +0 -0
  109. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/database.py +0 -0
  110. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  111. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/read_only.py +0 -0
  112. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  113. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/interfaces/request.py +0 -0
  114. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/manifests/__init__.py +0 -0
  115. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  116. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  117. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/manifests/capability_models.py +0 -0
  118. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/orm_interface.py +0 -0
  119. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/requests.py +0 -0
  120. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/utils/__init__.py +0 -0
  121. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  122. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/utils/errors.py +0 -0
  123. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/interface/utils/models.py +0 -0
  124. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/logging.py +0 -0
  125. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/management/commands/search_index.py +0 -0
  126. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  127. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/management/commands/shell.py +0 -0
  128. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  129. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  130. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/manager/__init__.py +0 -0
  131. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/manager/general_manager.py +0 -0
  132. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/manager/group_manager.py +0 -0
  133. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/manager/input.py +0 -0
  134. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/manager/meta.py +0 -0
  135. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/measurement/__init__.py +0 -0
  136. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/measurement/measurement.py +0 -0
  137. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/measurement/measurement_field.py +0 -0
  138. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/metrics/__init__.py +0 -0
  139. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/metrics/graphql.py +0 -0
  140. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/migrations/0001_initial.py +0 -0
  141. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  142. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  143. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/migrations/__init__.py +0 -0
  144. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/models.py +0 -0
  145. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/__init__.py +0 -0
  146. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/audit.py +0 -0
  147. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/base_permission.py +0 -0
  148. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/graphql_capabilities.py +0 -0
  149. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/manager_based_permission.py +0 -0
  150. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/mutation_permission.py +0 -0
  151. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/permission_checks.py +0 -0
  152. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/permission_data_manager.py +0 -0
  153. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/permission/utils.py +0 -0
  154. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/public_api_registry.py +0 -0
  155. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/py.typed +0 -0
  156. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/rule/__init__.py +0 -0
  157. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/rule/handler.py +0 -0
  158. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/rule/rule.py +0 -0
  159. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/__init__.py +0 -0
  160. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/async_tasks.py +0 -0
  161. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backend.py +0 -0
  162. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backend_registry.py +0 -0
  163. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backends/__init__.py +0 -0
  164. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backends/dev.py +0 -0
  165. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backends/meilisearch.py +0 -0
  166. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backends/opensearch.py +0 -0
  167. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/backends/typesense.py +0 -0
  168. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/config.py +0 -0
  169. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/indexer.py +0 -0
  170. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/registry.py +0 -0
  171. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/search/utils.py +0 -0
  172. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/seeding/__init__.py +0 -0
  173. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/seeding/manager_landscape.py +0 -0
  174. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/__init__.py +0 -0
  175. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/args_to_kwargs.py +0 -0
  176. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/filter_parser.py +0 -0
  177. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/format_string.py +0 -0
  178. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/json_encoder.py +0 -0
  179. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/make_cache_key.py +0 -0
  180. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/none_to_zero.py +0 -0
  181. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/path_mapping.py +0 -0
  182. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/public_api.py +0 -0
  183. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/testing.py +0 -0
  184. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/utils/type_checks.py +0 -0
  185. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/__init__.py +0 -0
  186. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/actions.py +0 -0
  187. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/backend_registry.py +0 -0
  188. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/backends/__init__.py +0 -0
  189. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/backends/celery.py +0 -0
  190. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/backends/local.py +0 -0
  191. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/backends/n8n.py +0 -0
  192. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/config.py +0 -0
  193. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/engine.py +0 -0
  194. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/event_registry.py +0 -0
  195. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/events.py +0 -0
  196. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/models.py +0 -0
  197. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/signal_bridge.py +0 -0
  198. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/tasks.py +0 -0
  199. {generalmanager-0.52.0 → generalmanager-0.52.2}/src/general_manager/workflow/telemetry.py +0 -0
  200. {generalmanager-0.52.0 → generalmanager-0.52.2}/tests/test_settings.py +0 -0
  201. {generalmanager-0.52.0 → generalmanager-0.52.2}/tests/test_urls.py +0 -0
  202. {generalmanager-0.52.0 → generalmanager-0.52.2}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.52.0
3
+ Version: 0.52.2
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.52.0"
7
+ version = "0.52.2"
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.52.0
3
+ Version: 0.52.2
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
@@ -66,6 +66,24 @@ def _normalize_mutation_kwargs_for_manager(
66
66
  # ---------------------------------------------------------------------------
67
67
 
68
68
 
69
+ def _is_direct_relation_raw_id_alias(
70
+ name: str,
71
+ attribute_types: dict[str, Any],
72
+ ) -> bool:
73
+ """Return true when ``name`` is the raw ``*_id`` alias for a direct relation."""
74
+ if not name.endswith("_id"):
75
+ return False
76
+
77
+ relation_name = name.removesuffix("_id")
78
+ relation_info = attribute_types.get(relation_name)
79
+ if relation_info is None:
80
+ return False
81
+
82
+ return relation_info.get("relation_kind") == "direct" and not relation_info.get(
83
+ "is_derived", False
84
+ )
85
+
86
+
69
87
  def create_write_fields(
70
88
  interface_cls: InterfaceBase,
71
89
  *,
@@ -74,8 +92,10 @@ def create_write_fields(
74
92
  """
75
93
  Create Graphene input fields for writable attributes defined by an Interface.
76
94
 
77
- Skips system fields (``changed_by``, ``created_at``, ``updated_at``) and
78
- attributes marked as derived. For attributes whose type is a
95
+ Skips system fields (``changed_by``, ``created_at``, ``updated_at``),
96
+ attributes marked as derived, and raw ``*_id`` aliases for direct
97
+ relations already exposed by their canonical relation field. For
98
+ attributes whose type is a
79
99
  ``GeneralManager``, produces an ID field or a list of ID fields for names
80
100
  ending with ``"_list"``. Always includes an optional ``history_comment``
81
101
  string field.
@@ -91,11 +111,14 @@ def create_write_fields(
91
111
  Mapping from attribute name to a Graphene input field instance.
92
112
  """
93
113
  fields: dict[str, Any] = {}
94
- for name, info in interface_cls.get_attribute_types().items():
114
+ attribute_types = interface_cls.get_attribute_types()
115
+ for name, info in attribute_types.items():
95
116
  if name in ["changed_by", "created_at", "updated_at"]:
96
117
  continue
97
118
  if info["is_derived"]:
98
119
  continue
120
+ if _is_direct_relation_raw_id_alias(name, attribute_types):
121
+ continue
99
122
 
100
123
  typ = info["type"]
101
124
  req = info["is_required"] if require_fields else False
@@ -184,6 +207,7 @@ def generate_create_mutation_class(
184
207
  field_name: field
185
208
  for field_name, field in create_write_fields(interface_cls).items()
186
209
  if field_name not in generalManagerClass.Interface.input_fields
210
+ and field.editable
187
211
  },
188
212
  ),
189
213
  "mutate": create_mutation,
@@ -3,8 +3,9 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import hashlib
6
+ from collections import defaultdict
6
7
  from dataclasses import dataclass, field
7
- from typing import Any, Iterable, Literal
8
+ from typing import Any, Iterable, Literal, Mapping
8
9
 
9
10
  from django.core.cache import cache
10
11
 
@@ -37,6 +38,14 @@ class ReverseDependencyMembership:
37
38
  simple_dependencies: frozenset[SimpleDependency] = field(default_factory=frozenset)
38
39
 
39
40
 
41
+ @dataclass(frozen=True, slots=True)
42
+ class _DependencyShardPlan:
43
+ shard_keys: frozenset[str]
44
+ composite_dependencies: frozenset[CompositeDependency]
45
+ simple_dependencies: frozenset[SimpleDependency]
46
+ lookup_registrations: frozenset[tuple[str, str, str]]
47
+
48
+
40
49
  def _hash_text(value: str) -> str:
41
50
  return hashlib.sha256(value.encode("utf-8")).hexdigest()
42
51
 
@@ -104,19 +113,78 @@ def cache_set_members(key: str) -> set[str]:
104
113
  return set(members)
105
114
 
106
115
 
116
+ def _cache_get_many(keys: Iterable[str]) -> dict[str, Any]:
117
+ key_tuple = tuple(dict.fromkeys(keys))
118
+ if not key_tuple:
119
+ return {}
120
+ return dict(cache.get_many(key_tuple))
121
+
122
+
123
+ def _cache_set_many(payloads: Mapping[str, Any]) -> None:
124
+ if payloads:
125
+ cache.set_many(dict(payloads), None)
126
+
127
+
128
+ def _cache_delete_many(keys: Iterable[str]) -> None:
129
+ key_tuple = tuple(dict.fromkeys(keys))
130
+ if not key_tuple:
131
+ return
132
+ delete_many = getattr(cache, "delete_many", None)
133
+ if callable(delete_many):
134
+ delete_many(key_tuple)
135
+ return
136
+ for key in key_tuple:
137
+ cache.delete(key)
138
+
139
+
140
+ def _cache_member_set(value: Any) -> set[str]:
141
+ if value is None:
142
+ return set()
143
+ if isinstance(value, (set, frozenset, list, tuple)):
144
+ return {member for member in value if isinstance(member, str)}
145
+ return set()
146
+
147
+
148
+ def _cache_set_add_many(additions: Mapping[str, set[str]]) -> None:
149
+ pending = {key: set(members) for key, members in additions.items() if members}
150
+ if not pending:
151
+ return
152
+
153
+ existing_sets = _cache_get_many(pending)
154
+ payloads: dict[str, set[str]] = {}
155
+ for key, members in pending.items():
156
+ current = _cache_member_set(existing_sets.get(key, set()))
157
+ current.update(members)
158
+ payloads[key] = current
159
+ _cache_set_many(payloads)
160
+
161
+
162
+ def _cache_set_discard_many(removals: Mapping[str, set[str]]) -> None:
163
+ pending = {key: set(members) for key, members in removals.items() if members}
164
+ if not pending:
165
+ return
166
+
167
+ existing_sets = _cache_get_many(pending)
168
+ payloads: dict[str, set[str]] = {}
169
+ delete_keys: list[str] = []
170
+ for key, members in pending.items():
171
+ current = _cache_member_set(existing_sets.get(key, set()))
172
+ current.difference_update(members)
173
+ if current:
174
+ payloads[key] = current
175
+ else:
176
+ delete_keys.append(key)
177
+
178
+ _cache_set_many(payloads)
179
+ _cache_delete_many(delete_keys)
180
+
181
+
107
182
  def _cache_set_add(key: str, member: str) -> None:
108
- members = cache_set_members(key)
109
- members.add(member)
110
- cache.set(key, members, None)
183
+ _cache_set_add_many({key: {member}})
111
184
 
112
185
 
113
186
  def _cache_set_discard(key: str, member: str) -> None:
114
- members = cache_set_members(key)
115
- members.discard(member)
116
- if members:
117
- cache.set(key, members, None)
118
- else:
119
- cache.delete(key)
187
+ _cache_set_discard_many({key: {member}})
120
188
 
121
189
 
122
190
  def _lookup_name_for_candidate(lookup: str) -> str:
@@ -190,20 +258,31 @@ def _shard_keys_for_dependency(
190
258
  manager_name: str,
191
259
  action: DependencyAction,
192
260
  identifier: str,
193
- ) -> tuple[set[str], set[CompositeDependency], set[SimpleDependency]]:
261
+ ) -> _DependencyShardPlan:
194
262
  shard_keys: set[str] = set()
195
263
  composites: set[CompositeDependency] = set()
196
264
  simple_dependencies: set[SimpleDependency] = set()
265
+ lookup_registrations: set[tuple[str, str, str]] = set()
197
266
 
198
267
  if action == "all":
199
268
  shard_keys.add(all_records_shard_key(manager_name))
200
269
  simple_dependencies.add((manager_name, action, identifier))
201
- return shard_keys, composites, simple_dependencies
270
+ return _DependencyShardPlan(
271
+ frozenset(shard_keys),
272
+ frozenset(composites),
273
+ frozenset(simple_dependencies),
274
+ frozenset(lookup_registrations),
275
+ )
202
276
 
203
277
  if action == "request_query":
204
278
  shard_keys.add(request_query_shard_key(manager_name))
205
279
  simple_dependencies.add((manager_name, action, identifier))
206
- return shard_keys, composites, simple_dependencies
280
+ return _DependencyShardPlan(
281
+ frozenset(shard_keys),
282
+ frozenset(composites),
283
+ frozenset(simple_dependencies),
284
+ frozenset(lookup_registrations),
285
+ )
207
286
 
208
287
  if action == "identification":
209
288
  shard_keys.add(
@@ -216,19 +295,39 @@ def _shard_keys_for_dependency(
216
295
  )
217
296
  )
218
297
  simple_dependencies.add((manager_name, action, identifier))
219
- return shard_keys, composites, simple_dependencies
298
+ return _DependencyShardPlan(
299
+ frozenset(shard_keys),
300
+ frozenset(composites),
301
+ frozenset(simple_dependencies),
302
+ frozenset(lookup_registrations),
303
+ )
220
304
 
221
305
  if action not in {"filter", "exclude"}:
222
- return shard_keys, composites, simple_dependencies
306
+ return _DependencyShardPlan(
307
+ frozenset(),
308
+ frozenset(),
309
+ frozenset(),
310
+ frozenset(),
311
+ )
223
312
 
224
313
  params = parse_dependency_identifier(identifier)
225
314
  if not isinstance(params, dict):
226
- return shard_keys, composites, simple_dependencies
315
+ return _DependencyShardPlan(
316
+ frozenset(),
317
+ frozenset(),
318
+ frozenset(),
319
+ frozenset(),
320
+ )
227
321
 
228
322
  if not params:
229
323
  shard_keys.add(all_records_shard_key(manager_name))
230
324
  simple_dependencies.add((manager_name, action, identifier))
231
- return shard_keys, composites, simple_dependencies
325
+ return _DependencyShardPlan(
326
+ frozenset(shard_keys),
327
+ frozenset(composites),
328
+ frozenset(simple_dependencies),
329
+ frozenset(lookup_registrations),
330
+ )
232
331
 
233
332
  sort_lookups = [
234
333
  str(lookup).removeprefix("__sort__")
@@ -239,18 +338,23 @@ def _shard_keys_for_dependency(
239
338
  composite = (manager_name, action, identifier)
240
339
  composites.add(composite)
241
340
  for sort_lookup in sort_lookups:
242
- _register_lookup(manager_name, action, sort_lookup)
341
+ lookup_registrations.add((manager_name, action, sort_lookup))
243
342
  shard_keys.add(
244
343
  composite_lookup_shard_key(manager_name, action, sort_lookup)
245
344
  )
246
- return shard_keys, composites, simple_dependencies
345
+ return _DependencyShardPlan(
346
+ frozenset(shard_keys),
347
+ frozenset(composites),
348
+ frozenset(simple_dependencies),
349
+ frozenset(lookup_registrations),
350
+ )
247
351
 
248
352
  if len(params) > 1:
249
353
  composite = (manager_name, action, identifier)
250
354
  composites.add(composite)
251
355
  for lookup in params:
252
356
  candidate_lookup = _lookup_name_for_candidate(str(lookup))
253
- _register_lookup(manager_name, action, candidate_lookup)
357
+ lookup_registrations.add((manager_name, action, candidate_lookup))
254
358
  shard_keys.add(
255
359
  composite_lookup_shard_key(
256
360
  manager_name,
@@ -258,12 +362,17 @@ def _shard_keys_for_dependency(
258
362
  candidate_lookup,
259
363
  )
260
364
  )
261
- return shard_keys, composites, simple_dependencies
365
+ return _DependencyShardPlan(
366
+ frozenset(shard_keys),
367
+ frozenset(composites),
368
+ frozenset(simple_dependencies),
369
+ frozenset(lookup_registrations),
370
+ )
262
371
 
263
372
  lookup, value = next(iter(params.items()))
264
373
  spec = lookup_spec_from_key(str(lookup))
265
374
  candidate_lookup = "__".join(spec.attr_path)
266
- _register_lookup(manager_name, action, candidate_lookup)
375
+ lookup_registrations.add((manager_name, action, candidate_lookup))
267
376
  if spec.operator == "eq":
268
377
  shard_keys.add(
269
378
  exact_lookup_shard_key(manager_name, action, spec.lookup, "eq", value)
@@ -273,56 +382,96 @@ def _shard_keys_for_dependency(
273
382
  scan_lookup_shard_key(manager_name, action, spec.lookup, spec.operator)
274
383
  )
275
384
  simple_dependencies.add((manager_name, action, identifier))
276
- return shard_keys, composites, simple_dependencies
385
+ return _DependencyShardPlan(
386
+ frozenset(shard_keys),
387
+ frozenset(composites),
388
+ frozenset(simple_dependencies),
389
+ frozenset(lookup_registrations),
390
+ )
277
391
 
278
392
 
279
- def record_cache_dependencies(
393
+ def _reverse_membership_for_dependencies(
280
394
  cache_key: str,
281
- dependencies: Iterable[Dependency],
282
- ) -> None:
283
- """Record dependency metadata for one cache key in deterministic shards."""
284
- dependency_set = set(dependencies)
285
- if not dependency_set:
286
- return
287
-
288
- clear_legacy_dependency_index()
289
- remove_cache_key_from_shards(cache_key)
290
-
395
+ dependency_set: set[Dependency],
396
+ ) -> tuple[ReverseDependencyMembership, set[tuple[str, str, str]]]:
291
397
  shard_keys: set[str] = set()
292
398
  composites: set[CompositeDependency] = set()
293
399
  simple_dependencies: set[SimpleDependency] = set()
294
- for manager_name, action, identifier in dependency_set:
295
- new_shards, new_composites, new_simple = _shard_keys_for_dependency(
296
- manager_name,
297
- action,
298
- identifier,
299
- )
300
- shard_keys.update(new_shards)
301
- composites.update(new_composites)
302
- simple_dependencies.update(new_simple)
400
+ lookup_registrations: set[tuple[str, str, str]] = set()
303
401
 
304
- for shard_key in shard_keys:
305
- _cache_set_add(shard_key, cache_key)
402
+ for manager_name, action, identifier in dependency_set:
403
+ plan = _shard_keys_for_dependency(manager_name, action, identifier)
404
+ shard_keys.update(plan.shard_keys)
405
+ composites.update(plan.composite_dependencies)
406
+ simple_dependencies.update(plan.simple_dependencies)
407
+ lookup_registrations.update(plan.lookup_registrations)
306
408
 
307
- cache.set(
308
- reverse_membership_key(cache_key),
409
+ return (
309
410
  ReverseDependencyMembership(
310
411
  cache_key=cache_key,
311
412
  shard_keys=frozenset(shard_keys),
312
413
  composite_dependencies=frozenset(composites),
313
414
  simple_dependencies=frozenset(simple_dependencies),
314
415
  ),
315
- None,
416
+ lookup_registrations,
316
417
  )
317
- _cache_set_add(REVERSE_MEMBERSHIP_REGISTRY_KEY, reverse_membership_key(cache_key))
418
+
419
+
420
+ def record_cache_dependencies(
421
+ cache_key: str,
422
+ dependencies: Iterable[Dependency],
423
+ ) -> None:
424
+ """Record dependency metadata for one cache key in deterministic shards."""
425
+ record_many_cache_dependencies(((cache_key, dependencies),))
318
426
 
319
427
 
320
428
  def record_many_cache_dependencies(
321
429
  entries: Iterable[tuple[str, Iterable[Dependency]]],
322
430
  ) -> None:
323
431
  """Record dependency metadata for many cache keys."""
432
+ normalized: dict[str, set[Dependency]] = {}
324
433
  for cache_key, dependencies in entries:
325
- record_cache_dependencies(cache_key, dependencies)
434
+ dependency_set = set(dependencies)
435
+ if dependency_set:
436
+ normalized.setdefault(cache_key, set()).update(dependency_set)
437
+ if not normalized:
438
+ return
439
+
440
+ clear_legacy_dependency_index()
441
+
442
+ reverse_keys = {
443
+ cache_key: reverse_membership_key(cache_key) for cache_key in normalized
444
+ }
445
+ existing_reverses = _cache_get_many(reverse_keys.values())
446
+
447
+ shard_removals: dict[str, set[str]] = defaultdict(set)
448
+ for cache_key, reverse_key in reverse_keys.items():
449
+ reverse = existing_reverses.get(reverse_key)
450
+ if isinstance(reverse, ReverseDependencyMembership):
451
+ for shard_key in reverse.shard_keys:
452
+ shard_removals[shard_key].add(cache_key)
453
+
454
+ _cache_set_discard_many(shard_removals)
455
+
456
+ set_additions: dict[str, set[str]] = defaultdict(set)
457
+ reverse_payloads: dict[str, ReverseDependencyMembership] = {}
458
+
459
+ for cache_key, dependency_set in normalized.items():
460
+ reverse, lookup_registrations = _reverse_membership_for_dependencies(
461
+ cache_key,
462
+ dependency_set,
463
+ )
464
+ for shard_key in reverse.shard_keys:
465
+ set_additions[shard_key].add(cache_key)
466
+ for manager_name, action, lookup in lookup_registrations:
467
+ set_additions[lookup_registry_key(manager_name, action)].add(lookup)
468
+
469
+ reverse_key = reverse_keys[cache_key]
470
+ reverse_payloads[reverse_key] = reverse
471
+ set_additions[REVERSE_MEMBERSHIP_REGISTRY_KEY].add(reverse_key)
472
+
473
+ _cache_set_add_many(set_additions)
474
+ _cache_set_many(reverse_payloads)
326
475
 
327
476
 
328
477
  def remove_cache_key_from_shards(cache_key: str) -> None:
File without changes