lsst-daf-butler 29.2025.3800__tar.gz → 29.2025.4000__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 (452) hide show
  1. {lsst_daf_butler-29.2025.3800/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4000}/PKG-INFO +2 -3
  2. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/pyproject.toml +2 -3
  3. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_quantum_backed.py +28 -0
  4. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/utils.py +9 -2
  5. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
  6. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
  7. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/_datastore.py +18 -0
  8. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/chainedDatastore.py +19 -0
  9. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/fileDatastore.py +18 -0
  10. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +6 -0
  11. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_expression_strings.py +0 -3
  12. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_identifiers.py +1 -5
  13. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_base.py +1 -1
  14. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +27 -0
  15. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +17 -2
  16. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/utils.py +7 -2
  17. lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/version.py +2 -0
  18. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000/python/lsst_daf_butler.egg-info}/PKG-INFO +2 -3
  19. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_datastore.py +27 -0
  20. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_quantumBackedButler.py +13 -0
  21. lsst_daf_butler-29.2025.3800/python/lsst/daf/butler/version.py +0 -2
  22. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/COPYRIGHT +0 -0
  23. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/LICENSE +0 -0
  24. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/MANIFEST.in +0 -0
  25. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/README.md +0 -0
  26. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/bsd_license.txt +0 -0
  27. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  28. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  29. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/configuring.rst +0 -0
  30. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/datastores.rst +0 -0
  31. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/dimensions.rst +0 -0
  32. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/formatters.rst +0 -0
  33. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/index.rst +0 -0
  34. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/organizing.rst +0 -0
  35. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/queries.rst +0 -0
  36. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  37. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  38. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/gpl-v3.0.txt +0 -0
  39. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/__init__.py +0 -0
  40. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/__init__.py +0 -0
  41. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/__init__.py +0 -0
  42. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_butler.py +0 -0
  43. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_butler_collections.py +0 -0
  44. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_butler_config.py +0 -0
  45. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  46. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  47. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  48. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_collection_type.py +0 -0
  49. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_column_categorization.py +0 -0
  50. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_column_tags.py +0 -0
  51. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_column_type_info.py +0 -0
  52. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_config.py +0 -0
  53. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_config_support.py +0 -0
  54. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_dataset_association.py +0 -0
  55. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  56. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  57. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  58. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_dataset_type.py +0 -0
  59. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  60. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_exceptions.py +0 -0
  61. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  62. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_file_dataset.py +0 -0
  63. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  64. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_formatter.py +0 -0
  65. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  66. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_limited_butler.py +0 -0
  67. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_location.py +0 -0
  68. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_named.py +0 -0
  69. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_quantum.py +0 -0
  70. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  71. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_registry_shim.py +0 -0
  72. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
  73. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  74. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  75. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_storage_class.py +0 -0
  76. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  77. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_timespan.py +0 -0
  78. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_topology.py +0 -0
  79. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  80. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  81. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  82. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  83. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/arrow_utils.py +0 -0
  84. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/__init__.py +0 -0
  85. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/butler.py +0 -0
  86. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  87. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  88. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  89. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  90. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  91. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  92. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  93. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  94. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  95. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/cli/progress.py +0 -0
  96. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/column_spec.py +0 -0
  97. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  98. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  99. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  100. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  101. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  102. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  103. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  104. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  105. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  106. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  107. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  108. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  109. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  110. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  111. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  112. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  113. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  114. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  115. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/composites.py +0 -0
  116. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  117. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  118. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  119. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  120. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  121. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  122. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  123. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  124. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  125. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  126. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/ddl.py +0 -0
  127. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  129. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  130. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  131. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  132. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  133. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  134. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  135. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  136. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  137. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  138. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  139. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  140. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  141. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  142. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  143. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  144. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  145. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  146. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  147. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  148. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  149. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  150. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  151. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  152. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  153. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  154. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  155. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  156. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  157. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  158. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  159. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/file.py +0 -0
  160. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/json.py +0 -0
  161. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/logs.py +0 -0
  162. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  163. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/packages.py +0 -0
  164. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  165. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  166. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  167. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  168. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/json.py +0 -0
  169. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/logging.py +0 -0
  170. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/mapping_factory.py +0 -0
  171. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/name_shrinker.py +0 -0
  172. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  173. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/persistence_context.py +0 -0
  174. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/progress.py +0 -0
  175. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/py.typed +0 -0
  176. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  177. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/__init__.py +0 -0
  178. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_base.py +0 -0
  179. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  180. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  181. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  182. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  183. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/_query.py +0 -0
  184. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  185. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/driver.py +0 -0
  186. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  187. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  188. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  189. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  190. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  191. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  192. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  193. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  194. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  195. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  196. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  197. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/queries/visitors.py +0 -0
  198. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/__init__.py +0 -0
  199. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  200. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  201. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  202. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  203. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_config.py +0 -0
  204. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  205. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  206. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_registry.py +0 -0
  207. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  208. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/attributes.py +0 -0
  209. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  210. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  211. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  212. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  213. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  214. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  215. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  216. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  217. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  218. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  219. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  220. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  221. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  222. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  223. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  224. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  225. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  226. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  228. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  229. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  230. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  231. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  232. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  233. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  234. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  235. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  236. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  237. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  238. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  239. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/managers.py +0 -0
  240. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  241. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  242. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  243. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  244. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  245. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  246. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  247. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  248. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  249. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/opaque.py +0 -0
  250. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  251. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  252. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  253. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  254. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  255. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  256. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  257. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  258. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  259. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  260. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  261. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  262. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  263. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  264. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  265. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  266. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  267. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  268. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  269. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  270. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  271. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  272. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  273. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  274. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  275. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  276. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  277. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  278. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  279. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  280. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/versions.py +0 -0
  281. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  282. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  283. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  284. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  285. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  286. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  287. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  288. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  289. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  290. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  291. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  292. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  293. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  294. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  295. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  296. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  297. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  298. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
  299. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  300. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  301. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  302. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  303. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  304. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  305. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  306. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  307. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  308. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  309. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  310. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  311. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  312. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  313. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  314. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  315. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  316. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  317. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  318. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  319. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  320. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/repo_relocation.py +0 -0
  321. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/__init__.py +0 -0
  322. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/_associate.py +0 -0
  323. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  324. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  325. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  326. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  327. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/configDump.py +0 -0
  328. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/configValidate.py +0 -0
  329. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/createRepo.py +0 -0
  330. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  331. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  332. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  333. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  334. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  335. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  336. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  337. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  338. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  339. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  340. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  341. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  342. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  343. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  344. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/__init__.py +0 -0
  345. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  346. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  347. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  348. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  349. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  350. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  351. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  352. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  353. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  354. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  355. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  356. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  357. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  358. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  359. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  360. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  361. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  362. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  363. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  364. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  365. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  366. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/server.py +0 -0
  367. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  368. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  369. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/time_utils.py +0 -0
  370. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  371. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  372. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/transfers/_context.py +0 -0
  373. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  374. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  375. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst/daf/butler/utils.py +0 -0
  376. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  377. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  378. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  379. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  380. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  381. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  382. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/setup.cfg +0 -0
  383. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_astropyTableFormatter.py +0 -0
  384. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_authentication.py +0 -0
  385. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_butler.py +0 -0
  386. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_butler_factory.py +0 -0
  387. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdAssociate.py +0 -0
  388. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdConfigDump.py +0 -0
  389. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdConfigValidate.py +0 -0
  390. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdCreate.py +0 -0
  391. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdImport.py +0 -0
  392. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdIngestFiles.py +0 -0
  393. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdPruneDatasets.py +0 -0
  394. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdQueryCollections.py +0 -0
  395. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdQueryDataIds.py +0 -0
  396. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  397. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdQueryDatasets.py +0 -0
  398. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  399. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdRemoveCollections.py +0 -0
  400. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdRemoveRuns.py +0 -0
  401. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  402. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliLog.py +0 -0
  403. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliPluginLoader.py +0 -0
  404. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliUtilSplitCommas.py +0 -0
  405. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliUtilSplitKv.py +0 -0
  406. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliUtilToUpper.py +0 -0
  407. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_cliUtils.py +0 -0
  408. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_column_spec.py +0 -0
  409. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_composites.py +0 -0
  410. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_config.py +0 -0
  411. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_connectionString.py +0 -0
  412. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_constraints.py +0 -0
  413. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_datasets.py +0 -0
  414. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_ddl.py +0 -0
  415. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_dimension_record_containers.py +0 -0
  416. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_dimensions.py +0 -0
  417. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_exprParserLex.py +0 -0
  418. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_exprParserYacc.py +0 -0
  419. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_expressions.py +0 -0
  420. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_formatter.py +0 -0
  421. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_gafaelfawr.py +0 -0
  422. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_location.py +0 -0
  423. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_logFormatter.py +0 -0
  424. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_logging.py +0 -0
  425. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_matplotlibFormatter.py +0 -0
  426. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_nonempty_mapping.py +0 -0
  427. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_normalFormExpression.py +0 -0
  428. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_obscore.py +0 -0
  429. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_packages.py +0 -0
  430. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_parquet.py +0 -0
  431. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_postgresql.py +0 -0
  432. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_progress.py +0 -0
  433. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_pydantic_utils.py +0 -0
  434. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_quantum.py +0 -0
  435. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_query_direct_postgresql.py +0 -0
  436. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_query_direct_sqlite.py +0 -0
  437. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_query_interface.py +0 -0
  438. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_query_relations.py +0 -0
  439. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_query_remote.py +0 -0
  440. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_query_utilities.py +0 -0
  441. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_remote_butler.py +0 -0
  442. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_server.py +0 -0
  443. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_simpleButler.py +0 -0
  444. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_sqlite.py +0 -0
  445. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_storageClass.py +0 -0
  446. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_templates.py +0 -0
  447. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_testRepo.py +0 -0
  448. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_thread_utils.py +0 -0
  449. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_time_utils.py +0 -0
  450. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_timespan.py +0 -0
  451. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_utils.py +0 -0
  452. {lsst_daf_butler-29.2025.3800 → lsst_daf_butler-29.2025.4000}/tests/test_versioning.py +0 -0
