GeneralManager 0.77.0__tar.gz → 0.78.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 (324) hide show
  1. {generalmanager-0.77.0/src/GeneralManager.egg-info → generalmanager-0.78.0}/PKG-INFO +3 -1
  2. {generalmanager-0.77.0 → generalmanager-0.78.0}/pyproject.toml +3 -1
  3. {generalmanager-0.77.0 → generalmanager-0.78.0/src/GeneralManager.egg-info}/PKG-INFO +3 -1
  4. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/GeneralManager.egg-info/SOURCES.txt +7 -0
  5. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/GeneralManager.egg-info/requires.txt +2 -0
  6. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/general_manager.py +10 -0
  7. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/interface.py +10 -0
  8. generalmanager-0.78.0/src/general_manager/bucket/excel_bucket.py +339 -0
  9. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/dependency_index.py +297 -27
  10. generalmanager-0.78.0/src/general_manager/interface/bundles/excel.py +33 -0
  11. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/base.py +2 -0
  12. generalmanager-0.78.0/src/general_manager/interface/capabilities/excel/__init__.py +679 -0
  13. generalmanager-0.78.0/src/general_manager/interface/excel.py +346 -0
  14. generalmanager-0.78.0/src/general_manager/interface/excel_store.py +148 -0
  15. generalmanager-0.78.0/src/general_manager/interface/excel_workbook.py +354 -0
  16. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/__init__.py +10 -0
  17. generalmanager-0.78.0/src/general_manager/interface/interfaces/excel.py +98 -0
  18. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/manifests/capability_manifest.py +8 -0
  19. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/manager/meta.py +23 -7
  20. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/public_api_registry.py +13 -0
  21. {generalmanager-0.77.0 → generalmanager-0.78.0}/LICENSE +0 -0
  22. {generalmanager-0.77.0 → generalmanager-0.78.0}/README.md +0 -0
  23. {generalmanager-0.77.0 → generalmanager-0.78.0}/setup.cfg +0 -0
  24. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  25. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
  26. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/__init__.py +0 -0
  27. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/__init__.py +0 -0
  28. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/api.py +0 -0
  29. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/bucket.py +0 -0
  30. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/cache.py +0 -0
  31. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/dataframes.py +0 -0
  32. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/factory.py +0 -0
  33. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/manager.py +0 -0
  34. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/measurement.py +0 -0
  35. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/permission.py +0 -0
  36. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/rule.py +0 -0
  37. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/search.py +0 -0
  38. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/_types/utils.py +0 -0
  39. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/__init__.py +0 -0
  40. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql.py +0 -0
  41. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_as_of.py +0 -0
  42. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_errors.py +0 -0
  43. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_mutations.py +0 -0
  44. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_output.py +0 -0
  45. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_prefetch.py +0 -0
  46. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_relations.py +0 -0
  47. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_resolvers.py +0 -0
  48. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_search.py +0 -0
  49. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  50. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
  51. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_type.py +0 -0
  52. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_view.py +0 -0
  53. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_warmup.py +0 -0
  54. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  55. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  56. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/mutation.py +0 -0
  57. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/notification_batching.py +0 -0
  58. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/property.py +0 -0
  59. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/registry.py +0 -0
  60. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/remote_api.py +0 -0
  61. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/remote_invalidation.py +0 -0
  62. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
  63. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/apps.py +1 -1
  64. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/as_of.py +0 -0
  65. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bootstrap.py +0 -0
  66. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/__init__.py +0 -0
  67. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/base_bucket.py +0 -0
  68. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
  69. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/database_bucket.py +0 -0
  70. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/group_bucket.py +0 -0
  71. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/indexing.py +0 -0
  72. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/projection.py +0 -0
  73. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/bucket/request_bucket.py +0 -0
  74. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/__init__.py +0 -0
  75. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/cache_decorator.py +0 -0
  76. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/cache_tracker.py +0 -0
  77. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/data_change_context.py +0 -0
  78. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/dependency_cache.py +0 -0
  79. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/dependency_matching.py +0 -0
  80. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/dependency_publish.py +0 -0
  81. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/dependency_shards.py +0 -0
  82. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
  83. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/run_context.py +0 -0
  84. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/run_context_lru.py +0 -0
  85. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/cache/signals.py +0 -0
  86. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/__init__.py +0 -0
  87. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/audit.py +0 -0
  88. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/bootstrap.py +0 -0
  89. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/checks.py +0 -0
  90. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/consumer.py +0 -0
  91. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/errors.py +0 -0
  92. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/__init__.py +0 -0
  93. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/__main__.py +0 -0
  94. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/baseline.py +0 -0
  95. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  96. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  97. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  98. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  99. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  100. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  101. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
  102. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
  103. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
  104. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/fixtures.py +0 -0
  105. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  106. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  107. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
  108. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  109. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  110. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/readiness.py +0 -0
  111. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/runner.py +0 -0
  112. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/evals/traces.py +0 -0
  113. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/grounding.py +0 -0
  114. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/models.py +0 -0
  115. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/__init__.py +0 -0
  116. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/budget.py +0 -0
  117. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/calculations.py +0 -0
  118. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/catalog.py +0 -0
  119. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/config.py +0 -0
  120. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/events.py +0 -0
  121. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/evidence.py +0 -0
  122. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/models.py +0 -0
  123. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/planner.py +0 -0
  124. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
  125. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/resolver.py +0 -0
  126. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/routing.py +0 -0
  127. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/scheduler.py +0 -0
  128. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/synthesis.py +0 -0
  129. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/planned/validation.py +0 -0
  130. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/__init__.py +0 -0
  131. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/_shared.py +0 -0
  132. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/anthropic.py +0 -0
  133. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/base.py +0 -0
  134. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/google.py +0 -0
  135. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/ollama.py +0 -0
  136. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/providers/openai.py +0 -0
  137. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/rate_limits.py +0 -0
  138. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/routing.py +0 -0
  139. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/schema_index.py +0 -0
  140. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/settings.py +0 -0
  141. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/signals.py +0 -0
  142. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/system_prompt.py +0 -0
  143. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/tool_metadata.py +0 -0
  144. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/tools.py +0 -0
  145. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/chat/views.py +0 -0
  146. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/conf.py +0 -0
  147. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/dataframes/__init__.py +0 -0
  148. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/dataframes/measurements.py +0 -0
  149. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/factory/__init__.py +0 -0
  150. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/factory/auto_factory.py +0 -0
  151. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/factory/factories.py +0 -0
  152. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/factory/factory_methods.py +0 -0
  153. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/__init__.py +0 -0
  154. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/base_interface.py +0 -0
  155. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/bundles/__init__.py +0 -0
  156. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/bundles/calculation.py +0 -0
  157. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/bundles/database.py +0 -0
  158. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  159. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/bundles/request.py +0 -0
  160. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
  161. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
  162. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  163. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  164. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  165. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  166. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
  167. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  168. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  169. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  170. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  171. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  172. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  173. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/factory.py +0 -0
  174. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  175. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  176. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  177. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  178. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  179. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  180. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  181. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  182. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  183. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  184. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  185. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  186. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  187. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  188. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  189. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/registry.py +0 -0
  190. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  191. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  192. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  193. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  194. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  195. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
  196. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/database.py +0 -0
  197. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  198. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
  199. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  200. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/interfaces/request.py +0 -0
  201. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/manifests/__init__.py +0 -0
  202. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  203. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
  204. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/orm_interface.py +0 -0
  205. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/requests.py +0 -0
  206. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/utils/__init__.py +0 -0
  207. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  208. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/utils/errors.py +0 -0
  209. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/utils/history.py +0 -0
  210. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/interface/utils/models.py +0 -0
  211. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/logging.py +0 -0
  212. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  213. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  214. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  215. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  216. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/search_index.py +0 -0
  217. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/search_reconcile.py +0 -0
  218. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  219. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/shell.py +0 -0
  220. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  221. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  222. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/manager/__init__.py +0 -0
  223. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/manager/general_manager.py +0 -0
  224. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/manager/group_manager.py +0 -0
  225. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/manager/input.py +0 -0
  226. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/measurement/__init__.py +0 -0
  227. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/measurement/measurement.py +0 -0
  228. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/measurement/measurement_field.py +0 -0
  229. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/metrics/__init__.py +0 -0
  230. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/metrics/graphql.py +0 -0
  231. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0001_initial.py +0 -0
  232. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  233. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  234. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  235. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  236. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  237. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  238. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  239. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  240. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  241. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  242. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  243. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/migrations/__init__.py +0 -0
  244. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/models.py +0 -0
  245. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/__init__.py +0 -0
  246. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/audit.py +0 -0
  247. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/base_permission.py +0 -0
  248. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
  249. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/manager_based_permission.py +0 -0
  250. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/mutation_permission.py +0 -0
  251. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/permission_checks.py +0 -0
  252. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/permission_data_manager.py +0 -0
  253. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/permission/utils.py +0 -0
  254. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/py.typed +0 -0
  255. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/rule/__init__.py +0 -0
  256. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/rule/handler.py +0 -0
  257. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/rule/rule.py +0 -0
  258. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/__init__.py +0 -0
  259. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/async_tasks.py +0 -0
  260. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backend.py +0 -0
  261. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backend_registry.py +0 -0
  262. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backends/__init__.py +0 -0
  263. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backends/dev.py +0 -0
  264. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backends/meilisearch.py +0 -0
  265. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backends/opensearch.py +0 -0
  266. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/backends/typesense.py +0 -0
  267. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/checks.py +0 -0
  268. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/config.py +0 -0
  269. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/indexer.py +0 -0
  270. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/invalidation.py +0 -0
  271. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/m2m_invalidation.py +0 -0
  272. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/models.py +0 -0
  273. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/reconciliation.py +0 -0
  274. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/registry.py +0 -0
  275. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/tasks.py +0 -0
  276. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/search/utils.py +0 -0
  277. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/seeding/__init__.py +0 -0
  278. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/seeding/manager_landscape.py +0 -0
  279. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/__init__.py +0 -0
  280. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/adapters.py +0 -0
  281. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/checks.py +0 -0
  282. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/config.py +0 -0
  283. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/errors.py +0 -0
  284. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/finalization.py +0 -0
  285. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/graphql.py +0 -0
  286. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/graphql_types.py +0 -0
  287. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/metrics.py +0 -0
  288. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/models.py +0 -0
  289. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/public.py +0 -0
  290. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/s3.py +0 -0
  291. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/services.py +0 -0
  292. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/tokens.py +0 -0
  293. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/types.py +0 -0
  294. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/urls.py +0 -0
  295. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/uploads/views.py +0 -0
  296. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/__init__.py +0 -0
  297. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/args_to_kwargs.py +0 -0
  298. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/filter_parser.py +0 -0
  299. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/format_string.py +0 -0
  300. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/json_encoder.py +0 -0
  301. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/make_cache_key.py +0 -0
  302. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/none_to_zero.py +0 -0
  303. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/path_mapping.py +0 -0
  304. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/public_api.py +0 -0
  305. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/testing.py +0 -0
  306. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/utils/type_checks.py +0 -0
  307. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/__init__.py +0 -0
  308. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/actions.py +0 -0
  309. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/backend_registry.py +0 -0
  310. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/backends/__init__.py +0 -0
  311. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/backends/celery.py +0 -0
  312. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/backends/local.py +0 -0
  313. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/backends/n8n.py +0 -0
  314. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/config.py +0 -0
  315. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/engine.py +0 -0
  316. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/event_registry.py +0 -0
  317. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/events.py +0 -0
  318. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/models.py +0 -0
  319. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/signal_bridge.py +0 -0
  320. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/tasks.py +0 -0
  321. {generalmanager-0.77.0 → generalmanager-0.78.0}/src/general_manager/workflow/telemetry.py +0 -0
  322. {generalmanager-0.77.0 → generalmanager-0.78.0}/tests/test_settings.py +0 -0
  323. {generalmanager-0.77.0 → generalmanager-0.78.0}/tests/test_urls.py +0 -0
  324. {generalmanager-0.77.0 → generalmanager-0.78.0}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.77.0
