GeneralManager 0.87.6__tar.gz → 0.88.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 (376) hide show
  1. {generalmanager-0.87.6/src/GeneralManager.egg-info → generalmanager-0.88.0}/PKG-INFO +1 -1
  2. {generalmanager-0.87.6 → generalmanager-0.88.0}/pyproject.toml +1 -1
  3. {generalmanager-0.87.6 → generalmanager-0.88.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql.py +6 -6
  5. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_output.py +66 -32
  6. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_type.py +10 -6
  7. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/mutation.py +206 -6
  8. {generalmanager-0.87.6 → generalmanager-0.88.0}/LICENSE +0 -0
  9. {generalmanager-0.87.6 → generalmanager-0.88.0}/README.md +0 -0
  10. {generalmanager-0.87.6 → generalmanager-0.88.0}/setup.cfg +0 -0
  11. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  12. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  13. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/GeneralManager.egg-info/requires.txt +0 -0
  14. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
  15. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/__init__.py +0 -0
  16. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/__init__.py +0 -0
  17. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/api.py +0 -0
  18. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/bucket.py +0 -0
  19. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/cache.py +0 -0
  20. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/dataframes.py +0 -0
  21. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/factory.py +0 -0
  22. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/general_manager.py +0 -0
  23. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/interface.py +0 -0
  24. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/manager.py +0 -0
  25. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/measurement.py +0 -0
  26. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/permission.py +0 -0
  27. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/rule.py +0 -0
  28. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/search.py +0 -0
  29. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/_types/utils.py +0 -0
  30. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/__init__.py +0 -0
  31. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_as_of.py +0 -0
  32. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_errors.py +0 -0
  33. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_filter_contract.py +0 -0
  34. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_groups.py +0 -0
  35. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_identifiers.py +0 -0
  36. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_mutations.py +0 -0
  37. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_ordering.py +0 -0
  38. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_prefetch.py +0 -0
  39. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_query_permissions.py +0 -0
  40. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_relations.py +0 -0
  41. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_resolvers.py +0 -0
  42. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_search.py +0 -0
  43. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  44. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
  45. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_units.py +0 -0
  46. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_value_contract.py +0 -0
  47. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_view.py +0 -0
  48. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_warmup.py +0 -0
  49. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  50. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  51. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/mutation_controls.py +0 -0
  52. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/notification_batching.py +0 -0
  53. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/property.py +0 -0
  54. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/registry.py +0 -0
  55. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/remote_api.py +0 -0
  56. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/remote_invalidation.py +0 -0
  57. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
  58. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/apps.py +0 -0
  59. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/as_of.py +0 -0
  60. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bootstrap.py +0 -0
  61. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/__init__.py +0 -0
  62. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  63. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/_ordering.py +0 -0
  64. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/base_bucket.py +0 -0
  65. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
  66. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/database_bucket.py +0 -0
  67. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/excel_bucket.py +0 -0
  68. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/group_bucket.py +0 -0
  69. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/indexing.py +0 -0
  70. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/projection.py +0 -0
  71. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/bucket/request_bucket.py +0 -0
  72. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/__init__.py +0 -0
  73. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/_dependency_graph.py +0 -0
  74. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/batch_refresh.py +0 -0
  75. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/cache_decorator.py +0 -0
  76. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/cache_tracker.py +0 -0
  77. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/data_change_context.py +0 -0
  78. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/dependency_cache.py +0 -0
  79. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/dependency_index.py +0 -0
  80. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/dependency_matching.py +0 -0
  81. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/dependency_publish.py +0 -0
  82. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/dependency_shards.py +0 -0
  83. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
  84. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/run_context.py +0 -0
  85. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/run_context_lru.py +0 -0
  86. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/signals.py +0 -0
  87. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/cache/transaction_barrier.py +0 -0
  88. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/__init__.py +0 -0
  89. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/audit.py +0 -0
  90. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/audit_identity.py +0 -0
  91. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/bootstrap.py +0 -0
  92. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/checks.py +0 -0
  93. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/consumer.py +0 -0
  94. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/context.py +0 -0
  95. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/errors.py +0 -0
  96. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/__init__.py +0 -0
  97. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/__main__.py +0 -0
  98. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/baseline.py +0 -0
  99. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  100. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  101. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  102. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  103. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  104. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  105. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  106. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
  107. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/execution.py +0 -0
  108. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
  109. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/fixtures.py +0 -0
  110. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  111. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  112. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
  113. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  114. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/judges/result_set.py +0 -0
  115. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  116. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/outcomes.py +0 -0
  117. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/readiness.py +0 -0
  118. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/runner.py +0 -0
  119. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/evals/traces.py +0 -0
  120. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/graphql_contract.py +0 -0
  121. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/grounding.py +0 -0
  122. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/models.py +0 -0
  123. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/mutation_inputs.py +0 -0
  124. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/__init__.py +0 -0
  125. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/action_contract.py +0 -0
  126. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/binding_diagnostics.py +0 -0
  127. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/budget.py +0 -0
  128. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/calculation_scope.py +0 -0
  129. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/calculations.py +0 -0
  130. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/catalog.py +0 -0
  131. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/category_binding.py +0 -0
  132. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/choice_context.py +0 -0
  133. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/clarification.py +0 -0
  134. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/config.py +0 -0
  135. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/contract.py +0 -0
  136. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/conversion.py +0 -0
  137. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/cross_query.py +0 -0
  138. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/deferred_calculations.py +0 -0
  139. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/deferred_schema.py +0 -0
  140. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/events.py +0 -0
  141. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/evidence.py +0 -0
  142. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/evidence_selection.py +0 -0
  143. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/group_actions.py +0 -0
  144. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/models.py +0 -0
  145. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/planner.py +0 -0
  146. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/planner_context.py +0 -0
  147. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
  148. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/resolver.py +0 -0
  149. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/scheduler.py +0 -0
  150. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/schema_projection.py +0 -0
  151. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/selector_clarification.py +0 -0
  152. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/selector_question.py +0 -0
  153. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/synthesis.py +0 -0
  154. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/planned/validation.py +0 -0
  155. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/__init__.py +0 -0
  156. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/_shared.py +0 -0
  157. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/anthropic.py +0 -0
  158. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/base.py +0 -0
  159. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/google.py +0 -0
  160. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/ollama.py +0 -0
  161. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/providers/openai.py +0 -0
  162. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/rate_limits.py +0 -0
  163. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/routing.py +0 -0
  164. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/schema_index.py +0 -0
  165. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/schema_inspection.py +0 -0
  166. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/settings.py +0 -0
  167. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/signals.py +0 -0
  168. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/system_prompt.py +0 -0
  169. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/tool_metadata.py +0 -0
  170. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/tools.py +0 -0
  171. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/turns.py +0 -0
  172. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/chat/views.py +0 -0
  173. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/conf.py +0 -0
  174. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/dataframes/__init__.py +0 -0
  175. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/dataframes/measurements.py +0 -0
  176. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/factory/__init__.py +0 -0
  177. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/factory/auto_factory.py +0 -0
  178. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/factory/factories.py +0 -0
  179. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/factory/factory_methods.py +0 -0
  180. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/__init__.py +0 -0
  181. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/base_interface.py +0 -0
  182. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/bundles/__init__.py +0 -0
  183. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/bundles/calculation.py +0 -0
  184. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/bundles/database.py +0 -0
  185. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/bundles/excel.py +0 -0
  186. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  187. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/bundles/request.py +0 -0
  188. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
  189. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/base.py +0 -0
  190. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
  191. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  192. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  193. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  194. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  195. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
  196. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  197. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  198. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  199. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  200. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  201. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  202. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  203. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/factory.py +0 -0
  204. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  205. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  206. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/bulk.py +0 -0
  207. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/create_many.py +0 -0
  208. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  209. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/history_query.py +0 -0
  210. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  211. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  212. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  213. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  214. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm_utils/collection_probes.py +0 -0
  215. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  216. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  217. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  218. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  219. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  220. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  221. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  222. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  223. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  224. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/registry.py +0 -0
  225. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  226. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  227. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/excel.py +0 -0
  228. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/excel_store.py +0 -0
  229. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/excel_workbook.py +0 -0
  230. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  231. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  232. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  233. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
  234. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
  235. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/database.py +0 -0
  236. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/excel.py +0 -0
  237. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  238. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
  239. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  240. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/interfaces/request.py +0 -0
  241. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/manifests/__init__.py +0 -0
  242. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  243. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  244. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
  245. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/orm_interface.py +0 -0
  246. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/requests.py +0 -0
  247. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/unit_contract.py +0 -0
  248. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/utils/__init__.py +0 -0
  249. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  250. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/utils/errors.py +0 -0
  251. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/utils/history.py +0 -0
  252. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/interface/utils/models.py +0 -0
  253. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/logging.py +0 -0
  254. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  255. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  256. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  257. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  258. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/search_index.py +0 -0
  259. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/search_reconcile.py +0 -0
  260. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  261. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/shell.py +0 -0
  262. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/sync_read_only.py +0 -0
  263. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  264. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  265. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/manager/__init__.py +0 -0
  266. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/manager/bulk_create.py +0 -0
  267. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/manager/general_manager.py +0 -0
  268. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/manager/group_manager.py +0 -0
  269. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/manager/input.py +0 -0
  270. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/manager/meta.py +0 -0
  271. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/measurement/__init__.py +0 -0
  272. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/measurement/measurement.py +0 -0
  273. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/measurement/measurement_field.py +0 -0
  274. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/metrics/__init__.py +0 -0
  275. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/metrics/graphql.py +0 -0
  276. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0001_initial.py +0 -0
  277. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  278. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  279. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  280. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  281. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  282. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  283. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  284. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  285. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  286. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  287. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  288. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  289. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/migrations/__init__.py +0 -0
  290. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/models.py +0 -0
  291. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/__init__.py +0 -0
  292. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/audit.py +0 -0
  293. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/base_permission.py +0 -0
  294. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
  295. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/manager_based_permission.py +0 -0
  296. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/mutation_permission.py +0 -0
  297. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/permission_checks.py +0 -0
  298. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/permission_data_manager.py +0 -0
  299. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/permission/utils.py +0 -0
  300. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/public_api_registry.py +0 -0
  301. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/py.typed +0 -0
  302. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/rule/__init__.py +0 -0
  303. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/rule/handler.py +0 -0
  304. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/rule/rule.py +0 -0
  305. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/__init__.py +0 -0
  306. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/async_tasks.py +0 -0
  307. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/authorization.py +0 -0
  308. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backend.py +0 -0
  309. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backend_registry.py +0 -0
  310. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backends/__init__.py +0 -0
  311. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backends/dev.py +0 -0
  312. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backends/meilisearch.py +0 -0
  313. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backends/opensearch.py +0 -0
  314. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/backends/typesense.py +0 -0
  315. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/checks.py +0 -0
  316. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/config.py +0 -0
  317. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/identity.py +0 -0
  318. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/indexer.py +0 -0
  319. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/invalidation.py +0 -0
  320. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/m2m_invalidation.py +0 -0
  321. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/models.py +0 -0
  322. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/projection.py +0 -0
  323. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/reconciliation.py +0 -0
  324. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/registry.py +0 -0
  325. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/tasks.py +0 -0
  326. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/search/utils.py +0 -0
  327. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/seeding/__init__.py +0 -0
  328. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/seeding/manager_landscape.py +0 -0
  329. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/__init__.py +0 -0
  330. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/adapters.py +0 -0
  331. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/checks.py +0 -0
  332. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/config.py +0 -0
  333. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/errors.py +0 -0
  334. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/finalization.py +0 -0
  335. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/graphql.py +0 -0
  336. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/graphql_types.py +0 -0
  337. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/metrics.py +0 -0
  338. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/models.py +0 -0
  339. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/public.py +0 -0
  340. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/s3.py +0 -0
  341. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/services.py +0 -0
  342. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/tokens.py +0 -0
  343. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/types.py +0 -0
  344. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/urls.py +0 -0
  345. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/uploads/views.py +0 -0
  346. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/__init__.py +0 -0
  347. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  348. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  349. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/_make_cache_key.py +0 -0
  350. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/_none_to_zero.py +0 -0
  351. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/executable_contract.py +0 -0
  352. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/filter_parser.py +0 -0
  353. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/format_string.py +0 -0
  354. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/json_encoder.py +0 -0
  355. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/path_mapping.py +0 -0
  356. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/public_api.py +0 -0
  357. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/testing.py +0 -0
  358. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/utils/type_checks.py +0 -0
  359. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/__init__.py +0 -0
  360. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/actions.py +0 -0
  361. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/backend_registry.py +0 -0
  362. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/backends/__init__.py +0 -0
  363. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/backends/celery.py +0 -0
  364. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/backends/local.py +0 -0
  365. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/backends/n8n.py +0 -0
  366. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/config.py +0 -0
  367. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/engine.py +0 -0
  368. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/event_registry.py +0 -0
  369. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/events.py +0 -0
  370. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/models.py +0 -0
  371. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/signal_bridge.py +0 -0
  372. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/tasks.py +0 -0
  373. {generalmanager-0.87.6 → generalmanager-0.88.0}/src/general_manager/workflow/telemetry.py +0 -0
  374. {generalmanager-0.87.6 → generalmanager-0.88.0}/tests/test_settings.py +0 -0
  375. {generalmanager-0.87.6 → generalmanager-0.88.0}/tests/test_urls.py +0 -0
  376. {generalmanager-0.87.6 → generalmanager-0.88.0}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.87.6
3
+ Version: 0.88.0
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.87.6"
7
+ version = "0.88.0"
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.87.6
3
+ Version: 0.88.0
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
@@ -109,7 +109,7 @@ from general_manager.api.graphql_mutations import (
109
109
  generate_delete_mutation_class as _generate_delete_mutation_class_fn,
110
110
  )
111
111
  from general_manager.api.graphql_output import (
112
- GraphQLOutputIdentityMetadataError,
112
+ _value_field_is_identifier,
113
113
  create_output_field_resolver,
114
114
  map_graphql_output_annotation,
115
115
  resolve_output_type_hints,
@@ -390,6 +390,9 @@ class GraphQL:
390
390
  _subscription_payload_registry: ClassVar[dict[str, type[graphene.ObjectType]]] = {}
391
391
  graphql_type_registry: ClassVar[dict[str, type[graphene.ObjectType]]] = {}
392
392
  graphql_output_type_registry: ClassVar[dict[str, type[graphene.ObjectType]]] = {}
393
+ _value_input_type_cache: ClassVar[
394
+ dict[type[GraphQLType], type[graphene.InputObjectType]]
395
+ ] = {}
393
396
  graphql_filter_type_registry: ClassVar[
394
397
  dict[str, type[graphene.InputObjectType]]
395
398
  ] = {}
@@ -440,6 +443,7 @@ class GraphQL:
440
443
  cls._subscription_payload_registry = {}
441
444
  cls.graphql_type_registry = {}
442
445
  cls.graphql_output_type_registry = {}
446
+ cls._value_input_type_cache = {}
443
447
  cls.graphql_filter_type_registry = {}
444
448
  cls.graphql_capability_type_registry = {}
445
449
  cls.manager_registry = {}
@@ -532,11 +536,7 @@ class GraphQL:
532
536
  )
533
537
  fields: dict[str, graphene.Field] = {}
534
538
  for declared_field in dataclasses.fields(output_class):
535
- is_identifier = declared_field.metadata.get("is_identifier", False)
536
- if not isinstance(is_identifier, bool):
537
- raise GraphQLOutputIdentityMetadataError(
538
- output_name, declared_field.name, is_identifier
539
- )
539
+ is_identifier = _value_field_is_identifier(output_name, declared_field)
540
540
  mapped = map_graphql_output_annotation(
541
541
  hints[declared_field.name],
542
542
  owner_name=output_name,
@@ -3,7 +3,7 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections.abc import Callable, Mapping
6
- from dataclasses import dataclass, replace
6
+ from dataclasses import Field, dataclass, replace
7
7
  from datetime import date, datetime
8
8
  from decimal import Decimal
9
9
  import sys
@@ -51,6 +51,14 @@ class GraphQLOutputIdentityMetadataError(TypeError):
51
51
  )
52
52
 
53
53
 
54
+ def _value_field_is_identifier(owner_name: str, field: Field[object]) -> bool:
55
+ """Read the shared identity metadata on a GraphQL value field."""
56
+ flag = field.metadata.get("is_identifier", False)
57
+ if not isinstance(flag, bool):
58
+ raise GraphQLOutputIdentityMetadataError(owner_name, field.name, flag)
59
+ return flag
60
+
61
+
54
62
  @dataclass(frozen=True, slots=True)
55
63
  class _MappedAnnotation:
56
64
  """Internal Graphene type metadata before a field wrapper is mounted."""
@@ -144,19 +152,14 @@ def _lazy_registry_type(
144
152
  return lambda: registry[name]
145
153
 
146
154
 
147
- def _map_collection_annotation(
155
+ def _collection_element_annotation(
148
156
  annotation: object,
149
157
  *,
150
158
  owner_name: str,
151
159
  field_name: str,
152
- manager_registry: Mapping[str, type[GeneralManager]],
153
- manager_type_registry: Mapping[str, type[graphene.ObjectType]],
154
- output_class_registry: Mapping[str, type[GraphQLType]],
155
- output_type_registry: Mapping[str, type[graphene.ObjectType]],
156
- measurement_type: type[graphene.ObjectType],
157
- scalar_mapper: Callable[[type], type],
158
- is_identifier: bool = False,
159
- ) -> _MappedAnnotation:
160
+ is_identifier: bool,
161
+ ) -> object:
162
+ """Validate a homogeneous collection and return its element annotation."""
160
163
  origin = get_origin(annotation)
161
164
  if origin not in (list, tuple, set):
162
165
  raise _annotation_error(owner_name, field_name, annotation)
@@ -178,6 +181,28 @@ def _map_collection_annotation(
178
181
  if identity_type not in (int, str, UUID):
179
182
  raise _annotation_error(owner_name, field_name, annotation)
180
183
 
184
+ return element_annotation
185
+
186
+
187
+ def _map_collection_annotation(
188
+ annotation: object,
189
+ *,
190
+ owner_name: str,
191
+ field_name: str,
192
+ manager_registry: Mapping[str, type[GeneralManager]],
193
+ manager_type_registry: Mapping[str, type[graphene.ObjectType]],
194
+ output_class_registry: Mapping[str, type[GraphQLType]],
195
+ output_type_registry: Mapping[str, type[graphene.ObjectType]],
196
+ measurement_type: type[graphene.ObjectType],
197
+ scalar_mapper: Callable[[type], type],
198
+ is_identifier: bool = False,
199
+ ) -> _MappedAnnotation:
200
+ element_annotation = _collection_element_annotation(
201
+ annotation,
202
+ owner_name=owner_name,
203
+ field_name=field_name,
204
+ is_identifier=is_identifier,
205
+ )
181
206
  element = _map_annotation(
182
207
  element_annotation,
183
208
  owner_name=owner_name,
@@ -201,6 +226,23 @@ def _map_collection_annotation(
201
226
  )
202
227
 
203
228
 
229
+ def _map_value_scalar_annotation(
230
+ annotation: object,
231
+ *,
232
+ owner_name: str,
233
+ field_name: str,
234
+ scalar_mapper: Callable[[type], type],
235
+ is_identifier: bool,
236
+ ) -> object:
237
+ """Map value scalars without the legacy mapper's fallback to String."""
238
+ if is_identifier:
239
+ if annotation in (int, str, UUID):
240
+ return graphene.ID
241
+ elif safe_issubclass(annotation, (str, bool, int, float, Decimal, datetime, date)):
242
+ return scalar_mapper(annotation)
243
+ raise _annotation_error(owner_name, field_name, annotation)
244
+
245
+
204
246
  def _map_non_optional_value(
205
247
  annotation: object,
206
248
  *,
@@ -245,10 +287,14 @@ def _map_non_optional_value(
245
287
  )
246
288
 
247
289
  if is_identifier:
248
- if annotation not in (int, str, UUID):
249
- raise _annotation_error(owner_name, field_name, annotation)
250
290
  return _MappedAnnotation(
251
- graphene.ID,
291
+ _map_value_scalar_annotation(
292
+ annotation,
293
+ owner_name=owner_name,
294
+ field_name=field_name,
295
+ scalar_mapper=scalar_mapper,
296
+ is_identifier=True,
297
+ ),
252
298
  annotation,
253
299
  nullable=False,
254
300
  contains_measurement=False,
@@ -284,25 +330,13 @@ def _map_non_optional_value(
284
330
  contains_measurement=True,
285
331
  )
286
332
 
287
- if not isinstance(annotation, type):
288
- raise _annotation_error(owner_name, field_name, annotation)
289
-
290
- # Keep this allowlist explicit. The legacy mapper intentionally falls back
291
- # to String for unknown classes, which is unsafe for output declarations.
292
- if safe_issubclass(annotation, bool):
293
- scalar_type = scalar_mapper(annotation)
294
- elif safe_issubclass(annotation, str):
295
- scalar_type = scalar_mapper(annotation)
296
- elif safe_issubclass(annotation, int):
297
- scalar_type = scalar_mapper(annotation)
298
- elif safe_issubclass(annotation, (float, Decimal)):
299
- scalar_type = scalar_mapper(annotation)
300
- elif safe_issubclass(annotation, datetime):
301
- scalar_type = scalar_mapper(annotation)
302
- elif safe_issubclass(annotation, date):
303
- scalar_type = scalar_mapper(annotation)
304
- else:
305
- raise _annotation_error(owner_name, field_name, annotation)
333
+ scalar_type = _map_value_scalar_annotation(
334
+ annotation,
335
+ owner_name=owner_name,
336
+ field_name=field_name,
337
+ scalar_mapper=scalar_mapper,
338
+ is_identifier=False,
339
+ )
306
340
  return _MappedAnnotation(
307
341
  scalar_type,
308
342
  annotation,
@@ -1,4 +1,4 @@
1
- """Frozen value declarations for GraphQL output objects."""
1
+ """Frozen value declarations for GraphQL objects."""
2
2
 
3
3
  from __future__ import annotations
4
4
 
@@ -8,7 +8,7 @@ from typing import ClassVar, cast, dataclass_transform
8
8
 
9
9
  @dataclass_transform(field_specifiers=(Field, field), frozen_default=True)
10
10
  class GraphQLTypeMeta(type):
11
- """Create and register frozen dataclass-based GraphQL output declarations."""
11
+ """Create and register frozen dataclass-based GraphQL value declarations."""
12
12
 
13
13
  _registered_types: ClassVar[list[type[GraphQLType]]] = []
14
14
 
@@ -29,18 +29,22 @@ class GraphQLTypeMeta(type):
29
29
 
30
30
 
31
31
  class GraphQLType(metaclass=GraphQLTypeMeta):
32
- """Frozen annotated value exposed only as a GraphQL output object.
32
+ """Frozen annotated value for GraphQL outputs and custom mutation inputs.
33
+
34
+ A custom mutation parameter annotated with a concrete subclass uses the
35
+ generated input object named ``<ClassName>Input``. Its constructor fields
36
+ are populated before the mutation's permission check and resolver run.
33
37
 
34
38
  Use ``dataclasses.field(metadata={"is_identifier": True})`` to declare
35
39
  native int, str, or UUID identity fields and their supported homogeneous
36
40
  collections. Schema generation preserves annotation nullability and native
37
- values while exposing ID scalars. Missing or false metadata keeps existing
38
- output types; other flag values fail schema generation with TypeError.
41
+ values while exposing ID scalars. Missing or false metadata keeps ordinary
42
+ scalar types; other flag values fail schema generation with TypeError.
39
43
  """
40
44
 
41
45
 
42
46
  def get_registered_graphql_types() -> tuple[type[GraphQLType], ...]:
43
- """Return the declared GraphQL output types in creation order."""
47
+ """Return the declared GraphQL value types in creation order."""
44
48
  return tuple(GraphQLTypeMeta._registered_types)
45
49
 
46
50
 
@@ -2,6 +2,9 @@
2
2
 
3
3
  import inspect
4
4
  from collections.abc import Sequence
5
+ from dataclasses import MISSING, dataclass, fields
6
+ from decimal import Decimal
7
+ from functools import partial
5
8
  from typing import (
6
9
  Callable,
7
10
  TypeVar,
@@ -16,15 +19,28 @@ from typing import (
16
19
  Protocol,
17
20
  cast,
18
21
  )
22
+ from uuid import UUID
23
+
19
24
  import graphene
25
+ from django.core.exceptions import ValidationError
20
26
  from graphql import GraphQLError, GraphQLResolveInfo
21
27
 
22
28
  from general_manager.api.graphql import GraphQL
23
29
  from general_manager.api.graphql_identifiers import map_identification_scalar
24
- from general_manager.api.graphql_output import create_output_field_resolver
30
+ from general_manager.api.graphql_output import (
31
+ _collection_element_annotation,
32
+ _map_value_scalar_annotation,
33
+ _unwrap_optional_annotation as _unwrap_value_optional,
34
+ _value_field_is_identifier,
35
+ create_output_field_resolver,
36
+ resolve_output_type_hints,
37
+ )
38
+ from general_manager.api.graphql_type import GraphQLType, get_registered_graphql_types
25
39
  from general_manager.manager.general_manager import GeneralManager
40
+ from general_manager.measurement.measurement import Measurement
26
41
 
27
42
  from general_manager.utils.format_string import snake_to_camel
43
+ from general_manager.utils.type_checks import safe_issubclass
28
44
  from general_manager.permission.mutation_permission import MutationPermission
29
45
  from types import UnionType
30
46
 
@@ -232,7 +248,7 @@ def _normalize_mutation_arguments(
232
248
  annotations: MutationAnnotations,
233
249
  kwargs: MutationKwargs,
234
250
  ) -> MutationKwargs:
235
- """Normalize manager-typed arguments and lists using resolver annotations."""
251
+ """Normalize mutation values using the resolver annotations."""
236
252
  normalized = dict(kwargs)
237
253
  for name, annotation in annotations.items():
238
254
  if name not in normalized:
@@ -255,7 +271,7 @@ def _unwrap_optional_annotation(annotation: object) -> tuple[bool, object]:
255
271
 
256
272
 
257
273
  def _normalize_mutation_value(annotation: object, value: object) -> object:
258
- """Recursively normalize manager values while preserving explicit ``None``."""
274
+ """Normalize annotated value objects, managers, and lists."""
259
275
  if value is None:
260
276
  return None
261
277
  _, concrete = _unwrap_optional_annotation(annotation)
@@ -267,12 +283,20 @@ def _normalize_mutation_value(annotation: object, value: object) -> object:
267
283
  ]
268
284
  if _is_general_manager_type(concrete):
269
285
  return _normalize_manager_argument(concrete, value)
286
+ if safe_issubclass(concrete, GraphQLType) and not isinstance(value, concrete):
287
+ if (
288
+ not isinstance(value, _GraphQLTypeInput)
289
+ or value.declaration is not concrete
290
+ ):
291
+ message = f"Expected coerced GraphQL input for {concrete.__name__}."
292
+ raise TypeError(message)
293
+ return value.construct()
270
294
  return value
271
295
 
272
296
 
273
297
  def _mutation_input_type(annotation: object) -> object:
274
298
  """Map nested mutation input annotations to unmounted Graphene types."""
275
- nullable, concrete = _unwrap_optional_annotation(annotation)
299
+ _, concrete = _unwrap_optional_annotation(annotation)
276
300
  origin = get_origin(concrete)
277
301
  if origin is list or origin is List:
278
302
  inner_annotation = get_args(concrete)[0]
@@ -285,7 +309,9 @@ def _mutation_input_type(annotation: object) -> object:
285
309
  if _uses_single_id_input(concrete):
286
310
  return graphene.ID
287
311
  return _get_or_create_manager_input_type(concrete)
288
- del nullable
312
+ if safe_issubclass(concrete, GraphQLType):
313
+ declaration = cast(type[GraphQLType], concrete)
314
+ return lambda: _get_or_create_value_input_type(declaration)
289
315
  return GraphQL._map_field_to_graphene_base_type(cast(type, concrete))
290
316
 
291
317
 
@@ -300,6 +326,8 @@ def _build_mutation_argument_field(
300
326
  input_type = _mutation_input_type(annotation)
301
327
  if isinstance(input_type, graphene.List):
302
328
  return graphene.List(input_type.of_type, **kwargs)
329
+ if inspect.isfunction(input_type):
330
+ return graphene.Argument(input_type, **kwargs)
303
331
  return cast(Callable[..., object], input_type)(**kwargs)
304
332
 
305
333
 
@@ -349,6 +377,173 @@ def _sequence_argument(value: object) -> Sequence[object]:
349
377
  return (value,)
350
378
 
351
379
 
380
+ @dataclass(frozen=True, slots=True)
381
+ class _GraphQLTypeInput:
382
+ """A coerced input object awaiting construction at the mutation boundary."""
383
+
384
+ declaration: type[GraphQLType]
385
+ construct: Callable[[], GraphQLType]
386
+
387
+
388
+ @dataclass(frozen=True, slots=True)
389
+ class _ValueInputField:
390
+ type: object
391
+ nullable: bool
392
+ normalize: Callable[[object], object]
393
+
394
+
395
+ def _normalize_value_identifier(
396
+ identity_type: type, field_path: str, value: object
397
+ ) -> object:
398
+ try:
399
+ return identity_type(str(value))
400
+ except ValueError as error:
401
+ message = f"{field_path} must be a valid {identity_type.__name__} ID."
402
+ raise ValidationError(message) from error
403
+
404
+
405
+ def _map_value_input_field(
406
+ annotation: object,
407
+ *,
408
+ owner_name: str,
409
+ field_name: str,
410
+ is_identifier: bool,
411
+ ) -> _ValueInputField:
412
+ """Map a declared field and prepare its GraphQL-to-Python conversion."""
413
+ nullable, concrete = _unwrap_value_optional(
414
+ annotation, owner_name=owner_name, field_name=field_name
415
+ )
416
+ origin = get_origin(concrete)
417
+ field_path = f"{owner_name}.{field_name}"
418
+ convert: Callable[[object], object] | None = None
419
+
420
+ if origin is not None:
421
+ element = _collection_element_annotation(
422
+ concrete,
423
+ owner_name=owner_name,
424
+ field_name=field_name,
425
+ is_identifier=is_identifier,
426
+ )
427
+ item = _map_value_input_field(
428
+ element,
429
+ owner_name=owner_name,
430
+ field_name=field_name,
431
+ is_identifier=is_identifier,
432
+ )
433
+ item_type = item.type if item.nullable else graphene.NonNull(item.type)
434
+ input_type = graphene.List(item_type)
435
+
436
+ def convert_collection(value: object) -> object:
437
+ return origin(
438
+ item.normalize(element) for element in _sequence_argument(value)
439
+ )
440
+
441
+ convert = convert_collection
442
+ elif not is_identifier and safe_issubclass(concrete, (GraphQLType, GeneralManager)):
443
+ input_type = _mutation_input_type(concrete)
444
+ convert = partial(_normalize_mutation_value, concrete)
445
+ elif not is_identifier and safe_issubclass(concrete, Measurement):
446
+ input_type = GraphQL._map_field_to_graphene_base_type(concrete)
447
+ else:
448
+ input_type = _map_value_scalar_annotation(
449
+ concrete,
450
+ owner_name=owner_name,
451
+ field_name=field_name,
452
+ scalar_mapper=GraphQL._map_field_to_graphene_base_type,
453
+ is_identifier=is_identifier,
454
+ )
455
+ if is_identifier and (concrete is int or concrete is UUID):
456
+ convert = partial(_normalize_value_identifier, concrete, field_path)
457
+
458
+ def normalize(value: object) -> object:
459
+ if value is None and not nullable:
460
+ # Defaults let clients omit a field, while the Python field
461
+ # annotation still determines whether it accepts explicit null.
462
+ message = f"{field_path} cannot be null."
463
+ raise ValidationError(message)
464
+ if value is None:
465
+ return None
466
+ if convert is not None:
467
+ return convert(value)
468
+ return Decimal(str(value)) if concrete is Decimal else value
469
+
470
+ return _ValueInputField(input_type, nullable, normalize)
471
+
472
+
473
+ def _get_or_create_value_input_type(
474
+ declaration: type[GraphQLType],
475
+ ) -> type[graphene.InputObjectType]:
476
+ """Build an input object only when the schema references the declaration."""
477
+ cache = GraphQL._value_input_type_cache
478
+ cached = cache.get(declaration)
479
+ if cached is not None:
480
+ return cached
481
+
482
+ input_name = f"{declaration.__name__}Input"
483
+ if input_name == "ChecksumInput":
484
+ message = f"GraphQL input type '{input_name}' is reserved for file uploads."
485
+ raise ValueError(message)
486
+ declarations = {
487
+ value_type.__name__: value_type for value_type in get_registered_graphql_types()
488
+ }
489
+ declarations[declaration.__name__] = declaration
490
+ hints = resolve_output_type_hints(
491
+ declaration,
492
+ manager_registry=GraphQL.manager_registry,
493
+ output_class_registry=declarations,
494
+ )
495
+ input_fields: dict[str, graphene.InputField] = {}
496
+ conversions: dict[str, _ValueInputField] = {}
497
+ omitted_as_none: dict[str, object] = {}
498
+ for declared_field in fields(declaration):
499
+ if not declared_field.init:
500
+ continue
501
+ name = declared_field.name
502
+ mapped = _map_value_input_field(
503
+ hints[name],
504
+ owner_name=declaration.__name__,
505
+ field_name=name,
506
+ is_identifier=_value_field_is_identifier(
507
+ declaration.__name__, declared_field
508
+ ),
509
+ )
510
+ has_default = (
511
+ declared_field.default is not MISSING
512
+ or declared_field.default_factory is not MISSING
513
+ )
514
+ input_fields[name] = graphene.InputField(
515
+ mapped.type, required=not (mapped.nullable or has_default)
516
+ )
517
+ conversions[name] = mapped
518
+ if mapped.nullable and not has_default:
519
+ omitted_as_none[name] = None
520
+
521
+ if not input_fields:
522
+ message = f"{declaration.__name__} must declare an initializer field for GraphQL input."
523
+ raise TypeError(message)
524
+
525
+ def construct(values: dict[str, object]) -> GraphQLType:
526
+ kwargs = {
527
+ name: conversions[name].normalize(value) for name, value in values.items()
528
+ }
529
+ return declaration(**(omitted_as_none | kwargs))
530
+
531
+ def wrap_input(values: dict[str, object]) -> _GraphQLTypeInput:
532
+ # Delay constructors, manager lookups, and validation until the
533
+ # mutation's existing error and permission boundary is active.
534
+ return _GraphQLTypeInput(declaration, partial(construct, values))
535
+
536
+ generated = type(
537
+ input_name,
538
+ (graphene.InputObjectType,),
539
+ {"Meta": type("Meta", (), {"container": wrap_input})},
540
+ )
541
+ # Keep field names separate from Graphene's reserved class attributes.
542
+ generated._meta.fields.update(input_fields) # type: ignore[attr-defined]
543
+ cache[declaration] = generated
544
+ return generated
545
+
546
+
352
547
  def graph_ql_mutation(
353
548
  _func: FuncT | type[MutationPermission] | None = None,
354
549
  permission: type[MutationPermission] | None = None,
@@ -381,7 +576,12 @@ def graph_ql_mutation(
381
576
  ``None`` unchanged, constructs mapping inputs with ``manager_class(**value)``,
382
577
  and constructs non-mapping inputs with ``manager_class(value)``. For
383
578
  ``list[Manager]`` and ``List[Manager]`` arguments, each list item follows
384
- that same manager normalization before permission checks and resolver calls.
579
+ that same manager normalization. Concrete ``GraphQLType`` subclasses
580
+ generate ``<ClassName>Input`` objects, including when used as list elements
581
+ or nullable arguments. Their fields are recursively converted to native
582
+ Python values and passed to the dataclass constructor. Manager references
583
+ inside the input use the same normalization as direct manager arguments.
584
+ Conversion completes before permission checks and resolver calls.
385
585
  Other supported Python annotations are mapped through
386
586
  ``GraphQL._map_field_to_graphene_base_type``.
387
587
 
File without changes