GeneralManager 0.60.2__tar.gz → 0.60.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. {generalmanager-0.60.2/src/GeneralManager.egg-info → generalmanager-0.60.4}/PKG-INFO +1 -1
  2. {generalmanager-0.60.2 → generalmanager-0.60.4}/pyproject.toml +1 -1
  3. {generalmanager-0.60.2 → generalmanager-0.60.4/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/measurement/measurement.py +90 -12
  5. {generalmanager-0.60.2 → generalmanager-0.60.4}/LICENSE +0 -0
  6. {generalmanager-0.60.2 → generalmanager-0.60.4}/README.md +0 -0
  7. {generalmanager-0.60.2 → generalmanager-0.60.4}/setup.cfg +0 -0
  8. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  9. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  10. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/GeneralManager.egg-info/requires.txt +0 -0
  11. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/GeneralManager.egg-info/top_level.txt +0 -0
  12. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/__init__.py +0 -0
  13. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/__init__.py +0 -0
  14. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/api.py +0 -0
  15. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/bucket.py +0 -0
  16. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/cache.py +0 -0
  17. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/dataframes.py +0 -0
  18. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/factory.py +0 -0
  19. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/general_manager.py +0 -0
  20. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/interface.py +0 -0
  21. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/manager.py +0 -0
  22. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/measurement.py +0 -0
  23. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/permission.py +0 -0
  24. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/rule.py +0 -0
  25. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/search.py +0 -0
  26. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/_types/utils.py +0 -0
  27. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/__init__.py +0 -0
  28. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql.py +0 -0
  29. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_errors.py +0 -0
  30. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_mutations.py +0 -0
  31. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_prefetch.py +0 -0
  32. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_resolvers.py +0 -0
  33. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_search.py +0 -0
  34. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  35. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_subscriptions.py +0 -0
  36. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_view.py +0 -0
  37. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_warmup.py +0 -0
  38. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  39. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  40. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/mutation.py +0 -0
  41. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/property.py +0 -0
  42. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/registry.py +0 -0
  43. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/remote_api.py +0 -0
  44. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/remote_invalidation.py +0 -0
  45. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/api/remote_invalidation_client.py +0 -0
  46. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/apps.py +0 -0
  47. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bootstrap.py +0 -0
  48. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/__init__.py +0 -0
  49. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/base_bucket.py +0 -0
  50. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/calculation_bucket.py +0 -0
  51. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/database_bucket.py +0 -0
  52. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/group_bucket.py +0 -0
  53. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/indexing.py +0 -0
  54. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/bucket/request_bucket.py +0 -0
  55. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/__init__.py +0 -0
  56. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/cache_decorator.py +0 -0
  57. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/cache_tracker.py +0 -0
  58. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/dependency_cache.py +0 -0
  59. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/dependency_index.py +0 -0
  60. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/dependency_matching.py +0 -0
  61. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/dependency_publish.py +0 -0
  62. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/dependency_shards.py +0 -0
  63. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/model_dependency_collector.py +0 -0
  64. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/run_context.py +0 -0
  65. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/cache/signals.py +0 -0
  66. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/__init__.py +0 -0
  67. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/audit.py +0 -0
  68. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/bootstrap.py +0 -0
  69. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/checks.py +0 -0
  70. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/consumer.py +0 -0
  71. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/errors.py +0 -0
  72. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/__init__.py +0 -0
  73. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/__main__.py +0 -0
  74. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/baseline.py +0 -0
  75. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/diagnostics.py +0 -0
  76. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/fingerprints.py +0 -0
  77. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/fixtures.py +0 -0
  78. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  79. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  80. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/judges/contract.py +0 -0
  81. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  82. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  83. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/readiness.py +0 -0
  84. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/runner.py +0 -0
  85. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/evals/traces.py +0 -0
  86. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/grounding.py +0 -0
  87. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/models.py +0 -0
  88. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/__init__.py +0 -0
  89. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/_shared.py +0 -0
  90. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/anthropic.py +0 -0
  91. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/base.py +0 -0
  92. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/google.py +0 -0
  93. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/ollama.py +0 -0
  94. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/providers/openai.py +0 -0
  95. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/rate_limits.py +0 -0
  96. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/routing.py +0 -0
  97. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/schema_index.py +0 -0
  98. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/settings.py +0 -0
  99. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/signals.py +0 -0
  100. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/system_prompt.py +0 -0
  101. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/tool_metadata.py +0 -0
  102. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/tools.py +0 -0
  103. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/chat/views.py +0 -0
  104. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/conf.py +0 -0
  105. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/dataframes/__init__.py +0 -0
  106. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/dataframes/measurements.py +0 -0
  107. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/factory/__init__.py +0 -0
  108. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/factory/auto_factory.py +0 -0
  109. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/factory/factories.py +0 -0
  110. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/factory/factory_methods.py +0 -0
  111. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/__init__.py +0 -0
  112. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/base_interface.py +0 -0
  113. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/bundles/__init__.py +0 -0
  114. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/bundles/calculation.py +0 -0
  115. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/bundles/database.py +0 -0
  116. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  117. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/bundles/request.py +0 -0
  118. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/__init__.py +0 -0
  119. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/base.py +0 -0
  120. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/builtin.py +0 -0
  121. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  122. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  123. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  124. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/configuration.py +0 -0
  125. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  126. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  127. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  128. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  129. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  130. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  131. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/factory.py +0 -0
  132. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  133. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  134. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  135. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  136. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  137. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  138. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  139. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  140. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  141. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  142. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  143. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  144. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  145. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  146. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  147. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/registry.py +0 -0
  148. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  149. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  150. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  151. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  152. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  153. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/__init__.py +0 -0
  154. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/calculation.py +0 -0
  155. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/database.py +0 -0
  156. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  157. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/read_only.py +0 -0
  158. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  159. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/interfaces/request.py +0 -0
  160. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/manifests/__init__.py +0 -0
  161. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  162. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  163. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/manifests/capability_models.py +0 -0
  164. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/orm_interface.py +0 -0
  165. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/requests.py +0 -0
  166. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/utils/__init__.py +0 -0
  167. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  168. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/utils/errors.py +0 -0
  169. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/interface/utils/models.py +0 -0
  170. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/logging.py +0 -0
  171. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  172. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  173. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  174. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/search_index.py +0 -0
  175. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/search_reconcile.py +0 -0
  176. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  177. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/shell.py +0 -0
  178. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  179. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  180. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/manager/__init__.py +0 -0
  181. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/manager/general_manager.py +0 -0
  182. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/manager/group_manager.py +0 -0
  183. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/manager/input.py +0 -0
  184. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/manager/meta.py +0 -0
  185. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/measurement/__init__.py +0 -0
  186. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/measurement/measurement_field.py +0 -0
  187. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/metrics/__init__.py +0 -0
  188. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/metrics/graphql.py +0 -0
  189. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0001_initial.py +0 -0
  190. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  191. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  192. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  193. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  194. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  195. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  196. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/migrations/__init__.py +0 -0
  197. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/models.py +0 -0
  198. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/__init__.py +0 -0
  199. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/audit.py +0 -0
  200. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/base_permission.py +0 -0
  201. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/graphql_capabilities.py +0 -0
  202. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/manager_based_permission.py +0 -0
  203. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/mutation_permission.py +0 -0
  204. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/permission_checks.py +0 -0
  205. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/permission_data_manager.py +0 -0
  206. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/permission/utils.py +0 -0
  207. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/public_api_registry.py +0 -0
  208. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/py.typed +0 -0
  209. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/rule/__init__.py +0 -0
  210. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/rule/handler.py +0 -0
  211. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/rule/rule.py +0 -0
  212. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/__init__.py +0 -0
  213. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/async_tasks.py +0 -0
  214. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backend.py +0 -0
  215. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backend_registry.py +0 -0
  216. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backends/__init__.py +0 -0
  217. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backends/dev.py +0 -0
  218. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backends/meilisearch.py +0 -0
  219. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backends/opensearch.py +0 -0
  220. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/backends/typesense.py +0 -0
  221. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/config.py +0 -0
  222. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/indexer.py +0 -0
  223. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/models.py +0 -0
  224. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/reconciliation.py +0 -0
  225. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/registry.py +0 -0
  226. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/tasks.py +0 -0
  227. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/search/utils.py +0 -0
  228. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/seeding/__init__.py +0 -0
  229. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/seeding/manager_landscape.py +0 -0
  230. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/__init__.py +0 -0
  231. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/args_to_kwargs.py +0 -0
  232. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/filter_parser.py +0 -0
  233. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/format_string.py +0 -0
  234. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/json_encoder.py +0 -0
  235. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/make_cache_key.py +0 -0
  236. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/none_to_zero.py +0 -0
  237. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/path_mapping.py +0 -0
  238. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/public_api.py +0 -0
  239. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/testing.py +0 -0
  240. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/utils/type_checks.py +0 -0
  241. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/__init__.py +0 -0
  242. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/actions.py +0 -0
  243. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/backend_registry.py +0 -0
  244. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/backends/__init__.py +0 -0
  245. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/backends/celery.py +0 -0
  246. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/backends/local.py +0 -0
  247. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/backends/n8n.py +0 -0
  248. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/config.py +0 -0
  249. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/engine.py +0 -0
  250. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/event_registry.py +0 -0
  251. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/events.py +0 -0
  252. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/models.py +0 -0
  253. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/signal_bridge.py +0 -0
  254. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/tasks.py +0 -0
  255. {generalmanager-0.60.2 → generalmanager-0.60.4}/src/general_manager/workflow/telemetry.py +0 -0
  256. {generalmanager-0.60.2 → generalmanager-0.60.4}/tests/test_settings.py +0 -0
  257. {generalmanager-0.60.2 → generalmanager-0.60.4}/tests/test_urls.py +0 -0
  258. {generalmanager-0.60.2 → generalmanager-0.60.4}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.60.2
3
+ Version: 0.60.4
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "GeneralManager"
7
- version = "0.60.2"
7
+ version = "0.60.4"
8
8
  description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.60.2
3
+ Version: 0.60.4
4
4
  Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
5
5
  Author-email: Tim Kleindick <tkleindick@yahoo.de>
6
6
  License: MIT License
@@ -91,6 +91,7 @@ def _unit_uses_offset_for_unit_string(unit: str) -> bool:
91
91
  return False
92
92
 
93
93
 
94
+ @lru_cache(maxsize=512)
94
95
  def _pint_unit_components(unit: str) -> tuple[tuple[str, object], ...]:
95
96
  """Return Pint unit component names and powers for one unit expression."""
96
97
 
@@ -98,6 +99,13 @@ def _pint_unit_components(unit: str) -> tuple[tuple[str, object], ...]:
98
99
  return tuple(parsed_unit._units.items())
99
100
 
100
101
 
102
+ @lru_cache(maxsize=512)
103
+ def _unit_dimensionality(unit: str) -> object:
104
+ """Return Pint dimensionality metadata for one unit expression."""
105
+
106
+ return _parse_unit(unit).dimensionality
107
+
108
+
101
109
  def _pint_unit_component_uses_offset(unit_name: str) -> bool:
102
110
  """Return whether a Pint unit component has offset conversion semantics."""
103
111
 
@@ -187,12 +195,12 @@ def _convert_quantity(
187
195
  return source_quantity.to(target_unit)
188
196
 
189
197
 
198
+ @lru_cache(maxsize=512)
190
199
  def _currency_component(unit: str) -> tuple[str, int] | None:
191
200
  """Return the single configured currency component in a unit expression."""
192
201
 
193
- parsed_unit = ureg.parse_units(str(unit))
194
202
  currency_components: list[tuple[str, int]] = []
195
- for unit_name, power in parsed_unit._units.items():
203
+ for unit_name, power in _pint_unit_components(unit):
196
204
  currency_power = _integer_unit_power(power)
197
205
  if currency_power is not None and unit_name in currency_units:
198
206
  currency_components.append((unit_name, currency_power))
@@ -213,13 +221,69 @@ def _integer_unit_power(power: object) -> int | None:
213
221
  return None
214
222
 
215
223
 
224
+ @lru_cache(maxsize=512)
216
225
  def _unit_without_currency(unit: str, currency: str, power: int) -> str:
217
226
  """Return a unit expression with one currency component removed."""
218
227
 
219
- stripped_unit = ureg.parse_units(str(unit)) / (ureg.parse_units(currency) ** power)
228
+ stripped_unit = _parse_unit(unit) / (_parse_unit(currency) ** power)
220
229
  return str(stripped_unit)
221
230
 
222
231
 
232
+ def _is_implicit_cross_currency_conversion(
233
+ source_unit: str,
234
+ target_unit: str,
235
+ ) -> bool:
236
+ """Return whether a conversion would require an explicit exchange rate."""
237
+
238
+ source_currency = _currency_component(source_unit)
239
+ target_currency = _currency_component(target_unit)
240
+ return (
241
+ source_currency is not None
242
+ and target_currency is not None
243
+ and source_currency[0] != target_currency[0]
244
+ )
245
+
246
+
247
+ @lru_cache(maxsize=1024)
248
+ def _multiplicative_conversion_factor(
249
+ source_unit: str,
250
+ target_unit: str,
251
+ ) -> Decimal | None:
252
+ """Return a cached Decimal factor for safe multiplicative conversions."""
253
+
254
+ try:
255
+ if (
256
+ _unit_uses_offset_for_unit_string(source_unit)
257
+ or _unit_uses_offset_for_unit_string(target_unit)
258
+ or _is_implicit_cross_currency_conversion(source_unit, target_unit)
259
+ ):
260
+ return None
261
+ converted_quantity = ureg.Quantity(
262
+ Decimal("1"),
263
+ _parse_unit(source_unit),
264
+ ).to(_parse_unit(target_unit))
265
+ except pint.errors.PintError:
266
+ return None
267
+ return _decimal_from_magnitude(converted_quantity.magnitude)
268
+
269
+
270
+ def _cached_multiplicative_conversion_factor(
271
+ source_unit: str,
272
+ target_unit: str,
273
+ ) -> Decimal | None:
274
+ """Return a cached factor keyed by canonical source and target units."""
275
+
276
+ try:
277
+ source_canonical_unit = _canonical_unit_string(source_unit)
278
+ target_canonical_unit = _canonical_unit_string(target_unit)
279
+ except pint.errors.PintError:
280
+ return None
281
+ return _multiplicative_conversion_factor(
282
+ source_canonical_unit,
283
+ target_canonical_unit,
284
+ )
285
+
286
+
223
287
  def convert_magnitude(value: Decimal, source_unit: str, target_unit: str) -> Decimal:
224
288
  """
225
289
  Convert a magnitude between units while keeping offset-unit math away from Decimal.
@@ -230,6 +294,13 @@ def convert_magnitude(value: Decimal, source_unit: str, target_unit: str) -> Dec
230
294
  round-trip back to ``Decimal`` via ``str``.
231
295
  """
232
296
 
297
+ conversion_factor = _cached_multiplicative_conversion_factor(
298
+ source_unit,
299
+ target_unit,
300
+ )
301
+ if conversion_factor is not None:
302
+ return _decimal_from_magnitude(value * conversion_factor)
303
+
233
304
  converted_quantity = _convert_quantity(
234
305
  _build_quantity(value, source_unit), target_unit
235
306
  )
@@ -702,6 +773,10 @@ class Measurement:
702
773
  each unit expression contains exactly one configured currency component;
703
774
  expressions with zero, multiple, inverse, or mismatched-power currency
704
775
  components fall back to Pint conversion and may raise Pint errors.
776
+ When ``target_unit`` matches the current canonical unit exactly, or
777
+ ``_canonical_unit_string(target_unit)`` canonicalizes to the current
778
+ unit, ``to()`` returns this ``Measurement`` object unchanged instead of
779
+ allocating a converted copy.
705
780
  Components with explicit power one, such as ``EUR ** 1``, are treated as
706
781
  the same currency component; expressions such as ``EUR / EUR`` simplify
707
782
  before this check and therefore are not currency conversions.
@@ -728,6 +803,12 @@ class Measurement:
728
803
  pint.errors.PintError: If `target_unit` is invalid or incompatible
729
804
  with the source unit.
730
805
  """
806
+ if self.unit == target_unit:
807
+ return self
808
+ target_canonical_unit = _canonical_unit_string(target_unit)
809
+ if self.unit == target_canonical_unit:
810
+ return self
811
+
731
812
  source_currency = _currency_component(self.unit)
732
813
  target_currency = _currency_component(target_unit)
733
814
  if (
@@ -753,14 +834,11 @@ class Measurement:
753
834
  return Measurement(value, target_unit)
754
835
 
755
836
  if self.is_currency():
756
- if str(self.unit) == str(target_unit):
757
- return self # Same currency, no conversion needed
758
- elif exchange_rate is not None:
837
+ if exchange_rate is not None:
759
838
  # Convert using the provided exchange rate
760
839
  value = self.magnitude * Decimal(str(exchange_rate))
761
840
  return Measurement(value, target_unit)
762
- else:
763
- raise MissingExchangeRateError()
841
+ raise MissingExchangeRateError()
764
842
  else:
765
843
  # Standard conversion for physical units
766
844
  value = convert_magnitude(self.magnitude, self.unit, target_unit)
@@ -823,10 +901,10 @@ class Measurement:
823
901
  )
824
902
  elif not self.is_currency() and not other.is_currency():
825
903
  # Both are physical units
904
+ if _unit_dimensionality(left_unit) != _unit_dimensionality(right_unit):
905
+ raise IncompatibleUnitsError("addition")
826
906
  left_quantity = self.__current_quantity()
827
907
  right_quantity = other.__current_quantity()
828
- if left_quantity.dimensionality != right_quantity.dimensionality:
829
- raise IncompatibleUnitsError("addition")
830
908
  left_quantity, right_quantity = _prepare_quantities_for_binary_operation(
831
909
  left_quantity,
832
910
  right_quantity,
@@ -876,10 +954,10 @@ class Measurement:
876
954
  return Measurement(Decimal(str(result_quantity.magnitude)), str(self.unit))
877
955
  elif not self.is_currency() and not other.is_currency():
878
956
  # Both are physical units
957
+ if _unit_dimensionality(left_unit) != _unit_dimensionality(right_unit):
958
+ raise IncompatibleUnitsError("subtraction")
879
959
  left_quantity = self.__current_quantity()
880
960
  right_quantity = other.__current_quantity()
881
- if left_quantity.dimensionality != right_quantity.dimensionality:
882
- raise IncompatibleUnitsError("subtraction")
883
961
  left_quantity, right_quantity = _prepare_quantities_for_binary_operation(
884
962
  left_quantity,
885
963
  right_quantity,
File without changes