GeneralManager 0.75.0__tar.gz → 0.76.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 (301) hide show
  1. {generalmanager-0.75.0/src/GeneralManager.egg-info → generalmanager-0.76.0}/PKG-INFO +4 -4
  2. {generalmanager-0.75.0 → generalmanager-0.76.0}/pyproject.toml +4 -4
  3. {generalmanager-0.75.0 → generalmanager-0.76.0/src/GeneralManager.egg-info}/PKG-INFO +4 -4
  4. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/GeneralManager.egg-info/requires.txt +3 -3
  5. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backend_registry.py +20 -2
  6. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backends/dev.py +74 -15
  7. {generalmanager-0.75.0 → generalmanager-0.76.0}/LICENSE +0 -0
  8. {generalmanager-0.75.0 → generalmanager-0.76.0}/README.md +0 -0
  9. {generalmanager-0.75.0 → generalmanager-0.76.0}/setup.cfg +0 -0
  10. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/GeneralManager.egg-info/SOURCES.txt +0 -0
  11. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
  12. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
  13. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/__init__.py +0 -0
  14. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/__init__.py +0 -0
  15. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/api.py +0 -0
  16. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/bucket.py +0 -0
  17. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/cache.py +0 -0
  18. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/dataframes.py +0 -0
  19. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/factory.py +0 -0
  20. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/general_manager.py +0 -0
  21. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/interface.py +0 -0
  22. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/manager.py +0 -0
  23. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/measurement.py +0 -0
  24. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/permission.py +0 -0
  25. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/rule.py +0 -0
  26. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/search.py +0 -0
  27. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/_types/utils.py +0 -0
  28. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/__init__.py +0 -0
  29. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql.py +0 -0
  30. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_as_of.py +0 -0
  31. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_errors.py +0 -0
  32. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_mutations.py +0 -0
  33. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_output.py +0 -0
  34. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_prefetch.py +0 -0
  35. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_relations.py +0 -0
  36. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_resolvers.py +0 -0
  37. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_search.py +0 -0
  38. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
  39. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
  40. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_type.py +0 -0
  41. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_view.py +0 -0
  42. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_warmup.py +0 -0
  43. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
  44. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
  45. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/mutation.py +0 -0
  46. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/notification_batching.py +0 -0
  47. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/property.py +0 -0
  48. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/registry.py +0 -0
  49. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/remote_api.py +0 -0
  50. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/remote_invalidation.py +0 -0
  51. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
  52. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/apps.py +0 -0
  53. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/as_of.py +0 -0
  54. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bootstrap.py +0 -0
  55. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/__init__.py +0 -0
  56. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/base_bucket.py +0 -0
  57. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
  58. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/database_bucket.py +0 -0
  59. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/group_bucket.py +0 -0
  60. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/indexing.py +0 -0
  61. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/projection.py +0 -0
  62. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/bucket/request_bucket.py +0 -0
  63. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/__init__.py +0 -0
  64. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/cache_decorator.py +0 -0
  65. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/cache_tracker.py +0 -0
  66. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/data_change_context.py +0 -0
  67. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/dependency_cache.py +0 -0
  68. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/dependency_index.py +0 -0
  69. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/dependency_matching.py +0 -0
  70. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/dependency_publish.py +0 -0
  71. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/dependency_shards.py +0 -0
  72. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
  73. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/run_context.py +0 -0
  74. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/run_context_lru.py +0 -0
  75. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/cache/signals.py +0 -0
  76. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/__init__.py +0 -0
  77. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/audit.py +0 -0
  78. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/bootstrap.py +0 -0
  79. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/checks.py +0 -0
  80. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/consumer.py +0 -0
  81. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/errors.py +0 -0
  82. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/__init__.py +0 -0
  83. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/__main__.py +0 -0
  84. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/baseline.py +0 -0
  85. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
  86. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
  87. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
  88. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
  89. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
  90. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
  91. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
  92. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
  93. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/fixtures.py +0 -0
  94. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
  95. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
  96. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
  97. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
  98. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
  99. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/readiness.py +0 -0
  100. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/runner.py +0 -0
  101. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/evals/traces.py +0 -0
  102. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/grounding.py +0 -0
  103. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/models.py +0 -0
  104. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/__init__.py +0 -0
  105. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/_shared.py +0 -0
  106. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/anthropic.py +0 -0
  107. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/base.py +0 -0
  108. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/google.py +0 -0
  109. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/ollama.py +0 -0
  110. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/providers/openai.py +0 -0
  111. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/rate_limits.py +0 -0
  112. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/routing.py +0 -0
  113. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/schema_index.py +0 -0
  114. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/settings.py +0 -0
  115. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/signals.py +0 -0
  116. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/system_prompt.py +0 -0
  117. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/tool_metadata.py +0 -0
  118. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/tools.py +0 -0
  119. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/chat/views.py +0 -0
  120. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/conf.py +0 -0
  121. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/dataframes/__init__.py +0 -0
  122. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/dataframes/measurements.py +0 -0
  123. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/factory/__init__.py +0 -0
  124. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/factory/auto_factory.py +0 -0
  125. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/factory/factories.py +0 -0
  126. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/factory/factory_methods.py +0 -0
  127. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/__init__.py +0 -0
  128. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/base_interface.py +0 -0
  129. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/bundles/__init__.py +0 -0
  130. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/bundles/calculation.py +0 -0
  131. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/bundles/database.py +0 -0
  132. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
  133. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/bundles/request.py +0 -0
  134. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
  135. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/base.py +0 -0
  136. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
  137. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
  138. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
  139. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
  140. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
  141. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
  142. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
  143. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
  144. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
  145. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
  146. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
  147. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
  148. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/factory.py +0 -0
  149. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
  150. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
  151. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
  152. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
  153. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm/mutations.py +0 -0
  154. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
  155. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
  156. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
  157. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
  158. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
  159. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
  160. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
  161. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
  162. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
  163. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
  164. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/registry.py +0 -0
  165. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
  166. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
  167. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
  168. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
  169. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
  170. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
  171. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
  172. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/database.py +0 -0
  173. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
  174. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
  175. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
  176. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/interfaces/request.py +0 -0
  177. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/manifests/__init__.py +0 -0
  178. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
  179. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/manifests/capability_manifest.py +0 -0
  180. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
  181. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/orm_interface.py +0 -0
  182. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/requests.py +0 -0
  183. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/utils/__init__.py +0 -0
  184. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
  185. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/utils/errors.py +0 -0
  186. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/utils/history.py +0 -0
  187. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/interface/utils/models.py +0 -0
  188. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/logging.py +0 -0
  189. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
  190. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
  191. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
  192. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
  193. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/search_index.py +0 -0
  194. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/search_reconcile.py +0 -0
  195. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
  196. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/shell.py +0 -0
  197. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
  198. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
  199. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/manager/__init__.py +0 -0
  200. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/manager/general_manager.py +0 -0
  201. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/manager/group_manager.py +0 -0
  202. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/manager/input.py +0 -0
  203. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/manager/meta.py +0 -0
  204. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/measurement/__init__.py +0 -0
  205. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/measurement/measurement.py +0 -0
  206. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/measurement/measurement_field.py +0 -0
  207. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/metrics/__init__.py +0 -0
  208. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/metrics/graphql.py +0 -0
  209. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0001_initial.py +0 -0
  210. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
  211. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
  212. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
  213. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
  214. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
  215. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
  216. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
  217. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
  218. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
  219. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
  220. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
  221. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/migrations/__init__.py +0 -0
  222. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/models.py +0 -0
  223. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/__init__.py +0 -0
  224. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/audit.py +0 -0
  225. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/base_permission.py +0 -0
  226. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
  227. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/manager_based_permission.py +0 -0
  228. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/mutation_permission.py +0 -0
  229. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/permission_checks.py +0 -0
  230. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/permission_data_manager.py +0 -0
  231. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/permission/utils.py +0 -0
  232. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/public_api_registry.py +0 -0
  233. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/py.typed +0 -0
  234. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/rule/__init__.py +0 -0
  235. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/rule/handler.py +0 -0
  236. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/rule/rule.py +0 -0
  237. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/__init__.py +0 -0
  238. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/async_tasks.py +0 -0
  239. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backend.py +0 -0
  240. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backends/__init__.py +0 -0
  241. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backends/meilisearch.py +0 -0
  242. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backends/opensearch.py +0 -0
  243. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/backends/typesense.py +0 -0
  244. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/checks.py +0 -0
  245. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/config.py +0 -0
  246. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/indexer.py +0 -0
  247. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/invalidation.py +0 -0
  248. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/m2m_invalidation.py +0 -0
  249. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/models.py +0 -0
  250. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/reconciliation.py +0 -0
  251. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/registry.py +0 -0
  252. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/tasks.py +0 -0
  253. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/search/utils.py +0 -0
  254. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/seeding/__init__.py +0 -0
  255. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/seeding/manager_landscape.py +0 -0
  256. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/__init__.py +0 -0
  257. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/adapters.py +0 -0
  258. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/checks.py +0 -0
  259. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/config.py +0 -0
  260. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/errors.py +0 -0
  261. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/finalization.py +0 -0
  262. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/graphql.py +0 -0
  263. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/graphql_types.py +0 -0
  264. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/metrics.py +0 -0
  265. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/models.py +0 -0
  266. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/public.py +0 -0
  267. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/s3.py +0 -0
  268. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/services.py +0 -0
  269. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/tokens.py +0 -0
  270. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/types.py +0 -0
  271. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/urls.py +0 -0
  272. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/uploads/views.py +0 -0
  273. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/__init__.py +0 -0
  274. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/args_to_kwargs.py +0 -0
  275. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/filter_parser.py +0 -0
  276. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/format_string.py +0 -0
  277. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/json_encoder.py +0 -0
  278. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/make_cache_key.py +0 -0
  279. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/none_to_zero.py +0 -0
  280. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/path_mapping.py +0 -0
  281. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/public_api.py +0 -0
  282. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/testing.py +0 -0
  283. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/utils/type_checks.py +0 -0
  284. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/__init__.py +0 -0
  285. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/actions.py +0 -0
  286. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/backend_registry.py +0 -0
  287. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/backends/__init__.py +0 -0
  288. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/backends/celery.py +0 -0
  289. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/backends/local.py +0 -0
  290. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/backends/n8n.py +0 -0
  291. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/config.py +0 -0
  292. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/engine.py +0 -0
  293. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/event_registry.py +0 -0
  294. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/events.py +0 -0
  295. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/models.py +0 -0
  296. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/signal_bridge.py +0 -0
  297. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/tasks.py +0 -0
  298. {generalmanager-0.75.0 → generalmanager-0.76.0}/src/general_manager/workflow/telemetry.py +0 -0
  299. {generalmanager-0.75.0 → generalmanager-0.76.0}/tests/test_settings.py +0 -0
  300. {generalmanager-0.75.0 → generalmanager-0.76.0}/tests/test_urls.py +0 -0
  301. {generalmanager-0.75.0 → generalmanager-0.76.0}/tests/testing_asgi.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.75.0
