lsst-daf-butler 29.2025.1900__tar.gz → 29.2025.2100__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.1900/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2100}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler.py +34 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_collections.py +4 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_quantum_backed.py +3 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/butler.py +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +2 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/commands.py +6 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/utils.py +32 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/_datastore.py +26 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/generic_base.py +2 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/chainedDatastore.py +63 -92
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/fileDatastore.py +307 -104
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +33 -5
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_butler/_direct_butler.py +191 -66
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_driver.py +9 -8
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +19 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/overlaps.py +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_expression.py +39 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_predicate.py +16 -8
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/bridge/ephemeral.py +16 -6
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/bridge/monolithic.py +78 -37
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/_base.py +23 -6
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +4 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/dimensions/static.py +20 -8
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_bridge.py +13 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +7 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/tests/_registry.py +26 -11
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_http_connection.py +15 -3
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_remote_butler.py +16 -3
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_config.py +109 -0
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_dependencies.py +124 -0
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +125 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/_server.py +11 -4
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_telemetry.py +105 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +10 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +7 -3
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/ingest_zip.py +13 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/removeRuns.py +2 -5
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/retrieveArtifacts.py +1 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/butler_queries.py +23 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/cliCmdTestBase.py +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/hybrid_butler.py +20 -5
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/server.py +28 -3
- lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/SOURCES.txt +3 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_butler.py +61 -10
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliPluginLoader.py +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_datasets.py +9 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_datastore.py +37 -0
- lsst_daf_butler-29.2025.2100/tests/test_gafaelfawr.py +104 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_interface.py +0 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_remote_butler.py +5 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_server.py +41 -6
- lsst_daf_butler-29.2025.1900/python/lsst/daf/butler/remote_butler/server/_config.py +0 -54
- lsst_daf_butler-29.2025.1900/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -59
- lsst_daf_butler-29.2025.1900/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/README.md +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/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.2100
|
|
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
|
{lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler.py
RENAMED
|
@@ -90,6 +90,10 @@ class SpecificButlerDataset:
|
|
|
90
90
|
dataset: DatasetRef | None
|
|
91
91
|
|
|
92
92
|
|
|
93
|
+
class _DeprecatedDefault:
|
|
94
|
+
"""Default value for a deprecated parameter."""
|
|
95
|
+
|
|
96
|
+
|
|
93
97
|
class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
94
98
|
"""Interface for data butler and factory for Butler instances.
|
|
95
99
|
|
|
@@ -1288,7 +1292,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1288
1292
|
raise NotImplementedError()
|
|
1289
1293
|
|
|
1290
1294
|
@abstractmethod
|
|
1291
|
-
def removeRuns(
|
|
1295
|
+
def removeRuns(
|
|
1296
|
+
self,
|
|
1297
|
+
names: Iterable[str],
|
|
1298
|
+
unstore: bool | type[_DeprecatedDefault] = _DeprecatedDefault,
|
|
1299
|
+
*,
|
|
1300
|
+
unlink_from_chains: bool = False,
|
|
1301
|
+
) -> None:
|
|
1292
1302
|
"""Remove one or more `~CollectionType.RUN` collections and the
|
|
1293
1303
|
datasets within them.
|
|
1294
1304
|
|
|
@@ -1301,7 +1311,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1301
1311
|
they are present, and attempt to rollback the registry deletions if
|
|
1302
1312
|
datastore deletions fail (which may not always be possible). If
|
|
1303
1313
|
`False`, datastore records for these datasets are still removed,
|
|
1304
|
-
but any artifacts (e.g. files) will not be.
|
|
1314
|
+
but any artifacts (e.g. files) will not be. This parameter is now
|
|
1315
|
+
deprecated and no longer has any effect. Files are always deleted
|
|
1316
|
+
from datastores unless they were ingested using full URIs.
|
|
1317
|
+
unlink_from_chains : `bool`, optional
|
|
1318
|
+
If `True` remove the RUN collection from any chains prior to
|
|
1319
|
+
removing the RUN. If `False` the removal will fail if any chains
|
|
1320
|
+
still refer to the RUN.
|
|
1305
1321
|
|
|
1306
1322
|
Raises
|
|
1307
1323
|
------
|
|
@@ -1374,7 +1390,14 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1374
1390
|
raise NotImplementedError()
|
|
1375
1391
|
|
|
1376
1392
|
@abstractmethod
|
|
1377
|
-
def ingest_zip(
|
|
1393
|
+
def ingest_zip(
|
|
1394
|
+
self,
|
|
1395
|
+
zip_file: ResourcePathExpression,
|
|
1396
|
+
transfer: str = "auto",
|
|
1397
|
+
*,
|
|
1398
|
+
transfer_dimensions: bool = False,
|
|
1399
|
+
dry_run: bool = False,
|
|
1400
|
+
) -> None:
|
|
1378
1401
|
"""Ingest a Zip file into this butler.
|
|
1379
1402
|
|
|
1380
1403
|
The Zip file must have been created by `retrieve_artifacts_zip`.
|
|
@@ -1385,10 +1408,17 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1385
1408
|
Path to the Zip file.
|
|
1386
1409
|
transfer : `str`, optional
|
|
1387
1410
|
Method to use to transfer the Zip into the datastore.
|
|
1411
|
+
transfer_dimensions : `bool`, optional
|
|
1412
|
+
If `True`, dimension record data associated with the new datasets
|
|
1413
|
+
will be transferred from the Zip file, if present.
|
|
1414
|
+
dry_run : `bool`, optional
|
|
1415
|
+
If `True` the ingest will be processed without any modifications
|
|
1416
|
+
made to the target butler and as if the target butler did not
|
|
1417
|
+
have any of the datasets.
|
|
1388
1418
|
|
|
1389
1419
|
Notes
|
|
1390
1420
|
-----
|
|
1391
|
-
Run collections are created as needed.
|
|
1421
|
+
Run collections and dataset types are created as needed.
|
|
1392
1422
|
"""
|
|
1393
1423
|
raise NotImplementedError()
|
|
1394
1424
|
|
|
@@ -108,6 +108,10 @@ class ButlerCollections(ABC, Sequence):
|
|
|
108
108
|
"""Collection defaults associated with this butler."""
|
|
109
109
|
raise NotImplementedError("Defaults must be implemented by a subclass")
|
|
110
110
|
|
|
111
|
+
def __str__(self) -> str:
|
|
112
|
+
"""Return string representation."""
|
|
113
|
+
return f"{self.__class__.__name__}(defaults={self.defaults})"
|
|
114
|
+
|
|
111
115
|
@abstractmethod
|
|
112
116
|
def extend_chain(self, parent_collection_name: str, child_collection_names: str | Iterable[str]) -> None:
|
|
113
117
|
"""Add children to the end of a CHAINED collection.
|
|
@@ -516,8 +516,9 @@ class QuantumBackedButler(LimitedButler):
|
|
|
516
516
|
self._actual_output_refs.discard(ref)
|
|
517
517
|
|
|
518
518
|
if unstore:
|
|
519
|
-
# Point of no return for removing artifacts
|
|
520
|
-
|
|
519
|
+
# Point of no return for removing artifacts. Only try to remove
|
|
520
|
+
# refs associated with this pruning.
|
|
521
|
+
self._datastore.emptyTrash(refs=refs)
|
|
521
522
|
|
|
522
523
|
def retrieve_artifacts_zip(
|
|
523
524
|
self,
|
{lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/butler.py
RENAMED
|
@@ -102,7 +102,7 @@ class PluginCommand:
|
|
|
102
102
|
"""Where the command came from (`str`)."""
|
|
103
103
|
|
|
104
104
|
|
|
105
|
-
class LoaderCLI(click.
|
|
105
|
+
class LoaderCLI(click.Group, abc.ABC):
|
|
106
106
|
"""Extends `click.MultiCommand`, which dispatches to subcommands, to load
|
|
107
107
|
subcommands at runtime.
|
|
108
108
|
|
|
@@ -81,7 +81,9 @@ def _print_remove(will: bool, runs: Sequence[script.RemoveRun], datasets: Mappin
|
|
|
81
81
|
else:
|
|
82
82
|
print(run.name)
|
|
83
83
|
print("\n" + willRemoveDatasetsMsg if will else didRemoveDatasetsMsg)
|
|
84
|
+
total = sum(datasets.values())
|
|
84
85
|
print(", ".join([f"{i[0]}({i[1]})" for i in datasets.items()]))
|
|
86
|
+
print("Total number of datasets to remove: ", total)
|
|
85
87
|
|
|
86
88
|
|
|
87
89
|
def _print_requires_confirmation(runs: Sequence[script.RemoveRun], datasets: Mapping[str, int]) -> None:
|
|
@@ -829,6 +829,12 @@ def export_calibs(*args: Any, **kwargs: Any) -> None:
|
|
|
829
829
|
@repo_argument(required=True)
|
|
830
830
|
@click.argument("zip", required=True)
|
|
831
831
|
@transfer_option()
|
|
832
|
+
@transfer_dimensions_option(
|
|
833
|
+
default=False, help="Attempt to register missing dimension records during ingest."
|
|
834
|
+
)
|
|
835
|
+
@click.option(
|
|
836
|
+
"--dry-run/--no-dry-run", default=False, help="Enable dry run mode and do not ingest any datasets."
|
|
837
|
+
)
|
|
832
838
|
def ingest_zip(**kwargs: Any) -> None:
|
|
833
839
|
"""Ingest a Zip file created by retrieve-artifacts.
|
|
834
840
|
|
{lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/utils.py
RENAMED
|
@@ -55,6 +55,7 @@ __all__ = (
|
|
|
55
55
|
)
|
|
56
56
|
|
|
57
57
|
|
|
58
|
+
import importlib.metadata
|
|
58
59
|
import itertools
|
|
59
60
|
import logging
|
|
60
61
|
import os
|
|
@@ -76,6 +77,7 @@ import click
|
|
|
76
77
|
import click.exceptions
|
|
77
78
|
import click.testing
|
|
78
79
|
import yaml
|
|
80
|
+
from packaging.version import Version
|
|
79
81
|
|
|
80
82
|
from lsst.utils.iteration import ensure_iterable
|
|
81
83
|
|
|
@@ -87,6 +89,12 @@ if TYPE_CHECKING:
|
|
|
87
89
|
|
|
88
90
|
from lsst.daf.butler import Dimension
|
|
89
91
|
|
|
92
|
+
_click_version = Version(importlib.metadata.version("click"))
|
|
93
|
+
if _click_version >= Version("8.2.0"):
|
|
94
|
+
_click_make_metavar_has_context = True
|
|
95
|
+
else:
|
|
96
|
+
_click_make_metavar_has_context = False
|
|
97
|
+
|
|
90
98
|
log = logging.getLogger(__name__)
|
|
91
99
|
|
|
92
100
|
# This is used as the metavar argument to Options that accept multiple string
|
|
@@ -741,9 +749,16 @@ class MWPath(click.Path):
|
|
|
741
749
|
class MWOption(click.Option):
|
|
742
750
|
"""Overrides click.Option with desired behaviors."""
|
|
743
751
|
|
|
744
|
-
def make_metavar(self) -> str:
|
|
752
|
+
def make_metavar(self, ctx: click.Context | None = None) -> str:
|
|
745
753
|
"""Make the metavar for the help menu.
|
|
746
754
|
|
|
755
|
+
Parameters
|
|
756
|
+
----------
|
|
757
|
+
ctx : `click.Context` or `None`
|
|
758
|
+
Context from the command.
|
|
759
|
+
|
|
760
|
+
Notes
|
|
761
|
+
-----
|
|
747
762
|
Overrides `click.Option.make_metavar`.
|
|
748
763
|
Adds a space and an ellipsis after the metavar name if
|
|
749
764
|
the option accepts multiple inputs, otherwise defers to the base
|
|
@@ -758,7 +773,10 @@ class MWOption(click.Option):
|
|
|
758
773
|
transformation that must apply to all types should be applied in
|
|
759
774
|
get_help_record.
|
|
760
775
|
"""
|
|
761
|
-
|
|
776
|
+
if _click_make_metavar_has_context:
|
|
777
|
+
metavar = super().make_metavar(ctx=ctx) # type: ignore
|
|
778
|
+
else:
|
|
779
|
+
metavar = super().make_metavar() # type: ignore
|
|
762
780
|
if self.multiple and self.nargs == 1:
|
|
763
781
|
metavar += " ..."
|
|
764
782
|
elif self.nargs != 1:
|
|
@@ -769,9 +787,16 @@ class MWOption(click.Option):
|
|
|
769
787
|
class MWArgument(click.Argument):
|
|
770
788
|
"""Overrides click.Argument with desired behaviors."""
|
|
771
789
|
|
|
772
|
-
def make_metavar(self) -> str:
|
|
790
|
+
def make_metavar(self, ctx: click.Context | None = None) -> str:
|
|
773
791
|
"""Make the metavar for the help menu.
|
|
774
792
|
|
|
793
|
+
Parameters
|
|
794
|
+
----------
|
|
795
|
+
ctx : `click.Context` or `None`
|
|
796
|
+
Context from the command.
|
|
797
|
+
|
|
798
|
+
Notes
|
|
799
|
+
-----
|
|
775
800
|
Overrides `click.Option.make_metavar`.
|
|
776
801
|
Always adds a space and an ellipsis (' ...') after the
|
|
777
802
|
metavar name if the option accepts multiple inputs.
|
|
@@ -784,7 +809,10 @@ class MWArgument(click.Argument):
|
|
|
784
809
|
metavar : `str`
|
|
785
810
|
The metavar value.
|
|
786
811
|
"""
|
|
787
|
-
|
|
812
|
+
if _click_make_metavar_has_context:
|
|
813
|
+
metavar = super().make_metavar(ctx=ctx) # type: ignore
|
|
814
|
+
else:
|
|
815
|
+
metavar = super().make_metavar() # type: ignore
|
|
788
816
|
if self.nargs != 1:
|
|
789
817
|
metavar = f"{metavar[:-3]} ..."
|
|
790
818
|
return metavar
|
|
@@ -94,3 +94,4 @@ Timespan: lsst.daf.butler.formatters.json.JsonFormatter
|
|
|
94
94
|
RegionTimeInfo: lsst.daf.butler.formatters.json.JsonFormatter
|
|
95
95
|
QPEnsemble: lsst.meas.pz.qp_formatter.QPFormatter
|
|
96
96
|
PZModel: lsst.meas.pz.model_formatter.ModelFormatter
|
|
97
|
+
VisitBackgroundModel: lsst.daf.butler.formatters.json.JsonFormatter
|
|
@@ -1082,7 +1082,7 @@ class Datastore(metaclass=ABCMeta):
|
|
|
1082
1082
|
raise NotImplementedError()
|
|
1083
1083
|
|
|
1084
1084
|
@abstractmethod
|
|
1085
|
-
def ingest_zip(self, zip_path: ResourcePath, transfer: str | None) -> None:
|
|
1085
|
+
def ingest_zip(self, zip_path: ResourcePath, transfer: str | None, *, dry_run: bool = False) -> None:
|
|
1086
1086
|
"""Ingest an indexed Zip file and contents.
|
|
1087
1087
|
|
|
1088
1088
|
The Zip file must have an index file as created by `retrieveArtifacts`.
|
|
@@ -1093,6 +1093,10 @@ class Datastore(metaclass=ABCMeta):
|
|
|
1093
1093
|
Path to the Zip file.
|
|
1094
1094
|
transfer : `str`
|
|
1095
1095
|
Method to use for transferring the Zip file into the datastore.
|
|
1096
|
+
dry_run : `bool`, optional
|
|
1097
|
+
If `True` the ingest will be processed without any modifications
|
|
1098
|
+
made to the target datastore and as if the target datastore did not
|
|
1099
|
+
have any of the datasets.
|
|
1096
1100
|
"""
|
|
1097
1101
|
raise NotImplementedError()
|
|
1098
1102
|
|
|
@@ -1160,13 +1164,29 @@ class Datastore(metaclass=ABCMeta):
|
|
|
1160
1164
|
raise NotImplementedError("Must be implemented by subclass")
|
|
1161
1165
|
|
|
1162
1166
|
@abstractmethod
|
|
1163
|
-
def emptyTrash(
|
|
1167
|
+
def emptyTrash(
|
|
1168
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
1169
|
+
) -> set[ResourcePath]:
|
|
1164
1170
|
"""Remove all datasets from the trash.
|
|
1165
1171
|
|
|
1166
1172
|
Parameters
|
|
1167
1173
|
----------
|
|
1168
1174
|
ignore_errors : `bool`, optional
|
|
1169
1175
|
Determine whether errors should be ignored.
|
|
1176
|
+
refs : `collections.abc.Collection` [ `DatasetRef` ] or `None`
|
|
1177
|
+
Explicit list of datasets that can be removed from trash. If listed
|
|
1178
|
+
datasets are not already stored in the trash table they will be
|
|
1179
|
+
ignored. If `None` every entry in the trash table will be
|
|
1180
|
+
processed.
|
|
1181
|
+
dry_run : `bool`, optional
|
|
1182
|
+
If `True`, the trash table will be queried and results reported
|
|
1183
|
+
but no artifacts will be removed.
|
|
1184
|
+
|
|
1185
|
+
Returns
|
|
1186
|
+
-------
|
|
1187
|
+
removed : `set` [ `lsst.resources.ResourcePath` ]
|
|
1188
|
+
List of artifacts that were removed. Can return nothing if
|
|
1189
|
+
artifacts cannot be represented by URIs.
|
|
1170
1190
|
|
|
1171
1191
|
Notes
|
|
1172
1192
|
-----
|
|
@@ -1488,7 +1508,7 @@ class NullDatastore(Datastore):
|
|
|
1488
1508
|
def getURI(self, datasetRef: DatasetRef, predict: bool = False) -> ResourcePath:
|
|
1489
1509
|
raise FileNotFoundError("This is a no-op datastore that can not access a real datastore")
|
|
1490
1510
|
|
|
1491
|
-
def ingest_zip(self, zip_path: ResourcePath, transfer: str | None) -> None:
|
|
1511
|
+
def ingest_zip(self, zip_path: ResourcePath, transfer: str | None, *, dry_run: bool = False) -> None:
|
|
1492
1512
|
raise NotImplementedError("Can only ingest a Zip into a real datastore.")
|
|
1493
1513
|
|
|
1494
1514
|
def retrieveArtifacts(
|
|
@@ -1512,7 +1532,9 @@ class NullDatastore(Datastore):
|
|
|
1512
1532
|
def trash(self, ref: DatasetRef | Iterable[DatasetRef], ignore_errors: bool = True) -> None:
|
|
1513
1533
|
raise NotImplementedError("This is a no-op datastore that can not access a real datastore")
|
|
1514
1534
|
|
|
1515
|
-
def emptyTrash(
|
|
1535
|
+
def emptyTrash(
|
|
1536
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
1537
|
+
) -> set[ResourcePath]:
|
|
1516
1538
|
raise NotImplementedError("This is a no-op datastore that can not access a real datastore")
|
|
1517
1539
|
|
|
1518
1540
|
def transfer(self, inputDatastore: Datastore, datasetRef: DatasetRef) -> None:
|
|
@@ -80,7 +80,7 @@ class GenericBaseDatastore(Datastore, Generic[_InfoType]):
|
|
|
80
80
|
encountered during removal are not ignored.
|
|
81
81
|
"""
|
|
82
82
|
self.trash(ref, ignore_errors=False)
|
|
83
|
-
self.emptyTrash(ignore_errors=False)
|
|
83
|
+
self.emptyTrash(ignore_errors=False, refs=[ref])
|
|
84
84
|
|
|
85
85
|
def transfer(self, inputDatastore: Datastore, ref: DatasetRef) -> None:
|
|
86
86
|
"""Retrieve a dataset from an input `Datastore`,
|
|
@@ -89,7 +89,7 @@ class GenericBaseDatastore(Datastore, Generic[_InfoType]):
|
|
|
89
89
|
Parameters
|
|
90
90
|
----------
|
|
91
91
|
inputDatastore : `Datastore`
|
|
92
|
-
The external `Datastore` from which to
|
|
92
|
+
The external `Datastore` from which to retrieve the Dataset.
|
|
93
93
|
ref : `DatasetRef`
|
|
94
94
|
Reference to the required dataset in the input data store.
|
|
95
95
|
"""
|
|
@@ -32,7 +32,6 @@ from __future__ import annotations
|
|
|
32
32
|
__all__ = ("ChainedDatastore",)
|
|
33
33
|
|
|
34
34
|
import itertools
|
|
35
|
-
import logging
|
|
36
35
|
import time
|
|
37
36
|
import warnings
|
|
38
37
|
from collections.abc import Callable, Collection, Iterable, Mapping, Sequence
|
|
@@ -51,13 +50,14 @@ from lsst.daf.butler.datastore.record_data import DatastoreRecordData
|
|
|
51
50
|
from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo, ZipIndex
|
|
52
51
|
from lsst.resources import ResourcePath
|
|
53
52
|
from lsst.utils import doImportType
|
|
53
|
+
from lsst.utils.logging import getLogger
|
|
54
54
|
|
|
55
55
|
if TYPE_CHECKING:
|
|
56
56
|
from lsst.daf.butler import Config, DatasetProvenance, DatasetType, LookupKey, StorageClass
|
|
57
57
|
from lsst.daf.butler.registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
|
|
58
58
|
from lsst.resources import ResourcePathExpression
|
|
59
59
|
|
|
60
|
-
log =
|
|
60
|
+
log = getLogger(__name__)
|
|
61
61
|
|
|
62
62
|
|
|
63
63
|
class _IngestPrepData(Datastore.IngestPrepData):
|
|
@@ -912,7 +912,7 @@ class ChainedDatastore(Datastore):
|
|
|
912
912
|
|
|
913
913
|
return merged_artifact_map
|
|
914
914
|
|
|
915
|
-
def ingest_zip(self, zip_path: ResourcePath, transfer: str | None) -> None:
|
|
915
|
+
def ingest_zip(self, zip_path: ResourcePath, transfer: str | None, *, dry_run: bool = False) -> None:
|
|
916
916
|
"""Ingest an indexed Zip file and contents.
|
|
917
917
|
|
|
918
918
|
The Zip file must have an index file as created by `retrieveArtifacts`.
|
|
@@ -923,6 +923,10 @@ class ChainedDatastore(Datastore):
|
|
|
923
923
|
Path to the Zip file.
|
|
924
924
|
transfer : `str`
|
|
925
925
|
Method to use for transferring the Zip file into the datastore.
|
|
926
|
+
dry_run : `bool`, optional
|
|
927
|
+
If `True` the ingest will be processed without any modifications
|
|
928
|
+
made to the target datastore and as if the target datastore did not
|
|
929
|
+
have any of the datasets.
|
|
926
930
|
|
|
927
931
|
Notes
|
|
928
932
|
-----
|
|
@@ -966,7 +970,7 @@ class ChainedDatastore(Datastore):
|
|
|
966
970
|
log.debug("Datastore %s skipping zip ingest due to constraints", datastore.name)
|
|
967
971
|
continue
|
|
968
972
|
try:
|
|
969
|
-
datastore.ingest_zip(zip_path, transfer=transfer)
|
|
973
|
+
datastore.ingest_zip(zip_path, transfer=transfer, dry_run=dry_run)
|
|
970
974
|
except NotImplementedError:
|
|
971
975
|
continue
|
|
972
976
|
except Exception as e:
|
|
@@ -999,7 +1003,7 @@ class ChainedDatastore(Datastore):
|
|
|
999
1003
|
"""
|
|
1000
1004
|
log.debug("Removing %s", ref)
|
|
1001
1005
|
self.trash(ref, ignore_errors=False)
|
|
1002
|
-
self.emptyTrash(ignore_errors=False)
|
|
1006
|
+
self.emptyTrash(ignore_errors=False, refs=[ref])
|
|
1003
1007
|
|
|
1004
1008
|
def forget(self, refs: Iterable[DatasetRef]) -> None:
|
|
1005
1009
|
for datastore in tuple(self.datastores):
|
|
@@ -1028,9 +1032,13 @@ class ChainedDatastore(Datastore):
|
|
|
1028
1032
|
else:
|
|
1029
1033
|
raise FileNotFoundError(err_msg)
|
|
1030
1034
|
|
|
1031
|
-
def emptyTrash(
|
|
1035
|
+
def emptyTrash(
|
|
1036
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
1037
|
+
) -> set[ResourcePath]:
|
|
1038
|
+
removed = set()
|
|
1032
1039
|
for datastore in self.datastores:
|
|
1033
|
-
datastore.emptyTrash(ignore_errors=ignore_errors)
|
|
1040
|
+
removed.update(datastore.emptyTrash(ignore_errors=ignore_errors, refs=refs, dry_run=dry_run))
|
|
1041
|
+
return removed
|
|
1034
1042
|
|
|
1035
1043
|
def transfer(self, inputDatastore: Datastore, ref: DatasetRef) -> None:
|
|
1036
1044
|
"""Retrieve a dataset from an input `Datastore`,
|
|
@@ -1039,7 +1047,7 @@ class ChainedDatastore(Datastore):
|
|
|
1039
1047
|
Parameters
|
|
1040
1048
|
----------
|
|
1041
1049
|
inputDatastore : `Datastore`
|
|
1042
|
-
The external `Datastore` from which to
|
|
1050
|
+
The external `Datastore` from which to retrieve the Dataset.
|
|
1043
1051
|
ref : `DatasetRef`
|
|
1044
1052
|
Reference to the required dataset in the input data store.
|
|
1045
1053
|
|
|
@@ -1235,102 +1243,65 @@ class ChainedDatastore(Datastore):
|
|
|
1235
1243
|
dry_run: bool = False,
|
|
1236
1244
|
) -> tuple[set[DatasetRef], set[DatasetRef]]:
|
|
1237
1245
|
# Docstring inherited
|
|
1238
|
-
# mypy does not understand "type(self) is not type(source)"
|
|
1239
|
-
if isinstance(source_datastore, ChainedDatastore):
|
|
1240
|
-
# Both the source and destination are chained datastores.
|
|
1241
|
-
source_datastores = tuple(source_datastore.datastores)
|
|
1242
|
-
else:
|
|
1243
|
-
# The source datastore is different, forward everything to the
|
|
1244
|
-
# child datastores.
|
|
1245
|
-
source_datastores = (source_datastore,)
|
|
1246
|
-
|
|
1247
1246
|
if not refs:
|
|
1248
|
-
# Nothing to transfer.
|
|
1249
1247
|
return set(), set()
|
|
1250
1248
|
|
|
1251
|
-
#
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1255
|
-
|
|
1249
|
+
# Assume that each child datastore knows how to look inside a chained
|
|
1250
|
+
# datastore for compatible datastores (and so there is no need to
|
|
1251
|
+
# unpack the source datastores here).
|
|
1252
|
+
# Need to decide if a ref accepted by one datastore should be sent to
|
|
1253
|
+
# later datastores (as is done in put()). More efficient to filter out
|
|
1254
|
+
# accepted datasets.
|
|
1255
|
+
if artifact_existence is None:
|
|
1256
|
+
artifact_existence = {}
|
|
1257
|
+
available_refs = set(refs)
|
|
1258
|
+
accepted: set[DatasetRef] = set()
|
|
1259
|
+
rejected: set[DatasetRef] = set()
|
|
1256
1260
|
nsuccess = 0
|
|
1257
|
-
for source_child in source_datastores:
|
|
1258
|
-
# If we are reading from a chained datastore, it's possible that
|
|
1259
|
-
# only a subset of the datastores know about the dataset. We can't
|
|
1260
|
-
# ask the receiving datastore to copy it when it doesn't exist
|
|
1261
|
-
# so we have to filter again based on what the source datastore
|
|
1262
|
-
# understands.
|
|
1263
|
-
known_to_source = source_child.knows_these(list(refs))
|
|
1264
|
-
|
|
1265
|
-
# Need to know that there is a possibility that some of these
|
|
1266
|
-
# datasets exist but are unknown to the source datastore if
|
|
1267
|
-
# trust is enabled.
|
|
1268
|
-
if getattr(source_child, "trustGetRequest", False):
|
|
1269
|
-
unknown = [ref for ref, known in known_to_source.items() if not known]
|
|
1270
|
-
existence = source_child.mexists(unknown, artifact_existence)
|
|
1271
|
-
for ref, exists in existence.items():
|
|
1272
|
-
known_to_source[ref] = exists
|
|
1273
|
-
|
|
1274
|
-
missing = {ref for ref, known in known_to_source.items() if not known}
|
|
1275
|
-
if missing:
|
|
1276
|
-
if missing_from_source is None:
|
|
1277
|
-
missing_from_source = missing
|
|
1278
|
-
else:
|
|
1279
|
-
missing_from_source &= missing
|
|
1280
|
-
|
|
1281
|
-
# Try to transfer from each source datastore to each child
|
|
1282
|
-
# datastore. Have to make sure we don't transfer something
|
|
1283
|
-
# we've already transferred to this destination on later passes.
|
|
1284
|
-
|
|
1285
|
-
# Filter the initial list based on the datasets we have
|
|
1286
|
-
# not yet transferred.
|
|
1287
|
-
these_refs = []
|
|
1288
|
-
for ref in refs:
|
|
1289
|
-
if ref in remaining_refs and known_to_source[ref]:
|
|
1290
|
-
these_refs.append(ref)
|
|
1291
|
-
|
|
1292
|
-
if not these_refs:
|
|
1293
|
-
# Already transferred all datasets known to this datastore.
|
|
1294
|
-
continue
|
|
1295
1261
|
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
log.debug("Rejecting ref by constraints: %s", ref)
|
|
1304
|
-
else:
|
|
1305
|
-
filtered_refs = list(these_refs)
|
|
1306
|
-
try:
|
|
1307
|
-
accepted, _ = datastore.transfer_from(
|
|
1308
|
-
source_child,
|
|
1309
|
-
filtered_refs,
|
|
1310
|
-
transfer,
|
|
1311
|
-
artifact_existence,
|
|
1312
|
-
dry_run=dry_run,
|
|
1313
|
-
)
|
|
1314
|
-
except (TypeError, NotImplementedError):
|
|
1315
|
-
# The datastores were incompatible.
|
|
1316
|
-
continue
|
|
1317
|
-
else:
|
|
1318
|
-
nsuccess += 1
|
|
1262
|
+
log.debug("Initiating transfer to chained datastore %s from %s", self.name, source_datastore.name)
|
|
1263
|
+
for datastore in self.datastores:
|
|
1264
|
+
# Rejections from this datastore might be acceptances in the next.
|
|
1265
|
+
# We add them all up but then recalculate at the end.
|
|
1266
|
+
if not available_refs:
|
|
1267
|
+
break
|
|
1268
|
+
log.verbose("Transferring %d datasets to %s from chain", len(available_refs), datastore.name)
|
|
1319
1269
|
|
|
1320
|
-
|
|
1321
|
-
|
|
1270
|
+
try:
|
|
1271
|
+
current_accepted, current_rejected = datastore.transfer_from(
|
|
1272
|
+
source_datastore,
|
|
1273
|
+
available_refs,
|
|
1274
|
+
transfer=transfer,
|
|
1275
|
+
artifact_existence=artifact_existence,
|
|
1276
|
+
dry_run=dry_run,
|
|
1277
|
+
)
|
|
1278
|
+
except (TypeError, NotImplementedError):
|
|
1279
|
+
# The datastores were incompatible.
|
|
1280
|
+
continue
|
|
1281
|
+
else:
|
|
1282
|
+
nsuccess += 1
|
|
1322
1283
|
|
|
1323
|
-
#
|
|
1324
|
-
|
|
1284
|
+
# Do not send accepted refs to later datastores.
|
|
1285
|
+
available_refs -= current_accepted
|
|
1325
1286
|
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
log.warning("Asked to transfer dataset %s but no file artifacts exist for it", ref)
|
|
1287
|
+
accepted.update(current_accepted)
|
|
1288
|
+
rejected.update(current_rejected)
|
|
1329
1289
|
|
|
1330
1290
|
if nsuccess == 0:
|
|
1331
1291
|
raise TypeError(f"None of the child datastores could accept transfers from {source_datastore!r}")
|
|
1332
1292
|
|
|
1333
|
-
|
|
1293
|
+
# It's not rejected if some other datastore accepted it.
|
|
1294
|
+
rejected -= accepted
|
|
1295
|
+
log.verbose(
|
|
1296
|
+
"Finished transfer_from %s to %s with %d accepted, %d rejected from %d requested.",
|
|
1297
|
+
source_datastore.name,
|
|
1298
|
+
self.name,
|
|
1299
|
+
len(accepted),
|
|
1300
|
+
len(rejected),
|
|
1301
|
+
len(refs),
|
|
1302
|
+
)
|
|
1303
|
+
|
|
1304
|
+
return accepted, rejected
|
|
1334
1305
|
|
|
1335
1306
|
def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
|
|
1336
1307
|
# Docstring inherited from the base class.
|