@@ -1,13 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.3800
3
+ Version: 29.2025.4000
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
- License: BSD 3-Clause License
6
+ License-Expression: BSD-3-Clause OR GPL-3.0-or-later
7
7
  Project-URL: Homepage, https://github.com/lsst/daf_butler
8
8
  Keywords: lsst
9
9
  Classifier: Intended Audience :: Science/Research
10
- Classifier: License :: OSI Approved :: BSD License
11
10
  Classifier: Operating System :: OS Independent
12
11
  Classifier: Programming Language :: Python :: 3
13
12
  Classifier: Programming Language :: Python :: 3.12
@@ -6,14 +6,14 @@ build-backend = "setuptools.build_meta"
6
6
  name = "lsst-daf-butler"
7
7
  requires-python = ">=3.11.0"
8
8
  description = "An abstraction layer for reading and writing astronomical data to datastores."
9
- license = {text = "BSD 3-Clause License"}
9
+ license = "BSD-3-Clause OR GPL-3.0-or-later"
10
+ license-files = ["COPYRIGHT", "LICENSE", "bsd_license.txt", "gpl-v3.0.txt"]
10
11
  readme = "README.md"
11
12
  authors = [
12
13
  {name="Rubin Observatory Data Management", email="dm-admin@lists.lsst.org"},
13
14
  ]
