lsst-daf-butler 29.2025.4700__tar.gz → 29.2025.4900__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.4700/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4900}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler.py +6 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_labeled_butler_factory.py +47 -30
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_limited_butler.py +29 -4
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_quantum_backed.py +12 -2
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +13 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/commands.py +6 -3
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/formatters.yaml +3 -2
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +6 -6
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_butler/_direct_butler.py +35 -21
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/parquet.py +30 -18
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/logging.py +17 -7
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/sql_registry.py +30 -9
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_remote_butler.py +3 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/_associate.py +13 -15
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/_pruneDatasets.py +33 -31
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/butlerImport.py +11 -12
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/certifyCalibrations.py +19 -19
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/collectionChain.py +27 -28
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/configValidate.py +11 -9
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/exportCalibs.py +60 -61
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/ingest_files.py +13 -14
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/ingest_zip.py +2 -3
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryCollections.py +141 -138
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDataIds.py +80 -77
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDatasetTypes.py +24 -21
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDatasets.py +4 -14
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDimensionRecords.py +61 -60
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/register_dataset_type.py +15 -14
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/removeCollections.py +39 -34
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/removeDatasetType.py +2 -2
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/removeRuns.py +3 -5
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/retrieveArtifacts.py +30 -27
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/transferDatasets.py +29 -28
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/hybrid_butler.py +4 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/server.py +4 -5
- lsst_daf_butler-29.2025.4900/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_astropyTableFormatter.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_butler.py +89 -3
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_butler_factory.py +4 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdIngestFiles.py +2 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdPruneDatasets.py +77 -24
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryCollections.py +2 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDataIds.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDatasets.py +41 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDimensionRecords.py +3 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdRemoveCollections.py +3 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdRemoveRuns.py +3 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdRetrieveArtifacts.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtilSplitKv.py +4 -2
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_dimension_record_containers.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_dimensions.py +3 -3
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_logFormatter.py +49 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_matplotlibFormatter.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_obscore.py +4 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_packages.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_parquet.py +7 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_postgresql.py +5 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_quantumBackedButler.py +15 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_direct_postgresql.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_direct_sqlite.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_server.py +1 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_simpleButler.py +9 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_sqlite.py +25 -6
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_testRepo.py +5 -1
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_versioning.py +3 -1
- lsst_daf_butler-29.2025.4700/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/README.md +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/CHANGES.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/pyproject.toml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_metrics.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_uuid.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/arrow_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_records.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/server_available.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_column_spec.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_gafaelfawr.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_pydantic_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_utilities.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_uuid.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.4900
|
|
4
4
|
Summary: An abstraction layer for reading and writing astronomical data to datastores.
|
|
5
5
|
Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
|
|
6
6
|
License-Expression: BSD-3-Clause OR GPL-3.0-or-later
|
{lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler.py
RENAMED
|
@@ -506,9 +506,10 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
506
506
|
# Create Registry and populate tables
|
|
507
507
|
registryConfig = RegistryConfig(config.get("registry"))
|
|
508
508
|
dimensionConfig = DimensionConfig(dimensionConfig)
|
|
509
|
-
_RegistryFactory(registryConfig).create_from_config(
|
|
509
|
+
registry = _RegistryFactory(registryConfig).create_from_config(
|
|
510
510
|
dimensionConfig=dimensionConfig, butlerRoot=root_uri
|
|
511
511
|
)
|
|
512
|
+
registry.close()
|
|
512
513
|
|
|
513
514
|
_LOG.verbose("Wrote new Butler configuration file to %s", configURI)
|
|
514
515
|
|
|
@@ -2222,3 +2223,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
2222
2223
|
Metrics object to record butler statistics.
|
|
2223
2224
|
"""
|
|
2224
2225
|
raise NotImplementedError()
|
|
2226
|
+
|
|
2227
|
+
@abstractmethod
|
|
2228
|
+
def close(self) -> None:
|
|
2229
|
+
raise NotImplementedError()
|
|
@@ -25,9 +25,11 @@
|
|
|
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
|
+
|
|
28
30
|
__all__ = ("LabeledButlerFactory", "LabeledButlerFactoryProtocol")
|
|
29
31
|
|
|
30
|
-
from collections.abc import
|
|
32
|
+
from collections.abc import Mapping
|
|
31
33
|
from typing import Protocol
|
|
32
34
|
|
|
33
35
|
from lsst.resources import ResourcePathExpression
|
|
@@ -38,10 +40,6 @@ from ._butler_repo_index import ButlerRepoIndex
|
|
|
38
40
|
from ._utilities.named_locks import NamedLocks
|
|
39
41
|
from ._utilities.thread_safe_cache import ThreadSafeCache
|
|
40
42
|
|
|
41
|
-
_FactoryFunction = Callable[[str | None], Butler]
|
|
42
|
-
"""Function that takes an access token string or `None`, and returns a Butler
|
|
43
|
-
instance."""
|
|
44
|
-
|
|
45
43
|
|
|
46
44
|
class LabeledButlerFactoryProtocol(Protocol):
|
|
47
45
|
"""Callable to retrieve a butler from a label."""
|
|
@@ -84,7 +82,7 @@ class LabeledButlerFactory:
|
|
|
84
82
|
else:
|
|
85
83
|
self._repositories = dict(repositories)
|
|
86
84
|
|
|
87
|
-
self._factories = ThreadSafeCache[str,
|
|
85
|
+
self._factories = ThreadSafeCache[str, _ButlerFactory]()
|
|
88
86
|
self._initialization_locks = NamedLocks()
|
|
89
87
|
|
|
90
88
|
# This may be overridden by unit tests.
|
|
@@ -138,10 +136,18 @@ class LabeledButlerFactory:
|
|
|
138
136
|
based on the end user instead of the service. See
|
|
139
137
|
https://gafaelfawr.lsst.io/user-guide/gafaelfawringress.html#requesting-delegated-tokens
|
|
140
138
|
"""
|
|
141
|
-
factory = self.
|
|
142
|
-
return factory(access_token)
|
|
139
|
+
factory = self._get_or_create_butler_factory(label)
|
|
140
|
+
return factory.create_butler(access_token)
|
|
141
|
+
|
|
142
|
+
def close(self) -> None:
|
|
143
|
+
"""Reset the factory cache, and release any resources associated with
|
|
144
|
+
the cached instances.
|
|
145
|
+
"""
|
|
146
|
+
factories = self._factories.clear()
|
|
147
|
+
for factory in factories.values():
|
|
148
|
+
factory.close()
|
|
143
149
|
|
|
144
|
-
def
|
|
150
|
+
def _get_or_create_butler_factory(self, label: str) -> _ButlerFactory:
|
|
145
151
|
# We maintain a separate lock per label. We only want to instantiate
|
|
146
152
|
# one factory function per label, because creating the factory sets up
|
|
147
153
|
# shared state that should only exist once per repository. However, we
|
|
@@ -154,16 +160,16 @@ class LabeledButlerFactory:
|
|
|
154
160
|
factory = self._create_butler_factory_function(label)
|
|
155
161
|
return self._factories.set_or_get(label, factory)
|
|
156
162
|
|
|
157
|
-
def _create_butler_factory_function(self, label: str) ->
|
|
163
|
+
def _create_butler_factory_function(self, label: str) -> _ButlerFactory:
|
|
158
164
|
config_uri = self._get_config_uri(label)
|
|
159
165
|
config = ButlerConfig(config_uri)
|
|
160
166
|
butler_type = config.get_butler_type()
|
|
161
167
|
|
|
162
168
|
match butler_type:
|
|
163
169
|
case ButlerType.DIRECT:
|
|
164
|
-
return
|
|
170
|
+
return _DirectButlerFactory(config, self._preload_unsafe_direct_butler_caches)
|
|
165
171
|
case ButlerType.REMOTE:
|
|
166
|
-
return
|
|
172
|
+
return _RemoteButlerFactory(config)
|
|
167
173
|
case _:
|
|
168
174
|
raise TypeError(f"Unknown butler type '{butler_type}' for label '{label}'")
|
|
169
175
|
|
|
@@ -177,34 +183,45 @@ class LabeledButlerFactory:
|
|
|
177
183
|
return config_uri
|
|
178
184
|
|
|
179
185
|
|
|
180
|
-
|
|
181
|
-
|
|
186
|
+
class _ButlerFactory(Protocol):
|
|
187
|
+
def create_butler(self, access_token: str | None) -> Butler: ...
|
|
188
|
+
def close(self) -> None: ...
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
class _DirectButlerFactory(_ButlerFactory):
|
|
192
|
+
def __init__(self, config: ButlerConfig, preload_unsafe_caches: bool) -> None:
|
|
193
|
+
import lsst.daf.butler.direct_butler
|
|
182
194
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
195
|
+
# Create a 'template' Butler that will be cloned when callers request
|
|
196
|
+
# an instance.
|
|
197
|
+
self._butler = Butler.from_config(config)
|
|
198
|
+
assert isinstance(self._butler, lsst.daf.butler.direct_butler.DirectButler)
|
|
187
199
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
200
|
+
# Load caches so that data is available in cloned instances without
|
|
201
|
+
# needing to refetch it from the database for every instance.
|
|
202
|
+
self._butler._preload_cache(load_dimension_record_cache=preload_unsafe_caches)
|
|
191
203
|
|
|
192
|
-
def create_butler(access_token: str | None) -> Butler:
|
|
204
|
+
def create_butler(self, access_token: str | None) -> Butler:
|
|
193
205
|
# Access token is ignored because DirectButler does not use Gafaelfawr
|
|
194
206
|
# authentication.
|
|
195
|
-
return
|
|
207
|
+
return self._butler.clone()
|
|
196
208
|
|
|
197
|
-
|
|
209
|
+
def close(self) -> None:
|
|
210
|
+
self._butler.close()
|
|
198
211
|
|
|
199
212
|
|
|
200
|
-
|
|
201
|
-
|
|
213
|
+
class _RemoteButlerFactory(_ButlerFactory):
|
|
214
|
+
def __init__(self, config: ButlerConfig) -> None:
|
|
215
|
+
import lsst.daf.butler.remote_butler._factory
|
|
202
216
|
|
|
203
|
-
|
|
217
|
+
self._factory = lsst.daf.butler.remote_butler._factory.RemoteButlerFactory.create_factory_from_config(
|
|
218
|
+
config
|
|
219
|
+
)
|
|
204
220
|
|
|
205
|
-
def create_butler(access_token: str | None) -> Butler:
|
|
221
|
+
def create_butler(self, access_token: str | None) -> Butler:
|
|
206
222
|
if access_token is None:
|
|
207
223
|
raise ValueError("Access token is required to connect to a Butler server")
|
|
208
|
-
return
|
|
224
|
+
return self._factory.create_butler_for_access_token(access_token)
|
|
209
225
|
|
|
210
|
-
|
|
226
|
+
def close(self) -> None:
|
|
227
|
+
pass
|
|
@@ -30,10 +30,10 @@ from __future__ import annotations
|
|
|
30
30
|
__all__ = ("LimitedButler",)
|
|
31
31
|
|
|
32
32
|
import logging
|
|
33
|
-
from abc import
|
|
33
|
+
from abc import abstractmethod
|
|
34
34
|
from collections.abc import Iterable, Iterator
|
|
35
|
-
from contextlib import contextmanager
|
|
36
|
-
from typing import Any, ClassVar
|
|
35
|
+
from contextlib import AbstractContextManager, contextmanager
|
|
36
|
+
from typing import Any, ClassVar, Literal, Self
|
|
37
37
|
|
|
38
38
|
from lsst.resources import ResourcePath
|
|
39
39
|
|
|
@@ -48,7 +48,7 @@ from .dimensions import DimensionUniverse
|
|
|
48
48
|
log = logging.getLogger(__name__)
|
|
49
49
|
|
|
50
50
|
|
|
51
|
-
class LimitedButler(
|
|
51
|
+
class LimitedButler(AbstractContextManager):
|
|
52
52
|
"""A minimal butler interface that is sufficient to back
|
|
53
53
|
`~lsst.pipe.base.PipelineTask` execution.
|
|
54
54
|
"""
|
|
@@ -100,6 +100,31 @@ class LimitedButler(ABC):
|
|
|
100
100
|
"""
|
|
101
101
|
raise NotImplementedError()
|
|
102
102
|
|
|
103
|
+
def __enter__(self) -> Self:
|
|
104
|
+
return self
|
|
105
|
+
|
|
106
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> Literal[False]:
|
|
107
|
+
try:
|
|
108
|
+
self.close()
|
|
109
|
+
except Exception:
|
|
110
|
+
log.exception("An exception occurred during Butler.close()")
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
def close(self) -> None:
|
|
114
|
+
"""Release all resources associated with this Butler instance. The
|
|
115
|
+
instance may no longer be used after this is called.
|
|
116
|
+
|
|
117
|
+
Notes
|
|
118
|
+
-----
|
|
119
|
+
Instead of calling ``close()`` directly, you can use the Butler object
|
|
120
|
+
as a context manager. For example::
|
|
121
|
+
|
|
122
|
+
with Butler(...) as butler:
|
|
123
|
+
butler.get(...)
|
|
124
|
+
# butler is closed after exiting the block.
|
|
125
|
+
"""
|
|
126
|
+
pass
|
|
127
|
+
|
|
103
128
|
def get(
|
|
104
129
|
self,
|
|
105
130
|
ref: DatasetRef,
|
|
@@ -55,7 +55,7 @@ from .datastore import Datastore
|
|
|
55
55
|
from .datastore.record_data import DatastoreRecordData, SerializedDatastoreRecordData
|
|
56
56
|
from .datastores.file_datastore.retrieve_artifacts import retrieve_and_zip
|
|
57
57
|
from .dimensions import DimensionUniverse
|
|
58
|
-
from .registry.interfaces import DatastoreRegistryBridgeManager, OpaqueTableStorageManager
|
|
58
|
+
from .registry.interfaces import Database, DatastoreRegistryBridgeManager, OpaqueTableStorageManager
|
|
59
59
|
|
|
60
60
|
if TYPE_CHECKING:
|
|
61
61
|
from ._butler import Butler
|
|
@@ -83,6 +83,9 @@ class QuantumBackedButler(LimitedButler):
|
|
|
83
83
|
The registry dataset type definitions, indexed by name.
|
|
84
84
|
metrics : `lsst.daf.butler.ButlerMetrics` or `None`, optional
|
|
85
85
|
Metrics object for tracking butler statistics.
|
|
86
|
+
database : `Database`, optional
|
|
87
|
+
Database instance used by datastore. Not required -- only provided
|
|
88
|
+
to allow database connections to be closed during cleanup.
|
|
86
89
|
|
|
87
90
|
Notes
|
|
88
91
|
-----
|
|
@@ -130,6 +133,7 @@ class QuantumBackedButler(LimitedButler):
|
|
|
130
133
|
storageClasses: StorageClassFactory,
|
|
131
134
|
dataset_types: Mapping[str, DatasetType] | None = None,
|
|
132
135
|
metrics: ButlerMetrics | None = None,
|
|
136
|
+
database: Database | None = None,
|
|
133
137
|
):
|
|
134
138
|
self._dimensions = dimensions
|
|
135
139
|
self._predicted_inputs = set(predicted_inputs)
|
|
@@ -142,6 +146,7 @@ class QuantumBackedButler(LimitedButler):
|
|
|
142
146
|
self.storageClasses = storageClasses
|
|
143
147
|
self._dataset_types: Mapping[str, DatasetType] = {}
|
|
144
148
|
self._metrics = metrics if metrics is not None else ButlerMetrics()
|
|
149
|
+
self._database = database
|
|
145
150
|
if dataset_types is not None:
|
|
146
151
|
self._dataset_types = dataset_types
|
|
147
152
|
self._datastore.set_retrieve_dataset_type_method(self._retrieve_dataset_type)
|
|
@@ -321,7 +326,7 @@ class QuantumBackedButler(LimitedButler):
|
|
|
321
326
|
Metrics object for gathering butler statistics.
|
|
322
327
|
"""
|
|
323
328
|
butler_config = ButlerConfig(config, searchPaths=search_paths)
|
|
324
|
-
datastore,
|
|
329
|
+
datastore, database = instantiate_standalone_datastore(
|
|
325
330
|
butler_config, dimensions, filename, OpaqueManagerClass, BridgeManagerClass
|
|
326
331
|
)
|
|
327
332
|
|
|
@@ -342,8 +347,13 @@ class QuantumBackedButler(LimitedButler):
|
|
|
342
347
|
storageClasses=storageClasses,
|
|
343
348
|
dataset_types=dataset_types,
|
|
344
349
|
metrics=metrics,
|
|
350
|
+
database=database,
|
|
345
351
|
)
|
|
346
352
|
|
|
353
|
+
def close(self) -> None:
|
|
354
|
+
if self._database is not None:
|
|
355
|
+
self._database.dispose()
|
|
356
|
+
|
|
347
357
|
def _retrieve_dataset_type(self, name: str) -> DatasetType | None:
|
|
348
358
|
"""Return DatasetType defined in registry given dataset type name."""
|
|
349
359
|
return self._dataset_types.get(name)
|
|
@@ -76,3 +76,16 @@ class ThreadSafeCache(Generic[TKey, TValue]):
|
|
|
76
76
|
"""
|
|
77
77
|
with self._mutex:
|
|
78
78
|
return self._cache.setdefault(key, value)
|
|
79
|
+
|
|
80
|
+
def clear(self) -> dict[TKey, TValue]:
|
|
81
|
+
"""Clear the cache.
|
|
82
|
+
|
|
83
|
+
Returns
|
|
84
|
+
-------
|
|
85
|
+
old_cache : `dict`
|
|
86
|
+
The values that were contained in the cache prior to clearing it.
|
|
87
|
+
"""
|
|
88
|
+
with self._mutex:
|
|
89
|
+
old = self._cache
|
|
90
|
+
self._cache = {}
|
|
91
|
+
return old
|
|
@@ -33,6 +33,7 @@ from typing import Any
|
|
|
33
33
|
import click
|
|
34
34
|
|
|
35
35
|
from ... import script
|
|
36
|
+
from ..._butler import Butler
|
|
36
37
|
from ..opt import (
|
|
37
38
|
collection_argument,
|
|
38
39
|
collection_type_option,
|
|
@@ -487,9 +488,11 @@ def remove_dataset_type(*args: Any, **kwargs: Any) -> None:
|
|
|
487
488
|
@options_file_option()
|
|
488
489
|
def query_datasets(**kwargs: Any) -> None:
|
|
489
490
|
"""List the datasets in a repository."""
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
table.
|
|
491
|
+
repo = kwargs.pop("repo")
|
|
492
|
+
with Butler.from_config(repo, writeable=False) as butler:
|
|
493
|
+
for table in script.QueryDatasets(butler=butler, **kwargs).getTables():
|
|
494
|
+
print("")
|
|
495
|
+
table.pprint_all()
|
|
493
496
|
print("")
|
|
494
497
|
|
|
495
498
|
|
|
@@ -93,8 +93,9 @@ MultipleCellCoadd: lsst.cell_coadds.CellCoaddFitsFormatter
|
|
|
93
93
|
NNModelPackagePayload: lsst.meas.transiNet.modelPackages.NNModelPackageFormatter
|
|
94
94
|
Timespan: lsst.daf.butler.formatters.json.JsonFormatter
|
|
95
95
|
RegionTimeInfo: lsst.daf.butler.formatters.json.JsonFormatter
|
|
96
|
-
QPEnsemble: lsst.meas.
|
|
97
|
-
PZModel: lsst.meas.
|
|
96
|
+
QPEnsemble: lsst.meas.photoz.base.qp_formatter.QPFormatter
|
|
97
|
+
PZModel: lsst.meas.photoz.base.model_formatter.ModelFormatter
|
|
98
|
+
PhotozModel: lsst.meas.photoz.base.model_formatter.ModelFormatter
|
|
98
99
|
VisitBackgroundModel: lsst.daf.butler.formatters.json.JsonFormatter
|
|
99
100
|
VignettingCorrection: lsst.ts.observatory.control.utils.extras.vignetting_storage.VignettingCorrectionFormatter
|
|
100
101
|
SSPAuxiliaryFile: lsst.pipe.tasks.sspAuxiliaryFile.SSPAuxiliaryFileFormatter
|
|
@@ -12,19 +12,19 @@ lsst.obs.base.formatters.fitsExposure.StandardFitsImageFormatterBase: &StandardF
|
|
|
12
12
|
variance:
|
|
13
13
|
<<: *losslessOptions
|
|
14
14
|
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
image: &
|
|
15
|
+
# Lossy (quantizing) compression with noise sigma subdivided into 16.
|
|
16
|
+
lossy16:
|
|
17
|
+
image: &lossy16Options
|
|
18
18
|
algorithm: RICE_1
|
|
19
19
|
quantization:
|
|
20
20
|
dither: SUBTRACTIVE_DITHER_2
|
|
21
21
|
scaling: STDEV_MASKED
|
|
22
|
-
mask_planes: ["NO_DATA"]
|
|
23
|
-
level:
|
|
22
|
+
mask_planes: ["NO_DATA", "INTRP"]
|
|
23
|
+
level: 16.0
|
|
24
24
|
mask:
|
|
25
25
|
<<: *losslessOptions
|
|
26
26
|
variance:
|
|
27
|
-
<<: *
|
|
27
|
+
<<: *lossy16Options
|
|
28
28
|
|
|
29
29
|
# Set the default
|
|
30
30
|
default:
|
|
@@ -433,6 +433,8 @@ storageClasses:
|
|
|
433
433
|
pytype: qp.Ensemble
|
|
434
434
|
PZModel:
|
|
435
435
|
pytype: rail.core.model.Model
|
|
436
|
+
PhotozModel:
|
|
437
|
+
pytype: rail.core.model.Model
|
|
436
438
|
VisitBackgroundModel:
|
|
437
439
|
pytype: lsst.drp.tasks.fit_visit_background.VisitBackgroundModel
|
|
438
440
|
VignettingCorrection:
|
|
@@ -45,6 +45,7 @@ import uuid
|
|
|
45
45
|
import warnings
|
|
46
46
|
from collections import Counter, defaultdict
|
|
47
47
|
from collections.abc import Collection, Iterable, Iterator, MutableMapping, Sequence
|
|
48
|
+
from functools import partial
|
|
48
49
|
from types import EllipsisType
|
|
49
50
|
from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, TextIO, cast
|
|
50
51
|
|
|
@@ -160,9 +161,9 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
160
161
|
# dependency-inversion trick. This is not used by regular butler,
|
|
161
162
|
# but we do not have a way to distinguish regular butler from execution
|
|
162
163
|
# butler.
|
|
163
|
-
self._datastore.set_retrieve_dataset_type_method(
|
|
164
|
+
self._datastore.set_retrieve_dataset_type_method(partial(_retrieve_dataset_type, registry))
|
|
164
165
|
|
|
165
|
-
self.
|
|
166
|
+
self._closed = False
|
|
166
167
|
|
|
167
168
|
return self
|
|
168
169
|
|
|
@@ -250,6 +251,18 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
250
251
|
metrics=metrics,
|
|
251
252
|
)
|
|
252
253
|
|
|
254
|
+
def close(self) -> None:
|
|
255
|
+
if not self._closed:
|
|
256
|
+
self._closed = True
|
|
257
|
+
self._registry.close()
|
|
258
|
+
# Cause exceptions to be raised if a user attempts to use the
|
|
259
|
+
# instance after closing it. Without this, Butler would still
|
|
260
|
+
# work after being closed because of implementation details
|
|
261
|
+
# of SqlAlchemy, but this may not continue to be the case in the
|
|
262
|
+
# future and we don't want users to get in the habit of doing this.
|
|
263
|
+
self._registry = _BUTLER_CLOSED_INSTANCE
|
|
264
|
+
self._datastore = _BUTLER_CLOSED_INSTANCE
|
|
265
|
+
|
|
253
266
|
GENERATION: ClassVar[int] = 3
|
|
254
267
|
"""This is a Generation 3 Butler.
|
|
255
268
|
|
|
@@ -258,13 +271,6 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
258
271
|
code.
|
|
259
272
|
"""
|
|
260
273
|
|
|
261
|
-
def _retrieve_dataset_type(self, name: str) -> DatasetType | None:
|
|
262
|
-
"""Return DatasetType defined in registry given dataset type name."""
|
|
263
|
-
try:
|
|
264
|
-
return self.get_dataset_type(name)
|
|
265
|
-
except MissingDatasetTypeError:
|
|
266
|
-
return None
|
|
267
|
-
|
|
268
274
|
@classmethod
|
|
269
275
|
def _unpickle(
|
|
270
276
|
cls,
|
|
@@ -2530,7 +2536,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2530
2536
|
are accessible only via `Registry` methods. Eventually these methods
|
|
2531
2537
|
will be replaced by equivalent `Butler` methods.
|
|
2532
2538
|
"""
|
|
2533
|
-
return self
|
|
2539
|
+
return RegistryShim(self)
|
|
2534
2540
|
|
|
2535
2541
|
@property
|
|
2536
2542
|
def dimensions(self) -> DimensionUniverse:
|
|
@@ -2574,22 +2580,14 @@ class DirectButler(Butler): # numpydoc ignore=PR02
|
|
|
2574
2580
|
accessible only via `SqlRegistry` methods.
|
|
2575
2581
|
"""
|
|
2576
2582
|
|
|
2577
|
-
datastore: Datastore
|
|
2578
|
-
"""The object that manages actual dataset storage (`Datastore`).
|
|
2579
|
-
|
|
2580
|
-
Direct user access to the datastore should rarely be necessary; the primary
|
|
2581
|
-
exception is the case where a `Datastore` implementation provides extra
|
|
2582
|
-
functionality beyond what the base class defines.
|
|
2583
|
-
"""
|
|
2584
|
-
|
|
2585
2583
|
storageClasses: StorageClassFactory
|
|
2586
2584
|
"""An object that maps known storage class names to objects that fully
|
|
2587
2585
|
describe them (`StorageClassFactory`).
|
|
2588
2586
|
"""
|
|
2589
2587
|
|
|
2590
|
-
|
|
2591
|
-
"""
|
|
2592
|
-
|
|
2588
|
+
_closed: bool
|
|
2589
|
+
"""`True` if close() has already been called on this instance; `False`
|
|
2590
|
+
otherwise.
|
|
2593
2591
|
"""
|
|
2594
2592
|
|
|
2595
2593
|
|
|
@@ -2614,3 +2612,19 @@ def _to_uuid(id: DatasetId | str) -> uuid.UUID:
|
|
|
2614
2612
|
return id
|
|
2615
2613
|
else:
|
|
2616
2614
|
return uuid.UUID(id)
|
|
2615
|
+
|
|
2616
|
+
|
|
2617
|
+
class _ButlerClosed:
|
|
2618
|
+
def __getattr__(self, name: str) -> Any:
|
|
2619
|
+
raise RuntimeError("Attempted to use a Butler instance which has been closed.")
|
|
2620
|
+
|
|
2621
|
+
|
|
2622
|
+
_BUTLER_CLOSED_INSTANCE: Any = _ButlerClosed()
|
|
2623
|
+
|
|
2624
|
+
|
|
2625
|
+
def _retrieve_dataset_type(registry: SqlRegistry, name: str) -> DatasetType | None:
|
|
2626
|
+
"""Return DatasetType defined in registry given dataset type name."""
|
|
2627
|
+
try:
|
|
2628
|
+
return registry.getDatasetType(name)
|
|
2629
|
+
except MissingDatasetTypeError:
|
|
2630
|
+
return None
|
|
@@ -49,13 +49,14 @@ __all__ = (
|
|
|
49
49
|
)
|
|
50
50
|
|
|
51
51
|
import collections.abc
|
|
52
|
+
import contextlib
|
|
52
53
|
import itertools
|
|
53
54
|
import json
|
|
54
55
|
import logging
|
|
55
56
|
import re
|
|
56
|
-
from collections.abc import Iterable, Sequence
|
|
57
|
+
from collections.abc import Generator, Iterable, Sequence
|
|
57
58
|
from fnmatch import fnmatchcase
|
|
58
|
-
from typing import TYPE_CHECKING, Any, cast
|
|
59
|
+
from typing import IO, TYPE_CHECKING, Any, cast
|
|
59
60
|
|
|
60
61
|
import pyarrow as pa
|
|
61
62
|
import pyarrow.parquet as pq
|
|
@@ -84,6 +85,16 @@ TARGET_ROW_GROUP_BYTES = 1_000_000_000
|
|
|
84
85
|
ASTROPY_PANDAS_INDEX_KEY = "lsst::arrow::astropy_pandas_index"
|
|
85
86
|
|
|
86
87
|
|
|
88
|
+
@contextlib.contextmanager
|
|
89
|
+
def generic_open(path: str, fs: AbstractFileSystem | None) -> Generator[IO]:
|
|
90
|
+
if fs is None:
|
|
91
|
+
with open(path, "rb") as fh:
|
|
92
|
+
yield fh
|
|
93
|
+
else:
|
|
94
|
+
with fs.open(path) as fh:
|
|
95
|
+
yield fh
|
|
96
|
+
|
|
97
|
+
|
|
87
98
|
class ParquetFormatter(FormatterV2):
|
|
88
99
|
"""Interface for reading and writing Arrow Table objects to and from
|
|
89
100
|
Parquet files.
|
|
@@ -120,7 +131,8 @@ class ParquetFormatter(FormatterV2):
|
|
|
120
131
|
component: str | None = None,
|
|
121
132
|
expected_size: int = -1,
|
|
122
133
|
) -> Any:
|
|
123
|
-
|
|
134
|
+
with generic_open(path, fs) as handle:
|
|
135
|
+
schema = pq.read_schema(handle)
|
|
124
136
|
|
|
125
137
|
schema_names = ["ArrowSchema", "DataFrameSchema", "ArrowAstropySchema", "ArrowNumpySchema"]
|
|
126
138
|
|
|
@@ -133,13 +145,13 @@ class ParquetFormatter(FormatterV2):
|
|
|
133
145
|
if b"lsst::arrow::rowcount" in schema.metadata:
|
|
134
146
|
return int(schema.metadata[b"lsst::arrow::rowcount"])
|
|
135
147
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
148
|
+
with generic_open(path, fs) as handle:
|
|
149
|
+
temp_table = pq.read_table(
|
|
150
|
+
handle,
|
|
151
|
+
columns=[schema.names[0]],
|
|
152
|
+
use_threads=False,
|
|
153
|
+
use_pandas_metadata=False,
|
|
154
|
+
)
|
|
143
155
|
|
|
144
156
|
return len(temp_table[schema.names[0]])
|
|
145
157
|
|
|
@@ -148,7 +160,7 @@ class ParquetFormatter(FormatterV2):
|
|
|
148
160
|
par_columns = self.file_descriptor.parameters.pop("columns", None)
|
|
149
161
|
if par_columns:
|
|
150
162
|
has_pandas_multi_index = False
|
|
151
|
-
if b"pandas" in schema.metadata:
|
|
163
|
+
if schema.metadata and b"pandas" in schema.metadata:
|
|
152
164
|
md = json.loads(schema.metadata[b"pandas"])
|
|
153
165
|
if len(md["column_indexes"]) > 1:
|
|
154
166
|
has_pandas_multi_index = True
|
|
@@ -184,13 +196,13 @@ class ParquetFormatter(FormatterV2):
|
|
|
184
196
|
)
|
|
185
197
|
|
|
186
198
|
metadata = schema.metadata if schema.metadata is not None else {}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
199
|
+
with generic_open(path, fs) as handle:
|
|
200
|
+
arrow_table = pq.read_table(
|
|
201
|
+
handle,
|
|
202
|
+
columns=par_columns,
|
|
203
|
+
use_threads=False,
|
|
204
|
+
use_pandas_metadata=(b"pandas" in metadata),
|
|
205
|
+
)
|
|
194
206
|
|
|
195
207
|
return arrow_table
|
|
196
208
|
|
{lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/logging.py
RENAMED
|
@@ -537,6 +537,9 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
|
|
|
537
537
|
if cls._generic_startswith(startdata, "["):
|
|
538
538
|
# This is a JSON array of records.
|
|
539
539
|
return _ButlerLogRecordsModelV1
|
|
540
|
+
elif cls._generic_startswith(startdata, cls.STREAMING_EXTRA_DELIMITER):
|
|
541
|
+
# This is an empty log file with a log record per line format.
|
|
542
|
+
return None
|
|
540
543
|
elif not cls._generic_startswith(startdata, "{"):
|
|
541
544
|
# Limit the length of string reported in error message in case
|
|
542
545
|
# this is an enormous file.
|
|
@@ -570,9 +573,12 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
|
|
|
570
573
|
"""
|
|
571
574
|
first_line = stream.readline()
|
|
572
575
|
|
|
576
|
+
empty_stream = False
|
|
573
577
|
if not first_line:
|
|
574
578
|
# Empty file, return zero records.
|
|
575
579
|
return cls.from_records([])
|
|
580
|
+
elif cls._generic_startswith(first_line, cls.STREAMING_EXTRA_DELIMITER):
|
|
581
|
+
empty_stream = True
|
|
576
582
|
|
|
577
583
|
model_type = cls._detect_model(first_line)
|
|
578
584
|
|
|
@@ -583,13 +589,17 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
|
|
|
583
589
|
return model_type.model_validate_json(all).wrap(cls)
|
|
584
590
|
|
|
585
591
|
# A stream of records with one record per line.
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
line
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
592
|
+
if not empty_stream:
|
|
593
|
+
records = [ButlerLogRecord.model_validate_json(first_line)]
|
|
594
|
+
for line in stream:
|
|
595
|
+
line = line.rstrip()
|
|
596
|
+
if cls._generic_startswith(line, cls.STREAMING_EXTRA_DELIMITER):
|
|
597
|
+
break
|
|
598
|
+
elif line: # skip blank lines
|
|
599
|
+
records.append(ButlerLogRecord.model_validate_json(line))
|
|
600
|
+
else:
|
|
601
|
+
# No records but might have extra metadata.
|
|
602
|
+
records = []
|
|
593
603
|
extra_data = stream.read()
|
|
594
604
|
if extra_data:
|
|
595
605
|
extra = pydantic_core.from_json(extra_data)
|