lsst-daf-butler 29.2025.4200__tar.gz → 29.2025.4400__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.4200/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4400}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_association.py +13 -4
  3. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_registry_shim.py +8 -2
  4. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
  5. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/storageClasses.yaml +7 -0
  6. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/fileDatastore.py +2 -2
  7. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_butler/_direct_butler.py +2 -2
  8. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/json.py +2 -2
  9. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_registry.py +39 -20
  10. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +64 -15
  11. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_datasets.py +21 -1
  12. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_common.py +3 -0
  13. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_datasets.py +7 -1
  14. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/sql_registry.py +39 -15
  15. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/tests/_registry.py +27 -6
  16. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_registry.py +4 -0
  17. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +5 -4
  18. lsst_daf_butler-29.2025.4400/python/lsst/daf/butler/version.py +2 -0
  19. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  20. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/version.py +0 -2
  21. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/COPYRIGHT +0 -0
  22. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/LICENSE +0 -0
  23. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/MANIFEST.in +0 -0
  24. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/README.md +0 -0
  25. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/bsd_license.txt +0 -0
  26. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  27. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  28. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/configuring.rst +0 -0
  29. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/datastores.rst +0 -0
  30. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/dimensions.rst +0 -0
  31. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/formatters.rst +0 -0
  32. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/index.rst +0 -0
  33. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/organizing.rst +0 -0
  34. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/queries.rst +0 -0
  35. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  36. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  37. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/gpl-v3.0.txt +0 -0
  38. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/pyproject.toml +0 -0
  39. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/__init__.py +0 -0
  40. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/__init__.py +0 -0
  41. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/__init__.py +0 -0
  42. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler.py +0 -0
  43. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_collections.py +0 -0
  44. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_config.py +0 -0
  45. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  46. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  47. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  48. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_collection_type.py +0 -0
  49. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_column_categorization.py +0 -0
  50. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_column_tags.py +0 -0
  51. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_column_type_info.py +0 -0
  52. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_config.py +0 -0
  53. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_config_support.py +0 -0
  54. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  55. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  56. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  57. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_dataset_type.py +0 -0
  58. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  59. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_exceptions.py +0 -0
  60. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  61. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_file_dataset.py +0 -0
  62. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  63. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_formatter.py +0 -0
  64. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  65. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_limited_butler.py +0 -0
  66. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_location.py +0 -0
  67. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_named.py +0 -0
  68. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_quantum.py +0 -0
  69. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  70. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  71. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
  72. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  73. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  74. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_storage_class.py +0 -0
  75. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  76. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_timespan.py +0 -0
  77. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_topology.py +0 -0
  78. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  79. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  80. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  81. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  82. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/_uuid.py +0 -0
  83. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/arrow_utils.py +0 -0
  84. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/__init__.py +0 -0
  85. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/butler.py +0 -0
  86. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  87. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  88. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  89. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  90. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  91. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  92. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  93. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  94. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  95. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/progress.py +0 -0
  96. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/cli/utils.py +0 -0
  97. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/column_spec.py +0 -0
  98. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  99. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  100. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  101. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  102. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  103. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  104. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  105. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  106. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  107. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  108. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  109. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  110. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  111. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  112. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  113. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  114. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  115. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  116. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  117. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/composites.py +0 -0
  118. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  119. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  120. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  121. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  122. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  123. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  124. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  125. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  126. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  127. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  128. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  129. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  130. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/ddl.py +0 -0
  131. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  132. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  133. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  134. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  135. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  136. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  137. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  138. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  139. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  140. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  141. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  142. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  143. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  144. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  145. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  146. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  147. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  148. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  149. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  150. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  151. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  152. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  153. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  154. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  155. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  156. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  157. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  158. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  159. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  160. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  161. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  162. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/file.py +0 -0
  163. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/json.py +0 -0
  164. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/logs.py +0 -0
  165. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  166. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/packages.py +0 -0
  167. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  168. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  169. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  170. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  171. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/logging.py +0 -0
  172. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/mapping_factory.py +0 -0
  173. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/name_shrinker.py +0 -0
  174. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  175. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/persistence_context.py +0 -0
  176. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/progress.py +0 -0
  177. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/py.typed +0 -0
  178. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  179. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/__init__.py +0 -0
  180. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_base.py +0 -0
  181. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  182. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  183. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  184. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  185. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  186. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  187. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/_query.py +0 -0
  188. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  189. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/driver.py +0 -0
  190. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  191. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  192. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  193. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  194. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  195. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  196. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  197. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  198. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  199. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  200. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  201. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  202. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/queries/visitors.py +0 -0
  203. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/__init__.py +0 -0
  204. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  205. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  206. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  207. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  208. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_config.py +0 -0
  209. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  210. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  211. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
  212. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  213. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/attributes.py +0 -0
  214. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  215. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  216. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  217. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  218. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  219. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  220. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  221. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  222. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  223. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  224. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  225. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  226. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  228. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  229. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  230. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  231. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  232. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  233. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  234. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  235. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  236. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  237. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  238. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  239. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  240. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  241. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  242. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/managers.py +0 -0
  243. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  244. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  245. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  246. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  247. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  248. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  249. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  250. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  251. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  252. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/opaque.py +0 -0
  253. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  254. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  255. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  256. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
  257. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
  258. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  259. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  260. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  261. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  262. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  263. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  264. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  265. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  266. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  267. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  268. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  269. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  270. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  271. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  272. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  273. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  274. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  275. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  276. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  277. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  278. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  279. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  280. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/versions.py +0 -0
  281. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  282. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  283. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  284. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  285. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  286. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  287. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  288. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  289. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  290. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  291. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  292. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  293. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  294. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  295. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  296. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  297. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
  298. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  299. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  300. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  301. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  302. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  303. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  304. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  305. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  306. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  307. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  308. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  309. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  310. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  311. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  312. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  313. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  314. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  315. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  316. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  317. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/repo_relocation.py +0 -0
  318. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/__init__.py +0 -0
  319. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/_associate.py +0 -0
  320. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  321. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  322. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  323. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  324. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/configDump.py +0 -0
  325. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/configValidate.py +0 -0
  326. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/createRepo.py +0 -0
  327. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  328. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  329. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  330. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  331. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  332. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  333. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  334. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  335. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  336. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  337. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  338. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  339. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  340. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  341. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/__init__.py +0 -0
  342. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  343. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  344. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  345. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  346. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  347. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  348. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  349. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  350. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  351. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  352. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  353. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  354. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  355. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  356. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  357. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  358. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  359. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  360. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  361. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  362. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/server.py +0 -0
  363. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/server_available.py +0 -0
  364. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  365. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  366. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/tests/utils.py +0 -0
  367. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/time_utils.py +0 -0
  368. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  369. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  370. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/_context.py +0 -0
  371. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  372. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  373. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst/daf/butler/utils.py +0 -0
  374. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  375. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  376. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  377. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  378. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  379. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  380. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/setup.cfg +0 -0
  381. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_astropyTableFormatter.py +0 -0
  382. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_authentication.py +0 -0
  383. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_butler.py +0 -0
  384. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_butler_factory.py +0 -0
  385. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdAssociate.py +0 -0
  386. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdConfigDump.py +0 -0
  387. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdConfigValidate.py +0 -0
  388. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdCreate.py +0 -0
  389. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdImport.py +0 -0
  390. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdIngestFiles.py +0 -0
  391. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdPruneDatasets.py +0 -0
  392. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryCollections.py +0 -0
  393. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDataIds.py +0 -0
  394. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  395. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDatasets.py +0 -0
  396. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  397. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdRemoveCollections.py +0 -0
  398. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdRemoveRuns.py +0 -0
  399. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  400. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliLog.py +0 -0
  401. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliPluginLoader.py +0 -0
  402. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtilSplitCommas.py +0 -0
  403. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtilSplitKv.py +0 -0
  404. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtilToUpper.py +0 -0
  405. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_cliUtils.py +0 -0
  406. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_column_spec.py +0 -0
  407. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_composites.py +0 -0
  408. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_config.py +0 -0
  409. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_connectionString.py +0 -0
  410. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_constraints.py +0 -0
  411. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_datasets.py +0 -0
  412. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_datastore.py +0 -0
  413. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_ddl.py +0 -0
  414. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_dimension_record_containers.py +0 -0
  415. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_dimensions.py +0 -0
  416. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_exprParserLex.py +0 -0
  417. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_exprParserYacc.py +0 -0
  418. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_expressions.py +0 -0
  419. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_formatter.py +0 -0
  420. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_gafaelfawr.py +0 -0
  421. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_location.py +0 -0
  422. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_logFormatter.py +0 -0
  423. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_logging.py +0 -0
  424. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_matplotlibFormatter.py +0 -0
  425. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_nonempty_mapping.py +0 -0
  426. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_normalFormExpression.py +0 -0
  427. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_obscore.py +0 -0
  428. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_packages.py +0 -0
  429. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_parquet.py +0 -0
  430. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_postgresql.py +0 -0
  431. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_progress.py +0 -0
  432. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_pydantic_utils.py +0 -0
  433. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_quantum.py +0 -0
  434. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_quantumBackedButler.py +0 -0
  435. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_direct_postgresql.py +0 -0
  436. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_direct_sqlite.py +0 -0
  437. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_interface.py +0 -0
  438. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_remote.py +0 -0
  439. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_query_utilities.py +0 -0
  440. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_remote_butler.py +0 -0
  441. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_server.py +0 -0
  442. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_simpleButler.py +0 -0
  443. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_sqlite.py +0 -0
  444. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_storageClass.py +0 -0
  445. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_templates.py +0 -0
  446. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_testRepo.py +0 -0
  447. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_thread_utils.py +0 -0
  448. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_time_utils.py +0 -0
  449. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_timespan.py +0 -0
  450. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_utils.py +0 -0
  451. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/tests/test_uuid.py +0 -0
  452. {lsst_daf_butler-29.2025.4200 → lsst_daf_butler-29.2025.4400}/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.4200
