GeneralManager 0.80.4__tar.gz → 0.80.5__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 (334) hide show
  1. {generalmanager-0.80.4/src/GeneralManager.egg-info → generalmanager-0.80.5}/PKG-INFO +1 -1
  2. {generalmanager-0.80.4 → generalmanager-0.80.5}/pyproject.toml +1 -1
  3. {generalmanager-0.80.4 → generalmanager-0.80.5/src/GeneralManager.egg-info}/PKG-INFO +1 -1
  4. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/manager/meta.py +27 -4
  5. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/measurement/measurement.py +50 -7
  6. {generalmanager-0.80.4 → generalmanager-0.80.5}/LICENSE +0 -0
  7. {generalmanager-0.80.4 → generalmanager-0.80.5}/README.md +0 -0
  8. {generalmanager-0.80.4 → generalmanager-0.80.5}/setup.cfg +0 -0
  9. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  10. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  11. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/GeneralManager.egg-info/requires.txt +0 -0
  12. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/GeneralManager.egg-info/top_level.txt +0 -0
  13. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/__init__.py +0 -0
  14. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/__init__.py +0 -0
  15. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/api.py +0 -0
  16. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/bucket.py +0 -0
  17. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/cache.py +0 -0
  18. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/dataframes.py +0 -0
  19. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/factory.py +0 -0
  20. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/general_manager.py +0 -0
  21. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/interface.py +0 -0
  22. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/manager.py +0 -0
  23. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/measurement.py +0 -0
  24. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/permission.py +0 -0
  25. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/rule.py +0 -0
  26. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/search.py +0 -0
  27. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/_types/utils.py +0 -0
  28. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/__init__.py +0 -0
  29. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql.py +0 -0
  30. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_as_of.py +0 -0
  31. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_errors.py +0 -0
  32. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_groups.py +0 -0
  33. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_mutations.py +0 -0
  34. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_ordering.py +0 -0
  35. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_output.py +0 -0
  36. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_prefetch.py +0 -0
  37. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_relations.py +0 -0
  38. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_resolvers.py +0 -0
  39. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_search.py +0 -0
  40. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  41. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_subscriptions.py +0 -0
  42. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_type.py +0 -0
  43. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_view.py +0 -0
  44. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_warmup.py +0 -0
  45. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  46. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  47. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/mutation.py +0 -0
  48. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/notification_batching.py +0 -0
  49. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/property.py +0 -0
  50. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/registry.py +0 -0
  51. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/remote_api.py +0 -0
  52. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/remote_invalidation.py +0 -0
  53. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/api/remote_invalidation_client.py +0 -0
  54. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/apps.py +0 -0
  55. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/as_of.py +0 -0
  56. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bootstrap.py +0 -0
  57. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/__init__.py +0 -0
  58. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/_materialized_bucket.py +0 -0
  59. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/_ordering.py +0 -0
  60. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/base_bucket.py +0 -0
  61. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/calculation_bucket.py +0 -0
  62. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/database_bucket.py +0 -0
  63. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/excel_bucket.py +0 -0
  64. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/group_bucket.py +0 -0
  65. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/indexing.py +0 -0
  66. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/projection.py +0 -0
  67. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/bucket/request_bucket.py +0 -0
  68. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/__init__.py +0 -0
  69. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/_dependency_graph.py +0 -0
  70. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/cache_decorator.py +0 -0
  71. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/cache_tracker.py +0 -0
  72. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/data_change_context.py +0 -0
  73. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/dependency_cache.py +0 -0
  74. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/dependency_index.py +0 -0
  75. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/dependency_matching.py +0 -0
  76. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/dependency_publish.py +0 -0
  77. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/dependency_shards.py +0 -0
  78. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/model_dependency_collector.py +0 -0
  79. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/run_context.py +0 -0
  80. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/run_context_lru.py +0 -0
  81. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/cache/signals.py +0 -0
  82. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/__init__.py +0 -0
  83. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/audit.py +0 -0
  84. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/bootstrap.py +0 -0
  85. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/checks.py +0 -0
  86. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/consumer.py +0 -0
  87. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/context.py +0 -0
  88. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/errors.py +0 -0
  89. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/__init__.py +0 -0
  90. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/__main__.py +0 -0
  91. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/baseline.py +0 -0
  92. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  93. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  94. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  95. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  96. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  97. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  98. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  99. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/diagnostics.py +0 -0
  100. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/fingerprints.py +0 -0
  101. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/fixtures.py +0 -0
  102. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  103. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  104. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/judges/contract.py +0 -0
  105. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  106. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  107. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/readiness.py +0 -0
  108. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/runner.py +0 -0
  109. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/evals/traces.py +0 -0
  110. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/grounding.py +0 -0
  111. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/models.py +0 -0
  112. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/__init__.py +0 -0
  113. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/budget.py +0 -0
  114. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/calculations.py +0 -0
  115. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/catalog.py +0 -0
  116. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/config.py +0 -0
  117. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/events.py +0 -0
  118. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/evidence.py +0 -0
  119. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/models.py +0 -0
  120. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/planner.py +0 -0
  121. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/provider_calls.py +0 -0
  122. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/resolver.py +0 -0
  123. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/routing.py +0 -0
  124. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/scheduler.py +0 -0
  125. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/synthesis.py +0 -0
  126. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/planned/validation.py +0 -0
  127. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/__init__.py +0 -0
  128. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/_shared.py +0 -0
  129. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/anthropic.py +0 -0
  130. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/base.py +0 -0
  131. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/google.py +0 -0
  132. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/ollama.py +0 -0
  133. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/providers/openai.py +0 -0
  134. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/rate_limits.py +0 -0
  135. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/routing.py +0 -0
  136. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/schema_index.py +0 -0
  137. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/settings.py +0 -0
  138. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/signals.py +0 -0
  139. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/system_prompt.py +0 -0
  140. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/tool_metadata.py +0 -0
  141. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/tools.py +0 -0
  142. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/turns.py +0 -0
  143. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/chat/views.py +0 -0
  144. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/conf.py +0 -0
  145. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/dataframes/__init__.py +0 -0
  146. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/dataframes/measurements.py +0 -0
  147. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/factory/__init__.py +0 -0
  148. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/factory/auto_factory.py +0 -0
  149. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/factory/factories.py +0 -0
  150. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/factory/factory_methods.py +0 -0
  151. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/__init__.py +0 -0
  152. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/base_interface.py +0 -0
  153. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/bundles/__init__.py +0 -0
  154. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/bundles/calculation.py +0 -0
  155. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/bundles/database.py +0 -0
  156. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/bundles/excel.py +0 -0
  157. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  158. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/bundles/request.py +0 -0
  159. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/__init__.py +0 -0
  160. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/base.py +0 -0
  161. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/builtin.py +0 -0
  162. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  163. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  164. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  165. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  166. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/configuration.py +0 -0
  167. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  168. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  169. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
  170. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  171. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  172. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  173. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  174. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/factory.py +0 -0
  175. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  176. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  177. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  178. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  179. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  180. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  181. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  182. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  183. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  184. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  185. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
  186. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  187. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  188. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  189. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  190. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  191. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/registry.py +0 -0
  192. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  193. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  194. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/excel.py +0 -0
  195. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/excel_store.py +0 -0
  196. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/excel_workbook.py +0 -0
  197. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  198. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  199. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  200. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/__init__.py +0 -0
  201. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/calculation.py +0 -0
  202. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/database.py +0 -0
  203. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/excel.py +0 -0
  204. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  205. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/read_only.py +0 -0
  206. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  207. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/interfaces/request.py +0 -0
  208. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/manifests/__init__.py +0 -0
  209. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  210. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  211. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/manifests/capability_models.py +0 -0
  212. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/orm_interface.py +0 -0
  213. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/requests.py +0 -0
  214. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/utils/__init__.py +0 -0
  215. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  216. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/utils/errors.py +0 -0
  217. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/utils/history.py +0 -0
  218. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/interface/utils/models.py +0 -0
  219. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/logging.py +0 -0
  220. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  221. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  222. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  223. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  224. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/search_index.py +0 -0
  225. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/search_reconcile.py +0 -0
  226. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  227. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/shell.py +0 -0
  228. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  229. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  230. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/manager/__init__.py +0 -0
  231. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/manager/general_manager.py +0 -0
  232. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/manager/group_manager.py +0 -0
  233. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/manager/input.py +0 -0
  234. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/measurement/__init__.py +0 -0
  235. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/measurement/measurement_field.py +0 -0
  236. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/metrics/__init__.py +0 -0
  237. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/metrics/graphql.py +0 -0
  238. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0001_initial.py +0 -0
  239. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  240. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  241. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  242. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  243. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  244. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  245. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  246. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  247. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  248. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  249. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  250. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
  251. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/migrations/__init__.py +0 -0
  252. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/models.py +0 -0
  253. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/__init__.py +0 -0
  254. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/audit.py +0 -0
  255. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/base_permission.py +0 -0
  256. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/graphql_capabilities.py +0 -0
  257. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/manager_based_permission.py +0 -0
  258. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/mutation_permission.py +0 -0
  259. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/permission_checks.py +0 -0
  260. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/permission_data_manager.py +0 -0
  261. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/permission/utils.py +0 -0
  262. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/public_api_registry.py +0 -0
  263. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/py.typed +0 -0
  264. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/rule/__init__.py +0 -0
  265. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/rule/handler.py +0 -0
  266. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/rule/rule.py +0 -0
  267. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/__init__.py +0 -0
  268. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/async_tasks.py +0 -0
  269. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backend.py +0 -0
  270. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backend_registry.py +0 -0
  271. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backends/__init__.py +0 -0
  272. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backends/dev.py +0 -0
  273. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backends/meilisearch.py +0 -0
  274. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backends/opensearch.py +0 -0
  275. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/backends/typesense.py +0 -0
  276. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/checks.py +0 -0
  277. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/config.py +0 -0
  278. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/indexer.py +0 -0
  279. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/invalidation.py +0 -0
  280. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/m2m_invalidation.py +0 -0
  281. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/models.py +0 -0
  282. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/reconciliation.py +0 -0
  283. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/registry.py +0 -0
  284. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/tasks.py +0 -0
  285. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/search/utils.py +0 -0
  286. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/seeding/__init__.py +0 -0
  287. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/seeding/manager_landscape.py +0 -0
  288. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/__init__.py +0 -0
  289. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/adapters.py +0 -0
  290. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/checks.py +0 -0
  291. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/config.py +0 -0
  292. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/errors.py +0 -0
  293. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/finalization.py +0 -0
  294. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/graphql.py +0 -0
  295. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/graphql_types.py +0 -0
  296. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/metrics.py +0 -0
  297. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/models.py +0 -0
  298. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/public.py +0 -0
  299. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/s3.py +0 -0
  300. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/services.py +0 -0
  301. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/tokens.py +0 -0
  302. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/types.py +0 -0
  303. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/urls.py +0 -0
  304. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/uploads/views.py +0 -0
  305. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/__init__.py +0 -0
  306. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/_args_to_kwargs.py +0 -0
  307. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/_cache_key_encoder.py +0 -0
  308. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/_make_cache_key.py +0 -0
  309. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/_none_to_zero.py +0 -0
  310. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/filter_parser.py +0 -0
  311. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/format_string.py +0 -0
  312. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/json_encoder.py +0 -0
  313. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/path_mapping.py +0 -0
  314. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/public_api.py +0 -0
  315. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/testing.py +0 -0
  316. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/utils/type_checks.py +0 -0
  317. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/__init__.py +0 -0
  318. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/actions.py +0 -0
  319. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/backend_registry.py +0 -0
  320. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/backends/__init__.py +0 -0
  321. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/backends/celery.py +0 -0
  322. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/backends/local.py +0 -0
  323. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/backends/n8n.py +0 -0
  324. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/config.py +0 -0
  325. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/engine.py +0 -0
  326. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/event_registry.py +0 -0
  327. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/events.py +0 -0
  328. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/models.py +0 -0
  329. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/signal_bridge.py +0 -0
  330. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/tasks.py +0 -0
  331. {generalmanager-0.80.4 → generalmanager-0.80.5}/src/general_manager/workflow/telemetry.py +0 -0
  332. {generalmanager-0.80.4 → generalmanager-0.80.5}/tests/test_settings.py +0 -0
  333. {generalmanager-0.80.4 → generalmanager-0.80.5}/tests/test_urls.py +0 -0
  334. {generalmanager-0.80.4 → generalmanager-0.80.5}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.80.4
