lsst-daf-butler 29.2025.4000__tar.gz → 29.2025.4200__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.
- {lsst_daf_butler-29.2025.4000/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4200}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_association.py +19 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_ref.py +10 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_type.py +2 -2
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_registry_shim.py +77 -98
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/__init__.py +3 -0
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/_uuid.py +79 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +15 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_coordinate.py +3 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_elements.py +3 -2
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_records.py +3 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +1 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_driver.py +5 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_expression_strings.py +1 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_query.py +4 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +8 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_query_tree.py +5 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry.py +6 -3
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/_registry_base.py +273 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +1 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -120
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -40
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -65
- {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_common.py +73 -31
- {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_data_coordinates.py +51 -14
- {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_datasets.py +8 -11
- {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_dimension_records.py +7 -8
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_results.py +2 -316
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +1 -147
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/sql_registry.py +2 -777
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_registry.py +202 -451
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_factory.py +2 -2
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_registry.py +3 -219
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +3 -1
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/remote_butler/authentication/cadc.py +106 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeCollections.py +46 -13
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/butler_queries.py +40 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +3 -94
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/tests/server_available.py +53 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/timespan_database_representation.py +8 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_context.py +5 -16
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/SOURCES.txt +8 -8
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_authentication.py +9 -10
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_butler.py +9 -9
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveCollections.py +29 -4
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_gafaelfawr.py +4 -6
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_postgresql.py +6 -3
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_remote.py +3 -7
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_remote_butler.py +7 -54
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_simpleButler.py +3 -4
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_sqlite.py +0 -6
- lsst_daf_butler-29.2025.4200/tests/test_uuid.py +53 -0
- lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/registry/queries/_builder.py +0 -276
- lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/registry/queries/_query.py +0 -1087
- lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/registry/queries/_structs.py +0 -525
- lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -54
- lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/version.py +0 -2
- lsst_daf_butler-29.2025.4000/tests/test_query_relations.py +0 -361
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/README.md +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_versioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 29.2025.
|
|
3
|
+
Version: 29.2025.4200
|
|
4
4
|
Summary: An abstraction layer for reading and writing astronomical data to datastores.
|
|
5
5
|
Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
|
|
6
6
|
License-Expression: BSD-3-Clause OR GPL-3.0-or-later
|
|
@@ -29,15 +29,17 @@ from __future__ import annotations
|
|
|
29
29
|
|
|
30
30
|
__all__ = ("DatasetAssociation",)
|
|
31
31
|
|
|
32
|
-
from collections.abc import Iterator
|
|
32
|
+
from collections.abc import Iterator, Mapping
|
|
33
33
|
from dataclasses import dataclass
|
|
34
34
|
from typing import TYPE_CHECKING, Any
|
|
35
35
|
|
|
36
|
+
from ._collection_type import CollectionType
|
|
36
37
|
from ._dataset_ref import DatasetRef
|
|
37
38
|
from ._dataset_type import DatasetType
|
|
38
39
|
from ._timespan import Timespan
|
|
39
40
|
|
|
40
41
|
if TYPE_CHECKING:
|
|
42
|
+
from ._butler_collections import CollectionInfo
|
|
41
43
|
from .queries._general_query_results import GeneralQueryResults
|
|
42
44
|
|
|
43
45
|
|
|
@@ -66,7 +68,10 @@ class DatasetAssociation:
|
|
|
66
68
|
|
|
67
69
|
@classmethod
|
|
68
70
|
def from_query_result(
|
|
69
|
-
cls,
|
|
71
|
+
cls,
|
|
72
|
+
result: GeneralQueryResults,
|
|
73
|
+
dataset_type: DatasetType,
|
|
74
|
+
collection_info: Mapping[str, CollectionInfo],
|
|
70
75
|
) -> Iterator[DatasetAssociation]:
|
|
71
76
|
"""Construct dataset associations from the result of general query.
|
|
72
77
|
|
|
@@ -79,11 +84,22 @@ class DatasetAssociation:
|
|
|
79
84
|
"timespan" dataset fields for ``dataset_type``.
|
|
80
85
|
dataset_type : `DatasetType`
|
|
81
86
|
Dataset type, query has to include this dataset type.
|
|
87
|
+
collection_info : `~collections.abc.Mapping` [`str`, `CollectionInfo`]
|
|
88
|
+
Mapping from collection name to information about it for all
|
|
89
|
+
collections that may appear in the query results.
|
|
82
90
|
"""
|
|
83
91
|
timespan_key = f"{dataset_type.name}.timespan"
|
|
84
92
|
collection_key = f"{dataset_type.name}.collection"
|
|
85
93
|
for _, refs, row_dict in result.iter_tuples(dataset_type):
|
|
86
|
-
|
|
94
|
+
collection = row_dict[collection_key]
|
|
95
|
+
timespan = row_dict[timespan_key]
|
|
96
|
+
if collection_info[collection].type is not CollectionType.CALIBRATION:
|
|
97
|
+
# This behavior is for backwards compatibility only; in most
|
|
98
|
+
# contexts it makes sense to consider the timespan of a RUN
|
|
99
|
+
# or TAGGED collection to be unbounded, not None, and that's
|
|
100
|
+
# what the query results we're iterating over do.
|
|
101
|
+
timespan = None
|
|
102
|
+
yield DatasetAssociation(refs[0], collection, timespan)
|
|
87
103
|
|
|
88
104
|
def __lt__(self, other: Any) -> bool:
|
|
89
105
|
# Allow sorting of associations
|
{lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_ref.py
RENAMED
|
@@ -42,7 +42,7 @@ import enum
|
|
|
42
42
|
import logging
|
|
43
43
|
import sys
|
|
44
44
|
import uuid
|
|
45
|
-
from collections.abc import Iterable, Mapping
|
|
45
|
+
from collections.abc import Callable, Iterable, Mapping
|
|
46
46
|
from typing import (
|
|
47
47
|
TYPE_CHECKING,
|
|
48
48
|
Annotated,
|
|
@@ -52,6 +52,7 @@ from typing import (
|
|
|
52
52
|
Protocol,
|
|
53
53
|
Self,
|
|
54
54
|
TypeAlias,
|
|
55
|
+
cast,
|
|
55
56
|
runtime_checkable,
|
|
56
57
|
)
|
|
57
58
|
|
|
@@ -63,6 +64,7 @@ from lsst.utils.classes import immutable
|
|
|
63
64
|
from ._config_support import LookupKey
|
|
64
65
|
from ._dataset_type import DatasetType, SerializedDatasetType
|
|
65
66
|
from ._named import NamedKeyDict
|
|
67
|
+
from ._uuid import generate_uuidv7
|
|
66
68
|
from .datastore.stored_file_info import StoredDatastoreItemInfo
|
|
67
69
|
from .dimensions import (
|
|
68
70
|
DataCoordinate,
|
|
@@ -181,7 +183,12 @@ class DatasetIdFactory:
|
|
|
181
183
|
Dataset identifier.
|
|
182
184
|
"""
|
|
183
185
|
if idGenerationMode is DatasetIdGenEnum.UNIQUE:
|
|
184
|
-
|
|
186
|
+
# Earlier versions of this code used UUIDv4. However, totally
|
|
187
|
+
# random IDs create problems for Postgres insert performance,
|
|
188
|
+
# because it scatters index updates randomly around the disk.
|
|
189
|
+
# UUIDv7 has similar uniqueness properties to v4, but IDs generated
|
|
190
|
+
# at the same time are close together in the index.
|
|
191
|
+
return generate_uuidv7()
|
|
185
192
|
else:
|
|
186
193
|
# WARNING: If you modify this code make sure that the order of
|
|
187
194
|
# items in the `items` list below never changes.
|
|
@@ -559,7 +566,7 @@ class DatasetRef:
|
|
|
559
566
|
return ref
|
|
560
567
|
|
|
561
568
|
to_json = to_json_pydantic
|
|
562
|
-
from_json: ClassVar = classmethod(from_json_pydantic)
|
|
569
|
+
from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
|
|
563
570
|
|
|
564
571
|
@classmethod
|
|
565
572
|
def _unpickle(
|
|
@@ -33,7 +33,7 @@ import re
|
|
|
33
33
|
from collections.abc import Callable, Iterable, Mapping
|
|
34
34
|
from copy import deepcopy
|
|
35
35
|
from types import MappingProxyType
|
|
36
|
-
from typing import TYPE_CHECKING, Any, ClassVar
|
|
36
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Self, cast
|
|
37
37
|
|
|
38
38
|
from pydantic import BaseModel, StrictBool, StrictStr
|
|
39
39
|
|
|
@@ -756,7 +756,7 @@ class DatasetType:
|
|
|
756
756
|
return newType
|
|
757
757
|
|
|
758
758
|
to_json = to_json_pydantic
|
|
759
|
-
from_json: ClassVar = classmethod(from_json_pydantic)
|
|
759
|
+
from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
|
|
760
760
|
|
|
761
761
|
def __reduce__(
|
|
762
762
|
self,
|
|
@@ -27,16 +27,17 @@
|
|
|
27
27
|
|
|
28
28
|
from __future__ import annotations
|
|
29
29
|
|
|
30
|
-
__all__ = ("
|
|
30
|
+
__all__ = ("RegistryShim",)
|
|
31
31
|
|
|
32
32
|
import contextlib
|
|
33
33
|
from collections.abc import Iterable, Iterator, Mapping, Sequence
|
|
34
34
|
from typing import TYPE_CHECKING, Any
|
|
35
35
|
|
|
36
36
|
from ._collection_type import CollectionType
|
|
37
|
-
from ._dataset_association import DatasetAssociation
|
|
38
37
|
from ._dataset_ref import DatasetId, DatasetIdGenEnum, DatasetRef
|
|
39
38
|
from ._dataset_type import DatasetType
|
|
39
|
+
from ._exceptions import CalibrationLookupError
|
|
40
|
+
from ._storage_class import StorageClassFactory
|
|
40
41
|
from ._timespan import Timespan
|
|
41
42
|
from .dimensions import (
|
|
42
43
|
DataCoordinate,
|
|
@@ -46,10 +47,11 @@ from .dimensions import (
|
|
|
46
47
|
DimensionRecord,
|
|
47
48
|
DimensionUniverse,
|
|
48
49
|
)
|
|
49
|
-
from .registry import Registry
|
|
50
50
|
from .registry._collection_summary import CollectionSummary
|
|
51
51
|
from .registry._defaults import RegistryDefaults
|
|
52
|
-
from .registry.
|
|
52
|
+
from .registry._exceptions import NoDefaultCollectionError
|
|
53
|
+
from .registry._registry_base import RegistryBase
|
|
54
|
+
from .registry.queries._query_common import resolve_collections
|
|
53
55
|
|
|
54
56
|
if TYPE_CHECKING:
|
|
55
57
|
from .direct_butler import DirectButler
|
|
@@ -57,7 +59,7 @@ if TYPE_CHECKING:
|
|
|
57
59
|
from .registry.interfaces import ObsCoreTableManager
|
|
58
60
|
|
|
59
61
|
|
|
60
|
-
class RegistryShim(
|
|
62
|
+
class RegistryShim(RegistryBase):
|
|
61
63
|
"""Implementation of `Registry` interface exposed to clients by `Butler`.
|
|
62
64
|
|
|
63
65
|
Parameters
|
|
@@ -74,7 +76,7 @@ class RegistryShim(Registry):
|
|
|
74
76
|
"""
|
|
75
77
|
|
|
76
78
|
def __init__(self, butler: DirectButler):
|
|
77
|
-
|
|
79
|
+
super().__init__(butler)
|
|
78
80
|
self._registry = butler._registry
|
|
79
81
|
|
|
80
82
|
def isWriteable(self) -> bool:
|
|
@@ -183,13 +185,76 @@ class RegistryShim(Registry):
|
|
|
183
185
|
*,
|
|
184
186
|
collections: CollectionArgType | None = None,
|
|
185
187
|
timespan: Timespan | None = None,
|
|
188
|
+
datastore_records: bool = False,
|
|
186
189
|
**kwargs: Any,
|
|
187
190
|
) -> DatasetRef | None:
|
|
188
191
|
# Docstring inherited from a base class.
|
|
189
|
-
|
|
190
|
-
datasetType
|
|
192
|
+
if not isinstance(datasetType, DatasetType):
|
|
193
|
+
datasetType = self.getDatasetType(datasetType)
|
|
194
|
+
|
|
195
|
+
dataId = DataCoordinate.standardize(
|
|
196
|
+
dataId,
|
|
197
|
+
dimensions=datasetType.dimensions,
|
|
198
|
+
universe=self.dimensions,
|
|
199
|
+
defaults=self.defaults.dataId,
|
|
200
|
+
**kwargs,
|
|
191
201
|
)
|
|
192
202
|
|
|
203
|
+
with self._butler.query() as query:
|
|
204
|
+
resolved_collections = resolve_collections(self._butler, collections)
|
|
205
|
+
if not resolved_collections:
|
|
206
|
+
if collections is None:
|
|
207
|
+
raise NoDefaultCollectionError("No collections provided, and no default collections set")
|
|
208
|
+
else:
|
|
209
|
+
return None
|
|
210
|
+
|
|
211
|
+
if datasetType.isCalibration() and timespan is None:
|
|
212
|
+
# Filter out calibration collections, because with no timespan
|
|
213
|
+
# we have no way of selecting a dataset from them.
|
|
214
|
+
collection_info = self._butler.collections.query_info(
|
|
215
|
+
resolved_collections, flatten_chains=True
|
|
216
|
+
)
|
|
217
|
+
resolved_collections = [
|
|
218
|
+
info.name for info in collection_info if info.type != CollectionType.CALIBRATION
|
|
219
|
+
]
|
|
220
|
+
if not resolved_collections:
|
|
221
|
+
return None
|
|
222
|
+
|
|
223
|
+
result = query.datasets(datasetType, resolved_collections, find_first=True).limit(2)
|
|
224
|
+
dataset_type_name = result.dataset_type.name
|
|
225
|
+
# Search only on the 'required' dimensions for the dataset type.
|
|
226
|
+
# Any extra values provided by the user are ignored.
|
|
227
|
+
minimal_data_id = DataCoordinate.standardize(
|
|
228
|
+
dataId.subset(datasetType.dimensions.required).required, universe=self.dimensions
|
|
229
|
+
)
|
|
230
|
+
result = result.where(minimal_data_id)
|
|
231
|
+
if (
|
|
232
|
+
datasetType.isCalibration()
|
|
233
|
+
and timespan is not None
|
|
234
|
+
and (timespan.begin is not None or timespan.end is not None)
|
|
235
|
+
):
|
|
236
|
+
timespan_column = query.expression_factory[dataset_type_name].timespan
|
|
237
|
+
result = result.where(timespan_column.overlaps(timespan))
|
|
238
|
+
|
|
239
|
+
datasets = list(result)
|
|
240
|
+
if len(datasets) == 1:
|
|
241
|
+
ref = datasets[0]
|
|
242
|
+
if dataId.hasRecords():
|
|
243
|
+
ref = ref.expanded(dataId)
|
|
244
|
+
# Propagate storage class from user-provided DatasetType, which
|
|
245
|
+
# may not match the definition in the database.
|
|
246
|
+
ref = ref.overrideStorageClass(datasetType.storageClass_name)
|
|
247
|
+
if datastore_records:
|
|
248
|
+
ref = self._registry.get_datastore_records(ref)
|
|
249
|
+
return ref
|
|
250
|
+
elif len(datasets) == 0:
|
|
251
|
+
return None
|
|
252
|
+
else:
|
|
253
|
+
raise CalibrationLookupError(
|
|
254
|
+
f"Ambiguous calibration lookup for {datasetType} with timespan {timespan}"
|
|
255
|
+
f" in collections {resolved_collections}."
|
|
256
|
+
)
|
|
257
|
+
|
|
193
258
|
def insertDatasets(
|
|
194
259
|
self,
|
|
195
260
|
datasetType: DatasetType | str,
|
|
@@ -299,97 +364,11 @@ class RegistryShim(Registry):
|
|
|
299
364
|
expression, datasetType, collectionTypes, flattenChains, includeChains
|
|
300
365
|
)
|
|
301
366
|
|
|
302
|
-
def queryDatasets(
|
|
303
|
-
self,
|
|
304
|
-
datasetType: Any,
|
|
305
|
-
*,
|
|
306
|
-
collections: CollectionArgType | None = None,
|
|
307
|
-
dimensions: Iterable[str] | None = None,
|
|
308
|
-
dataId: DataId | None = None,
|
|
309
|
-
where: str = "",
|
|
310
|
-
findFirst: bool = False,
|
|
311
|
-
bind: Mapping[str, Any] | None = None,
|
|
312
|
-
check: bool = True,
|
|
313
|
-
**kwargs: Any,
|
|
314
|
-
) -> DatasetQueryResults:
|
|
315
|
-
# Docstring inherited from a base class.
|
|
316
|
-
return self._registry.queryDatasets(
|
|
317
|
-
datasetType,
|
|
318
|
-
collections=collections,
|
|
319
|
-
dimensions=dimensions,
|
|
320
|
-
dataId=dataId,
|
|
321
|
-
where=where,
|
|
322
|
-
findFirst=findFirst,
|
|
323
|
-
bind=bind,
|
|
324
|
-
check=check,
|
|
325
|
-
**kwargs,
|
|
326
|
-
)
|
|
327
|
-
|
|
328
|
-
def queryDataIds(
|
|
329
|
-
self,
|
|
330
|
-
dimensions: DimensionGroup | Iterable[str] | str,
|
|
331
|
-
*,
|
|
332
|
-
dataId: DataId | None = None,
|
|
333
|
-
datasets: Any = None,
|
|
334
|
-
collections: CollectionArgType | None = None,
|
|
335
|
-
where: str = "",
|
|
336
|
-
bind: Mapping[str, Any] | None = None,
|
|
337
|
-
check: bool = True,
|
|
338
|
-
**kwargs: Any,
|
|
339
|
-
) -> DataCoordinateQueryResults:
|
|
340
|
-
# Docstring inherited from a base class.
|
|
341
|
-
return self._registry.queryDataIds(
|
|
342
|
-
dimensions,
|
|
343
|
-
dataId=dataId,
|
|
344
|
-
datasets=datasets,
|
|
345
|
-
collections=collections,
|
|
346
|
-
where=where,
|
|
347
|
-
bind=bind,
|
|
348
|
-
check=check,
|
|
349
|
-
**kwargs,
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
def queryDimensionRecords(
|
|
353
|
-
self,
|
|
354
|
-
element: DimensionElement | str,
|
|
355
|
-
*,
|
|
356
|
-
dataId: DataId | None = None,
|
|
357
|
-
datasets: Any = None,
|
|
358
|
-
collections: CollectionArgType | None = None,
|
|
359
|
-
where: str = "",
|
|
360
|
-
bind: Mapping[str, Any] | None = None,
|
|
361
|
-
check: bool = True,
|
|
362
|
-
**kwargs: Any,
|
|
363
|
-
) -> DimensionRecordQueryResults:
|
|
364
|
-
# Docstring inherited from a base class.
|
|
365
|
-
return self._registry.queryDimensionRecords(
|
|
366
|
-
element,
|
|
367
|
-
dataId=dataId,
|
|
368
|
-
datasets=datasets,
|
|
369
|
-
collections=collections,
|
|
370
|
-
where=where,
|
|
371
|
-
bind=bind,
|
|
372
|
-
check=check,
|
|
373
|
-
**kwargs,
|
|
374
|
-
)
|
|
375
|
-
|
|
376
|
-
def queryDatasetAssociations(
|
|
377
|
-
self,
|
|
378
|
-
datasetType: str | DatasetType,
|
|
379
|
-
collections: CollectionArgType | None = ...,
|
|
380
|
-
*,
|
|
381
|
-
collectionTypes: Iterable[CollectionType] = CollectionType.all(),
|
|
382
|
-
flattenChains: bool = False,
|
|
383
|
-
) -> Iterator[DatasetAssociation]:
|
|
384
|
-
# Docstring inherited from a base class.
|
|
385
|
-
return self._registry.queryDatasetAssociations(
|
|
386
|
-
datasetType,
|
|
387
|
-
collections,
|
|
388
|
-
collectionTypes=collectionTypes,
|
|
389
|
-
flattenChains=flattenChains,
|
|
390
|
-
)
|
|
391
|
-
|
|
392
367
|
@property
|
|
393
368
|
def obsCoreTableManager(self) -> ObsCoreTableManager | None:
|
|
394
369
|
# Docstring inherited from a base class.
|
|
395
370
|
return self._registry.obsCoreTableManager
|
|
371
|
+
|
|
372
|
+
@property
|
|
373
|
+
def storageClasses(self) -> StorageClassFactory:
|
|
374
|
+
return self._registry.storageClasses
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# This file is part of daf_butler.
|
|
2
|
+
#
|
|
3
|
+
# Developed for the LSST Data Management System.
|
|
4
|
+
# This product includes software developed by the LSST Project
|
|
5
|
+
# (http://www.lsst.org).
|
|
6
|
+
# See the COPYRIGHT file at the top-level directory of this distribution
|
|
7
|
+
# for details of code ownership.
|
|
8
|
+
#
|
|
9
|
+
# This software is dual licensed under the GNU General Public License and also
|
|
10
|
+
# under a 3-clause BSD license. Recipients may choose which of these licenses
|
|
11
|
+
# to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
|
|
12
|
+
# respectively. If you choose the GPL option then the following text applies
|
|
13
|
+
# (but note that there is still no warranty even if you opt for BSD instead):
|
|
14
|
+
#
|
|
15
|
+
# This program is free software: you can redistribute it and/or modify
|
|
16
|
+
# it under the terms of the GNU General Public License as published by
|
|
17
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
18
|
+
# (at your option) any later version.
|
|
19
|
+
#
|
|
20
|
+
# This program is distributed in the hope that it will be useful,
|
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
23
|
+
# GNU General Public License for more details.
|
|
24
|
+
#
|
|
25
|
+
# You should have received a copy of the GNU General Public License
|
|
26
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
__all__ = ("generate_uuidv7",)
|
|
31
|
+
|
|
32
|
+
import time
|
|
33
|
+
from uuid import UUID, uuid4
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def generate_uuidv7() -> UUID:
|
|
37
|
+
"""Generate a v7 UUID compliant with IETF RFC-9562.
|
|
38
|
+
|
|
39
|
+
Returns
|
|
40
|
+
-------
|
|
41
|
+
uuid : `uuid.UUID`
|
|
42
|
+
Version 7 UUID.
|
|
43
|
+
"""
|
|
44
|
+
# Python 3.14 will include an implementation of UUIDv7 that can replace
|
|
45
|
+
# this, but at the time of writing 3.14 hasn't been released and we're
|
|
46
|
+
# still supporting 3.12. There are a few libraries on PyPI with an
|
|
47
|
+
# implementation of v7 UUIDs, but none of them look well-maintained.
|
|
48
|
+
#
|
|
49
|
+
# This is the format of a v7 UUID:
|
|
50
|
+
# 0 1 2 3
|
|
51
|
+
# 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
|
52
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
53
|
+
# | unix_ts_ms |
|
|
54
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
55
|
+
# | unix_ts_ms | ver | rand_a |
|
|
56
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
57
|
+
# |var| rand_b |
|
|
58
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
59
|
+
# | rand_b |
|
|
60
|
+
# +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
|
61
|
+
#
|
|
62
|
+
# It's basically identical to a UUID v4, but with the top 6 bytes
|
|
63
|
+
# replaced with a millisecond UNIX timestamp.
|
|
64
|
+
|
|
65
|
+
# Generate a UUIDv4 for the random portion of the data.
|
|
66
|
+
# A little wasteful, but means we inherit the best practices from
|
|
67
|
+
# the standard library for generating this random data.
|
|
68
|
+
byte_data = bytearray(uuid4().bytes)
|
|
69
|
+
|
|
70
|
+
# Replace high 6 bytes with millisecond UNIX timestamp.
|
|
71
|
+
timestamp = time.time_ns() // 1_000_000
|
|
72
|
+
timestamp_bytes = timestamp.to_bytes(length=6, byteorder="big")
|
|
73
|
+
byte_data[0:6] = timestamp_bytes
|
|
74
|
+
|
|
75
|
+
# Set 4-bit version field to 7.
|
|
76
|
+
byte_data[6] &= 0x0F
|
|
77
|
+
byte_data[6] |= 0x70
|
|
78
|
+
|
|
79
|
+
return UUID(bytes=bytes(byte_data))
|
|
@@ -41,6 +41,8 @@ from ..utils import ButlerCommand
|
|
|
41
41
|
noNonRunCollectionsMsg = "No non-RUN collections were found."
|
|
42
42
|
willRemoveCollectionMsg = "The following collections will be removed:"
|
|
43
43
|
removedCollectionsMsg = "Removed collections"
|
|
44
|
+
willRemoveCollectionChainsMsg = "Collections to be removed from their parent collection chains:"
|
|
45
|
+
removedCollectionChainsMsg = "Removed collections from their parent collection chains:"
|
|
44
46
|
canNotRemoveFoundRuns = "The following RUN collections were found but can NOT be removed by this command:"
|
|
45
47
|
didNotRemoveFoundRuns = "Found RUN collections but they can NOT be removed by this command:"
|
|
46
48
|
abortedMsg = "Aborted."
|
|
@@ -53,6 +55,11 @@ abortedMsg = "Aborted."
|
|
|
53
55
|
)
|
|
54
56
|
@confirm_option()
|
|
55
57
|
@options_file_option()
|
|
58
|
+
@click.option(
|
|
59
|
+
"--remove-from-parents",
|
|
60
|
+
is_flag=True,
|
|
61
|
+
help="Forcibly remove the collection even if it is still referenced from collection chains.",
|
|
62
|
+
)
|
|
56
63
|
def remove_collections(**kwargs: Any) -> None: # numpydoc ignore=PR01
|
|
57
64
|
"""Remove one or more non-RUN collections.
|
|
58
65
|
|
|
@@ -73,6 +80,10 @@ def remove_collections(**kwargs: Any) -> None: # numpydoc ignore=PR01
|
|
|
73
80
|
result.removeCollectionsTable.pprint_all(align="<")
|
|
74
81
|
else:
|
|
75
82
|
print("\n" + noNonRunCollectionsMsg)
|
|
83
|
+
if len(result.removeChainsTable):
|
|
84
|
+
print("\n" + willRemoveCollectionChainsMsg)
|
|
85
|
+
result.removeChainsTable.pprint_all(align="<")
|
|
86
|
+
print()
|
|
76
87
|
if len(result.runsTable):
|
|
77
88
|
print("\n" + canNotRemoveFoundRuns)
|
|
78
89
|
result.runsTable.pprint_all(align="<")
|
|
@@ -86,6 +97,10 @@ def remove_collections(**kwargs: Any) -> None: # numpydoc ignore=PR01
|
|
|
86
97
|
else:
|
|
87
98
|
print("\n" + removedCollectionsMsg + ":\n")
|
|
88
99
|
result.removeCollectionsTable.pprint_all(align="<")
|
|
100
|
+
if len(result.removeChainsTable):
|
|
101
|
+
print("\n" + removedCollectionChainsMsg)
|
|
102
|
+
result.removeChainsTable.pprint_all(align="<")
|
|
103
|
+
print()
|
|
89
104
|
if len(result.runsTable):
|
|
90
105
|
print("\n" + didNotRemoveFoundRuns)
|
|
91
106
|
result.runsTable.pprint_all(align="<")
|
|
@@ -43,8 +43,8 @@ __all__ = (
|
|
|
43
43
|
|
|
44
44
|
import numbers
|
|
45
45
|
from abc import abstractmethod
|
|
46
|
-
from collections.abc import Iterable, Iterator, Mapping
|
|
47
|
-
from typing import TYPE_CHECKING, Any, ClassVar, TypeAlias, overload
|
|
46
|
+
from collections.abc import Callable, Iterable, Iterator, Mapping
|
|
47
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Self, TypeAlias, cast, overload
|
|
48
48
|
|
|
49
49
|
import pydantic
|
|
50
50
|
|
|
@@ -753,7 +753,7 @@ class DataCoordinate:
|
|
|
753
753
|
return dataId
|
|
754
754
|
|
|
755
755
|
to_json = to_json_pydantic
|
|
756
|
-
from_json: ClassVar = classmethod(from_json_pydantic)
|
|
756
|
+
from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
|
|
757
757
|
|
|
758
758
|
|
|
759
759
|
DataId = DataCoordinate | Mapping[str, Any]
|
|
@@ -34,7 +34,8 @@ __all__ = (
|
|
|
34
34
|
)
|
|
35
35
|
|
|
36
36
|
from abc import abstractmethod
|
|
37
|
-
from
|
|
37
|
+
from collections.abc import Callable
|
|
38
|
+
from typing import TYPE_CHECKING, Annotated, Any, ClassVar, Self, TypeAlias, Union, cast
|
|
38
39
|
|
|
39
40
|
import pydantic
|
|
40
41
|
from pydantic_core import core_schema
|
|
@@ -212,7 +213,7 @@ class DimensionElement(TopologicalRelationshipEndpoint):
|
|
|
212
213
|
return universe[simple]
|
|
213
214
|
|
|
214
215
|
to_json = to_json_generic
|
|
215
|
-
from_json: ClassVar = classmethod(from_json_generic)
|
|
216
|
+
from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_generic))
|
|
216
217
|
|
|
217
218
|
def hasTable(self) -> bool:
|
|
218
219
|
"""Indicate if this element is associated with a table.
|
|
@@ -30,8 +30,8 @@ from __future__ import annotations
|
|
|
30
30
|
__all__ = ("DimensionRecord", "SerializedDimensionRecord", "SerializedKeyValueDimensionRecord")
|
|
31
31
|
|
|
32
32
|
import itertools
|
|
33
|
-
from collections.abc import Hashable
|
|
34
|
-
from typing import TYPE_CHECKING, Any, ClassVar, TypeAlias
|
|
33
|
+
from collections.abc import Callable, Hashable
|
|
34
|
+
from typing import TYPE_CHECKING, Any, ClassVar, Self, TypeAlias, cast
|
|
35
35
|
|
|
36
36
|
import pydantic
|
|
37
37
|
from pydantic import BaseModel, Field, StrictBool, StrictFloat, StrictInt, StrictStr, create_model
|
|
@@ -505,7 +505,7 @@ class DimensionRecord:
|
|
|
505
505
|
return dimRec
|
|
506
506
|
|
|
507
507
|
to_json = to_json_pydantic
|
|
508
|
-
from_json: ClassVar = classmethod(from_json_pydantic)
|
|
508
|
+
from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
|
|
509
509
|
|
|
510
510
|
def toDict(self, splitTimespan: bool = False) -> dict[str, Any]:
|
|
511
511
|
"""Return a vanilla `dict` representation of this record.
|
|
@@ -1302,7 +1302,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1302
1302
|
|
|
1303
1303
|
data_id, kwargs = self._rewrite_data_id(data_id, parent_type, **kwargs)
|
|
1304
1304
|
|
|
1305
|
-
ref = self.
|
|
1305
|
+
ref = self.registry.findDataset(
|
|
1306
1306
|
parent_type,
|
|
1307
1307
|
data_id,
|
|
1308
1308
|
collections=collections,
|
|
@@ -641,7 +641,11 @@ class DirectQueryDriver(QueryDriver):
|
|
|
641
641
|
# datasets later.
|
|
642
642
|
predicate_constraints = PredicateConstraintsSummary(tree.predicate)
|
|
643
643
|
# Use the default data ID to apply additional constraints where needed.
|
|
644
|
-
predicate_constraints.apply_default_data_id(
|
|
644
|
+
predicate_constraints.apply_default_data_id(
|
|
645
|
+
self._default_data_id,
|
|
646
|
+
tree.dimensions,
|
|
647
|
+
validate_governor_constraints=tree.validateGovernorConstraints,
|
|
648
|
+
)
|
|
645
649
|
predicate = predicate_constraints.predicate
|
|
646
650
|
# Delegate to the dimensions manager to rewrite the predicate and start
|
|
647
651
|
# a SqlSelectBuilder to cover any spatial overlap joins or constraints.
|
|
@@ -241,7 +241,7 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
|
|
|
241
241
|
|
|
242
242
|
def visitBind(self, name: str, node: Node) -> _VisitorResult:
|
|
243
243
|
if name not in self.context.bind:
|
|
244
|
-
raise InvalidQueryError("Name {name!r} is not in the bind map.")
|
|
244
|
+
raise InvalidQueryError(f"Name {name!r} is not in the bind map.")
|
|
245
245
|
# Logic in visitIdentifier handles binds.
|
|
246
246
|
return self.visitIdentifier(name, node)
|
|
247
247
|
|
|
@@ -746,6 +746,10 @@ class Query(QueryBase):
|
|
|
746
746
|
driver=self._driver,
|
|
747
747
|
)
|
|
748
748
|
|
|
749
|
+
def _skip_governor_validation(self) -> Query:
|
|
750
|
+
tree = self._tree.model_copy(update={"validateGovernorConstraints": False})
|
|
751
|
+
return Query(tree=tree, driver=self._driver)
|
|
752
|
+
|
|
749
753
|
def _join_dataset_search_impl(
|
|
750
754
|
self,
|
|
751
755
|
dataset_type: str | DatasetType,
|
|
@@ -71,7 +71,10 @@ class PredicateConstraintsSummary:
|
|
|
71
71
|
)
|
|
72
72
|
|
|
73
73
|
def apply_default_data_id(
|
|
74
|
-
self,
|
|
74
|
+
self,
|
|
75
|
+
default_data_id: DataCoordinate,
|
|
76
|
+
query_dimensions: DimensionGroup,
|
|
77
|
+
validate_governor_constraints: bool,
|
|
75
78
|
) -> None:
|
|
76
79
|
"""Augment the predicate and summary by adding missing constraints for
|
|
77
80
|
governor dimensions using a default data ID.
|
|
@@ -81,9 +84,11 @@ class PredicateConstraintsSummary:
|
|
|
81
84
|
default_data_id : `DataCoordinate`
|
|
82
85
|
Data ID values that will be used to constrain the query if governor
|
|
83
86
|
dimensions have not already been constrained by the predicate.
|
|
84
|
-
|
|
85
87
|
query_dimensions : `DimensionGroup`
|
|
86
88
|
The set of dimensions returned in result rows from the query.
|
|
89
|
+
validate_governor_constraints : `bool`
|
|
90
|
+
If `True`, enforce the requirement that governor dimensions must be
|
|
91
|
+
constrained if any dimensions that depend on them have constraints.
|
|
87
92
|
"""
|
|
88
93
|
# Find governor dimensions required by the predicate.
|
|
89
94
|
# If these are not constrained by the predicate or the default data ID,
|
|
@@ -108,7 +113,7 @@ class PredicateConstraintsSummary:
|
|
|
108
113
|
self.predicate = self.predicate.logical_and(
|
|
109
114
|
_create_data_id_predicate(governor, data_id_value, query_dimensions.universe)
|
|
110
115
|
)
|
|
111
|
-
elif governor in where_governors:
|
|
116
|
+
elif governor in where_governors and validate_governor_constraints:
|
|
112
117
|
# Check that the predicate doesn't reference any dimensions
|
|
113
118
|
# without constraining their governor dimensions, since
|
|
114
119
|
# that's a particularly easy mistake to make and it's
|
|
@@ -146,6 +146,11 @@ class QueryTree(QueryTreeBase):
|
|
|
146
146
|
predicate: Predicate = Predicate.from_bool(True)
|
|
147
147
|
"""Boolean expression trees whose logical AND defines a row filter."""
|
|
148
148
|
|
|
149
|
+
validateGovernorConstraints: bool = True
|
|
150
|
+
"""If True, enforce the requirement that governor dimensions must be
|
|
151
|
+
constrained if any dimensions that depend on them have constraints.
|
|
152
|
+
"""
|
|
153
|
+
|
|
149
154
|
def iter_all_dataset_searches(self) -> Iterator[tuple[str | AnyDatasetType, DatasetSearch]]:
|
|
150
155
|
yield from self.datasets.items()
|
|
151
156
|
if self.any_dataset is not None:
|
|
@@ -1449,6 +1449,9 @@ class Registry(ABC):
|
|
|
1449
1449
|
"""
|
|
1450
1450
|
return None
|
|
1451
1451
|
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1452
|
+
@property
|
|
1453
|
+
def storageClasses(self) -> StorageClassFactory:
|
|
1454
|
+
"""All storage classes known to the registry
|
|
1455
|
+
(`StorageClassFactory`).
|
|
1456
|
+
"""
|
|
1457
|
+
raise NotImplementedError()
|