3
+ Version: 29.2025.4400
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License-Expression: BSD-3-Clause OR GPL-3.0-or-later
@@ -71,7 +71,7 @@ class DatasetAssociation:
71
71
  cls,
72
72
  result: GeneralQueryResults,
73
73
  dataset_type: DatasetType,
74
- collection_info: Mapping[str, CollectionInfo],
74
+ collection_info: Mapping[str, CollectionInfo] | None = None,
75
75
  ) -> Iterator[DatasetAssociation]:
76
76
  """Construct dataset associations from the result of general query.
77
77
 
@@ -84,16 +84,25 @@ class DatasetAssociation:
84
84
  "timespan" dataset fields for ``dataset_type``.
85
85
  dataset_type : `DatasetType`
86
86
  Dataset type, query has to include this dataset type.
87
- collection_info : `~collections.abc.Mapping` [`str`, `CollectionInfo`]
87
+ collection_info : `~collections.abc.Mapping` \
88
+ [`str`, `CollectionInfo`], optional
88
89
  Mapping from collection name to information about it for all
89
- collections that may appear in the query results.
90
+ collections that may appear in the query results. If not provided,
91
+ timespans for `~CollectionType.RUN` and `~CollectionType.TAGGED`
92
+ collections will be bounded, instead of `None`; this is actually
93
+ more consistent with how those timespans are used elsewhere in the
94
+ query system, but is a change from how `DatasetAssocation` has
95
+ historically worked.
90
96
  """
