lsst-daf-butler 29.2025.4200__tar.gz → 29.2025.4400__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.4200/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4400}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_association.py +13 -4
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_registry_shim.py +8 -2
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/storageClasses.yaml +7 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/fileDatastore.py +2 -2
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_butler/_direct_butler.py +2 -2
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/json.py +2 -2
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_registry.py +39 -20
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +64 -15
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_datasets.py +21 -1
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_common.py +3 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_datasets.py +7 -1
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/sql_registry.py +39 -15
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/tests/_registry.py +27 -6
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_registry.py +4 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +5 -4
- lsst_daf_butler-29.2025.4400/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/README.md +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_uuid.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/server_available.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_uuid.py +0 -0
- {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/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.4400
|
|
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
|
|
@@ -71,7 +71,7 @@ class DatasetAssociation:
|
|
|
71
71
|
cls,
|
|
72
72
|
result: GeneralQueryResults,
|
|
73
73
|
dataset_type: DatasetType,
|
|
74
|
-
collection_info: Mapping[str, CollectionInfo],
|
|
74
|
+
collection_info: Mapping[str, CollectionInfo] | None = None,
|
|
75
75
|
) -> Iterator[DatasetAssociation]:
|
|
76
76
|
"""Construct dataset associations from the result of general query.
|
|
77
77
|
|
|
@@ -84,16 +84,25 @@ class DatasetAssociation:
|
|
|
84
84
|
"timespan" dataset fields for ``dataset_type``.
|
|
85
85
|
dataset_type : `DatasetType`
|
|
86
86
|
Dataset type, query has to include this dataset type.
|
|
87
|
-
collection_info : `~collections.abc.Mapping`
|
|
87
|
+
collection_info : `~collections.abc.Mapping` \
|
|
88
|
+
[`str`, `CollectionInfo`], optional
|
|
88
89
|
Mapping from collection name to information about it for all
|
|
89
|
-
collections that may appear in the query results.
|
|
90
|
+
collections that may appear in the query results. If not provided,
|
|
91
|
+
timespans for `~CollectionType.RUN` and `~CollectionType.TAGGED`
|
|
92
|
+
collections will be bounded, instead of `None`; this is actually
|
|
93
|
+
more consistent with how those timespans are used elsewhere in the
|
|
94
|
+
query system, but is a change from how `DatasetAssocation` has
|
|
95
|
+
historically worked.
|
|
90
96
|
"""
|
|
91
97
|
timespan_key = f"{dataset_type.name}.timespan"
|
|
92
98
|
collection_key = f"{dataset_type.name}.collection"
|
|
93
99
|
for _, refs, row_dict in result.iter_tuples(dataset_type):
|
|
94
100
|
collection = row_dict[collection_key]
|
|
95
101
|
timespan = row_dict[timespan_key]
|
|
96
|
-
if
|
|
102
|
+
if (
|
|
103
|
+
collection_info is not None
|
|
104
|
+
and collection_info[collection].type is not CollectionType.CALIBRATION
|
|
105
|
+
):
|
|
97
106
|
# This behavior is for backwards compatibility only; in most
|
|
98
107
|
# contexts it makes sense to consider the timespan of a RUN
|
|
99
108
|
# or TAGGED collection to be unbounded, not None, and that's
|
|
@@ -266,14 +266,20 @@ class RegistryShim(RegistryBase):
|
|
|
266
266
|
# Docstring inherited from a base class.
|
|
267
267
|
return self._registry.insertDatasets(datasetType, dataIds, run, expand, idGenerationMode)
|
|
268
268
|
|
|
269
|
-
def _importDatasets(
|
|
269
|
+
def _importDatasets(
|
|
270
|
+
self, datasets: Iterable[DatasetRef], expand: bool = True, assume_new: bool = False
|
|
271
|
+
) -> list[DatasetRef]:
|
|
270
272
|
# Docstring inherited from a base class.
|
|
271
|
-
return self._registry._importDatasets(datasets, expand)
|
|
273
|
+
return self._registry._importDatasets(datasets, expand, assume_new)
|
|
272
274
|
|
|
273
275
|
def getDataset(self, id: DatasetId) -> DatasetRef | None:
|
|
274
276
|
# Docstring inherited from a base class.
|
|
275
277
|
return self._registry.getDataset(id)
|
|
276
278
|
|
|
279
|
+
def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
|
|
280
|
+
# Docstring inherited.
|
|
281
|
+
return self._registry._fetch_run_dataset_ids(run)
|
|
282
|
+
|
|
277
283
|
def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
|
|
278
284
|
# Docstring inherited from a base class.
|
|
279
285
|
self._registry.removeDatasets(refs)
|
|
@@ -87,6 +87,7 @@ SpectractorSpectrum: lsst.atmospec.formatters.SpectractorSpectrumFormatter
|
|
|
87
87
|
SpectractorImage: lsst.atmospec.formatters.SpectractorImageFormatter
|
|
88
88
|
SpectractorFitParameters: lsst.atmospec.formatters.SpectractorFitParametersFormatter
|
|
89
89
|
ScarletModelData: lsst.meas.extensions.scarlet.io.ScarletModelFormatter
|
|
90
|
+
LsstScarletModelData: lsst.meas.extensions.scarlet.io.ScarletModelFormatter
|
|
90
91
|
MetricMeasurementBundle: lsst.daf.butler.formatters.json.JsonFormatter
|
|
91
92
|
MultipleCellCoadd: lsst.cell_coadds.CellCoaddFitsFormatter
|
|
92
93
|
NNModelPackagePayload: lsst.meas.transiNet.modelPackages.NNModelPackageFormatter
|
|
@@ -412,6 +412,13 @@ storageClasses:
|
|
|
412
412
|
parameters:
|
|
413
413
|
- blend_id
|
|
414
414
|
delegate: lsst.meas.extensions.scarlet.io.ScarletModelDelegate
|
|
415
|
+
LsstScarletModelData:
|
|
416
|
+
pytype: lsst.meas.extensions.scarlet.io.LsstScarletModelData
|
|
417
|
+
converters:
|
|
418
|
+
lsst.scarlet.lite.io.model_data.ScarletModelData: lsst.meas.extensions.scarlet.io.utils.scarlet_model_to_lsst_scarlet_model
|
|
419
|
+
parameters:
|
|
420
|
+
- blend_id
|
|
421
|
+
delegate: lsst.meas.extensions.scarlet.io.ScarletModelDelegate
|
|
415
422
|
MetricMeasurementBundle:
|
|
416
423
|
pytype: lsst.analysis.tools.interfaces.MetricMeasurementBundle
|
|
417
424
|
MultipleCellCoadd:
|
|
@@ -1874,7 +1874,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
1874
1874
|
|
|
1875
1875
|
# Have to handle trustGetRequest mode by checking for the existence
|
|
1876
1876
|
# of the missing refs on disk.
|
|
1877
|
-
if missing_refs:
|
|
1877
|
+
if missing_refs and not predict:
|
|
1878
1878
|
dataset_existence = self._mexists_check_expected(missing_refs, None)
|
|
1879
1879
|
really_missing = set()
|
|
1880
1880
|
not_missing = set()
|
|
@@ -3218,7 +3218,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
3218
3218
|
return ref
|
|
3219
3219
|
dataset_type = self._retrieve_dataset_method(ref.datasetType.name)
|
|
3220
3220
|
if dataset_type is not None:
|
|
3221
|
-
ref = ref.overrideStorageClass(dataset_type.
|
|
3221
|
+
ref = ref.overrideStorageClass(dataset_type.storageClass_name)
|
|
3222
3222
|
return ref
|
|
3223
3223
|
|
|
3224
3224
|
def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
|
|
@@ -2107,7 +2107,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2107
2107
|
dry_run: bool = False,
|
|
2108
2108
|
) -> _ImportDatasetsInfo:
|
|
2109
2109
|
# Docstring inherited.
|
|
2110
|
-
if not self.isWriteable():
|
|
2110
|
+
if not self.isWriteable() and not dry_run:
|
|
2111
2111
|
raise TypeError("Butler is read-only.")
|
|
2112
2112
|
|
|
2113
2113
|
# Will iterate through the refs multiple times so need to convert
|
|
@@ -2312,7 +2312,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2312
2312
|
) -> collections.abc.Collection[DatasetRef]:
|
|
2313
2313
|
# Docstring inherited.
|
|
2314
2314
|
source_refs = list(source_refs)
|
|
2315
|
-
if not self.isWriteable():
|
|
2315
|
+
if not self.isWriteable() and not dry_run:
|
|
2316
2316
|
raise TypeError("Butler is read-only.")
|
|
2317
2317
|
|
|
2318
2318
|
progress = Progress("lsst.daf.butler.Butler.transfer_from", level=VERBOSE)
|
{lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/json.py
RENAMED
|
@@ -68,7 +68,7 @@ def to_json_pydantic(self: SupportsSimple, minimal: bool = False) -> str:
|
|
|
68
68
|
|
|
69
69
|
def from_json_pydantic(
|
|
70
70
|
cls_: type[SupportsSimple],
|
|
71
|
-
json_str: str,
|
|
71
|
+
json_str: str | bytes | bytearray,
|
|
72
72
|
universe: DimensionUniverse | None = None,
|
|
73
73
|
registry: Registry | None = None,
|
|
74
74
|
) -> SupportsSimple:
|
|
@@ -78,7 +78,7 @@ def from_json_pydantic(
|
|
|
78
78
|
----------
|
|
79
79
|
cls_ : `type` of `SupportsSimple`
|
|
80
80
|
The Python type being created.
|
|
81
|
-
json_str : `str`
|
|
81
|
+
json_str : `str` or `bytes` or `bytearray`
|
|
82
82
|
The JSON string representing this object.
|
|
83
83
|
universe : `DimensionUniverse` or `None`, optional
|
|
84
84
|
The universe required to instantiate some models. Required if
|
|
@@ -631,57 +631,55 @@ class Registry(ABC):
|
|
|
631
631
|
self,
|
|
632
632
|
datasets: Iterable[DatasetRef],
|
|
633
633
|
expand: bool = True,
|
|
634
|
+
assume_new: bool = False,
|
|
634
635
|
) -> list[DatasetRef]:
|
|
635
636
|
"""Import one or more datasets into the `Registry`.
|
|
636
637
|
|
|
637
|
-
|
|
638
|
-
`DatasetRef` instances which
|
|
639
|
-
dataset ID. If registry supports globally-unique dataset IDs (e.g.
|
|
640
|
-
`uuid.UUID`) then datasets which already exist in the registry will be
|
|
641
|
-
ignored if imported again.
|
|
638
|
+
This differs from `insertDatasets` method in that this method accepts
|
|
639
|
+
`DatasetRef` instances, which already have a dataset ID.
|
|
642
640
|
|
|
643
641
|
Parameters
|
|
644
642
|
----------
|
|
645
643
|
datasets : `~collections.abc.Iterable` of `DatasetRef`
|
|
646
644
|
Datasets to be inserted. All `DatasetRef` instances must have
|
|
647
|
-
identical ``
|
|
645
|
+
identical ``run`` attributes. ``run``
|
|
648
646
|
attribute can be `None` and defaults to ``self.defaults.run``.
|
|
649
647
|
Datasets can specify ``id`` attribute which will be used for
|
|
650
|
-
inserted datasets.
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
generated by backend.
|
|
648
|
+
inserted datasets.
|
|
649
|
+
Datasets can be of multiple dataset types, but all the dataset
|
|
650
|
+
types must have the same set of dimensions.
|
|
654
651
|
expand : `bool`, optional
|
|
655
652
|
If `True` (default), expand data IDs as they are inserted. This is
|
|
656
653
|
necessary in general, but it may be disabled if the caller can
|
|
657
654
|
guarantee this is unnecessary.
|
|
655
|
+
assume_new : `bool`, optional
|
|
656
|
+
If `True`, assume datasets are new. If `False`, datasets that are
|
|
657
|
+
identical to an existing one are ignored.
|
|
658
658
|
|
|
659
659
|
Returns
|
|
660
660
|
-------
|
|
661
661
|
refs : `list` of `DatasetRef`
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
662
|
+
`DatasetRef` instances for all given data IDs (in the same order).
|
|
663
|
+
If any of ``datasets`` has an ID which already exists in the
|
|
664
|
+
database then it will not be inserted or updated, but a
|
|
665
|
+
`DatasetRef` will be returned for it in any case.
|
|
666
666
|
|
|
667
667
|
Raises
|
|
668
668
|
------
|
|
669
669
|
lsst.daf.butler.registry.NoDefaultCollectionError
|
|
670
670
|
Raised if ``run`` is `None` and ``self.defaults.run`` is `None`.
|
|
671
671
|
lsst.daf.butler.registry.DatasetTypeError
|
|
672
|
-
Raised if
|
|
673
|
-
dataset type is not known to registry.
|
|
672
|
+
Raised if a dataset type is not known to registry.
|
|
674
673
|
lsst.daf.butler.registry.ConflictingDefinitionError
|
|
675
674
|
If a dataset with the same dataset type and data ID as one of those
|
|
676
|
-
given already exists in ``run
|
|
675
|
+
given already exists in ``run``, or if ``assume_new=True`` and at
|
|
676
|
+
least one dataset is not new.
|
|
677
677
|
lsst.daf.butler.registry.MissingCollectionError
|
|
678
678
|
Raised if ``run`` does not exist in the registry.
|
|
679
679
|
|
|
680
680
|
Notes
|
|
681
681
|
-----
|
|
682
|
-
This method is considered
|
|
683
|
-
implementation. Clients outside daf_butler package should not use this
|
|
684
|
-
method.
|
|
682
|
+
This method is considered middleware-internal.
|
|
685
683
|
"""
|
|
686
684
|
raise NotImplementedError()
|
|
687
685
|
|
|
@@ -702,6 +700,27 @@ class Registry(ABC):
|
|
|
702
700
|
"""
|
|
703
701
|
raise NotImplementedError()
|
|
704
702
|
|
|
703
|
+
@abstractmethod
|
|
704
|
+
def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
|
|
705
|
+
"""Return the IDs of all datasets in the given ``RUN``
|
|
706
|
+
collection.
|
|
707
|
+
|
|
708
|
+
Parameters
|
|
709
|
+
----------
|
|
710
|
+
run : `str`
|
|
711
|
+
Name of the collection.
|
|
712
|
+
|
|
713
|
+
Returns
|
|
714
|
+
-------
|
|
715
|
+
dataset_ids : `list` [`uuid.UUID`]
|
|
716
|
+
List of dataset IDs.
|
|
717
|
+
|
|
718
|
+
Notes
|
|
719
|
+
-----
|
|
720
|
+
This is a middleware-internal interface.
|
|
721
|
+
"""
|
|
722
|
+
raise NotImplementedError()
|
|
723
|
+
|
|
705
724
|
@abstractmethod
|
|
706
725
|
def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
|
|
707
726
|
"""Remove datasets from the Registry.
|
|
@@ -617,6 +617,14 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
617
617
|
dataset_type_names = set(get_dataset_type_name(dt) for dt in dataset_types)
|
|
618
618
|
return self._summaries.fetch_summaries(collections, dataset_type_names, self._dataset_type_from_row)
|
|
619
619
|
|
|
620
|
+
def fetch_run_dataset_ids(self, run: RunRecord) -> list[DatasetId]:
|
|
621
|
+
# Docstring inherited.
|
|
622
|
+
sql = sqlalchemy.select(self._static.dataset.c.id).where(
|
|
623
|
+
self._static.dataset.c[self._run_key_column] == run.key
|
|
624
|
+
)
|
|
625
|
+
with self._db.query(sql) as result:
|
|
626
|
+
return list(result.scalars())
|
|
627
|
+
|
|
620
628
|
def ingest_date_dtype(self) -> type:
|
|
621
629
|
"""Return type of the ``ingest_date`` column."""
|
|
622
630
|
schema_version = self.newSchemaVersion()
|
|
@@ -698,7 +706,7 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
698
706
|
for dataId, row in zip(data_id_list, rows, strict=True)
|
|
699
707
|
]
|
|
700
708
|
|
|
701
|
-
def import_(self, run: RunRecord, refs: list[DatasetRef]) -> None:
|
|
709
|
+
def import_(self, run: RunRecord, refs: list[DatasetRef], assume_new: bool = False) -> None:
|
|
702
710
|
# Docstring inherited from DatasetRecordStorageManager.
|
|
703
711
|
if not refs:
|
|
704
712
|
# Just in case an empty mapping is provided we want to avoid
|
|
@@ -721,7 +729,6 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
721
729
|
"Table cache should have been populated when looking up dataset types"
|
|
722
730
|
)
|
|
723
731
|
tags_table = self._get_tags_table(dynamic_tables)
|
|
724
|
-
|
|
725
732
|
# Current timestamp, type depends on schema version.
|
|
726
733
|
if self._use_astropy_ingest_date:
|
|
727
734
|
# Astropy `now()` precision should be the same as `now()` which
|
|
@@ -729,11 +736,8 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
729
736
|
timestamp = sqlalchemy.sql.literal(astropy.time.Time.now(), type_=ddl.AstropyTimeNsecTai)
|
|
730
737
|
else:
|
|
731
738
|
timestamp = sqlalchemy.sql.literal(datetime.datetime.now(datetime.UTC))
|
|
732
|
-
|
|
733
|
-
# We'll insert all new rows into a temporary table
|
|
734
|
-
table_spec = makeTagTableSpec(dimensions, type(self._collections), constraints=False)
|
|
735
739
|
collection_fkey_name = self._collections.getCollectionForeignKeyName()
|
|
736
|
-
|
|
740
|
+
tags_rows = [
|
|
737
741
|
{
|
|
738
742
|
"dataset_type_id": dataset_type_storage[ref.datasetType.name].dataset_type_id,
|
|
739
743
|
collection_fkey_name: run.key,
|
|
@@ -742,9 +746,29 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
742
746
|
}
|
|
743
747
|
for ref in refs
|
|
744
748
|
]
|
|
749
|
+
if assume_new:
|
|
750
|
+
self._import_new(run, refs, dataset_type_storage, tags_table, tags_rows, timestamp)
|
|
751
|
+
else:
|
|
752
|
+
self._import_guarded(
|
|
753
|
+
run, refs, dimensions, dataset_type_storage, tags_table, tags_rows, timestamp
|
|
754
|
+
)
|
|
755
|
+
|
|
756
|
+
def _import_guarded(
|
|
757
|
+
self,
|
|
758
|
+
run: RunRecord,
|
|
759
|
+
refs: list[DatasetRef],
|
|
760
|
+
dimensions: DimensionGroup,
|
|
761
|
+
dataset_type_storage: dict[str, _DatasetRecordStorage],
|
|
762
|
+
tags_table: sqlalchemy.Table,
|
|
763
|
+
tags_rows: list[dict[str, object]],
|
|
764
|
+
timestamp: sqlalchemy.BindParameter[astropy.time.Time | datetime.datetime],
|
|
765
|
+
) -> None:
|
|
766
|
+
# We'll insert all new rows into a temporary table
|
|
767
|
+
table_spec = makeTagTableSpec(dimensions, type(self._collections), constraints=False)
|
|
768
|
+
collection_fkey_name = self._collections.getCollectionForeignKeyName()
|
|
745
769
|
with self._db.transaction(for_temp_tables=True), self._db.temporary_table(table_spec) as tmp_tags:
|
|
746
770
|
# store all incoming data in a temporary table
|
|
747
|
-
self._db.insert(tmp_tags, *
|
|
771
|
+
self._db.insert(tmp_tags, *tags_rows)
|
|
748
772
|
# There are some checks that we want to make for consistency
|
|
749
773
|
# of the new datasets with existing ones.
|
|
750
774
|
self._validate_import(dimensions, tags_table, tmp_tags, run)
|
|
@@ -764,17 +788,19 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
764
788
|
timestamp.label("ingest_date"),
|
|
765
789
|
),
|
|
766
790
|
)
|
|
767
|
-
|
|
768
|
-
# is the first time this dataset type or these governor values
|
|
769
|
-
# will be inserted there.
|
|
770
|
-
summary = CollectionSummary()
|
|
771
|
-
summary.add_datasets(refs)
|
|
772
|
-
self._summaries.update(
|
|
773
|
-
run, [storage.dataset_type_id for storage in dataset_type_storage.values()], summary
|
|
774
|
-
)
|
|
791
|
+
self._update_summaries(run, refs, dataset_type_storage)
|
|
775
792
|
# Copy from temp table into tags table.
|
|
776
793
|
self._db.insert(tags_table, select=tmp_tags.select())
|
|
777
794
|
|
|
795
|
+
def _update_summaries(
|
|
796
|
+
self, run: RunRecord, refs: list[DatasetRef], dataset_type_storage: dict[str, _DatasetRecordStorage]
|
|
797
|
+
) -> None:
|
|
798
|
+
summary = CollectionSummary()
|
|
799
|
+
summary.add_datasets(refs)
|
|
800
|
+
self._summaries.update(
|
|
801
|
+
run, [storage.dataset_type_id for storage in dataset_type_storage.values()], summary
|
|
802
|
+
)
|
|
803
|
+
|
|
778
804
|
def _validate_import(
|
|
779
805
|
self,
|
|
780
806
|
dimensions: DimensionGroup,
|
|
@@ -899,6 +925,29 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
899
925
|
f"but ID {row.new_dataset_id} in new collection {new_collection!r}."
|
|
900
926
|
)
|
|
901
927
|
|
|
928
|
+
def _import_new(
|
|
929
|
+
self,
|
|
930
|
+
run: RunRecord,
|
|
931
|
+
refs: list[DatasetRef],
|
|
932
|
+
dataset_type_storage: dict[str, _DatasetRecordStorage],
|
|
933
|
+
tags_table: sqlalchemy.Table,
|
|
934
|
+
tags_rows: list[dict[str, object]],
|
|
935
|
+
timestamp: sqlalchemy.BindParameter[astropy.time.Time | datetime.datetime],
|
|
936
|
+
) -> None:
|
|
937
|
+
static_rows = [
|
|
938
|
+
{
|
|
939
|
+
"id": ref.id,
|
|
940
|
+
"dataset_type_id": dataset_type_storage[ref.datasetType.name].dataset_type_id,
|
|
941
|
+
self._run_key_column: run.key,
|
|
942
|
+
"ingest_date": timestamp.value,
|
|
943
|
+
}
|
|
944
|
+
for ref in refs
|
|
945
|
+
]
|
|
946
|
+
with self._db.transaction():
|
|
947
|
+
self._db.insert(self._static.dataset, *static_rows)
|
|
948
|
+
self._update_summaries(run, refs, dataset_type_storage)
|
|
949
|
+
self._db.insert(tags_table, *tags_rows)
|
|
950
|
+
|
|
902
951
|
def delete(self, datasets: Iterable[DatasetId | DatasetRef]) -> None:
|
|
903
952
|
# Docstring inherited from DatasetRecordStorageManager.
|
|
904
953
|
# Only delete from common dataset table; ON DELETE foreign key clauses
|
|
@@ -384,6 +384,23 @@ class DatasetRecordStorageManager(VersionedExtension):
|
|
|
384
384
|
"""
|
|
385
385
|
raise NotImplementedError()
|
|
386
386
|
|
|
387
|
+
@abstractmethod
|
|
388
|
+
def fetch_run_dataset_ids(self, run: RunRecord) -> list[DatasetId]:
|
|
389
|
+
"""Return the IDs of all datasets in the given ``RUN``
|
|
390
|
+
collection.
|
|
391
|
+
|
|
392
|
+
Parameters
|
|
393
|
+
----------
|
|
394
|
+
run : `RunRecord`
|
|
395
|
+
Record describing the collection.
|
|
396
|
+
|
|
397
|
+
Returns
|
|
398
|
+
-------
|
|
399
|
+
dataset_ids : `list` [`uuid.UUID`]
|
|
400
|
+
List of dataset IDs.
|
|
401
|
+
"""
|
|
402
|
+
raise NotImplementedError()
|
|
403
|
+
|
|
387
404
|
@abstractmethod
|
|
388
405
|
def ingest_date_dtype(self) -> type:
|
|
389
406
|
"""Return type of the ``ingest_date`` column."""
|
|
@@ -424,7 +441,7 @@ class DatasetRecordStorageManager(VersionedExtension):
|
|
|
424
441
|
raise NotImplementedError()
|
|
425
442
|
|
|
426
443
|
@abstractmethod
|
|
427
|
-
def import_(self, run: RunRecord, refs: list[DatasetRef]) -> None:
|
|
444
|
+
def import_(self, run: RunRecord, refs: list[DatasetRef], assume_new: bool = False) -> None:
|
|
428
445
|
"""Insert one or more dataset entries into the database.
|
|
429
446
|
|
|
430
447
|
Parameters
|
|
@@ -435,6 +452,9 @@ class DatasetRecordStorageManager(VersionedExtension):
|
|
|
435
452
|
refs : `list` [ `DatasetRef` ]
|
|
436
453
|
List of datasets to be be inserted. All of the ``DatasetRef``
|
|
437
454
|
``run`` attributes must match the ``run`` parameter.
|
|
455
|
+
assume_new : `bool`, optional
|
|
456
|
+
If `True`, assume all datasets are new and skip conflict resolution
|
|
457
|
+
logic.
|
|
438
458
|
"""
|
|
439
459
|
raise NotImplementedError()
|
|
440
460
|
|
|
@@ -58,6 +58,9 @@ class CommonQueryArguments:
|
|
|
58
58
|
def replaceCollections(self, collections: list[str]) -> CommonQueryArguments:
|
|
59
59
|
return dataclasses.replace(self, collections=collections)
|
|
60
60
|
|
|
61
|
+
def replaceDatasetTypes(self, dataset_types: list[str]) -> CommonQueryArguments:
|
|
62
|
+
return dataclasses.replace(self, dataset_types=dataset_types)
|
|
63
|
+
|
|
61
64
|
|
|
62
65
|
_T = TypeVar("_T", bound=QueryResultsBase)
|
|
63
66
|
_U = TypeVar("_U", bound=QueryResultsBase)
|
|
@@ -119,7 +119,13 @@ class QueryDriverDatasetRefQueryResults(
|
|
|
119
119
|
|
|
120
120
|
@property
|
|
121
121
|
def dataIds(self) -> DataCoordinateQueryResults:
|
|
122
|
-
|
|
122
|
+
from ._query_data_coordinates import QueryDriverDataCoordinateQueryResults
|
|
123
|
+
|
|
124
|
+
args = self._args.replaceDatasetTypes([self._dataset_type.name])
|
|
125
|
+
|
|
126
|
+
return QueryDriverDataCoordinateQueryResults(
|
|
127
|
+
self._butler, dimensions=self._dataset_type.dimensions, expanded=self._expanded, args=args
|
|
128
|
+
)
|
|
123
129
|
|
|
124
130
|
def byParentDatasetType(self) -> Iterator[ParentDatasetQueryResults]:
|
|
125
131
|
yield self
|
|
@@ -919,14 +919,12 @@ class SqlRegistry:
|
|
|
919
919
|
self,
|
|
920
920
|
datasets: Iterable[DatasetRef],
|
|
921
921
|
expand: bool = True,
|
|
922
|
+
assume_new: bool = False,
|
|
922
923
|
) -> list[DatasetRef]:
|
|
923
924
|
"""Import one or more datasets into the `Registry`.
|
|
924
925
|
|
|
925
|
-
|
|
926
|
-
`DatasetRef` instances which
|
|
927
|
-
dataset ID. If registry supports globally-unique dataset IDs (e.g.
|
|
928
|
-
`uuid.UUID`) then datasets which already exist in the registry will be
|
|
929
|
-
ignored if imported again.
|
|
926
|
+
This differs from `insertDatasets` method in that this method accepts
|
|
927
|
+
`DatasetRef` instances, which already have a dataset ID.
|
|
930
928
|
|
|
931
929
|
Parameters
|
|
932
930
|
----------
|
|
@@ -942,14 +940,17 @@ class SqlRegistry:
|
|
|
942
940
|
If `True` (default), expand data IDs as they are inserted. This is
|
|
943
941
|
necessary in general, but it may be disabled if the caller can
|
|
944
942
|
guarantee this is unnecessary.
|
|
943
|
+
assume_new : `bool`, optional
|
|
944
|
+
If `True`, assume datasets are new. If `False`, datasets that are
|
|
945
|
+
identical to an existing one are ignored.
|
|
945
946
|
|
|
946
947
|
Returns
|
|
947
948
|
-------
|
|
948
949
|
refs : `list` of `DatasetRef`
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
950
|
+
`DatasetRef` instances for all given data IDs (in the same order).
|
|
951
|
+
If any of ``datasets`` has an ID which already exists in the
|
|
952
|
+
database then it will not be inserted or updated, but a
|
|
953
|
+
`DatasetRef` will be returned for it in any case.
|
|
953
954
|
|
|
954
955
|
Raises
|
|
955
956
|
------
|
|
@@ -959,15 +960,14 @@ class SqlRegistry:
|
|
|
959
960
|
Raised if a dataset type is not known to registry.
|
|
960
961
|
lsst.daf.butler.registry.ConflictingDefinitionError
|
|
961
962
|
If a dataset with the same dataset type and data ID as one of those
|
|
962
|
-
given already exists in ``run
|
|
963
|
+
given already exists in ``run``, or if ``assume_new=True`` and at
|
|
964
|
+
least one dataset is not new.
|
|
963
965
|
lsst.daf.butler.registry.MissingCollectionError
|
|
964
966
|
Raised if ``run`` does not exist in the registry.
|
|
965
967
|
|
|
966
968
|
Notes
|
|
967
969
|
-----
|
|
968
|
-
This method is considered
|
|
969
|
-
implementation. Clients outside daf_butler package should not use this
|
|
970
|
-
method.
|
|
970
|
+
This method is considered middleware-internal.
|
|
971
971
|
"""
|
|
972
972
|
datasets = list(datasets)
|
|
973
973
|
if not datasets:
|
|
@@ -994,7 +994,7 @@ class SqlRegistry:
|
|
|
994
994
|
_LOG.debug("Finished expanding data IDs")
|
|
995
995
|
|
|
996
996
|
try:
|
|
997
|
-
self._managers.datasets.import_(runRecord, datasets)
|
|
997
|
+
self._managers.datasets.import_(runRecord, datasets, assume_new=assume_new)
|
|
998
998
|
if self._managers.obscore:
|
|
999
999
|
self._managers.obscore.add_datasets(datasets)
|
|
1000
1000
|
except sqlalchemy.exc.IntegrityError as err:
|
|
@@ -1003,7 +1003,8 @@ class SqlRegistry:
|
|
|
1003
1003
|
f"one or more datasets into collection '{run}'. "
|
|
1004
1004
|
"This probably means a dataset with the same data ID "
|
|
1005
1005
|
"and dataset type already exists, but it may also mean a "
|
|
1006
|
-
"dimension row is missing
|
|
1006
|
+
"dimension row is missing, or the dataset was assumed to be "
|
|
1007
|
+
"new when it was not."
|
|
1007
1008
|
) from err
|
|
1008
1009
|
return datasets
|
|
1009
1010
|
|
|
@@ -1023,6 +1024,29 @@ class SqlRegistry:
|
|
|
1023
1024
|
"""
|
|
1024
1025
|
return self._managers.datasets.getDatasetRef(id)
|
|
1025
1026
|
|
|
1027
|
+
def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
|
|
1028
|
+
"""Return the IDs of all datasets in the given ``RUN``
|
|
1029
|
+
collection.
|
|
1030
|
+
|
|
1031
|
+
Parameters
|
|
1032
|
+
----------
|
|
1033
|
+
run : `str`
|
|
1034
|
+
Name of the collection.
|
|
1035
|
+
|
|
1036
|
+
Returns
|
|
1037
|
+
-------
|
|
1038
|
+
dataset_ids : `list` [`uuid.UUID`]
|
|
1039
|
+
List of dataset IDs.
|
|
1040
|
+
|
|
1041
|
+
Notes
|
|
1042
|
+
-----
|
|
1043
|
+
This is a middleware-internal interface.
|
|
1044
|
+
"""
|
|
1045
|
+
run_record = self._managers.collections.find(run)
|
|
1046
|
+
if not isinstance(run_record, RunRecord):
|
|
1047
|
+
raise CollectionTypeError(f"{run!r} is not a RUN collection.")
|
|
1048
|
+
return self._managers.datasets.fetch_run_dataset_ids(run_record)
|
|
1049
|
+
|
|
1026
1050
|
@transactional
|
|
1027
1051
|
def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
|
|
1028
1052
|
"""Remove datasets from the Registry.
|
|
@@ -86,6 +86,7 @@ from .._exceptions import (
|
|
|
86
86
|
OrphanedRecordError,
|
|
87
87
|
)
|
|
88
88
|
from ..interfaces import ButlerAttributeExistsError, ReadOnlyDatabaseError
|
|
89
|
+
from ..queries import ParentDatasetQueryResults
|
|
89
90
|
from ..sql_registry import SqlRegistry
|
|
90
91
|
|
|
91
92
|
_T = TypeVar("_T")
|
|
@@ -502,6 +503,15 @@ class RegistryTests(ABC):
|
|
|
502
503
|
registry.removeDatasets([ref])
|
|
503
504
|
self.assertIsNone(registry.findDataset(datasetType, dataId, collections=[run]))
|
|
504
505
|
|
|
506
|
+
def test_fetch_run_dataset_ids(self):
|
|
507
|
+
butler = self.make_butler()
|
|
508
|
+
registry = butler._registry
|
|
509
|
+
self.load_data(butler, "base.yaml", "datasets.yaml")
|
|
510
|
+
dataset_ids = registry._fetch_run_dataset_ids("imported_r")
|
|
511
|
+
self.assertEqual(len(dataset_ids), 7)
|
|
512
|
+
refs = butler.query_all_datasets("imported_r")
|
|
513
|
+
self.assertCountEqual(dataset_ids, [ref.id for ref in refs])
|
|
514
|
+
|
|
505
515
|
def testFindDataset(self):
|
|
506
516
|
"""Tests for `SqlRegistry.findDataset`."""
|
|
507
517
|
butler = self.make_butler()
|
|
@@ -732,10 +742,15 @@ class RegistryTests(ABC):
|
|
|
732
742
|
dataIdFlat1 = {"instrument": "Cam1", "detector": 1, "physical_filter": "Cam1-G", "band": "g"}
|
|
733
743
|
|
|
734
744
|
ref = DatasetRef(datasetTypeBias, dataIdBias1, run="run0")
|
|
735
|
-
(ref1,) = registry._importDatasets([ref])
|
|
745
|
+
(ref1,) = registry._importDatasets([ref], assume_new=True)
|
|
736
746
|
# UUID is used without change
|
|
737
747
|
self.assertEqual(ref.id, ref1.id)
|
|
738
748
|
|
|
749
|
+
# Inserting this ref with assume_new=True should fail, since this
|
|
750
|
+
# dataset exists.
|
|
751
|
+
with self.assertRaises(ConflictingDefinitionError):
|
|
752
|
+
registry._importDatasets([ref], assume_new=True)
|
|
753
|
+
|
|
739
754
|
# All different failure modes
|
|
740
755
|
refs = (
|
|
741
756
|
# Importing same DatasetRef with different dataset ID is an error
|
|
@@ -3925,11 +3940,10 @@ class RegistryTests(ABC):
|
|
|
3925
3940
|
)
|
|
3926
3941
|
self.assertIsNone(detectors[0].records["detector"].purpose)
|
|
3927
3942
|
|
|
3928
|
-
|
|
3929
|
-
|
|
3930
|
-
|
|
3931
|
-
|
|
3932
|
-
)
|
|
3943
|
+
datasets_query = registry.queryDatasets(
|
|
3944
|
+
"flat", collections="imported_g", where="instrument = 'Cam1' and detector <= 3"
|
|
3945
|
+
).expanded()
|
|
3946
|
+
datasets = list(datasets_query)
|
|
3933
3947
|
datasets.sort(key=lambda ref: ref.dataId["detector"])
|
|
3934
3948
|
self.assertEqual(len(datasets), 2)
|
|
3935
3949
|
self.assertEqual(datasets[0].id, uuid.UUID("60c8a65c-7290-4c38-b1de-e3b1cdcf872d"))
|
|
@@ -3938,6 +3952,13 @@ class RegistryTests(ABC):
|
|
|
3938
3952
|
self.assertEqual(datasets[0].dataId.records["detector"].full_name, "Ab")
|
|
3939
3953
|
self.assertEqual(datasets[1].dataId.records["detector"].full_name, "Ba")
|
|
3940
3954
|
self.assertEqual(datasets[0].dataId.records["instrument"].visit_system, 1)
|
|
3955
|
+
assert isinstance(datasets_query, ParentDatasetQueryResults)
|
|
3956
|
+
data_ids = list(datasets_query.dataIds)
|
|
3957
|
+
data_ids.sort(key=lambda data_id: data_id["detector"])
|
|
3958
|
+
self.assertEqual(len(data_ids), 2)
|
|
3959
|
+
self.assertEqual(data_ids[0].records["detector"].full_name, "Ab")
|
|
3960
|
+
self.assertEqual(data_ids[1].records["detector"].full_name, "Ba")
|
|
3961
|
+
self.assertEqual(data_ids[0].records["instrument"].visit_system, 1)
|
|
3941
3962
|
|
|
3942
3963
|
# None of the datasets in the test data include any uncached
|
|
3943
3964
|
# dimensions, so we have to set one up.
|
|
@@ -224,12 +224,16 @@ class RemoteButlerRegistry(RegistryBase):
|
|
|
224
224
|
self,
|
|
225
225
|
datasets: Iterable[DatasetRef],
|
|
226
226
|
expand: bool = True,
|
|
227
|
+
assume_new: bool = False,
|
|
227
228
|
) -> list[DatasetRef]:
|
|
228
229
|
raise NotImplementedError()
|
|
229
230
|
|
|
230
231
|
def getDataset(self, id: DatasetId) -> DatasetRef | None:
|
|
231
232
|
return self._butler.get_dataset(id)
|
|
232
233
|
|
|
234
|
+
def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
|
|
235
|
+
raise NotImplementedError()
|
|
236
|
+
|
|
233
237
|
def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
|
|
234
238
|
raise NotImplementedError()
|
|
235
239
|
|