lsst-daf-butler 30.2025.5000__tar.gz → 30.2025.5200__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.2025.5000/python/lsst_daf_butler.egg-info → lsst_daf_butler-30.2025.5200}/PKG-INFO +1 -1
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_formatter.py +2 -9
- lsst_daf_butler-30.2025.5200/python/lsst/daf/butler/_rubin/temporary_for_ingest.py +207 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/record_data.py +1 -1
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/fileDatastore.py +14 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/bridge/monolithic.py +17 -13
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +49 -45
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_database.py +6 -1
- lsst_daf_butler-30.2025.5200/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_butler.py +16 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_datastore.py +40 -0
- lsst_daf_butler-30.2025.5000/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/COPYRIGHT +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/LICENSE +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/MANIFEST.in +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/README.md +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/bsd_license.txt +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/pyproject.toml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_uuid.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/server_available.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/setup.cfg +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_composites.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_config.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_location.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_logging.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_packages.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_progress.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_server.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_templates.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_utils.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_uuid.py +0 -0
- {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_versioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 30.2025.
|
|
3
|
+
Version: 30.2025.5200
|
|
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
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_formatter.py
RENAMED
|
@@ -54,6 +54,7 @@ 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
|
|
57
58
|
from .dimensions import DataCoordinate, DimensionUniverse
|
|
58
59
|
from .mapping_factory import MappingFactory
|
|
59
60
|
|
|
@@ -1031,15 +1032,7 @@ class FormatterV2:
|
|
|
1031
1032
|
"""
|
|
1032
1033
|
cache_manager = self._ensure_cache(cache_manager)
|
|
1033
1034
|
|
|
1034
|
-
|
|
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:
|
|
1035
|
+
with TemporaryForIngest.make_path(uri) as temporary_uri:
|
|
1043
1036
|
# Need to configure the formatter to write to a different
|
|
1044
1037
|
# location and that needs us to overwrite internals
|
|
1045
1038
|
log.debug("Writing dataset to temporary location at %s", temporary_uri)
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
# This file is part of daf_butler.
|
|
2
|
+
#
|
|
3
|
+
# Developed for the LSST Data Management System.
|
|
4
|
+
# This product includes software developed by the LSST Project
|
|
5
|
+
# (http://www.lsst.org).
|
|
6
|
+
# See the COPYRIGHT file at the top-level directory of this distribution
|
|
7
|
+
# for details of code ownership.
|
|
8
|
+
#
|
|
9
|
+
# This software is dual licensed under the GNU General Public License and also
|
|
10
|
+
# under a 3-clause BSD license. Recipients may choose which of these licenses
|
|
11
|
+
# to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
|
|
12
|
+
# respectively. If you choose the GPL option then the following text applies
|
|
13
|
+
# (but note that there is still no warranty even if you opt for BSD instead):
|
|
14
|
+
#
|
|
15
|
+
# This program is free software: you can redistribute it and/or modify
|
|
16
|
+
# it under the terms of the GNU General Public License as published by
|
|
17
|
+
# the Free Software Foundation, either version 3 of the License, or
|
|
18
|
+
# (at your option) any later version.
|
|
19
|
+
#
|
|
20
|
+
# This program is distributed in the hope that it will be useful,
|
|
21
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
22
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
23
|
+
# GNU General Public License for more details.
|
|
24
|
+
#
|
|
25
|
+
# You should have received a copy of the GNU General Public License
|
|
26
|
+
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
__all__ = ("TemporaryForIngest",)
|
|
31
|
+
|
|
32
|
+
import dataclasses
|
|
33
|
+
import glob
|
|
34
|
+
from contextlib import contextmanager
|
|
35
|
+
from typing import TYPE_CHECKING, Self, cast
|
|
36
|
+
|
|
37
|
+
from lsst.resources import ResourcePath
|
|
38
|
+
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from collections.abc import Iterator
|
|
41
|
+
from types import TracebackType
|
|
42
|
+
|
|
43
|
+
from .._butler import Butler
|
|
44
|
+
from .._dataset_ref import DatasetRef
|
|
45
|
+
from .._file_dataset import FileDataset
|
|
46
|
+
from .._limited_butler import LimitedButler
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclasses.dataclass
|
|
50
|
+
class TemporaryForIngest:
|
|
51
|
+
"""A context manager for generating temporary paths that will be ingested
|
|
52
|
+
as butler datasets.
|
|
53
|
+
|
|
54
|
+
Notes
|
|
55
|
+
-----
|
|
56
|
+
Neither this class nor its `make_path` method run ingest automatically when
|
|
57
|
+
their context manager is exited; the `ingest` method must always be called
|
|
58
|
+
explicitly.
|
|
59
|
+
"""
|
|
60
|
+
|
|
61
|
+
butler: Butler
|
|
62
|
+
"""Full butler to obtain a predicted path from and ingest into."""
|
|
63
|
+
|
|
64
|
+
ref: DatasetRef
|
|
65
|
+
"""Description of the dataset to ingest."""
|
|
66
|
+
|
|
67
|
+
dataset: FileDataset = dataclasses.field(init=False)
|
|
68
|
+
"""The dataset that will be passed to `Butler.ingest`."""
|
|
69
|
+
|
|
70
|
+
@property
|
|
71
|
+
def path(self) -> ResourcePath:
|
|
72
|
+
"""The temporary path.
|
|
73
|
+
|
|
74
|
+
Guaranteed to be a local POSIX path.
|
|
75
|
+
"""
|
|
76
|
+
return cast(ResourcePath, self.dataset.path)
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def ospath(self) -> str:
|
|
80
|
+
"""The temporary path as a complete filename."""
|
|
81
|
+
return self.path.ospath
|
|
82
|
+
|
|
83
|
+
@classmethod
|
|
84
|
+
@contextmanager
|
|
85
|
+
def make_path(cls, final_path: ResourcePath) -> Iterator[ResourcePath]:
|
|
86
|
+
"""Return a temporary path context manager given the predicted final
|
|
87
|
+
path.
|
|
88
|
+
|
|
89
|
+
Parameters
|
|
90
|
+
----------
|
|
91
|
+
final_path : `lsst.resources.ResourcePath`
|
|
92
|
+
Predicted final path.
|
|
93
|
+
|
|
94
|
+
Returns
|
|
95
|
+
-------
|
|
96
|
+
context : `contextlib.AbstractContextManager`
|
|
97
|
+
A context manager that yields the temporary
|
|
98
|
+
`~lsst.resources.ResourcePath` when entered and deletes that file
|
|
99
|
+
when exited.
|
|
100
|
+
"""
|
|
101
|
+
# Always write to a temporary even if using a local file system -- that
|
|
102
|
+
# gives us atomic writes. If a process is killed as the file is being
|
|
103
|
+
# written we do not want it to remain in the correct place but in
|
|
104
|
+
# corrupt state. For local files write to the output directory not
|
|
105
|
+
# temporary dir.
|
|
106
|
+
prefix = final_path.dirname() if final_path.isLocal else None
|
|
107
|
+
if prefix is not None:
|
|
108
|
+
prefix.mkdir()
|
|
109
|
+
with ResourcePath.temporary_uri(
|
|
110
|
+
suffix=cls._get_temporary_suffix(final_path), prefix=prefix
|
|
111
|
+
) as temporary_path:
|
|
112
|
+
yield temporary_path
|
|
113
|
+
|
|
114
|
+
def ingest(self, record_validation_info: bool = True) -> None:
|
|
115
|
+
"""Ingest the file into the butler.
|
|
116
|
+
|
|
117
|
+
Parameters
|
|
118
|
+
----------
|
|
119
|
+
record_validation_info : `bool`, optional
|
|
120
|
+
Whether to- record the file size and checksum upon ingest.
|
|
121
|
+
"""
|
|
122
|
+
self.butler.ingest(self.dataset, transfer="move", record_validation_info=record_validation_info)
|
|
123
|
+
|
|
124
|
+
def __enter__(self) -> Self:
|
|
125
|
+
from .._file_dataset import FileDataset
|
|
126
|
+
|
|
127
|
+
final_path = self.butler.getURI(self.ref, predict=True).replace(fragment="")
|
|
128
|
+
prefix = final_path.dirname() if final_path.isLocal else None
|
|
129
|
+
if prefix is not None:
|
|
130
|
+
prefix.mkdir()
|
|
131
|
+
self._temporary_path_context = self.make_path(final_path)
|
|
132
|
+
temporary_path = self._temporary_path_context.__enter__()
|
|
133
|
+
self.dataset = FileDataset(temporary_path, [self.ref], formatter=None)
|
|
134
|
+
return self
|
|
135
|
+
|
|
136
|
+
def __exit__(
|
|
137
|
+
self,
|
|
138
|
+
exc_type: type[BaseException] | None,
|
|
139
|
+
exc_value: BaseException | None,
|
|
140
|
+
traceback: TracebackType | None,
|
|
141
|
+
) -> bool | None:
|
|
142
|
+
return self._temporary_path_context.__exit__(exc_type, exc_value, traceback)
|
|
143
|
+
|
|
144
|
+
@classmethod
|
|
145
|
+
def find_orphaned_temporaries_by_path(cls, final_path: ResourcePath) -> list[ResourcePath]:
|
|
146
|
+
"""Search for temporary files that were not successfully ingested.
|
|
147
|
+
|
|
148
|
+
Parameters
|
|
149
|
+
----------
|
|
150
|
+
final_path : `lsst.resources.ResourcePath`
|
|
151
|
+
Final path a successfully-ingested file would have.
|
|
152
|
+
|
|
153
|
+
Returns
|
|
154
|
+
-------
|
|
155
|
+
paths : `list` [ `lsst.resources.ResourcePath` ]
|
|
156
|
+
Files that look like temporaries that might have been created while
|
|
157
|
+
trying to write the target dataset.
|
|
158
|
+
|
|
159
|
+
Notes
|
|
160
|
+
-----
|
|
161
|
+
Orphaned files are only possible when a context manager is interrupted
|
|
162
|
+
by a hard error that prevents any cleanup code from running (e.g.
|
|
163
|
+
sudden loss of power).
|
|
164
|
+
"""
|
|
165
|
+
if not final_path.isLocal:
|
|
166
|
+
# We return true tempfile for non-local predicted paths, so orphans
|
|
167
|
+
# are not our problem (the OS etc. will take care of them).
|
|
168
|
+
return []
|
|
169
|
+
return [
|
|
170
|
+
ResourcePath(filename)
|
|
171
|
+
for filename in glob.glob(
|
|
172
|
+
f"{glob.escape(final_path.dirname().ospath)}*{glob.escape(cls._get_temporary_suffix(final_path))}"
|
|
173
|
+
)
|
|
174
|
+
if filename != final_path.ospath
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
@classmethod
|
|
178
|
+
def find_orphaned_temporaries_by_ref(cls, ref: DatasetRef, butler: LimitedButler) -> list[ResourcePath]:
|
|
179
|
+
"""Search for temporary files that were not successfully ingested.
|
|
180
|
+
|
|
181
|
+
Parameters
|
|
182
|
+
----------
|
|
183
|
+
ref : `..DatasetRef`
|
|
184
|
+
A dataset reference the temporaries correspond to.
|
|
185
|
+
butler : `lsst.daf.butler.LimitedButler`
|
|
186
|
+
Butler that can be used to obtain a predicted URI for a dataset.
|
|
187
|
+
|
|
188
|
+
Returns
|
|
189
|
+
-------
|
|
190
|
+
paths : `list` [ `lsst.resources.ResourcePath` ]
|
|
191
|
+
Files that look like temporaries that might have been created while
|
|
192
|
+
trying to write the target dataset.
|
|
193
|
+
|
|
194
|
+
Notes
|
|
195
|
+
-----
|
|
196
|
+
Orphaned files are only possible when a context manager is interrupted
|
|
197
|
+
by a hard error that prevents any cleanup code from running (e.g.
|
|
198
|
+
sudden loss of power).
|
|
199
|
+
"""
|
|
200
|
+
final_path = butler.getURI(ref, predict=True).replace(fragment="")
|
|
201
|
+
return cls.find_orphaned_temporaries_by_path(final_path)
|
|
202
|
+
|
|
203
|
+
@staticmethod
|
|
204
|
+
def _get_temporary_suffix(path: ResourcePath) -> str:
|
|
205
|
+
ext = path.getExtension()
|
|
206
|
+
basename = path.basename().removesuffix(ext)
|
|
207
|
+
return f"{basename}.tmp{ext}"
|
|
@@ -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 |
|
|
52
|
+
_Record: TypeAlias = dict[str, int | str | None]
|
|
53
53
|
|
|
54
54
|
|
|
55
55
|
class SerializedDatastoreRecordData(pydantic.BaseModel):
|
|
@@ -3166,6 +3166,20 @@ 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.
|
|
3169
3183
|
exported_refs = list(self._bridge.check(refs))
|
|
3170
3184
|
ids = {ref.id for ref in exported_refs}
|
|
3171
3185
|
records: dict[DatasetId, dict[str, list[StoredDatastoreItemInfo]]] = {id: {} for id in ids}
|
|
@@ -215,20 +215,24 @@ class MonolithicDatastoreRegistryBridge(DatastoreRegistryBridge):
|
|
|
215
215
|
def check(self, refs: Iterable[DatasetIdRef]) -> Iterable[DatasetIdRef]:
|
|
216
216
|
# Docstring inherited from DatastoreRegistryBridge
|
|
217
217
|
byId = {ref.id: ref for ref in refs}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
.
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
self._tables.dataset_location
|
|
224
|
-
|
|
218
|
+
found: list[DatasetIdRef] = []
|
|
219
|
+
with self._db.session():
|
|
220
|
+
for batch in chunk_iterable(byId.keys(), 50000):
|
|
221
|
+
sql = (
|
|
222
|
+
sqlalchemy.sql.select(self._tables.dataset_location.columns.dataset_id)
|
|
223
|
+
.select_from(self._tables.dataset_location)
|
|
224
|
+
.where(
|
|
225
|
+
sqlalchemy.sql.and_(
|
|
226
|
+
self._tables.dataset_location.columns.datastore_name == self.datastoreName,
|
|
227
|
+
self._tables.dataset_location.columns.dataset_id.in_(batch),
|
|
228
|
+
)
|
|
229
|
+
)
|
|
225
230
|
)
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
yield byId[row.dataset_id]
|
|
231
|
+
with self._db.query(sql) as sql_result:
|
|
232
|
+
sql_ids = sql_result.scalars().all()
|
|
233
|
+
found.extend(byId[id] for id in sql_ids)
|
|
234
|
+
|
|
235
|
+
return found
|
|
232
236
|
|
|
233
237
|
@contextmanager
|
|
234
238
|
def emptyTrash(
|
|
@@ -12,6 +12,8 @@ from typing import TYPE_CHECKING, Any, ClassVar
|
|
|
12
12
|
import astropy.time
|
|
13
13
|
import sqlalchemy
|
|
14
14
|
|
|
15
|
+
from lsst.utils.iteration import chunk_iterable
|
|
16
|
+
|
|
15
17
|
from .... import ddl
|
|
16
18
|
from ...._collection_type import CollectionType
|
|
17
19
|
from ...._dataset_ref import DatasetId, DatasetIdFactory, DatasetIdGenEnum, DatasetRef
|
|
@@ -424,17 +426,18 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
424
426
|
return result
|
|
425
427
|
|
|
426
428
|
def get_dataset_refs(self, ids: list[DatasetId]) -> list[DatasetRef]:
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
id_col
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
429
|
+
dataset_type_map: dict[DatasetId, DatasetType] = {}
|
|
430
|
+
for batch in chunk_iterable(set(ids), 50000):
|
|
431
|
+
# Look up the dataset types corresponding to the given Dataset IDs.
|
|
432
|
+
id_col = self._static.dataset.columns["id"]
|
|
433
|
+
sql = sqlalchemy.sql.select(
|
|
434
|
+
id_col,
|
|
435
|
+
self._static.dataset.columns["dataset_type_id"],
|
|
436
|
+
).where(id_col.in_(batch))
|
|
437
|
+
with self._db.query(sql) as sql_result:
|
|
438
|
+
dataset_rows = sql_result.mappings().all()
|
|
439
|
+
for row in dataset_rows:
|
|
440
|
+
dataset_type_map[row["id"]] = self._get_dataset_type_by_id(row["dataset_type_id"])
|
|
438
441
|
|
|
439
442
|
# Group the given dataset IDs by the DimensionGroup of their dataset
|
|
440
443
|
# types -- there is a separate tags table for each DimensionGroup.
|
|
@@ -448,40 +451,41 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
|
|
|
448
451
|
# data IDs corresponding to the UUIDs found from the dataset table.
|
|
449
452
|
dynamic_tables = self._get_dynamic_tables(dimension_group)
|
|
450
453
|
tags_table = self._get_tags_table(dynamic_tables)
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
454
|
+
for batch in chunk_iterable(datasets, 50000):
|
|
455
|
+
tags_sql = tags_table.select().where(tags_table.columns["dataset_id"].in_(batch))
|
|
456
|
+
# Join in the collection table to fetch the run name.
|
|
457
|
+
collection_column = tags_table.columns[self._collections.getCollectionForeignKeyName()]
|
|
458
|
+
joined_collections = self._collections.join_collections_sql(collection_column, tags_sql)
|
|
459
|
+
tags_sql = joined_collections.joined_sql
|
|
460
|
+
run_name_column = joined_collections.name_column
|
|
461
|
+
tags_sql = tags_sql.add_columns(run_name_column)
|
|
462
|
+
# Tags table includes run collections and tagged
|
|
463
|
+
# collections.
|
|
464
|
+
# In theory the data ID for a given dataset should be the
|
|
465
|
+
# same in both, but nothing actually guarantees this.
|
|
466
|
+
# So skip any tagged collections, using the run collection
|
|
467
|
+
# as the definitive definition.
|
|
468
|
+
tags_sql = tags_sql.where(joined_collections.type_column == int(CollectionType.RUN))
|
|
469
|
+
|
|
470
|
+
with self._db.query(tags_sql) as sql_result:
|
|
471
|
+
data_id_rows = sql_result.mappings().all()
|
|
472
|
+
|
|
473
|
+
assert run_name_column.key is not None
|
|
474
|
+
for data_id_row in data_id_rows:
|
|
475
|
+
id = data_id_row["dataset_id"]
|
|
476
|
+
dataset_type = dataset_type_map[id]
|
|
477
|
+
run_name = data_id_row[run_name_column.key]
|
|
478
|
+
data_id = DataCoordinate.from_required_values(
|
|
479
|
+
dimension_group,
|
|
480
|
+
tuple(data_id_row[dimension] for dimension in dimension_group.required),
|
|
481
|
+
)
|
|
482
|
+
ref = DatasetRef(
|
|
483
|
+
datasetType=dataset_type,
|
|
484
|
+
dataId=data_id,
|
|
485
|
+
id=id,
|
|
486
|
+
run=run_name,
|
|
487
|
+
)
|
|
488
|
+
output_refs.append(ref)
|
|
485
489
|
|
|
486
490
|
return output_refs
|
|
487
491
|
|
|
@@ -1562,7 +1562,12 @@ class Database(ABC):
|
|
|
1562
1562
|
return None
|
|
1563
1563
|
else:
|
|
1564
1564
|
sql = table.insert()
|
|
1565
|
-
|
|
1565
|
+
ids = []
|
|
1566
|
+
for row in rows:
|
|
1567
|
+
key = connection.execute(sql, row).inserted_primary_key
|
|
1568
|
+
assert key is not None
|
|
1569
|
+
ids.append(key[0])
|
|
1570
|
+
return ids
|
|
1566
1571
|
|
|
1567
1572
|
@abstractmethod
|
|
1568
1573
|
def replace(self, table: sqlalchemy.schema.Table, *rows: dict) -> None:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 30.2025.
|
|
3
|
+
Version: 30.2025.5200
|
|
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
|
|
@@ -73,6 +73,7 @@ python/lsst/daf/butler/utils.py
|
|
|
73
73
|
python/lsst/daf/butler/version.py
|
|
74
74
|
python/lsst/daf/butler/_rubin/__init__.py
|
|
75
75
|
python/lsst/daf/butler/_rubin/file_datasets.py
|
|
76
|
+
python/lsst/daf/butler/_rubin/temporary_for_ingest.py
|
|
76
77
|
python/lsst/daf/butler/_utilities/__init__.py
|
|
77
78
|
python/lsst/daf/butler/_utilities/locked_object.py
|
|
78
79
|
python/lsst/daf/butler/_utilities/named_locks.py
|
|
@@ -90,6 +90,7 @@ from lsst.daf.butler import (
|
|
|
90
90
|
script,
|
|
91
91
|
)
|
|
92
92
|
from lsst.daf.butler._rubin.file_datasets import transfer_datasets_to_datastore
|
|
93
|
+
from lsst.daf.butler._rubin.temporary_for_ingest import TemporaryForIngest
|
|
93
94
|
from lsst.daf.butler.datastore import NullDatastore
|
|
94
95
|
from lsst.daf.butler.datastore.file_templates import FileTemplate, FileTemplateValidationError
|
|
95
96
|
from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ZipIndex
|
|
@@ -2441,6 +2442,21 @@ class PosixDatastoreButlerTestCase(FileDatastoreButlerTests, unittest.TestCase):
|
|
|
2441
2442
|
self.assertIsNotNone(target_butler.get(repo.ref2))
|
|
2442
2443
|
self.assertIsNotNone(target_butler.get(other_ref))
|
|
2443
2444
|
|
|
2445
|
+
def test_temporary_for_ingest(self) -> None:
|
|
2446
|
+
"""Test the `lsst.daf.butler._rubin.ingest_from_temporary` module."""
|
|
2447
|
+
with self.create_empty_butler("example_run") as butler:
|
|
2448
|
+
dataset_type = DatasetType("example", butler.dimensions.empty, "StructuredDataDict")
|
|
2449
|
+
butler.registry.registerDatasetType(dataset_type)
|
|
2450
|
+
ref = DatasetRef(dataset_type, DataCoordinate.make_empty(butler.dimensions), "example_run")
|
|
2451
|
+
with TemporaryForIngest(butler, ref) as temporary:
|
|
2452
|
+
temporary.path.write(b"three: 3")
|
|
2453
|
+
found = TemporaryForIngest.find_orphaned_temporaries_by_ref(ref, butler)
|
|
2454
|
+
self.assertEqual(found, [temporary.path])
|
|
2455
|
+
self.assertIn(".tmp", temporary.ospath)
|
|
2456
|
+
temporary.ingest()
|
|
2457
|
+
loaded = butler.get(ref)
|
|
2458
|
+
self.assertEqual(loaded, {"three": 3})
|
|
2459
|
+
|
|
2444
2460
|
|
|
2445
2461
|
class PostgresPosixDatastoreButlerTestCase(FileDatastoreButlerTests, unittest.TestCase):
|
|
2446
2462
|
"""PosixDatastore specialization of a butler using Postgres"""
|
|
@@ -61,6 +61,7 @@ from lsst.daf.butler.datastore.cache_manager import (
|
|
|
61
61
|
DatastoreCacheManagerConfig,
|
|
62
62
|
DatastoreDisabledCacheManager,
|
|
63
63
|
)
|
|
64
|
+
from lsst.daf.butler.datastore.record_data import DatastoreRecordData, SerializedDatastoreRecordData
|
|
64
65
|
from lsst.daf.butler.datastore.stored_file_info import StoredFileInfo, make_datastore_path_relative
|
|
65
66
|
from lsst.daf.butler.formatters.yaml import YamlFormatter
|
|
66
67
|
from lsst.daf.butler.tests import (
|
|
@@ -77,6 +78,7 @@ from lsst.daf.butler.tests.dict_convertible_model import DictConvertibleModel
|
|
|
77
78
|
from lsst.daf.butler.tests.utils import TestCaseMixin
|
|
78
79
|
from lsst.resources import ResourcePath
|
|
79
80
|
from lsst.utils import doImport
|
|
81
|
+
from lsst.utils.introspection import get_full_type_name
|
|
80
82
|
|
|
81
83
|
TESTDIR = os.path.dirname(__file__)
|
|
82
84
|
|
|
@@ -2252,6 +2254,44 @@ class StoredFileInfoTestCase(DatasetTestHelper, unittest.TestCase):
|
|
|
2252
2254
|
self.assertEqual(make_datastore_path_relative("http://server.com/some/path"), "some/path")
|
|
2253
2255
|
self.assertEqual(make_datastore_path_relative("http://server.com/some/path#frag"), "some/path#frag")
|
|
2254
2256
|
|
|
2257
|
+
def test_datastore_record_data_json_types(self):
|
|
2258
|
+
"""Test that we don't round-trip checksums to UUIDs when deserializing
|
|
2259
|
+
datastore record data.
|
|
2260
|
+
"""
|
|
2261
|
+
test_json = """
|
|
2262
|
+
{
|
|
2263
|
+
"dataset_ids": [
|
|
2264
|
+
"74478304-abf1-4a9c-9eb2-926090a84446"
|
|
2265
|
+
],
|
|
2266
|
+
"records": {
|
|
2267
|
+
"lsst.daf.butler.datastore.stored_file_info.StoredFileInfo": {
|
|
2268
|
+
"74478304abf14a9c9eb2926090a84446": {
|
|
2269
|
+
"file_datastore_records": [
|
|
2270
|
+
{
|
|
2271
|
+
"formatter": "lsst.daf.butler.formatters.yaml.YamlFormatter",
|
|
2272
|
+
"path": "gain_factors/base-2025-158/gain_factors_spx_base-2025-158.yaml",
|
|
2273
|
+
"storage_class": "GainFactors",
|
|
2274
|
+
"component": "__NULL_STRING__",
|
|
2275
|
+
"checksum": "cab515f6-ab67-0484-393f-aaa525dd526f",
|
|
2276
|
+
"file_size": 5412
|
|
2277
|
+
}
|
|
2278
|
+
]
|
|
2279
|
+
}
|
|
2280
|
+
}
|
|
2281
|
+
}
|
|
2282
|
+
}
|
|
2283
|
+
"""
|
|
2284
|
+
id_str = "74478304abf14a9c9eb2926090a84446"
|
|
2285
|
+
s = SerializedDatastoreRecordData.model_validate_json(test_json)
|
|
2286
|
+
self.assertIsInstance(
|
|
2287
|
+
s.records[get_full_type_name(StoredFileInfo)][id_str]["file_datastore_records"][0]["checksum"],
|
|
2288
|
+
str,
|
|
2289
|
+
)
|
|
2290
|
+
id = uuid.UUID(id_str)
|
|
2291
|
+
d = DatastoreRecordData.from_simple(s)
|
|
2292
|
+
self.assertIsInstance(d.records[id]["file_datastore_records"][0], StoredFileInfo)
|
|
2293
|
+
self.assertIsInstance(d.records[id]["file_datastore_records"][0].checksum, str)
|
|
2294
|
+
|
|
2255
2295
|
|
|
2256
2296
|
@contextlib.contextmanager
|
|
2257
2297
|
def _temp_yaml_file(data: Any) -> Iterator[str]:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/CHANGES.rst
RENAMED
|
File without changes
|
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/configuring.rst
RENAMED
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/datastores.rst
RENAMED
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/dimensions.rst
RENAMED
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/formatters.rst
RENAMED
|
File without changes
|
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/organizing.rst
RENAMED
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/queries.rst
RENAMED
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/use-in-tests.rst
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/__init__.py
RENAMED
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_config.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|