lsst-daf-butler 29.0.1rc1__tar.gz → 29.1.0rc2__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.0.1rc1/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.1.0rc2}/PKG-INFO +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/CHANGES.rst +16 -16
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/queries.rst +28 -8
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/pyproject.toml +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/__init__.py +1 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_butler.py +57 -10
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_butler_collections.py +4 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_butler_instance_options.py +3 -0
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/_butler_metrics.py +117 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_config.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_dataset_ref.py +99 -16
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_file_dataset.py +78 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_limited_butler.py +34 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_quantum_backed.py +23 -4
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/arrow_utils.py +7 -9
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/butler.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +2 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/cmd/commands.py +25 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/utils.py +32 -4
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/column_spec.py +77 -34
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/_datastore.py +30 -4
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/generic_base.py +2 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/chainedDatastore.py +63 -92
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/fileDatastore.py +371 -97
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +33 -5
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_coordinate.py +4 -15
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_group.py +15 -5
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/dimensions/_record_set.py +950 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_record_table.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_records.py +127 -6
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_universe.py +12 -8
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/record_cache.py +1 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_butler/_direct_butler.py +406 -225
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_driver.py +30 -11
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +74 -17
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +28 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/pydantic_utils.py +26 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_expression_strings.py +24 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_identifiers.py +4 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_query.py +48 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/expression_factory.py +16 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/overlaps.py +1 -1
- lsst_daf_butler-29.0.1rc1/python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py → lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/queries/predicate_constraints_summary.py +2 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_column_expression.py +39 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_column_set.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_predicate.py +19 -9
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/bridge/ephemeral.py +16 -6
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/bridge/monolithic.py +78 -37
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/collections/_base.py +23 -6
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/connectionString.py +5 -10
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/databases/postgresql.py +50 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/databases/sqlite.py +46 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +77 -64
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +4 -4
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/dimensions/static.py +20 -8
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_bridge.py +13 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_database.py +21 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_datasets.py +4 -16
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +7 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +35 -19
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/check.py +29 -10
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +15 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +136 -23
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +10 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +47 -24
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +49 -10
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/sql_registry.py +17 -45
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/tests/_registry.py +60 -32
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_http_connection.py +15 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_query_driver.py +5 -7
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_registry.py +3 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_remote_butler.py +50 -27
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/remote_butler/server/_config.py +109 -0
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/remote_butler/server/_dependencies.py +124 -0
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +125 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/_server.py +11 -4
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/remote_butler/server/_telemetry.py +105 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +10 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +5 -7
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +7 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/ingest_zip.py +13 -1
- lsst_daf_butler-29.1.0rc2/python/lsst/daf/butler/script/queryCollections.py +378 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/removeRuns.py +2 -5
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/retrieveArtifacts.py +1 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/transferDatasets.py +5 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/butler_queries.py +236 -23
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/cliCmdTestBase.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/hybrid_butler.py +37 -8
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +15 -2
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/server.py +28 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/version.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst_daf_butler.egg-info/SOURCES.txt +6 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_butler.py +197 -31
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdQueryCollections.py +124 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliPluginLoader.py +1 -1
- lsst_daf_butler-29.1.0rc2/tests/test_column_spec.py +95 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_config.py +3 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_connectionString.py +4 -13
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_datasets.py +45 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_datastore.py +37 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_dimension_record_containers.py +121 -6
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_dimensions.py +10 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_exprParserLex.py +23 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_exprParserYacc.py +137 -10
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_expressions.py +12 -5
- lsst_daf_butler-29.1.0rc2/tests/test_gafaelfawr.py +104 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_normalFormExpression.py +21 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_pydantic_utils.py +22 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_quantumBackedButler.py +18 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_query_interface.py +39 -3
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_query_utilities.py +1 -1
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_remote_butler.py +5 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_server.py +41 -6
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_simpleButler.py +19 -1
- lsst_daf_butler-29.0.1rc1/python/lsst/daf/butler/dimensions/_record_set.py +0 -485
- lsst_daf_butler-29.0.1rc1/python/lsst/daf/butler/remote_butler/server/_config.py +0 -54
- lsst_daf_butler-29.0.1rc1/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -59
- lsst_daf_butler-29.0.1rc1/python/lsst/daf/butler/script/queryCollections.py +0 -222
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/LICENSE +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/README.md +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/setup.cfg +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.0.1rc1 → lsst_daf_butler-29.1.0rc2}/tests/test_versioning.py +0 -0
{lsst_daf_butler-29.0.1rc1/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.1.0rc2}/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 29.
|
|
3
|
+
Version: 29.1.0rc2
|
|
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
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
Butler v29.0.0 2025-03-25
|
|
2
|
-
|
|
1
|
+
Butler v29.0.0 (2025-03-25)
|
|
2
|
+
===========================
|
|
3
3
|
|
|
4
4
|
New Features
|
|
5
5
|
------------
|
|
@@ -66,8 +66,8 @@ Other Changes and Additions
|
|
|
66
66
|
This is important for butler repositories containing data from multiple instruments and facilities. (`DM-46914 <https://rubinobs.atlassian.net/browse/DM-46914>`_)
|
|
67
67
|
|
|
68
68
|
|
|
69
|
-
Butler v28.0.0 2024-11-20
|
|
70
|
-
|
|
69
|
+
Butler v28.0.0 (2024-11-20)
|
|
70
|
+
===========================
|
|
71
71
|
|
|
72
72
|
New Features
|
|
73
73
|
------------
|
|
@@ -203,8 +203,8 @@ An API Removal or Deprecation
|
|
|
203
203
|
Using ``Butler.collections`` to get the list of default collections is now deprecated. Use ``Butler.collections.defaults`` instead. (`DM-46599 <https://rubinobs.atlassian.net/browse/DM-46599>`_)
|
|
204
204
|
|
|
205
205
|
|
|
206
|
-
Butler 27.0.0 2024-05-28
|
|
207
|
-
|
|
206
|
+
Butler 27.0.0 (2024-05-28)
|
|
207
|
+
==========================
|
|
208
208
|
|
|
209
209
|
Now supports Python 3.12.
|
|
210
210
|
|
|
@@ -364,8 +364,8 @@ An API Removal or Deprecation
|
|
|
364
364
|
* Removed the ``reconsitutedDimension`` parameter from ``Quantum.from_simple``. (`DM-40150 <https://rubinobs.atlassian.net/browse/DM-40150>`_)
|
|
365
365
|
|
|
366
366
|
|
|
367
|
-
Butler v26.0.0 2023-09-22
|
|
368
|
-
|
|
367
|
+
Butler v26.0.0 (2023-09-22)
|
|
368
|
+
===========================
|
|
369
369
|
|
|
370
370
|
Now supports Python 3.11.
|
|
371
371
|
|
|
@@ -543,8 +543,8 @@ An API Removal or Deprecation
|
|
|
543
543
|
- ``lsst.daf.butler.registry.DbAuth`` class has been moved to the ``lsst-utils`` package and can be imported from the ``lsst.utils.db_auth`` module. (`DM-40462 <https://rubinobs.atlassian.net/browse/DM-40462>`_)
|
|
544
544
|
|
|
545
545
|
|
|
546
|
-
Butler v25.0.0 2023-02-27
|
|
547
|
-
|
|
546
|
+
Butler v25.0.0 (2023-02-27)
|
|
547
|
+
===========================
|
|
548
548
|
|
|
549
549
|
This is the last release that can access data repositories using integer dataset IDs.
|
|
550
550
|
Please either recreate these repositories or convert them to use UUIDs using `the butler migrate tooling <https://github.com/lsst-dm/daf_butler_migrate>`_.
|
|
@@ -638,8 +638,8 @@ An API Removal or Deprecation
|
|
|
638
638
|
- Removed deprecated filterLabel exposure component access. (`DM-27811 <https://rubinobs.atlassian.net/browse/DM-27811>`_)
|
|
639
639
|
|
|
640
640
|
|
|
641
|
-
Butler v24.0.0 2022-08-26
|
|
642
|
-
|
|
641
|
+
Butler v24.0.0 (2022-08-26)
|
|
642
|
+
===========================
|
|
643
643
|
|
|
644
644
|
New Features
|
|
645
645
|
------------
|
|
@@ -763,8 +763,8 @@ An API Removal or Deprecation
|
|
|
763
763
|
It functions identically to the ``filterLabel`` component, which has been deprecated. (`DM-27177 <https://rubinobs.atlassian.net/browse/DM-27177>`_)
|
|
764
764
|
|
|
765
765
|
|
|
766
|
-
Butler v23.0.0 2021-12-10
|
|
767
|
-
|
|
766
|
+
Butler v23.0.0 (2021-12-10)
|
|
767
|
+
===========================
|
|
768
768
|
|
|
769
769
|
New Features
|
|
770
770
|
------------
|
|
@@ -865,8 +865,8 @@ Other Changes and Additions
|
|
|
865
865
|
- Add ``split`` transfer mode that can be used when some files are inside the datastore and some files are outside the datastore.
|
|
866
866
|
This is equivalent to using `None` and ``direct`` mode dynamically. (`DM-31251 <https://rubinobs.atlassian.net/browse/DM-31251>`_)
|
|
867
867
|
|
|
868
|
-
Butler v22.0 2021-04-01
|
|
869
|
-
|
|
868
|
+
Butler v22.0 (2021-04-01)
|
|
869
|
+
=========================
|
|
870
870
|
|
|
871
871
|
New Features
|
|
872
872
|
------------
|
|
@@ -136,6 +136,16 @@ Time literals
|
|
|
136
136
|
time scale. For detailed description of supported time specification
|
|
137
137
|
check section :ref:`time-literals-syntax`.
|
|
138
138
|
|
|
139
|
+
UUID literals
|
|
140
|
+
UUID values are produced by ``UUID()`` function which accepts a string
|
|
141
|
+
representation of the UUID. The string can have any format acceptable
|
|
142
|
+
by Python ``uuid.UUID()`` method.
|
|
143
|
+
|
|
144
|
+
Examples:
|
|
145
|
+
|
|
146
|
+
- ``UUID('12345678-1234-5678-1234-567812345678')``
|
|
147
|
+
- ``UUID('12345678123456781234567812345678')``
|
|
148
|
+
|
|
139
149
|
Range literals
|
|
140
150
|
This sort of literal is allowed inside ``IN`` expressions only. It consists
|
|
141
151
|
of two integer literals separated by double dots and optionally followed by
|
|
@@ -167,6 +177,8 @@ filter query results based on that property of datasets.
|
|
|
167
177
|
|
|
168
178
|
Registry methods accepting user expressions also accept a ``bind`` parameter, which is a mapping from identifier name to its corresponding value.
|
|
169
179
|
Identifiers appearing in user expressions will be replaced with the corresponding value from this mapping.
|
|
180
|
+
Bind identifiers in expressions are specified with a preceding colon (e.g. ``:id``).
|
|
181
|
+
The legacy format where bind identifiers can be specified without a colon is still supported, but discouraged, and will be deprecated and removed in the future.
|
|
170
182
|
Using the ``bind`` parameter is encouraged when possible to simplify rendering of the query strings.
|
|
171
183
|
A partial example of comparing two approaches, without and with ``bind``:
|
|
172
184
|
|
|
@@ -186,7 +198,7 @@ A partial example of comparing two approaches, without and with ``bind``:
|
|
|
186
198
|
# Same functionality using bind parameter
|
|
187
199
|
result = butler.query_datasets(
|
|
188
200
|
dataset_type,
|
|
189
|
-
where="instrument = instrument_name AND visit = visit_id",
|
|
201
|
+
where="instrument = :instrument_name AND visit = :visit_id",
|
|
190
202
|
bind={"instrument_name": instrument_name, "visit_id": visit_id},
|
|
191
203
|
)
|
|
192
204
|
|
|
@@ -201,7 +213,7 @@ An example of this feature:
|
|
|
201
213
|
visit_ids = (12345, 12346, 12350)
|
|
202
214
|
result = butler.query_datasets(
|
|
203
215
|
dataset_type,
|
|
204
|
-
where="instrument = instrument_name AND visit IN (visit_ids)",
|
|
216
|
+
where="instrument = :instrument_name AND visit IN (:visit_ids)",
|
|
205
217
|
bind={"instrument_name": instrument_name, "visit_ids": visit_ids},
|
|
206
218
|
)
|
|
207
219
|
|
|
@@ -227,7 +239,7 @@ Comparison operators
|
|
|
227
239
|
|
|
228
240
|
Language supports set of regular comparison operators: ``=``, ``!=``, ``<``,
|
|
229
241
|
``<=``, ``>``, ``>=``. This can be used on operands that evaluate to a numeric
|
|
230
|
-
values or
|
|
242
|
+
values, timestamps, or strings.
|
|
231
243
|
|
|
232
244
|
.. note :: The equality comparison operator is a single ``=`` like in SQL, not
|
|
233
245
|
double ``==`` like in Python or C++.
|
|
@@ -270,7 +282,7 @@ as are these:
|
|
|
270
282
|
|
|
271
283
|
Another usage of ``IN`` operator is for checking whether a timestamp or a time
|
|
272
284
|
range is contained wholly in other time range. Time range in this case can be
|
|
273
|
-
specified as a tuple of two time literals or
|
|
285
|
+
specified as a tuple of two time literals or identifiers each representing a
|
|
274
286
|
timestamp, or as a single identifier representing a time range. In case a
|
|
275
287
|
single identifier appears on the right side of ``IN`` it has to be enclosed
|
|
276
288
|
in parentheses.
|
|
@@ -350,11 +362,17 @@ Function call
|
|
|
350
362
|
Function call syntax is similar to other languages, expression for call
|
|
351
363
|
consists of an identifier followed by zero or more comma-separated arguments
|
|
352
364
|
enclosed in parentheses (e.g. ``func(1, 2, 3)``). An argument to a function
|
|
353
|
-
can be any expression.
|
|
365
|
+
can be any expression. Names of the functions are not case-sensitive.
|
|
366
|
+
|
|
367
|
+
Presently the following functions are implemented in the query language:
|
|
354
368
|
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
369
|
+
- ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
|
|
370
|
+
similarly to ADQL syntax.
|
|
371
|
+
- ``GLOB(expression, pattern)`` - performs case-sensitive match of a string
|
|
372
|
+
``expression`` against ``pattern``. Pattern can include ``*`` and ``?``
|
|
373
|
+
meta-characters, matching any number of characters or a single character
|
|
374
|
+
respectfully. All other characters in pattern are matched literally, and
|
|
375
|
+
whole expression string has to match for ``GLOB()`` to return ``True``.
|
|
358
376
|
|
|
359
377
|
|
|
360
378
|
.. _time-literals-syntax:
|
|
@@ -434,6 +452,8 @@ Few examples of valid expressions using some of the constructs:
|
|
|
434
452
|
|
|
435
453
|
ingest_date < T'2020-11-06 21:10:00'
|
|
436
454
|
|
|
455
|
+
flat.dataset_id = UUID('e15ab039-bc8b-4135-87c5-90902a7c0b22')
|
|
456
|
+
|
|
437
457
|
|
|
438
458
|
.. _daf_butler_query_ordering:
|
|
439
459
|
|
|
@@ -91,7 +91,7 @@ butler = "lsst.daf.butler.cli.butler:main"
|
|
|
91
91
|
package_dir = "python"
|
|
92
92
|
filename = "doc/lsst.daf.butler/CHANGES.rst"
|
|
93
93
|
directory = "doc/changes"
|
|
94
|
-
title_format = "Butler {version} {project_date}"
|
|
94
|
+
title_format = "Butler {version} ({project_date})"
|
|
95
95
|
issue_format = "`{issue} <https://rubinobs.atlassian.net/browse/{issue}>`_"
|
|
96
96
|
|
|
97
97
|
[[tool.towncrier.type]]
|
|
@@ -38,6 +38,7 @@ from . import ddl, time_utils
|
|
|
38
38
|
from ._butler import *
|
|
39
39
|
from ._butler_collections import *
|
|
40
40
|
from ._butler_config import *
|
|
41
|
+
from ._butler_metrics import *
|
|
41
42
|
from ._butler_repo_index import *
|
|
42
43
|
from ._collection_type import CollectionType
|
|
43
44
|
from ._column_categorization import *
|
|
@@ -46,6 +46,7 @@ from lsst.utils.logging import getLogger
|
|
|
46
46
|
from ._butler_collections import ButlerCollections
|
|
47
47
|
from ._butler_config import ButlerConfig, ButlerType
|
|
48
48
|
from ._butler_instance_options import ButlerInstanceOptions
|
|
49
|
+
from ._butler_metrics import ButlerMetrics
|
|
49
50
|
from ._butler_repo_index import ButlerRepoIndex
|
|
50
51
|
from ._config import Config, ConfigSubset
|
|
51
52
|
from ._exceptions import EmptyQueryResultError, InvalidQueryError
|
|
@@ -89,6 +90,10 @@ class SpecificButlerDataset:
|
|
|
89
90
|
dataset: DatasetRef | None
|
|
90
91
|
|
|
91
92
|
|
|
93
|
+
class _DeprecatedDefault:
|
|
94
|
+
"""Default value for a deprecated parameter."""
|
|
95
|
+
|
|
96
|
+
|
|
92
97
|
class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
93
98
|
"""Interface for data butler and factory for Butler instances.
|
|
94
99
|
|
|
@@ -154,6 +159,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
154
159
|
writeable: bool | None = None,
|
|
155
160
|
inferDefaults: bool = True,
|
|
156
161
|
without_datastore: bool = False,
|
|
162
|
+
metrics: ButlerMetrics | None = None,
|
|
157
163
|
**kwargs: Any,
|
|
158
164
|
) -> Butler:
|
|
159
165
|
if cls is Butler:
|
|
@@ -165,6 +171,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
165
171
|
writeable=writeable,
|
|
166
172
|
inferDefaults=inferDefaults,
|
|
167
173
|
without_datastore=without_datastore,
|
|
174
|
+
metrics=metrics,
|
|
168
175
|
**kwargs,
|
|
169
176
|
)
|
|
170
177
|
|
|
@@ -183,6 +190,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
183
190
|
writeable: bool | None = None,
|
|
184
191
|
inferDefaults: bool = True,
|
|
185
192
|
without_datastore: bool = False,
|
|
193
|
+
metrics: ButlerMetrics | None = None,
|
|
186
194
|
**kwargs: Any,
|
|
187
195
|
) -> Butler:
|
|
188
196
|
"""Create butler instance from configuration.
|
|
@@ -230,6 +238,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
230
238
|
without_datastore : `bool`, optional
|
|
231
239
|
If `True` do not attach a datastore to this butler. Any attempts
|
|
232
240
|
to use a datastore will fail.
|
|
241
|
+
metrics : `ButlerMetrics` or `None`, optional
|
|
242
|
+
Metrics object to record butler usage statistics.
|
|
233
243
|
**kwargs : `Any`
|
|
234
244
|
Default data ID key-value pairs. These may only identify
|
|
235
245
|
"governor" dimensions like ``instrument`` and ``skymap``.
|
|
@@ -300,6 +310,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
300
310
|
# passing the "butler" parameter to its constructor. This has
|
|
301
311
|
# been moved out of the constructor into Butler.clone().
|
|
302
312
|
butler = kwargs.pop("butler", None)
|
|
313
|
+
metrics = metrics if metrics is not None else ButlerMetrics()
|
|
303
314
|
if butler is not None:
|
|
304
315
|
if not isinstance(butler, Butler):
|
|
305
316
|
raise TypeError("'butler' parameter must be a Butler instance")
|
|
@@ -307,10 +318,17 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
307
318
|
raise TypeError(
|
|
308
319
|
"Cannot pass 'config', 'searchPaths', or 'writeable' arguments with 'butler' argument."
|
|
309
320
|
)
|
|
310
|
-
return butler.clone(
|
|
321
|
+
return butler.clone(
|
|
322
|
+
collections=collections, run=run, inferDefaults=inferDefaults, metrics=metrics, dataId=kwargs
|
|
323
|
+
)
|
|
311
324
|
|
|
312
325
|
options = ButlerInstanceOptions(
|
|
313
|
-
collections=collections,
|
|
326
|
+
collections=collections,
|
|
327
|
+
run=run,
|
|
328
|
+
writeable=writeable,
|
|
329
|
+
inferDefaults=inferDefaults,
|
|
330
|
+
metrics=metrics,
|
|
331
|
+
kwargs=kwargs,
|
|
314
332
|
)
|
|
315
333
|
|
|
316
334
|
# Load the Butler configuration. This may involve searching the
|
|
@@ -1274,7 +1292,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1274
1292
|
raise NotImplementedError()
|
|
1275
1293
|
|
|
1276
1294
|
@abstractmethod
|
|
1277
|
-
def removeRuns(
|
|
1295
|
+
def removeRuns(
|
|
1296
|
+
self,
|
|
1297
|
+
names: Iterable[str],
|
|
1298
|
+
unstore: bool | type[_DeprecatedDefault] = _DeprecatedDefault,
|
|
1299
|
+
*,
|
|
1300
|
+
unlink_from_chains: bool = False,
|
|
1301
|
+
) -> None:
|
|
1278
1302
|
"""Remove one or more `~CollectionType.RUN` collections and the
|
|
1279
1303
|
datasets within them.
|
|
1280
1304
|
|
|
@@ -1287,7 +1311,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1287
1311
|
they are present, and attempt to rollback the registry deletions if
|
|
1288
1312
|
datastore deletions fail (which may not always be possible). If
|
|
1289
1313
|
`False`, datastore records for these datasets are still removed,
|
|
1290
|
-
but any artifacts (e.g. files) will not be.
|
|
1314
|
+
but any artifacts (e.g. files) will not be. This parameter is now
|
|
1315
|
+
deprecated and no longer has any effect. Files are always deleted
|
|
1316
|
+
from datastores unless they were ingested using full URIs.
|
|
1317
|
+
unlink_from_chains : `bool`, optional
|
|
1318
|
+
If `True` remove the RUN collection from any chains prior to
|
|
1319
|
+
removing the RUN. If `False` the removal will fail if any chains
|
|
1320
|
+
still refer to the RUN.
|
|
1291
1321
|
|
|
1292
1322
|
Raises
|
|
1293
1323
|
------
|
|
@@ -1360,7 +1390,14 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1360
1390
|
raise NotImplementedError()
|
|
1361
1391
|
|
|
1362
1392
|
@abstractmethod
|
|
1363
|
-
def ingest_zip(
|
|
1393
|
+
def ingest_zip(
|
|
1394
|
+
self,
|
|
1395
|
+
zip_file: ResourcePathExpression,
|
|
1396
|
+
transfer: str = "auto",
|
|
1397
|
+
*,
|
|
1398
|
+
transfer_dimensions: bool = False,
|
|
1399
|
+
dry_run: bool = False,
|
|
1400
|
+
) -> None:
|
|
1364
1401
|
"""Ingest a Zip file into this butler.
|
|
1365
1402
|
|
|
1366
1403
|
The Zip file must have been created by `retrieve_artifacts_zip`.
|
|
@@ -1371,10 +1408,17 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1371
1408
|
Path to the Zip file.
|
|
1372
1409
|
transfer : `str`, optional
|
|
1373
1410
|
Method to use to transfer the Zip into the datastore.
|
|
1411
|
+
transfer_dimensions : `bool`, optional
|
|
1412
|
+
If `True`, dimension record data associated with the new datasets
|
|
1413
|
+
will be transferred from the Zip file, if present.
|
|
1414
|
+
dry_run : `bool`, optional
|
|
1415
|
+
If `True` the ingest will be processed without any modifications
|
|
1416
|
+
made to the target butler and as if the target butler did not
|
|
1417
|
+
have any of the datasets.
|
|
1374
1418
|
|
|
1375
1419
|
Notes
|
|
1376
1420
|
-----
|
|
1377
|
-
Run collections are created as needed.
|
|
1421
|
+
Run collections and dataset types are created as needed.
|
|
1378
1422
|
"""
|
|
1379
1423
|
raise NotImplementedError()
|
|
1380
1424
|
|
|
@@ -1741,8 +1785,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1741
1785
|
warn_limit = True
|
|
1742
1786
|
with self.query() as query:
|
|
1743
1787
|
result = (
|
|
1744
|
-
query.
|
|
1745
|
-
.
|
|
1788
|
+
query.data_ids(dimensions)
|
|
1789
|
+
.where(data_id, where, bind=bind, **kwargs)
|
|
1746
1790
|
.order_by(*ensure_iterable(order_by))
|
|
1747
1791
|
.limit(query_limit)
|
|
1748
1792
|
)
|
|
@@ -1979,8 +2023,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
1979
2023
|
warn_limit = True
|
|
1980
2024
|
with self.query() as query:
|
|
1981
2025
|
result = (
|
|
1982
|
-
query.
|
|
1983
|
-
.
|
|
2026
|
+
query.dimension_records(element)
|
|
2027
|
+
.where(data_id, where, bind=bind, **kwargs)
|
|
1984
2028
|
.order_by(*ensure_iterable(order_by))
|
|
1985
2029
|
.limit(query_limit)
|
|
1986
2030
|
)
|
|
@@ -2123,6 +2167,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
2123
2167
|
run: str | None | EllipsisType = ...,
|
|
2124
2168
|
inferDefaults: bool | EllipsisType = ...,
|
|
2125
2169
|
dataId: dict[str, str] | EllipsisType = ...,
|
|
2170
|
+
metrics: ButlerMetrics | None = None,
|
|
2126
2171
|
) -> Butler:
|
|
2127
2172
|
"""Return a new Butler instance connected to the same repository
|
|
2128
2173
|
as this one, optionally overriding ``collections``, ``run``,
|
|
@@ -2142,5 +2187,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
|
|
|
2142
2187
|
dataId : `str`
|
|
2143
2188
|
Same as ``kwargs`` passed to the constructor. If omitted, copies
|
|
2144
2189
|
values from original object.
|
|
2190
|
+
metrics : `ButlerMetrics` or `None`, optional
|
|
2191
|
+
Metrics object to record butler statistics.
|
|
2145
2192
|
"""
|
|
2146
2193
|
raise NotImplementedError()
|
|
@@ -108,6 +108,10 @@ class ButlerCollections(ABC, Sequence):
|
|
|
108
108
|
"""Collection defaults associated with this butler."""
|
|
109
109
|
raise NotImplementedError("Defaults must be implemented by a subclass")
|
|
110
110
|
|
|
111
|
+
def __str__(self) -> str:
|
|
112
|
+
"""Return string representation."""
|
|
113
|
+
return f"{self.__class__.__name__}(defaults={self.defaults})"
|
|
114
|
+
|
|
111
115
|
@abstractmethod
|
|
112
116
|
def extend_chain(self, parent_collection_name: str, child_collection_names: str | Iterable[str]) -> None:
|
|
113
117
|
"""Add children to the end of a CHAINED collection.
|
|
@@ -30,6 +30,8 @@ __all__ = ("ButlerInstanceOptions",)
|
|
|
30
30
|
import dataclasses
|
|
31
31
|
from typing import Any
|
|
32
32
|
|
|
33
|
+
from ._butler_metrics import ButlerMetrics
|
|
34
|
+
|
|
33
35
|
|
|
34
36
|
@dataclasses.dataclass(frozen=True)
|
|
35
37
|
class ButlerInstanceOptions:
|
|
@@ -43,4 +45,5 @@ class ButlerInstanceOptions:
|
|
|
43
45
|
run: str | None = None
|
|
44
46
|
writeable: bool | None = None
|
|
45
47
|
inferDefaults: bool = True
|
|
48
|
+
metrics: ButlerMetrics = dataclasses.field(default_factory=ButlerMetrics)
|
|
46
49
|
kwargs: dict[str, Any] = dataclasses.field(default_factory=dict)
|
|
@@ -0,0 +1,117 @@
|
|
|
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 collections.abc import Callable, Iterator
|
|
31
|
+
from contextlib import contextmanager
|
|
32
|
+
|
|
33
|
+
from pydantic import BaseModel
|
|
34
|
+
|
|
35
|
+
from lsst.utils.logging import LsstLoggers
|
|
36
|
+
from lsst.utils.timer import time_this
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class ButlerMetrics(BaseModel):
|
|
40
|
+
"""Metrics collected during Butler operations."""
|
|
41
|
+
|
|
42
|
+
time_in_put: float = 0.0
|
|
43
|
+
"""Wall-clock time, in seconds, spent in put()."""
|
|
44
|
+
|
|
45
|
+
time_in_get: float = 0.0
|
|
46
|
+
"""Wall-clock time, in seconds, spent in get()."""
|
|
47
|
+
|
|
48
|
+
n_get: int = 0
|
|
49
|
+
"""Number of datasets retrieved with get()."""
|
|
50
|
+
|
|
51
|
+
n_put: int = 0
|
|
52
|
+
"""Number of datasets stored with put()."""
|
|
53
|
+
|
|
54
|
+
def reset(self) -> None:
|
|
55
|
+
"""Reset all metrics."""
|
|
56
|
+
self.time_in_put = 0.0
|
|
57
|
+
self.time_in_get = 0.0
|
|
58
|
+
self.n_get = 0
|
|
59
|
+
self.n_put = 0
|
|
60
|
+
|
|
61
|
+
def increment_get(self, duration: float) -> None:
|
|
62
|
+
"""Increment time for get().
|
|
63
|
+
|
|
64
|
+
Parameters
|
|
65
|
+
----------
|
|
66
|
+
duration : `float`
|
|
67
|
+
Duration to add to the get() statistics.
|
|
68
|
+
"""
|
|
69
|
+
self.time_in_get += duration
|
|
70
|
+
self.n_get += 1
|
|
71
|
+
|
|
72
|
+
def increment_put(self, duration: float) -> None:
|
|
73
|
+
"""Increment time for put().
|
|
74
|
+
|
|
75
|
+
Parameters
|
|
76
|
+
----------
|
|
77
|
+
duration : `float`
|
|
78
|
+
Duration to add to the put() statistics.
|
|
79
|
+
"""
|
|
80
|
+
self.time_in_put += duration
|
|
81
|
+
self.n_put += 1
|
|
82
|
+
|
|
83
|
+
@contextmanager
|
|
84
|
+
def _timer(
|
|
85
|
+
self, handler: Callable[[float], None], log: LsstLoggers | None = None, msg: str | None = None
|
|
86
|
+
) -> Iterator[None]:
|
|
87
|
+
with time_this(log=log, msg=msg) as timer:
|
|
88
|
+
yield
|
|
89
|
+
handler(timer.duration)
|
|
90
|
+
|
|
91
|
+
@contextmanager
|
|
92
|
+
def instrument_get(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
|
|
93
|
+
"""Run code and increment get statistics.
|
|
94
|
+
|
|
95
|
+
Parameters
|
|
96
|
+
----------
|
|
97
|
+
log : `logging.Logger` or `None`
|
|
98
|
+
Logger to use for any timing information.
|
|
99
|
+
msg : `str` or `None`
|
|
100
|
+
Any message to be included in log output.
|
|
101
|
+
"""
|
|
102
|
+
with self._timer(self.increment_get, log=log, msg=msg):
|
|
103
|
+
yield
|
|
104
|
+
|
|
105
|
+
@contextmanager
|
|
106
|
+
def instrument_put(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
|
|
107
|
+
"""Run code and increment put statistics.
|
|
108
|
+
|
|
109
|
+
Parameters
|
|
110
|
+
----------
|
|
111
|
+
log : `logging.Logger` or `None`
|
|
112
|
+
Logger to use for any timing information.
|
|
113
|
+
msg : `str` or `None`
|
|
114
|
+
Any message to be included in log output.
|
|
115
|
+
"""
|
|
116
|
+
with self._timer(self.increment_put, log=log, msg=msg):
|
|
117
|
+
yield
|
|
@@ -1254,7 +1254,7 @@ class ConfigSubset(Config):
|
|
|
1254
1254
|
|
|
1255
1255
|
Global defaults, at lowest priority, are found in the ``config``
|
|
1256
1256
|
directory of the butler source tree. Additional defaults can be
|
|
1257
|
-
defined using the environment variable ``$
|
|
1257
|
+
defined using the environment variable ``$DAF_BUTLER_CONFIG_PATH``
|
|
1258
1258
|
which is a PATH-like variable where paths at the front of the list
|
|
1259
1259
|
have priority over those later.
|
|
1260
1260
|
|