lsst-daf-butler 29.2025.2100__tar.gz → 29.2025.2400__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.2100/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2400}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_limited_butler.py +8 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/commands.py +16 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/utils.py +1 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/__init__.py +1 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/_datastore.py +16 -14
- lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/datastore/_transfer.py +102 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/stored_file_info.py +34 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/chainedDatastore.py +50 -6
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/fileDatastore.py +51 -180
- lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/datastores/file_datastore/transfer.py +104 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_coordinate.py +3 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_butler/_direct_butler.py +83 -58
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_driver.py +20 -2
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +74 -17
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/parquet.py +7 -3
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -2
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_config.py +5 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_records.py +4 -2
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_remote_butler.py +5 -0
- lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +82 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +29 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server_models.py +16 -1
- lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/script/queryCollections.py +378 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/butler_queries.py +68 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/hybrid_butler.py +5 -1
- lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/SOURCES.txt +3 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_butler.py +152 -140
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryCollections.py +124 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_datastore.py +7 -1
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_simpleButler.py +5 -0
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/script/queryCollections.py +0 -222
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/README.md +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/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.2400
|
|
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: BSD 3-Clause License
|
|
@@ -42,7 +42,7 @@ from ._dataset_provenance import DatasetProvenance
|
|
|
42
42
|
from ._dataset_ref import DatasetRef
|
|
43
43
|
from ._deferredDatasetHandle import DeferredDatasetHandle
|
|
44
44
|
from ._storage_class import StorageClass, StorageClassFactory
|
|
45
|
-
from .datastore import DatasetRefURIs, Datastore
|
|
45
|
+
from .datastore import DatasetRefURIs, Datastore, FileTransferSource
|
|
46
46
|
from .dimensions import DimensionUniverse
|
|
47
47
|
|
|
48
48
|
log = logging.getLogger(__name__)
|
|
@@ -450,6 +450,13 @@ class LimitedButler(ABC):
|
|
|
450
450
|
"""
|
|
451
451
|
raise NotImplementedError()
|
|
452
452
|
|
|
453
|
+
@property
|
|
454
|
+
def _file_transfer_source(self) -> FileTransferSource:
|
|
455
|
+
"""Object that manages the transfer of files between Butler
|
|
456
|
+
repositories.
|
|
457
|
+
"""
|
|
458
|
+
return self._datastore
|
|
459
|
+
|
|
453
460
|
_datastore: Datastore
|
|
454
461
|
"""The object that manages actual dataset storage (`Datastore`)."""
|
|
455
462
|
|
|
@@ -424,6 +424,21 @@ def prune_datasets(**kwargs: Any) -> None:
|
|
|
424
424
|
case_sensitive=False,
|
|
425
425
|
),
|
|
426
426
|
)
|
|
427
|
+
@click.option(
|
|
428
|
+
"-t",
|
|
429
|
+
"--show-dataset-types",
|
|
430
|
+
is_flag=True,
|
|
431
|
+
help="Also show the dataset types registered within each collection.",
|
|
432
|
+
)
|
|
433
|
+
@click.option(
|
|
434
|
+
"--exclude-dataset-types",
|
|
435
|
+
type=click.STRING,
|
|
436
|
+
multiple=True,
|
|
437
|
+
default=["*_config,*_log,*_metadata,packages"],
|
|
438
|
+
callback=split_commas,
|
|
439
|
+
show_default=True,
|
|
440
|
+
help="Dataset types (comma-separated) to exclude. Only valid with --show-dataset-types.",
|
|
441
|
+
)
|
|
427
442
|
@options_file_option()
|
|
428
443
|
def query_collections(*args: Any, **kwargs: Any) -> None:
|
|
429
444
|
"""Get the collections whose names match an expression."""
|
|
@@ -454,7 +469,7 @@ def query_dataset_types(*args: Any, **kwargs: Any) -> None:
|
|
|
454
469
|
"""Get the dataset types in a repository."""
|
|
455
470
|
table = script.queryDatasetTypes(*args, **kwargs)
|
|
456
471
|
if table:
|
|
457
|
-
table.pprint_all()
|
|
472
|
+
table.pprint_all(align="<")
|
|
458
473
|
else:
|
|
459
474
|
print("No results. Try --help for more information.")
|
|
460
475
|
|
|
@@ -54,6 +54,7 @@ from .._config import Config, ConfigSubset
|
|
|
54
54
|
from .._exceptions import DatasetTypeNotSupportedError, ValidationError
|
|
55
55
|
from .._file_dataset import FileDataset
|
|
56
56
|
from .._storage_class import StorageClassFactory
|
|
57
|
+
from ._transfer import FileTransferMap, FileTransferSource
|
|
57
58
|
from .constraints import Constraints
|
|
58
59
|
|
|
59
60
|
if TYPE_CHECKING:
|
|
@@ -62,7 +63,7 @@ if TYPE_CHECKING:
|
|
|
62
63
|
from .. import ddl
|
|
63
64
|
from .._config_support import LookupKey
|
|
64
65
|
from .._dataset_provenance import DatasetProvenance
|
|
65
|
-
from .._dataset_ref import DatasetRef
|
|
66
|
+
from .._dataset_ref import DatasetId, DatasetRef
|
|
66
67
|
from .._dataset_type import DatasetType
|
|
67
68
|
from .._storage_class import StorageClass
|
|
68
69
|
from ..datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo
|
|
@@ -283,7 +284,7 @@ class DatasetRefURIs(abc.Sequence):
|
|
|
283
284
|
return f"DatasetRefURIs({repr(self.primaryURI)}, {repr(self.componentURIs)})"
|
|
284
285
|
|
|
285
286
|
|
|
286
|
-
class Datastore(metaclass=ABCMeta):
|
|
287
|
+
class Datastore(FileTransferSource, metaclass=ABCMeta):
|
|
287
288
|
"""Datastore interface.
|
|
288
289
|
|
|
289
290
|
Parameters
|
|
@@ -868,7 +869,7 @@ class Datastore(metaclass=ABCMeta):
|
|
|
868
869
|
|
|
869
870
|
def transfer_from(
|
|
870
871
|
self,
|
|
871
|
-
|
|
872
|
+
source_records: FileTransferMap,
|
|
872
873
|
refs: Collection[DatasetRef],
|
|
873
874
|
transfer: str = "auto",
|
|
874
875
|
artifact_existence: dict[ResourcePath, bool] | None = None,
|
|
@@ -878,9 +879,8 @@ class Datastore(metaclass=ABCMeta):
|
|
|
878
879
|
|
|
879
880
|
Parameters
|
|
880
881
|
----------
|
|
881
|
-
|
|
882
|
-
The
|
|
883
|
-
must be compatible with this datastore receiving the artifacts.
|
|
882
|
+
source_records : `FileTransferMap`
|
|
883
|
+
The artifacts to be transferred into this datastore.
|
|
884
884
|
refs : `~collections.abc.Collection` of `DatasetRef`
|
|
885
885
|
The datasets to transfer from the source datastore.
|
|
886
886
|
transfer : `str`, optional
|
|
@@ -915,13 +915,7 @@ class Datastore(metaclass=ABCMeta):
|
|
|
915
915
|
TypeError
|
|
916
916
|
Raised if the two datastores are not compatible.
|
|
917
917
|
"""
|
|
918
|
-
|
|
919
|
-
raise TypeError(
|
|
920
|
-
f"Datastore mismatch between this datastore ({type(self)}) and the "
|
|
921
|
-
f"source datastore ({type(source_datastore)})."
|
|
922
|
-
)
|
|
923
|
-
|
|
924
|
-
raise NotImplementedError(f"Datastore {type(self)} must implement a transfer_from method.")
|
|
918
|
+
raise NotImplementedError(f"Datastore {type(self)} does not implement a transfer_from method.")
|
|
925
919
|
|
|
926
920
|
def getManyURIs(
|
|
927
921
|
self,
|
|
@@ -1420,6 +1414,14 @@ class Datastore(metaclass=ABCMeta):
|
|
|
1420
1414
|
"""
|
|
1421
1415
|
raise NotImplementedError()
|
|
1422
1416
|
|
|
1417
|
+
def get_file_info_for_transfer(self, dataset_ids: Iterable[DatasetId]) -> FileTransferMap:
|
|
1418
|
+
raise NotImplementedError(f"Transferring files is not supported by datastore {self}")
|
|
1419
|
+
|
|
1420
|
+
def locate_missing_files_for_transfer(
|
|
1421
|
+
self, refs: Iterable[DatasetRef], artifact_existence: dict[ResourcePath, bool]
|
|
1422
|
+
) -> FileTransferMap:
|
|
1423
|
+
return {}
|
|
1424
|
+
|
|
1423
1425
|
|
|
1424
1426
|
class NullDatastore(Datastore):
|
|
1425
1427
|
"""A datastore that implements the `Datastore` API but always fails when
|
|
@@ -1494,7 +1496,7 @@ class NullDatastore(Datastore):
|
|
|
1494
1496
|
|
|
1495
1497
|
def transfer_from(
|
|
1496
1498
|
self,
|
|
1497
|
-
|
|
1499
|
+
source_records: FileTransferMap,
|
|
1498
1500
|
refs: Iterable[DatasetRef],
|
|
1499
1501
|
transfer: str = "auto",
|
|
1500
1502
|
artifact_existence: dict[ResourcePath, bool] | None = None,
|
|
@@ -0,0 +1,102 @@
|
|
|
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
|
+
from collections.abc import Iterable
|
|
31
|
+
from typing import NamedTuple, Protocol, TypeAlias
|
|
32
|
+
|
|
33
|
+
from lsst.resources import ResourcePath
|
|
34
|
+
|
|
35
|
+
from .._dataset_ref import DatasetId, DatasetRef
|
|
36
|
+
from .stored_file_info import Location, StoredFileInfo
|
|
37
|
+
|
|
38
|
+
__all__ = ("FileTransferMap", "FileTransferRecord", "FileTransferSource")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class FileTransferSource(Protocol):
|
|
42
|
+
"""Protocol for an object that can return information about files that need
|
|
43
|
+
to be transferred to copy datasets from one Butler repository to another.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
name: str
|
|
47
|
+
"""A human-readable, descriptive name for this file transfer source."""
|
|
48
|
+
|
|
49
|
+
def get_file_info_for_transfer(self, dataset_ids: Iterable[DatasetId]) -> FileTransferMap:
|
|
50
|
+
"""Given a list of dataset IDs, return all file information associated
|
|
51
|
+
with the datasets that can be determined without searching the
|
|
52
|
+
filesystem.
|
|
53
|
+
|
|
54
|
+
Parameters
|
|
55
|
+
----------
|
|
56
|
+
dataset_ids : `~collections.abc.Iterable` [ `DatasetId` ]
|
|
57
|
+
List of dataset IDs for which we will retrieve file information.
|
|
58
|
+
|
|
59
|
+
Return
|
|
60
|
+
------
|
|
61
|
+
transfer_map : `FileTransferMap`
|
|
62
|
+
Dictionary from `DatasetId` to a list of files found for that
|
|
63
|
+
dataset. If information about any given dataset IDs could not
|
|
64
|
+
be found, the missing IDs are omitted from the dictionary.
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
def locate_missing_files_for_transfer(
|
|
68
|
+
self, refs: Iterable[DatasetRef], artifact_existence: dict[ResourcePath, bool]
|
|
69
|
+
) -> FileTransferMap:
|
|
70
|
+
"""Given a list of `DatasetRef`, search the filesystem to locate
|
|
71
|
+
artifacts associated with the dataset.
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
refs : iterable of `DatasetRef`
|
|
76
|
+
The datasets to be checked.
|
|
77
|
+
artifact_existence : `dict` [`lsst.resources.ResourcePath`, `bool`]
|
|
78
|
+
Optional mapping of datastore artifact to existence. Updated by
|
|
79
|
+
this method with details of all artifacts tested.
|
|
80
|
+
|
|
81
|
+
Return
|
|
82
|
+
------
|
|
83
|
+
transfer_map : `FileTransferMap`
|
|
84
|
+
Dictionary from `DatasetId` to a list of files found for that
|
|
85
|
+
dataset. If information about any given dataset IDs could not
|
|
86
|
+
be found, the missing IDs are omitted from the dictionary.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
class FileTransferRecord(NamedTuple):
|
|
91
|
+
"""Information needed to transfer a file from one Butler repository to
|
|
92
|
+
another.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
location: Location
|
|
96
|
+
file_info: StoredFileInfo
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
FileTransferMap: TypeAlias = dict[DatasetId, list[FileTransferRecord]]
|
|
100
|
+
"""A dictionary from `DatasetId` to a list of `FileTransferRecord`, containing
|
|
101
|
+
the datastore information about a set of files to be transferred.
|
|
102
|
+
"""
|
|
@@ -395,3 +395,37 @@ class SerializedStoredFileInfo(pydantic.BaseModel):
|
|
|
395
395
|
|
|
396
396
|
file_size: int
|
|
397
397
|
"""Size of the serialized dataset in bytes."""
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
def make_datastore_path_relative(path: str) -> str:
|
|
401
|
+
"""Normalize a path from a `StoredFileInfo` object so
|
|
402
|
+
that it is always relative.
|
|
403
|
+
|
|
404
|
+
Parameters
|
|
405
|
+
----------
|
|
406
|
+
path : `str`
|
|
407
|
+
The file path from a `StoredFileInfo`.
|
|
408
|
+
|
|
409
|
+
Return
|
|
410
|
+
------
|
|
411
|
+
normalized_path : `str`
|
|
412
|
+
The original path, if it was relative. Otherwise, a version of it that
|
|
413
|
+
was converted to a relative path, stripping URI scheme and netloc from
|
|
414
|
+
it.
|
|
415
|
+
"""
|
|
416
|
+
# Force the datastore file path sent to the client to be relative, since
|
|
417
|
+
# absolute URLs in the server will generally not be reachable by the
|
|
418
|
+
# client. If an absolute URL is sent, it (or a portion of it) can end up
|
|
419
|
+
# baked into the FileDatastore that is the target of the transfer in some
|
|
420
|
+
# cases.
|
|
421
|
+
rpath = ResourcePath(path, forceAbsolute=False, forceDirectory=False)
|
|
422
|
+
if rpath.isabs():
|
|
423
|
+
relative = rpath.relativeToPathRoot
|
|
424
|
+
if rpath.fragment:
|
|
425
|
+
# Preserve the fragment, since this used to indicate special
|
|
426
|
+
# processing like zip extraction.
|
|
427
|
+
return f"{relative}#{rpath.fragment}"
|
|
428
|
+
else:
|
|
429
|
+
return relative
|
|
430
|
+
else:
|
|
431
|
+
return path
|
|
@@ -50,8 +50,12 @@ from lsst.daf.butler.datastore.record_data import DatastoreRecordData
|
|
|
50
50
|
from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo, ZipIndex
|
|
51
51
|
from lsst.resources import ResourcePath
|
|
52
52
|
from lsst.utils import doImportType
|
|
53
|
+
from lsst.utils.introspection import get_full_type_name
|
|
53
54
|
from lsst.utils.logging import getLogger
|
|
54
55
|
|
|
56
|
+
from .._dataset_ref import DatasetId
|
|
57
|
+
from ..datastore import FileTransferMap
|
|
58
|
+
|
|
55
59
|
if TYPE_CHECKING:
|
|
56
60
|
from lsst.daf.butler import Config, DatasetProvenance, DatasetType, LookupKey, StorageClass
|
|
57
61
|
from lsst.daf.butler.registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
|
|
@@ -1234,9 +1238,50 @@ class ChainedDatastore(Datastore):
|
|
|
1234
1238
|
raise FileNotFoundError(f"Failed to export dataset {refs[i]}.")
|
|
1235
1239
|
yield dataset
|
|
1236
1240
|
|
|
1241
|
+
def get_file_info_for_transfer(self, dataset_ids: Iterable[DatasetId]) -> FileTransferMap:
|
|
1242
|
+
unassigned_ids = set(dataset_ids)
|
|
1243
|
+
output: FileTransferMap = {}
|
|
1244
|
+
found_acceptable_datastore = False
|
|
1245
|
+
for datastore in self.datastores:
|
|
1246
|
+
try:
|
|
1247
|
+
found = datastore.get_file_info_for_transfer(unassigned_ids)
|
|
1248
|
+
found_acceptable_datastore = True
|
|
1249
|
+
output.update(found)
|
|
1250
|
+
unassigned_ids -= found.keys()
|
|
1251
|
+
except NotImplementedError:
|
|
1252
|
+
pass
|
|
1253
|
+
|
|
1254
|
+
if not found_acceptable_datastore:
|
|
1255
|
+
types = {get_full_type_name(d) for d in self.datastores}
|
|
1256
|
+
raise TypeError(
|
|
1257
|
+
"ChainedDatastore had no datastores able to provide file transfer information."
|
|
1258
|
+
f" Had {','.join(types)}"
|
|
1259
|
+
)
|
|
1260
|
+
|
|
1261
|
+
return output
|
|
1262
|
+
|
|
1263
|
+
def locate_missing_files_for_transfer(
|
|
1264
|
+
self, refs: Iterable[DatasetRef], artifact_existence: dict[ResourcePath, bool]
|
|
1265
|
+
) -> FileTransferMap:
|
|
1266
|
+
missing_refs = {ref.id: ref for ref in refs}
|
|
1267
|
+
output: FileTransferMap = {}
|
|
1268
|
+
for datastore in self.datastores:
|
|
1269
|
+
# Have to check each datastore in turn. If we do not do
|
|
1270
|
+
# this warnings will be issued further down for datasets
|
|
1271
|
+
# that are in one and not the other. The existence cache
|
|
1272
|
+
# will prevent repeat checks.
|
|
1273
|
+
|
|
1274
|
+
found = datastore.locate_missing_files_for_transfer(missing_refs.values(), artifact_existence)
|
|
1275
|
+
output.update(found)
|
|
1276
|
+
for id in found.keys():
|
|
1277
|
+
missing_refs.pop(id)
|
|
1278
|
+
log.debug("Adding %d missing refs to list for transfer from %s", len(found), datastore.name)
|
|
1279
|
+
|
|
1280
|
+
return output
|
|
1281
|
+
|
|
1237
1282
|
def transfer_from(
|
|
1238
1283
|
self,
|
|
1239
|
-
|
|
1284
|
+
source_records: FileTransferMap,
|
|
1240
1285
|
refs: Collection[DatasetRef],
|
|
1241
1286
|
transfer: str = "auto",
|
|
1242
1287
|
artifact_existence: dict[ResourcePath, bool] | None = None,
|
|
@@ -1259,7 +1304,7 @@ class ChainedDatastore(Datastore):
|
|
|
1259
1304
|
rejected: set[DatasetRef] = set()
|
|
1260
1305
|
nsuccess = 0
|
|
1261
1306
|
|
|
1262
|
-
log.debug("Initiating transfer to chained datastore %s
|
|
1307
|
+
log.debug("Initiating transfer to chained datastore %s", self.name)
|
|
1263
1308
|
for datastore in self.datastores:
|
|
1264
1309
|
# Rejections from this datastore might be acceptances in the next.
|
|
1265
1310
|
# We add them all up but then recalculate at the end.
|
|
@@ -1269,7 +1314,7 @@ class ChainedDatastore(Datastore):
|
|
|
1269
1314
|
|
|
1270
1315
|
try:
|
|
1271
1316
|
current_accepted, current_rejected = datastore.transfer_from(
|
|
1272
|
-
|
|
1317
|
+
source_records,
|
|
1273
1318
|
available_refs,
|
|
1274
1319
|
transfer=transfer,
|
|
1275
1320
|
artifact_existence=artifact_existence,
|
|
@@ -1288,13 +1333,12 @@ class ChainedDatastore(Datastore):
|
|
|
1288
1333
|
rejected.update(current_rejected)
|
|
1289
1334
|
|
|
1290
1335
|
if nsuccess == 0:
|
|
1291
|
-
raise TypeError(
|
|
1336
|
+
raise TypeError("None of the child datastores could accept file transfers")
|
|
1292
1337
|
|
|
1293
1338
|
# It's not rejected if some other datastore accepted it.
|
|
1294
1339
|
rejected -= accepted
|
|
1295
1340
|
log.verbose(
|
|
1296
|
-
"Finished transfer_from
|
|
1297
|
-
source_datastore.name,
|
|
1341
|
+
"Finished transfer_from to %s with %d accepted, %d rejected from %d requested.",
|
|
1298
1342
|
self.name,
|
|
1299
1343
|
len(accepted),
|
|
1300
1344
|
len(rejected),
|