lsst-daf-butler 29.2025.1900__tar.gz → 29.2025.2000__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.2000}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_quantum_backed.py +3 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/butler.py +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +2 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/utils.py +32 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/_datastore.py +20 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/generic_base.py +2 -2
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/chainedDatastore.py +8 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/fileDatastore.py +151 -84
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +32 -4
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_butler/_direct_butler.py +35 -10
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/bridge/ephemeral.py +16 -6
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/bridge/monolithic.py +21 -6
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/collections/_base.py +23 -6
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_bridge.py +13 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/tests/_registry.py +26 -11
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/_server.py +2 -0
- lsst_daf_butler-29.2025.2000/python/lsst/daf/butler/remote_butler/server/_telemetry.py +105 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +7 -3
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/removeRuns.py +9 -3
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/cliCmdTestBase.py +1 -1
- lsst_daf_butler-29.2025.2000/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliPluginLoader.py +1 -1
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_datastore.py +37 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_remote_butler.py +5 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_server.py +1 -2
- 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.2000}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/README.md +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_butler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/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.2000
|
|
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
|
|
@@ -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.2000}/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:
|
{lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2000}/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
|
|
@@ -1160,13 +1160,29 @@ class Datastore(metaclass=ABCMeta):
|
|
|
1160
1160
|
raise NotImplementedError("Must be implemented by subclass")
|
|
1161
1161
|
|
|
1162
1162
|
@abstractmethod
|
|
1163
|
-
def emptyTrash(
|
|
1163
|
+
def emptyTrash(
|
|
1164
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
1165
|
+
) -> set[ResourcePath]:
|
|
1164
1166
|
"""Remove all datasets from the trash.
|
|
1165
1167
|
|
|
1166
1168
|
Parameters
|
|
1167
1169
|
----------
|
|
1168
1170
|
ignore_errors : `bool`, optional
|
|
1169
1171
|
Determine whether errors should be ignored.
|
|
1172
|
+
refs : `collections.abc.Collection` [ `DatasetRef` ] or `None`
|
|
1173
|
+
Explicit list of datasets that can be removed from trash. If listed
|
|
1174
|
+
datasets are not already stored in the trash table they will be
|
|
1175
|
+
ignored. If `None` every entry in the trash table will be
|
|
1176
|
+
processed.
|
|
1177
|
+
dry_run : `bool`, optional
|
|
1178
|
+
If `True`, the trash table will be queried and results reported
|
|
1179
|
+
but no artifacts will be removed.
|
|
1180
|
+
|
|
1181
|
+
Returns
|
|
1182
|
+
-------
|
|
1183
|
+
removed : `set` [ `lsst.resources.ResourcePath` ]
|
|
1184
|
+
List of artifacts that were removed. Can return nothing if
|
|
1185
|
+
artifacts cannot be represented by URIs.
|
|
1170
1186
|
|
|
1171
1187
|
Notes
|
|
1172
1188
|
-----
|
|
@@ -1512,7 +1528,9 @@ class NullDatastore(Datastore):
|
|
|
1512
1528
|
def trash(self, ref: DatasetRef | Iterable[DatasetRef], ignore_errors: bool = True) -> None:
|
|
1513
1529
|
raise NotImplementedError("This is a no-op datastore that can not access a real datastore")
|
|
1514
1530
|
|
|
1515
|
-
def emptyTrash(
|
|
1531
|
+
def emptyTrash(
|
|
1532
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
1533
|
+
) -> set[ResourcePath]:
|
|
1516
1534
|
raise NotImplementedError("This is a no-op datastore that can not access a real datastore")
|
|
1517
1535
|
|
|
1518
1536
|
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
|
"""
|
|
@@ -999,7 +999,7 @@ class ChainedDatastore(Datastore):
|
|
|
999
999
|
"""
|
|
1000
1000
|
log.debug("Removing %s", ref)
|
|
1001
1001
|
self.trash(ref, ignore_errors=False)
|
|
1002
|
-
self.emptyTrash(ignore_errors=False)
|
|
1002
|
+
self.emptyTrash(ignore_errors=False, refs=[ref])
|
|
1003
1003
|
|
|
1004
1004
|
def forget(self, refs: Iterable[DatasetRef]) -> None:
|
|
1005
1005
|
for datastore in tuple(self.datastores):
|
|
@@ -1028,9 +1028,13 @@ class ChainedDatastore(Datastore):
|
|
|
1028
1028
|
else:
|
|
1029
1029
|
raise FileNotFoundError(err_msg)
|
|
1030
1030
|
|
|
1031
|
-
def emptyTrash(
|
|
1031
|
+
def emptyTrash(
|
|
1032
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
1033
|
+
) -> set[ResourcePath]:
|
|
1034
|
+
removed = set()
|
|
1032
1035
|
for datastore in self.datastores:
|
|
1033
|
-
datastore.emptyTrash(ignore_errors=ignore_errors)
|
|
1036
|
+
removed.update(datastore.emptyTrash(ignore_errors=ignore_errors, refs=refs, dry_run=dry_run))
|
|
1037
|
+
return removed
|
|
1034
1038
|
|
|
1035
1039
|
def transfer(self, inputDatastore: Datastore, ref: DatasetRef) -> None:
|
|
1036
1040
|
"""Retrieve a dataset from an input `Datastore`,
|
|
@@ -1039,7 +1043,7 @@ class ChainedDatastore(Datastore):
|
|
|
1039
1043
|
Parameters
|
|
1040
1044
|
----------
|
|
1041
1045
|
inputDatastore : `Datastore`
|
|
1042
|
-
The external `Datastore` from which to
|
|
1046
|
+
The external `Datastore` from which to retrieve the Dataset.
|
|
1043
1047
|
ref : `DatasetRef`
|
|
1044
1048
|
Reference to the required dataset in the input data store.
|
|
1045
1049
|
|
|
@@ -401,53 +401,6 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
401
401
|
log.debug("Checking if resource exists: %s", location.uri)
|
|
402
402
|
return location.uri.exists()
|
|
403
403
|
|
|
404
|
-
def _delete_artifact(self, location: Location) -> None:
|
|
405
|
-
"""Delete the artifact from the datastore.
|
|
406
|
-
|
|
407
|
-
Parameters
|
|
408
|
-
----------
|
|
409
|
-
location : `Location`
|
|
410
|
-
Location of the artifact associated with this datastore.
|
|
411
|
-
"""
|
|
412
|
-
if location.pathInStore.isabs():
|
|
413
|
-
raise RuntimeError(f"Cannot delete artifact with absolute uri {location.uri}.")
|
|
414
|
-
|
|
415
|
-
try:
|
|
416
|
-
location.uri.remove()
|
|
417
|
-
except FileNotFoundError:
|
|
418
|
-
log.debug("File %s did not exist and so could not be deleted.", location.uri)
|
|
419
|
-
raise
|
|
420
|
-
except Exception as e:
|
|
421
|
-
log.critical("Failed to delete file: %s (%s)", location.uri, e)
|
|
422
|
-
raise
|
|
423
|
-
log.debug("Successfully deleted file: %s", location.uri)
|
|
424
|
-
|
|
425
|
-
def _delete_artifacts(self, locations: list[Location]) -> None:
|
|
426
|
-
"""Delete multiple artifacts from the datastore."""
|
|
427
|
-
# Filter out all artifacts that are direct.
|
|
428
|
-
n_locations = len(locations)
|
|
429
|
-
filtered = [loc.uri for loc in locations if not loc.pathInStore.isabs()]
|
|
430
|
-
n_direct = n_locations - len(filtered)
|
|
431
|
-
if n_direct > 0:
|
|
432
|
-
log.info(
|
|
433
|
-
"Not deleting %d artifact%s out of %d using absolute URIs",
|
|
434
|
-
n_direct,
|
|
435
|
-
"s" if n_direct != 1 else "",
|
|
436
|
-
n_locations,
|
|
437
|
-
)
|
|
438
|
-
if not filtered:
|
|
439
|
-
return
|
|
440
|
-
|
|
441
|
-
try:
|
|
442
|
-
ResourcePath.mremove(filtered, do_raise=True)
|
|
443
|
-
except* FileNotFoundError as e:
|
|
444
|
-
# File not there is counted as "success" because we don't want
|
|
445
|
-
# the file to be there.
|
|
446
|
-
n_except = len(e.exceptions)
|
|
447
|
-
s = "s" if n_except != 1 else ""
|
|
448
|
-
log.debug("%d artifact%s did not exist and so could not be deleted.", n_except, s)
|
|
449
|
-
log.debug("Successfully deleted %d file%s", len(filtered), "s" if len(filtered) != 1 else "")
|
|
450
|
-
|
|
451
404
|
def addStoredItemInfo(
|
|
452
405
|
self,
|
|
453
406
|
refs: Iterable[DatasetRef],
|
|
@@ -2557,8 +2510,9 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2557
2510
|
else:
|
|
2558
2511
|
raise
|
|
2559
2512
|
|
|
2560
|
-
|
|
2561
|
-
|
|
2513
|
+
def emptyTrash(
|
|
2514
|
+
self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
2515
|
+
) -> set[ResourcePath]:
|
|
2562
2516
|
"""Remove all datasets from the trash.
|
|
2563
2517
|
|
|
2564
2518
|
Parameters
|
|
@@ -2567,14 +2521,91 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2567
2521
|
If `True` return without error even if something went wrong.
|
|
2568
2522
|
Problems could occur if another process is simultaneously trying
|
|
2569
2523
|
to delete.
|
|
2524
|
+
refs : `collections.abc.Collection` [ `DatasetRef` ] or `None`
|
|
2525
|
+
Explicit list of datasets that can be removed from trash. If listed
|
|
2526
|
+
datasets are not already stored in the trash table they will be
|
|
2527
|
+
ignored. If `None` every entry in the trash table will be
|
|
2528
|
+
processed.
|
|
2529
|
+
dry_run : `bool`, optional
|
|
2530
|
+
If `True`, the trash table will be queried and results reported
|
|
2531
|
+
but no artifacts will be removed.
|
|
2532
|
+
|
|
2533
|
+
Returns
|
|
2534
|
+
-------
|
|
2535
|
+
removed : `set` [ `lsst.resources.ResourcePath` ]
|
|
2536
|
+
List of artifacts that were removed.
|
|
2537
|
+
|
|
2538
|
+
Notes
|
|
2539
|
+
-----
|
|
2540
|
+
Will empty the records from the trash tables only if this call finishes
|
|
2541
|
+
without raising.
|
|
2570
2542
|
"""
|
|
2571
|
-
|
|
2543
|
+
removed = set()
|
|
2544
|
+
if refs:
|
|
2545
|
+
selected_ids = {ref.id for ref in refs}
|
|
2546
|
+
n_chunks = 0
|
|
2547
|
+
for chunk in chunk_iterable(selected_ids, chunk_size=50_000):
|
|
2548
|
+
n_chunks += 1
|
|
2549
|
+
log.verbose("Emptying trash for chunk %d of size %d", n_chunks, len(chunk))
|
|
2550
|
+
removed.update(
|
|
2551
|
+
self._empty_trash_subset(ignore_errors=ignore_errors, selected_ids=chunk, dry_run=dry_run)
|
|
2552
|
+
)
|
|
2553
|
+
else:
|
|
2554
|
+
log.verbose("Emptying all trash in datastore %s", self.name)
|
|
2555
|
+
removed = self._empty_trash_subset(ignore_errors=ignore_errors, dry_run=dry_run)
|
|
2556
|
+
log.info(
|
|
2557
|
+
"%sRemoved %d file artifact%s from datastore %s",
|
|
2558
|
+
"Would have " if dry_run else "",
|
|
2559
|
+
len(removed),
|
|
2560
|
+
"s" if len(removed) != 1 else "",
|
|
2561
|
+
self.name,
|
|
2562
|
+
)
|
|
2563
|
+
return removed
|
|
2564
|
+
|
|
2565
|
+
@transactional
|
|
2566
|
+
def _empty_trash_subset(
|
|
2567
|
+
self,
|
|
2568
|
+
*,
|
|
2569
|
+
ignore_errors: bool = True,
|
|
2570
|
+
selected_ids: Collection[DatasetId] | None = None,
|
|
2571
|
+
dry_run: bool = False,
|
|
2572
|
+
) -> set[ResourcePath]:
|
|
2573
|
+
"""Empty trash table in transaction.
|
|
2572
2574
|
|
|
2575
|
+
Parameters
|
|
2576
|
+
----------
|
|
2577
|
+
ignore_errors : `bool`
|
|
2578
|
+
If `True` return without error even if something went wrong.
|
|
2579
|
+
Problems could occur if another process is simultaneously trying
|
|
2580
|
+
to delete.
|
|
2581
|
+
selected_ids : `collections.abc.collection` [`DatasetId`] or `None`
|
|
2582
|
+
Explicit list of dataset IDs that can be removed from the trash.
|
|
2583
|
+
If listed datasets are not already included in the trash table
|
|
2584
|
+
they will be ignored. If `None` every entry in the trash table
|
|
2585
|
+
will be processed.
|
|
2586
|
+
dry_run : `bool`, optional
|
|
2587
|
+
If `True`, the trash table will be queried and results reported
|
|
2588
|
+
but no artifacts will be removed.
|
|
2589
|
+
|
|
2590
|
+
Returns
|
|
2591
|
+
-------
|
|
2592
|
+
removed : `set` [ `lsst.resources.ResourcePath` ]
|
|
2593
|
+
Artifacts successfully removed.
|
|
2594
|
+
|
|
2595
|
+
Notes
|
|
2596
|
+
-----
|
|
2597
|
+
Will empty the records from the trash tables only if this call finishes
|
|
2598
|
+
without raising.
|
|
2599
|
+
"""
|
|
2573
2600
|
# Context manager will empty trash iff we finish it without raising.
|
|
2574
2601
|
# It will also automatically delete the relevant rows from the
|
|
2575
2602
|
# trash table and the records table.
|
|
2576
2603
|
with self.bridge.emptyTrash(
|
|
2577
|
-
self._table,
|
|
2604
|
+
self._table,
|
|
2605
|
+
record_class=StoredFileInfo,
|
|
2606
|
+
record_column="path",
|
|
2607
|
+
selected_ids=selected_ids,
|
|
2608
|
+
dry_run=dry_run,
|
|
2578
2609
|
) as trash_data:
|
|
2579
2610
|
# Removing the artifacts themselves requires that the files are
|
|
2580
2611
|
# not also associated with refs that are not to be trashed.
|
|
@@ -2622,7 +2653,8 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2622
2653
|
else:
|
|
2623
2654
|
artifacts_to_keep = slow_artifacts_to_keep
|
|
2624
2655
|
|
|
2625
|
-
|
|
2656
|
+
n_direct = 0
|
|
2657
|
+
artifacts_to_delete: set[ResourcePath] = set()
|
|
2626
2658
|
for ref, info in trashed_list:
|
|
2627
2659
|
# Should not happen for this implementation but need
|
|
2628
2660
|
# to keep mypy happy.
|
|
@@ -2636,36 +2668,71 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2636
2668
|
# Only trashed refs still known to datastore will be returned.
|
|
2637
2669
|
location = info.file_location(self.locationFactory)
|
|
2638
2670
|
|
|
2639
|
-
|
|
2671
|
+
if location.pathInStore.isabs():
|
|
2672
|
+
n_direct += 1
|
|
2673
|
+
continue
|
|
2640
2674
|
|
|
2641
|
-
|
|
2642
|
-
|
|
2643
|
-
|
|
2644
|
-
"
|
|
2645
|
-
len(artifacts_to_delete),
|
|
2646
|
-
s_del,
|
|
2647
|
-
self.name,
|
|
2648
|
-
)
|
|
2675
|
+
# Strip fragment before storing since it is the artifact
|
|
2676
|
+
# we are deleting and we do not want repeats for every member
|
|
2677
|
+
# in a zip.
|
|
2678
|
+
artifacts_to_delete.add(location.uri.replace(fragment=""))
|
|
2649
2679
|
|
|
2650
|
-
|
|
2651
|
-
|
|
2652
|
-
|
|
2653
|
-
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
|
|
2680
|
+
if n_direct > 0:
|
|
2681
|
+
s = "s" if n_direct != 1 else ""
|
|
2682
|
+
log.verbose("Not deleting %d artifact%s using absolute URI%s", n_direct, s, s)
|
|
2683
|
+
|
|
2684
|
+
if artifacts_to_keep:
|
|
2685
|
+
log.verbose(
|
|
2686
|
+
"%d artifact%s were not deleted because they are associated with other datasets",
|
|
2687
|
+
len(artifacts_to_keep),
|
|
2688
|
+
"s" if len(artifacts_to_keep) != 1 else "",
|
|
2689
|
+
)
|
|
2690
|
+
|
|
2691
|
+
if not artifacts_to_delete:
|
|
2692
|
+
return set()
|
|
2693
|
+
|
|
2694
|
+
# Now do the deleting. Special case the log message for a single
|
|
2695
|
+
# artifact.
|
|
2696
|
+
if len(artifacts_to_delete) == 1:
|
|
2697
|
+
log.verbose(
|
|
2698
|
+
"%s removing file artifact %s from datastore %s",
|
|
2699
|
+
"Would be" if dry_run else "Now",
|
|
2700
|
+
list(artifacts_to_delete)[0],
|
|
2701
|
+
self.name,
|
|
2702
|
+
)
|
|
2703
|
+
else:
|
|
2704
|
+
log.verbose(
|
|
2705
|
+
"%s removing %d file artifacts from datastore %s",
|
|
2706
|
+
"Would be" if dry_run else "Now",
|
|
2707
|
+
len(artifacts_to_delete),
|
|
2708
|
+
self.name,
|
|
2709
|
+
)
|
|
2710
|
+
|
|
2711
|
+
# For dry-run mode do not attempt to search the file store for
|
|
2712
|
+
# the artifacts to determine whether they exist or not. Simply
|
|
2713
|
+
# report that an attempt would be made to delete them. Never
|
|
2714
|
+
# report direct imports.
|
|
2715
|
+
if dry_run:
|
|
2716
|
+
return artifacts_to_delete
|
|
2717
|
+
|
|
2718
|
+
# Now remove the actual file artifacts.
|
|
2719
|
+
remove_result = ResourcePath.mremove(artifacts_to_delete, do_raise=False)
|
|
2720
|
+
|
|
2721
|
+
removed: set[ResourcePath] = set()
|
|
2722
|
+
exceptions: list[Exception] = []
|
|
2723
|
+
for uri, result in remove_result.items():
|
|
2724
|
+
if result.exception is None or isinstance(result.exception, FileNotFoundError):
|
|
2725
|
+
# File not existing is not an error since some other
|
|
2726
|
+
# process might have been trying to clean it and we do not
|
|
2727
|
+
# want to raise an error for a situation where the file
|
|
2728
|
+
# is not there and we do not want it to be there.
|
|
2729
|
+
removed.add(uri)
|
|
2730
|
+
else:
|
|
2731
|
+
exceptions.append(result.exception)
|
|
2732
|
+
|
|
2733
|
+
if exceptions:
|
|
2734
|
+
s_err = "s" if len(exceptions) != 1 else ""
|
|
2735
|
+
e = ExceptionGroup(f"Error{s_err} removing {len(exceptions)} artifact{s_err}", exceptions)
|
|
2669
2736
|
if ignore_errors:
|
|
2670
2737
|
# Use a debug message here even though it's not
|
|
2671
2738
|
# a good situation. In some cases this can be
|
|
@@ -2674,18 +2741,18 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2674
2741
|
# other's files. Butler does not know about users
|
|
2675
2742
|
# and trash has no idea what collections these
|
|
2676
2743
|
# files were in (without guessing from a path).
|
|
2677
|
-
s_err = "s" if len(e.exceptions) != 1 else ""
|
|
2678
2744
|
log.debug(
|
|
2679
2745
|
"Encountered %d error%s removing %d artifact%s from datastore %s: %s",
|
|
2680
|
-
len(
|
|
2746
|
+
len(exceptions),
|
|
2681
2747
|
s_err,
|
|
2682
2748
|
len(artifacts_to_delete),
|
|
2683
|
-
|
|
2749
|
+
"s" if len(artifacts_to_delete) != 1 else "",
|
|
2684
2750
|
self.name,
|
|
2685
2751
|
e,
|
|
2686
2752
|
)
|
|
2687
2753
|
else:
|
|
2688
|
-
raise
|
|
2754
|
+
raise e
|
|
2755
|
+
return removed
|
|
2689
2756
|
|
|
2690
2757
|
@transactional
|
|
2691
2758
|
def transfer_from(
|
|
@@ -33,7 +33,7 @@ __all__ = ("InMemoryDatastore", "StoredMemoryItemInfo")
|
|
|
33
33
|
|
|
34
34
|
import logging
|
|
35
35
|
import time
|
|
36
|
-
from collections.abc import Iterable, Mapping
|
|
36
|
+
from collections.abc import Collection, Iterable, Mapping
|
|
37
37
|
from dataclasses import dataclass
|
|
38
38
|
from typing import TYPE_CHECKING, Any
|
|
39
39
|
from urllib.parse import urlencode
|
|
@@ -627,13 +627,28 @@ class InMemoryDatastore(GenericBaseDatastore[StoredMemoryItemInfo]):
|
|
|
627
627
|
with self._transaction.undoWith(f"Trash {len(ref_list)} datasets", _rollbackMoveToTrash, ref_list):
|
|
628
628
|
self._trashedIds.update(ref.id for ref in ref_list)
|
|
629
629
|
|
|
630
|
-
def emptyTrash(
|
|
630
|
+
def emptyTrash(
|
|
631
|
+
self, ignore_errors: bool = False, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
|
|
632
|
+
) -> set[ResourcePath]:
|
|
631
633
|
"""Remove all datasets from the trash.
|
|
632
634
|
|
|
633
635
|
Parameters
|
|
634
636
|
----------
|
|
635
637
|
ignore_errors : `bool`, optional
|
|
636
638
|
Ignore errors.
|
|
639
|
+
refs : `collections.abc.Collection` [ `DatasetRef` ] or `None`
|
|
640
|
+
Explicit list of datasets that can be removed from trash. If listed
|
|
641
|
+
datasets are not already stored in the trash table they will be
|
|
642
|
+
ignored. If `None` every entry in the trash table will be
|
|
643
|
+
processed.
|
|
644
|
+
dry_run : `bool`, optional
|
|
645
|
+
If `True`, the trash table will be queried and results reported
|
|
646
|
+
but no artifacts will be removed.
|
|
647
|
+
|
|
648
|
+
Returns
|
|
649
|
+
-------
|
|
650
|
+
removed : `set` [ `lsst.resources.ResourcePath` ]
|
|
651
|
+
List of artifacts that were removed. Empty for this datastore.
|
|
637
652
|
|
|
638
653
|
Notes
|
|
639
654
|
-----
|
|
@@ -647,7 +662,19 @@ class InMemoryDatastore(GenericBaseDatastore[StoredMemoryItemInfo]):
|
|
|
647
662
|
"""
|
|
648
663
|
log.debug("Emptying trash in datastore %s", self.name)
|
|
649
664
|
|
|
650
|
-
|
|
665
|
+
trashed_ids = self._trashedIds
|
|
666
|
+
if refs:
|
|
667
|
+
selected_ids = {ref.id for ref in refs}
|
|
668
|
+
if selected_ids is not None:
|
|
669
|
+
trashed_ids = {tid for tid in trashed_ids if tid in selected_ids}
|
|
670
|
+
|
|
671
|
+
if dry_run:
|
|
672
|
+
log.info(
|
|
673
|
+
"Would attempt remove %s dataset%s.", len(trashed_ids), "s" if len(trashed_ids) != 1 else ""
|
|
674
|
+
)
|
|
675
|
+
return set()
|
|
676
|
+
|
|
677
|
+
for dataset_id in trashed_ids:
|
|
651
678
|
try:
|
|
652
679
|
realID, _ = self._get_dataset_info(dataset_id)
|
|
653
680
|
except FileNotFoundError:
|
|
@@ -677,7 +704,8 @@ class InMemoryDatastore(GenericBaseDatastore[StoredMemoryItemInfo]):
|
|
|
677
704
|
self._remove_stored_item_info(dataset_id)
|
|
678
705
|
|
|
679
706
|
# Empty the trash table
|
|
680
|
-
self._trashedIds =
|
|
707
|
+
self._trashedIds = self._trashedIds - trashed_ids
|
|
708
|
+
return set()
|
|
681
709
|
|
|
682
710
|
def validateConfiguration(
|
|
683
711
|
self, entities: Iterable[DatasetRef | DatasetType | StorageClass], logFailures: bool = False
|