3
+ Version: 0.76.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
@@ -47,7 +47,7 @@ License-File: LICENSE
47
47
  Requires-Dist: asgiref>=3.8.1
48
48
  Requires-Dist: celery<6.0.0,>=5.3.6
49
49
  Requires-Dist: channels>=4.1.0
50
- Requires-Dist: Django>=5.2.15
50
+ Requires-Dist: Django>=5.2.16
51
51
  Requires-Dist: django-simple-history>=3.8.0
52
52
  Requires-Dist: exrex>=0.12.0
53
53
  Requires-Dist: factory_boy>=3.3.3
@@ -55,7 +55,7 @@ Requires-Dist: Faker>=37.1.0
55
55
  Requires-Dist: flexcache>=0.3
56
56
  Requires-Dist: flexparser>=0.4
57
57
  Requires-Dist: gitdb>=4.0.12
58
- Requires-Dist: GitPython>=3.1.55
58
+ Requires-Dist: GitPython>=3.1.58
59
59
  Requires-Dist: graphene>=3.4.3
60
60
  Requires-Dist: graphene-django>=3.2.3
61
61
  Requires-Dist: graphql-core>=3.2.6
@@ -68,7 +68,7 @@ Requires-Dist: python-dateutil>=2.9.0.post0
68
68
  Requires-Dist: PyYAML>=6.0.3
