GeneralManager 0.80.8__tar.gz → 0.81.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.
- {generalmanager-0.80.8/src/GeneralManager.egg-info → generalmanager-0.81.0}/PKG-INFO +1 -1
- {generalmanager-0.80.8 → generalmanager-0.81.0}/pyproject.toml +1 -1
- {generalmanager-0.80.8 → generalmanager-0.81.0/src/GeneralManager.egg-info}/PKG-INFO +1 -1
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/SOURCES.txt +4 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/cache.py +4 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/general_manager.py +18 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/manager.py +10 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql.py +13 -3
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_invalidation.py +13 -3
- generalmanager-0.81.0/src/general_manager/cache/batch_refresh.py +139 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_index.py +5 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/signals.py +46 -8
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/base_interface.py +52 -3
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/database.py +4 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/base.py +35 -0
- generalmanager-0.81.0/src/general_manager/interface/capabilities/orm/bulk.py +846 -0
- generalmanager-0.81.0/src/general_manager/interface/capabilities/orm/create_many.py +460 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/mutations.py +76 -4
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/capability_manifest.py +3 -1
- generalmanager-0.81.0/src/general_manager/manager/bulk_create.py +374 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/general_manager.py +29 -4
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/public_api_registry.py +58 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/invalidation.py +130 -12
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/signal_bridge.py +29 -2
- {generalmanager-0.80.8 → generalmanager-0.81.0}/LICENSE +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/README.md +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/setup.cfg +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/dependency_links.txt +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/requires.txt +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/GeneralManager.egg-info/top_level.txt +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/api.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/dataframes.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/factory.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/interface.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/measurement.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/permission.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/rule.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/search.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/utils.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_as_of.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_errors.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_groups.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_mutations.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_ordering.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_output.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_prefetch.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_relations.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_resolvers.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_search.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_subscription_consumer.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_subscriptions.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_type.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_view.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_warmup.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_warmup_registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/graphql_warmup_tasks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/mutation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/notification_batching.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/property.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_api.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_invalidation_client.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/apps.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/as_of.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bootstrap.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/_materialized_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/_ordering.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/base_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/calculation_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/database_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/excel_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/group_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/indexing.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/projection.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/bucket/request_bucket.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/_dependency_graph.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/cache_decorator.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/cache_tracker.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/data_change_context.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_cache.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_matching.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_publish.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_shards.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/model_dependency_collector.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/run_context.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/run_context_lru.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/audit.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/bootstrap.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/checks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/consumer.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/context.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/errors.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/__main__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/baseline.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/basic_queries.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/demo_readiness.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/edge_cases.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/follow_ups.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/large_schema.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/multi_hop.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/datasets/planned_orchestration.yaml +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/diagnostics.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/fingerprints.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/fixtures.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/answer_quality.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/contract.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/result_accuracy.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/judges/tool_sequence.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/readiness.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/runner.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/evals/traces.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/grounding.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/budget.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/calculations.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/catalog.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/config.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/events.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/evidence.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/planner.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/provider_calls.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/resolver.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/routing.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/scheduler.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/synthesis.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/planned/validation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/_shared.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/anthropic.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/base.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/google.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/ollama.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/providers/openai.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/rate_limits.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/routing.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/schema_index.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/settings.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/signals.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/system_prompt.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/tool_metadata.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/tools.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/turns.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/chat/views.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/conf.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/dataframes/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/dataframes/measurements.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/auto_factory.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/factories.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/factory/factory_methods.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/calculation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/excel.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/remote_manager.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/request.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/builtin.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/_compat.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/input_resolution.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/calculation/lifecycle.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/configuration.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/core/observability.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/core/utils.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/excel/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/exceptions.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/existing_model/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/existing_model/_compat.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/existing_model/resolution.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/factory.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/_compat.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/history.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/lifecycle.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm/support.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/django_manager_utils.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/field_descriptors.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/payload_normalizer.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/orm_utils/update_state.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/_compat.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/_types.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/lifecycle.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/read_only/management.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/remote_manager.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/request/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/excel.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/excel_store.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/excel_workbook.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/infrastructure/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/infrastructure/startup_hooks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/infrastructure/system_checks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/calculation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/database.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/excel.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/existing_model.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/read_only.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/remote_manager.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/interfaces/request.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/capability_builder.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/manifests/capability_models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/orm_interface.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/requests.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/database_interface_protocols.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/errors.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/history.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/utils/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/logging.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/chat_cleanup.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/cleanup_upload_intents.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/graphql_warmup.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/graphql_warmup_refresh_due.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/search_index.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/search_reconcile.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/seed_manager_landscape.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/shell.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/workflow_drain_outbox.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/management/commands/workflow_replay_dead_letters.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/group_manager.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/input.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/manager/meta.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/measurement/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/measurement/measurement.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/measurement/measurement_field.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/metrics/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/metrics/graphql.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0001_initial.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0002_workflow_outbox_scaling_indexes.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0003_workflow_execution_correlation_constraint.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0004_chat_persistence_models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0004_search_index_state.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0005_merge_chat_search.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0006_chat_pending_confirmation_scoped_ids.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0007_upload_intent.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0008_upload_finalization_versions.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0009_upload_cleanup_state.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0010_chat_pending_confirmation_portable_uniqueness.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0011_search_index_state_dirty_generation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/0012_chat_context_watermarks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/migrations/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/audit.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/base_permission.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/graphql_capabilities.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/manager_based_permission.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/mutation_permission.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/permission_checks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/permission_data_manager.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/permission/utils.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/py.typed +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/rule/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/rule/handler.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/rule/rule.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/async_tasks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backend.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backend_registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/dev.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/meilisearch.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/opensearch.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/backends/typesense.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/checks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/config.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/indexer.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/m2m_invalidation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/reconciliation.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/tasks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/search/utils.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/seeding/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/seeding/manager_landscape.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/adapters.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/checks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/config.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/errors.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/finalization.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/graphql.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/graphql_types.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/metrics.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/public.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/s3.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/services.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/tokens.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/types.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/urls.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/uploads/views.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_args_to_kwargs.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_cache_key_encoder.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_make_cache_key.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/_none_to_zero.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/filter_parser.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/format_string.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/json_encoder.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/path_mapping.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/public_api.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/testing.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/utils/type_checks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/actions.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backend_registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/__init__.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/celery.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/local.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/backends/n8n.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/config.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/engine.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/event_registry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/events.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/models.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/tasks.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/workflow/telemetry.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/tests/test_settings.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/tests/test_urls.py +0 -0
- {generalmanager-0.80.8 → generalmanager-0.81.0}/tests/testing_asgi.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.81.0
|
|
4
4
|
Summary: Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching.
|
|
5
5
|
Author-email: Tim Kleindick <tkleindick@yahoo.de>
|
|
6
6
|
License: MIT License
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "GeneralManager"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.81.0"
|
|
8
8
|
description = "Modular Django-based data management framework with ORM, GraphQL, fine-grained permissions, rule validation, calculations and caching."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
authors = [{ name = "Tim Kleindick", email = "tkleindick@yahoo.de" }]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: GeneralManager
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.81.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
|
|
@@ -68,6 +68,7 @@ src/general_manager/bucket/projection.py
|
|
|
68
68
|
src/general_manager/bucket/request_bucket.py
|
|
69
69
|
src/general_manager/cache/__init__.py
|
|
70
70
|
src/general_manager/cache/_dependency_graph.py
|
|
71
|
+
src/general_manager/cache/batch_refresh.py
|
|
71
72
|
src/general_manager/cache/cache_decorator.py
|
|
72
73
|
src/general_manager/cache/cache_tracker.py
|
|
73
74
|
src/general_manager/cache/data_change_context.py
|
|
@@ -181,6 +182,8 @@ src/general_manager/interface/capabilities/existing_model/_compat.py
|
|
|
181
182
|
src/general_manager/interface/capabilities/existing_model/resolution.py
|
|
182
183
|
src/general_manager/interface/capabilities/orm/__init__.py
|
|
183
184
|
src/general_manager/interface/capabilities/orm/_compat.py
|
|
185
|
+
src/general_manager/interface/capabilities/orm/bulk.py
|
|
186
|
+
src/general_manager/interface/capabilities/orm/create_many.py
|
|
184
187
|
src/general_manager/interface/capabilities/orm/history.py
|
|
185
188
|
src/general_manager/interface/capabilities/orm/lifecycle.py
|
|
186
189
|
src/general_manager/interface/capabilities/orm/mutations.py
|
|
@@ -227,6 +230,7 @@ src/general_manager/management/commands/shell.py
|
|
|
227
230
|
src/general_manager/management/commands/workflow_drain_outbox.py
|
|
228
231
|
src/general_manager/management/commands/workflow_replay_dead_letters.py
|
|
229
232
|
src/general_manager/manager/__init__.py
|
|
233
|
+
src/general_manager/manager/bulk_create.py
|
|
230
234
|
src/general_manager/manager/general_manager.py
|
|
231
235
|
src/general_manager/manager/group_manager.py
|
|
232
236
|
src/general_manager/manager/input.py
|
|
@@ -3,11 +3,13 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
|
+
"BatchRefreshDisconnect",
|
|
6
7
|
"CacheBackend",
|
|
7
8
|
"CalculationRunContext",
|
|
8
9
|
"Dependency",
|
|
9
10
|
"DependencyTracker",
|
|
10
11
|
"cached",
|
|
12
|
+
"connect_batch_refresh_receiver",
|
|
11
13
|
"current_calculation_run_context",
|
|
12
14
|
"ensure_calculation_run_context",
|
|
13
15
|
"invalidate_cache_key",
|
|
@@ -17,11 +19,13 @@ __all__ = [
|
|
|
17
19
|
"serialize_dependency_identifier",
|
|
18
20
|
]
|
|
19
21
|
|
|
22
|
+
from general_manager.cache.batch_refresh import BatchRefreshDisconnect
|
|
20
23
|
from general_manager.cache.cache_decorator import CacheBackend
|
|
21
24
|
from general_manager.cache.run_context import CalculationRunContext
|
|
22
25
|
from general_manager.cache.dependency_index import Dependency
|
|
23
26
|
from general_manager.cache.cache_tracker import DependencyTracker
|
|
24
27
|
from general_manager.cache.cache_decorator import cached
|
|
28
|
+
from general_manager.cache.batch_refresh import connect_batch_refresh_receiver
|
|
25
29
|
from general_manager.cache.run_context import current_calculation_run_context
|
|
26
30
|
from general_manager.cache.run_context import ensure_calculation_run_context
|
|
27
31
|
from general_manager.cache.dependency_index import invalidate_cache_key
|
{generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/_types/general_manager.py
RENAMED
|
@@ -4,7 +4,14 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
6
|
"AdditiveManagerPermission",
|
|
7
|
+
"BatchRefreshDisconnect",
|
|
8
|
+
"BulkCreateEligibility",
|
|
7
9
|
"CalculationInterface",
|
|
10
|
+
"CreateManyBatchResult",
|
|
11
|
+
"CreateManyError",
|
|
12
|
+
"CreateManyInvalidBatchSizeError",
|
|
13
|
+
"CreateManyPostCommitError",
|
|
14
|
+
"CreateManyUnsupportedError",
|
|
8
15
|
"DatabaseInterface",
|
|
9
16
|
"ExcelCharField",
|
|
10
17
|
"ExcelDecimalField",
|
|
@@ -30,8 +37,10 @@ __all__ = [
|
|
|
30
37
|
"SearchConfigSpec",
|
|
31
38
|
"SearchIndexer",
|
|
32
39
|
"SearchInvalidationRule",
|
|
40
|
+
"bulk_create_eligibility",
|
|
33
41
|
"configure_search_backend",
|
|
34
42
|
"configure_search_backend_from_settings",
|
|
43
|
+
"connect_batch_refresh_receiver",
|
|
35
44
|
"get_logger",
|
|
36
45
|
"get_search_backend",
|
|
37
46
|
"graph_ql_mutation",
|
|
@@ -45,7 +54,14 @@ __all__ = [
|
|
|
45
54
|
from general_manager.permission.manager_based_permission import (
|
|
46
55
|
AdditiveManagerPermission,
|
|
47
56
|
)
|
|
57
|
+
from general_manager.cache.batch_refresh import BatchRefreshDisconnect
|
|
58
|
+
from general_manager.interface.capabilities.orm.bulk import BulkCreateEligibility
|
|
48
59
|
from general_manager.interface.interfaces.calculation import CalculationInterface
|
|
60
|
+
from general_manager.manager.bulk_create import CreateManyBatchResult
|
|
61
|
+
from general_manager.manager.bulk_create import CreateManyError
|
|
62
|
+
from general_manager.manager.bulk_create import CreateManyInvalidBatchSizeError
|
|
63
|
+
from general_manager.manager.bulk_create import CreateManyPostCommitError
|
|
64
|
+
from general_manager.manager.bulk_create import CreateManyUnsupportedError
|
|
49
65
|
from general_manager.interface.interfaces.database import DatabaseInterface
|
|
50
66
|
from general_manager.interface.excel import ExcelCharField
|
|
51
67
|
from general_manager.interface.excel import ExcelDecimalField
|
|
@@ -73,10 +89,12 @@ from general_manager.search.config import SearchConfigProtocol
|
|
|
73
89
|
from general_manager.search.config import SearchConfigSpec
|
|
74
90
|
from general_manager.search.indexer import SearchIndexer
|
|
75
91
|
from general_manager.search.config import SearchInvalidationRule
|
|
92
|
+
from general_manager.interface.capabilities.orm.bulk import bulk_create_eligibility
|
|
76
93
|
from general_manager.search.backend_registry import configure_search_backend
|
|
77
94
|
from general_manager.search.backend_registry import (
|
|
78
95
|
configure_search_backend_from_settings,
|
|
79
96
|
)
|
|
97
|
+
from general_manager.cache.batch_refresh import connect_batch_refresh_receiver
|
|
80
98
|
from general_manager.logging import get_logger
|
|
81
99
|
from general_manager.search.backend_registry import get_search_backend
|
|
82
100
|
from general_manager.api.mutation import graph_ql_mutation
|
|
@@ -3,6 +3,11 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
__all__ = [
|
|
6
|
+
"CreateManyBatchResult",
|
|
7
|
+
"CreateManyError",
|
|
8
|
+
"CreateManyInvalidBatchSizeError",
|
|
9
|
+
"CreateManyPostCommitError",
|
|
10
|
+
"CreateManyUnsupportedError",
|
|
6
11
|
"DateRangeDomain",
|
|
7
12
|
"GeneralManager",
|
|
8
13
|
"GeneralManagerMeta",
|
|
@@ -15,6 +20,11 @@ __all__ = [
|
|
|
15
20
|
"graph_ql_property",
|
|
16
21
|
]
|
|
17
22
|
|
|
23
|
+
from general_manager.manager.bulk_create import CreateManyBatchResult
|
|
24
|
+
from general_manager.manager.bulk_create import CreateManyError
|
|
25
|
+
from general_manager.manager.bulk_create import CreateManyInvalidBatchSizeError
|
|
26
|
+
from general_manager.manager.bulk_create import CreateManyPostCommitError
|
|
27
|
+
from general_manager.manager.bulk_create import CreateManyUnsupportedError
|
|
18
28
|
from general_manager.manager.input import DateRangeDomain
|
|
19
29
|
from general_manager.manager.general_manager import GeneralManager
|
|
20
30
|
from general_manager.manager.meta import GeneralManagerMeta
|
|
@@ -2271,12 +2271,22 @@ class GraphQL:
|
|
|
2271
2271
|
if identification is not None
|
|
2272
2272
|
else event_instance.identification
|
|
2273
2273
|
)
|
|
2274
|
-
|
|
2275
|
-
|
|
2274
|
+
from general_manager.manager.bulk_create import current_create_many_batch
|
|
2275
|
+
|
|
2276
|
+
batch = current_create_many_batch(database_alias)
|
|
2277
|
+
|
|
2278
|
+
def callback() -> None:
|
|
2279
|
+
cls._publish_data_change(
|
|
2276
2280
|
manager_class,
|
|
2277
2281
|
action,
|
|
2278
2282
|
event_identification,
|
|
2279
|
-
)
|
|
2283
|
+
)
|
|
2284
|
+
|
|
2285
|
+
if batch is not None and batch.manager_class is manager_class:
|
|
2286
|
+
batch.notification_callbacks.append(callback)
|
|
2287
|
+
return
|
|
2288
|
+
transaction.on_commit(
|
|
2289
|
+
callback,
|
|
2280
2290
|
using=database_alias,
|
|
2281
2291
|
)
|
|
2282
2292
|
finally:
|
{generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/api/remote_invalidation.py
RENAMED
|
@@ -214,12 +214,22 @@ def emit_remote_invalidation(
|
|
|
214
214
|
captured_identification = (
|
|
215
215
|
deepcopy(event_identification) if event_identification is not None else None
|
|
216
216
|
)
|
|
217
|
-
|
|
218
|
-
|
|
217
|
+
from general_manager.manager.bulk_create import current_create_many_batch
|
|
218
|
+
|
|
219
|
+
batch = current_create_many_batch(database_alias)
|
|
220
|
+
|
|
221
|
+
def callback() -> None:
|
|
222
|
+
_publish_remote_invalidation(
|
|
219
223
|
config,
|
|
220
224
|
action,
|
|
221
225
|
captured_identification,
|
|
222
|
-
)
|
|
226
|
+
)
|
|
227
|
+
|
|
228
|
+
if batch is not None and batch.manager_class is sender:
|
|
229
|
+
batch.notification_callbacks.append(callback)
|
|
230
|
+
return
|
|
231
|
+
transaction.on_commit(
|
|
232
|
+
callback,
|
|
223
233
|
using=database_alias,
|
|
224
234
|
)
|
|
225
235
|
finally:
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"""Opt-in refresh callbacks that understand ``GeneralManager.create_many``.
|
|
2
|
+
|
|
3
|
+
The registration point is intentionally separate from the private data-change
|
|
4
|
+
signals. Applications may register a cache or projection refresh without
|
|
5
|
+
having to disconnect framework receivers in order to make an import efficient.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from collections.abc import Callable, Mapping
|
|
11
|
+
from copy import deepcopy
|
|
12
|
+
from dataclasses import dataclass
|
|
13
|
+
from types import MappingProxyType
|
|
14
|
+
from typing import TYPE_CHECKING, cast
|
|
15
|
+
from weakref import WeakSet
|
|
16
|
+
|
|
17
|
+
from django.db import transaction
|
|
18
|
+
|
|
19
|
+
from general_manager.cache.signals import post_data_change
|
|
20
|
+
|
|
21
|
+
if TYPE_CHECKING: # pragma: no cover
|
|
22
|
+
from general_manager.manager.bulk_create import CreateManyBatchContext
|
|
23
|
+
from general_manager.manager.general_manager import GeneralManager
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
BatchRefreshCallback = Callable[
|
|
27
|
+
[type["GeneralManager"], tuple[Mapping[str, object], ...], str, str], None
|
|
28
|
+
]
|
|
29
|
+
_registered_receivers: WeakSet[Callable[..., None]] = WeakSet()
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
@dataclass(frozen=True)
|
|
33
|
+
class BatchRefreshDisconnect:
|
|
34
|
+
"""A small, idempotent handle returned by batch-refresh registration."""
|
|
35
|
+
|
|
36
|
+
receiver: Callable[..., None]
|
|
37
|
+
|
|
38
|
+
def disconnect(self) -> None:
|
|
39
|
+
"""Remove this callback without affecting unrelated signal receivers."""
|
|
40
|
+
post_data_change.disconnect(self.receiver)
|
|
41
|
+
|
|
42
|
+
def __call__(self) -> None:
|
|
43
|
+
self.disconnect()
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def connect_batch_refresh_receiver(
|
|
47
|
+
callback: BatchRefreshCallback,
|
|
48
|
+
*,
|
|
49
|
+
on_commit: bool = False,
|
|
50
|
+
) -> BatchRefreshDisconnect:
|
|
51
|
+
"""Register a cache refresh callback for ordinary and batched mutations.
|
|
52
|
+
|
|
53
|
+
Callbacks run inside the mutation transaction by default. Passing
|
|
54
|
+
``on_commit=True`` defers ordinary changes and a successfully committed
|
|
55
|
+
``create_many`` batch until its transaction is durable. A bulk SQL batch
|
|
56
|
+
records all identifiers and invokes a registered callback once; canonical
|
|
57
|
+
row-by-row batches deliberately retain their ordinary per-row timing.
|
|
58
|
+
Identifications are full, read-only mapping snapshots, including composite
|
|
59
|
+
keys. Missing identification mappings are rejected instead of losing keys.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
def receiver(
|
|
63
|
+
sender: type["GeneralManager"],
|
|
64
|
+
*,
|
|
65
|
+
identification: Mapping[str, object] | None = None,
|
|
66
|
+
instance: object | None = None,
|
|
67
|
+
action: str | None = None,
|
|
68
|
+
database_alias: str = "default",
|
|
69
|
+
**_: object,
|
|
70
|
+
) -> None:
|
|
71
|
+
if action not in {"create", "update", "delete"}:
|
|
72
|
+
return
|
|
73
|
+
from general_manager.manager.bulk_create import current_create_many_batch
|
|
74
|
+
|
|
75
|
+
batch = current_create_many_batch(database_alias)
|
|
76
|
+
identification_value = identification
|
|
77
|
+
if identification_value is None and instance is not None:
|
|
78
|
+
identification_value = getattr(instance, "identification", None)
|
|
79
|
+
if not isinstance(identification_value, Mapping):
|
|
80
|
+
message = "Batch refresh requires an identification mapping."
|
|
81
|
+
raise TypeError(message)
|
|
82
|
+
identification_snapshot = MappingProxyType(deepcopy(dict(identification_value)))
|
|
83
|
+
|
|
84
|
+
def invoke() -> None:
|
|
85
|
+
callback(sender, (identification_snapshot,), action, database_alias)
|
|
86
|
+
|
|
87
|
+
# The SQL path has already performed the publication barrier and asks
|
|
88
|
+
# us to aggregate. Canonical batches keep their legacy receiver timing.
|
|
89
|
+
if (
|
|
90
|
+
batch is not None
|
|
91
|
+
and batch.manager_class is sender
|
|
92
|
+
and getattr(batch, "bulk_sql_active", False)
|
|
93
|
+
):
|
|
94
|
+
registration = batch.batch_refresh_callbacks.setdefault(
|
|
95
|
+
id(receiver), (callback, on_commit, action, [])
|
|
96
|
+
)
|
|
97
|
+
registration[3].append(identification_snapshot)
|
|
98
|
+
return
|
|
99
|
+
|
|
100
|
+
if on_commit:
|
|
101
|
+
transaction.on_commit(invoke, using=database_alias)
|
|
102
|
+
else:
|
|
103
|
+
invoke()
|
|
104
|
+
|
|
105
|
+
post_data_change.connect(receiver, weak=False)
|
|
106
|
+
_registered_receivers.add(receiver)
|
|
107
|
+
return BatchRefreshDisconnect(receiver)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def flush_batch_refresh_callbacks(context: "CreateManyBatchContext") -> None:
|
|
111
|
+
"""Run registered callbacks once after an eligible SQL create batch."""
|
|
112
|
+
callbacks = context.batch_refresh_callbacks
|
|
113
|
+
database_alias = context.database_alias
|
|
114
|
+
sender = cast(type["GeneralManager"], context.manager_class)
|
|
115
|
+
for raw_callback, on_commit, action, identifiers in tuple(callbacks.values()):
|
|
116
|
+
callback = cast(BatchRefreshCallback, raw_callback)
|
|
117
|
+
frozen_ids = tuple(identifiers)
|
|
118
|
+
|
|
119
|
+
def invoke(
|
|
120
|
+
callback: BatchRefreshCallback = callback,
|
|
121
|
+
frozen_ids: tuple[Mapping[str, object], ...] = frozen_ids,
|
|
122
|
+
action: str = action,
|
|
123
|
+
) -> None:
|
|
124
|
+
callback(sender, frozen_ids, action, database_alias)
|
|
125
|
+
|
|
126
|
+
if on_commit:
|
|
127
|
+
transaction.on_commit(invoke, using=database_alias)
|
|
128
|
+
else:
|
|
129
|
+
invoke()
|
|
130
|
+
callbacks.clear()
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def is_batch_refresh_receiver(receiver: object) -> bool:
|
|
134
|
+
"""Return whether ``receiver`` is one created by this public helper."""
|
|
135
|
+
try:
|
|
136
|
+
return receiver in _registered_receivers
|
|
137
|
+
except TypeError:
|
|
138
|
+
# Application signal receivers may be callable, unhashable objects.
|
|
139
|
+
return False
|
{generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/cache/dependency_index.py
RENAMED
|
@@ -1689,6 +1689,11 @@ def generic_cache_invalidation(
|
|
|
1689
1689
|
old_relevant_values (dict[str, object]): Mapping of lookup paths (joined by "__") to their values as captured before the change; used to compare old vs. new values for invalidation decisions.
|
|
1690
1690
|
database_alias (str): Database alias used to attribute invalidation timing.
|
|
1691
1691
|
"""
|
|
1692
|
+
from general_manager.manager.bulk_create import current_create_many_batch
|
|
1693
|
+
|
|
1694
|
+
batch = current_create_many_batch(database_alias)
|
|
1695
|
+
if batch is not None and batch.manager_class is sender and batch.bulk_sql_active:
|
|
1696
|
+
return
|
|
1692
1697
|
started = perf_counter()
|
|
1693
1698
|
try:
|
|
1694
1699
|
invalidated_cache_keys = _invalidate_manager_cache_for_instance_change(
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
-
from contextlib import nullcontext
|
|
5
|
+
from contextlib import AbstractContextManager, nullcontext
|
|
6
6
|
from copy import deepcopy
|
|
7
7
|
from functools import wraps
|
|
8
8
|
from time import perf_counter
|
|
@@ -101,7 +101,7 @@ def data_change(
|
|
|
101
101
|
)
|
|
102
102
|
|
|
103
103
|
@wraps(decorator_source)
|
|
104
|
-
def
|
|
104
|
+
def perform_change(*args: P.args, **kwargs: P.kwargs) -> R:
|
|
105
105
|
"""
|
|
106
106
|
Emit pre_data_change and post_data_change signals around the wrapped function call.
|
|
107
107
|
|
|
@@ -124,6 +124,12 @@ def data_change(
|
|
|
124
124
|
)
|
|
125
125
|
from general_manager.cache.run_context import current_calculation_run_context
|
|
126
126
|
from general_manager.interface.orm_interface import OrmInterfaceBase
|
|
127
|
+
from general_manager.manager.bulk_create import (
|
|
128
|
+
CreateManyUnsupportedError,
|
|
129
|
+
current_create_many_batch,
|
|
130
|
+
enclosing_create_many_batch,
|
|
131
|
+
validate_create_many_history,
|
|
132
|
+
)
|
|
127
133
|
|
|
128
134
|
action = decorator_source.__name__
|
|
129
135
|
if action == "create":
|
|
@@ -140,9 +146,29 @@ def data_change(
|
|
|
140
146
|
database_alias = DEFAULT_DB_ALIAS
|
|
141
147
|
if is_orm_backed:
|
|
142
148
|
database_alias = getattr(interface, "database", None) or DEFAULT_DB_ALIAS
|
|
149
|
+
batch_envelope = enclosing_create_many_batch()
|
|
150
|
+
if batch_envelope is not None and (
|
|
151
|
+
not is_orm_backed or database_alias != batch_envelope.database_alias
|
|
152
|
+
):
|
|
153
|
+
raise CreateManyUnsupportedError.routing()
|
|
154
|
+
if batch_envelope is not None:
|
|
155
|
+
validate_create_many_history(getattr(interface, "_model", None))
|
|
143
156
|
change_context: dict[str, object] = {}
|
|
144
157
|
signal_kwargs = {
|
|
145
|
-
**
|
|
158
|
+
**{
|
|
159
|
+
key: value
|
|
160
|
+
for key, value in kwargs.items()
|
|
161
|
+
if key
|
|
162
|
+
not in {
|
|
163
|
+
"sender",
|
|
164
|
+
"signal",
|
|
165
|
+
"instance",
|
|
166
|
+
"action",
|
|
167
|
+
"previous_instance",
|
|
168
|
+
"identification",
|
|
169
|
+
"old_relevant_values",
|
|
170
|
+
}
|
|
171
|
+
},
|
|
146
172
|
"change_context": change_context,
|
|
147
173
|
"database_alias": database_alias,
|
|
148
174
|
}
|
|
@@ -159,11 +185,16 @@ def data_change(
|
|
|
159
185
|
context.clear_bucket_projections()
|
|
160
186
|
context.clear_trusted_orm_managers()
|
|
161
187
|
try:
|
|
162
|
-
transaction_context
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
188
|
+
transaction_context: AbstractContextManager[None]
|
|
189
|
+
if not is_orm_backed:
|
|
190
|
+
transaction_context = nullcontext()
|
|
191
|
+
elif current_create_many_batch(database_alias) is None:
|
|
192
|
+
transaction_context = transaction.atomic(using=database_alias)
|
|
193
|
+
else:
|
|
194
|
+
transaction_context = transaction.atomic(
|
|
195
|
+
using=database_alias,
|
|
196
|
+
savepoint=False,
|
|
197
|
+
)
|
|
167
198
|
caller_in_atomic_block = (
|
|
168
199
|
_caller_in_atomic_block(database_alias) if is_orm_backed else False
|
|
169
200
|
)
|
|
@@ -322,4 +353,11 @@ def data_change(
|
|
|
322
353
|
except Exception:
|
|
323
354
|
logger.exception("GraphQL warm-up requeue failed.")
|
|
324
355
|
|
|
356
|
+
@wraps(decorator_source)
|
|
357
|
+
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
|
|
358
|
+
from general_manager.manager.bulk_create import create_many_signal_scope
|
|
359
|
+
|
|
360
|
+
with create_many_signal_scope():
|
|
361
|
+
return perform_change(*args, **kwargs)
|
|
362
|
+
|
|
325
363
|
return wrapper
|
{generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/base_interface.py
RENAMED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
from abc import ABC
|
|
5
|
-
from collections.abc import Awaitable, Mapping
|
|
5
|
+
from collections.abc import Awaitable, Iterator, Mapping
|
|
6
6
|
from dataclasses import dataclass
|
|
7
7
|
from functools import wraps
|
|
8
8
|
import inspect
|
|
@@ -31,7 +31,11 @@ from general_manager.as_of import (
|
|
|
31
31
|
)
|
|
32
32
|
from general_manager.utils._args_to_kwargs import args_to_kwargs
|
|
33
33
|
from general_manager.api.property import GraphQLProperty
|
|
34
|
-
from general_manager.interface.capabilities.base import
|
|
34
|
+
from general_manager.interface.capabilities.base import (
|
|
35
|
+
Capability,
|
|
36
|
+
CapabilityName,
|
|
37
|
+
CreateManyCapability,
|
|
38
|
+
)
|
|
35
39
|
from general_manager.interface.capabilities.configuration import (
|
|
36
40
|
CapabilityConfigEntry,
|
|
37
41
|
InterfaceCapabilityConfig,
|
|
@@ -42,6 +46,7 @@ from general_manager.interface.infrastructure.startup_hooks import register_star
|
|
|
42
46
|
from general_manager.interface.infrastructure.system_checks import register_system_check
|
|
43
47
|
|
|
44
48
|
if TYPE_CHECKING:
|
|
49
|
+
from general_manager.manager.bulk_create import CreateManyBatchResult
|
|
45
50
|
from general_manager.manager.input import Input
|
|
46
51
|
from general_manager.manager.general_manager import GeneralManager
|
|
47
52
|
from general_manager.bucket.base_bucket import Bucket
|
|
@@ -333,7 +338,7 @@ class InterfaceBase(ABC):
|
|
|
333
338
|
This method resets per-subclass capability registries and configuration to a clean default, merges configured capability overrides into the class's capability_overrides mapping, and clears the flag that marks configured capabilities as applied. Keyword arguments are forwarded to the superclass implementation.
|
|
334
339
|
"""
|
|
335
340
|
super().__init_subclass__(**kwargs)
|
|
336
|
-
for mutation_name in ("create", "update", "delete"):
|
|
341
|
+
for mutation_name in ("create", "create_many", "update", "delete"):
|
|
337
342
|
_guard_declared_mutation(cls, mutation_name)
|
|
338
343
|
cls._input_parsing_plan = None
|
|
339
344
|
cls._input_dependency_order = None
|
|
@@ -1163,6 +1168,50 @@ class InterfaceBase(ABC):
|
|
|
1163
1168
|
observer=observer,
|
|
1164
1169
|
)
|
|
1165
1170
|
|
|
1171
|
+
@classmethod
|
|
1172
|
+
def create_many(
|
|
1173
|
+
cls,
|
|
1174
|
+
records: Iterable[Mapping[str, object]],
|
|
1175
|
+
*,
|
|
1176
|
+
manager_class: type[GeneralManager] | None = None,
|
|
1177
|
+
creator_id: int | None = None,
|
|
1178
|
+
history_comment: str | None = None,
|
|
1179
|
+
ignore_permission: bool = False,
|
|
1180
|
+
batch_size: int = 1000,
|
|
1181
|
+
) -> Iterator[CreateManyBatchResult]:
|
|
1182
|
+
"""Dispatch to an optional backend-owned batch capability.
|
|
1183
|
+
|
|
1184
|
+
Without a callable handler this raises CreateManyUnsupportedError before
|
|
1185
|
+
touching records. The handler owns lazy iteration, atomicity, permission,
|
|
1186
|
+
identity, lifecycle and observability guarantees; see CreateManyCapability.
|
|
1187
|
+
A direct interface call uses its owning manager unless explicitly supplied.
|
|
1188
|
+
"""
|
|
1189
|
+
from general_manager.manager.bulk_create import (
|
|
1190
|
+
CreateManyInvalidBatchSizeError,
|
|
1191
|
+
CreateManyUnsupportedError,
|
|
1192
|
+
)
|
|
1193
|
+
|
|
1194
|
+
reject_historical_mutation()
|
|
1195
|
+
if (
|
|
1196
|
+
isinstance(batch_size, bool)
|
|
1197
|
+
or not isinstance(batch_size, int)
|
|
1198
|
+
or batch_size <= 0
|
|
1199
|
+
):
|
|
1200
|
+
raise CreateManyInvalidBatchSizeError
|
|
1201
|
+
handler = cls.get_capability_handler("create_many")
|
|
1202
|
+
if not callable(getattr(handler, "create_many", None)):
|
|
1203
|
+
raise CreateManyUnsupportedError.missing_capability(cls.__name__)
|
|
1204
|
+
owner = manager_class if manager_class is not None else cls._parent_class
|
|
1205
|
+
return cast(CreateManyCapability, handler).create_many(
|
|
1206
|
+
cls,
|
|
1207
|
+
records,
|
|
1208
|
+
manager_class=owner,
|
|
1209
|
+
creator_id=creator_id,
|
|
1210
|
+
history_comment=history_comment,
|
|
1211
|
+
ignore_permission=ignore_permission,
|
|
1212
|
+
batch_size=batch_size,
|
|
1213
|
+
)
|
|
1214
|
+
|
|
1166
1215
|
def update(self, *args: object, **kwargs: object) -> object:
|
|
1167
1216
|
"""
|
|
1168
1217
|
Update the underlying managed record.
|
{generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/bundles/database.py
RENAMED
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from general_manager.interface.capabilities.orm.create_many import (
|
|
6
|
+
OrmCreateManyCapability,
|
|
7
|
+
)
|
|
5
8
|
from general_manager.interface.capabilities.configuration import (
|
|
6
9
|
CapabilitySet,
|
|
7
10
|
InterfaceCapabilityConfig,
|
|
@@ -51,6 +54,7 @@ ORM_WRITABLE_CAPABILITIES: CapabilitySet = CapabilitySet(
|
|
|
51
54
|
*ORM_PERSISTENCE_CAPABILITIES.entries,
|
|
52
55
|
InterfaceCapabilityConfig(OrmMutationCapability),
|
|
53
56
|
InterfaceCapabilityConfig(OrmCreateCapability),
|
|
57
|
+
InterfaceCapabilityConfig(OrmCreateManyCapability),
|
|
54
58
|
InterfaceCapabilityConfig(OrmUpdateCapability),
|
|
55
59
|
InterfaceCapabilityConfig(OrmDeleteCapability),
|
|
56
60
|
),
|
{generalmanager-0.80.8 → generalmanager-0.81.0}/src/general_manager/interface/capabilities/base.py
RENAMED
|
@@ -2,11 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
|
+
from collections.abc import Iterable, Iterator, Mapping
|
|
6
|
+
|
|
5
7
|
from typing import ClassVar, Literal, Protocol, TYPE_CHECKING, runtime_checkable
|
|
6
8
|
|
|
7
9
|
CapabilityName = Literal[
|
|
8
10
|
"read",
|
|
9
11
|
"create",
|
|
12
|
+
"create_many",
|
|
10
13
|
"update",
|
|
11
14
|
"delete",
|
|
12
15
|
"history",
|
|
@@ -37,6 +40,8 @@ Capability names are stable string keys. Interfaces store active names in
|
|
|
37
40
|
"""
|
|
38
41
|
|
|
39
42
|
if TYPE_CHECKING: # pragma: no cover
|
|
43
|
+
from general_manager.manager.general_manager import GeneralManager
|
|
44
|
+
from general_manager.manager.bulk_create import CreateManyBatchResult
|
|
40
45
|
from general_manager.interface.base_interface import InterfaceBase
|
|
41
46
|
|
|
42
47
|
|
|
@@ -86,3 +91,33 @@ class Capability(Protocol):
|
|
|
86
91
|
Exception: Concrete capability implementations define their own
|
|
87
92
|
teardown errors, which propagate unchanged.
|
|
88
93
|
"""
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class CreateManyCapability(Capability, Protocol):
|
|
97
|
+
"""Optional backend batch contract used by InterfaceBase.create_many.
|
|
98
|
+
|
|
99
|
+
A handler validates support before consuming input and returns a lazy,
|
|
100
|
+
bounded iterator. Each batch is atomic, including required history/outbox
|
|
101
|
+
writes; permissions and canonical lifecycle/observability must be preserved
|
|
102
|
+
or an explicitly safe fallback selected. It must recheck historical mutation
|
|
103
|
+
restrictions when the iterator advances. Failed writes and post-commit
|
|
104
|
+
effects remain distinct using CreateManyError/CreateManyPostCommitError.
|
|
105
|
+
Results carry backend-defined opaque ids (including complete mappings),
|
|
106
|
+
accurate provisional/durable counts and an optional Django database alias.
|
|
107
|
+
A backend unable to provide this contract must reject before consumption;
|
|
108
|
+
there is deliberately no row-by-row non-atomic fallback in the dispatcher.
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
def create_many(
|
|
112
|
+
self,
|
|
113
|
+
interface_cls: type[InterfaceBase],
|
|
114
|
+
records: Iterable[Mapping[str, object]],
|
|
115
|
+
*,
|
|
116
|
+
manager_class: type[GeneralManager],
|
|
117
|
+
creator_id: int | None = None,
|
|
118
|
+
history_comment: str | None = None,
|
|
119
|
+
ignore_permission: bool = False,
|
|
120
|
+
batch_size: int = 1000,
|
|
121
|
+
) -> Iterator[CreateManyBatchResult]:
|
|
122
|
+
"""Return progress only after a whole batch has successfully persisted."""
|
|
123
|
+
...
|