91
97
  timespan_key = f"{dataset_type.name}.timespan"
92
98
  collection_key = f"{dataset_type.name}.collection"
93
99
  for _, refs, row_dict in result.iter_tuples(dataset_type):
94
100
  collection = row_dict[collection_key]
95
101
  timespan = row_dict[timespan_key]
96
- if collection_info[collection].type is not CollectionType.CALIBRATION:
102
+ if (
103
+ collection_info is not None
104
+ and collection_info[collection].type is not CollectionType.CALIBRATION
105
+ ):
97
106
  # This behavior is for backwards compatibility only; in most
98
107
  # contexts it makes sense to consider the timespan of a RUN
99
108
  # or TAGGED collection to be unbounded, not None, and that's
@@ -266,14 +266,20 @@ class RegistryShim(RegistryBase):
266
266
  # Docstring inherited from a base class.
267
267
  return self._registry.insertDatasets(datasetType, dataIds, run, expand, idGenerationMode)
268
268
 
269
- def _importDatasets(self, datasets: Iterable[DatasetRef], expand: bool = True) -> list[DatasetRef]:
269
+ def _importDatasets(
270
+ self, datasets: Iterable[DatasetRef], expand: bool = True, assume_new: bool = False
271
+ ) -> list[DatasetRef]:
270
272
  # Docstring inherited from a base class.
271
- return self._registry._importDatasets(datasets, expand)
273
+ return self._registry._importDatasets(datasets, expand, assume_new)
272
274
 
273
275
  def getDataset(self, id: DatasetId) -> DatasetRef | None:
274
276
  # Docstring inherited from a base class.
275
277
  return self._registry.getDataset(id)
276
278
 
279
+ def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
280
+ # Docstring inherited.
281
+ return self._registry._fetch_run_dataset_ids(run)
282
+
277
283
  def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
278
284
  # Docstring inherited from a base class.
279
285
  self._registry.removeDatasets(refs)
@@ -87,6 +87,7 @@ SpectractorSpectrum: lsst.atmospec.formatters.SpectractorSpectrumFormatter
87
87
  SpectractorImage: lsst.atmospec.formatters.SpectractorImageFormatter
88
88
  SpectractorFitParameters: lsst.atmospec.formatters.SpectractorFitParametersFormatter
89
89
  ScarletModelData: lsst.meas.extensions.scarlet.io.ScarletModelFormatter
90
+ LsstScarletModelData: lsst.meas.extensions.scarlet.io.ScarletModelFormatter
90
91
  MetricMeasurementBundle: lsst.daf.butler.formatters.json.JsonFormatter
91
92
  MultipleCellCoadd: lsst.cell_coadds.CellCoaddFitsFormatter
92
93
  NNModelPackagePayload: lsst.meas.transiNet.modelPackages.NNModelPackageFormatter
@@ -412,6 +412,13 @@ storageClasses:
412
412
  parameters:
413
413
  - blend_id
414
414
  delegate: lsst.meas.extensions.scarlet.io.ScarletModelDelegate
415
+ LsstScarletModelData:
416
+ pytype: lsst.meas.extensions.scarlet.io.LsstScarletModelData
417
+ converters:
418
+ lsst.scarlet.lite.io.model_data.ScarletModelData: lsst.meas.extensions.scarlet.io.utils.scarlet_model_to_lsst_scarlet_model
419
+ parameters:
420
+ - blend_id
421
+ delegate: lsst.meas.extensions.scarlet.io.ScarletModelDelegate
415
422
  MetricMeasurementBundle:
416
423
  pytype: lsst.analysis.tools.interfaces.MetricMeasurementBundle
417
424
  MultipleCellCoadd:
@@ -1874,7 +1874,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
1874
1874
 
1875
1875
  # Have to handle trustGetRequest mode by checking for the existence
1876
1876
  # of the missing refs on disk.
1877
- if missing_refs:
1877
+ if missing_refs and not predict:
1878
1878
  dataset_existence = self._mexists_check_expected(missing_refs, None)
1879
1879
  really_missing = set()
1880
1880
  not_missing = set()
@@ -3218,7 +3218,7 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
3218
3218
  return ref