3
+ Version: 0.78.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
@@ -61,6 +61,8 @@ Requires-Dist: graphene-django>=3.2.3
61
61
  Requires-Dist: graphql-core>=3.2.6
62
62
  Requires-Dist: graphql-relay>=3.2.0
63
63
  Requires-Dist: numpy>=2.2.5
64
+ Requires-Dist: openpyxl<3.2.0,>=3.1.5
65
+ Requires-Dist: filelock<4,>=3.24.3
64
66
  Requires-Dist: Pint>=0.24.4
65
67
  Requires-Dist: platformdirs>=4.3.7
66
68
  Requires-Dist: promise>=2.3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "GeneralManager"
7
- version = "0.77.0"
7
+ version = "0.78.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" }]
@@ -49,6 +49,8 @@ dependencies = [
49
49
  "graphql-core>=3.2.6",
50
50
  "graphql-relay>=3.2.0",
51
51
  "numpy>=2.2.5",
52
+ "openpyxl>=3.1.5,<3.2.0", # Excel workbook IO
53
+ "filelock>=3.24.3,<4", # portable process-safe Excel workbook locks
52
54
  "Pint>=0.24.4",
53
55
  "platformdirs>=4.3.7",
54
56
  "promise>=2.3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.77.0
3
+ Version: 0.78.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
@@ -61,6 +61,8 @@ Requires-Dist: graphene-django>=3.2.3
61
61
  Requires-Dist: graphql-core>=3.2.6
62
62
  Requires-Dist: graphql-relay>=3.2.0
63
63
  Requires-Dist: numpy>=2.2.5
64
+ Requires-Dist: openpyxl<3.2.0,>=3.1.5
65
+ Requires-Dist: filelock<4,>=3.24.3
64
66
  Requires-Dist: Pint>=0.24.4
65
67
  Requires-Dist: platformdirs>=4.3.7
66
68
  Requires-Dist: promise>=2.3
@@ -57,6 +57,7 @@ src/general_manager/bucket/__init__.py
57
57
  src/general_manager/bucket/base_bucket.py
58
58
  src/general_manager/bucket/calculation_bucket.py
59
59
  src/general_manager/bucket/database_bucket.py
60
+ src/general_manager/bucket/excel_bucket.py
60
61
  src/general_manager/bucket/group_bucket.py
61
62
  src/general_manager/bucket/indexing.py
62
63
  src/general_manager/bucket/projection.py
@@ -142,11 +143,15 @@ src/general_manager/factory/factories.py
142
143
  src/general_manager/factory/factory_methods.py
143
144
  src/general_manager/interface/__init__.py
144
145
  src/general_manager/interface/base_interface.py
146
+ src/general_manager/interface/excel.py
147
+ src/general_manager/interface/excel_store.py
148
+ src/general_manager/interface/excel_workbook.py
145
149
  src/general_manager/interface/orm_interface.py
146
150
  src/general_manager/interface/requests.py
147
151
  src/general_manager/interface/bundles/__init__.py
148
152
  src/general_manager/interface/bundles/calculation.py
149
153
  src/general_manager/interface/bundles/database.py
154
+ src/general_manager/interface/bundles/excel.py
150
155
  src/general_manager/interface/bundles/remote_manager.py
151
156
  src/general_manager/interface/bundles/request.py
152
157
  src/general_manager/interface/capabilities/__init__.py
@@ -163,6 +168,7 @@ src/general_manager/interface/capabilities/calculation/input_resolution.py
163
168
  src/general_manager/interface/capabilities/calculation/lifecycle.py
164
169
  src/general_manager/interface/capabilities/core/observability.py
165
170
  src/general_manager/interface/capabilities/core/utils.py
171
+ src/general_manager/interface/capabilities/excel/__init__.py
166
172
  src/general_manager/interface/capabilities/existing_model/__init__.py
167
173
  src/general_manager/interface/capabilities/existing_model/_compat.py
168
174
  src/general_manager/interface/capabilities/existing_model/resolution.py
@@ -188,6 +194,7 @@ src/general_manager/interface/infrastructure/system_checks.py
188
194
  src/general_manager/interface/interfaces/__init__.py
189
195
  src/general_manager/interface/interfaces/calculation.py
190
196
  src/general_manager/interface/interfaces/database.py
197
+ src/general_manager/interface/interfaces/excel.py
191
198
  src/general_manager/interface/interfaces/existing_model.py
192
199
  src/general_manager/interface/interfaces/read_only.py
193
200
  src/general_manager/interface/interfaces/remote_manager.py
@@ -15,6 +15,8 @@ graphene-django>=3.2.3
15
15
  graphql-core>=3.2.6
16
16
  graphql-relay>=3.2.0
17
17
  numpy>=2.2.5
18
+ openpyxl<3.2.0,>=3.1.5
19
+ filelock<4,>=3.24.3
18
20
  Pint>=0.24.4
19
21
  platformdirs>=4.3.7
20
22
  promise>=2.3
@@ -6,6 +6,11 @@ __all__ = [
6
6
  "AdditiveManagerPermission",
7
7
  "CalculationInterface",
8
8
  "DatabaseInterface",
9
+ "ExcelCharField",
10
+ "ExcelDecimalField",
11
+ "ExcelField",
12
+ "ExcelIntegerField",
13
+ "ExcelInterface",
9
14
  "ExistingModelInterface",
10
15
  "FieldConfig",
11
16
  "GeneralManager",
@@ -42,6 +47,11 @@ from general_manager.permission.manager_based_permission import (
42
47
  )
43
48
  from general_manager.interface.interfaces.calculation import CalculationInterface
44
49
  from general_manager.interface.interfaces.database import DatabaseInterface
50
+ from general_manager.interface.excel import ExcelCharField
51
+ from general_manager.interface.excel import ExcelDecimalField
52
+ from general_manager.interface.excel import ExcelField
53
+ from general_manager.interface.excel import ExcelIntegerField
54
+ from general_manager.interface.interfaces.excel import ExcelInterface
45
55
  from general_manager.interface.interfaces.existing_model import ExistingModelInterface
46
56
  from general_manager.search.config import FieldConfig
47
57
  from general_manager.manager.general_manager import GeneralManager
@@ -7,6 +7,11 @@ __all__ = [
7
7
  "BearerTokenAuthProvider",
8
8
  "CalculationInterface",
9
9
  "DatabaseInterface",
10
+ "ExcelCharField",
11
+ "ExcelDecimalField",
12
+ "ExcelField",
13
+ "ExcelIntegerField",
14
+ "ExcelInterface",
10
15
  "ExistingModelInterface",
11
16
  "FieldMappingSerializer",
12
17
  "HeaderApiKeyAuthProvider",
@@ -49,6 +54,11 @@ from general_manager.interface.requests import BasicAuthProvider
49
54
  from general_manager.interface.requests import BearerTokenAuthProvider
50
55
  from general_manager.interface.interfaces.calculation import CalculationInterface
51
56
  from general_manager.interface.interfaces.database import DatabaseInterface
57
+ from general_manager.interface.excel import ExcelCharField
58
+ from general_manager.interface.excel import ExcelDecimalField
59
+ from general_manager.interface.excel import ExcelField
60
+ from general_manager.interface.excel import ExcelIntegerField
61
+ from general_manager.interface.interfaces.excel import ExcelInterface
52
62
  from general_manager.interface.interfaces.existing_model import ExistingModelInterface
53
63
  from general_manager.interface.requests import FieldMappingSerializer
54
64
  from general_manager.interface.requests import HeaderApiKeyAuthProvider
@@ -0,0 +1,339 @@
1
+ """Bucket implementation for Excel-backed interfaces."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from collections.abc import Generator, Iterable, Mapping
6
+ from typing import Any, Protocol, cast
7
+
8
+ from general_manager.bucket.base_bucket import Bucket, GeneralManagerType
9
+ from general_manager.cache.cache_tracker import DependencyTracker
10
+ from general_manager.cache.dependency_index import serialize_dependency_identifier
11
+ from general_manager.cache.dependency_matching import lookup_spec_from_key
12
+ from general_manager.interface.excel import ExcelMeta
13
+ from general_manager.interface.excel_store import DEFAULT_EXCEL_STORE
14
+ from general_manager.utils.filter_parser import create_filter_function
15
+
16
+ SUPPORTED_EXCEL_LOOKUPS = frozenset(
17
+ {
18
+ "exact",
19
+ "lt",
20
+ "lte",
21
+ "gt",
22
+ "gte",
23
+ "contains",
24
+ "startswith",
25
+ "endswith",
26
+ "in",
27
+ }
28
+ )
29
+
30
+
31
+ class ExcelSingleItemRequiredError(ValueError):
32
+ def __init__(self) -> None:
33
+ super().__init__("get() requires exactly one Excel row.")
34
+
35
+
36
+ class ExcelBucketLookupError(ValueError):
37
+ def __init__(self, manager_class: type, lookup: str) -> None:
38
+ super().__init__(
39
+ f"Unknown Excel field lookup {lookup!r} for {manager_class.__name__}."
40
+ )
41
+
42
+
43
+ class ExcelBucketUnionError(TypeError):
44
+ def __init__(
45
+ self,
46
+ manager_class: type,
47
+ other: object,
48
+ *,
49
+ other_manager_class: type | None = None,
50
+ ) -> None:
51
+ if other_manager_class is not None:
52
+ message = (
53
+ f"Cannot union ExcelBucket for {manager_class.__name__} with "
54
+ f"ExcelBucket for {other_manager_class.__name__}."
55
+ )
56
+ else:
57
+ message = (
58
+ f"Cannot union ExcelBucket for {manager_class.__name__} with "
59
+ f"{type(other).__name__}; expected ExcelBucket for "
60
+ f"{manager_class.__name__} or {manager_class.__name__} instance."
61
+ )
62
+ super().__init__(message)
63
+
64
+
65
+ class _ExcelRowView:
66
+ """Attribute view over a parsed Excel row for filter evaluation."""
67
+
68
+ def __init__(self, values: Mapping[str, Any]) -> None:
69
+ self._values = values
70
+
71
+ def __getattr__(self, name: str) -> Any:
72
+ try:
73
+ return self._values[name]
74
+ except KeyError as error:
75
+ raise AttributeError(name) from error
76
+
77
+
78
+ class _ExcelInterfaceType(Protocol):
79
+ excel_meta: ExcelMeta
80
+ excel_fields: dict[str, Any]
81
+
82
+ @classmethod
83
+ def sync_from_excel(cls, *, force: bool = False) -> object: ...
84
+
85
+
86
+ class ExcelBucket(Bucket[GeneralManagerType]):
87
+ def __init__(
88
+ self,
89
+ manager_class: type[GeneralManagerType],
90
+ interface_cls: _ExcelInterfaceType,
91
+ *,
92
+ filters: Mapping[str, Any] | Iterable[tuple[str, Any]] | None = None,
93
+ excludes: Mapping[str, Any] | Iterable[tuple[str, Any]] | None = None,
94
+ keys: tuple[Any, ...] | None = None,
95
+ ) -> None:
96
+ super().__init__(manager_class)
97
+ self._interface_cls = interface_cls
98
+ self._filters = self._normalize_reserved_constraints(filters)
99
+ self._excludes = self._normalize_reserved_constraints(excludes)
100
+ self.filters = self._dependency_payload(self._filters)
101
+ self.excludes = self._dependency_payload(self._excludes)
102
+ self._keys = keys
103
+
104
+ @staticmethod
105
+ def _normalize_constraints(
106
+ constraints: Mapping[str, Any] | Iterable[tuple[str, Any]] | None,
107
+ ) -> tuple[tuple[str, Any], ...]:
108
+ if constraints is None:
109
+ return ()
110
+ if isinstance(constraints, Mapping):
111
+ return tuple(constraints.items())
112
+ return tuple(constraints)
113
+
114
+ @staticmethod
115
+ def _dependency_payload(
116
+ constraints: tuple[tuple[str, Any], ...],
117
+ ) -> dict[str, Any]:
118
+ payload: dict[str, Any] = {}
119
+ for lookup, expected in constraints:
120
+ dependency_lookup = (
121
+ lookup.removesuffix("__exact") if lookup.endswith("__exact") else lookup
122
+ )
123
+ spec = lookup_spec_from_key(dependency_lookup)
124
+ normalized_lookup = "__".join(spec.attr_path)
125
+ if spec.operator != "eq":
126
+ normalized_lookup = f"{normalized_lookup}__{spec.operator}"
127
+ payload[normalized_lookup] = expected
128
+ return payload
129
+
130
+ def __iter__(self) -> Generator[GeneralManagerType, None, None]:
131
+ for key in self._matching_keys():
132
+ yield self._manager_class(**{self._interface_cls.excel_meta.key: key})
133
+
134
+ def filter(self, **kwargs: Any) -> ExcelBucket[GeneralManagerType]:
135
+ """Return a bucket narrowed to rows matching every lookup."""
136
+ constraints = self._normalize_reserved_constraints(kwargs)
137
+ self._validate_lookups(lookup for lookup, _expected in constraints)
138
+ return ExcelBucket(
139
+ self._manager_class,
140
+ self._interface_cls,
141
+ filters=(*self._filters, *constraints),
142
+ excludes=self._excludes,
143
+ keys=self._keys,
144
+ )
145
+
146
+ def exclude(self, **kwargs: Any) -> ExcelBucket[GeneralManagerType]:
147
+ """Return a bucket without rows matching any supplied lookup."""
148
+ constraints = self._normalize_reserved_constraints(kwargs)
149
+ self._validate_lookups(lookup for lookup, _expected in constraints)
150
+ return ExcelBucket(
151
+ self._manager_class,
152
+ self._interface_cls,
153
+ filters=self._filters,
154
+ excludes=(*self._excludes, *constraints),
155
+ keys=self._keys,
156
+ )
157
+
158
+ def all(self) -> ExcelBucket[GeneralManagerType]:
159
+ """Return an independent bucket preserving the current query."""
160
+ return ExcelBucket(
161
+ self._manager_class,
162
+ self._interface_cls,
163
+ filters=self._filters,
164
+ excludes=self._excludes,
165
+ keys=self._keys,
166
+ )
167
+
168
+ def count(self) -> int:
169
+ """Return the number of rows in the current query."""
170
+ return len(self._matching_keys())
171
+
172
+ def first(self) -> GeneralManagerType | None:
173
+ """Return the first matching manager, or ``None`` when empty."""
174
+ items = tuple(self)
175
+ return items[0] if items else None
176
+
177
+ def last(self) -> GeneralManagerType | None:
178
+ """Return the last matching manager, or ``None`` when empty."""
179
+ items = tuple(self)
180
+ return items[-1] if items else None
181
+
182
+ def get(self, **kwargs: Any) -> GeneralManagerType:
183
+ """Return the single matching manager or raise when the count differs."""
184
+ bucket = self.filter(**kwargs) if kwargs else self
185
+ items = tuple(bucket)
186
+ if len(items) != 1:
187
+ raise ExcelSingleItemRequiredError()
188
+ return items[0]
189
+
190
+ def __getitem__(
191
+ self,
192
+ item: int | slice,
193
+ ) -> GeneralManagerType | ExcelBucket[GeneralManagerType]:
194
+ keys = self._matching_keys()
195
+ if isinstance(item, slice):
196
+ return ExcelBucket(
197
+ self._manager_class,
198
+ self._interface_cls,
199
+ keys=keys[item],
200
+ )
201
+ return self._manager_class(**{self._interface_cls.excel_meta.key: keys[item]})
202
+
203
+ def __len__(self) -> int:
204
+ return self.count()
205
+
206
+ def __contains__(self, item: GeneralManagerType) -> bool:
207
+ key = item.identification[self._interface_cls.excel_meta.key]
208
+ return key in set(self._matching_keys())
209
+
210
+ def __or__(
211
+ self,
212
+ other: Bucket[GeneralManagerType] | GeneralManagerType,
213
+ ) -> ExcelBucket[GeneralManagerType]:
214
+ keys = list(self._matching_keys())
215
+ if isinstance(other, ExcelBucket):
216
+ if (
217
+ other._manager_class is not self._manager_class
218
+ or other._interface_cls is not self._interface_cls
219
+ ):
220
+ raise ExcelBucketUnionError(
221
+ self._manager_class,
222
+ other,
223
+ other_manager_class=other._manager_class,
224
+ )
225
+ keys.extend(other._matching_keys())
226
+ elif isinstance(other, self._manager_class):
227
+ keys.append(other.identification[self._interface_cls.excel_meta.key])
228
+ else:
229
+ raise ExcelBucketUnionError(self._manager_class, other)
230
+ return ExcelBucket(
231
+ self._manager_class,
232
+ self._interface_cls,
233
+ keys=tuple(dict.fromkeys(keys)),
234
+ )
235
+
236
+ def sort(
237
+ self,
238
+ key: tuple[str, ...] | str,
239
+ reverse: bool = False,
240
+ ) -> ExcelBucket[GeneralManagerType]:
241
+ """Return a bucket ordered by one or more Excel field names."""
242
+ key_names = (key,) if isinstance(key, str) else key
243
+ self._validate_field_names(key_names)
244
+ rows = self._matching_rows()
245
+ rows.sort(
246
+ key=lambda row: tuple(row.values[name] for name in key_names),
247
+ reverse=reverse,
248
+ )
249
+ return ExcelBucket(
250
+ self._manager_class,
251
+ self._interface_cls,
252
+ keys=tuple(row.key for row in rows),
253
+ )
254
+
255
+ def none(self) -> ExcelBucket[GeneralManagerType]:
256
+ """Return an empty bucket for this manager and interface."""
257
+ return ExcelBucket(self._manager_class, self._interface_cls, keys=tuple())
258
+
259
+ def _matching_rows(self) -> list[Any]:
260
+ self._validate_constraints()
261
+ self._track_dependencies()
262
+ self._interface_cls.sync_from_excel()
263
+ mirror = DEFAULT_EXCEL_STORE.mirror_for(cast(type, self._interface_cls))
264
+ rows = list(mirror.rows.values())
265
+ if self._keys is not None:
266
+ rows = [mirror.rows[key] for key in self._keys if key in mirror.rows]
267
+ for lookup, expected in self._filters:
268
+ matcher = create_filter_function(lookup, expected)
269
+ rows = [row for row in rows if matcher(_ExcelRowView(row.values))]
270
+ for lookup, expected in self._excludes:
271
+ matcher = create_filter_function(lookup, expected)
272
+ rows = [row for row in rows if not matcher(_ExcelRowView(row.values))]
273
+ return rows
274
+
275
+ def _matching_keys(self) -> tuple[Any, ...]:
276
+ return tuple(row.key for row in self._matching_rows())
277
+
278
+ def _validate_constraints(self) -> None:
279
+ self._validate_lookups(
280
+ lookup for lookup, _expected in (*self._filters, *self._excludes)
281
+ )
282
+
283
+ def _normalize_reserved_constraints(
284
+ self,
285
+ constraints: Mapping[str, Any] | Iterable[tuple[str, Any]] | None,
286
+ ) -> tuple[tuple[str, Any], ...]:
287
+ key = self._interface_cls.excel_meta.key
288
+ normalized: list[tuple[str, Any]] = []
289
+ for lookup, expected in self._normalize_constraints(constraints):
290
+ if lookup == "id__in":
291
+ lookup = f"{key}__in"
292
+ expected = [
293
+ item[key] if isinstance(item, Mapping) else item
294
+ for item in expected
295
+ ]
296
+ normalized.append((lookup, expected))
297
+ return tuple(normalized)
298
+
299
+ def _validate_lookups(self, lookups: Iterable[str]) -> None:
300
+ for lookup in lookups:
301
+ field_name = self._field_name_for_lookup(lookup)
302
+ if field_name not in self._interface_cls.excel_fields:
303
+ raise ExcelBucketLookupError(self._manager_class, lookup)
304
+
305
+ def _validate_field_names(self, field_names: Iterable[str]) -> None:
306
+ for field_name in field_names:
307
+ if field_name not in self._interface_cls.excel_fields:
308
+ raise ExcelBucketLookupError(self._manager_class, field_name)
309
+
310
+ def _field_name_for_lookup(self, lookup: str) -> str:
311
+ parts = lookup.split("__")
312
+ if len(parts) == 1:
313
+ return lookup
314
+ if len(parts) == 2 and parts[-1] in SUPPORTED_EXCEL_LOOKUPS:
315
+ return parts[0]
316
+ raise ExcelBucketLookupError(self._manager_class, lookup)
317
+
318
+ def _track_dependencies(self) -> None:
319
+ manager_name = self._manager_class.__name__
320
+ if self._filters:
321
+ for constraint in self._filters:
322
+ DependencyTracker.track(
323
+ manager_name,
324
+ "filter",
325
+ serialize_dependency_identifier(
326
+ self._dependency_payload((constraint,))
327
+ ),
328
+ )
329
+ else:
330
+ DependencyTracker.track(manager_name, "all", "")
331
+ if self._excludes:
332
+ for constraint in self._excludes:
333
+ DependencyTracker.track(
334
+ manager_name,
335
+ "exclude",
336
+ serialize_dependency_identifier(
337
+ self._dependency_payload((constraint,))
338
+ ),
339
+ )