14
15
  classifiers = [
15
16
  "Intended Audience :: Science/Research",
16
- "License :: OSI Approved :: BSD License",
17
17
  "Operating System :: OS Independent",
18
18
  "Programming Language :: Python :: 3",
19
19
  "Programming Language :: Python :: 3.12",
@@ -74,7 +74,6 @@ where = ["python"]
74
74
 
75
75
  [tool.setuptools]
76
76
  zip-safe = true
77
- license-files = ["COPYRIGHT", "LICENSE", "bsd_license.txt", "gpl-v3.0.txt"]
78
77
 
79
78
  [tool.setuptools.package-data]
80
79
  "lsst.daf.butler" = ["py.typed", "configs/*.yaml", "configs/*/*.yaml", "tests/registry_data/*.yaml"]
@@ -614,6 +614,34 @@ class QuantumBackedButler(LimitedButler):
614
614
  datastore_records=provenance_records,
615
615
  )
616
616
 
617
+ def export_predicted_datastore_records(
618
+ self, refs: Iterable[DatasetRef]
619
+ ) -> dict[str, DatastoreRecordData]:
620
+ """Export datastore records for a set of predicted output dataset
621
+ references.
622
+
623
+ Parameters
624
+ ----------
625
+ refs : `~collections.abc.Iterable` [ `DatasetRef` ]
626
+ Dataset references for which to export datastore records. These
627
+ refs must be known to this butler.
628
+
629
+ Returns
630
+ -------
631
+ records : `dict` [ `str`, `DatastoreRecordData` ]
632
+ Predicted datastore records indexed by datastore name. No attempt
633
+ is made to ensure that the associated datasets exist on disk.
634
+ """
635
+ unknowns = [
636
+ ref
637
+ for ref in refs
638
+ if (ref.id not in self._predicted_outputs and ref.id not in self._predicted_inputs)
639
+ ]
640
+ if unknowns:
641
+ raise ValueError(f"Cannot export datastore records for unknown outputs: {unknowns}")
642
+
643
+ return self._datastore.export_predicted_records(refs)
644
+
617
645
 