3219
3219
  dataset_type = self._retrieve_dataset_method(ref.datasetType.name)
3220
3220
  if dataset_type is not None:
3221
- ref = ref.overrideStorageClass(dataset_type.storageClass)
3221
+ ref = ref.overrideStorageClass(dataset_type.storageClass_name)
3222
3222
  return ref
3223
3223
 
3224
3224
  def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
@@ -2107,7 +2107,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
2107
2107
  dry_run: bool = False,
2108
2108
  ) -> _ImportDatasetsInfo:
2109
2109
  # Docstring inherited.
2110
- if not self.isWriteable():
2110
+ if not self.isWriteable() and not dry_run:
2111
2111
  raise TypeError("Butler is read-only.")
2112
2112
 
2113
2113
  # Will iterate through the refs multiple times so need to convert
@@ -2312,7 +2312,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
2312
2312
  ) -> collections.abc.Collection[DatasetRef]:
2313
2313
  # Docstring inherited.
2314
2314
  source_refs = list(source_refs)
2315
- if not self.isWriteable():
2315
+ if not self.isWriteable() and not dry_run:
2316
2316
  raise TypeError("Butler is read-only.")
2317
2317
 
2318
2318
  progress = Progress("lsst.daf.butler.Butler.transfer_from", level=VERBOSE)
@@ -68,7 +68,7 @@ def to_json_pydantic(self: SupportsSimple, minimal: bool = False) -> str:
68
68
 
69
69
  def from_json_pydantic(
70
70
  cls_: type[SupportsSimple],
71
- json_str: str,
71
+ json_str: str | bytes | bytearray,
72
72
  universe: DimensionUniverse | None = None,
73
73
  registry: Registry | None = None,
74
74
  ) -> SupportsSimple:
@@ -78,7 +78,7 @@ def from_json_pydantic(
78
78
  ----------
79
79
  cls_ : `type` of `SupportsSimple`
80
80
  The Python type being created.
81
- json_str : `str`
81
+ json_str : `str` or `bytes` or `bytearray`
82
82
  The JSON string representing this object.
83
83
  universe : `DimensionUniverse` or `None`, optional
84
84
  The universe required to instantiate some models. Required if
@@ -631,57 +631,55 @@ class Registry(ABC):
631
631
  self,
632
632
  datasets: Iterable[DatasetRef],
633
633
  expand: bool = True,
634
+ assume_new: bool = False,
634
635
  ) -> list[DatasetRef]:
635
636
  """Import one or more datasets into the `Registry`.
636
637
 
637
- Difference from `insertDatasets` method is that this method accepts
638
- `DatasetRef` instances which should already be resolved and have a
639
- dataset ID. If registry supports globally-unique dataset IDs (e.g.
640
- `uuid.UUID`) then datasets which already exist in the registry will be
641
- ignored if imported again.
638
+ This differs from `insertDatasets` method in that this method accepts
639
+ `DatasetRef` instances, which already have a dataset ID.
642
640
 
643
641
  Parameters
644
642
  ----------
645
643
  datasets : `~collections.abc.Iterable` of `DatasetRef`
646
644
  Datasets to be inserted. All `DatasetRef` instances must have
647
- identical ``datasetType`` and ``run`` attributes. ``run``
645
+ identical ``run`` attributes. ``run``
648
646
  attribute can be `None` and defaults to ``self.defaults.run``.
649
647
  Datasets can specify ``id`` attribute which will be used for
650
- inserted datasets. All dataset IDs must have the same type
651
- (`int` or `uuid.UUID`), if type of dataset IDs does not match
652
- configured backend then IDs will be ignored and new IDs will be
653
- generated by backend.
648
+ inserted datasets.
649
+ Datasets can be of multiple dataset types, but all the dataset
650
+ types must have the same set of dimensions.
654
651
  expand : `bool`, optional
655
652
  If `True` (default), expand data IDs as they are inserted. This is
656
653
  necessary in general, but it may be disabled if the caller can
657
654
  guarantee this is unnecessary.
655
+ assume_new : `bool`, optional
656
+ If `True`, assume datasets are new. If `False`, datasets that are
657
+ identical to an existing one are ignored.
658
658
 
659
659
  Returns
660
660
  -------
661
661
  refs : `list` of `DatasetRef`
662
- Resolved `DatasetRef` instances for all given data IDs (in the same
663
- order). If any of ``datasets`` has an ID which already exists in
664
- the database then it will not be inserted or updated, but a
665
- resolved `DatasetRef` will be returned for it in any case.
662
+ `DatasetRef` instances for all given data IDs (in the same order).
663
+ If any of ``datasets`` has an ID which already exists in the
664
+ database then it will not be inserted or updated, but a
665
+ `DatasetRef` will be returned for it in any case.
666
666
 
667
667
  Raises
668
668
  ------
669
669
  lsst.daf.butler.registry.NoDefaultCollectionError
670
670
  Raised if ``run`` is `None` and ``self.defaults.run`` is `None`.
671
671
  lsst.daf.butler.registry.DatasetTypeError
672
- Raised if datasets correspond to more than one dataset type or
673
- dataset type is not known to registry.
672
+ Raised if a dataset type is not known to registry.
674
673
  lsst.daf.butler.registry.ConflictingDefinitionError
675
674
  If a dataset with the same dataset type and data ID as one of those
676
- given already exists in ``run``.
675
+ given already exists in ``run``, or if ``assume_new=True`` and at
676
+ least one dataset is not new.
677
677
  lsst.daf.butler.registry.MissingCollectionError
678
678
  Raised if ``run`` does not exist in the registry.
679
679
 
680
680
  Notes
681
681
  -----
682
- This method is considered package-private and internal to Butler
683
- implementation. Clients outside daf_butler package should not use this
684
- method.
682
+ This method is considered middleware-internal.
685
683
  """