69
69
  Requires-Dist: six>=1.17.0
70
70
  Requires-Dist: smmap>=5.0.2
71
- Requires-Dist: sqlparse>=0.5.4
71
+ Requires-Dist: sqlparse>=0.6.0
72
72
  Requires-Dist: text-unidecode>=1.3
73
73
  Requires-Dist: typing_extensions>=4.13.2
74
74
  Requires-Dist: tzdata>=2025.2
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "GeneralManager"
7
- version = "0.75.0"
7
+ version = "0.76.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" }]
@@ -35,7 +35,7 @@ dependencies = [
35
35
  "asgiref>=3.8.1",
36
36
  "celery>=5.3.6,<6.0.0", # async search indexing (docs/concepts/search.md)
37
37
  "channels>=4.1.0",
38
- "Django>=5.2.15",
38
+ "Django>=5.2.16",
39
39
  "django-simple-history>=3.8.0",
40
40
  "exrex>=0.12.0",
41
41
  "factory_boy>=3.3.3",
@@ -43,7 +43,7 @@ dependencies = [
43
43
  "flexcache>=0.3",
44
44
  "flexparser>=0.4",
45
45
  "gitdb>=4.0.12",
46
- "GitPython>=3.1.55",
46
+ "GitPython>=3.1.58",
47
47
  "graphene>=3.4.3",
48
48
  "graphene-django>=3.2.3",
49
49
  "graphql-core>=3.2.6",
@@ -56,7 +56,7 @@ dependencies = [
56
56
  "PyYAML>=6.0.3",
57
57
  "six>=1.17.0",
58
58
  "smmap>=5.0.2",
59
- "sqlparse>=0.5.4",
59
+ "sqlparse>=0.6.0",
60
60
  "text-unidecode>=1.3",
61
61
  "typing_extensions>=4.13.2",
62
62
  "tzdata>=2025.2",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: GeneralManager
3
- Version: 0.75.0
3
+ Version: 0.76.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
@@ -47,7 +47,7 @@ License-File: LICENSE
47
47
  Requires-Dist: asgiref>=3.8.1
48
48
  Requires-Dist: celery<6.0.0,>=5.3.6
49
49
  Requires-Dist: channels>=4.1.0
50
- Requires-Dist: Django>=5.2.15
50
+ Requires-Dist: Django>=5.2.16
51
51
  Requires-Dist: django-simple-history>=3.8.0
52
52
  Requires-Dist: exrex>=0.12.0
53
53
  Requires-Dist: factory_boy>=3.3.3
@@ -55,7 +55,7 @@ Requires-Dist: Faker>=37.1.0
55
55
  Requires-Dist: flexcache>=0.3
56
56
  Requires-Dist: flexparser>=0.4
57
57
  Requires-Dist: gitdb>=4.0.12
58
- Requires-Dist: GitPython>=3.1.55
58
+ Requires-Dist: GitPython>=3.1.58
59
59
  Requires-Dist: graphene>=3.4.3
60
60
  Requires-Dist: graphene-django>=3.2.3
61
61
  Requires-Dist: graphql-core>=3.2.6
@@ -68,7 +68,7 @@ Requires-Dist: python-dateutil>=2.9.0.post0
68
68
  Requires-Dist: PyYAML>=6.0.3
69
69
  Requires-Dist: six>=1.17.0
70
70
  Requires-Dist: smmap>=5.0.2
71
- Requires-Dist: sqlparse>=0.5.4
71
+ Requires-Dist: sqlparse>=0.6.0
72
72
  Requires-Dist: text-unidecode>=1.3
73
73
  Requires-Dist: typing_extensions>=4.13.2
74
74
  Requires-Dist: tzdata>=2025.2
@@ -1,7 +1,7 @@
1
1
  asgiref>=3.8.1
2
2
  celery<6.0.0,>=5.3.6
3
3
  channels>=4.1.0
4
- Django>=5.2.15
4
+ Django>=5.2.16
5
5
  django-simple-history>=3.8.0
6
6
  exrex>=0.12.0
7
7
  factory_boy>=3.3.3
@@ -9,7 +9,7 @@ Faker>=37.1.0
9
9
  flexcache>=0.3
10
10
  flexparser>=0.4
11
11
  gitdb>=4.0.12
12
- GitPython>=3.1.55
12
+ GitPython>=3.1.58
13
13
  graphene>=3.4.3
14
14
  graphene-django>=3.2.3
15
15
  graphql-core>=3.2.6
@@ -22,7 +22,7 @@ python-dateutil>=2.9.0.post0
22
22
  PyYAML>=6.0.3
23
23
  six>=1.17.0
24
24
  smmap>=5.0.2
25
- sqlparse>=0.5.4
25
+ sqlparse>=0.6.0
26
26
  text-unidecode>=1.3
27
27
  typing_extensions>=4.13.2
28
28
  tzdata>=2025.2
@@ -27,6 +27,19 @@ class InvalidSearchBackendOptionsError(TypeError):
27
27
  super().__init__("SEARCH_BACKEND options must be a mapping.")
28
28
 
29
29
 
30
+ def _dev_auto_reindex_enabled(django_settings: object) -> bool:
31
+ """Return whether settings enable DevSearch first-search hydration."""
32
+ config_candidate = getattr(django_settings, _SETTINGS_KEY, None)
33
+ if (
34
+ isinstance(config_candidate, Mapping)
35
+ and "SEARCH_AUTO_REINDEX" in config_candidate
36
+ ):
37
+ configured = config_candidate["SEARCH_AUTO_REINDEX"]
38
+ else:
39
+ configured = getattr(django_settings, "SEARCH_AUTO_REINDEX", False)
40
+ return bool(configured)
41
+
42
+
30
43
  def configure_search_backend(backend: SearchBackend | None) -> None:
31
44
  """
32
45
  Set the active search backend instance.
@@ -128,6 +141,10 @@ def configure_search_backend_from_settings(django_settings: object) -> None:
128
141
  backend_instance = _resolve_backend(backend_setting)
129
142
  if backend_setting is not None and backend_instance is None:
130
143
  raise SearchBackendNotConfiguredError.from_setting(backend_setting)
144
+ if isinstance(backend_instance, DevSearchBackend):
145
+ backend_instance.configure_auto_reindex(
146
+ _dev_auto_reindex_enabled(django_settings)
147
+ )
131
148
  configure_search_backend(backend_instance)
132
149
 
133
150
 
@@ -139,7 +156,8 @@ def get_search_backend() -> SearchBackend:
139
156
  `configure_search_backend_from_settings(django.conf.settings)`. If settings
140
157
  still leave the backend unset, it creates one `DevSearchBackend`, stores it
141
158
  as the process-local active backend, and returns that same fallback instance
142
- on later calls.
159
+ on later calls. The fallback enables first-search hydration when
160
+ `SEARCH_AUTO_REINDEX` is enabled in Django settings.
143
161
 
144
162
  Returns:
145
163
  The configured or development fallback search backend.
@@ -154,7 +172,7 @@ def get_search_backend() -> SearchBackend:
154
172
 
155
173
  configure_search_backend_from_settings(settings)
156
174
  if _backend is None:
157
- _backend = DevSearchBackend()
175
+ _backend = DevSearchBackend(auto_reindex=_dev_auto_reindex_enabled(settings))
158
176
  if _backend is None:
159
177
  raise SearchBackendNotConfiguredError()
160
178
  return _backend
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import time
6
6
  from collections.abc import Mapping, Sequence
7
7
  from dataclasses import dataclass, field
8
+ from threading import RLock
8
9
 
9
10
  from general_manager.search.backend import SearchDocument, SearchHit, SearchResult
10
11
  from general_manager.utils.filter_parser import apply_lookup
@@ -18,13 +19,32 @@ class _IndexStore:
18
19
 
19
20
 
20
21
  class DevSearchBackend:
21
- """Simple process-local in-memory search backend intended for development."""
22
+ """Process-local development search with optional lazy per-index hydration."""
22
23
 
23
- def __init__(self) -> None:
24
+ def __init__(self, *, auto_reindex: bool = False) -> None:
24
25
  """
25
- Initialize the backend with an empty registry that maps index names (str) to _IndexStore instances.
26
+ Initialize an empty in-memory registry and optional hydration lifecycle.
27
+
28
+ Automatic hydration is disabled for directly constructed backends unless
29
+ explicitly opted in. When enabled, each index hydrates on its first
30
+ search in this process. Failed hydration propagates and remains
31
+ retryable. The lock coordinates only first-search hydration; ordinary
32
+ reads and writes retain the backend's existing unsynchronized behavior.
26
33
  """
27
34
  self._indexes: dict[str, _IndexStore] = {}
35
+ self._auto_reindex = auto_reindex
36
+ self._hydrated_indexes: set[str] = set()
37
+ self._hydrating_indexes: set[str] = set()
38
+ self._hydration_lock = RLock()
39
+
40
+ @property
41
+ def auto_reindex_enabled(self) -> bool:
42
+ """Return whether first-search hydration is enabled for this backend."""
43
+ return self._auto_reindex
44
+
45
+ def configure_auto_reindex(self, enabled: bool) -> None:
46
+ """Enable or disable first-search hydration for this backend instance."""
47
+ self._auto_reindex = enabled
28
48
 
29
49
  def ensure_index(self, index_name: str, settings: Mapping[str, object]) -> None:
30
50
  """
@@ -100,6 +120,10 @@ class DevSearchBackend:
100
120
  """
101
121
  Search an index for documents matching a query and return scored, optionally filtered and sorted hits.
102
122
 
123
+ When auto-reindex is enabled, the first search for an index lazily
124
+ hydrates that index in this process before evaluating the query. The
125
+ hydration guard coordinates concurrent and nested first searches only;
126
+ a failed source error propagates and the next search can retry.
103
127
  The backend reads and writes documents under the `index_name` argument;
104
128
  `SearchDocument.index` is stored but not validated. Document IDs are
105
129
  unique only inside one in-memory index. Duplicate IDs inside one
@@ -108,13 +132,14 @@ class DevSearchBackend:
108
132
  is idempotent and replaces the stored settings mapping for the index.
109
133
  Operations are not transactional; mutations completed before an
110
134
  exception remain in memory. Queries are lowercased and split on
111
- whitespace. Indexed tokens are built from every top-level
135
+ whitespace, with duplicate query tokens removed in first-seen order.
136
+ Indexed tokens are built from every top-level
112
137
  `SearchDocument.data` value: `None` yields no tokens, strings split on
113
138
  whitespace, lists/tuples/sets are processed recursively, and all other
114
139
  values become `str(value).lower().split()`. Dict values are not
115
140
  traversed; they are tokenized from their string representation. A
116
- document matches when each query token equals or prefixes a token
117
- extracted from any indexed field. Empty queries match every document
141
+ document matches when every distinct query token equals or prefixes a
142
+ token extracted from any indexed field. Empty queries match every document
118
143
  that passes type and structured filters. The operation
119
144
  order is type filtering, structured filtering, query scoring/matching,
120
145
  sorting, and then pagination with `results[offset:offset + limit]`;
@@ -130,8 +155,8 @@ class DevSearchBackend:
130
155
  keys, including equal-score default ordering. The backend stores
131
156
  document and settings objects by reference, returns hit data from the
132
157
  stored `SearchDocument.data` mapping, is
133
- process-local memory only, and does not provide persistence or
134
- synchronization for concurrent reads/writes.
158
+ process-local memory only, and does not provide persistence or ordinary
159
+ read/write synchronization beyond first-search hydration.
135
160
 
136
161
  Parameters:
137
162
  index_name (str): Name of the index to search.
@@ -166,6 +191,7 @@ class DevSearchBackend:
166
191
  operational failures are not normalized and may surface as
167
192
  ordinary Python exceptions.
168
193
  """
194
+ self._ensure_hydrated(index_name)
169
195
  if filter_expression is not None:
170
196
  raise NotImplementedError(
171
197
  "filter_expression is not supported by the dev backend."
@@ -221,6 +247,31 @@ class DevSearchBackend:
221
247
  took_ms = int((time.perf_counter() - start) * 1000)
222
248
  return SearchResult(hits=hits, total=len(results), took_ms=took_ms)
223
249
 
250
+ def _ensure_hydrated(self, index_name: str) -> None:
251
+ """Hydrate one index once when this backend has opted into the lifecycle."""
252
+ if not self._auto_reindex or index_name in self._hydrated_indexes:
253
+ return
254
+ with self._hydration_lock:
255
+ if index_name in self._hydrated_indexes:
256
+ return
257
+ if index_name in self._hydrating_indexes:
258
+ return
259
+ self._hydrating_indexes.add(index_name)
260
+ try:
261
+ self._reindex_configured_managers(index_name)
262
+ self._hydrated_indexes.add(index_name)
263
+ finally:
264
+ self._hydrating_indexes.discard(index_name)
265
+
266
+ def _reindex_configured_managers(self, index_name: str) -> None:
267
+ """Reindex every manager configured for one index into this process."""
268
+ from general_manager.search.indexer import SearchIndexer
269
+ from general_manager.search.registry import iter_index_configs
270
+
271
+ indexer = SearchIndexer(self)
272
+ for manager_class, _index_config in iter_index_configs(index_name):
273
+ indexer.reindex_manager_index(manager_class, index_name)
274
+
224
275
  @staticmethod
225
276
  def _tokenize_query(query: str) -> list[str]:
226
277
  """
@@ -230,9 +281,9 @@ class DevSearchBackend:
230
281
  query (str): The input query string to tokenize.
231
282
 
232
283
  Returns:
233
- list[str]: A list of lowercase tokens extracted from the query; empty tokens are omitted.
284
+ list[str]: Distinct lowercase tokens extracted from the query in first-seen order.
234
285
  """
235
- return [token for token in query.lower().split() if token]
286
+ return list(dict.fromkeys(query.lower().split()))
236
287
 
237
288
  def _tokenize_document(self, document: SearchDocument) -> dict[str, set[str]]:
238
289
  """
@@ -284,7 +335,11 @@ class DevSearchBackend:
284
335
  """
285
336
  Compute a relevance score for a document based on matching query tokens and configured boosts.
286
337
 
287
- Each time a token from `tokens` is present in a field's token set (or is a prefix of a field token) the field's boost is added to the score. After summing matches across all fields, the total is multiplied by `document.index_boost` when it is set.
338
+ Every distinct query token must be present in at least one field's token
339
+ set (or be a prefix of a field token). For each matching token, the
340
+ boosts of all matching fields are added to the score. After summing
341
+ matches across all fields, the total is multiplied by
342
+ `document.index_boost` when it is set.
288
343
 
289
344
  Parameters:
290
345
  tokens: The list of query tokens to match against the document's token index.
@@ -297,13 +352,17 @@ class DevSearchBackend:
297
352
  return 0.0
298
353
  token_index = token_index or {}
299
354
  score = 0.0
300
- for field_name, field_tokens in token_index.items():
301
- field_boost = document.field_boosts.get(field_name, 1.0)
302
- for token in tokens:
355
+ for token in tokens:
356
+ token_score = 0.0
357
+ for field_name, field_tokens in token_index.items():
358
+ field_boost = document.field_boosts.get(field_name, 1.0)
303
359
  if token in field_tokens or any(
304
360
  field_token.startswith(token) for field_token in field_tokens
305
361
  ):
306
- score += field_boost
362
+ token_score += field_boost
363
+ if token_score <= 0:
364
+ return 0.0
365
+ score += token_score
307
366
  if document.index_boost:
308
367
  score *= document.index_boost
309
368
  return score
File without changes