618
646
  class QuantumProvenanceData(pydantic.BaseModel):
619
647
  """A serializable struct for per-quantum provenance information and
@@ -74,6 +74,7 @@ from typing import TYPE_CHECKING, Any, cast
74
74
  from unittest.mock import patch
75
75
 
76
76
  import click
77
+ import click.core
77
78
  import click.exceptions
78
79
  import click.testing
79
80
  import yaml
@@ -95,6 +96,11 @@ if _click_version >= Version("8.2.0"):
95
96
  else:
96
97
  _click_make_metavar_has_context = False
97
98
 
99
+ # Starting from Click 8.3.0, a special `UNSET` sentinel value is used to
100
+ # indicate the absence of a default value for a parameter. Prior to 8.3.0,
101
+ # they just used `None`.
102
+ _CLICK_UNSET_SENTINEL = getattr(click.core, "UNSET", None)
103
+
98
104
  log = logging.getLogger(__name__)
99
105
 
100
106
  # This is used as the metavar argument to Options that accept multiple string
@@ -554,7 +560,7 @@ def split_kv(
554
560
 
555
561
  if add_to_default:
556
562
  default = param.get_default(context)
557
- if default:
563
+ if default and default != _CLICK_UNSET_SENTINEL:
558
564
  vals = tuple(v for v in itertools.chain(default, vals)) # Convert to tuple for mypy
559
565
 
560
566
  ret: RetDict | RetTuple
@@ -1013,7 +1019,8 @@ class MWCommand(click.Command):
1013
1019
  captured_args.append(val)
1014
1020
  elif isinstance(param, click.Argument):
1015
1021
  param_name = cast(str, param.name)
1016
- if (opt := opts[param_name]) is not None:
1022
+ opt = opts[param_name]
1023
+ if opt is not None and opt != _CLICK_UNSET_SENTINEL:
1017
1024
  captured_args.append(opt)
1018
1025
  else:
1019
1026
  raise AssertionError("All parameters should be an Option or an Argument")
@@ -95,3 +95,4 @@ RegionTimeInfo: lsst.daf.butler.formatters.json.JsonFormatter
95
95
  QPEnsemble: lsst.meas.pz.qp_formatter.QPFormatter
96
96
  PZModel: lsst.meas.pz.model_formatter.ModelFormatter
97
97
  VisitBackgroundModel: lsst.daf.butler.formatters.json.JsonFormatter
98
+ VignettingCorrection: lsst.ts.observatory.control.utils.extras.vignetting_storage.VignettingCorrectionFormatter
@@ -428,3 +428,5 @@ storageClasses:
428
428
  pytype: rail.core.model.Model
429
429
  VisitBackgroundModel:
430
430
  pytype: lsst.drp.tasks.fit_visit_background.VisitBackgroundModel
431
+ VignettingCorrection:
432
+ pytype: lsst.ts.observatory.control.utils.extras.vignetting_correction.VignettingCorrection
@@ -1381,6 +1381,24 @@ class Datastore(FileTransferSource, metaclass=ABCMeta):
1381
1381
  """
1382
1382
  raise NotImplementedError()
1383
1383
 
1384
+ def export_predicted_records(self, refs: Iterable[DatasetRef]) -> dict[str, DatastoreRecordData]:
1385
+ """Export predicted datastore records and locations to an in-memory
1386
+ data structure.
1387
+
1388
+ Parameters
1389
+ ----------
1390
+ refs : `~collections.abc.Iterable` [ `DatasetRef` ]
1391
+ Datastore records that would be used if the given refs were to
1392
+ exist in this datastore. No attempt is made to determine if these
1393
+ datasets actually exist.
1394
+
1395
+ Returns
1396
+ -------
1397
+ data : `~collections.abc.Mapping` [ `str`, `DatastoreRecordData` ]
1398
+ Exported datastore records indexed by datastore name.
1399
+ """
1400
+ raise NotImplementedError()
1401
+
1384
1402
  def set_retrieve_dataset_type_method(self, method: Callable[[str], DatasetType | None] | None) -> None:
1385
1403
  """Specify a method that can be used by datastore to retrieve
1386
1404
  registry-defined dataset type.
@@ -1165,6 +1165,25 @@ class ChainedDatastore(Datastore):
1165
1165
 
1166
1166
  return all_records
1167
1167
 
1168
+ def export_predicted_records(self, refs: Iterable[DatasetRef]) -> dict[str, DatastoreRecordData]:
1169
+ # Docstring inherited from the base class.
1170
+
1171
+ all_records: dict[str, DatastoreRecordData] = {}
1172
+
1173
+ # Filter out datasets that this datastore is not allowed to contain.
1174
+ refs = [ref for ref in refs if self.constraints.isAcceptable(ref)]
1175
+
1176
+ # Merge all sub-datastore records into one structure
1177
+ for datastore in self.datastores:
1178
+ sub_records = datastore.export_predicted_records(refs)
1179
+ for name, record_data in sub_records.items():
1180
+ # All datastore names must be unique in a chain.
1181
+ if name in all_records:
1182
+ raise ValueError("Non-unique datastore name found in datastore {datastore}")
1183
+ all_records[name] = record_data
1184
+
1185
+ return all_records
1186
+
1168
1187
  def export(
1169
1188
  self,
1170
1189
  refs: Iterable[DatasetRef],
@@ -3188,6 +3188,24 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
3188
3188
  record_data = DatastoreRecordData(records=records)
3189
3189
  return {self.name: record_data}
3190
3190
 
3191
+ def export_predicted_records(self, refs: Iterable[DatasetRef]) -> dict[str, DatastoreRecordData]:
3192
+ # Docstring inherited from the base class.
3193
+ refs = [self._cast_storage_class(ref) for ref in refs]
3194
+ records: dict[DatasetId, dict[str, list[StoredDatastoreItemInfo]]] = {}
3195
+ for ref in refs:
3196
+ if not self.constraints.isAcceptable(ref):
3197
+ continue
3198
+ fileLocations = self._get_expected_dataset_locations_info(ref)
3199
+ if not fileLocations:
3200
+ continue
3201
+ dataset_records = records.setdefault(ref.id, {})
3202
+ dataset_records.setdefault(self._table.name, [])
3203
+ for _, storedFileInfo in fileLocations:
3204
+ dataset_records[self._table.name].append(storedFileInfo)
3205
+
3206
+ record_data = DatastoreRecordData(records=records)
3207
+ return {self.name: record_data}
3208
+
3191
3209
  def set_retrieve_dataset_type_method(self, method: Callable[[str], DatasetType | None] | None) -> None:
3192
3210
  # Docstring inherited from the base class.
3193
3211
  self._retrieve_dataset_method = method
@@ -763,6 +763,12 @@ class InMemoryDatastore(GenericBaseDatastore[StoredMemoryItemInfo]):
763
763
  # In-memory Datastore records cannot be exported or imported
764
764
  return {}
765
765
 
766
+ def export_predicted_records(self, refs: Iterable[DatasetIdRef]) -> dict[str, DatastoreRecordData]:
767
+ # Docstring inherited from the base class.
768
+
769
+ # In-memory Datastore records cannot be exported or imported
770
+ return {}
771
+
766
772
  def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
767
773
  # Docstring inherited from the base class.
768
774
  return {}
@@ -204,8 +204,6 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
204
204
  return result
205
205
 
206
206
  def visitIdentifier(self, name: str, node: Node) -> _VisitorResult:
207
- name = name.lower()
208
-
209
207
  if name in self.context.bind:
210
208
  value = self.context.bind[name]
211
209
  # Lists of values do not have a direct representation in the new
@@ -242,7 +240,6 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
242
240
  return _ColExpr(column_expression)
243
241
 
244
242
  def visitBind(self, name: str, node: Node) -> _VisitorResult:
245
- name = name.lower()
246
243
  if name not in self.context.bind:
247
244
  raise InvalidQueryError("Name {name!r} is not in the bind map.")
248
245
  # Logic in visitIdentifier handles binds.
@@ -71,8 +71,7 @@ class IdentifierContext: # numpydoc ignore=PR01
71
71
  if bind is None:
72
72
  self.bind = {}
73
73
  else:
74
- # Make bind names case-insensitive.
75
- self.bind = {k.lower(): v for k, v in bind.items()}
74
+ self.bind = dict(bind)
76
75
  if len(self.bind.keys()) != len(bind.keys()):
77
76
  raise ValueError(f"Duplicate keys present in bind: {bind.keys()}")
78
77
 
@@ -96,9 +95,6 @@ def interpret_identifier(context: IdentifierContext, identifier: str) -> ColumnE
96
95
  dimensions = context.dimensions
97
96
  datasets = context.datasets
98
97
  bind = context.bind
99
- # Make identifiers case-insensitive.
100
- identifier = identifier.lower()
101
-
102
98
  if identifier in bind:
103
99
  return make_column_literal(bind[identifier])
104
100
  terms = identifier.split(".")
@@ -110,7 +110,7 @@ def is_dataset_field(s: str) -> TypeGuard[DatasetFieldName]:
110
110
  class QueryTreeBase(pydantic.BaseModel):
111
111
  """Base class for all non-primitive types in a query tree."""
112
112
 
113
- model_config = pydantic.ConfigDict(frozen=True, extra="forbid", strict=True)
113
+ model_config = pydantic.ConfigDict(frozen=True, strict=True)
114
114
 
115
115
 
116
116
  class ColumnExpressionBase(QueryTreeBase, ABC):
@@ -29,6 +29,8 @@ from typing import Annotated
29
29
 
30
30
  from fastapi import Depends, Header, HTTPException
31
31
  from safir.dependencies.gafaelfawr import auth_delegated_token_dependency
32
+ from safir.dependencies.logger import logger_dependency as safir_logger_dependency
33
+ from structlog.stdlib import BoundLogger
32
34
 
33
35
  from lsst.daf.butler import LabeledButlerFactory
34
36
 
@@ -117,6 +119,31 @@ async def repository_authorization_dependency(
117
119
  )
118
120
 
119
121
 
122
+ async def logger_dependency(
123
+ logger: Annotated[BoundLogger, Depends(safir_logger_dependency)],
124
+ repository: str,
125
+ user_name: Annotated[str | None, Depends(user_name_dependency)],
126
+ x_auth_request_service: Annotated[str | None, Header()] = None,
127
+ ) -> BoundLogger:
128
+ """Return a logger with additional bound context information.
129
+
130
+ Parameters
131
+ ----------
132
+ logger : `structlog.stdlib.BoundLogger`
133
+ Logger provided by Safir.
134
+ repository : `str`
135
+ Butler repository that is being accessed.
136
+ user_name : `str` or `None`
137
+ Name of the user accessing the repository, from Gafaelfawr headers.
138
+ x_auth_request_service : `str` or `None`
139
+ Name of the service being used to access the repository, from
140
+ Gafaelfawr headers.
141
+ """
142
+ return logger.bind(
143
+ butler_repo=repository, requester={"username": user_name, "service": x_auth_request_service}
144
+ )
145
+
146
+
120
147
  async def factory_dependency(
121
148
  repository: str,
122
149
  butler_factory: Annotated[LabeledButlerFactory, Depends(butler_factory_dependency)],
@@ -30,10 +30,11 @@ from __future__ import annotations
30
30
  __all__ = ()
31
31
 
32
32
  import uuid
33
- from typing import Any
33
+ from typing import Annotated, Any
34
34
 
35
35
  from fastapi import APIRouter, Depends, HTTPException, Request
36
36
  from fastapi.responses import RedirectResponse
37
+ from structlog.stdlib import BoundLogger
37
38
 
38
39
  from ...._butler import Butler
39
40
  from ...._collection_type import CollectionType
@@ -64,7 +65,7 @@ from ...server_models import (
64
65
  QueryDatasetTypesResponseModel,
65
66
  )
66
67
  from .._config import load_config
67
- from .._dependencies import factory_dependency
68
+ from .._dependencies import factory_dependency, logger_dependency
68
69
  from .._factory import Factory
69
70
  from ._file_info import get_file_info_payload
70
71
  from ._utils import generate_file_download_uri, set_default_data_id
@@ -184,12 +185,14 @@ def expand_data_id(
184
185
  )
185
186
  def get_file(
186
187
  dataset_id: uuid.UUID,
188
+ logger: Annotated[BoundLogger, Depends(logger_dependency)],
187
189
  factory: Factory = Depends(factory_dependency),
188
190
  ) -> GetFileResponseModel:
189
191
  butler = factory.create_butler()
190
192
  ref = butler.get_dataset(dataset_id, datastore_records=True)
191
193
  if ref is None:
192
194
  raise DatasetNotFoundError(f"Dataset ID {dataset_id} not found")
195
+ _log_file_access(logger, ref, "uuid")
193
196
  return _get_file_info_response(butler, ref)
194
197
 
195
198
 
@@ -200,6 +203,7 @@ def get_file(
200
203
  )
201
204
  def get_file_by_data_id(
202
205
  request: GetFileByDataIdRequestModel,
206
+ logger: Annotated[BoundLogger, Depends(logger_dependency)],
203
207
  factory: Factory = Depends(factory_dependency),
204
208
  ) -> GetFileResponseModel:
205
209
  butler = factory.create_butler()
@@ -211,6 +215,7 @@ def get_file_by_data_id(
211
215
  datastore_records=True,
212
216
  timespan=request.timespan,
213
217
  )
218
+ _log_file_access(logger, ref, "data-id")
214
219
  return _get_file_info_response(butler, ref)
215
220
 
216
221
 
@@ -220,12 +225,21 @@ def _get_file_info_response(butler: Butler, ref: DatasetRef) -> GetFileResponseM
220
225
  )
221
226
 
222
227
 
228
+ def _log_file_access(logger: BoundLogger, ref: DatasetRef, access_method: str) -> None:
229
+ logger.info(
230
+ "file-access",
231
+ dataset={"uuid": str(ref.id), "type": ref.datasetType.name, "data_id": dict(ref.dataId.required)},
232
+ file_access_endpoint=access_method,
233
+ )
234
+
235
+
223
236
  @external_router.get(
224
237
  "/v1/dataset/{dataset_id}/download",
225
238
  summary="Return an HTTP redirect to a location where you can download the artifact file for the dataset.",
226
239
  )
227
240
  def redirect_to_dataset_download(
228
241
  dataset_id: uuid.UUID,
242
+ logger: Annotated[BoundLogger, Depends(logger_dependency)],
229
243
  component: str | None = None,
230
244
  factory: Factory = Depends(factory_dependency),
231
245
  ) -> RedirectResponse:
@@ -245,6 +259,7 @@ def redirect_to_dataset_download(
245
259
  # files, and you must specify the component to pick which one you want
246
260
  # to download.
247
261
  if info.datastoreRecords.component == component:
262
+ _log_file_access(logger, ref, "uuid-redirect")
248
263
  return RedirectResponse(status_code=307, url=str(info.url))
249
264
 
250
265
  found_components = [info.datastoreRecords.component for info in payload.file_info]
@@ -46,6 +46,7 @@ from lsst.resources import ResourcePathExpression
46
46
  from .. import Butler, ButlerConfig, Config, DatasetRef, StorageClassFactory, Timespan
47
47
  from .._collection_type import CollectionType
48
48
  from ..datastore import NullDatastore
49
+ from ..dimensions import DimensionConfig
49
50
  from ..direct_butler import DirectButler
50
51
  from ..registry.sql_registry import RegistryConfig, SqlRegistry
51
52
  from ..tests import MetricsExample, addDatasetType
@@ -130,7 +131,9 @@ def safeTestTempDir(default_base: str) -> Iterator[str]:
130
131
 
131
132
 
132
133
  def create_populated_sqlite_registry(
133
- *args: ResourcePathExpression, registry_config: RegistryConfig | None = None
134
+ *args: ResourcePathExpression,
135
+ registry_config: RegistryConfig | None = None,
136
+ dimension_config: DimensionConfig | None = None,
134
137
  ) -> Butler:
135
138
  """Create an in-memory registry-only sqlite butler and populate it.