686
684
  raise NotImplementedError()
687
685
 
@@ -702,6 +700,27 @@ class Registry(ABC):
702
700
  """
703
701
  raise NotImplementedError()
704
702
 
703
+ @abstractmethod
704
+ def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
705
+ """Return the IDs of all datasets in the given ``RUN``
706
+ collection.
707
+
708
+ Parameters
709
+ ----------
710
+ run : `str`
711
+ Name of the collection.
712
+
713
+ Returns
714
+ -------
715
+ dataset_ids : `list` [`uuid.UUID`]
716
+ List of dataset IDs.
717
+
718
+ Notes
719
+ -----
720
+ This is a middleware-internal interface.
721
+ """
722
+ raise NotImplementedError()
723
+
705
724
  @abstractmethod
706
725
  def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
707
726
  """Remove datasets from the Registry.
@@ -617,6 +617,14 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
617
617
  dataset_type_names = set(get_dataset_type_name(dt) for dt in dataset_types)
618
618
  return self._summaries.fetch_summaries(collections, dataset_type_names, self._dataset_type_from_row)
619
619
 
620
+ def fetch_run_dataset_ids(self, run: RunRecord) -> list[DatasetId]:
621
+ # Docstring inherited.
622
+ sql = sqlalchemy.select(self._static.dataset.c.id).where(
623
+ self._static.dataset.c[self._run_key_column] == run.key
624
+ )
625
+ with self._db.query(sql) as result:
626
+ return list(result.scalars())
627
+
620
628
  def ingest_date_dtype(self) -> type:
621
629
  """Return type of the ``ingest_date`` column."""
622
630
  schema_version = self.newSchemaVersion()
@@ -698,7 +706,7 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
698
706
  for dataId, row in zip(data_id_list, rows, strict=True)
699
707
  ]
700
708
 
701
- def import_(self, run: RunRecord, refs: list[DatasetRef]) -> None:
709
+ def import_(self, run: RunRecord, refs: list[DatasetRef], assume_new: bool = False) -> None:
702
710
  # Docstring inherited from DatasetRecordStorageManager.
703
711
  if not refs:
704
712
  # Just in case an empty mapping is provided we want to avoid
@@ -721,7 +729,6 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
721
729
  "Table cache should have been populated when looking up dataset types"
722
730
  )
723
731
  tags_table = self._get_tags_table(dynamic_tables)
724
-
725
732
  # Current timestamp, type depends on schema version.
726
733
  if self._use_astropy_ingest_date:
727
734
  # Astropy `now()` precision should be the same as `now()` which
@@ -729,11 +736,8 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
729
736
  timestamp = sqlalchemy.sql.literal(astropy.time.Time.now(), type_=ddl.AstropyTimeNsecTai)
730
737
  else:
731
738
  timestamp = sqlalchemy.sql.literal(datetime.datetime.now(datetime.UTC))
732
-
733
- # We'll insert all new rows into a temporary table
734
- table_spec = makeTagTableSpec(dimensions, type(self._collections), constraints=False)
735
739
  collection_fkey_name = self._collections.getCollectionForeignKeyName()
736
- tmpRows = [
740
+ tags_rows = [
737
741
  {
738
742
  "dataset_type_id": dataset_type_storage[ref.datasetType.name].dataset_type_id,
739
743
  collection_fkey_name: run.key,
@@ -742,9 +746,29 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
742
746
  }
743
747
  for ref in refs
744
748
  ]
749
+ if assume_new:
750
+ self._import_new(run, refs, dataset_type_storage, tags_table, tags_rows, timestamp)
751
+ else:
752
+ self._import_guarded(
753
+ run, refs, dimensions, dataset_type_storage, tags_table, tags_rows, timestamp
754
+ )
755
+
756
+ def _import_guarded(
757
+ self,
758
+ run: RunRecord,
759
+ refs: list[DatasetRef],
760
+ dimensions: DimensionGroup,
761
+ dataset_type_storage: dict[str, _DatasetRecordStorage],
762
+ tags_table: sqlalchemy.Table,
763
+ tags_rows: list[dict[str, object]],
764
+ timestamp: sqlalchemy.BindParameter[astropy.time.Time | datetime.datetime],
765
+ ) -> None:
766
+ # We'll insert all new rows into a temporary table
767
+ table_spec = makeTagTableSpec(dimensions, type(self._collections), constraints=False)
768
+ collection_fkey_name = self._collections.getCollectionForeignKeyName()
745
769
  with self._db.transaction(for_temp_tables=True), self._db.temporary_table(table_spec) as tmp_tags:
746
770
  # store all incoming data in a temporary table
747
- self._db.insert(tmp_tags, *tmpRows)
771
+ self._db.insert(tmp_tags, *tags_rows)
748
772
  # There are some checks that we want to make for consistency
749
773
  # of the new datasets with existing ones.
750
774
  self._validate_import(dimensions, tags_table, tmp_tags, run)
@@ -764,17 +788,19 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
764
788
  timestamp.label("ingest_date"),
765
789
  ),