3
+ Version: 0.80.5
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.80.4"
7
+ version = "0.80.5"
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.80.4
3
+ Version: 0.80.5
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
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from collections.abc import Callable, Iterator
5
+ from collections.abc import Callable, Iterator, Mapping
6
6
  from functools import wraps
7
7
  import threading
8
8
  from _thread import RLock as RLockType
@@ -781,6 +781,17 @@ class GeneralManagerMeta(type):
781
781
  ) -> None:
782
782
  self._attr_name = descriptor_attr_name
783
783
  self._class = descriptor_class
784
+ # Keep a live view: validation can be reset after installation.
785
+ # Custom metaclasses retain their observable dictionary lookups.
786
+ self._standard_class_dict: Mapping[str, object] | None = (
787
+ vars(descriptor_class)
788
+ if (
789
+ type(descriptor_class) is GeneralManagerMeta
790
+ and _STANDARD_MANAGER_META_DICT.get("__getattribute__")
791
+ is _STANDARD_MANAGER_META_GETATTRIBUTE
792
+ )
793
+ else None
794
+ )
784
795
  # Excel values can change outside this manager instance.
785
796
  self._cache_values = (
786
797
  getattr(descriptor_class.Interface, "_interface_type", None)
@@ -826,9 +837,17 @@ class GeneralManagerMeta(type):
826
837
  """
827
838
  if instance is None:
828
839
  return self._class.Interface.get_field_type(self._attr_name)
829
- GeneralManagerMeta.ensure_rule_templates_validated_after_readiness(
830
- self._class
831
- )
840
+ class_dict = self._standard_class_dict
841
+ if (
842
+ class_dict is None
843
+ or type(self._class) is not GeneralManagerMeta
844
+ or _STANDARD_MANAGER_META_DICT.get("__getattribute__")
845
+ is not _STANDARD_MANAGER_META_GETATTRIBUTE
846
+ or class_dict.get("_gm_rule_templates_validated") is not True
847
+ ):
848
+ GeneralManagerMeta.ensure_rule_templates_validated_after_readiness(
849
+ self._class
850
+ )
832
851
  try:
833
852
  ensure_as_of_compatible = object.__getattribute__(
834
853
  instance, "_ensure_as_of_compatible"
@@ -940,6 +959,10 @@ class GeneralManagerMeta(type):
940
959
  type.__setattr__(new_class, "_gm_attributes_initialized", True)
941
960
 
942
961
 
962
+ # In-place metaclass customization must retain observable dictionary lookups.
963
+ _STANDARD_MANAGER_META_GETATTRIBUTE = GeneralManagerMeta.__getattribute__
964
+ _STANDARD_MANAGER_META_DICT = vars(GeneralManagerMeta)
965
+
943
966
  _CAPABILITY_BUILDER: "ManifestCapabilityBuilder | None" = None
944
967
 
945
968
 
@@ -6,7 +6,7 @@ from collections.abc import Callable
6
6
  from functools import lru_cache
7
7
  from typing import TypeAlias, TypeGuard, cast
8
8
  import pint
9
- from decimal import Decimal, InvalidOperation, ROUND_HALF_EVEN, localcontext
9
+ from decimal import Decimal, InvalidOperation, ROUND_HALF_EVEN, getcontext, localcontext
10
10
  from operator import lt, le, gt, ge
11
11
  from pint.facets.plain import PlainQuantity
12
12
  from pint.util import UnitsContainer
@@ -58,6 +58,15 @@ def _canonical_unit_string(unit: str) -> str:
58
58
  return str(parsed_unit)
59
59
 
60
60
 
61
+ @lru_cache(maxsize=512)
62
+ def _default_quantity_unit(unit: str) -> pint.Unit:
63
+ """Cache the legacy unit round trip for the default Pint formatter only."""
64
+
65
+ # Pint's display can round fractional exponents. Retain that round trip
66
+ # without relying on a public label cached under a previous formatter.
67
+ return _parse_unit(str(_parse_unit(unit)))
68
+
69
+
61
70
  def _format_decimal(value: Decimal) -> Decimal:
62
71
  """
63
72
  Normalise decimals so integers have no fractional component.
@@ -82,6 +91,13 @@ def _format_decimal(value: Decimal) -> Decimal:
82
91
  def _decimal_precision(*values: Decimal, extra_digits: int = 0) -> int:
83
92
  """Return enough local precision to retain all supplied Decimal coefficients."""
84
93
 
94
+ if len(values) == 1:
95
+ value = values[0]
96
+ if not value.is_finite():
97
+ return max(28, extra_digits)
98
+ # For one coefficient, adjusted - exponent + 1 is its digit count.
99
+ return max(28, len(value.as_tuple().digits)) + extra_digits
100
+
85
101
  finite_values = [value for value in values if value.is_finite()]
86
102
  coefficient_digits = sum(len(value.as_tuple().digits) for value in finite_values)
87
103
  if not finite_values:
@@ -734,7 +750,7 @@ class Measurement:
734
750
  version and are not a stable GeneralManager API contract.
735
751
  """
736
752
 
737
- __quantity: MeasurementQuantity | None
753
+ __quantity: MeasurementQuantity | pint.Unit | None
738
754
  __magnitude: Decimal
739
755
  __unit: str
740
756
  __quantity_exposed: bool
@@ -744,8 +760,9 @@ class Measurement:
744
760
  Create a Measurement from a numeric value and a unit label.
745
761
 
746
762
  Converts the provided numeric-like value to a Decimal through
747
- ``Decimal(str(value))`` and constructs the internal quantity using the
748
- given Pint unit expression. ``unit`` may be ``"dimensionless"`` or an
763
+ ``Decimal(str(value))`` and validates the given Pint unit expression.
764
+ Ordinary values defer the internal Pint quantity until it is needed.
765
+ ``unit`` may be ``"dimensionless"`` or an
749
766
  empty string for dimensionless measurements. Discrete item quantities
750
767
  should use ``"count"``, which belongs to its own unit family rather than
751
768
  Pint's plain dimensionless family. Invalid units are reported by Pint and
@@ -784,6 +801,29 @@ class Measurement:
784
801
  value = Decimal(str(value))
785
802
  except (InvalidOperation, TypeError, ValueError) as error:
786
803
  raise InvalidMeasurementInitializationError() from error
804
+ self.__set_value(value, unit)
805
+
806
+ def __set_value(self, value: Decimal, unit: str) -> None:
807
+ """Validate scalar parts eagerly and defer ordinary Pint allocations."""
808
+
809
+ # Normalization is idempotent for normal values and zeros without clamp.
810
+ # Subnormals can change again as their coefficient (and local precision)
811
+ # shrinks; preserve the original Pint/Decimal pipeline for those cases.
812
+ if (
813
+ not getcontext().clamp
814
+ and (value.is_normal() or value.is_zero())
815
+ and not ureg.formatter.default_format
816
+ ):
817
+ magnitude = _decimal_from_magnitude(value)
818
+ canonical_unit = _canonical_unit_string(unit)
819
+ # Keep immutable internal units separate from the public label,
820
+ # which may have been cached under a different Pint formatter.
821
+ self.__quantity = _default_quantity_unit(unit)
822
+ self.__magnitude = magnitude
823
+ self.__unit = canonical_unit
824
+ self.__quantity_exposed = False
825
+ return
826
+ # Custom formatters must retain the eager unit reparse and its errors.
787
827
  self.__set_quantity(_build_quantity(value, unit), _canonical_unit_string(unit))
788
828
 
789
829
  @classmethod
@@ -828,10 +868,13 @@ class Measurement:
828
868
 
829
869
  def __current_quantity(self) -> MeasurementQuantity:
830
870
  quantity = self.__quantity
831
- if quantity is None:
871
+ if not isinstance(quantity, PlainQuantity):
832
872
  quantity = cast(
833
873
  MeasurementQuantity,
834
- ureg.Quantity(self.__magnitude, _parse_unit(self.__unit)),
874
+ ureg.Quantity(
875
+ self.__magnitude,
876
+ quantity if quantity is not None else _parse_unit(self.__unit),
877
+ ),
835
878
  )
836
879
  self.__quantity = quantity
837
880
  return quantity
@@ -867,7 +910,7 @@ class Measurement:
867
910
  """
868
911
  value = Decimal(state["magnitude"])
869
912
  unit = state["unit"]
870
- self.__set_quantity(_build_quantity(value, unit), _canonical_unit_string(unit))
913
+ self.__set_value(value, unit)
871
914
 
872
915
  def deconstruct(self) -> tuple[str, list[object], dict[str, object]]:
873
916
  """Describe this value for Django migration serialization.
File without changes