lsst-daf-butler 30.0.0rc3__tar.gz → 30.2025.5000__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-30.0.0rc3/python/lsst_daf_butler.egg-info → lsst_daf_butler-30.2025.5000}/PKG-INFO +1 -1
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/CHANGES.rst +0 -115
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler.py +5 -8
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler_metrics.py +2 -49
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_formatter.py +9 -2
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_labeled_butler_factory.py +8 -28
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -1
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -15
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/record_data.py +1 -1
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -14
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -5
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_butler/_direct_butler.py +28 -45
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/logging.py +3 -9
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/bridge/monolithic.py +13 -17
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +45 -49
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -6
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/sql_registry.py +24 -2
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_remote_butler.py +1 -5
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/hybrid_butler.py +1 -4
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/transfers/_context.py +6 -7
- lsst_daf_butler-30.2025.5000/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -3
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_butler.py +1 -114
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_butler_factory.py +7 -11
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_datastore.py +0 -40
- lsst_daf_butler-30.0.0rc3/python/lsst/daf/butler/_rubin/temporary_for_ingest.py +0 -207
- lsst_daf_butler-30.0.0rc3/python/lsst/daf/butler/registry/expand_data_ids.py +0 -93
- lsst_daf_butler-30.0.0rc3/python/lsst/daf/butler/tests/registry_data/lsstcam-subset.yaml +0 -191
- lsst_daf_butler-30.0.0rc3/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/COPYRIGHT +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/LICENSE +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/MANIFEST.in +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/README.md +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/bsd_license.txt +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/pyproject.toml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_uuid.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/server_available.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/setup.cfg +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_composites.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_config.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_location.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_logging.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_packages.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_progress.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_server.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_templates.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_utils.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_uuid.py +0 -0
- {lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/tests/test_versioning.py +0 -0
{lsst_daf_butler-30.0.0rc3/python/lsst_daf_butler.egg-info → lsst_daf_butler-30.2025.5000}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 30.
|
|
3
|
+
Version: 30.2025.5000
|
|
4
4
|
Summary: An abstraction layer for reading and writing astronomical data to datastores.
|
|
5
5
|
Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
|
|
6
6
|
License-Expression: BSD-3-Clause OR GPL-3.0-or-later
|
|
@@ -1,118 +1,3 @@
|
|
|
1
|
-
Butler v30.0.0 (2026-01-15)
|
|
2
|
-
===========================
|
|
3
|
-
|
|
4
|
-
New Features
|
|
5
|
-
------------
|
|
6
|
-
|
|
7
|
-
- Modified ``ButlerMDC`` to preserve metadata for exceptions that are raised in a context but handled outside it.
|
|
8
|
-
This lets exceptions be logged by high-level handlers the same way they would have been if the problem were logged immediately. (`DM-42272 <https://rubinobs.atlassian.net/browse/DM-42272>`_)
|
|
9
|
-
- Added a new method ``Butler.query_all_datasets()``, which can be used to query for datasets of multiple types more efficiently than looping over ``query_datasets()``. (`DM-47563 <https://rubinobs.atlassian.net/browse/DM-47563>`_)
|
|
10
|
-
- Added a new registry configuration option ``temporary_tables: False`` to disable the use of temporary tables by the database backend. (`DM-51125 <https://rubinobs.atlassian.net/browse/DM-51125>`_)
|
|
11
|
-
- Added support to the query language to allow sky regions to be specified directly in an ADQL-like way. This includes ``CIRCLE``, ``BOX``, ``POLYGON``, and ``REGION``. (`DM-51454 <https://rubinobs.atlassian.net/browse/DM-51454>`_)
|
|
12
|
-
- ``Butler.transfer_dimension_records_from`` now accepts ``DataCoordinate`` instances in addition to ``DatasetRef`` instances to specify the dimension records to be transferred. (`DM-51681 <https://rubinobs.atlassian.net/browse/DM-51681>`_)
|
|
13
|
-
- ``Butler.ingest()`` now has an optional ``skip_existing`` parameter that makes it ignore datasets that already exist in the repository instead of raising an error. This makes it easier for applications to retry ingests. (`DM-52179 <https://rubinobs.atlassian.net/browse/DM-52179>`_)
|
|
14
|
-
- Added glob-style matching to column names in parquet tables, when specified via the ``columns`` parameter. (`DM-52515 <https://rubinobs.atlassian.net/browse/DM-52515>`_)
|
|
15
|
-
- Added a new ``--remove-from-parents`` flag for the ``remove-collections`` CLI to allow removal of collections that are still referenced from chained collections. (`DM-52782 <https://rubinobs.atlassian.net/browse/DM-52782>`_)
|
|
16
|
-
- We now build the Butler server Docker container for both arm64 and amd64. (`DM-52819 <https://rubinobs.atlassian.net/browse/DM-52819>`_)
|
|
17
|
-
- Made ``ButlerLogRecords`` extensible.
|
|
18
|
-
|
|
19
|
-
This changes the ``ButlerLogRecords`` file format (the old format can still be
|
|
20
|
-
read) to allow arbitrary JSON data to be serialized with the log records.
|
|
21
|
-
|
|
22
|
-
The ``ButlerLogRecords`` class has been modified to inherit from
|
|
23
|
-
``collections.abc.MutableSequence`` instead of `pydantic.RootModel`, which means
|
|
24
|
-
Pydantic methods can no longer be called on it directly (in particular, use
|
|
25
|
-
``to_json_data`` to serialize instead of ``model_dump_json``). (`DM-53019 <https://rubinobs.atlassian.net/browse/DM-53019>`_)
|
|
26
|
-
- The ``id`` parameter to ``Butler.get_dataset`` now accepts hexadecimal strings, in addition to UUID instances.
|
|
27
|
-
A new method ``Butler.get_many_datasets()`` allows the efficient lookup of multiple ``DatasetRef`` by dataset UUID. (`DM-53176 <https://rubinobs.atlassian.net/browse/DM-53176>`_)
|
|
28
|
-
- Added ``Butler.close()``, a context manager implementation for ``Butler``, and ``QuantumBackedButler.close()``. These can be used to ensure that database connections are closed deterministically, rather than waiting for mark-and-sweep garbage collection. (`DM-53233 <https://rubinobs.atlassian.net/browse/DM-53233>`_)
|
|
29
|
-
- ``LabeledButlerFactory`` now has a ``writeable`` constructor option to allow writeable Butlers to be instantiated.
|
|
30
|
-
``LabeledButlerFactory`` can now be used as a context manager to control the lifetime of its database connections. (`DM-53739 <https://rubinobs.atlassian.net/browse/DM-53739>`_)
|
|
31
|
-
|
|
32
|
-
Bug Fixes
|
|
33
|
-
---------
|
|
34
|
-
|
|
35
|
-
- Fixed a few server-side exceptions that should have been sent to ``RemoteButler`` clients as meaningful exceptions, but instead were triggering an HTTP 500 Internal Server Error. (`DM-51314 <https://rubinobs.atlassian.net/browse/DM-51314>`_)
|
|
36
|
-
- Deferred loading storage class definitions when deserializing datastore records.
|
|
37
|
-
|
|
38
|
-
This prevents storage class lookup errors when loading quantum graphs, when the storage class definitions are defined somewhere other than the defaults in ``daf_butler`` (such as a repository root). (`DM-51381 <https://rubinobs.atlassian.net/browse/DM-51381>`_)
|
|
39
|
-
- When exporting ``visit`` dimension records, ``Butler.export()`` now includes ``populated_by: visit`` records like ``visit_definition``/``visit_system_membership``, and the associated ``exposure`` records. (`DM-51681 <https://rubinobs.atlassian.net/browse/DM-51681>`_)
|
|
40
|
-
- Fixed a bug introduced in July 2024 in collection query methods that specify ``flatten_chains=True`` with name patterns.
|
|
41
|
-
|
|
42
|
-
The bug resulted in not returning all children names for a chain collection that matches the pattern, only child names that also match the pattern were returned. (`DM-51819 <https://rubinobs.atlassian.net/browse/DM-51819>`_)
|
|
43
|
-
- ``Butler.ingest()`` now checks for conflicting datastore records before ingesting files, reducing the likelihood of an issue where existing files are overwritten/deleted by an ingest that fails due to conflicting datasets. (`DM-52179 <https://rubinobs.atlassian.net/browse/DM-52179>`_)
|
|
44
|
-
- Query generation will no longer throw ``sqlalchemy.exc.ArgumentError`` when attempting to use a dataset calibration timespan constraint for a dataset search without any calibration collections. (`DM-52398 <https://rubinobs.atlassian.net/browse/DM-52398>`_)
|
|
45
|
-
- Changed the conceptual timespan associated with ``RUN`` and ``TAGGED`` collections from `None` / ``NULL`` to an unbounded timespan.
|
|
46
|
-
|
|
47
|
-
This fixes the behavior of temporal joins in quantum graph builds, where prior to this change a ``RUN`` or ``TAGGED`` collection earlier in the search path would be silently ignored in favor of a later ``CALIBRATION`` collection.
|
|
48
|
-
It also changes the value of timespan columns for these collection types via the ``Query.general`` interface.
|
|
49
|
-
The behavior of ``queryDatasetAssociations`` has *not* been changed for backwards-compatibility; it continues to return ``timespan=None`` for non-``CALIBRATION``` collections. (`DM-52895 <https://rubinobs.atlassian.net/browse/DM-52895>`_)
|
|
50
|
-
- The unit tests will no longer fail due to file descriptor exhaustion.
|
|
51
|
-
All `ResourceWarning` messages in the unit test suite have been fixed.
|
|
52
|
-
Butler instances are now garbage-collected immediately when they are no longer referenced, although their database connections still might not be released until mark-and-sweep garbage collection runs. (`DM-53233 <https://rubinobs.atlassian.net/browse/DM-53233>`_)
|
|
53
|
-
- Fixed compatibility of the unit test suite with pytest v9. (`DM-53266 <https://rubinobs.atlassian.net/browse/DM-53266>`_)
|
|
54
|
-
- Storage classes are no longer loaded implicitly when using ``Butler.registry.queryDatasets()``.
|
|
55
|
-
A warning about the ``datasetType`` parameter being deprecated is no longer issued when calling ``Butler.registry.queryDatasetAssociations``. (`DM-53342 <https://rubinobs.atlassian.net/browse/DM-53342>`_)
|
|
56
|
-
- ``FileDatastore.export_records()`` will no longer fail with ``sqlalchemy.exc.InternalError`` when given a large number of dataset IDs.
|
|
57
|
-
``Butler.get_many_datasets()`` will no longer fail with ``sqlalchemy.exc.InternalError`` when given a large number of dataset IDs. (`DM-53610 <https://rubinobs.atlassian.net/browse/DM-53610>`_)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
Performance Enhancement
|
|
61
|
-
-----------------------
|
|
62
|
-
|
|
63
|
-
- Fewer database queries are now used when inserting/exporting datasets, in cases where the datasets do not have "expanded data ID" values known in advance. (`DM-51593 <https://rubinobs.atlassian.net/browse/DM-51593>`_)
|
|
64
|
-
- ``Butler.transfer_from(transfer_dimensions = True)``, ``Butler.transfer_dimension_records_from()``, and ``butler transfer-datasets`` are now significantly faster. (`DM-51681 <https://rubinobs.atlassian.net/browse/DM-51681>`_)
|
|
65
|
-
- New dataset UUIDs are now generated using UUIDv7 instead of UUIDv4, to improve Postgres insert performance. (`DM-52719 <https://rubinobs.atlassian.net/browse/DM-52719>`_)
|
|
66
|
-
- Removed unnecessary directory existence checks when writing files to the datastore.
|
|
67
|
-
We no longer create zero-byte files to represent "directories" when writing files to an S3 datastore. (`DM-53580 <https://rubinobs.atlassian.net/browse/DM-53580>`_)
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
Other Changes and Additions
|
|
71
|
-
---------------------------
|
|
72
|
-
|
|
73
|
-
- Updated the storage class definitions for scarlet lite models to be Zip archives that can be accessed as single blends. (`DM-49537 <https://rubinobs.atlassian.net/browse/DM-49537>`_)
|
|
74
|
-
- Made some registry test data available to downstream packages via `importlib.resources`. (`DM-51363 <https://rubinobs.atlassian.net/browse/DM-51363>`_)
|
|
75
|
-
- Added support for ``obs_publisher_did`` value in ObsCore config file. (`DM-51383 <https://rubinobs.atlassian.net/browse/DM-51383>`_)
|
|
76
|
-
- * Modified ``ObsCore`` records to place "exposure" in any visit fields if there is an exposure but no visit defined.
|
|
77
|
-
This required the addition of a new method to the ``RecordFactory`` which can be subclassed by other plugins.
|
|
78
|
-
* Added ability to hard code the ``s_xel1`` and ``s_xel2`` ObsCore fields per dataset type. (`DM-51495 <https://rubinobs.atlassian.net/browse/DM-51495>`_)
|
|
79
|
-
- Drop incomplete support for case-insensitive handling of identifiers in query expressions.
|
|
80
|
-
|
|
81
|
-
Some code in the query generation system was trying to allow dimension names to be case-insensitive, but was actually just inadvertently requiring all dimension names to be defined as lowercase.
|
|
82
|
-
Our Python-flavored user base probably expects case-sensitive dimension and dataset type names anyway.
|
|
83
|
-
|
|
84
|
-
Constants (e.g., ``AND`` or ``OVERLAPS``) in the query system are still case insensitive. (`DM-52339 <https://rubinobs.atlassian.net/browse/DM-52339>`_)
|
|
85
|
-
- ``Butler.registry.queryDatasets``, ``Butler.registry.queryDataIds``, and ``Butler.registry.queryDimensionRecords`` have been re-implemented using the same query framework backing ``Butler.query()`` and the various ``Butler.query_*()`` methods. Though the ``Butler.registry.*`` methods are not yet deprecated, users are encouraged to begin migrating to the equivalent ``Butler.query_*`` functions. The new implementation comes with a number of minor behavior changes:
|
|
86
|
-
- We no longer raise an exception if governor dimension values in a query constraint are not known to the registry. Instead, we return no results.
|
|
87
|
-
- Result rows are now deduplicated.
|
|
88
|
-
- ``findFirst`` searches are now supported in calibration collections. (`DM-52397 <https://rubinobs.atlassian.net/browse/DM-52397>`_)
|
|
89
|
-
- ``Butler.find_dataset()`` / ``Butler.registry.findDataset()`` have been re-implemented using the same query framework backing ``Butler.query()``. These methods now always return ``DatasetRef`` instances with ``dataId.hasFull() = True``. (`DM-52398 <https://rubinobs.atlassian.net/browse/DM-52398>`_)
|
|
90
|
-
- For EUPS users we now set the ``ARROW_DEFAULT_MEMORY_POOL`` environment variable to ``jemalloc``.
|
|
91
|
-
This works around a memory leak reported in https://github.com/apache/arrow/issues/45882 for pyarrow v18 and newer. (`DM-52412 <https://rubinobs.atlassian.net/browse/DM-52412>`_)
|
|
92
|
-
- Added a new ``Datastore`` API for retrieving the datastore records for datasets that might not have been written yet.
|
|
93
|
-
There is also a related API added to ``QuantumBackedButler``. (`DM-52653 <https://rubinobs.atlassian.net/browse/DM-52653>`_)
|
|
94
|
-
- Rewrote the default compression write recipes to match the new interfaces for FITS compression in ``afw`` and ``obs_base``. (`DM-52879 <https://rubinobs.atlassian.net/browse/DM-52879>`_)
|
|
95
|
-
- Added new options to ``DatasetProvenance`` to prevent excessive numbers of input datasets being recorded in file metadata.
|
|
96
|
-
The limit for parquet datasets was set to 2,000 inputs. (`DM-53326 <https://rubinobs.atlassian.net/browse/DM-53326>`_)
|
|
97
|
-
- Added ``lossy16`` compression recipe to replace ``lossyBasic`` (`DM-53420 <https://rubinobs.atlassian.net/browse/DM-53420>`_)
|
|
98
|
-
- Added a storage class and formatter declaration for the ``ProvenanceQuantumGraph`` class.
|
|
99
|
-
|
|
100
|
-
Allowed a ``ButlerLogRecords`` container to be passed to the log handler at construction. (`DM-53622 <https://rubinobs.atlassian.net/browse/DM-53622>`_)
|
|
101
|
-
- Added metrics recording for ``butler.ingest``. (`DM-53679 <https://rubinobs.atlassian.net/browse/DM-53679>`_)
|
|
102
|
-
- Added Butler storage class definitions for ``GuiderROI`` ``VignettingCorrection`` class (`OSW-1064 <https://rubinobs.atlassian.net/browse/OSW-1064>`_)
|
|
103
|
-
|
|
104
|
-
An API Removal or Deprecation
|
|
105
|
-
-----------------------------
|
|
106
|
-
|
|
107
|
-
- ``daf_butler`` no longer depends on the ``daf_relation`` library.
|
|
108
|
-
``daf_relation``-related internal classes are no longer exported from the top-level module.
|
|
109
|
-
Butler query expression classes have moved from ``lsst.daf.butler.registry.queries`` to ``lsst.daf.butler.queries``. (`DM-52345 <https://rubinobs.atlassian.net/browse/DM-52345>`_)
|
|
110
|
-
- Removed deprecated ``DatasetQueryResults.materialize()`` method.
|
|
111
|
-
Removed deprecated ``offset`` parameter from the ``limit`` method in the ``DataCoordinateQueryResults``, ``DatasetQueryResults``, and ``DimensionRecordQueryResults`` classes.
|
|
112
|
-
Removed the deprecated feature where HTM and HEALPix spatial dimensions like ``htm11`` or ``healpix10`` could be used in data ID constraints passed to queries. The exception is ``htm7``, which will continue to work. Users should instead use region ``OVERLAPS`` constraints in query ``where`` expressions.
|
|
113
|
-
Removed support for ``<`` and ``>`` operators in ``Butler.registry.query*()`` ``where`` strings for comparisons of ``Timespan`` vs ``Timespan``, or ``Timespan`` vs ``Time``. Instead, use ``timespan.begin < ts`` or ``timespan.end > ts`` to explicitly indicate which timespan bound you are comparing with. (`DM-52397 <https://rubinobs.atlassian.net/browse/DM-52397>`_)
|
|
114
|
-
|
|
115
|
-
|
|
116
1
|
Butler v29.1.0 (2025-06-13)
|
|
117
2
|
===========================
|
|
118
3
|
|
{lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler.py
RENAMED
|
@@ -1566,7 +1566,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1566
1566
|
|
|
1567
1567
|
@abstractmethod
|
|
1568
1568
|
def transfer_dimension_records_from(
|
|
1569
|
-
self, source_butler: LimitedButler | Butler, source_refs: Iterable[DatasetRef
|
|
1569
|
+
self, source_butler: LimitedButler | Butler, source_refs: Iterable[DatasetRef]
|
|
1570
1570
|
) -> None:
|
|
1571
1571
|
"""Transfer dimension records to this Butler from another Butler.
|
|
1572
1572
|
|
|
@@ -1578,9 +1578,10 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1578
1578
|
`Butler` whose registry will be used to expand data IDs. If the
|
|
1579
1579
|
source refs contain coordinates that are used to populate other
|
|
1580
1580
|
records then this will also need to be a full `Butler`.
|
|
1581
|
-
source_refs : iterable of `DatasetRef`
|
|
1582
|
-
Datasets
|
|
1583
|
-
|
|
1581
|
+
source_refs : iterable of `DatasetRef`
|
|
1582
|
+
Datasets defined in the source butler whose dimension records
|
|
1583
|
+
should be transferred to this butler. In most circumstances.
|
|
1584
|
+
transfer is faster if the dataset refs are expanded.
|
|
1584
1585
|
"""
|
|
1585
1586
|
raise NotImplementedError()
|
|
1586
1587
|
|
|
@@ -2226,7 +2227,3 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
2226
2227
|
@abstractmethod
|
|
2227
2228
|
def close(self) -> None:
|
|
2228
2229
|
raise NotImplementedError()
|
|
2229
|
-
|
|
2230
|
-
@abstractmethod
|
|
2231
|
-
def _expand_data_ids(self, data_ids: Iterable[DataCoordinate]) -> list[DataCoordinate]:
|
|
2232
|
-
raise NotImplementedError()
|
{lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_butler_metrics.py
RENAMED
|
@@ -29,15 +29,12 @@ from __future__ import annotations
|
|
|
29
29
|
|
|
30
30
|
from collections.abc import Callable, Iterator
|
|
31
31
|
from contextlib import contextmanager
|
|
32
|
-
from typing import Concatenate, ParamSpec
|
|
33
32
|
|
|
34
33
|
from pydantic import BaseModel
|
|
35
34
|
|
|
36
35
|
from lsst.utils.logging import LsstLoggers
|
|
37
36
|
from lsst.utils.timer import time_this
|
|
38
37
|
|
|
39
|
-
P = ParamSpec("P")
|
|
40
|
-
|
|
41
38
|
|
|
42
39
|
class ButlerMetrics(BaseModel):
|
|
43
40
|
"""Metrics collected during Butler operations."""
|
|
@@ -48,26 +45,18 @@ class ButlerMetrics(BaseModel):
|
|
|
48
45
|
time_in_get: float = 0.0
|
|
49
46
|
"""Wall-clock time, in seconds, spent in get()."""
|
|
50
47
|
|
|
51
|
-
time_in_ingest: float = 0.0
|
|
52
|
-
"""Wall-clock time, in seconds, spent in ingest()."""
|
|
53
|
-
|
|
54
48
|
n_get: int = 0
|
|
55
49
|
"""Number of datasets retrieved with get()."""
|
|
56
50
|
|
|
57
51
|
n_put: int = 0
|
|
58
52
|
"""Number of datasets stored with put()."""
|
|
59
53
|
|
|
60
|
-
n_ingest: int = 0
|
|
61
|
-
"""Number of datasets ingested."""
|
|
62
|
-
|
|
63
54
|
def reset(self) -> None:
|
|
64
55
|
"""Reset all metrics."""
|
|
65
56
|
self.time_in_put = 0.0
|
|
66
57
|
self.time_in_get = 0.0
|
|
67
|
-
self.time_in_ingest = 0.0
|
|
68
58
|
self.n_get = 0
|
|
69
59
|
self.n_put = 0
|
|
70
|
-
self.n_ingest = 0
|
|
71
60
|
|
|
72
61
|
def increment_get(self, duration: float) -> None:
|
|
73
62
|
"""Increment time for get().
|
|
@@ -91,31 +80,13 @@ class ButlerMetrics(BaseModel):
|
|
|
91
80
|
self.time_in_put += duration
|
|
92
81
|
self.n_put += 1
|
|
93
82
|
|
|
94
|
-
def increment_ingest(self, duration: float, n_datasets: int) -> None:
|
|
95
|
-
"""Increment time and datasets for ingest().
|
|
96
|
-
|
|
97
|
-
Parameters
|
|
98
|
-
----------
|
|
99
|
-
duration : `float`
|
|
100
|
-
Duration to add to the ingest() statistics.
|
|
101
|
-
n_datasets : `int`
|
|
102
|
-
Number of datasets to be ingested for this call.
|
|
103
|
-
"""
|
|
104
|
-
self.time_in_ingest += duration
|
|
105
|
-
self.n_ingest += n_datasets
|
|
106
|
-
|
|
107
83
|
@contextmanager
|
|
108
84
|
def _timer(
|
|
109
|
-
self,
|
|
110
|
-
handler: Callable[Concatenate[float, P], None],
|
|
111
|
-
log: LsstLoggers | None = None,
|
|
112
|
-
msg: str | None = None,
|
|
113
|
-
*args: P.args,
|
|
114
|
-
**kwargs: P.kwargs,
|
|
85
|
+
self, handler: Callable[[float], None], log: LsstLoggers | None = None, msg: str | None = None
|
|
115
86
|
) -> Iterator[None]:
|
|
116
87
|
with time_this(log=log, msg=msg) as timer:
|
|
117
88
|
yield
|
|
118
|
-
handler(timer.duration
|
|
89
|
+
handler(timer.duration)
|
|
119
90
|
|
|
120
91
|
@contextmanager
|
|
121
92
|
def instrument_get(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
|
|
@@ -144,21 +115,3 @@ class ButlerMetrics(BaseModel):
|
|
|
144
115
|
"""
|
|
145
116
|
with self._timer(self.increment_put, log=log, msg=msg):
|
|
146
117
|
yield
|
|
147
|
-
|
|
148
|
-
@contextmanager
|
|
149
|
-
def instrument_ingest(
|
|
150
|
-
self, n_datasets: int, log: LsstLoggers | None = None, msg: str | None = None
|
|
151
|
-
) -> Iterator[None]:
|
|
152
|
-
"""Run code and increment ingest statistics.
|
|
153
|
-
|
|
154
|
-
Parameters
|
|
155
|
-
----------
|
|
156
|
-
n_datasets : `int`
|
|
157
|
-
Number of datasets being ingested.
|
|
158
|
-
log : `logging.Logger` or `None`
|
|
159
|
-
Logger to use for any timing information.
|
|
160
|
-
msg : `str` or `None`
|
|
161
|
-
Any message to be included in log output.
|
|
162
|
-
"""
|
|
163
|
-
with self._timer(self.increment_ingest, n_datasets=n_datasets, log=log, msg=msg):
|
|
164
|
-
yield
|
{lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/_formatter.py
RENAMED
|
@@ -54,7 +54,6 @@ from ._config import Config
|
|
|
54
54
|
from ._config_support import LookupKey, processLookupConfigs
|
|
55
55
|
from ._file_descriptor import FileDescriptor
|
|
56
56
|
from ._location import Location
|
|
57
|
-
from ._rubin.temporary_for_ingest import TemporaryForIngest
|
|
58
57
|
from .dimensions import DataCoordinate, DimensionUniverse
|
|
59
58
|
from .mapping_factory import MappingFactory
|
|
60
59
|
|
|
@@ -1032,7 +1031,15 @@ class FormatterV2:
|
|
|
1032
1031
|
"""
|
|
1033
1032
|
cache_manager = self._ensure_cache(cache_manager)
|
|
1034
1033
|
|
|
1035
|
-
|
|
1034
|
+
# Always write to a temporary even if
|
|
1035
|
+
# using a local file system -- that gives us atomic writes.
|
|
1036
|
+
# If a process is killed as the file is being written we do not
|
|
1037
|
+
# want it to remain in the correct place but in corrupt state.
|
|
1038
|
+
# For local files write to the output directory not temporary dir.
|
|
1039
|
+
prefix = uri.dirname() if uri.isLocal else None
|
|
1040
|
+
if prefix is not None:
|
|
1041
|
+
prefix.mkdir()
|
|
1042
|
+
with ResourcePath.temporary_uri(suffix=uri.getExtension(), prefix=prefix) as temporary_uri:
|
|
1036
1043
|
# Need to configure the formatter to write to a different
|
|
1037
1044
|
# location and that needs us to overwrite internals
|
|
1038
1045
|
log.debug("Writing dataset to temporary location at %s", temporary_uri)
|
|
@@ -30,9 +30,7 @@ from __future__ import annotations
|
|
|
30
30
|
__all__ = ("LabeledButlerFactory", "LabeledButlerFactoryProtocol")
|
|
31
31
|
|
|
32
32
|
from collections.abc import Mapping
|
|
33
|
-
from
|
|
34
|
-
from logging import getLogger
|
|
35
|
-
from typing import Any, Literal, Protocol, Self
|
|
33
|
+
from typing import Protocol
|
|
36
34
|
|
|
37
35
|
from lsst.resources import ResourcePathExpression
|
|
38
36
|
|
|
@@ -42,8 +40,6 @@ from ._butler_repo_index import ButlerRepoIndex
|
|
|
42
40
|
from ._utilities.named_locks import NamedLocks
|
|
43
41
|
from ._utilities.thread_safe_cache import ThreadSafeCache
|
|
44
42
|
|
|
45
|
-
_LOG = getLogger(__name__)
|
|
46
|
-
|
|
47
43
|
|
|
48
44
|
class LabeledButlerFactoryProtocol(Protocol):
|
|
49
45
|
"""Callable to retrieve a butler from a label."""
|
|
@@ -51,7 +47,7 @@ class LabeledButlerFactoryProtocol(Protocol):
|
|
|
51
47
|
def __call__(self, label: str) -> Butler: ...
|
|
52
48
|
|
|
53
49
|
|
|
54
|
-
class LabeledButlerFactory
|
|
50
|
+
class LabeledButlerFactory:
|
|
55
51
|
"""Factory for efficiently instantiating Butler instances from the
|
|
56
52
|
repository index file. This is intended for use from long-lived services
|
|
57
53
|
that want to instantiate a separate Butler instance for each end user
|
|
@@ -64,9 +60,6 @@ class LabeledButlerFactory(AbstractContextManager):
|
|
|
64
60
|
files. If not provided, defaults to the global repository index
|
|
65
61
|
configured by the ``DAF_BUTLER_REPOSITORY_INDEX`` environment variable
|
|
66
62
|
-- see `ButlerRepoIndex`.
|
|
67
|
-
writeable : `bool`, optional
|
|
68
|
-
If `True`, Butler instances created by this factory will be writeable.
|
|
69
|
-
If `False` (the default), instances will be read-only.
|
|
70
63
|
|
|
71
64
|
Notes
|
|
72
65
|
-----
|
|
@@ -83,12 +76,11 @@ class LabeledButlerFactory(AbstractContextManager):
|
|
|
83
76
|
safely be used by separate threads.
|
|
84
77
|
"""
|
|
85
78
|
|
|
86
|
-
def __init__(self, repositories: Mapping[str, str] | None = None
|
|
79
|
+
def __init__(self, repositories: Mapping[str, str] | None = None) -> None:
|
|
87
80
|
if repositories is None:
|
|
88
81
|
self._repositories = None
|
|
89
82
|
else:
|
|
90
83
|
self._repositories = dict(repositories)
|
|
91
|
-
self._writeable = writeable
|
|
92
84
|
|
|
93
85
|
self._factories = ThreadSafeCache[str, _ButlerFactory]()
|
|
94
86
|
self._initialization_locks = NamedLocks()
|
|
@@ -96,16 +88,6 @@ class LabeledButlerFactory(AbstractContextManager):
|
|
|
96
88
|
# This may be overridden by unit tests.
|
|
97
89
|
self._preload_unsafe_direct_butler_caches = True
|
|
98
90
|
|
|
99
|
-
def __enter__(self) -> Self:
|
|
100
|
-
return self
|
|
101
|
-
|
|
102
|
-
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> Literal[False]:
|
|
103
|
-
try:
|
|
104
|
-
self.close()
|
|
105
|
-
except Exception:
|
|
106
|
-
_LOG.exception("An exception occurred during LabeledButlerFactory.close()")
|
|
107
|
-
return False
|
|
108
|
-
|
|
109
91
|
def bind(self, access_token: str | None) -> LabeledButlerFactoryProtocol:
|
|
110
92
|
"""Create a callable factory function for generating Butler instances
|
|
111
93
|
with out needing to specify access tokans again.
|
|
@@ -127,7 +109,7 @@ class LabeledButlerFactory(AbstractContextManager):
|
|
|
127
109
|
|
|
128
110
|
return create
|
|
129
111
|
|
|
130
|
-
def create_butler(self, label: str,
|
|
112
|
+
def create_butler(self, *, label: str, access_token: str | None) -> Butler:
|
|
131
113
|
"""Create a Butler instance.
|
|
132
114
|
|
|
133
115
|
Parameters
|
|
@@ -136,7 +118,7 @@ class LabeledButlerFactory(AbstractContextManager):
|
|
|
136
118
|
Label of the repository to instantiate, from the ``repositories``
|
|
137
119
|
parameter to the `LabeledButlerFactory` constructor or the global
|
|
138
120
|
repository index file.
|
|
139
|
-
access_token : `str` | `None
|
|
121
|
+
access_token : `str` | `None`
|
|
140
122
|
Gafaelfawr access token used to authenticate to a Butler server.
|
|
141
123
|
This is required for any repositories configured to use
|
|
142
124
|
`RemoteButler`. If you only use `DirectButler`, this may be
|
|
@@ -185,9 +167,7 @@ class LabeledButlerFactory(AbstractContextManager):
|
|
|
185
167
|
|
|
186
168
|
match butler_type:
|
|
187
169
|
case ButlerType.DIRECT:
|
|
188
|
-
return _DirectButlerFactory(
|
|
189
|
-
config, self._preload_unsafe_direct_butler_caches, self._writeable
|
|
190
|
-
)
|
|
170
|
+
return _DirectButlerFactory(config, self._preload_unsafe_direct_butler_caches)
|
|
191
171
|
case ButlerType.REMOTE:
|
|
192
172
|
return _RemoteButlerFactory(config)
|
|
193
173
|
case _:
|
|
@@ -209,12 +189,12 @@ class _ButlerFactory(Protocol):
|
|
|
209
189
|
|
|
210
190
|
|
|
211
191
|
class _DirectButlerFactory(_ButlerFactory):
|
|
212
|
-
def __init__(self, config: ButlerConfig, preload_unsafe_caches: bool
|
|
192
|
+
def __init__(self, config: ButlerConfig, preload_unsafe_caches: bool) -> None:
|
|
213
193
|
import lsst.daf.butler.direct_butler
|
|
214
194
|
|
|
215
195
|
# Create a 'template' Butler that will be cloned when callers request
|
|
216
196
|
# an instance.
|
|
217
|
-
self._butler = Butler.from_config(config
|
|
197
|
+
self._butler = Butler.from_config(config)
|
|
218
198
|
assert isinstance(self._butler, lsst.daf.butler.direct_butler.DirectButler)
|
|
219
199
|
|
|
220
200
|
# Load caches so that data is available in cloned instances without
|
|
@@ -100,4 +100,3 @@ VisitBackgroundModel: lsst.daf.butler.formatters.json.JsonFormatter
|
|
|
100
100
|
VignettingCorrection: lsst.ts.observatory.control.utils.extras.vignetting_storage.VignettingCorrectionFormatter
|
|
101
101
|
SSPAuxiliaryFile: lsst.pipe.tasks.sspAuxiliaryFile.SSPAuxiliaryFileFormatter
|
|
102
102
|
VisitGeometry: lsst.daf.butler.formatters.json.JsonFormatter
|
|
103
|
-
ProvenanceQuantumGraph: lsst.pipe.base.quantum_graph.formatter.ProvenanceFormatter
|
|
@@ -443,18 +443,3 @@ storageClasses:
|
|
|
443
443
|
pytype: lsst.pipe.tasks.sspAuxiliaryFile.SSPAuxiliaryFile
|
|
444
444
|
VisitGeometry:
|
|
445
445
|
pytype: lsst.obs.base.visit_geometry.VisitGeometry
|
|
446
|
-
ProvenanceQuantumGraph:
|
|
447
|
-
pytype: lsst.pipe.base.quantum_graph.ProvenanceQuantumGraph
|
|
448
|
-
parameters:
|
|
449
|
-
- import_mode # lsst.pipe.base.pipeline_graph.TaskImportMode
|
|
450
|
-
- quanta # iterable of uuid.UUID; quanta to read
|
|
451
|
-
- datasets # iterable of uuid.UUID; datasets to read
|
|
452
|
-
- read_init_quanta # bool, defaults to True; whether to read pre-exec-init info
|
|
453
|
-
derivedComponents:
|
|
454
|
-
packages: Packages # ignores node parameters
|
|
455
|
-
|
|
456
|
-
# UUID keys can be quantum or data IDs (whichever is passed in via
|
|
457
|
-
# parameters). Nested lists are attempts to run the quantum (last is
|
|
458
|
-
# most recent).
|
|
459
|
-
logs: StructuredDataDict # dict[uuid.UUID, list[ButlerLogRecords]]
|
|
460
|
-
metadata: StructuredDataDict # dict[uuid.UUID, list[TaskMetadata]]
|
|
@@ -49,7 +49,7 @@ if TYPE_CHECKING:
|
|
|
49
49
|
# Pydantic requires the possible value types to be explicitly enumerated in
|
|
50
50
|
# order for `uuid.UUID` in particular to work. `typing.Any` does not work
|
|
51
51
|
# here.
|
|
52
|
-
_Record: TypeAlias = dict[str, int | str | None]
|
|
52
|
+
_Record: TypeAlias = dict[str, int | str | uuid.UUID | None]
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
class SerializedDatastoreRecordData(pydantic.BaseModel):
|
|
@@ -3166,20 +3166,6 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
3166
3166
|
|
|
3167
3167
|
def export_records(self, refs: Iterable[DatasetIdRef]) -> Mapping[str, DatastoreRecordData]:
|
|
3168
3168
|
# Docstring inherited from the base class.
|
|
3169
|
-
|
|
3170
|
-
# This call to 'bridge.check' filters out "partially deleted" datasets.
|
|
3171
|
-
# Specifically, ones in the unusual edge state that:
|
|
3172
|
-
# 1. They have an entry in the registry dataset tables
|
|
3173
|
-
# 2. They were "trashed" from the datastore, so they are not
|
|
3174
|
-
# present in the "dataset_location" table.)
|
|
3175
|
-
# 3. But the trash has not been "emptied", so there are still entries
|
|
3176
|
-
# in the "opaque" datastore records table.
|
|
3177
|
-
#
|
|
3178
|
-
# As far as I can tell, this can only occur in the case of a concurrent
|
|
3179
|
-
# or aborted call to `Butler.pruneDatasets(unstore=True, purge=False)`.
|
|
3180
|
-
# Datasets (with or without files existing on disk) can persist in
|
|
3181
|
-
# this zombie state indefinitely, until someone manually empties
|
|
3182
|
-
# the trash.
|
|
3183
3169
|
exported_refs = list(self._bridge.check(refs))
|
|
3184
3170
|
ids = {ref.id for ref in exported_refs}
|
|
3185
3171
|
records: dict[DatasetId, dict[str, list[StoredDatastoreItemInfo]]] = {id: {} for id in ids}
|
|
@@ -755,11 +755,6 @@ class DataCoordinate:
|
|
|
755
755
|
to_json = to_json_pydantic
|
|
756
756
|
from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
|
|
757
757
|
|
|
758
|
-
@property
|
|
759
|
-
def dataId(self) -> Self:
|
|
760
|
-
"""Return this `DataCoordinate` instance, unmodified."""
|
|
761
|
-
return self
|
|
762
|
-
|
|
763
758
|
|
|
764
759
|
DataId = DataCoordinate | Mapping[str, Any]
|
|
765
760
|
"""A type-annotation alias for signatures that accept both informal data ID
|
|
@@ -1822,25 +1822,12 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1822
1822
|
f" Example: {existing_datasets[0]}"
|
|
1823
1823
|
)
|
|
1824
1824
|
|
|
1825
|
-
# Calculate some statistics based on the given list of datasets.
|
|
1826
|
-
n_files = len(datasets)
|
|
1827
|
-
n_datasets = 0
|
|
1828
|
-
for d in datasets:
|
|
1829
|
-
n_datasets += len(d.refs)
|
|
1830
|
-
sfiles = "s" if n_files != 1 else ""
|
|
1831
|
-
srefs = "s" if n_datasets != 1 else ""
|
|
1832
|
-
|
|
1833
1825
|
# We use `datasets` rather `new_datasets` for the Registry
|
|
1834
1826
|
# portion of this, to let it confirm that everything matches the
|
|
1835
1827
|
# existing datasets.
|
|
1836
1828
|
import_info = self._prepare_ingest_file_datasets(datasets, progress)
|
|
1837
1829
|
|
|
1838
|
-
with (
|
|
1839
|
-
self._metrics.instrument_ingest(
|
|
1840
|
-
n_datasets, _LOG, msg=f"Ingesting {n_files} file{sfiles} with {n_datasets} dataset{srefs}"
|
|
1841
|
-
),
|
|
1842
|
-
self.transaction(),
|
|
1843
|
-
):
|
|
1830
|
+
with self.transaction():
|
|
1844
1831
|
self._ingest_file_datasets(datasets, import_info, progress)
|
|
1845
1832
|
|
|
1846
1833
|
# Bulk-insert everything into Datastore.
|
|
@@ -1995,7 +1982,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
1995
1982
|
doImport(filename) # type: ignore
|
|
1996
1983
|
|
|
1997
1984
|
def transfer_dimension_records_from(
|
|
1998
|
-
self, source_butler: LimitedButler | Butler, source_refs: Iterable[DatasetRef
|
|
1985
|
+
self, source_butler: LimitedButler | Butler, source_refs: Iterable[DatasetRef]
|
|
1999
1986
|
) -> None:
|
|
2000
1987
|
# Allowed dimensions in the target butler.
|
|
2001
1988
|
elements = frozenset(element for element in self.dimensions.elements if element.has_own_table)
|
|
@@ -2025,13 +2012,16 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2025
2012
|
source_butler, data_ids, allowed_elements
|
|
2026
2013
|
)
|
|
2027
2014
|
|
|
2015
|
+
can_query = True if isinstance(source_butler, Butler) else False
|
|
2016
|
+
|
|
2028
2017
|
additional_records: dict[DimensionElement, dict[DataCoordinate, DimensionRecord]] = defaultdict(dict)
|
|
2029
2018
|
for original_element, record_mapping in primary_records.items():
|
|
2030
2019
|
# Get dimensions that depend on this dimension.
|
|
2031
2020
|
populated_by = self.dimensions.get_elements_populated_by(
|
|
2032
2021
|
self.dimensions[original_element.name] # type: ignore
|
|
2033
2022
|
)
|
|
2034
|
-
|
|
2023
|
+
|
|
2024
|
+
for data_id in record_mapping.keys():
|
|
2035
2025
|
for element in populated_by:
|
|
2036
2026
|
if element not in allowed_elements:
|
|
2037
2027
|
continue
|
|
@@ -2050,32 +2040,28 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2050
2040
|
# have to be scanned.
|
|
2051
2041
|
continue
|
|
2052
2042
|
|
|
2053
|
-
if
|
|
2054
|
-
|
|
2055
|
-
|
|
2056
|
-
|
|
2057
|
-
" requires a full Butler."
|
|
2058
|
-
)
|
|
2043
|
+
if not can_query:
|
|
2044
|
+
raise RuntimeError(
|
|
2045
|
+
f"Transferring populated_by records like {element.name} requires a full Butler."
|
|
2046
|
+
)
|
|
2059
2047
|
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
|
|
2065
|
-
|
|
2048
|
+
records = source_butler.query_dimension_records( # type: ignore
|
|
2049
|
+
element.name,
|
|
2050
|
+
explain=False,
|
|
2051
|
+
**data_id.mapping, # type: ignore
|
|
2052
|
+
)
|
|
2053
|
+
for record in records:
|
|
2054
|
+
additional_records[record.definition].setdefault(record.dataId, record)
|
|
2066
2055
|
|
|
2067
2056
|
# The next step is to walk back through the additional records to
|
|
2068
2057
|
# pick up any missing content (such as visit_definition needing to
|
|
2069
2058
|
# know the exposure). Want to ensure we do not request records we
|
|
2070
2059
|
# already have.
|
|
2071
2060
|
missing_data_ids = set()
|
|
2072
|
-
for record_mapping in additional_records.
|
|
2061
|
+
for name, record_mapping in additional_records.items():
|
|
2073
2062
|
for data_id in record_mapping.keys():
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
dimension_key = data_id.subset(dimension)
|
|
2077
|
-
if dimension_key not in primary_records[element]:
|
|
2078
|
-
missing_data_ids.add(dimension_key)
|
|
2063
|
+
if data_id not in primary_records[name]:
|
|
2064
|
+
missing_data_ids.add(data_id)
|
|
2079
2065
|
|
|
2080
2066
|
# Fill out the new records. Assume that these new records do not
|
|
2081
2067
|
# also need to carry over additional populated_by records.
|
|
@@ -2092,19 +2078,19 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2092
2078
|
def _extract_dimension_records_from_data_ids(
|
|
2093
2079
|
self,
|
|
2094
2080
|
source_butler: LimitedButler | Butler,
|
|
2095
|
-
data_ids:
|
|
2081
|
+
data_ids: set[DataCoordinate],
|
|
2096
2082
|
allowed_elements: frozenset[DimensionElement],
|
|
2097
2083
|
) -> dict[DimensionElement, dict[DataCoordinate, DimensionRecord]]:
|
|
2098
2084
|
dimension_records: dict[DimensionElement, dict[DataCoordinate, DimensionRecord]] = defaultdict(dict)
|
|
2099
2085
|
|
|
2100
|
-
data_ids = set(data_ids)
|
|
2101
|
-
if not all(data_id.hasRecords() for data_id in data_ids):
|
|
2102
|
-
if isinstance(source_butler, Butler):
|
|
2103
|
-
data_ids = source_butler._expand_data_ids(data_ids)
|
|
2104
|
-
else:
|
|
2105
|
-
raise TypeError("Input butler needs to be a full butler to expand DataId.")
|
|
2106
|
-
|
|
2107
2086
|
for data_id in data_ids:
|
|
2087
|
+
# Need an expanded record, if not expanded that we need a full
|
|
2088
|
+
# butler with registry (allow mocks with registry too).
|
|
2089
|
+
if not data_id.hasRecords():
|
|
2090
|
+
if registry := getattr(source_butler, "registry", None):
|
|
2091
|
+
data_id = registry.expandDataId(data_id)
|
|
2092
|
+
else:
|
|
2093
|
+
raise TypeError("Input butler needs to be a full butler to expand DataId.")
|
|
2108
2094
|
# If this butler doesn't know about a dimension in the source
|
|
2109
2095
|
# butler things will break later.
|
|
2110
2096
|
for element_name in data_id.dimensions.elements:
|
|
@@ -2583,9 +2569,6 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2583
2569
|
"""Immediately load caches that are used for common operations."""
|
|
2584
2570
|
self._registry.preload_cache(load_dimension_record_cache=load_dimension_record_cache)
|
|
2585
2571
|
|
|
2586
|
-
def _expand_data_ids(self, data_ids: Iterable[DataCoordinate]) -> list[DataCoordinate]:
|
|
2587
|
-
return self._registry.expand_data_ids(data_ids)
|
|
2588
|
-
|
|
2589
2572
|
_config: ButlerConfig
|
|
2590
2573
|
"""Configuration for this Butler instance."""
|
|
2591
2574
|
|
{lsst_daf_butler-30.0.0rc3 → lsst_daf_butler-30.2025.5000}/python/lsst/daf/butler/logging.py
RENAMED
|
@@ -764,17 +764,11 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
|
|
|
764
764
|
|
|
765
765
|
|
|
766
766
|
class ButlerLogRecordHandler(StreamHandler):
|
|
767
|
-
"""Python log handler that accumulates records.
|
|
767
|
+
"""Python log handler that accumulates records."""
|
|
768
768
|
|
|
769
|
-
|
|
770
|
-
----------
|
|
771
|
-
records : `ButlerLogRecords`, optional
|
|
772
|
-
Container to store logs in.
|
|
773
|
-
"""
|
|
774
|
-
|
|
775
|
-
def __init__(self, records: ButlerLogRecords | None = None) -> None:
|
|
769
|
+
def __init__(self) -> None:
|
|
776
770
|
super().__init__()
|
|
777
|
-
self.records = ButlerLogRecords([])
|
|
771
|
+
self.records = ButlerLogRecords([])
|
|
778
772
|
|
|
779
773
|
def emit(self, record: LogRecord) -> None:
|
|
780
774
|
self.records.append(record)
|