766
790
  )
767
- # Update the summary tables for this collection in case this
768
- # is the first time this dataset type or these governor values
769
- # will be inserted there.
770
- summary = CollectionSummary()
771
- summary.add_datasets(refs)
772
- self._summaries.update(
773
- run, [storage.dataset_type_id for storage in dataset_type_storage.values()], summary
774
- )
791
+ self._update_summaries(run, refs, dataset_type_storage)
775
792
  # Copy from temp table into tags table.
776
793
  self._db.insert(tags_table, select=tmp_tags.select())
777
794
 
795
+ def _update_summaries(
796
+ self, run: RunRecord, refs: list[DatasetRef], dataset_type_storage: dict[str, _DatasetRecordStorage]
797
+ ) -> None:
798
+ summary = CollectionSummary()
799
+ summary.add_datasets(refs)
800
+ self._summaries.update(
801
+ run, [storage.dataset_type_id for storage in dataset_type_storage.values()], summary
802
+ )
803
+
778
804
  def _validate_import(
779
805
  self,
780
806
  dimensions: DimensionGroup,
@@ -899,6 +925,29 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
899
925
  f"but ID {row.new_dataset_id} in new collection {new_collection!r}."
900
926
  )
901
927
 
928
+ def _import_new(
929
+ self,
930
+ run: RunRecord,
931
+ refs: list[DatasetRef],
932
+ dataset_type_storage: dict[str, _DatasetRecordStorage],
933
+ tags_table: sqlalchemy.Table,
934
+ tags_rows: list[dict[str, object]],
935
+ timestamp: sqlalchemy.BindParameter[astropy.time.Time | datetime.datetime],
936
+ ) -> None:
937
+ static_rows = [
938
+ {
939
+ "id": ref.id,
940
+ "dataset_type_id": dataset_type_storage[ref.datasetType.name].dataset_type_id,
941
+ self._run_key_column: run.key,
942
+ "ingest_date": timestamp.value,
943
+ }
944
+ for ref in refs
945
+ ]
946
+ with self._db.transaction():
947
+ self._db.insert(self._static.dataset, *static_rows)
948
+ self._update_summaries(run, refs, dataset_type_storage)
949
+ self._db.insert(tags_table, *tags_rows)
950
+
902
951
  def delete(self, datasets: Iterable[DatasetId | DatasetRef]) -> None:
903
952
  # Docstring inherited from DatasetRecordStorageManager.
904
953
  # Only delete from common dataset table; ON DELETE foreign key clauses
@@ -384,6 +384,23 @@ class DatasetRecordStorageManager(VersionedExtension):
384
384
  """
385
385
  raise NotImplementedError()
386
386
 
387
+ @abstractmethod
388
+ def fetch_run_dataset_ids(self, run: RunRecord) -> list[DatasetId]:
389
+ """Return the IDs of all datasets in the given ``RUN``
390
+ collection.
391
+
392
+ Parameters
393
+ ----------
394
+ run : `RunRecord`
395
+ Record describing the collection.
396
+
397
+ Returns
398
+ -------
399
+ dataset_ids : `list` [`uuid.UUID`]
400
+ List of dataset IDs.
401
+ """
402
+ raise NotImplementedError()
403
+
387
404
  @abstractmethod
388
405
  def ingest_date_dtype(self) -> type:
389
406
  """Return type of the ``ingest_date`` column."""
@@ -424,7 +441,7 @@ class DatasetRecordStorageManager(VersionedExtension):
424
441
  raise NotImplementedError()
425
442
 
426
443
  @abstractmethod
427
- def import_(self, run: RunRecord, refs: list[DatasetRef]) -> None:
444
+ def import_(self, run: RunRecord, refs: list[DatasetRef], assume_new: bool = False) -> None:
428
445
  """Insert one or more dataset entries into the database.
429
446
 
430
447
  Parameters
@@ -435,6 +452,9 @@ class DatasetRecordStorageManager(VersionedExtension):
435
452
  refs : `list` [ `DatasetRef` ]
436
453
  List of datasets to be be inserted. All of the ``DatasetRef``
437
454
  ``run`` attributes must match the ``run`` parameter.
