lsst-daf-butler 29.2025.4100__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.4100/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4200}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_association.py +19 -3
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_registry_shim.py +68 -2
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +15 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +1 -1
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_expression_strings.py +1 -1
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry_base.py +13 -5
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +1 -1
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/sql_registry.py +2 -172
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_registry.py +93 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_factory.py +2 -2
- {lsst_daf_butler-29.2025.4100 → 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.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeCollections.py +46 -13
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/butler_queries.py +40 -1
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/tests/server_available.py +53 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/timespan_database_representation.py +8 -0
- {lsst_daf_butler-29.2025.4100 → 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.4100 → lsst_daf_butler-29.2025.4200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_authentication.py +9 -10
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_butler.py +9 -9
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveCollections.py +29 -4
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_gafaelfawr.py +4 -6
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_remote.py +3 -7
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_remote_butler.py +7 -28
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_simpleButler.py +3 -4
- lsst_daf_butler-29.2025.4100/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -54
- lsst_daf_butler-29.2025.4100/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/README.md +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_uuid.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → 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.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → 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.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_uuid.py +0 -0
- {lsst_daf_butler-29.2025.4100 → 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
|
|
@@ -36,6 +36,7 @@ from typing import TYPE_CHECKING, Any
|
|
|
36
36
|
from ._collection_type import CollectionType
|
|
37
37
|
from ._dataset_ref import DatasetId, DatasetIdGenEnum, DatasetRef
|
|
38
38
|
from ._dataset_type import DatasetType
|
|
39
|
+
from ._exceptions import CalibrationLookupError
|
|
39
40
|
from ._storage_class import StorageClassFactory
|
|
40
41
|
from ._timespan import Timespan
|
|
41
42
|
from .dimensions import (
|
|
@@ -48,7 +49,9 @@ from .dimensions import (
|
|
|
48
49
|
)
|
|
49
50
|
from .registry._collection_summary import CollectionSummary
|
|
50
51
|
from .registry._defaults import RegistryDefaults
|
|
52
|
+
from .registry._exceptions import NoDefaultCollectionError
|
|
51
53
|
from .registry._registry_base import RegistryBase
|
|
54
|
+
from .registry.queries._query_common import resolve_collections
|
|
52
55
|
|
|
53
56
|
if TYPE_CHECKING:
|
|
54
57
|
from .direct_butler import DirectButler
|
|
@@ -182,13 +185,76 @@ class RegistryShim(RegistryBase):
|
|
|
182
185
|
*,
|
|
183
186
|
collections: CollectionArgType | None = None,
|
|
184
187
|
timespan: Timespan | None = None,
|
|
188
|
+
datastore_records: bool = False,
|
|
185
189
|
**kwargs: Any,
|
|
186
190
|
) -> DatasetRef | None:
|
|
187
191
|
# Docstring inherited from a base class.
|
|
188
|
-
|
|
189
|
-
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,
|
|
190
201
|
)
|
|
191
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
|
+
|
|
192
258
|
def insertDatasets(
|
|
193
259
|
self,
|
|
194
260
|
datasetType: DatasetType | str,
|
|
@@ -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="<")
|
|
@@ -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,
|
|
@@ -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
|
|
|
@@ -231,20 +231,28 @@ class RegistryBase(Registry):
|
|
|
231
231
|
collectionTypes: Iterable[CollectionType] = CollectionType.all(),
|
|
232
232
|
flattenChains: bool = False,
|
|
233
233
|
) -> Iterator[DatasetAssociation]:
|
|
234
|
-
# queryCollections only accepts DatasetType.
|
|
235
234
|
if isinstance(datasetType, str):
|
|
236
235
|
datasetType = self.getDatasetType(datasetType)
|
|
237
|
-
resolved_collections = self.queryCollections(
|
|
238
|
-
collections, datasetType=datasetType, collectionTypes=collectionTypes, flattenChains=flattenChains
|
|
239
|
-
)
|
|
240
236
|
with self._butler.query() as query:
|
|
237
|
+
resolved_collections = self.queryCollections(
|
|
238
|
+
collections,
|
|
239
|
+
datasetType=datasetType,
|
|
240
|
+
collectionTypes=collectionTypes,
|
|
241
|
+
flattenChains=flattenChains,
|
|
242
|
+
)
|
|
243
|
+
# It's annoyingly difficult to just do the collection query once,
|
|
244
|
+
# since query_info doesn't accept all the expression types that
|
|
245
|
+
# queryCollections does. But it's all cached anyway.
|
|
246
|
+
collection_info = {
|
|
247
|
+
info.name: info for info in self._butler.collections.query_info(resolved_collections)
|
|
248
|
+
}
|
|
241
249
|
query = query.join_dataset_search(datasetType, resolved_collections)
|
|
242
250
|
result = query.general(
|
|
243
251
|
datasetType.dimensions,
|
|
244
252
|
dataset_fields={datasetType.name: {"dataset_id", "run", "collection", "timespan"}},
|
|
245
253
|
find_first=False,
|
|
246
254
|
)
|
|
247
|
-
yield from DatasetAssociation.from_query_result(result, datasetType)
|
|
255
|
+
yield from DatasetAssociation.from_query_result(result, datasetType, collection_info)
|
|
248
256
|
|
|
249
257
|
def _resolve_dataset_types(self, dataset_types: object | None) -> list[str]:
|
|
250
258
|
if dataset_types is None:
|
|
@@ -1425,7 +1425,7 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
1425
1425
|
)
|
|
1426
1426
|
if "timespan" in fields:
|
|
1427
1427
|
tags_builder.joins.timespans[fields_key] = self._db.getTimespanRepresentation().fromLiteral(
|
|
1428
|
-
None
|
|
1428
|
+
Timespan(None, None)
|
|
1429
1429
|
)
|
|
1430
1430
|
calibs_builder: SqlSelectBuilder | None = None
|
|
1431
1431
|
if CollectionType.CALIBRATION in collection_types:
|
|
@@ -36,7 +36,7 @@ import logging
|
|
|
36
36
|
import warnings
|
|
37
37
|
from collections import defaultdict
|
|
38
38
|
from collections.abc import Iterable, Iterator, Mapping, Sequence
|
|
39
|
-
from typing import TYPE_CHECKING, Any
|
|
39
|
+
from typing import TYPE_CHECKING, Any
|
|
40
40
|
|
|
41
41
|
import sqlalchemy
|
|
42
42
|
|
|
@@ -44,16 +44,10 @@ from lsst.resources import ResourcePathExpression
|
|
|
44
44
|
from lsst.utils.iteration import ensure_iterable
|
|
45
45
|
|
|
46
46
|
from .._collection_type import CollectionType
|
|
47
|
-
from .._column_tags import DatasetColumnTag
|
|
48
47
|
from .._config import Config
|
|
49
48
|
from .._dataset_ref import DatasetId, DatasetIdGenEnum, DatasetRef
|
|
50
49
|
from .._dataset_type import DatasetType
|
|
51
|
-
from .._exceptions import
|
|
52
|
-
CalibrationLookupError,
|
|
53
|
-
DataIdValueError,
|
|
54
|
-
DimensionNameError,
|
|
55
|
-
InconsistentDataIdError,
|
|
56
|
-
)
|
|
50
|
+
from .._exceptions import DataIdValueError, DimensionNameError, InconsistentDataIdError
|
|
57
51
|
from .._storage_class import StorageClassFactory
|
|
58
52
|
from .._timespan import Timespan
|
|
59
53
|
from ..dimensions import (
|
|
@@ -90,7 +84,6 @@ if TYPE_CHECKING:
|
|
|
90
84
|
from .._butler_config import ButlerConfig
|
|
91
85
|
from ..datastore._datastore import DatastoreOpaqueTable
|
|
92
86
|
from ..datastore.stored_file_info import StoredDatastoreItemInfo
|
|
93
|
-
from ..registry._registry import CollectionArgType
|
|
94
87
|
from ..registry.interfaces import (
|
|
95
88
|
CollectionRecord,
|
|
96
89
|
Database,
|
|
@@ -830,169 +823,6 @@ class SqlRegistry:
|
|
|
830
823
|
"""
|
|
831
824
|
return True
|
|
832
825
|
|
|
833
|
-
def findDataset(
|
|
834
|
-
self,
|
|
835
|
-
datasetType: DatasetType | str,
|
|
836
|
-
dataId: DataId | None = None,
|
|
837
|
-
*,
|
|
838
|
-
collections: CollectionArgType | None = None,
|
|
839
|
-
timespan: Timespan | None = None,
|
|
840
|
-
datastore_records: bool = False,
|
|
841
|
-
**kwargs: Any,
|
|
842
|
-
) -> DatasetRef | None:
|
|
843
|
-
"""Find a dataset given its `DatasetType` and data ID.
|
|
844
|
-
|
|
845
|
-
This can be used to obtain a `DatasetRef` that permits the dataset to
|
|
846
|
-
be read from a `Datastore`. If the dataset is a component and can not
|
|
847
|
-
be found using the provided dataset type, a dataset ref for the parent
|
|
848
|
-
will be returned instead but with the correct dataset type.
|
|
849
|
-
|
|
850
|
-
Parameters
|
|
851
|
-
----------
|
|
852
|
-
datasetType : `DatasetType` or `str`
|
|
853
|
-
A `DatasetType` or the name of one. If this is a `DatasetType`
|
|
854
|
-
instance, its storage class will be respected and propagated to
|
|
855
|
-
the output, even if it differs from the dataset type definition
|
|
856
|
-
in the registry, as long as the storage classes are convertible.
|
|
857
|
-
dataId : `dict` or `DataCoordinate`, optional
|
|
858
|
-
A `dict`-like object containing the `Dimension` links that identify
|
|
859
|
-
the dataset within a collection.
|
|
860
|
-
collections : collection expression, optional
|
|
861
|
-
An expression that fully or partially identifies the collections to
|
|
862
|
-
search for the dataset; see
|
|
863
|
-
:ref:`daf_butler_collection_expressions` for more information.
|
|
864
|
-
Defaults to ``self.defaults.collections``.
|
|
865
|
-
timespan : `Timespan`, optional
|
|
866
|
-
A timespan that the validity range of the dataset must overlap.
|
|
867
|
-
If not provided, any `~CollectionType.CALIBRATION` collections
|
|
868
|
-
matched by the ``collections`` argument will not be searched.
|
|
869
|
-
datastore_records : `bool`, optional
|
|
870
|
-
Whether to attach datastore records to the `DatasetRef`.
|
|
871
|
-
**kwargs
|
|
872
|
-
Additional keyword arguments passed to
|
|
873
|
-
`DataCoordinate.standardize` to convert ``dataId`` to a true
|
|
874
|
-
`DataCoordinate` or augment an existing one.
|
|
875
|
-
|
|
876
|
-
Returns
|
|
877
|
-
-------
|
|
878
|
-
ref : `DatasetRef`
|
|
879
|
-
A reference to the dataset, or `None` if no matching Dataset
|
|
880
|
-
was found.
|
|
881
|
-
|
|
882
|
-
Raises
|
|
883
|
-
------
|
|
884
|
-
lsst.daf.butler.registry.NoDefaultCollectionError
|
|
885
|
-
Raised if ``collections`` is `None` and
|
|
886
|
-
``self.defaults.collections`` is `None`.
|
|
887
|
-
LookupError
|
|
888
|
-
Raised if one or more data ID keys are missing.
|
|
889
|
-
lsst.daf.butler.registry.MissingDatasetTypeError
|
|
890
|
-
Raised if the dataset type does not exist.
|
|
891
|
-
lsst.daf.butler.registry.MissingCollectionError
|
|
892
|
-
Raised if any of ``collections`` does not exist in the registry.
|
|
893
|
-
|
|
894
|
-
Notes
|
|
895
|
-
-----
|
|
896
|
-
This method simply returns `None` and does not raise an exception even
|
|
897
|
-
when the set of collections searched is intrinsically incompatible with
|
|
898
|
-
the dataset type, e.g. if ``datasetType.isCalibration() is False``, but
|
|
899
|
-
only `~CollectionType.CALIBRATION` collections are being searched.
|
|
900
|
-
This may make it harder to debug some lookup failures, but the behavior
|
|
901
|
-
is intentional; we consider it more important that failed searches are
|
|
902
|
-
reported consistently, regardless of the reason, and that adding
|
|
903
|
-
additional collections that do not contain a match to the search path
|
|
904
|
-
never changes the behavior.
|
|
905
|
-
|
|
906
|
-
This method handles component dataset types automatically, though most
|
|
907
|
-
other registry operations do not.
|
|
908
|
-
"""
|
|
909
|
-
if collections is None:
|
|
910
|
-
if not self.defaults.collections:
|
|
911
|
-
raise NoDefaultCollectionError(
|
|
912
|
-
"No collections provided to findDataset, and no defaults from registry construction."
|
|
913
|
-
)
|
|
914
|
-
collections = self.defaults.collections
|
|
915
|
-
backend = queries.SqlQueryBackend(self._db, self._managers, self.dimension_record_cache)
|
|
916
|
-
with backend.caching_context():
|
|
917
|
-
collection_wildcard = CollectionWildcard.from_expression(collections, require_ordered=True)
|
|
918
|
-
if collection_wildcard.empty():
|
|
919
|
-
return None
|
|
920
|
-
matched_collections = backend.resolve_collection_wildcard(collection_wildcard)
|
|
921
|
-
resolved_dataset_type = backend.resolve_single_dataset_type_wildcard(datasetType)
|
|
922
|
-
dataId = DataCoordinate.standardize(
|
|
923
|
-
dataId,
|
|
924
|
-
dimensions=resolved_dataset_type.dimensions,
|
|
925
|
-
universe=self.dimensions,
|
|
926
|
-
defaults=self.defaults.dataId,
|
|
927
|
-
**kwargs,
|
|
928
|
-
)
|
|
929
|
-
governor_constraints = {name: {cast(str, dataId[name])} for name in dataId.dimensions.governors}
|
|
930
|
-
(filtered_collections,) = backend.filter_dataset_collections(
|
|
931
|
-
[resolved_dataset_type],
|
|
932
|
-
matched_collections,
|
|
933
|
-
governor_constraints=governor_constraints,
|
|
934
|
-
).values()
|
|
935
|
-
if not filtered_collections:
|
|
936
|
-
return None
|
|
937
|
-
if timespan is None:
|
|
938
|
-
filtered_collections = [
|
|
939
|
-
collection_record
|
|
940
|
-
for collection_record in filtered_collections
|
|
941
|
-
if collection_record.type is not CollectionType.CALIBRATION
|
|
942
|
-
]
|
|
943
|
-
if filtered_collections:
|
|
944
|
-
requested_columns = {"dataset_id", "run", "collection"}
|
|
945
|
-
with backend.context() as context:
|
|
946
|
-
predicate = context.make_data_coordinate_predicate(
|
|
947
|
-
dataId.subset(resolved_dataset_type.dimensions), full=False
|
|
948
|
-
)
|
|
949
|
-
if timespan is not None:
|
|
950
|
-
requested_columns.add("timespan")
|
|
951
|
-
predicate = predicate.logical_and(
|
|
952
|
-
context.make_timespan_overlap_predicate(
|
|
953
|
-
DatasetColumnTag(resolved_dataset_type.name, "timespan"), timespan
|
|
954
|
-
)
|
|
955
|
-
)
|
|
956
|
-
relation = backend.make_dataset_query_relation(
|
|
957
|
-
resolved_dataset_type, filtered_collections, requested_columns, context
|
|
958
|
-
).with_rows_satisfying(predicate)
|
|
959
|
-
rows = list(context.fetch_iterable(relation))
|
|
960
|
-
else:
|
|
961
|
-
rows = []
|
|
962
|
-
if not rows:
|
|
963
|
-
return None
|
|
964
|
-
elif len(rows) == 1:
|
|
965
|
-
best_row = rows[0]
|
|
966
|
-
else:
|
|
967
|
-
rank_by_collection_key = {record.key: n for n, record in enumerate(filtered_collections)}
|
|
968
|
-
collection_tag = DatasetColumnTag(resolved_dataset_type.name, "collection")
|
|
969
|
-
row_iter = iter(rows)
|
|
970
|
-
best_row = next(row_iter)
|
|
971
|
-
best_rank = rank_by_collection_key[best_row[collection_tag]]
|
|
972
|
-
have_tie = False
|
|
973
|
-
for row in row_iter:
|
|
974
|
-
if (rank := rank_by_collection_key[row[collection_tag]]) < best_rank:
|
|
975
|
-
best_row = row
|
|
976
|
-
best_rank = rank
|
|
977
|
-
have_tie = False
|
|
978
|
-
elif rank == best_rank:
|
|
979
|
-
have_tie = True
|
|
980
|
-
assert timespan is not None, "Rank ties should be impossible given DB constraints."
|
|
981
|
-
if have_tie:
|
|
982
|
-
raise CalibrationLookupError(
|
|
983
|
-
f"Ambiguous calibration lookup for {resolved_dataset_type.name} in collections "
|
|
984
|
-
f"{collection_wildcard.strings} with timespan {timespan}."
|
|
985
|
-
)
|
|
986
|
-
reader = queries.DatasetRefReader(
|
|
987
|
-
resolved_dataset_type,
|
|
988
|
-
translate_collection=lambda k: self._managers.collections[k].name,
|
|
989
|
-
)
|
|
990
|
-
ref = reader.read(best_row, data_id=dataId)
|
|
991
|
-
if datastore_records:
|
|
992
|
-
ref = self.get_datastore_records(ref)
|
|
993
|
-
|
|
994
|
-
return ref
|
|
995
|
-
|
|
996
826
|
@transactional
|
|
997
827
|
def insertDatasets(
|
|
998
828
|
self,
|
|
@@ -550,6 +550,11 @@ class RegistryTests(ABC):
|
|
|
550
550
|
"bias", instrument="Cam1", detector=2, collections=["empty", "imported_r", "imported_g"]
|
|
551
551
|
),
|
|
552
552
|
)
|
|
553
|
+
# If the input data ID was an expanded DataCoordinate with records,
|
|
554
|
+
# then the output ref has records, too.
|
|
555
|
+
expanded_id = registry.expandDataId({"instrument": "Cam1", "detector": 2})
|
|
556
|
+
expanded_ref = registry.findDataset("bias", expanded_id, collections=["imported_r"])
|
|
557
|
+
self.assertTrue(expanded_ref.dataId.hasRecords())
|
|
553
558
|
# Search more than one collection, with one of them a CALIBRATION
|
|
554
559
|
# collection.
|
|
555
560
|
registry.registerCollection("Cam1/calib", CollectionType.CALIBRATION)
|
|
@@ -568,6 +573,18 @@ class RegistryTests(ABC):
|
|
|
568
573
|
timespan=timespan,
|
|
569
574
|
),
|
|
570
575
|
)
|
|
576
|
+
self.assertEqual(
|
|
577
|
+
bias1,
|
|
578
|
+
registry.findDataset(
|
|
579
|
+
"bias",
|
|
580
|
+
instrument="Cam1",
|
|
581
|
+
detector=2,
|
|
582
|
+
# Calibration dataset type, with no calibration collection, but
|
|
583
|
+
# a timespan was provided.
|
|
584
|
+
collections=["imported_g"],
|
|
585
|
+
timespan=timespan,
|
|
586
|
+
),
|
|
587
|
+
)
|
|
571
588
|
self.assertEqual(
|
|
572
589
|
bias2,
|
|
573
590
|
registry.findDataset(
|
|
@@ -592,6 +609,82 @@ class RegistryTests(ABC):
|
|
|
592
609
|
"bias", instrument="Cam1", detector=2, collections=["empty", "Cam1/calib", "imported_g"]
|
|
593
610
|
),
|
|
594
611
|
)
|
|
612
|
+
self.assertIsNone(
|
|
613
|
+
registry.findDataset("bias", instrument="Cam1", detector=2, collections=["Cam1/calib"])
|
|
614
|
+
)
|
|
615
|
+
# Test non-calibration dataset type.
|
|
616
|
+
registry.registerDatasetType(
|
|
617
|
+
DatasetType("noncalibration", ["instrument", "detector"], "int", universe=butler.dimensions)
|
|
618
|
+
)
|
|
619
|
+
(non_calibration_ref,) = registry.insertDatasets("noncalibration", dataIds=[dataId2], run=run)
|
|
620
|
+
self.assertIsNone(
|
|
621
|
+
registry.findDataset("noncalibration", instrument="Cam1", detector=2, collections=["imported_g"])
|
|
622
|
+
)
|
|
623
|
+
self.assertEqual(
|
|
624
|
+
non_calibration_ref,
|
|
625
|
+
registry.findDataset("noncalibration", instrument="Cam1", detector=2, collections=[run]),
|
|
626
|
+
)
|
|
627
|
+
# Timespan parameter is ignored for non-calibration dataset types.
|
|
628
|
+
self.assertIsNone(
|
|
629
|
+
registry.findDataset(
|
|
630
|
+
"noncalibration", instrument="Cam1", detector=2, collections=["imported_g"], timespan=timespan
|
|
631
|
+
)
|
|
632
|
+
)
|
|
633
|
+
self.assertEqual(
|
|
634
|
+
non_calibration_ref,
|
|
635
|
+
registry.findDataset(
|
|
636
|
+
"noncalibration", instrument="Cam1", detector=2, collections=[run], timespan=timespan
|
|
637
|
+
),
|
|
638
|
+
)
|
|
639
|
+
self.assertEqual(
|
|
640
|
+
non_calibration_ref,
|
|
641
|
+
registry.findDataset(
|
|
642
|
+
"noncalibration",
|
|
643
|
+
instrument="Cam1",
|
|
644
|
+
detector=2,
|
|
645
|
+
collections=["Cam1/calib", run],
|
|
646
|
+
timespan=timespan,
|
|
647
|
+
),
|
|
648
|
+
)
|
|
649
|
+
# Add a dataset type whose dimension group involves an "implied"
|
|
650
|
+
# dimension. ("physical_filter" implies "band".)
|
|
651
|
+
registry.registerDatasetType(
|
|
652
|
+
DatasetType(
|
|
653
|
+
"dt_with_implied",
|
|
654
|
+
[
|
|
655
|
+
"instrument",
|
|
656
|
+
"physical_filter",
|
|
657
|
+
],
|
|
658
|
+
"int",
|
|
659
|
+
universe=butler.dimensions,
|
|
660
|
+
)
|
|
661
|
+
)
|
|
662
|
+
data_id = {"instrument": "Cam1", "physical_filter": "Cam1-G"}
|
|
663
|
+
(implied_ref,) = registry.insertDatasets("dt_with_implied", dataIds=[data_id], run=run)
|
|
664
|
+
found_ref = registry.findDataset("dt_with_implied", data_id, collections=[run])
|
|
665
|
+
self.assertEqual(implied_ref, found_ref)
|
|
666
|
+
# The "full" data ID with implied values is looked up, even though we
|
|
667
|
+
# provided only the "required" values.
|
|
668
|
+
self.assertTrue(found_ref.dataId.hasFull())
|
|
669
|
+
# The search ignores excess data ID values beyond the 'required' set.
|
|
670
|
+
# This is not the correct band value for this physical_filter, but
|
|
671
|
+
# the mismatch is ignored.
|
|
672
|
+
self.assertEqual(
|
|
673
|
+
implied_ref,
|
|
674
|
+
registry.findDataset(
|
|
675
|
+
"dt_with_implied",
|
|
676
|
+
{"instrument": "Cam1", "physical_filter": "Cam1-G", "band": "r"},
|
|
677
|
+
collections=[run],
|
|
678
|
+
),
|
|
679
|
+
)
|
|
680
|
+
# Correct band value, wrong physical_filter.
|
|
681
|
+
self.assertIsNone(
|
|
682
|
+
registry.findDataset(
|
|
683
|
+
"dt_with_implied",
|
|
684
|
+
{"instrument": "Cam1", "physical_filter": "Cam1-R1", "band": "g"},
|
|
685
|
+
collections=[run],
|
|
686
|
+
),
|
|
687
|
+
)
|
|
595
688
|
|
|
596
689
|
def testRemoveDatasetTypeSuccess(self):
|
|
597
690
|
"""Test that SqlRegistry.removeDatasetType works when there are no
|
|
@@ -136,7 +136,7 @@ class RemoteButlerFactory:
|
|
|
136
136
|
if self._config.authentication == "rubin_science_platform":
|
|
137
137
|
auth = RubinAuthenticationProvider(access_token)
|
|
138
138
|
elif self._config.authentication == "cadc":
|
|
139
|
-
auth = CadcAuthenticationProvider()
|
|
139
|
+
auth = CadcAuthenticationProvider(access_token)
|
|
140
140
|
return self._create_butler(
|
|
141
141
|
auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
|
|
142
142
|
)
|
|
@@ -151,7 +151,7 @@ class RemoteButlerFactory:
|
|
|
151
151
|
if self._config.authentication == "rubin_science_platform":
|
|
152
152
|
auth = RubinAuthenticationProvider.create_from_environment(self.server_url)
|
|
153
153
|
elif self._config.authentication == "cadc":
|
|
154
|
-
auth = CadcAuthenticationProvider()
|
|
154
|
+
auth = CadcAuthenticationProvider.create_from_environment(self.server_url)
|
|
155
155
|
|
|
156
156
|
return self._create_butler(
|
|
157
157
|
auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
|
|
@@ -60,7 +60,7 @@ from .._storage_class import StorageClass, StorageClassFactory
|
|
|
60
60
|
from .._utilities.locked_object import LockedObject
|
|
61
61
|
from ..datastore import DatasetRefURIs, DatastoreConfig
|
|
62
62
|
from ..datastore.cache_manager import AbstractDatastoreCacheManager, DatastoreCacheManager
|
|
63
|
-
from ..dimensions import DataIdValue, DimensionConfig, DimensionUniverse, SerializedDataId
|
|
63
|
+
from ..dimensions import DataCoordinate, DataIdValue, DimensionConfig, DimensionUniverse, SerializedDataId
|
|
64
64
|
from ..queries import Query
|
|
65
65
|
from ..queries.tree import make_column_literal
|
|
66
66
|
from ..registry import CollectionArgType, NoDefaultCollectionError, Registry, RegistryDefaults
|
|
@@ -435,6 +435,8 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
|
|
|
435
435
|
return None
|
|
436
436
|
|
|
437
437
|
ref = DatasetRef.from_simple(model.dataset_ref, universe=self.dimensions)
|
|
438
|
+
if isinstance(data_id, DataCoordinate) and data_id.hasRecords():
|
|
439
|
+
ref = ref.expanded(data_id)
|
|
438
440
|
return apply_storage_class_override(ref, dataset_type, storage_class)
|
|
439
441
|
|
|
440
442
|
def _retrieve_artifacts(
|