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.
Files changed (429) hide show
  1. {lsst_daf_butler-29.2025.1200/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1300}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/CHANGES.rst +82 -14
  3. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/pyproject.toml +1 -1
  4. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/arrow_utils.py +4 -6
  5. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/column_spec.py +77 -34
  6. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_coordinate.py +4 -15
  7. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_record_set.py +116 -3
  8. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_record_table.py +1 -1
  9. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_records.py +127 -6
  10. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_butler/_direct_butler.py +7 -12
  11. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/pydantic_utils.py +26 -0
  12. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_set.py +1 -1
  13. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +67 -64
  14. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_datasets.py +4 -16
  15. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/sql_registry.py +17 -45
  16. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_query_driver.py +5 -7
  17. {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
  18. lsst_daf_butler-29.2025.1300/python/lsst/daf/butler/version.py +2 -0
  19. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  20. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
  21. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_butler.py +65 -2
  22. lsst_daf_butler-29.2025.1300/tests/test_column_spec.py +95 -0
  23. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_dimension_record_containers.py +47 -2
  24. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_pydantic_utils.py +22 -1
  25. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_utilities.py +1 -1
  26. lsst_daf_butler-29.2025.1200/python/lsst/daf/butler/version.py +0 -2
  27. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/COPYRIGHT +0 -0
  28. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/LICENSE +0 -0
  29. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/MANIFEST.in +0 -0
  30. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/README.md +0 -0
  31. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/bsd_license.txt +0 -0
  32. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  33. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/configuring.rst +0 -0
  34. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/datastores.rst +0 -0
  35. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/dimensions.rst +0 -0
  36. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/formatters.rst +0 -0
  37. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/index.rst +0 -0
  38. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/organizing.rst +0 -0
  39. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/queries.rst +0 -0
  40. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  41. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  42. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/gpl-v3.0.txt +0 -0
  43. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/__init__.py +0 -0
  44. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/__init__.py +0 -0
  45. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/__init__.py +0 -0
  46. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler.py +0 -0
  47. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_collections.py +0 -0
  48. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_config.py +0 -0
  49. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  50. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  51. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_collection_type.py +0 -0
  52. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_column_categorization.py +0 -0
  53. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_column_tags.py +0 -0
  54. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_column_type_info.py +0 -0
  55. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_config.py +0 -0
  56. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_config_support.py +0 -0
  57. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_association.py +0 -0
  58. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  59. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  60. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  61. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_dataset_type.py +0 -0
  62. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  63. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_exceptions.py +0 -0
  64. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  65. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_file_dataset.py +0 -0
  66. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  67. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_formatter.py +0 -0
  68. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  69. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_limited_butler.py +0 -0
  70. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_location.py +0 -0
  71. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_named.py +0 -0
  72. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_quantum.py +0 -0
  73. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  74. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  75. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_registry_shim.py +0 -0
  76. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_storage_class.py +0 -0
  77. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  78. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_timespan.py +0 -0
  79. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_topology.py +0 -0
  80. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  81. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  82. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  83. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  84. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/__init__.py +0 -0
  85. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/butler.py +0 -0
  86. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  87. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  88. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  89. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  90. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  91. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  92. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  93. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  94. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  95. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/progress.py +0 -0
  96. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/cli/utils.py +0 -0
  97. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  98. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  99. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  100. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  101. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  102. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  103. {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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {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
  109. {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
  110. {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
  111. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  112. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  113. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  114. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  115. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  116. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  117. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/composites.py +0 -0
  118. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  119. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  120. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  121. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  122. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  123. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  124. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  125. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  126. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  127. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  129. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  130. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  131. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/ddl.py +0 -0
  132. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  133. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  134. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  135. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  136. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  137. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  138. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  139. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  140. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  141. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  142. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  143. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  144. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  145. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  146. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  147. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  148. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  149. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  150. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  151. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  152. {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
  153. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  154. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  155. {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
  156. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  157. {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
  158. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  159. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  160. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/file.py +0 -0
  161. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/json.py +0 -0
  162. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/logs.py +0 -0
  163. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  164. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/packages.py +0 -0
  165. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  166. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  167. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  168. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  169. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/json.py +0 -0
  170. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/logging.py +0 -0
  171. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/mapping_factory.py +0 -0
  172. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/name_shrinker.py +0 -0
  173. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  174. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/persistence_context.py +0 -0
  175. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/progress.py +0 -0
  176. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/py.typed +0 -0
  177. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/__init__.py +0 -0
  178. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_base.py +0 -0
  179. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  180. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  181. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  182. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  183. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  184. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  185. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/_query.py +0 -0
  186. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  187. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/driver.py +0 -0
  188. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  189. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  190. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  191. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  192. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  193. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  194. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  195. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  196. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  197. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  198. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/queries/visitors.py +0 -0
  199. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/__init__.py +0 -0
  200. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  201. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  202. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  203. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  204. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_config.py +0 -0
  205. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  206. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  207. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_registry.py +0 -0
  208. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  209. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/attributes.py +0 -0
  210. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  211. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  212. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  213. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  214. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  215. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  216. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  217. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  218. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  219. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  220. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  221. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  222. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  223. {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
  224. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  225. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  226. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  228. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  229. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  230. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  231. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  232. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  233. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  234. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  235. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  236. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  237. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  238. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/managers.py +0 -0
  239. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  240. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  241. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  242. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  243. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  244. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  245. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  246. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  247. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  248. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/opaque.py +0 -0
  249. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  250. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  251. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  252. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  253. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  254. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  255. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  256. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  257. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  258. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  259. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  260. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  261. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  262. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  263. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  264. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  265. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  266. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  267. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  268. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  269. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  270. {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
  271. {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
  272. {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
  273. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  274. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  275. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  276. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  277. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  278. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/versions.py +0 -0
  279. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  280. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  281. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  282. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  283. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  284. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  285. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  286. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  287. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  288. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  289. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  290. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  291. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  292. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  293. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  294. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  295. {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
  296. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  297. {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
  298. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  299. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  300. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  301. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  302. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  303. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  304. {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
  305. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  306. {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
  307. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  308. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  309. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/repo_relocation.py +0 -0
  310. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/__init__.py +0 -0
  311. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/_associate.py +0 -0
  312. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  313. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  314. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  315. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  316. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/configDump.py +0 -0
  317. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/configValidate.py +0 -0
  318. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/createRepo.py +0 -0
  319. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  320. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  321. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  322. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  323. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  324. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  325. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  326. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  327. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  328. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  329. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  330. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  331. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  332. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  333. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/__init__.py +0 -0
  334. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  335. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  336. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  337. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  338. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  339. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  340. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  341. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  342. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  343. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  344. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  345. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  346. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  347. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/server.py +0 -0
  348. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  349. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  350. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/tests/utils.py +0 -0
  351. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/time_utils.py +0 -0
  352. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  353. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  354. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/_context.py +0 -0
  355. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  356. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  357. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst/daf/butler/utils.py +0 -0
  358. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  359. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  360. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  361. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  362. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  363. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/setup.cfg +0 -0
  364. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_astropyTableFormatter.py +0 -0
  365. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_authentication.py +0 -0
  366. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_butler_factory.py +0 -0
  367. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdAssociate.py +0 -0
  368. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdConfigDump.py +0 -0
  369. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdConfigValidate.py +0 -0
  370. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdCreate.py +0 -0
  371. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdImport.py +0 -0
  372. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdIngestFiles.py +0 -0
  373. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdPruneDatasets.py +0 -0
  374. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryCollections.py +0 -0
  375. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDataIds.py +0 -0
  376. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  377. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDatasets.py +0 -0
  378. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  379. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdRemoveCollections.py +0 -0
  380. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdRemoveRuns.py +0 -0
  381. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  382. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliLog.py +0 -0
  383. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliPluginLoader.py +0 -0
  384. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtilSplitCommas.py +0 -0
  385. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtilSplitKv.py +0 -0
  386. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtilToUpper.py +0 -0
  387. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_cliUtils.py +0 -0
  388. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_composites.py +0 -0
  389. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_config.py +0 -0
  390. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_connectionString.py +0 -0
  391. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_constraints.py +0 -0
  392. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_datasets.py +0 -0
  393. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_datastore.py +0 -0
  394. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_ddl.py +0 -0
  395. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_dimensions.py +0 -0
  396. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_exprParserLex.py +0 -0
  397. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_exprParserYacc.py +0 -0
  398. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_expressions.py +0 -0
  399. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_formatter.py +0 -0
  400. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_location.py +0 -0
  401. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_logFormatter.py +0 -0
  402. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_logging.py +0 -0
  403. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_matplotlibFormatter.py +0 -0
  404. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_nonempty_mapping.py +0 -0
  405. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_normalFormExpression.py +0 -0
  406. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_obscore.py +0 -0
  407. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_packages.py +0 -0
  408. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_parquet.py +0 -0
  409. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_postgresql.py +0 -0
  410. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_progress.py +0 -0
  411. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_quantum.py +0 -0
  412. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_quantumBackedButler.py +0 -0
  413. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_direct_postgresql.py +0 -0
  414. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_direct_sqlite.py +0 -0
  415. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_interface.py +0 -0
  416. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_relations.py +0 -0
  417. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_query_remote.py +0 -0
  418. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_remote_butler.py +0 -0
  419. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_server.py +0 -0
  420. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_simpleButler.py +0 -0
  421. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_sqlite.py +0 -0
  422. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_storageClass.py +0 -0
  423. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_templates.py +0 -0
  424. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_testRepo.py +0 -0
  425. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_thread_utils.py +0 -0
  426. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_time_utils.py +0 -0
  427. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_timespan.py +0 -0
  428. {lsst_daf_butler-29.2025.1200 → lsst_daf_butler-29.2025.1300}/tests/test_utils.py +0 -0
  429. {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.1200
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
@@ -1,5 +1,73 @@
1
- Butler v28.0.0 2024-11-20
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]]
@@ -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[pa.StructScalar | None]) -> None:
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 `astropy.time.Time`, stored as TAI
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__(_ToArrowTimespan.storage_type, "astropy.time.Time")
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) -> astropy.time.Time:
459
+ def as_py(self) -> uuid.UUID:
462
460
  return uuid.UUID(bytes=self.value.as_py())
463
461
 
464
462
 
@@ -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 typing import TYPE_CHECKING, Annotated, Any, ClassVar, Literal, TypeAlias, Union, final
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
- raise NotImplementedError()
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 serializer(self) -> ColumnValueSerializer:
302
+ def _get_base_annotated_type(self) -> Any:
260
303
  # Docstring inherited.
261
- return _DefaultColumnValueSerializer()
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 serializer(self) -> ColumnValueSerializer:
326
+ def _get_base_annotated_type(self) -> Any:
284
327
  # Docstring inherited.
285
- return _DefaultColumnValueSerializer()
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 serializer(self) -> ColumnValueSerializer:
356
+ def _get_base_annotated_type(self) -> Any:
314
357
  # Docstring inherited.
315
- return _DefaultColumnValueSerializer()
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 serializer(self) -> ColumnValueSerializer:
374
+ def _get_base_annotated_type(self) -> Any:
332
375
  # Docstring inherited.
333
- return _DefaultColumnValueSerializer()
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 serializer(self) -> ColumnValueSerializer:
391
+ def _get_base_annotated_type(self) -> Any:
349
392
  # Docstring inherited.
350
- return _DefaultColumnValueSerializer()
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 serializer(self) -> ColumnValueSerializer:
409
+ def _get_base_annotated_type(self) -> Any:
367
410
  # Docstring inherited.
368
- return _TypeAdapterColumnValueSerializer(pydantic.TypeAdapter(self.pytype))
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 serializer(self) -> ColumnValueSerializer:
432
+ def _get_base_annotated_type(self) -> Any:
390
433
  # Docstring inherited.
391
- return _TypeAdapterColumnValueSerializer(pydantic.TypeAdapter(SerializableRegion))
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 serializer(self) -> ColumnValueSerializer:
451
+ def _get_base_annotated_type(self) -> Any:
409
452
  # Docstring inherited.
410
- return _TypeAdapterColumnValueSerializer(pydantic.TypeAdapter(self.pytype))
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 serializer(self) -> ColumnValueSerializer:
471
+ def _get_base_annotated_type(self) -> Any:
429
472
  # Docstring inherited.
430
- return _TypeAdapterColumnValueSerializer(pydantic.TypeAdapter(SerializableTime))
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
- DataIdKey = str
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.