lsst-daf-butler 29.2025.3000__tar.gz → 29.2025.3200__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.3000/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.3200}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler.py +2 -2
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_labeled_butler_factory.py +2 -2
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_limited_butler.py +1 -6
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_storage_class.py +66 -174
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/_datastore.py +6 -8
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/record_data.py +22 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/stored_file_info.py +2 -4
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/chainedDatastore.py +2 -3
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/fileDatastore.py +2 -34
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_record_set.py +49 -2
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -1
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_config.py +12 -4
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_factory.py +51 -27
- lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/_get.py +98 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_http_connection.py +11 -17
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +12 -7
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +3 -10
- lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/authentication/cadc.py +54 -0
- lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/authentication/interface.py +46 -0
- lsst_daf_butler-29.2025.3000/python/lsst/daf/butler/remote_butler/_authentication.py → lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/authentication/rubin.py +36 -20
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/_config.py +5 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +4 -2
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +29 -12
- lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +72 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server_models.py +38 -3
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +1 -6
- lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/server.py +13 -6
- lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst_daf_butler.egg-info/SOURCES.txt +6 -2
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_authentication.py +18 -9
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_butler.py +1 -1
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_datasets.py +0 -13
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_dimension_record_containers.py +19 -9
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_quantumBackedButler.py +18 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_server.py +52 -6
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_storageClass.py +4 -13
- lsst_daf_butler-29.2025.3000/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -90
- lsst_daf_butler-29.2025.3000/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/README.md +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.3000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/authentication}/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000/python/lsst/daf/butler/tests/registry_data → lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/remote_butler/registry}/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/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.3200
|
|
4
4
|
Summary: An abstraction layer for reading and writing astronomical data to datastores.
|
|
5
5
|
Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
|
|
6
6
|
License: BSD 3-Clause License
|
{lsst_daf_butler-29.2025.3000 → lsst_daf_butler-29.2025.3200}/python/lsst/daf/butler/_butler.py
RENAMED
|
@@ -347,13 +347,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
347
347
|
without_datastore=without_datastore,
|
|
348
348
|
)
|
|
349
349
|
case ButlerType.REMOTE:
|
|
350
|
-
from .remote_butler import RemoteButlerFactory
|
|
350
|
+
from .remote_butler._factory import RemoteButlerFactory
|
|
351
351
|
|
|
352
352
|
# Assume this is being created by a client who would like
|
|
353
353
|
# default caching of remote datasets.
|
|
354
354
|
factory = RemoteButlerFactory.create_factory_from_config(butler_config)
|
|
355
355
|
return factory.create_butler_with_credentials_from_environment(
|
|
356
|
-
butler_options=options,
|
|
356
|
+
butler_options=options, enable_datastore_cache=True
|
|
357
357
|
)
|
|
358
358
|
case _:
|
|
359
359
|
raise TypeError(f"Unknown Butler type '{butler_type}'")
|
|
@@ -198,9 +198,9 @@ def _create_direct_butler_factory(config: ButlerConfig, preload_unsafe_caches: b
|
|
|
198
198
|
|
|
199
199
|
|
|
200
200
|
def _create_remote_butler_factory(config: ButlerConfig) -> _FactoryFunction:
|
|
201
|
-
import lsst.daf.butler.remote_butler
|
|
201
|
+
import lsst.daf.butler.remote_butler._factory
|
|
202
202
|
|
|
203
|
-
factory = lsst.daf.butler.remote_butler.RemoteButlerFactory.create_factory_from_config(config)
|
|
203
|
+
factory = lsst.daf.butler.remote_butler._factory.RemoteButlerFactory.create_factory_from_config(config)
|
|
204
204
|
|
|
205
205
|
def create_butler(access_token: str | None) -> Butler:
|
|
206
206
|
if access_token is None:
|
|
@@ -129,11 +129,6 @@ class LimitedButler(ABC):
|
|
|
129
129
|
obj : `object`
|
|
130
130
|
The dataset.
|
|
131
131
|
|
|
132
|
-
Raises
|
|
133
|
-
------
|
|
134
|
-
AmbiguousDatasetError
|
|
135
|
-
Raised if the supplied `DatasetRef` is unresolved.
|
|
136
|
-
|
|
137
132
|
Notes
|
|
138
133
|
-----
|
|
139
134
|
In a `LimitedButler` the only allowable way to specify a dataset is
|
|
@@ -326,7 +321,7 @@ class LimitedButler(ABC):
|
|
|
326
321
|
Whether the dataset artifact exists in the datastore and can be
|
|
327
322
|
retrieved.
|
|
328
323
|
"""
|
|
329
|
-
return self.
|
|
324
|
+
return self.stored_many([ref])[ref]
|
|
330
325
|
|
|
331
326
|
def stored_many(
|
|
332
327
|
self,
|
|
@@ -39,6 +39,8 @@ from collections.abc import Callable, Collection, Mapping, Sequence, Set
|
|
|
39
39
|
from threading import RLock
|
|
40
40
|
from typing import Any
|
|
41
41
|
|
|
42
|
+
import pydantic
|
|
43
|
+
|
|
42
44
|
from lsst.utils import doImportType
|
|
43
45
|
from lsst.utils.classes import Singleton
|
|
44
46
|
from lsst.utils.introspection import get_full_type_name
|
|
@@ -57,6 +59,18 @@ class StorageClassConfig(ConfigSubset):
|
|
|
57
59
|
defaultConfigFile = "storageClasses.yaml"
|
|
58
60
|
|
|
59
61
|
|
|
62
|
+
class _StorageClassModel(pydantic.BaseModel):
|
|
63
|
+
"""Model class used to validate storage class configuration."""
|
|
64
|
+
|
|
65
|
+
pytype: str | None = None
|
|
66
|
+
inheritsFrom: str | None = None
|
|
67
|
+
components: dict[str, str] = pydantic.Field(default_factory=dict)
|
|
68
|
+
derivedComponents: dict[str, str] = pydantic.Field(default_factory=dict)
|
|
69
|
+
parameters: list[str] = pydantic.Field(default_factory=list)
|
|
70
|
+
delegate: str | None = None
|
|
71
|
+
converters: dict[str, str] = pydantic.Field(default_factory=dict)
|
|
72
|
+
|
|
73
|
+
|
|
60
74
|
class StorageClass:
|
|
61
75
|
"""Class describing how a label maps to a particular Python type.
|
|
62
76
|
|
|
@@ -81,17 +95,9 @@ class StorageClass:
|
|
|
81
95
|
that python type to the valid type of this storage class.
|
|
82
96
|
"""
|
|
83
97
|
|
|
84
|
-
_cls_name: str = "BaseStorageClass"
|
|
85
|
-
_cls_components: dict[str, StorageClass] | None = None
|
|
86
|
-
_cls_derivedComponents: dict[str, StorageClass] | None = None
|
|
87
|
-
_cls_parameters: Set[str] | Sequence[str] | None = None
|
|
88
|
-
_cls_delegate: str | None = None
|
|
89
|
-
_cls_pytype: type | str | None = None
|
|
90
|
-
_cls_converters: dict[str, str] | None = None
|
|
91
|
-
|
|
92
98
|
def __init__(
|
|
93
99
|
self,
|
|
94
|
-
name: str
|
|
100
|
+
name: str = "",
|
|
95
101
|
pytype: type | str | None = None,
|
|
96
102
|
components: dict[str, StorageClass] | None = None,
|
|
97
103
|
derivedComponents: dict[str, StorageClass] | None = None,
|
|
@@ -99,23 +105,8 @@ class StorageClass:
|
|
|
99
105
|
delegate: str | None = None,
|
|
100
106
|
converters: dict[str, str] | None = None,
|
|
101
107
|
):
|
|
102
|
-
if name is None:
|
|
103
|
-
name = self._cls_name
|
|
104
|
-
if pytype is None:
|
|
105
|
-
pytype = self._cls_pytype
|
|
106
|
-
if components is None:
|
|
107
|
-
components = self._cls_components
|
|
108
|
-
if derivedComponents is None:
|
|
109
|
-
derivedComponents = self._cls_derivedComponents
|
|
110
|
-
if parameters is None:
|
|
111
|
-
parameters = self._cls_parameters
|
|
112
|
-
if delegate is None:
|
|
113
|
-
delegate = self._cls_delegate
|
|
114
|
-
|
|
115
108
|
# Merge converters with class defaults.
|
|
116
109
|
self._converters = {}
|
|
117
|
-
if self._cls_converters is not None:
|
|
118
|
-
self._converters.update(self._cls_converters)
|
|
119
110
|
if converters:
|
|
120
111
|
self._converters.update(converters)
|
|
121
112
|
|
|
@@ -634,7 +625,6 @@ class StorageClassFactory(metaclass=Singleton):
|
|
|
634
625
|
|
|
635
626
|
def __init__(self, config: StorageClassConfig | str | None = None):
|
|
636
627
|
self._storageClasses: dict[str, StorageClass] = {}
|
|
637
|
-
self._configs: list[StorageClassConfig] = []
|
|
638
628
|
self._lock = RLock()
|
|
639
629
|
|
|
640
630
|
# Always seed with the default config
|
|
@@ -657,40 +647,15 @@ class StorageClassFactory(metaclass=Singleton):
|
|
|
657
647
|
|
|
658
648
|
StorageClasses
|
|
659
649
|
--------------
|
|
660
|
-
{sep.join(f"{
|
|
650
|
+
{sep.join(f"{self._storageClasses[s]!r}" for s in sorted(self._storageClasses))}
|
|
661
651
|
"""
|
|
662
652
|
|
|
663
|
-
def __contains__(self, storageClassOrName:
|
|
664
|
-
"""Indicate whether the storage class exists in the factory.
|
|
665
|
-
|
|
666
|
-
Parameters
|
|
667
|
-
----------
|
|
668
|
-
storageClassOrName : `str` or `StorageClass`
|
|
669
|
-
If `str` is given existence of the named StorageClass
|
|
670
|
-
in the factory is checked. If `StorageClass` is given
|
|
671
|
-
existence and equality are checked.
|
|
672
|
-
|
|
673
|
-
Returns
|
|
674
|
-
-------
|
|
675
|
-
in : `bool`
|
|
676
|
-
True if the supplied string is present, or if the supplied
|
|
677
|
-
`StorageClass` is present and identical.
|
|
678
|
-
|
|
679
|
-
Notes
|
|
680
|
-
-----
|
|
681
|
-
The two different checks (one for "key" and one for "value") based on
|
|
682
|
-
the type of the given argument mean that it is possible for
|
|
683
|
-
StorageClass.name to be in the factory but StorageClass to not be
|
|
684
|
-
in the factory.
|
|
685
|
-
"""
|
|
653
|
+
def __contains__(self, storageClassOrName: object) -> bool:
|
|
686
654
|
with self._lock:
|
|
687
655
|
if isinstance(storageClassOrName, str):
|
|
688
656
|
return storageClassOrName in self._storageClasses
|
|
689
|
-
elif (
|
|
690
|
-
|
|
691
|
-
and storageClassOrName.name in self._storageClasses
|
|
692
|
-
):
|
|
693
|
-
return storageClassOrName == self._storageClasses[storageClassOrName.name]
|
|
657
|
+
elif isinstance(storageClassOrName, StorageClass):
|
|
658
|
+
return storageClassOrName.name in self._storageClasses
|
|
694
659
|
return False
|
|
695
660
|
|
|
696
661
|
def addFromConfig(self, config: StorageClassConfig | Config | str) -> None:
|
|
@@ -708,68 +673,54 @@ StorageClasses
|
|
|
708
673
|
# components or parents before their classes are defined
|
|
709
674
|
# we have a helper function that we can call recursively
|
|
710
675
|
# to extract definitions from the configuration.
|
|
711
|
-
def processStorageClass(name: str, _sconfig: StorageClassConfig, msg: str = "") ->
|
|
712
|
-
#
|
|
676
|
+
def processStorageClass(name: str, _sconfig: StorageClassConfig, msg: str = "") -> StorageClass:
|
|
677
|
+
# This might have already been processed through recursion, or
|
|
678
|
+
# already present in the factory.
|
|
713
679
|
if name not in _sconfig:
|
|
714
|
-
return
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
if
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
baseName,
|
|
759
|
-
)
|
|
760
|
-
processStorageClass(baseName, sconfig, msg)
|
|
761
|
-
else:
|
|
762
|
-
processStorageClass(baseName, sconfig, msg)
|
|
763
|
-
baseClass = type(self.getStorageClass(baseName))
|
|
764
|
-
if baseClass is StorageClass:
|
|
765
|
-
raise TypeError(
|
|
766
|
-
f"Configuration for storage class {name} requests to inherit from "
|
|
767
|
-
f" storage class {baseName} but that class is not defined correctly."
|
|
768
|
-
)
|
|
769
|
-
|
|
770
|
-
newStorageClassType = self.makeNewStorageClass(name, baseClass, **storageClassKwargs)
|
|
771
|
-
newStorageClass = newStorageClassType()
|
|
772
|
-
self.registerStorageClass(newStorageClass, msg=msg)
|
|
680
|
+
return self.getStorageClass(name)
|
|
681
|
+
try:
|
|
682
|
+
model = _StorageClassModel.model_validate(_sconfig.pop(name))
|
|
683
|
+
except Exception as err:
|
|
684
|
+
err.add_note(msg)
|
|
685
|
+
raise
|
|
686
|
+
components: dict[str, StorageClass] = {}
|
|
687
|
+
derivedComponents: dict[str, StorageClass] = {}
|
|
688
|
+
parameters: set[str] = set()
|
|
689
|
+
delegate: str | None = None
|
|
690
|
+
converters: dict[str, str] = {}
|
|
691
|
+
if model.inheritsFrom is not None:
|
|
692
|
+
base = processStorageClass(model.inheritsFrom, _sconfig, msg + f"; processing base of {name}")
|
|
693
|
+
pytype = base._pytypeName
|
|
694
|
+
components.update(base.components)
|
|
695
|
+
derivedComponents.update(base.derivedComponents)
|
|
696
|
+
parameters.update(base.parameters)
|
|
697
|
+
delegate = base._delegateClassName
|
|
698
|
+
converters.update(base.converters)
|
|
699
|
+
if model.pytype is not None:
|
|
700
|
+
pytype = model.pytype
|
|
701
|
+
for k, v in model.components.items():
|
|
702
|
+
components[k] = processStorageClass(
|
|
703
|
+
v, _sconfig, msg + f"; processing component {k} of {name}"
|
|
704
|
+
)
|
|
705
|
+
for k, v in model.derivedComponents.items():
|
|
706
|
+
derivedComponents[k] = processStorageClass(
|
|
707
|
+
v, _sconfig, msg + f"; processing derivedCmponent {k} of {name}"
|
|
708
|
+
)
|
|
709
|
+
parameters.update(model.parameters)
|
|
710
|
+
if model.delegate is not None:
|
|
711
|
+
delegate = model.delegate
|
|
712
|
+
converters.update(model.converters)
|
|
713
|
+
result = StorageClass(
|
|
714
|
+
name=name,
|
|
715
|
+
pytype=pytype,
|
|
716
|
+
components=components,
|
|
717
|
+
derivedComponents=derivedComponents,
|
|
718
|
+
parameters=parameters,
|
|
719
|
+
delegate=delegate,
|
|
720
|
+
converters=converters,
|
|
721
|
+
)
|
|
722
|
+
self.registerStorageClass(result, msg=msg)
|
|
723
|
+
return result
|
|
773
724
|
|
|
774
725
|
# In case there is a problem, construct a context message for any
|
|
775
726
|
# error reporting.
|
|
@@ -778,68 +729,9 @@ StorageClasses
|
|
|
778
729
|
log.debug("Adding definitions from config %s", ", ".join(files))
|
|
779
730
|
|
|
780
731
|
with self._lock:
|
|
781
|
-
self._configs.append(sconfig)
|
|
782
732
|
for name in list(sconfig.keys()):
|
|
783
733
|
processStorageClass(name, sconfig, context)
|
|
784
734
|
|
|
785
|
-
@staticmethod
|
|
786
|
-
def makeNewStorageClass(
|
|
787
|
-
name: str, baseClass: type[StorageClass] | None = StorageClass, **kwargs: Any
|
|
788
|
-
) -> type[StorageClass]:
|
|
789
|
-
"""Create a new Python class as a subclass of `StorageClass`.
|
|
790
|
-
|
|
791
|
-
Parameters
|
|
792
|
-
----------
|
|
793
|
-
name : `str`
|
|
794
|
-
Name to use for this class.
|
|
795
|
-
baseClass : `type`, optional
|
|
796
|
-
Base class for this `StorageClass`. Must be either `StorageClass`
|
|
797
|
-
or a subclass of `StorageClass`. If `None`, `StorageClass` will
|
|
798
|
-
be used.
|
|
799
|
-
**kwargs
|
|
800
|
-
Additional parameter values to use as defaults for this class.
|
|
801
|
-
This can include ``components``, ``parameters``,
|
|
802
|
-
``derivedComponents``, and ``converters``.
|
|
803
|
-
|
|
804
|
-
Returns
|
|
805
|
-
-------
|
|
806
|
-
newtype : `type` subclass of `StorageClass`
|
|
807
|
-
Newly created Python type.
|
|
808
|
-
"""
|
|
809
|
-
if baseClass is None:
|
|
810
|
-
baseClass = StorageClass
|
|
811
|
-
if not issubclass(baseClass, StorageClass):
|
|
812
|
-
raise ValueError(f"Base class must be a StorageClass not {baseClass}")
|
|
813
|
-
|
|
814
|
-
# convert the arguments to use different internal names
|
|
815
|
-
clsargs = {f"_cls_{k}": v for k, v in kwargs.items() if v is not None}
|
|
816
|
-
clsargs["_cls_name"] = name
|
|
817
|
-
|
|
818
|
-
# Some container items need to merge with the base class values
|
|
819
|
-
# so that a child can inherit but override one bit.
|
|
820
|
-
# lists (which you get from configs) are treated as sets for this to
|
|
821
|
-
# work consistently.
|
|
822
|
-
for k in ("components", "parameters", "derivedComponents", "converters"):
|
|
823
|
-
classKey = f"_cls_{k}"
|
|
824
|
-
if classKey in clsargs:
|
|
825
|
-
baseValue = getattr(baseClass, classKey, None)
|
|
826
|
-
if baseValue is not None:
|
|
827
|
-
currentValue = clsargs[classKey]
|
|
828
|
-
if isinstance(currentValue, dict):
|
|
829
|
-
newValue = baseValue.copy()
|
|
830
|
-
else:
|
|
831
|
-
newValue = set(baseValue)
|
|
832
|
-
newValue.update(currentValue)
|
|
833
|
-
clsargs[classKey] = newValue
|
|
834
|
-
|
|
835
|
-
# If we have parameters they should be a frozen set so that the
|
|
836
|
-
# parameters in the class can not be modified.
|
|
837
|
-
pk = "_cls_parameters"
|
|
838
|
-
if pk in clsargs:
|
|
839
|
-
clsargs[pk] = frozenset(clsargs[pk])
|
|
840
|
-
|
|
841
|
-
return type(f"StorageClass{name}", (baseClass,), clsargs)
|
|
842
|
-
|
|
843
735
|
def getStorageClass(self, storageClassName: str) -> StorageClass:
|
|
844
736
|
"""Get a StorageClass instance associated with the supplied name.
|
|
845
737
|
|
|
@@ -66,8 +66,8 @@ if TYPE_CHECKING:
|
|
|
66
66
|
from .._dataset_ref import DatasetId, DatasetRef
|
|
67
67
|
from .._dataset_type import DatasetType
|
|
68
68
|
from .._storage_class import StorageClass
|
|
69
|
+
from ..datastores.file_datastore.get import DatasetLocationInformation
|
|
69
70
|
from ..datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo
|
|
70
|
-
from ..datastores.fileDatastoreClient import FileDatastoreGetPayload
|
|
71
71
|
from ..registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
|
|
72
72
|
from .record_data import DatastoreRecordData
|
|
73
73
|
from .stored_file_info import StoredDatastoreItemInfo
|
|
@@ -614,8 +614,8 @@ class Datastore(FileTransferSource, metaclass=ABCMeta):
|
|
|
614
614
|
"""
|
|
615
615
|
raise NotImplementedError("Must be implemented by subclass")
|
|
616
616
|
|
|
617
|
-
def prepare_get_for_external_client(self, ref: DatasetRef) ->
|
|
618
|
-
"""Retrieve
|
|
617
|
+
def prepare_get_for_external_client(self, ref: DatasetRef) -> list[DatasetLocationInformation] | None:
|
|
618
|
+
"""Retrieve data that can be used to execute a ``get()``.
|
|
619
619
|
|
|
620
620
|
Parameters
|
|
621
621
|
----------
|
|
@@ -624,11 +624,9 @@ class Datastore(FileTransferSource, metaclass=ABCMeta):
|
|
|
624
624
|
|
|
625
625
|
Returns
|
|
626
626
|
-------
|
|
627
|
-
payload : `
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
system to perform the get(). Returns `None` if the dataset is not
|
|
631
|
-
known to this datastore.
|
|
627
|
+
payload : `list` [ `DatasetLocationInformation` ] | `None`
|
|
628
|
+
Information needed to perform a get() operation. Returns `None` if
|
|
629
|
+
the dataset is not known to this datastore.
|
|
632
630
|
"""
|
|
633
631
|
raise NotImplementedError()
|
|
634
632
|
|
|
@@ -111,6 +111,28 @@ class DatastoreRecordData:
|
|
|
111
111
|
"""Opaque table data, indexed by dataset ID and grouped by opaque table
|
|
112
112
|
name."""
|
|
113
113
|
|
|
114
|
+
@staticmethod
|
|
115
|
+
def merge_mappings(*args: Mapping[str, DatastoreRecordData]) -> dict[str, DatastoreRecordData]:
|
|
116
|
+
"""Merge mappings of datastore record data.
|
|
117
|
+
|
|
118
|
+
Parameters
|
|
119
|
+
----------
|
|
120
|
+
*args : `~collections.abc.Mapping` [ `str`, `DatastoreRecordData` ]
|
|
121
|
+
Mappings of record data, keyed by datastore name.
|
|
122
|
+
|
|
123
|
+
Returns
|
|
124
|
+
-------
|
|
125
|
+
merged : `~collections.abc.Mapping` [ `str`, `DatastoreRecordData` ]
|
|
126
|
+
Merged mapping of record data, keyed by datastore name.
|
|
127
|
+
"""
|
|
128
|
+
result: dict[str, DatastoreRecordData] = {}
|
|
129
|
+
for arg in args:
|
|
130
|
+
for datastore_name, record_data in arg.items():
|
|
131
|
+
if datastore_name not in result:
|
|
132
|
+
result[datastore_name] = DatastoreRecordData()
|
|
133
|
+
result[datastore_name].update(record_data)
|
|
134
|
+
return result
|
|
135
|
+
|
|
114
136
|
def update(self, other: DatastoreRecordData) -> None:
|
|
115
137
|
"""Update contents of this instance with data from another instance.
|
|
116
138
|
|
|
@@ -32,7 +32,7 @@ __all__ = ("SerializedStoredFileInfo", "StoredDatastoreItemInfo", "StoredFileInf
|
|
|
32
32
|
import inspect
|
|
33
33
|
from collections.abc import Iterable, Mapping
|
|
34
34
|
from dataclasses import dataclass
|
|
35
|
-
from typing import TYPE_CHECKING, Any
|
|
35
|
+
from typing import TYPE_CHECKING, Any
|
|
36
36
|
|
|
37
37
|
import pydantic
|
|
38
38
|
|
|
@@ -209,8 +209,6 @@ class StoredFileInfo(StoredDatastoreItemInfo):
|
|
|
209
209
|
compatibility, it remains a positional argument with no default).
|
|
210
210
|
"""
|
|
211
211
|
|
|
212
|
-
storageClassFactory: ClassVar[StorageClassFactory] = StorageClassFactory()
|
|
213
|
-
|
|
214
212
|
def __init__(
|
|
215
213
|
self,
|
|
216
214
|
formatter: FormatterParameter,
|
|
@@ -268,7 +266,7 @@ class StoredFileInfo(StoredDatastoreItemInfo):
|
|
|
268
266
|
@property
|
|
269
267
|
def storageClass(self) -> StorageClass:
|
|
270
268
|
"""Storage class associated with this dataset."""
|
|
271
|
-
return
|
|
269
|
+
return StorageClassFactory().getStorageClass(self.storage_class_name)
|
|
272
270
|
|
|
273
271
|
def rebase(self, ref: DatasetRef) -> StoredFileInfo:
|
|
274
272
|
"""Return a copy of the record suitable for a specified reference.
|
|
@@ -47,6 +47,7 @@ from lsst.daf.butler.datastore import (
|
|
|
47
47
|
)
|
|
48
48
|
from lsst.daf.butler.datastore.constraints import Constraints
|
|
49
49
|
from lsst.daf.butler.datastore.record_data import DatastoreRecordData
|
|
50
|
+
from lsst.daf.butler.datastores.file_datastore.get import DatasetLocationInformation
|
|
50
51
|
from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo, ZipIndex
|
|
51
52
|
from lsst.resources import ResourcePath
|
|
52
53
|
from lsst.utils import doImportType
|
|
@@ -61,8 +62,6 @@ if TYPE_CHECKING:
|
|
|
61
62
|
from lsst.daf.butler.registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
|
|
62
63
|
from lsst.resources import ResourcePathExpression
|
|
63
64
|
|
|
64
|
-
from .fileDatastoreClient import FileDatastoreGetPayload
|
|
65
|
-
|
|
66
65
|
log = getLogger(__name__)
|
|
67
66
|
|
|
68
67
|
|
|
@@ -411,7 +410,7 @@ class ChainedDatastore(Datastore):
|
|
|
411
410
|
|
|
412
411
|
raise FileNotFoundError(f"Dataset {ref} could not be found in any of the datastores")
|
|
413
412
|
|
|
414
|
-
def prepare_get_for_external_client(self, ref: DatasetRef) ->
|
|
413
|
+
def prepare_get_for_external_client(self, ref: DatasetRef) -> list[DatasetLocationInformation] | None:
|
|
415
414
|
datastore = self._get_matching_datastore(ref)
|
|
416
415
|
if datastore is None:
|
|
417
416
|
return None
|
|
@@ -89,10 +89,6 @@ from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import (
|
|
|
89
89
|
determine_destination_for_retrieved_artifact,
|
|
90
90
|
unpack_zips,
|
|
91
91
|
)
|
|
92
|
-
from lsst.daf.butler.datastores.fileDatastoreClient import (
|
|
93
|
-
FileDatastoreGetPayload,
|
|
94
|
-
FileDatastoreGetPayloadFileInfo,
|
|
95
|
-
)
|
|
96
92
|
from lsst.daf.butler.registry.interfaces import (
|
|
97
93
|
DatabaseInsertMode,
|
|
98
94
|
DatastoreRegistryBridge,
|
|
@@ -110,7 +106,6 @@ from lsst.utils.logging import VERBOSE, getLogger
|
|
|
110
106
|
from lsst.utils.timer import time_this
|
|
111
107
|
|
|
112
108
|
from ..datastore import FileTransferMap, FileTransferRecord
|
|
113
|
-
from ..datastore.stored_file_info import make_datastore_path_relative
|
|
114
109
|
|
|
115
110
|
if TYPE_CHECKING:
|
|
116
111
|
from lsst.daf.butler import DatasetProvenance, LookupKey
|
|
@@ -2304,27 +2299,14 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
2304
2299
|
allGetInfo, ref=ref, parameters=parameters, cache_manager=self.cacheManager
|
|
2305
2300
|
)
|
|
2306
2301
|
|
|
2307
|
-
def prepare_get_for_external_client(self, ref: DatasetRef) ->
|
|
2302
|
+
def prepare_get_for_external_client(self, ref: DatasetRef) -> list[DatasetLocationInformation] | None:
|
|
2308
2303
|
# Docstring inherited
|
|
2309
2304
|
|
|
2310
|
-
# 1 hour. Chosen somewhat arbitrarily -- this is long enough that the
|
|
2311
|
-
# client should have time to download a large file with retries if
|
|
2312
|
-
# needed, but short enough that it will become obvious quickly that
|
|
2313
|
-
# these URLs expire.
|
|
2314
|
-
# From a strictly technical standpoint there is no reason this
|
|
2315
|
-
# shouldn't be a day or more, but there seems to be a political issue
|
|
2316
|
-
# where people think there is a risk of end users posting presigned
|
|
2317
|
-
# URLs for people without access rights to download.
|
|
2318
|
-
url_expiration_time_seconds = 1 * 60 * 60
|
|
2319
|
-
|
|
2320
2305
|
locations = self._get_dataset_locations_info(ref)
|
|
2321
2306
|
if len(locations) == 0:
|
|
2322
2307
|
return None
|
|
2323
2308
|
|
|
2324
|
-
return
|
|
2325
|
-
datastore_type="file",
|
|
2326
|
-
file_info=[_to_file_info_payload(info, url_expiration_time_seconds) for info in locations],
|
|
2327
|
-
)
|
|
2309
|
+
return locations
|
|
2328
2310
|
|
|
2329
2311
|
@transactional
|
|
2330
2312
|
def put(self, inMemoryDataset: Any, ref: DatasetRef, provenance: DatasetProvenance | None = None) -> None:
|
|
@@ -3229,17 +3211,3 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
|
|
|
3229
3211
|
def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
|
|
3230
3212
|
# Docstring inherited from the base class.
|
|
3231
3213
|
return {self._opaque_table_name: DatastoreOpaqueTable(self.makeTableSpec(), StoredFileInfo)}
|
|
3232
|
-
|
|
3233
|
-
|
|
3234
|
-
def _to_file_info_payload(
|
|
3235
|
-
info: DatasetLocationInformation, url_expiration_time_seconds: int
|
|
3236
|
-
) -> FileDatastoreGetPayloadFileInfo:
|
|
3237
|
-
location, file_info = info
|
|
3238
|
-
|
|
3239
|
-
datastoreRecords = file_info.to_simple()
|
|
3240
|
-
datastoreRecords.path = make_datastore_path_relative(datastoreRecords.path)
|
|
3241
|
-
|
|
3242
|
-
return FileDatastoreGetPayloadFileInfo(
|
|
3243
|
-
url=location.uri.generate_presigned_get_url(expiration_time_seconds=url_expiration_time_seconds),
|
|
3244
|
-
datastoreRecords=datastoreRecords,
|
|
3245
|
-
)
|
|
@@ -753,7 +753,6 @@ class SerializableDimensionData(pydantic.RootModel):
|
|
|
753
753
|
]
|
|
754
754
|
|
|
755
755
|
|
|
756
|
-
@dataclasses.dataclass
|
|
757
756
|
class DimensionDataAttacher:
|
|
758
757
|
"""A helper class for attaching dimension records to data IDs.
|
|
759
758
|
|
|
@@ -786,7 +785,7 @@ class DimensionDataAttacher:
|
|
|
786
785
|
dimensions: DimensionGroup | None = None,
|
|
787
786
|
):
|
|
788
787
|
self.records = {record_set.element.name: record_set for record_set in records}
|
|
789
|
-
self.deserializers = {}
|
|
788
|
+
self.deserializers: dict[str, DimensionRecordSetDeserializer] = {}
|
|
790
789
|
for deserializer in deserializers:
|
|
791
790
|
self.deserializers[deserializer.element.name] = deserializer
|
|
792
791
|
if deserializer.element.name not in self.records:
|
|
@@ -851,6 +850,54 @@ class DimensionDataAttacher:
|
|
|
851
850
|
|
|
852
851
|
return [r.data_id.expanded(r.done) for r in records]
|
|
853
852
|
|
|
853
|
+
def serialized(
|
|
854
|
+
self, *, ignore: Iterable[str] = (), ignore_cached: bool = False, include_skypix: bool = False
|
|
855
|
+
) -> SerializableDimensionData:
|
|
856
|
+
"""Serialize all dimension data in this attacher, with deduplication
|
|
857
|
+
across fully- and partially-deserialized records.
|
|
858
|
+
|
|
859
|
+
Parameters
|
|
860
|
+
----------
|
|
861
|
+
ignore : `~collections.abc.Iterable` [ `str` ], optional
|
|
862
|
+
Names of dimension elements that should not be serialized.
|
|
863
|
+
ignore_cached : `bool`, optional
|
|
864
|
+
If `True`, ignore all dimension elements for which
|
|
865
|
+
`DimensionElement.is_cached` is `True`.
|
|
866
|
+
include_skypix : `bool`, optional
|
|
867
|
+
If `True`, include skypix dimensions. These are ignored by default
|
|
868
|
+
because they can always be recomputed from their IDs on-the-fly.
|
|
869
|
+
|
|
870
|
+
Returns
|
|
871
|
+
-------
|
|
872
|
+
serialized : `SerializedDimensionData`
|
|
873
|
+
Serialized dimension records.
|
|
874
|
+
"""
|
|
875
|
+
from ._skypix import SkyPixDimension
|
|
876
|
+
|
|
877
|
+
ignore = set(ignore)
|
|
878
|
+
result = SerializableDimensionData()
|
|
879
|
+
for record_set in self.records.values():
|
|
880
|
+
if record_set.element.name in ignore:
|
|
881
|
+
continue
|
|
882
|
+
if not include_skypix and isinstance(record_set.element, SkyPixDimension):
|
|
883
|
+
continue
|
|
884
|
+
if ignore_cached and record_set.element.is_cached:
|
|
885
|
+
continue
|
|
886
|
+
serialized_records: dict[tuple[DataIdValue, ...], SerializedKeyValueDimensionRecord] = {}
|
|
887
|
+
if (deserializer := self.deserializers.get(record_set.element.name)) is not None:
|
|
888
|
+
for key, value in deserializer._mapping.items():
|
|
889
|
+
serialized_record = list(key)
|
|
890
|
+
serialized_record.extend(value)
|
|
891
|
+
serialized_records[key] = serialized_record
|
|
892
|
+
for key, record in record_set._by_required_values.items():
|
|
893
|
+
if key not in serialized_records:
|
|
894
|
+
serialized_records[key] = record.serialize_key_value()
|
|
895
|
+
result.root[record_set.element.name] = list(serialized_records.values())
|
|
896
|
+
if self.cache is not None and not ignore_cached:
|
|
897
|
+
for record_set in self.cache.values():
|
|
898
|
+
result.root[record_set.element.name] = record_set.serialize_records()
|
|
899
|
+
return result
|
|
900
|
+
|
|
854
901
|
|
|
855
902
|
@dataclasses.dataclass
|
|
856
903
|
class _InProgressRecordDicts:
|
|
@@ -25,16 +25,24 @@
|
|
|
25
25
|
# You should have received a copy of the GNU General Public License
|
|
26
26
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
27
27
|
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
from typing import Literal, TypeAlias
|
|
31
|
+
|
|
28
32
|
from pydantic import AnyHttpUrl, BaseModel
|
|
29
33
|
|
|
30
34
|
|
|
35
|
+
class RemoteButlerConfigModel(BaseModel):
|
|
36
|
+
"""ButlerConfig properties for RemoteButler."""
|
|
37
|
+
|
|
38
|
+
remote_butler: RemoteButlerOptionsModel
|
|
39
|
+
|
|
40
|
+
|
|
31
41
|
class RemoteButlerOptionsModel(BaseModel):
|
|
32
42
|
"""Model representing the remote server connection."""
|
|
33
43
|
|
|
34
44
|
url: AnyHttpUrl
|
|
45
|
+
authentication: AuthenticationMode = "rubin_science_platform"
|
|
35
46
|
|
|
36
47
|
|
|
37
|
-
|
|
38
|
-
"""Configuration representing a remote butler."""
|
|
39
|
-
|
|
40
|
-
remote_butler: RemoteButlerOptionsModel
|
|
48
|
+
AuthenticationMode: TypeAlias = Literal["rubin_science_platform", "cadc"]
|