lsst-daf-butler 29.2025.1200__tar.gz → 29.2025.1300__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.1200/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1300}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/CHANGES.rst +82 -14
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/pyproject.toml +1 -1
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/arrow_utils.py +4 -6
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/column_spec.py +77 -34
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_coordinate.py +4 -15
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_record_set.py +116 -3
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_record_table.py +1 -1
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_records.py +127 -6
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_butler/_direct_butler.py +7 -12
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/pydantic_utils.py +26 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_set.py +1 -1
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +67 -64
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_datasets.py +4 -16
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/sql_registry.py +17 -45
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_query_driver.py +5 -7
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +5 -7
- lsst_daf_butler-29.2025.1300/python/lsst/daf/butler/version.py +2 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_butler.py +65 -2
- lsst_daf_butler-29.2025.1300/tests/test_column_spec.py +95 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_dimension_record_containers.py +47 -2
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_pydantic_utils.py +22 -1
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_utilities.py +1 -1
- lsst_daf_butler-29.2025.1200/python/lsst/daf/butler/version.py +0 -2
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/COPYRIGHT +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/LICENSE +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/MANIFEST.in +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/README.md +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/bsd_license.txt +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/configuring.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/datastores.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/dimensions.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/formatters.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/index.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/organizing.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/queries.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/gpl-v3.0.txt +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_collection_type.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_column_categorization.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_column_tags.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_column_type_info.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_config_support.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_association.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_existence.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_ref.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_file_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_file_descriptor.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_limited_butler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_location.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_named.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_quantum_backed.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_registry_shim.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_storage_class.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_topology.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/butler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/options.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/progress.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/registry.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/composites.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/constraints.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/record_data.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/ddl.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/delegates/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_database.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_group.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/construction.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_predicate_constraints_summary.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/file.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/json.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/logs.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/packages.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/parquet.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/pickle.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/typeless.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/yaml.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/json.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/logging.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/mapping_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/name_shrinker.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/persistence_context.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/progress.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/py.typed +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_base.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/convert_args.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/driver.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/overlaps.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/result_specs.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/visitors.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/attributes.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/managers.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/opaque.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/versions.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/wildcards.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/repo_relocation.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/_associate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/butlerImport.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/collectionChain.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/configDump.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/configValidate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/createRepo.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/ingest_files.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/removeCollections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/removeRuns.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/server.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/server_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/__init__.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/_context.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/setup.cfg +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_astropyTableFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_authentication.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_butler_factory.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdAssociate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdConfigDump.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdConfigValidate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdCreate.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdImport.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdIngestFiles.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdPruneDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryCollections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDataIds.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDatasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdRemoveCollections.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdRemoveRuns.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliLog.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliPluginLoader.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtilSplitCommas.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtilSplitKv.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtilToUpper.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_composites.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_config.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_connectionString.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_constraints.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_datasets.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_datastore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_ddl.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_dimensions.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_exprParserLex.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_exprParserYacc.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_expressions.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_formatter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_location.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_logFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_logging.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_matplotlibFormatter.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_nonempty_mapping.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_normalFormExpression.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_obscore.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_packages.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_parquet.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_progress.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_quantum.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_quantumBackedButler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_direct_postgresql.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_direct_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_interface.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_relations.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_remote.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_remote_butler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_server.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_simpleButler.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_sqlite.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_storageClass.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_templates.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_testRepo.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_thread_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_time_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_timespan.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_utils.py +0 -0
- {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_versioning.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-daf-butler
|
|
3
|
-
Version: 29.2025.
|
|
3
|
+
Version: 29.2025.1300
|
|
4
4
|
Summary: An abstraction layer for reading and writing astronomical data to datastores.
|
|
5
5
|
Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
|
|
6
6
|
License: BSD 3-Clause License
|
{lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/CHANGES.rst
RENAMED
|
@@ -1,5 +1,73 @@
|
|
|
1
|
-
Butler
|
|
2
|
-
|
|
1
|
+
Butler v29.0.0 (2025-03-25)
|
|
2
|
+
===========================
|
|
3
|
+
|
|
4
|
+
New Features
|
|
5
|
+
------------
|
|
6
|
+
|
|
7
|
+
- * Added new class ``DatasetProvenance`` for tracking the provenance of an individual dataset.
|
|
8
|
+
* Modified ``Butler.put()`` to accept an optional ``DatasetProvenance``.
|
|
9
|
+
* Added ``add_provenance`` methods to ``FormatterV2`` and ``StorageClassDelegate``.
|
|
10
|
+
These methods will now be called with the provenance object during ``Butler.put()`` to allow the in-memory dataset to be updated prior to writing. (`DM-35396 <https://rubinobs.atlassian.net/browse/DM-35396>`_)
|
|
11
|
+
- * Added ``Butler.retrieve_artifacts_zip`` and ``QuantumBackedButler.retrieve_artifacts_zip`` methods to retrieve the dataset artifacts and store them into a zip file.
|
|
12
|
+
* Added ``Butler.ingest_zip`` to ingest the contents of a Zip file.
|
|
13
|
+
* Added ``SerializedDatasetRefContainerV1`` class to allow a collection of ``DatasetRef`` to be serialized efficiently.
|
|
14
|
+
JSON serializations made using this class will be supported.
|
|
15
|
+
* Added ``--zip`` parameter to ``butler retrieve-artifacts``.
|
|
16
|
+
* Changed ``Butler.retrieveArtifacts`` to always write a JSON index file describing where the artifacts came from.
|
|
17
|
+
* Added a ``butler ingest-zip`` command-line tool for ingesting zip files created by ``butler retrieve-artifacts``. (`DM-46776 <https://rubinobs.atlassian.net/browse/DM-46776>`_)
|
|
18
|
+
- The ``DAF_BUTLER_PLUGINS`` environment variable should no longer be set if packages use ``pip install`` and have been upgraded to use entry points.
|
|
19
|
+
Butler can now read the subcommands from ``pipe_base`` and ``daf_butler_migrate`` automatically.
|
|
20
|
+
Setting the environment variable for these packages will result in an error. (`DM-47143 <https://rubinobs.atlassian.net/browse/DM-47143>`_)
|
|
21
|
+
- Added two new APIs for handling Butler dataset URIs.
|
|
22
|
+
``Butler.parse_dataset_uri`` parses a URI and returns the butler repository label and associated UUID.
|
|
23
|
+
``Butler.get_dataset_from_uri`` will parse a URI and attempt to retrieve the ``DatasetRef``.
|
|
24
|
+
URIs should be in the form of IVOA identifiers as described in `DMTN-302 <https://dmtn-302.lsst.io>`_.
|
|
25
|
+
Deprecated ``butler://`` URIs are still supported but should not be used in new systems. (`DM-47325 <https://rubinobs.atlassian.net/browse/DM-47325>`_)
|
|
26
|
+
- Added a ``--chains NO-CHILDREN`` mode to the ``butler query-collections`` CLI,
|
|
27
|
+
which returns results without recursing into ``CHAINED`` collections. (`DM-47768 <https://rubinobs.atlassian.net/browse/DM-47768>`_)
|
|
28
|
+
- Added ``lsst.daf.butler.formatters.parquet.add_pandas_index_to_astropy()`` function which stores special metadata that will be used to create a pandas DataFrame index if the table is read as a ``DataFrame``. (`DM-48141 <https://rubinobs.atlassian.net/browse/DM-48141>`_)
|
|
29
|
+
- Modified the Obscore ``RecordFactory`` to support per-universe subclass discovery using entry points.
|
|
30
|
+
|
|
31
|
+
* Added ``RecordFactory.get_record_type_from_universe`` to obtain the correct factory class.
|
|
32
|
+
* Renamed ``ExposureRegionFactory`` to ``DerivedRegionFactory`` to make it clearer that this class is not solely used for exposures but the usage can change with universe.
|
|
33
|
+
* Added ``RecordFactory.region_dimension`` to return the dimension that would be needed to obtain a region for this universe. (`DM-48282 <https://rubinobs.atlassian.net/browse/DM-48282>`_)
|
|
34
|
+
- * Added new methods to ``DatasetProvenance`` for serializing provenance to a flat dictionary and recovering provenance from that dictionary.
|
|
35
|
+
* Modifed ``ParquetFormatter`` to write provenance metadata to Astropy tables. (`DM-48869 <https://rubinobs.atlassian.net/browse/DM-48869>`_)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
API Changes
|
|
39
|
+
-----------
|
|
40
|
+
|
|
41
|
+
- Added ``QuantumBackedButler.retrieve_artifacts`` method to allow dataset artifacts to be retrieved from a graph. (`DM-47328 <https://rubinobs.atlassian.net/browse/DM-47328>`_)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
Bug Fixes
|
|
45
|
+
---------
|
|
46
|
+
|
|
47
|
+
- Fixed inserts with ``replace=True`` on dimensions with only primary key columns. (`DM-46631 <https://rubinobs.atlassian.net/browse/DM-46631>`_)
|
|
48
|
+
- Fixed a bug where ``DatastoreCacheManager`` would raise ``ValueError('badly formed hexadecimal UUID string')`` if files with unexpected names are present in the cache directory when trying to load a file from the cache. (`DM-46936 <https://rubinobs.atlassian.net/browse/DM-46936>`_)
|
|
49
|
+
- Fixed a crash in the new Butler query system which happened in some conditions when using the find-first option with multiple collections. (`DM-47475 <https://rubinobs.atlassian.net/browse/DM-47475>`_)
|
|
50
|
+
- Fixed a bug in which projections spatial-join queries (particularly those where the dimensions of the actual regions being compared are not in the query result rows) could return additional records where there actually was no overlap. (`DM-47947 <https://rubinobs.atlassian.net/browse/DM-47947>`_)
|
|
51
|
+
- Fixed a bug where dataset fields like ``ingest_date`` were raising ``InvalidQueryError: Unrecognized identifier`` when used in a ``Butler.query_datasets`` ``where`` clause. (`DM-48094 <https://rubinobs.atlassian.net/browse/DM-48094>`_)
|
|
52
|
+
- Fixed a query bug that could lead to unexpectedly coarse spatial joins.
|
|
53
|
+
|
|
54
|
+
When dataset search or other join operand had some dimensions from either side of a potential spatial join (e.g. ``{tract, visit}``), we had been blocking the addition of an automatic spatial join on the assumption that this would be embedded in that join operand.
|
|
55
|
+
But this is only desirable when the spatial join that would have been added actually the same one implied by that join operand's dimensions; if it's something more fine grained (e.g. ``{tract, patch, visit}``) we end up with result rows that relate dimensions (e.g. ``patch`` and ``visit``) that do not actually overlap.
|
|
56
|
+
Now automatic spatial joins are only blocked when the join operand includes all dimensions that would have participated in the automatic join. (`DM-48880 <https://rubinobs.atlassian.net/browse/DM-48880>`_)
|
|
57
|
+
- Fixed a bug that could result in incorrectly empty query results when a data ID constraint was inconsistent with some dataset types in a collection, but not the on actually being queried for. (`DM-48974 <https://rubinobs.atlassian.net/browse/DM-48974>`_)
|
|
58
|
+
- Added pyarrow metadata keywords for astropy table to fix warnings on read. (`DM-49509 <https://rubinobs.atlassian.net/browse/DM-49509>`_)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
Other Changes and Additions
|
|
62
|
+
---------------------------
|
|
63
|
+
|
|
64
|
+
- Now support a type conversion field in file template format strings. (`DM-47976 <https://rubinobs.atlassian.net/browse/DM-47976>`_)
|
|
65
|
+
- Modified ObsCore configuration to support ``facility_map`` lookup table to allow the facility to be associated with a specific instrument.
|
|
66
|
+
This is important for butler repositories containing data from multiple instruments and facilities. (`DM-46914 <https://rubinobs.atlassian.net/browse/DM-46914>`_)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
Butler v28.0.0 (2024-11-20)
|
|
70
|
+
===========================
|
|
3
71
|
|
|
4
72
|
New Features
|
|
5
73
|
------------
|
|
@@ -135,8 +203,8 @@ An API Removal or Deprecation
|
|
|
135
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>`_)
|
|
136
204
|
|
|
137
205
|
|
|
138
|
-
Butler 27.0.0 2024-05-28
|
|
139
|
-
|
|
206
|
+
Butler 27.0.0 (2024-05-28)
|
|
207
|
+
==========================
|
|
140
208
|
|
|
141
209
|
Now supports Python 3.12.
|
|
142
210
|
|
|
@@ -296,8 +364,8 @@ An API Removal or Deprecation
|
|
|
296
364
|
* Removed the ``reconsitutedDimension`` parameter from ``Quantum.from_simple``. (`DM-40150 <https://rubinobs.atlassian.net/browse/DM-40150>`_)
|
|
297
365
|
|
|
298
366
|
|
|
299
|
-
Butler v26.0.0 2023-09-22
|
|
300
|
-
|
|
367
|
+
Butler v26.0.0 (2023-09-22)
|
|
368
|
+
===========================
|
|
301
369
|
|
|
302
370
|
Now supports Python 3.11.
|
|
303
371
|
|
|
@@ -475,8 +543,8 @@ An API Removal or Deprecation
|
|
|
475
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>`_)
|
|
476
544
|
|
|
477
545
|
|
|
478
|
-
Butler v25.0.0 2023-02-27
|
|
479
|
-
|
|
546
|
+
Butler v25.0.0 (2023-02-27)
|
|
547
|
+
===========================
|
|
480
548
|
|
|
481
549
|
This is the last release that can access data repositories using integer dataset IDs.
|
|
482
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>`_.
|
|
@@ -570,8 +638,8 @@ An API Removal or Deprecation
|
|
|
570
638
|
- Removed deprecated filterLabel exposure component access. (`DM-27811 <https://rubinobs.atlassian.net/browse/DM-27811>`_)
|
|
571
639
|
|
|
572
640
|
|
|
573
|
-
Butler v24.0.0 2022-08-26
|
|
574
|
-
|
|
641
|
+
Butler v24.0.0 (2022-08-26)
|
|
642
|
+
===========================
|
|
575
643
|
|
|
576
644
|
New Features
|
|
577
645
|
------------
|
|
@@ -695,8 +763,8 @@ An API Removal or Deprecation
|
|
|
695
763
|
It functions identically to the ``filterLabel`` component, which has been deprecated. (`DM-27177 <https://rubinobs.atlassian.net/browse/DM-27177>`_)
|
|
696
764
|
|
|
697
765
|
|
|
698
|
-
Butler v23.0.0 2021-12-10
|
|
699
|
-
|
|
766
|
+
Butler v23.0.0 (2021-12-10)
|
|
767
|
+
===========================
|
|
700
768
|
|
|
701
769
|
New Features
|
|
702
770
|
------------
|
|
@@ -797,8 +865,8 @@ Other Changes and Additions
|
|
|
797
865
|
- Add ``split`` transfer mode that can be used when some files are inside the datastore and some files are outside the datastore.
|
|
798
866
|
This is equivalent to using `None` and ``direct`` mode dynamically. (`DM-31251 <https://rubinobs.atlassian.net/browse/DM-31251>`_)
|
|
799
867
|
|
|
800
|
-
Butler v22.0 2021-04-01
|
|
801
|
-
|
|
868
|
+
Butler v22.0 (2021-04-01)
|
|
869
|
+
=========================
|
|
802
870
|
|
|
803
871
|
New Features
|
|
804
872
|
------------
|
|
@@ -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]]
|
{lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/arrow_utils.py
RENAMED
|
@@ -383,7 +383,7 @@ class _ToArrowTimespan(ToArrow):
|
|
|
383
383
|
# Docstring inherited.
|
|
384
384
|
return TimespanArrowType()
|
|
385
385
|
|
|
386
|
-
def append(self, value: Timespan | None, column: list[
|
|
386
|
+
def append(self, value: Timespan | None, column: list[dict[str, int] | None]) -> None:
|
|
387
387
|
# Docstring inherited.
|
|
388
388
|
column.append({"begin_nsec": value.nsec[0], "end_nsec": value.nsec[1]} if value is not None else None)
|
|
389
389
|
|
|
@@ -432,12 +432,10 @@ class _ToArrowDateTime(ToArrow):
|
|
|
432
432
|
|
|
433
433
|
@final
|
|
434
434
|
class UUIDArrowType(pa.ExtensionType):
|
|
435
|
-
"""An Arrow extension type for `
|
|
436
|
-
nanoseconds since 1970-01-01.
|
|
437
|
-
"""
|
|
435
|
+
"""An Arrow extension type for `uuid.UUID`, stored as 16 bytes."""
|
|
438
436
|
|
|
439
437
|
def __init__(self) -> None:
|
|
440
|
-
super().__init__(
|
|
438
|
+
super().__init__(_ToArrowUUID.storage_type, "uuid.UUID")
|
|
441
439
|
|
|
442
440
|
def __arrow_ext_serialize__(self) -> bytes:
|
|
443
441
|
return b""
|
|
@@ -458,7 +456,7 @@ class UUIDArrowScalar(pa.ExtensionScalar):
|
|
|
458
456
|
instance.
|
|
459
457
|
"""
|
|
460
458
|
|
|
461
|
-
def as_py(self) ->
|
|
459
|
+
def as_py(self) -> uuid.UUID:
|
|
462
460
|
return uuid.UUID(bytes=self.value.as_py())
|
|
463
461
|
|
|
464
462
|
|
{lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/column_spec.py
RENAMED
|
@@ -39,12 +39,24 @@ __all__ = (
|
|
|
39
39
|
"StringColumnSpec",
|
|
40
40
|
"TimespanColumnSpec",
|
|
41
41
|
"UUIDColumnSpec",
|
|
42
|
+
"make_tuple_type_adapter",
|
|
42
43
|
)
|
|
43
44
|
|
|
44
45
|
import textwrap
|
|
45
46
|
import uuid
|
|
46
47
|
from abc import ABC, abstractmethod
|
|
47
|
-
from
|
|
48
|
+
from collections.abc import Iterable
|
|
49
|
+
from typing import (
|
|
50
|
+
TYPE_CHECKING,
|
|
51
|
+
Annotated,
|
|
52
|
+
Any,
|
|
53
|
+
ClassVar,
|
|
54
|
+
Literal,
|
|
55
|
+
Optional,
|
|
56
|
+
TypeAlias,
|
|
57
|
+
Union,
|
|
58
|
+
final,
|
|
59
|
+
)
|
|
48
60
|
|
|
49
61
|
import astropy.time
|
|
50
62
|
import pyarrow as pa
|
|
@@ -54,7 +66,7 @@ from lsst.sphgeom import Region
|
|
|
54
66
|
|
|
55
67
|
from . import arrow_utils, ddl
|
|
56
68
|
from ._timespan import Timespan
|
|
57
|
-
from .pydantic_utils import SerializableRegion, SerializableTime
|
|
69
|
+
from .pydantic_utils import SerializableBytesHex, SerializableRegion, SerializableTime
|
|
58
70
|
|
|
59
71
|
if TYPE_CHECKING:
|
|
60
72
|
from .name_shrinker import NameShrinker
|
|
@@ -125,18 +137,6 @@ class ColumnValueSerializer(ABC):
|
|
|
125
137
|
raise NotImplementedError
|
|
126
138
|
|
|
127
139
|
|
|
128
|
-
class _DefaultColumnValueSerializer(ColumnValueSerializer):
|
|
129
|
-
"""Default implementation of serializer for basic types."""
|
|
130
|
-
|
|
131
|
-
def serialize(self, value: Any) -> Any:
|
|
132
|
-
# Docstring inherited.
|
|
133
|
-
return value
|
|
134
|
-
|
|
135
|
-
def deserialize(self, value: Any) -> Any:
|
|
136
|
-
# Docstring inherited.
|
|
137
|
-
return value
|
|
138
|
-
|
|
139
|
-
|
|
140
140
|
class _TypeAdapterColumnValueSerializer(ColumnValueSerializer):
|
|
141
141
|
"""Implementation of serializer that uses pydantic type adapter."""
|
|
142
142
|
|
|
@@ -156,6 +156,8 @@ class _TypeAdapterColumnValueSerializer(ColumnValueSerializer):
|
|
|
156
156
|
class _BaseColumnSpec(pydantic.BaseModel, ABC):
|
|
157
157
|
"""Base class for descriptions of table columns."""
|
|
158
158
|
|
|
159
|
+
pytype: ClassVar[type]
|
|
160
|
+
|
|
159
161
|
name: str = pydantic.Field(description="""Name of the column.""")
|
|
160
162
|
|
|
161
163
|
doc: str = pydantic.Field(default="", description="Documentation for the column.")
|
|
@@ -200,7 +202,6 @@ class _BaseColumnSpec(pydantic.BaseModel, ABC):
|
|
|
200
202
|
"""
|
|
201
203
|
raise NotImplementedError()
|
|
202
204
|
|
|
203
|
-
@abstractmethod
|
|
204
205
|
def serializer(self) -> ColumnValueSerializer:
|
|
205
206
|
"""Return object that converts values of this column to or from
|
|
206
207
|
serializable format.
|
|
@@ -210,7 +211,7 @@ class _BaseColumnSpec(pydantic.BaseModel, ABC):
|
|
|
210
211
|
serializer : `ColumnValueSerializer`
|
|
211
212
|
A converter instance.
|
|
212
213
|
"""
|
|
213
|
-
|
|
214
|
+
return _TypeAdapterColumnValueSerializer(pydantic.TypeAdapter(self.annotated_type))
|
|
214
215
|
|
|
215
216
|
def display(self, level: int = 0, tab: str = " ") -> list[str]:
|
|
216
217
|
"""Return a human-reader-focused string description of this column as
|
|
@@ -243,6 +244,48 @@ class _BaseColumnSpec(pydantic.BaseModel, ABC):
|
|
|
243
244
|
def __str__(self) -> str:
|
|
244
245
|
return "\n".join(self.display())
|
|
245
246
|
|
|
247
|
+
@property
|
|
248
|
+
def annotated_type(self) -> Any:
|
|
249
|
+
"""Return a Pydantic-friendly type annotation for this column type.
|
|
250
|
+
|
|
251
|
+
Since this is a runtime object and most type annotations must be
|
|
252
|
+
static, this is really only useful for `pydantic.TypeAdapter`
|
|
253
|
+
construction and dynamic `pydantic.create_model` construction.
|
|
254
|
+
"""
|
|
255
|
+
base = self._get_base_annotated_type()
|
|
256
|
+
if self.nullable:
|
|
257
|
+
return Optional[base]
|
|
258
|
+
return base
|
|
259
|
+
|
|
260
|
+
@abstractmethod
|
|
261
|
+
def _get_base_annotated_type(self) -> Any:
|
|
262
|
+
"""Return the base annotated type (not taking into account `nullable`)
|
|
263
|
+
for this column type.
|
|
264
|
+
"""
|
|
265
|
+
raise NotImplementedError()
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
def make_tuple_type_adapter(
|
|
269
|
+
columns: Iterable[ColumnSpec],
|
|
270
|
+
) -> pydantic.TypeAdapter[tuple[Any, ...]]:
|
|
271
|
+
"""Return a `pydantic.TypeAdapter` for a `tuple` with types defined by an
|
|
272
|
+
iterable of `ColumnSpec` objects.
|
|
273
|
+
|
|
274
|
+
Parameters
|
|
275
|
+
----------
|
|
276
|
+
columns : `~collections.abc.Iterable` [ `ColumnSpec` ]
|
|
277
|
+
Iterable of column specifications.
|
|
278
|
+
|
|
279
|
+
Returns
|
|
280
|
+
-------
|
|
281
|
+
adapter : `pydantic.TypeAdapter`
|
|
282
|
+
A Pydantic type adapter for the `tuple` representation of a row with
|
|
283
|
+
the given columns.
|
|
284
|
+
"""
|
|
285
|
+
# Static type-checkers don't like this runtime use of static-typing
|
|
286
|
+
# constructs, but that's how Pydantic works.
|
|
287
|
+
return pydantic.TypeAdapter(tuple[*[spec.annotated_type for spec in columns]]) # type: ignore
|
|
288
|
+
|
|
246
289
|
|
|
247
290
|
@final
|
|
248
291
|
class IntColumnSpec(_BaseColumnSpec):
|
|
@@ -256,9 +299,9 @@ class IntColumnSpec(_BaseColumnSpec):
|
|
|
256
299
|
# Docstring inherited.
|
|
257
300
|
return arrow_utils.ToArrow.for_primitive(self.name, pa.uint64(), nullable=self.nullable)
|
|
258
301
|
|
|
259
|
-
def
|
|
302
|
+
def _get_base_annotated_type(self) -> Any:
|
|
260
303
|
# Docstring inherited.
|
|
261
|
-
return
|
|
304
|
+
return pydantic.StrictInt
|
|
262
305
|
|
|
263
306
|
|
|
264
307
|
@final
|
|
@@ -280,9 +323,9 @@ class StringColumnSpec(_BaseColumnSpec):
|
|
|
280
323
|
# Docstring inherited.
|
|
281
324
|
return arrow_utils.ToArrow.for_primitive(self.name, pa.string(), nullable=self.nullable)
|
|
282
325
|
|
|
283
|
-
def
|
|
326
|
+
def _get_base_annotated_type(self) -> Any:
|
|
284
327
|
# Docstring inherited.
|
|
285
|
-
return
|
|
328
|
+
return pydantic.StrictStr
|
|
286
329
|
|
|
287
330
|
|
|
288
331
|
@final
|
|
@@ -310,9 +353,9 @@ class HashColumnSpec(_BaseColumnSpec):
|
|
|
310
353
|
nullable=self.nullable,
|
|
311
354
|
)
|
|
312
355
|
|
|
313
|
-
def
|
|
356
|
+
def _get_base_annotated_type(self) -> Any:
|
|
314
357
|
# Docstring inherited.
|
|
315
|
-
return
|
|
358
|
+
return SerializableBytesHex
|
|
316
359
|
|
|
317
360
|
|
|
318
361
|
@final
|
|
@@ -328,9 +371,9 @@ class FloatColumnSpec(_BaseColumnSpec):
|
|
|
328
371
|
assert self.nullable is not None, "nullable=None should be resolved by validators"
|
|
329
372
|
return arrow_utils.ToArrow.for_primitive(self.name, pa.float64(), nullable=self.nullable)
|
|
330
373
|
|
|
331
|
-
def
|
|
374
|
+
def _get_base_annotated_type(self) -> Any:
|
|
332
375
|
# Docstring inherited.
|
|
333
|
-
return
|
|
376
|
+
return pydantic.StrictFloat
|
|
334
377
|
|
|
335
378
|
|
|
336
379
|
@final
|
|
@@ -345,9 +388,9 @@ class BoolColumnSpec(_BaseColumnSpec):
|
|
|
345
388
|
# Docstring inherited.
|
|
346
389
|
return arrow_utils.ToArrow.for_primitive(self.name, pa.bool_(), nullable=self.nullable)
|
|
347
390
|
|
|
348
|
-
def
|
|
391
|
+
def _get_base_annotated_type(self) -> Any:
|
|
349
392
|
# Docstring inherited.
|
|
350
|
-
return
|
|
393
|
+
return pydantic.StrictBool
|
|
351
394
|
|
|
352
395
|
|
|
353
396
|
@final
|
|
@@ -363,9 +406,9 @@ class UUIDColumnSpec(_BaseColumnSpec):
|
|
|
363
406
|
assert self.nullable is not None, "nullable=None should be resolved by validators"
|
|
364
407
|
return arrow_utils.ToArrow.for_uuid(self.name, nullable=self.nullable)
|
|
365
408
|
|
|
366
|
-
def
|
|
409
|
+
def _get_base_annotated_type(self) -> Any:
|
|
367
410
|
# Docstring inherited.
|
|
368
|
-
return
|
|
411
|
+
return uuid.UUID
|
|
369
412
|
|
|
370
413
|
|
|
371
414
|
@final
|
|
@@ -386,9 +429,9 @@ class RegionColumnSpec(_BaseColumnSpec):
|
|
|
386
429
|
assert self.nullable is not None, "nullable=None should be resolved by validators"
|
|
387
430
|
return arrow_utils.ToArrow.for_region(self.name, nullable=self.nullable)
|
|
388
431
|
|
|
389
|
-
def
|
|
432
|
+
def _get_base_annotated_type(self) -> Any:
|
|
390
433
|
# Docstring inherited.
|
|
391
|
-
return
|
|
434
|
+
return SerializableRegion
|
|
392
435
|
|
|
393
436
|
|
|
394
437
|
@final
|
|
@@ -405,9 +448,9 @@ class TimespanColumnSpec(_BaseColumnSpec):
|
|
|
405
448
|
# Docstring inherited.
|
|
406
449
|
return arrow_utils.ToArrow.for_timespan(self.name, nullable=self.nullable)
|
|
407
450
|
|
|
408
|
-
def
|
|
451
|
+
def _get_base_annotated_type(self) -> Any:
|
|
409
452
|
# Docstring inherited.
|
|
410
|
-
return
|
|
453
|
+
return Timespan
|
|
411
454
|
|
|
412
455
|
|
|
413
456
|
@final
|
|
@@ -425,9 +468,9 @@ class DateTimeColumnSpec(_BaseColumnSpec):
|
|
|
425
468
|
assert self.nullable is not None, "nullable=None should be resolved by validators"
|
|
426
469
|
return arrow_utils.ToArrow.for_datetime(self.name, nullable=self.nullable)
|
|
427
470
|
|
|
428
|
-
def
|
|
471
|
+
def _get_base_annotated_type(self) -> Any:
|
|
429
472
|
# Docstring inherited.
|
|
430
|
-
return
|
|
473
|
+
return SerializableTime
|
|
431
474
|
|
|
432
475
|
|
|
433
476
|
ColumnSpec = Annotated[
|
|
@@ -44,7 +44,7 @@ __all__ = (
|
|
|
44
44
|
import numbers
|
|
45
45
|
from abc import abstractmethod
|
|
46
46
|
from collections.abc import Iterable, Iterator, Mapping
|
|
47
|
-
from typing import TYPE_CHECKING, Any, ClassVar, overload
|
|
47
|
+
from typing import TYPE_CHECKING, Any, ClassVar, TypeAlias, overload
|
|
48
48
|
|
|
49
49
|
import pydantic
|
|
50
50
|
|
|
@@ -55,24 +55,13 @@ from .._timespan import Timespan
|
|
|
55
55
|
from ..json import from_json_pydantic, to_json_pydantic
|
|
56
56
|
from ..persistence_context import PersistenceContextVars
|
|
57
57
|
from ._group import DimensionGroup
|
|
58
|
-
from ._records import DimensionRecord, SerializedDimensionRecord
|
|
58
|
+
from ._records import DataIdKey, DataIdValue, DimensionRecord, SerializedDimensionRecord
|
|
59
59
|
|
|
60
60
|
if TYPE_CHECKING: # Imports needed only for type annotations; may be circular.
|
|
61
61
|
from ..registry import Registry
|
|
62
62
|
from ._universe import DimensionUniverse
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
"""Type annotation alias for the keys that can be used to index a
|
|
66
|
-
DataCoordinate.
|
|
67
|
-
"""
|
|
68
|
-
|
|
69
|
-
# Pydantic will cast int to str if str is first in the Union.
|
|
70
|
-
DataIdValue = int | str | None
|
|
71
|
-
"""Type annotation alias for the values that can be present in a
|
|
72
|
-
DataCoordinate or other data ID.
|
|
73
|
-
"""
|
|
74
|
-
|
|
75
|
-
SerializedDataId = dict[str, DataIdValue]
|
|
64
|
+
SerializedDataId: TypeAlias = dict[str, DataIdValue]
|
|
76
65
|
"""Simplified model for serializing the ``mapping`` property of
|
|
77
66
|
`DataCoordinate`.
|
|
78
67
|
"""
|
|
@@ -247,7 +236,7 @@ class DataCoordinate:
|
|
|
247
236
|
# Some backends cannot handle numpy.int64 type which is a subclass of
|
|
248
237
|
# numbers.Integral; convert that to int.
|
|
249
238
|
for k, v in new_mapping.items():
|
|
250
|
-
if isinstance(v, numbers.Integral):
|
|
239
|
+
if isinstance(v, numbers.Integral): # type: ignore
|
|
251
240
|
new_mapping[k] = int(v) # type: ignore
|
|
252
241
|
if defaults is not None:
|
|
253
242
|
for k, v in defaults.mapping.items():
|
|
@@ -27,19 +27,22 @@
|
|
|
27
27
|
|
|
28
28
|
from __future__ import annotations
|
|
29
29
|
|
|
30
|
-
__all__ = ("DimensionRecordFactory", "DimensionRecordSet")
|
|
30
|
+
__all__ = ("DimensionRecordFactory", "DimensionRecordSet", "DimensionRecordSetDeserializer")
|
|
31
31
|
|
|
32
32
|
from collections.abc import Collection, Iterable, Iterator
|
|
33
|
-
from typing import TYPE_CHECKING, Any, Protocol, final
|
|
33
|
+
from typing import TYPE_CHECKING, Any, Protocol, Self, TypeAlias, final
|
|
34
34
|
|
|
35
35
|
from ._coordinate import DataCoordinate, DataIdValue
|
|
36
|
-
from ._records import DimensionRecord
|
|
36
|
+
from ._records import DimensionRecord, SerializedKeyValueDimensionRecord
|
|
37
37
|
|
|
38
38
|
if TYPE_CHECKING:
|
|
39
39
|
from ._elements import DimensionElement
|
|
40
40
|
from ._universe import DimensionUniverse
|
|
41
41
|
|
|
42
42
|
|
|
43
|
+
SerializedDimensionRecordSetMapping: TypeAlias = dict[str, list[SerializedKeyValueDimensionRecord]]
|
|
44
|
+
|
|
45
|
+
|
|
43
46
|
class DimensionRecordFactory(Protocol):
|
|
44
47
|
"""Protocol for a callback that can be used to create a dimension record
|
|
45
48
|
to add to a `DimensionRecordSet` when a search for an existing one fails.
|
|
@@ -483,3 +486,113 @@ class DimensionRecordSet(Collection[DimensionRecord]): # numpydoc ignore=PR01
|
|
|
483
486
|
|
|
484
487
|
def __deepcopy__(self, memo: dict[str, Any]) -> DimensionRecordSet:
|
|
485
488
|
return DimensionRecordSet(self.element, _by_required_values=self._by_required_values.copy())
|
|
489
|
+
|
|
490
|
+
def serialize_records(self) -> list[SerializedKeyValueDimensionRecord]:
|
|
491
|
+
"""Serialize the records to a list.
|
|
492
|
+
|
|
493
|
+
Returns
|
|
494
|
+
-------
|
|
495
|
+
raw_records : `list` [ `list` ]
|
|
496
|
+
Serialized records, in the form returned by
|
|
497
|
+
`DimensionRecord.serialize_key_value`.
|
|
498
|
+
|
|
499
|
+
Notes
|
|
500
|
+
-----
|
|
501
|
+
This does not include the dimension element shared by all of the
|
|
502
|
+
records, on the assumption that this is usually more conveniently saved
|
|
503
|
+
separately (e.g. as the key of a dictionary of which the list of
|
|
504
|
+
records is a value).
|
|
505
|
+
"""
|
|
506
|
+
return [record.serialize_key_value() for record in self]
|
|
507
|
+
|
|
508
|
+
def deserialize_records(self, raw_records: Iterable[SerializedKeyValueDimensionRecord]) -> None:
|
|
509
|
+
"""Deserialize records and add them to this set.
|
|
510
|
+
|
|
511
|
+
Parameters
|
|
512
|
+
----------
|
|
513
|
+
raw_records : `~collections.abc.Iterable` [ `list` ]
|
|
514
|
+
Serialized records, as returned by `serialize_records` or repeated
|
|
515
|
+
calls to `DimensionRecord.serialize_key_value`.
|
|
516
|
+
|
|
517
|
+
Notes
|
|
518
|
+
-----
|
|
519
|
+
The caller is responsible for ensuring that the serialized records have
|
|
520
|
+
the same dimension element as this set, as this cannot be checked.
|
|
521
|
+
Mismatches will probably result in a (confusing) type-validation error,
|
|
522
|
+
but are not guaranteed to.
|
|
523
|
+
"""
|
|
524
|
+
deserializer = DimensionRecordSetDeserializer.from_raw(self.element, raw_records)
|
|
525
|
+
self.update(deserializer)
|
|
526
|
+
|
|
527
|
+
|
|
528
|
+
class DimensionRecordSetDeserializer:
|
|
529
|
+
"""A helper class for deserializing sets of dimension records, with support
|
|
530
|
+
for only fully deserializing certain records.
|
|
531
|
+
|
|
532
|
+
The `from_raw` factory method should generally be used instead of calling
|
|
533
|
+
the constructor directly.
|
|
534
|
+
|
|
535
|
+
Parameters
|
|
536
|
+
----------
|
|
537
|
+
element : `DimensionElement`
|
|
538
|
+
Dimension element that defines all records.
|
|
539
|
+
mapping : `dict` [ `tuple`, `list` ]
|
|
540
|
+
A dictionary that maps the data ID required-values `tuple` for reach
|
|
541
|
+
record to the remainder of its raw serialization (i.e. an item in this
|
|
542
|
+
`dict` is a pair returned by `DimensionRecord.deserialize_key`). This
|
|
543
|
+
`dict` will be used directly to back the deserializer, not copied.
|
|
544
|
+
|
|
545
|
+
Notes
|
|
546
|
+
-----
|
|
547
|
+
The keys (data ID required-values tuples) of all rows are deserialized
|
|
548
|
+
immediately, but the remaining fields are deserialized only on demand; use
|
|
549
|
+
`__iter__` to deserialize all records or `__getitem__` to deserialize only
|
|
550
|
+
a few. An instance should really only be used for a single iteration or
|
|
551
|
+
multiple `__getitem__` calls, as each call will re-deserialize the records
|
|
552
|
+
in play; deserialized records are not cached.
|
|
553
|
+
|
|
554
|
+
The caller is responsible for ensuring that the serialized records are for
|
|
555
|
+
the given dimension element, as this cannot be checked. Mismatches will
|
|
556
|
+
probably result in a (confusing) type-validation error, but are not
|
|
557
|
+
guaranteed to.
|
|
558
|
+
"""
|
|
559
|
+
|
|
560
|
+
def __init__(
|
|
561
|
+
self,
|
|
562
|
+
element: DimensionElement,
|
|
563
|
+
mapping: dict[tuple[DataIdValue, ...], SerializedKeyValueDimensionRecord],
|
|
564
|
+
):
|
|
565
|
+
self.element = element
|
|
566
|
+
self._mapping = mapping
|
|
567
|
+
|
|
568
|
+
@classmethod
|
|
569
|
+
def from_raw(
|
|
570
|
+
cls, element: DimensionElement, raw_records: Iterable[SerializedKeyValueDimensionRecord]
|
|
571
|
+
) -> Self:
|
|
572
|
+
"""Construct from raw serialized records.
|
|
573
|
+
|
|
574
|
+
Parameters
|
|
575
|
+
----------
|
|
576
|
+
element : `DimensionElement`
|
|
577
|
+
Dimension element that defines all records.
|
|
578
|
+
raw_records : `~collections.abc.Iterable` [ `list` ]
|
|
579
|
+
Serialized records, as returned by
|
|
580
|
+
`DimensionRecordSet.serialize_records` or repeated calls to
|
|
581
|
+
`DimensionRecord.serialize_key_value`.
|
|
582
|
+
|
|
583
|
+
Returns
|
|
584
|
+
-------
|
|
585
|
+
deserializer : `DimensionRecordSetDeserializer`
|
|
586
|
+
New deserializer instance.
|
|
587
|
+
"""
|
|
588
|
+
return cls(element=element, mapping=dict(map(element.RecordClass.deserialize_key, raw_records)))
|
|
589
|
+
|
|
590
|
+
def __len__(self) -> int:
|
|
591
|
+
return len(self._mapping)
|
|
592
|
+
|
|
593
|
+
def __iter__(self) -> Iterator[DimensionRecord]:
|
|
594
|
+
deserialize = self.element.RecordClass.deserialize_value
|
|
595
|
+
return (deserialize(k, v) for k, v in self._mapping.items())
|
|
596
|
+
|
|
597
|
+
def __getitem__(self, key: tuple[DataIdValue, ...]) -> DimensionRecord:
|
|
598
|
+
return self.element.RecordClass.deserialize_value(key, self._mapping[key])
|
|
@@ -222,7 +222,7 @@ class DimensionRecordTable:
|
|
|
222
222
|
array_columns = [
|
|
223
223
|
converter.finish(column) for converter, column in zip(self._converters, list_columns)
|
|
224
224
|
]
|
|
225
|
-
return pa.record_batch(array_columns, arrow_schema)
|
|
225
|
+
return pa.record_batch(array_columns, schema=arrow_schema)
|
|
226
226
|
|
|
227
227
|
def _get_record_at(self, table: pa.Table | pa.RecordBatch, index: int) -> DimensionRecord:
|
|
228
228
|
"""Construct a `DimensionRecord` from a row in the table.
|