lsst-daf-butler 29.2025.2900__tar.gz → 29.2025.3100__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.2900/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.3100}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler.py +2 -2
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_labeled_butler_factory.py +2 -2
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/_datastore.py +6 -8
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/chainedDatastore.py +2 -3
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/fileDatastore.py +2 -34
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/__init__.py +0 -1
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_config.py +12 -4
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_factory.py +51 -27
- lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/_get.py +98 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_http_connection.py +11 -17
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_remote_butler.py +12 -7
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +3 -10
- lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication/cadc.py +54 -0
- lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication/interface.py +46 -0
- lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/remote_butler/_authentication.py → lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication/rubin.py +36 -20
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_config.py +5 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +4 -2
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +29 -12
- lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +72 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server_models.py +38 -3
- lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/server.py +13 -6
- lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/SOURCES.txt +6 -2
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_authentication.py +18 -9
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_butler.py +1 -1
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_server.py +52 -6
- lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -90
- lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/README.md +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication}/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/tests/registry_data → lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/registry}/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_dimension_record_containers.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/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.3100
|
|
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.2900 → lsst_daf_butler-29.2025.3100}/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:
|
|
@@ -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
|
|
|
@@ -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
|
-
)
|
|
@@ -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"]
|
|
@@ -36,10 +36,12 @@ from lsst.daf.butler.repo_relocation import replaceRoot
|
|
|
36
36
|
from .._butler_config import ButlerConfig
|
|
37
37
|
from .._butler_instance_options import ButlerInstanceOptions
|
|
38
38
|
from ..registry import RegistryDefaults
|
|
39
|
-
from .
|
|
40
|
-
from ._config import RemoteButlerConfigModel
|
|
39
|
+
from ._config import RemoteButlerConfigModel, RemoteButlerOptionsModel
|
|
41
40
|
from ._http_connection import RemoteButlerHttpConnection
|
|
42
41
|
from ._remote_butler import RemoteButler, RemoteButlerCache
|
|
42
|
+
from .authentication.cadc import CadcAuthenticationProvider
|
|
43
|
+
from .authentication.interface import RemoteButlerAuthenticationProvider
|
|
44
|
+
from .authentication.rubin import RubinAuthenticationProvider
|
|
43
45
|
|
|
44
46
|
|
|
45
47
|
class RemoteButlerFactory:
|
|
@@ -49,9 +51,9 @@ class RemoteButlerFactory:
|
|
|
49
51
|
|
|
50
52
|
Parameters
|
|
51
53
|
----------
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
54
|
+
config : `RemoteButlerOptionsModel`
|
|
55
|
+
`RemoteButler` configuration information (as read from `ButlerConfig`
|
|
56
|
+
YAML file).
|
|
55
57
|
http_client : `httpx.Client`, optional
|
|
56
58
|
The httpx connection pool that RemoteButler instances created by this
|
|
57
59
|
factory will use for making HTTP requests. If omitted, creates a new
|
|
@@ -60,11 +62,12 @@ class RemoteButlerFactory:
|
|
|
60
62
|
Notes
|
|
61
63
|
-----
|
|
62
64
|
Most users should not directly call this constructor -- instead use
|
|
63
|
-
``create_factory_from_config
|
|
65
|
+
``create_factory_from_config``.
|
|
64
66
|
"""
|
|
65
67
|
|
|
66
|
-
def __init__(self,
|
|
67
|
-
self.
|
|
68
|
+
def __init__(self, config: RemoteButlerOptionsModel, http_client: httpx.Client | None = None):
|
|
69
|
+
self._config = config
|
|
70
|
+
self.server_url = str(config.url)
|
|
68
71
|
if http_client is not None:
|
|
69
72
|
self.http_client = http_client
|
|
70
73
|
else:
|
|
@@ -83,7 +86,9 @@ class RemoteButlerFactory:
|
|
|
83
86
|
self._cache = RemoteButlerCache()
|
|
84
87
|
|
|
85
88
|
@staticmethod
|
|
86
|
-
def create_factory_from_config(
|
|
89
|
+
def create_factory_from_config(
|
|
90
|
+
config: ButlerConfig, http_client: httpx.Client | None = None
|
|
91
|
+
) -> RemoteButlerFactory:
|
|
87
92
|
# There is a convention in Butler config files where <butlerRoot> in a
|
|
88
93
|
# configuration option refers to the directory containing the
|
|
89
94
|
# configuration file. We allow this for the remote butler's URL so
|
|
@@ -93,42 +98,61 @@ class RemoteButlerFactory:
|
|
|
93
98
|
if server_url_key in config:
|
|
94
99
|
config[server_url_key] = replaceRoot(config[server_url_key], config.configDir)
|
|
95
100
|
remote_config = RemoteButlerConfigModel.model_validate(config)
|
|
96
|
-
return RemoteButlerFactory
|
|
101
|
+
return RemoteButlerFactory(remote_config.remote_butler, http_client=http_client)
|
|
97
102
|
|
|
98
103
|
@staticmethod
|
|
99
|
-
def create_factory_for_url(
|
|
100
|
-
|
|
104
|
+
def create_factory_for_url(
|
|
105
|
+
server_url: str, http_client: httpx.Client | None = None
|
|
106
|
+
) -> RemoteButlerFactory:
|
|
107
|
+
config = ButlerConfig(server_url)
|
|
108
|
+
return RemoteButlerFactory.create_factory_from_config(config, http_client=http_client)
|
|
101
109
|
|
|
102
|
-
def
|
|
110
|
+
def _create_butler(
|
|
103
111
|
self,
|
|
104
|
-
access_token: str,
|
|
105
112
|
*,
|
|
106
|
-
|
|
107
|
-
|
|
113
|
+
auth: RemoteButlerAuthenticationProvider,
|
|
114
|
+
butler_options: ButlerInstanceOptions | None,
|
|
115
|
+
enable_datastore_cache: bool = False,
|
|
108
116
|
) -> RemoteButler:
|
|
109
117
|
if butler_options is None:
|
|
110
118
|
butler_options = ButlerInstanceOptions()
|
|
111
119
|
return RemoteButler(
|
|
112
120
|
connection=RemoteButlerHttpConnection(
|
|
113
|
-
http_client=self.http_client, server_url=self.server_url,
|
|
121
|
+
http_client=self.http_client, server_url=self.server_url, auth=auth
|
|
114
122
|
),
|
|
115
123
|
defaults=RegistryDefaults.from_butler_instance_options(butler_options),
|
|
116
124
|
cache=self._cache,
|
|
117
|
-
use_disabled_datastore_cache=
|
|
125
|
+
use_disabled_datastore_cache=not enable_datastore_cache,
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
def create_butler_for_access_token(
|
|
129
|
+
self,
|
|
130
|
+
access_token: str,
|
|
131
|
+
*,
|
|
132
|
+
butler_options: ButlerInstanceOptions | None = None,
|
|
133
|
+
enable_datastore_cache: bool = False,
|
|
134
|
+
) -> RemoteButler:
|
|
135
|
+
auth: RemoteButlerAuthenticationProvider
|
|
136
|
+
if self._config.authentication == "rubin_science_platform":
|
|
137
|
+
auth = RubinAuthenticationProvider(access_token)
|
|
138
|
+
elif self._config.authentication == "cadc":
|
|
139
|
+
auth = CadcAuthenticationProvider()
|
|
140
|
+
return self._create_butler(
|
|
141
|
+
auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
|
|
118
142
|
)
|
|
119
143
|
|
|
120
144
|
def create_butler_with_credentials_from_environment(
|
|
121
145
|
self,
|
|
122
146
|
*,
|
|
123
147
|
butler_options: ButlerInstanceOptions | None = None,
|
|
124
|
-
|
|
148
|
+
enable_datastore_cache: bool = True,
|
|
125
149
|
) -> RemoteButler:
|
|
126
|
-
|
|
127
|
-
if
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
return self.
|
|
133
|
-
|
|
150
|
+
auth: RemoteButlerAuthenticationProvider
|
|
151
|
+
if self._config.authentication == "rubin_science_platform":
|
|
152
|
+
auth = RubinAuthenticationProvider.create_from_environment(self.server_url)
|
|
153
|
+
elif self._config.authentication == "cadc":
|
|
154
|
+
auth = CadcAuthenticationProvider()
|
|
155
|
+
|
|
156
|
+
return self._create_butler(
|
|
157
|
+
auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
|
|
134
158
|
)
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from typing import Any
|
|
2
|
+
|
|
3
|
+
from pydantic import AnyHttpUrl
|
|
4
|
+
|
|
5
|
+
from lsst.resources import ResourcePath
|
|
6
|
+
from lsst.resources.http import HttpResourcePath
|
|
7
|
+
|
|
8
|
+
from .._dataset_ref import DatasetRef
|
|
9
|
+
from .._location import Location
|
|
10
|
+
from ..datastore.cache_manager import AbstractDatastoreCacheManager, DatastoreDisabledCacheManager
|
|
11
|
+
from ..datastore.stored_file_info import StoredFileInfo
|
|
12
|
+
from ..datastores.file_datastore.get import (
|
|
13
|
+
DatasetLocationInformation,
|
|
14
|
+
Mapping,
|
|
15
|
+
generate_datastore_get_information,
|
|
16
|
+
get_dataset_as_python_object_from_get_info,
|
|
17
|
+
)
|
|
18
|
+
from .authentication.interface import RemoteButlerAuthenticationProvider
|
|
19
|
+
from .server_models import FileAuthenticationMode, FileInfoPayload, FileInfoRecord
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def get_dataset_as_python_object(
|
|
23
|
+
ref: DatasetRef,
|
|
24
|
+
payload: FileInfoPayload,
|
|
25
|
+
*,
|
|
26
|
+
auth: RemoteButlerAuthenticationProvider,
|
|
27
|
+
parameters: Mapping[str, Any] | None,
|
|
28
|
+
cache_manager: AbstractDatastoreCacheManager | None = None,
|
|
29
|
+
) -> Any:
|
|
30
|
+
"""Retrieve an artifact from storage and return it as a Python object.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
ref : `DatasetRef`
|
|
35
|
+
Metadata about this artifact.
|
|
36
|
+
payload : `FileInfoPayload`
|
|
37
|
+
Pre-processed information about each file associated with this
|
|
38
|
+
artifact.
|
|
39
|
+
auth : `RemoteButlerAuthenticationProvider`
|
|
40
|
+
Provides authentication headers for HTTP service hosting the artifact
|
|
41
|
+
files.
|
|
42
|
+
parameters : `Mapping`[`str`, `typing.Any`]
|
|
43
|
+
`StorageClass` and `Formatter` parameters to be used when converting
|
|
44
|
+
the artifact to a Python object.
|
|
45
|
+
cache_manager : `AbstractDatastoreCacheManager` or `None`, optional
|
|
46
|
+
Cache manager to use. If `None` the cache is disabled.
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
python_object : `typing.Any`
|
|
51
|
+
The retrieved artifact, converted to a Python object.
|
|
52
|
+
"""
|
|
53
|
+
fileLocations = [_to_dataset_location_information(file_info, auth) for file_info in payload.file_info]
|
|
54
|
+
|
|
55
|
+
datastore_file_info = generate_datastore_get_information(
|
|
56
|
+
fileLocations,
|
|
57
|
+
ref=ref,
|
|
58
|
+
parameters=parameters,
|
|
59
|
+
)
|
|
60
|
+
if cache_manager is None:
|
|
61
|
+
cache_manager = DatastoreDisabledCacheManager()
|
|
62
|
+
return get_dataset_as_python_object_from_get_info(
|
|
63
|
+
datastore_file_info, ref=ref, parameters=parameters, cache_manager=cache_manager
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def convert_http_url_to_resource_path(
|
|
68
|
+
url: AnyHttpUrl, auth: RemoteButlerAuthenticationProvider, auth_mode: FileAuthenticationMode
|
|
69
|
+
) -> ResourcePath:
|
|
70
|
+
"""Convert an HTTP URL to a ResourcePath instance with authentication
|
|
71
|
+
headers attached.
|
|
72
|
+
|
|
73
|
+
Parameters
|
|
74
|
+
----------
|
|
75
|
+
url : `AnyHttpUrl`
|
|
76
|
+
URL to convert.
|
|
77
|
+
auth : `RemoteButlerAuthenticationProvider`
|
|
78
|
+
Provides authentication headers for the URL.
|
|
79
|
+
auth_mode : `FileAuthenticationMode`
|
|
80
|
+
Specifies which authentication headers to use.
|
|
81
|
+
"""
|
|
82
|
+
if auth_mode == "none":
|
|
83
|
+
headers = None
|
|
84
|
+
elif auth_mode == "gafaelfawr":
|
|
85
|
+
headers = auth.get_server_headers()
|
|
86
|
+
elif auth_mode == "datastore":
|
|
87
|
+
headers = auth.get_datastore_headers()
|
|
88
|
+
else:
|
|
89
|
+
raise ValueError(f"Unknown authentication type: '{auth_mode}'")
|
|
90
|
+
|
|
91
|
+
return HttpResourcePath.create_http_resource_path(str(url), extra_headers=headers)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def _to_dataset_location_information(
|
|
95
|
+
file_info: FileInfoRecord, auth: RemoteButlerAuthenticationProvider
|
|
96
|
+
) -> DatasetLocationInformation:
|
|
97
|
+
path = convert_http_url_to_resource_path(file_info.url, auth, auth_mode=file_info.auth)
|
|
98
|
+
return (Location(None, path), StoredFileInfo.from_simple(file_info.datastoreRecords))
|
|
@@ -42,13 +42,15 @@ from pydantic import BaseModel, ValidationError
|
|
|
42
42
|
|
|
43
43
|
from lsst.daf.butler import __version__
|
|
44
44
|
|
|
45
|
-
from ._authentication import get_authentication_headers
|
|
46
45
|
from ._errors import deserialize_butler_user_error
|
|
46
|
+
from .authentication.interface import RemoteButlerAuthenticationProvider
|
|
47
47
|
from .server_models import CLIENT_REQUEST_ID_HEADER_NAME, ERROR_STATUS_CODE, ErrorResponseModel
|
|
48
48
|
|
|
49
49
|
_AnyPydanticModel = TypeVar("_AnyPydanticModel", bound=BaseModel)
|
|
50
50
|
"""Generic type variable that accepts any Pydantic model class."""
|
|
51
51
|
|
|
52
|
+
_USER_AGENT = f"RemoteButler/{__version__}"
|
|
53
|
+
|
|
52
54
|
|
|
53
55
|
class RemoteButlerHttpConnection:
|
|
54
56
|
"""HTTP connection to a Butler server.
|
|
@@ -59,24 +61,16 @@ class RemoteButlerHttpConnection:
|
|
|
59
61
|
HTTP connection pool we will use to connect to the server.
|
|
60
62
|
server_url : `str`
|
|
61
63
|
URL of the Butler server we will connect to.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
authenticate with the server.
|
|
64
|
+
auth : `RemoteButlerAuthenticationProvider`
|
|
65
|
+
Provides headers that will be used to authenticate with the server.
|
|
65
66
|
"""
|
|
66
67
|
|
|
67
|
-
def __init__(
|
|
68
|
+
def __init__(
|
|
69
|
+
self, http_client: httpx.Client, server_url: str, auth: RemoteButlerAuthenticationProvider
|
|
70
|
+
) -> None:
|
|
68
71
|
self._client = http_client
|
|
69
72
|
self.server_url = server_url
|
|
70
|
-
self.
|
|
71
|
-
|
|
72
|
-
self._auth_headers = get_authentication_headers(access_token)
|
|
73
|
-
headers = {"user-agent": f"RemoteButler/{__version__}"}
|
|
74
|
-
|
|
75
|
-
self._headers = self._auth_headers | headers
|
|
76
|
-
|
|
77
|
-
@property
|
|
78
|
-
def authentication_headers(self) -> dict[str, str]:
|
|
79
|
-
return self._auth_headers
|
|
73
|
+
self.auth = auth
|
|
80
74
|
|
|
81
75
|
def post(self, path: str, model: BaseModel) -> httpx.Response:
|
|
82
76
|
"""Send a POST request to the Butler server.
|
|
@@ -196,8 +190,8 @@ class RemoteButlerHttpConnection:
|
|
|
196
190
|
url = self._get_url(path)
|
|
197
191
|
|
|
198
192
|
request_id = str(uuid4())
|
|
199
|
-
request_headers = {CLIENT_REQUEST_ID_HEADER_NAME: request_id}
|
|
200
|
-
request_headers.update(self.
|
|
193
|
+
request_headers = {CLIENT_REQUEST_ID_HEADER_NAME: request_id, "user-agent": _USER_AGENT}
|
|
194
|
+
request_headers.update(self.auth.get_server_headers())
|
|
201
195
|
if headers is not None:
|
|
202
196
|
request_headers.update(headers)
|
|
203
197
|
|
|
@@ -45,10 +45,6 @@ from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import (
|
|
|
45
45
|
retrieve_and_zip,
|
|
46
46
|
unpack_zips,
|
|
47
47
|
)
|
|
48
|
-
from lsst.daf.butler.datastores.fileDatastoreClient import (
|
|
49
|
-
FileDatastoreGetPayload,
|
|
50
|
-
get_dataset_as_python_object,
|
|
51
|
-
)
|
|
52
48
|
from lsst.resources import ResourcePath, ResourcePathExpression
|
|
53
49
|
|
|
54
50
|
from .._butler import Butler, _DeprecatedDefault
|
|
@@ -70,6 +66,7 @@ from ..queries.tree import make_column_literal
|
|
|
70
66
|
from ..registry import CollectionArgType, NoDefaultCollectionError, Registry, RegistryDefaults
|
|
71
67
|
from ._collection_args import convert_collection_arg_to_glob_string_list
|
|
72
68
|
from ._defaults import DefaultsHolder
|
|
69
|
+
from ._get import convert_http_url_to_resource_path, get_dataset_as_python_object
|
|
73
70
|
from ._http_connection import RemoteButlerHttpConnection, parse_model, quote_path_variable
|
|
74
71
|
from ._query_driver import RemoteQueryDriver
|
|
75
72
|
from ._query_results import convert_dataset_ref_results, read_query_results
|
|
@@ -79,6 +76,7 @@ from ._remote_butler_collections import RemoteButlerCollections
|
|
|
79
76
|
from ._remote_file_transfer_source import RemoteFileTransferSource
|
|
80
77
|
from .server_models import (
|
|
81
78
|
CollectionList,
|
|
79
|
+
FileInfoPayload,
|
|
82
80
|
FindDatasetRequestModel,
|
|
83
81
|
FindDatasetResponseModel,
|
|
84
82
|
GetDatasetTypeResponseModel,
|
|
@@ -303,6 +301,7 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
|
|
|
303
301
|
return get_dataset_as_python_object(
|
|
304
302
|
ref,
|
|
305
303
|
_to_file_payload(model),
|
|
304
|
+
auth=self._connection.auth,
|
|
306
305
|
parameters=parameters,
|
|
307
306
|
cache_manager=self._cache_manager,
|
|
308
307
|
)
|
|
@@ -355,7 +354,11 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
|
|
|
355
354
|
response = self._get_file_info(datasetRefOrType, dataId, collections, None, kwargs)
|
|
356
355
|
file_info = _to_file_payload(response).file_info
|
|
357
356
|
if len(file_info) == 1:
|
|
358
|
-
return DatasetRefURIs(
|
|
357
|
+
return DatasetRefURIs(
|
|
358
|
+
primaryURI=convert_http_url_to_resource_path(
|
|
359
|
+
file_info[0].url, self._connection.auth, file_info[0].auth
|
|
360
|
+
)
|
|
361
|
+
)
|
|
359
362
|
else:
|
|
360
363
|
components = {}
|
|
361
364
|
for f in file_info:
|
|
@@ -365,7 +368,9 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
|
|
|
365
368
|
f"DatasetId {response.dataset_ref.id} has a component file"
|
|
366
369
|
" with no component name defined"
|
|
367
370
|
)
|
|
368
|
-
components[component] =
|
|
371
|
+
components[component] = convert_http_url_to_resource_path(
|
|
372
|
+
f.url, self._connection.auth, f.auth
|
|
373
|
+
)
|
|
369
374
|
return DatasetRefURIs(componentURIs=components)
|
|
370
375
|
|
|
371
376
|
def get_dataset_type(self, name: str) -> DatasetType:
|
|
@@ -734,7 +739,7 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
|
|
|
734
739
|
return self._registry_defaults.get().dataId.to_simple(minimal=True).dataId
|
|
735
740
|
|
|
736
741
|
|
|
737
|
-
def _to_file_payload(get_file_response: GetFileResponseModel) ->
|
|
742
|
+
def _to_file_payload(get_file_response: GetFileResponseModel) -> FileInfoPayload:
|
|
738
743
|
if get_file_response.artifact is None:
|
|
739
744
|
ref = get_file_response.dataset_ref
|
|
740
745
|
raise DatasetNotFoundError(f"Dataset is known, but artifact is not available. (datasetId='{ref.id}')")
|
|
@@ -37,6 +37,7 @@ from lsst.utils.iteration import chunk_iterable
|
|
|
37
37
|
from .._location import Location
|
|
38
38
|
from ..datastore import FileTransferMap, FileTransferRecord, FileTransferSource
|
|
39
39
|
from ..datastore.stored_file_info import StoredFileInfo
|
|
40
|
+
from ._get import convert_http_url_to_resource_path
|
|
40
41
|
from ._http_connection import RemoteButlerHttpConnection, parse_model
|
|
41
42
|
from .server_models import (
|
|
42
43
|
FileTransferRecordModel,
|
|
@@ -78,15 +79,7 @@ class RemoteFileTransferSource(FileTransferSource):
|
|
|
78
79
|
return {}
|
|
79
80
|
|
|
80
81
|
def _deserialize_file_transfer_record(self, record: FileTransferRecordModel) -> FileTransferRecord:
|
|
81
|
-
|
|
82
|
-
# authentication headers to the URL.
|
|
83
|
-
if record.auth == "none":
|
|
84
|
-
headers = None
|
|
85
|
-
elif record.auth == "gafaelfawr":
|
|
86
|
-
headers = self._connection.authentication_headers
|
|
87
|
-
else:
|
|
88
|
-
raise ValueError(f"Unknown authentication type {record.auth}")
|
|
89
|
-
resource_path = HttpResourcePath.create_http_resource_path(str(record.url), extra_headers=headers)
|
|
82
|
+
resource_path = convert_http_url_to_resource_path(record.url, self._connection.auth, record.auth)
|
|
90
83
|
resource_path = _tweak_uri_for_unit_test(resource_path)
|
|
91
84
|
|
|
92
85
|
return FileTransferRecord(
|
|
@@ -95,7 +88,7 @@ class RemoteFileTransferSource(FileTransferSource):
|
|
|
95
88
|
)
|
|
96
89
|
|
|
97
90
|
|
|
98
|
-
def _tweak_uri_for_unit_test(path:
|
|
91
|
+
def _tweak_uri_for_unit_test(path: ResourcePath) -> ResourcePath:
|
|
99
92
|
# Provide a place for unit tests to hook in and modify URLs, since there is
|
|
100
93
|
# no actual HTTP server reachable via a domain name during testing.
|
|
101
94
|
return path
|
|
@@ -0,0 +1,54 @@
|
|
|
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
|
+
from .interface import RemoteButlerAuthenticationProvider
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class CadcAuthenticationProvider(RemoteButlerAuthenticationProvider):
|
|
34
|
+
"""Provide HTTP headers required for authenticating the user at the
|
|
35
|
+
Canadian Astronomy Data Centre.
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
# NOTE -- This object needs to be pickleable. It will sometimes be
|
|
39
|
+
# serialized and transferred to another process to execute file transfers.
|
|
40
|
+
|
|
41
|
+
def __init__(self) -> None:
|
|
42
|
+
# TODO: Load authentication information somehow
|
|
43
|
+
pass
|
|
44
|
+
|
|
45
|
+
def get_server_headers(self) -> dict[str, str]:
|
|
46
|
+
# TODO: I think you mentioned that you might not require
|
|
47
|
+
# authentication for the Butler server REST API initially --
|
|
48
|
+
# if so, you can leave this blank.
|
|
49
|
+
return {}
|
|
50
|
+
|
|
51
|
+
def get_datastore_headers(self) -> dict[str, str]:
|
|
52
|
+
# TODO: Supply the headers needed to access the Storage Inventory
|
|
53
|
+
# system.
|
|
54
|
+
return {"Authorization": "Bearer stub"}
|