455
+ assume_new : `bool`, optional
456
+ If `True`, assume all datasets are new and skip conflict resolution
457
+ logic.
438
458
  """
439
459
  raise NotImplementedError()
440
460
 
@@ -58,6 +58,9 @@ class CommonQueryArguments:
58
58
  def replaceCollections(self, collections: list[str]) -> CommonQueryArguments:
59
59
  return dataclasses.replace(self, collections=collections)
60
60
 
61
+ def replaceDatasetTypes(self, dataset_types: list[str]) -> CommonQueryArguments:
62
+ return dataclasses.replace(self, dataset_types=dataset_types)
63
+
61
64
 
62
65
  _T = TypeVar("_T", bound=QueryResultsBase)
63
66
  _U = TypeVar("_U", bound=QueryResultsBase)
@@ -119,7 +119,13 @@ class QueryDriverDatasetRefQueryResults(
119
119
 
120
120
  @property
121
121
  def dataIds(self) -> DataCoordinateQueryResults:
122
- raise NotImplementedError()
122
+ from ._query_data_coordinates import QueryDriverDataCoordinateQueryResults
123
+
124
+ args = self._args.replaceDatasetTypes([self._dataset_type.name])
125
+
126
+ return QueryDriverDataCoordinateQueryResults(
127
+ self._butler, dimensions=self._dataset_type.dimensions, expanded=self._expanded, args=args
128
+ )
123
129
 
124
130
  def byParentDatasetType(self) -> Iterator[ParentDatasetQueryResults]:
125
131
  yield self
@@ -919,14 +919,12 @@ class SqlRegistry:
919
919
  self,
920
920
  datasets: Iterable[DatasetRef],
921
921
  expand: bool = True,
922
+ assume_new: bool = False,
922
923
  ) -> list[DatasetRef]:
923
924
  """Import one or more datasets into the `Registry`.
924
925
 
925
- Difference from `insertDatasets` method is that this method accepts
926
- `DatasetRef` instances which should already be resolved and have a
927
- dataset ID. If registry supports globally-unique dataset IDs (e.g.
928
- `uuid.UUID`) then datasets which already exist in the registry will be
929
- ignored if imported again.
926
+ This differs from `insertDatasets` method in that this method accepts
927
+ `DatasetRef` instances, which already have a dataset ID.
930
928
 
931
929
  Parameters
932
930
  ----------
@@ -942,14 +940,17 @@ class SqlRegistry:
942
940
  If `True` (default), expand data IDs as they are inserted. This is
943
941
  necessary in general, but it may be disabled if the caller can
944
942
  guarantee this is unnecessary.
943
+ assume_new : `bool`, optional
944
+ If `True`, assume datasets are new. If `False`, datasets that are
945
+ identical to an existing one are ignored.
945
946
 
946
947
  Returns
947
948
  -------
948
949
  refs : `list` of `DatasetRef`
949
- Resolved `DatasetRef` instances for all given data IDs (in the same
950
- order). If any of ``datasets`` has an ID which already exists in
951
- the database then it will not be inserted or updated, but a
952
- resolved `DatasetRef` will be returned for it in any case.
950
+ `DatasetRef` instances for all given data IDs (in the same order).
951
+ If any of ``datasets`` has an ID which already exists in the
952
+ database then it will not be inserted or updated, but a
953
+ `DatasetRef` will be returned for it in any case.
953
954
 
954
955
  Raises
955
956
  ------
@@ -959,15 +960,14 @@ class SqlRegistry:
959
960
  Raised if a dataset type is not known to registry.
960
961
  lsst.daf.butler.registry.ConflictingDefinitionError
961
962
  If a dataset with the same dataset type and data ID as one of those
962
- given already exists in ``run``.
963
+ given already exists in ``run``, or if ``assume_new=True`` and at
964
+ least one dataset is not new.
963
965
  lsst.daf.butler.registry.MissingCollectionError
964
966
  Raised if ``run`` does not exist in the registry.
965
967
 
966
968
  Notes
967
969
  -----
968
- This method is considered package-private and internal to Butler
969
- implementation. Clients outside daf_butler package should not use this
970
- method.
970
+ This method is considered middleware-internal.
971
971
  """
972
972
  datasets = list(datasets)
973
973
  if not datasets:
@@ -994,7 +994,7 @@ class SqlRegistry:
994
994
  _LOG.debug("Finished expanding data IDs")
995
995
 
996
996
  try:
997
- self._managers.datasets.import_(runRecord, datasets)
997
+ self._managers.datasets.import_(runRecord, datasets, assume_new=assume_new)
998
998
  if self._managers.obscore:
999
999
  self._managers.obscore.add_datasets(datasets)
1000
1000
  except sqlalchemy.exc.IntegrityError as err:
@@ -1003,7 +1003,8 @@ class SqlRegistry:
1003
1003
  f"one or more datasets into collection '{run}'. "
1004
1004
  "This probably means a dataset with the same data ID "
1005
1005
  "and dataset type already exists, but it may also mean a "
1006
- "dimension row is missing."
1006
+ "dimension row is missing, or the dataset was assumed to be "
1007
+ "new when it was not."
1007
1008
  ) from err
1008
1009
  return datasets
1009
1010
 
@@ -1023,6 +1024,29 @@ class SqlRegistry:
1023
1024
  """
1024
1025
  return self._managers.datasets.getDatasetRef(id)
1025
1026
 
1027
+ def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
1028
+ """Return the IDs of all datasets in the given ``RUN``
1029
+ collection.
1030
+
1031
+ Parameters
1032
+ ----------
1033
+ run : `str`
1034
+ Name of the collection.
1035
+
1036
+ Returns
1037
+ -------
1038
+ dataset_ids : `list` [`uuid.UUID`]
1039
+ List of dataset IDs.
1040
+
1041
+ Notes
1042
+ -----
1043
+ This is a middleware-internal interface.
1044
+ """
1045
+ run_record = self._managers.collections.find(run)
1046
+ if not isinstance(run_record, RunRecord):
1047
+ raise CollectionTypeError(f"{run!r} is not a RUN collection.")
1048
+ return self._managers.datasets.fetch_run_dataset_ids(run_record)
1049
+
1026
1050
  @transactional