136
139
 
@@ -141,6 +144,8 @@ def create_populated_sqlite_registry(
141
144
  registry_config : ``RegistryConfig``, optional
142
145
  Registry configuration to use as the basis for the Butler
143
146
  configuration.
147
+ dimension_config : ``DimensionConfig``, optional
148
+ Dimension universe configuration.
144
149
 
145
150
  Returns
146
151
  -------
@@ -151,7 +156,7 @@ def create_populated_sqlite_registry(
151
156
  if registry_config is not None:
152
157
  config["registry"] = registry_config
153
158
  config[".registry.db"] = "sqlite://"
154
- registry = SqlRegistry.createFromConfig(config["registry"])
159
+ registry = SqlRegistry.createFromConfig(config["registry"], dimension_config)
155
160
  butler = DirectButler(
156
161
  config=config,
157
162
  registry=registry,
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.4000"
@@ -1,13 +1,12 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.3800
3
+ Version: 29.2025.4000
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
- License: BSD 3-Clause License
6
+ License-Expression: BSD-3-Clause OR GPL-3.0-or-later
7
7
  Project-URL: Homepage, https://github.com/lsst/daf_butler
8
8
  Keywords: lsst
9
9
  Classifier: Intended Audience :: Science/Research
10
- Classifier: License :: OSI Approved :: BSD License
11
10
  Classifier: Operating System :: OS Independent
12
11
  Classifier: Programming Language :: Python :: 3
13
12
  Classifier: Programming Language :: Python :: 3.12
@@ -988,6 +988,30 @@ class DatastoreTests(DatastoreTestsBase):
988
988
  data = datastore2.get(refs[2])
989
989
  self.assertIsNotNone(data)
990
990
 
991
+ def testExportPredictedRecords(self):
992
+ if self.isEphemeral:
993
+ raise unittest.SkipTest("in-memory datastore does not support record export/import")
994
+ sc = self.storageClassFactory.getStorageClass("ThingOne")
995
+ dimensions = self.universe.conform(("visit", "physical_filter"))
996
+ dataId = {
997
+ "instrument": "dummy",
998
+ "visit": 52,
999
+ "physical_filter": "V",
1000
+ "band": "v",
1001
+ "day_obs": 20250101,
1002
+ }
1003
+ ref = self.makeDatasetRef("metric", dimensions, sc, dataId)
1004
+
1005
+ datastore = self.makeDatastore("test_datastore")
1006
+ names = {n for n in datastore.names if not n.startswith("InMemory")}
1007
+ records = datastore.export_predicted_records([ref])
1008
+
1009
+ # Expect predicted records from all datastores.
1010
+ self.assertEqual(set(records.keys()), names)
1011
+
1012
+ for record_data in records.values():
1013
+ self.assertEqual(len(record_data.records), 1)
1014
+
991
1015
  def testExport(self) -> None:
992
1016
  datastore, refs = self._populate_export_datastore("test_datastore")
993
1017
 
@@ -1414,6 +1438,7 @@ class ChainedDatastoreMemoryTestCase(InMemoryDatastoreTestCase):
1414
1438
 
1415
1439
  configFile = os.path.join(TESTDIR, "config/basic/chainedDatastore2.yaml")
1416
1440
  validationCanFail = False
1441
+ isEphemeral = True
1417
1442
 
1418
1443
 
1419
1444
  class DatastoreConstraintsTests(DatastoreTestsBase):
@@ -2124,6 +2149,8 @@ class NullDatastoreTestCase(DatasetTestHelper, unittest.TestCase):
2124
2149
  null.import_records({})
2125
2150
  with self.assertRaises(NotImplementedError):
2126
2151
  null.export_records([])
2152
+ with self.assertRaises(NotImplementedError):
2153
+ null.export_predicted_records([])
2127
2154
  with self.assertRaises(NotImplementedError):
2128
2155
  null.export([ref])
2129
2156
  with self.assertRaises(NotImplementedError):
@@ -416,6 +416,19 @@ class QuantumBackedButlerTestCase(unittest.TestCase):
416
416
  for dataset_data in datastore_records.records[class_name].values():
417
417
  self.assertEqual(set(dataset_data), {table_name})
418
418
 
419
+ def test_export_predicted_datastore_records(self) -> None:
420
+ """Test for export_predicted_datastore_records method"""
421
+ quantum = self.make_quantum()
422
+ qbb = QuantumBackedButler.initialize(
423
+ config=self.config, quantum=quantum, dimensions=self.universe, dataset_types=self.dataset_types
424
+ )
425
+
426
+ records = qbb.export_predicted_datastore_records(self.output_refs)
427
+ self.assertEqual(len(records["FileDatastore@<butlerRoot>/datastore"].records), len(self.output_refs))
428
+
429
+ with self.assertRaises(ValueError):
430
+ qbb.export_predicted_datastore_records(self.missing_refs)
431
+
419
432
  def test_collect_and_transfer(self) -> None:
420
433
  """Test for collect_and_transfer method"""
421
434
  quantum1 = self.make_quantum(1)
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.3800"