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