1027
1051
  def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
1028
1052
  """Remove datasets from the Registry.
@@ -86,6 +86,7 @@ from .._exceptions import (
86
86
  OrphanedRecordError,
87
87
  )
88
88
  from ..interfaces import ButlerAttributeExistsError, ReadOnlyDatabaseError
89
+ from ..queries import ParentDatasetQueryResults
89
90
  from ..sql_registry import SqlRegistry
90
91
 
91
92
  _T = TypeVar("_T")
@@ -502,6 +503,15 @@ class RegistryTests(ABC):
502
503
  registry.removeDatasets([ref])
503
504
  self.assertIsNone(registry.findDataset(datasetType, dataId, collections=[run]))
504
505
 
506
+ def test_fetch_run_dataset_ids(self):
507
+ butler = self.make_butler()
508
+ registry = butler._registry
509
+ self.load_data(butler, "base.yaml", "datasets.yaml")
510
+ dataset_ids = registry._fetch_run_dataset_ids("imported_r")
511
+ self.assertEqual(len(dataset_ids), 7)
512
+ refs = butler.query_all_datasets("imported_r")
513
+ self.assertCountEqual(dataset_ids, [ref.id for ref in refs])
514
+
505
515
  def testFindDataset(self):
506
516
  """Tests for `SqlRegistry.findDataset`."""
507
517
  butler = self.make_butler()
@@ -732,10 +742,15 @@ class RegistryTests(ABC):
732
742
  dataIdFlat1 = {"instrument": "Cam1", "detector": 1, "physical_filter": "Cam1-G", "band": "g"}
733
743
 
734
744
  ref = DatasetRef(datasetTypeBias, dataIdBias1, run="run0")
735
- (ref1,) = registry._importDatasets([ref])
745
+ (ref1,) = registry._importDatasets([ref], assume_new=True)
736
746
  # UUID is used without change
737
747
  self.assertEqual(ref.id, ref1.id)
738
748
 
749
+ # Inserting this ref with assume_new=True should fail, since this
750
+ # dataset exists.
751
+ with self.assertRaises(ConflictingDefinitionError):
752
+ registry._importDatasets([ref], assume_new=True)
753
+
739
754
  # All different failure modes
740
755
  refs = (
741
756
  # Importing same DatasetRef with different dataset ID is an error
@@ -3925,11 +3940,10 @@ class RegistryTests(ABC):
3925
3940
  )
3926
3941
  self.assertIsNone(detectors[0].records["detector"].purpose)
3927
3942
 
3928
- datasets = list(
3929
- registry.queryDatasets(
3930
- "flat", collections="imported_g", where="instrument = 'Cam1' and detector <= 3"
3931
- ).expanded()
3932
- )
3943
+ datasets_query = registry.queryDatasets(
3944
+ "flat", collections="imported_g", where="instrument = 'Cam1' and detector <= 3"
3945
+ ).expanded()
3946
+ datasets = list(datasets_query)
3933
3947
  datasets.sort(key=lambda ref: ref.dataId["detector"])
3934
3948
  self.assertEqual(len(datasets), 2)
3935
3949
  self.assertEqual(datasets[0].id, uuid.UUID("60c8a65c-7290-4c38-b1de-e3b1cdcf872d"))
@@ -3938,6 +3952,13 @@ class RegistryTests(ABC):
3938
3952
  self.assertEqual(datasets[0].dataId.records["detector"].full_name, "Ab")
3939
3953
  self.assertEqual(datasets[1].dataId.records["detector"].full_name, "Ba")
3940
3954
  self.assertEqual(datasets[0].dataId.records["instrument"].visit_system, 1)
3955
+ assert isinstance(datasets_query, ParentDatasetQueryResults)
3956
+ data_ids = list(datasets_query.dataIds)
3957
+ data_ids.sort(key=lambda data_id: data_id["detector"])
3958
+ self.assertEqual(len(data_ids), 2)
3959
+ self.assertEqual(data_ids[0].records["detector"].full_name, "Ab")
3960
+ self.assertEqual(data_ids[1].records["detector"].full_name, "Ba")
3961
+ self.assertEqual(data_ids[0].records["instrument"].visit_system, 1)
3941
3962
 
3942
3963
  # None of the datasets in the test data include any uncached
3943
3964
  # dimensions, so we have to set one up.
@@ -224,12 +224,16 @@ class RemoteButlerRegistry(RegistryBase):
224
224
  self,
225
225
  datasets: Iterable[DatasetRef],
226
226
  expand: bool = True,
227
+ assume_new: bool = False,
227
228
  ) -> list[DatasetRef]:
228
229
  raise NotImplementedError()
229
230
 
230
231
  def getDataset(self, id: DatasetId) -> DatasetRef | None:
231
232
  return self._butler.get_dataset(id)
232
233
 
234
+ def _fetch_run_dataset_ids(self, run: str) -> list[DatasetId]:
235
+ raise NotImplementedError()
236
+
233
237
  def removeDatasets(self, refs: Iterable[DatasetRef]) -> None:
234
238
  raise NotImplementedError()
235
239