lsst-daf-butler 29.2025.3200__tar.gz → 29.2025.3400__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 (449) hide show
  1. {lsst_daf_butler-29.2025.3200/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.3400}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_butler.py +1 -1
  3. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_dataset_type.py +4 -1
  4. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_exceptions.py +10 -0
  5. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_coordinate.py +6 -4
  6. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_butler/_direct_butler.py +1 -1
  7. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/dimensions/static.py +3 -3
  8. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/_config.py +9 -1
  9. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +24 -3
  10. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/_server.py +4 -1
  11. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +3 -4
  12. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +7 -5
  13. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +3 -3
  14. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/queryDatasets.py +20 -30
  15. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/butler_queries.py +17 -17
  16. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/server.py +2 -2
  17. lsst_daf_butler-29.2025.3400/python/lsst/daf/butler/version.py +2 -0
  18. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  19. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_datasets.py +5 -1
  20. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_dimensions.py +5 -0
  21. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_server.py +1 -0
  22. lsst_daf_butler-29.2025.3200/python/lsst/daf/butler/version.py +0 -2
  23. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/COPYRIGHT +0 -0
  24. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/LICENSE +0 -0
  25. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/MANIFEST.in +0 -0
  26. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/README.md +0 -0
  27. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/bsd_license.txt +0 -0
  28. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  29. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  30. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/configuring.rst +0 -0
  31. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/datastores.rst +0 -0
  32. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/dimensions.rst +0 -0
  33. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/formatters.rst +0 -0
  34. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/index.rst +0 -0
  35. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/organizing.rst +0 -0
  36. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/queries.rst +0 -0
  37. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  38. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  39. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/gpl-v3.0.txt +0 -0
  40. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/pyproject.toml +0 -0
  41. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/__init__.py +0 -0
  42. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/__init__.py +0 -0
  43. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/__init__.py +0 -0
  44. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_butler_collections.py +0 -0
  45. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_butler_config.py +0 -0
  46. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  47. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  48. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  49. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_collection_type.py +0 -0
  50. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_column_categorization.py +0 -0
  51. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_column_tags.py +0 -0
  52. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_column_type_info.py +0 -0
  53. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_config.py +0 -0
  54. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_config_support.py +0 -0
  55. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_dataset_association.py +0 -0
  56. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  57. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  58. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  59. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  60. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  61. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_file_dataset.py +0 -0
  62. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  63. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_formatter.py +0 -0
  64. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  65. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_limited_butler.py +0 -0
  66. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_location.py +0 -0
  67. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_named.py +0 -0
  68. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_quantum.py +0 -0
  69. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  70. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  71. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_registry_shim.py +0 -0
  72. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_storage_class.py +0 -0
  73. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  74. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_timespan.py +0 -0
  75. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_topology.py +0 -0
  76. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  77. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  78. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  79. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  80. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/arrow_utils.py +0 -0
  81. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/__init__.py +0 -0
  82. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/butler.py +0 -0
  83. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  84. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  85. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  86. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  87. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  88. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  89. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  90. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  91. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  92. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/progress.py +0 -0
  93. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/cli/utils.py +0 -0
  94. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/column_spec.py +0 -0
  95. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  96. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  97. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  98. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  99. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  100. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  101. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  102. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  103. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  104. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  105. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  106. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  107. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  108. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  109. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  110. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  111. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  112. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  113. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  114. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  115. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  116. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/composites.py +0 -0
  117. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  118. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  119. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  120. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  121. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  122. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  123. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  124. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  125. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  126. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  127. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  128. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  129. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  130. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/ddl.py +0 -0
  131. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  132. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  133. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  134. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  135. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  136. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  137. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  138. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  139. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  140. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  141. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  142. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  143. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  144. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  145. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  146. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  147. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  148. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  149. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  150. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  151. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  152. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  153. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  154. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  155. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  156. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  157. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  158. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  159. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  160. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  161. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/file.py +0 -0
  162. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/json.py +0 -0
  163. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/logs.py +0 -0
  164. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  165. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/packages.py +0 -0
  166. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  167. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  168. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  169. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  170. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/json.py +0 -0
  171. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/logging.py +0 -0
  172. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/mapping_factory.py +0 -0
  173. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/name_shrinker.py +0 -0
  174. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  175. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/persistence_context.py +0 -0
  176. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/progress.py +0 -0
  177. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/py.typed +0 -0
  178. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  179. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/__init__.py +0 -0
  180. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_base.py +0 -0
  181. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  182. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  183. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  184. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  185. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  186. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  187. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/_query.py +0 -0
  188. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  189. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/driver.py +0 -0
  190. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  191. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  192. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  193. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  194. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  195. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  196. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  197. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  198. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  199. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  200. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  201. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  202. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/queries/visitors.py +0 -0
  203. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/__init__.py +0 -0
  204. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  205. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  206. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  207. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  208. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_config.py +0 -0
  209. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  210. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  211. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_registry.py +0 -0
  212. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  213. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/attributes.py +0 -0
  214. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  215. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  216. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  217. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  218. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  219. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  220. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  221. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  222. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  223. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  224. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  225. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  226. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  228. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  229. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  230. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  231. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  232. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  233. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  234. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  235. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  236. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  237. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  238. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  239. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  240. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  241. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  242. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  243. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/managers.py +0 -0
  244. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  245. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  246. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  247. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  248. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  249. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  250. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  251. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  252. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  253. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/opaque.py +0 -0
  254. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  255. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  256. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  257. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  258. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  259. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  260. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  261. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  262. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  263. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  264. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  265. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  266. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  267. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  268. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  269. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  270. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  271. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  272. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  273. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  274. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  275. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  276. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  277. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  278. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  279. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  280. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  281. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  282. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  283. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  284. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/versions.py +0 -0
  285. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  286. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  287. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  288. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  289. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  290. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  291. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  292. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  293. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  294. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  295. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  296. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  297. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  298. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  299. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  300. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  301. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  302. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
  303. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  304. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  305. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  306. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  307. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  308. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  309. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  310. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  311. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  312. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  313. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  314. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  315. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  316. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  317. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  318. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  319. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  320. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/repo_relocation.py +0 -0
  321. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/__init__.py +0 -0
  322. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/_associate.py +0 -0
  323. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  324. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  325. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  326. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  327. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/configDump.py +0 -0
  328. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/configValidate.py +0 -0
  329. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/createRepo.py +0 -0
  330. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  331. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  332. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  333. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  334. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  335. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  336. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  337. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  338. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  339. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  340. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  341. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  342. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  343. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/__init__.py +0 -0
  344. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  345. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  346. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  347. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  348. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  349. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  350. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  351. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  352. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  353. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  354. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  355. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  356. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  357. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  358. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  359. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  360. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  361. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  362. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  363. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  364. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  365. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  366. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/tests/utils.py +0 -0
  367. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/time_utils.py +0 -0
  368. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  369. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  370. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/transfers/_context.py +0 -0
  371. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  372. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  373. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst/daf/butler/utils.py +0 -0
  374. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  375. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  376. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  377. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  378. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  379. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  380. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/setup.cfg +0 -0
  381. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_astropyTableFormatter.py +0 -0
  382. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_authentication.py +0 -0
  383. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_butler.py +0 -0
  384. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_butler_factory.py +0 -0
  385. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdAssociate.py +0 -0
  386. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdConfigDump.py +0 -0
  387. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdConfigValidate.py +0 -0
  388. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdCreate.py +0 -0
  389. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdImport.py +0 -0
  390. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdIngestFiles.py +0 -0
  391. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdPruneDatasets.py +0 -0
  392. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdQueryCollections.py +0 -0
  393. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdQueryDataIds.py +0 -0
  394. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  395. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdQueryDatasets.py +0 -0
  396. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  397. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdRemoveCollections.py +0 -0
  398. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdRemoveRuns.py +0 -0
  399. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  400. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliLog.py +0 -0
  401. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliPluginLoader.py +0 -0
  402. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliUtilSplitCommas.py +0 -0
  403. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliUtilSplitKv.py +0 -0
  404. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliUtilToUpper.py +0 -0
  405. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_cliUtils.py +0 -0
  406. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_column_spec.py +0 -0
  407. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_composites.py +0 -0
  408. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_config.py +0 -0
  409. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_connectionString.py +0 -0
  410. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_constraints.py +0 -0
  411. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_datastore.py +0 -0
  412. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_ddl.py +0 -0
  413. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_dimension_record_containers.py +0 -0
  414. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_exprParserLex.py +0 -0
  415. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_exprParserYacc.py +0 -0
  416. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_expressions.py +0 -0
  417. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_formatter.py +0 -0
  418. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_gafaelfawr.py +0 -0
  419. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_location.py +0 -0
  420. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_logFormatter.py +0 -0
  421. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_logging.py +0 -0
  422. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_matplotlibFormatter.py +0 -0
  423. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_nonempty_mapping.py +0 -0
  424. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_normalFormExpression.py +0 -0
  425. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_obscore.py +0 -0
  426. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_packages.py +0 -0
  427. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_parquet.py +0 -0
  428. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_postgresql.py +0 -0
  429. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_progress.py +0 -0
  430. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_pydantic_utils.py +0 -0
  431. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_quantum.py +0 -0
  432. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_quantumBackedButler.py +0 -0
  433. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_query_direct_postgresql.py +0 -0
  434. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_query_direct_sqlite.py +0 -0
  435. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_query_interface.py +0 -0
  436. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_query_relations.py +0 -0
  437. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_query_remote.py +0 -0
  438. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_query_utilities.py +0 -0
  439. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_remote_butler.py +0 -0
  440. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_simpleButler.py +0 -0
  441. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_sqlite.py +0 -0
  442. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_storageClass.py +0 -0
  443. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_templates.py +0 -0
  444. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_testRepo.py +0 -0
  445. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_thread_utils.py +0 -0
  446. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_time_utils.py +0 -0
  447. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_timespan.py +0 -0
  448. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/tests/test_utils.py +0 -0
  449. {lsst_daf_butler-29.2025.3200 → lsst_daf_butler-29.2025.3400}/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.3200
3
+ Version: 29.2025.3400
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -2040,7 +2040,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
2040
2040
  raise EmptyQueryResultError(list(result.explain_no_results()))
2041
2041
  return dimension_records
2042
2042
 
2043
- def _query_all_datasets(
2043
+ def query_all_datasets(
2044
2044
  self,
2045
2045
  collections: str | Iterable[str] | None = None,
2046
2046
  *,
@@ -38,6 +38,7 @@ from typing import TYPE_CHECKING, Any, ClassVar
38
38
  from pydantic import BaseModel, StrictBool, StrictStr
39
39
 
40
40
  from ._config_support import LookupKey
41
+ from ._exceptions import UnknownComponentError
41
42
  from ._storage_class import StorageClass, StorageClassFactory
42
43
  from .dimensions import DimensionGroup
43
44
  from .json import from_json_pydantic, to_json_pydantic
@@ -492,7 +493,9 @@ class DatasetType:
492
493
  """
493
494
  if component in self.storageClass.allComponents():
494
495
  return self.nameWithComponent(self.name, component)
495
- raise KeyError(f"Requested component ({component}) not understood by this DatasetType ({self})")
496
+ raise UnknownComponentError(
497
+ f"Requested component ({component}) not understood by this DatasetType ({self})"
498
+ )
496
499
 
497
500
  def makeCompositeDatasetType(self) -> DatasetType:
498
501
  """Return a composite dataset type from the component.
@@ -41,6 +41,7 @@ __all__ = (
41
41
  "InvalidQueryError",
42
42
  "MissingCollectionError",
43
43
  "MissingDatasetTypeError",
44
+ "UnknownComponentError",
44
45
  "ValidationError",
45
46
  )
46
47
 
@@ -170,6 +171,14 @@ class MissingDatasetTypeError(DatasetTypeError, KeyError, ButlerUserError):
170
171
  error_type = "missing_dataset_type"
171
172
 
172
173
 
174
+ class UnknownComponentError(KeyError, ButlerUserError):
175
+ """Exception raised when the requested component of a DatasetType is not
176
+ known.
177
+ """
178
+
179
+ error_type = "unknown_component"
180
+
181
+
173
182
  class DatasetTypeNotSupportedError(RuntimeError):
174
183
  """A `DatasetType` is not handled by this routine.
175
184
 
@@ -227,6 +236,7 @@ _USER_ERROR_TYPES: tuple[type[ButlerUserError], ...] = (
227
236
  MissingDatasetTypeError,
228
237
  UnimplementedQueryError,
229
238
  UnknownButlerUserError,
239
+ UnknownComponentError,
230
240
  )
231
241
  _USER_ERROR_MAPPING = {e.error_type: e for e in _USER_ERROR_TYPES}
232
242
  assert len(_USER_ERROR_MAPPING) == len(_USER_ERROR_TYPES), (
@@ -1005,10 +1005,12 @@ class _FullTupleDataCoordinate(_BasicTupleDataCoordinate):
1005
1005
  dimensions = self.universe.conform(dimensions)
1006
1006
  if self._dimensions == dimensions:
1007
1007
  return self
1008
- return DataCoordinate.from_full_values(
1009
- dimensions,
1010
- tuple(self[k] for k in dimensions.data_coordinate_keys),
1011
- )
1008
+
1009
+ try:
1010
+ values = tuple(self[k] for k in dimensions.data_coordinate_keys)
1011
+ except KeyError as e:
1012
+ raise DimensionNameError(f"Data ID is missing value for dimension {str(e)}.")
1013
+ return DataCoordinate.from_full_values(dimensions, values)
1012
1014
 
1013
1015
  def union(self, other: DataCoordinate) -> DataCoordinate:
1014
1016
  # Docstring inherited from DataCoordinate.
@@ -1490,7 +1490,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
1490
1490
  names = [info.name for info in collections_info]
1491
1491
 
1492
1492
  # Get all the datasets from these runs.
1493
- refs = self._query_all_datasets(names, find_first=False, limit=None)
1493
+ refs = self.query_all_datasets(names, find_first=False, limit=None)
1494
1494
 
1495
1495
  # Call pruneDatasets since we are deliberately removing
1496
1496
  # datasets in chunks from the RUN collections rather than
@@ -468,7 +468,7 @@ class StaticDimensionRecordStorageManager(DimensionRecordStorageManager):
468
468
  distinct=True,
469
469
  ).into_joins_builder(postprocessing=None)
470
470
  if not element.has_own_table:
471
- raise NotImplementedError(f"Cannot join dimension element {element} with no table.")
471
+ raise UnimplementedQueryError(f"Cannot join dimension element {element} with no table.")
472
472
  table = self._tables[element.name]
473
473
  result = SqlJoinsBuilder(db=self._db, from_clause=table)
474
474
  for dimension_name, column_name in zip(element.required.names, element.schema.required.names):
@@ -1055,7 +1055,7 @@ class _CommonSkyPixMediatedOverlapsVisitor(OverlapsVisitor):
1055
1055
  # Reject spatial constraints that are nested inside OR or NOT, because
1056
1056
  # the postprocessing needed for those would be a lot harder.
1057
1057
  if flags & PredicateVisitFlags.INVERTED or flags & PredicateVisitFlags.HAS_OR_SIBLINGS:
1058
- raise NotImplementedError(
1058
+ raise UnimplementedQueryError(
1059
1059
  "Spatial overlap constraints nested inside OR or NOT are not supported."
1060
1060
  )
1061
1061
  # Delegate to super just because that's good practice with
@@ -1114,7 +1114,7 @@ class _CommonSkyPixMediatedOverlapsVisitor(OverlapsVisitor):
1114
1114
  )
1115
1115
  skypix = element
1116
1116
  case _:
1117
- raise NotImplementedError(
1117
+ raise UnimplementedQueryError(
1118
1118
  f"Spatial overlap constraint for dimension {element} not supported."
1119
1119
  )
1120
1120
  # Convert the region-overlap constraint into a skypix
@@ -30,6 +30,7 @@ from __future__ import annotations
30
30
  from collections.abc import Iterator
31
31
  from contextlib import contextmanager
32
32
  from functools import cache
33
+ from typing import Literal
33
34
 
34
35
  from pydantic import AnyHttpUrl, BaseModel
35
36
  from pydantic_settings import BaseSettings, SettingsConfigDict
@@ -57,9 +58,12 @@ class ButlerServerConfig(BaseSettings):
57
58
  repositories: dict[str, RepositoryConfig]
58
59
  """Mapping from repository name to configuration for the repository."""
59
60
 
60
- gafaelfawr_url: AnyHttpUrl
61
+ gafaelfawr_url: AnyHttpUrl | Literal["DISABLED"]
61
62
  """URL to the top-level HTTP path where Gafaelfawr can be found (e.g.
62
63
  "https://data-int.lsst.cloud").
64
+
65
+ This can instead be the special string "DISABLED" to turn off all features
66
+ requiring Gafaelfawr integration.
63
67
  """
64
68
 
65
69
  authentication: AuthenticationMode
@@ -69,6 +73,10 @@ class ButlerServerConfig(BaseSettings):
69
73
  as static files from the `configs/` HTTP route.
70
74
  """
71
75
 
76
+ @property
77
+ def gafaelfawr_enabled(self) -> bool:
78
+ return self.gafaelfawr_url != "DISABLED"
79
+
72
80
 
73
81
  _config: ButlerServerConfig | None = None
74
82
 
@@ -27,8 +27,8 @@
27
27
 
28
28
  from typing import Annotated
29
29
 
30
- from fastapi import Depends, HTTPException
31
- from safir.dependencies.gafaelfawr import auth_delegated_token_dependency, auth_dependency
30
+ from fastapi import Depends, Header, HTTPException
31
+ from safir.dependencies.gafaelfawr import auth_delegated_token_dependency
32
32
 
33
33
  from lsst.daf.butler import LabeledButlerFactory
34
34
 
@@ -65,9 +65,29 @@ async def authorizer_dependency() -> GafaelfawrGroupAuthorizer:
65
65
  return _authorizer
66
66
 
67
67
 
68
+ async def user_name_dependency(x_auth_request_user: Annotated[str | None, Header()] = None) -> str | None:
69
+ """Retrieve the user name from Gafaelfawr authentication headers.
70
+
71
+ Parameters
72
+ ----------
73
+ x_auth_request_user : FastAPI header
74
+ Header provided by FastAPI.
75
+
76
+ Returns
77
+ -------
78
+ user_name : `str` | `None`
79
+ The user name, if Gafaelfawr is available on this environment. `None`
80
+ if Gafaelfawr is not available.
81
+ """
82
+ if x_auth_request_user is None and load_config().gafaelfawr_enabled:
83
+ raise HTTPException(status_code=403, detail="Required X-Auth-Request-User header was not provided")
84
+
85
+ return x_auth_request_user
86
+
87
+
68
88
  async def repository_authorization_dependency(
69
89
  repository: str,
70
- user_name: Annotated[str, Depends(auth_dependency)],
90
+ user_name: Annotated[str | None, Depends(user_name_dependency)],
71
91
  user_token: Annotated[str, Depends(auth_delegated_token_dependency)],
72
92
  authorizer: Annotated[GafaelfawrGroupAuthorizer, Depends(authorizer_dependency)],
73
93
  ) -> None:
@@ -87,6 +107,7 @@ async def repository_authorization_dependency(
87
107
  authorizer : `GafaelfawrGroupAuthorizer`
88
108
  Authorization client that will be used to verify group membership.
89
109
  """
110
+ assert user_name is not None, "Gafaelfawr user name header should have been populated."
90
111
  if not await authorizer.is_user_authorized_for_repository(
91
112
  repository=repository, user_name=user_name, user_token=user_token
92
113
  ):
@@ -62,13 +62,16 @@ def create_app() -> FastAPI:
62
62
  # factory_dependency().
63
63
  default_api_path = "/api/butler"
64
64
  prefix = f"{default_api_path}/repo/{{repository}}"
65
+ auth_dependencies = [Depends(repository_authorization_dependency)]
66
+ if not config.gafaelfawr_enabled:
67
+ auth_dependencies = []
65
68
  for router in (external_router, query_router):
66
69
  app.include_router(
67
70
  router,
68
71
  prefix=prefix,
69
72
  # Verify that users have permission to access repository-specific
70
73
  # resources.
71
- dependencies=[Depends(repository_authorization_dependency)],
74
+ dependencies=auth_dependencies,
72
75
  # document that 422 responses will include a JSON-formatted error
73
76
  # message, from `butler_exception_handler()` below.
74
77
  responses={422: {"model": ErrorResponseModel}},
@@ -35,7 +35,6 @@ from typing import Annotated, NamedTuple
35
35
 
36
36
  from fastapi import APIRouter, Depends
37
37
  from fastapi.responses import StreamingResponse
38
- from safir.dependencies.gafaelfawr import auth_dependency
39
38
 
40
39
  from lsst.daf.butler import Butler, DataCoordinate, DimensionGroup
41
40
  from lsst.daf.butler.remote_butler.server_models import (
@@ -56,7 +55,7 @@ from ...._exceptions import InvalidQueryError
56
55
  from ...._query_all_datasets import QueryAllDatasetsParameters, query_all_datasets
57
56
  from ....queries import Query
58
57
  from ....queries.driver import QueryDriver, QueryTree
59
- from .._dependencies import factory_dependency
58
+ from .._dependencies import factory_dependency, user_name_dependency
60
59
  from .._factory import Factory
61
60
  from ._query_serialization import convert_query_page
62
61
  from ._query_streaming import StreamingQuery, execute_streaming_query
@@ -93,7 +92,7 @@ class _StreamQueryDriverExecute(StreamingQuery[_QueryContext]):
93
92
  async def query_execute(
94
93
  request: QueryExecuteRequestModel,
95
94
  factory: Annotated[Factory, Depends(factory_dependency)],
96
- user_name: Annotated[str, Depends(auth_dependency)],
95
+ user_name: Annotated[str | None, Depends(user_name_dependency)],
97
96
  ) -> StreamingResponse:
98
97
  query = _StreamQueryDriverExecute(request, factory)
99
98
  return await execute_streaming_query(query, user_name)
@@ -140,7 +139,7 @@ class _StreamQueryAllDatasets(StreamingQuery[_QueryAllDatasetsContext]):
140
139
  async def query_all_datasets_execute(
141
140
  request: QueryAllDatasetsRequestModel,
142
141
  factory: Annotated[Factory, Depends(factory_dependency)],
143
- user_name: Annotated[str, Depends(auth_dependency)],
142
+ user_name: Annotated[str | None, Depends(user_name_dependency)],
144
143
  ) -> StreamingResponse:
145
144
  query = _StreamQueryAllDatasets(request, factory)
146
145
  return await execute_streaming_query(query, user_name)
@@ -56,7 +56,7 @@ class QueryLimits:
56
56
  self._active_queries = 0
57
57
  self._active_users: Counter[str] = Counter()
58
58
 
59
- async def enforce_query_limits(self, user: str) -> None:
59
+ async def enforce_query_limits(self, user: str | None) -> None:
60
60
  if self._active_queries >= _MAXIMUM_CONCURRENT_STREAMING_QUERIES:
61
61
  await _block_retry_for_unit_test()
62
62
  raise HTTPException(
@@ -70,7 +70,7 @@ class QueryLimits:
70
70
  # replica, which is a non-deterministic but small number.
71
71
  # There will be some backpressure from the 429 responses as they
72
72
  # attempt to bounce to other replicas on retry.
73
- if self._active_users[user] >= 2:
73
+ if user is not None and self._active_users[user] >= 2:
74
74
  _LOG.warning(f"User '{user}' is running many queries simultaneously.")
75
75
  raise HTTPException(
76
76
  status_code=429, # too many requests
@@ -80,14 +80,16 @@ class QueryLimits:
80
80
  )
81
81
 
82
82
  @asynccontextmanager
83
- async def track_query(self, user: str) -> AsyncIterator[None]:
83
+ async def track_query(self, user: str | None) -> AsyncIterator[None]:
84
84
  try:
85
85
  self._active_queries += 1
86
- self._active_users[user] += 1
86
+ if user is not None:
87
+ self._active_users[user] += 1
87
88
  await _block_query_for_unit_test()
88
89
  yield
89
90
  finally:
90
- self._active_users[user] -= 1
91
+ if user is not None:
92
+ self._active_users[user] -= 1
91
93
  self._active_queries -= 1
92
94
 
93
95
 
@@ -73,7 +73,7 @@ class StreamingQuery(Protocol[_TContext]):
73
73
  """
74
74
 
75
75
 
76
- async def execute_streaming_query(query: StreamingQuery, user: str) -> StreamingResponse:
76
+ async def execute_streaming_query(query: StreamingQuery, user: str | None) -> StreamingResponse:
77
77
  """Run a query, streaming the response incrementally, one page at a time,
78
78
  as newline-separated chunks of JSON.
79
79
 
@@ -83,7 +83,7 @@ async def execute_streaming_query(query: StreamingQuery, user: str) -> Streaming
83
83
  Callers should define a class implementing the ``StreamingQuery``
84
84
  protocol to specify the inner logic that will be called during
85
85
  query execution.
86
- user : `str`
86
+ user : `str`, optional
87
87
  Name of user running the query -- used to enforce usage limits.
88
88
 
89
89
  Returns
@@ -125,7 +125,7 @@ async def execute_streaming_query(query: StreamingQuery, user: str) -> Streaming
125
125
  )
126
126
 
127
127
 
128
- async def _stream_query_pages(query: StreamingQuery, user: str) -> AsyncIterator[str]:
128
+ async def _stream_query_pages(query: StreamingQuery, user: str | None) -> AsyncIterator[str]:
129
129
  """Stream the query output with one page object per line, as
130
130
  newline-delimited JSON records in the "JSON Lines" format
131
131
  (https://jsonlines.org/).
@@ -31,7 +31,7 @@ import warnings
31
31
  from collections import defaultdict
32
32
  from collections.abc import Iterable, Iterator
33
33
  from contextlib import contextmanager
34
- from itertools import groupby
34
+ from itertools import chain, groupby
35
35
  from typing import TYPE_CHECKING
36
36
 
37
37
  import numpy as np
@@ -39,7 +39,7 @@ from astropy.table import Table as AstropyTable
39
39
 
40
40
  from .._butler import Butler
41
41
  from .._exceptions import MissingDatasetTypeError
42
- from .._query_all_datasets import DatasetsPage, QueryAllDatasetsParameters, query_all_datasets
42
+ from .._query_all_datasets import QueryAllDatasetsParameters
43
43
  from ..cli.utils import sortAstropyTable
44
44
  from ..utils import has_globs
45
45
 
@@ -297,9 +297,10 @@ class QueryDatasets:
297
297
  query_func = self._query_single_dataset_type
298
298
 
299
299
  try:
300
- with query_func(query_collections, limit) as pages:
300
+ with query_func(query_collections, limit) as ref_iter:
301
301
  datasets_found = 0
302
- for dataset_type, refs in _chunk_by_dataset_type(pages):
302
+ for dataset_type, chunk in groupby(ref_iter, lambda ref: ref.datasetType.name):
303
+ refs = list(chunk)
303
304
  datasets_found += len(refs)
304
305
  if warn_limit and limit is not None and datasets_found >= limit:
305
306
  # We asked for one too many so must remove that from
@@ -324,24 +325,24 @@ class QueryDatasets:
324
325
  @contextmanager
325
326
  def _query_multiple_dataset_types(
326
327
  self, collections: list[str], limit: int | None
327
- ) -> Iterator[Iterator[DatasetsPage]]:
328
- with self.butler.query() as query:
329
- args = QueryAllDatasetsParameters(
330
- collections=collections,
331
- find_first=self._find_first,
332
- name=self._dataset_type_glob,
333
- where=self._where,
334
- limit=limit,
335
- data_id={},
336
- bind={},
337
- with_dimension_records=self._with_dimension_records,
338
- )
339
- yield query_all_datasets(self.butler, query, args)
328
+ ) -> Iterator[Iterator[DatasetRef]]:
329
+ args = QueryAllDatasetsParameters(
330
+ collections=collections,
331
+ find_first=self._find_first,
332
+ name=self._dataset_type_glob,
333
+ where=self._where,
334
+ limit=limit,
335
+ data_id={},
336
+ bind={},
337
+ with_dimension_records=self._with_dimension_records,
338
+ )
339
+ with self.butler._query_all_datasets_by_page(args) as iterator:
340
+ yield chain.from_iterable(iterator)
340
341
 
341
342
  @contextmanager
342
343
  def _query_single_dataset_type(
343
344
  self, collections: list[str], limit: int | None
344
- ) -> Iterator[Iterator[DatasetsPage]]:
345
+ ) -> Iterator[Iterator[DatasetRef]]:
345
346
  assert len(self._dataset_type_glob) == 1
346
347
  dataset_type = self._dataset_type_glob[0]
347
348
 
@@ -355,15 +356,4 @@ class QueryDatasets:
355
356
  with_dimension_records=self._with_dimension_records,
356
357
  )
357
358
 
358
- yield iter([DatasetsPage(dataset_type=dataset_type, data=refs)])
359
-
360
-
361
- def _chunk_by_dataset_type(pages: Iterator[DatasetsPage]) -> Iterator[DatasetsPage]:
362
- # For each dataset type in the results, collect all the refs into a
363
- # single page. This assumes that in the original iterator, the pages
364
- # for each dataset type are contiguous.
365
- for dataset_type, chunk in groupby(pages, lambda page: page.dataset_type):
366
- refs = []
367
- for page in chunk:
368
- refs.extend(page.data)
369
- yield DatasetsPage(dataset_type, refs)
359
+ yield iter(refs)
@@ -2377,7 +2377,7 @@ class ButlerQueryTests(ABC, TestCaseMixin):
2377
2377
  butler = self.make_butler("base.yaml", "datasets.yaml")
2378
2378
 
2379
2379
  # Make sure that refs are coming out well-formed.
2380
- datasets = butler._query_all_datasets("imported_r", where="detector = 2", instrument="Cam1")
2380
+ datasets = butler.query_all_datasets("imported_r", where="detector = 2", instrument="Cam1")
2381
2381
  datasets.sort(key=lambda ref: ref.datasetType.name)
2382
2382
  self.assertEqual(len(datasets), 2)
2383
2383
  bias = datasets[0]
@@ -2396,29 +2396,29 @@ class ButlerQueryTests(ABC, TestCaseMixin):
2396
2396
  self.assertEqual(flat.id, UUID("c1296796-56c5-4acf-9b49-40d920c6f840"))
2397
2397
 
2398
2398
  # Querying for everything finds everything.
2399
- results = butler._query_all_datasets("*", find_first=False)
2399
+ results = butler.query_all_datasets("*", find_first=False)
2400
2400
  self.assertEqual(len(results), 13)
2401
2401
 
2402
2402
  # constraining by data ID works
2403
2403
  detector_1_ids = ("d0bb04cd-d697-4a83-ba53-cdfcd58e3a0c", "e15ab039-bc8b-4135-87c5-90902a7c0b22")
2404
- results = butler._query_all_datasets(
2404
+ results = butler.query_all_datasets(
2405
2405
  "*", data_id={"detector": 1, "instrument": "Cam1"}, find_first=False
2406
2406
  )
2407
2407
  self.assertCountEqual(detector_1_ids, _ref_uuids(results))
2408
2408
 
2409
2409
  # bind values work.
2410
- results = butler._query_all_datasets(
2410
+ results = butler.query_all_datasets(
2411
2411
  "*", where="detector=:my_bind and instrument='Cam1'", bind={"my_bind": 1}, find_first=False
2412
2412
  )
2413
2413
  self.assertCountEqual(detector_1_ids, _ref_uuids(results))
2414
2414
 
2415
2415
  # find_first requires ordered collections.
2416
2416
  with self.assertRaisesRegex(InvalidQueryError, "Can not use wildcards"):
2417
- results = butler._query_all_datasets("*")
2417
+ results = butler.query_all_datasets("*")
2418
2418
 
2419
2419
  butler.collections.register("chain", CollectionType.CHAINED)
2420
2420
  butler.collections.redefine_chain("chain", ["imported_g", "imported_r"])
2421
- results = butler._query_all_datasets(
2421
+ results = butler.query_all_datasets(
2422
2422
  "chain", where="detector=2 and instrument = 'Cam1'", find_first=True
2423
2423
  )
2424
2424
  # find_first searches the collection chain in order.
@@ -2435,47 +2435,47 @@ class ButlerQueryTests(ABC, TestCaseMixin):
2435
2435
  )
2436
2436
 
2437
2437
  # collection searches work.
2438
- results = butler._query_all_datasets(
2438
+ results = butler.query_all_datasets(
2439
2439
  "*g", where="detector=1 and instrument = 'Cam1'", find_first=False
2440
2440
  )
2441
2441
  self.assertEqual(_ref_uuids(results), ["e15ab039-bc8b-4135-87c5-90902a7c0b22"])
2442
2442
 
2443
2443
  # we raise for missing collections with explicit names.
2444
2444
  with self.assertRaises(MissingCollectionError):
2445
- results = butler._query_all_datasets("nonexistent")
2445
+ results = butler.query_all_datasets("nonexistent")
2446
2446
  # we don't raise for collection wildcard searches that find nothing.
2447
- results = butler._query_all_datasets("nonexistent*", find_first=False)
2447
+ results = butler.query_all_datasets("nonexistent*", find_first=False)
2448
2448
  self.assertEqual(results, [])
2449
2449
 
2450
2450
  # dataset type searches work.
2451
- results = butler._query_all_datasets(
2451
+ results = butler.query_all_datasets(
2452
2452
  "*", name="b*", where="detector=1 and instrument = 'Cam1'", find_first=False
2453
2453
  )
2454
2454
  self.assertEqual(_ref_uuids(results), ["e15ab039-bc8b-4135-87c5-90902a7c0b22"])
2455
2455
 
2456
2456
  # Missing dataset types raise.
2457
2457
  with self.assertRaises(MissingDatasetTypeError):
2458
- results = butler._query_all_datasets("chain", name=["notfound", "flat"])
2458
+ results = butler.query_all_datasets("chain", name=["notfound", "flat"])
2459
2459
  with self.assertRaises(MissingDatasetTypeError):
2460
- results = butler._query_all_datasets("chain", name="notfound*")
2460
+ results = butler.query_all_datasets("chain", name="notfound*")
2461
2461
 
2462
2462
  # Limit of 3 lands at the boundary of a dataset type.
2463
2463
  # Limit of 4 is in the middle of a dataset type.
2464
2464
  for limit in [3, 4]:
2465
2465
  with self.subTest(limit=limit):
2466
- results = butler._query_all_datasets("imported_g", limit=limit)
2466
+ results = butler.query_all_datasets("imported_g", limit=limit)
2467
2467
  self.assertEqual(len(results), limit)
2468
2468
  with self.assertLogs(level="WARNING") as log:
2469
- results = butler._query_all_datasets("imported_g", limit=-limit)
2469
+ results = butler.query_all_datasets("imported_g", limit=-limit)
2470
2470
  self.assertEqual(len(results), limit)
2471
2471
  self.assertIn("requested limit", log.output[0])
2472
2472
 
2473
- results = butler._query_all_datasets("imported_g", limit=0)
2473
+ results = butler.query_all_datasets("imported_g", limit=0)
2474
2474
  self.assertEqual(len(results), 0)
2475
2475
 
2476
2476
  # 'where' constraints that don't apply to all dataset types follow the
2477
2477
  # same rules as query_datasets.
2478
- results = butler._query_all_datasets(
2478
+ results = butler.query_all_datasets(
2479
2479
  "*", where="detector = 2 and band = 'g' and instrument = 'Cam1'", find_first=False
2480
2480
  )
2481
2481
  self.assertCountEqual(
@@ -2491,7 +2491,7 @@ class ButlerQueryTests(ABC, TestCaseMixin):
2491
2491
 
2492
2492
  # Default collections and data ID apply.
2493
2493
  butler.registry.defaults = RegistryDefaults(collections="imported_g")
2494
- results = butler._query_all_datasets(where="detector = 2")
2494
+ results = butler.query_all_datasets(where="detector = 2")
2495
2495
  self.assertCountEqual(
2496
2496
  _ref_uuids(results),
2497
2497
  ["51352db4-a47a-447c-b12d-a50b206b17cd", "60c8a65c-7290-4c38-b1de-e3b1cdcf872d"],
@@ -15,9 +15,9 @@ from lsst.daf.butler.remote_butler.server import create_app
15
15
  from lsst.daf.butler.remote_butler.server._config import ButlerServerConfig, RepositoryConfig, mock_config
16
16
  from lsst.daf.butler.remote_butler.server._dependencies import (
17
17
  auth_delegated_token_dependency,
18
- auth_dependency,
19
18
  butler_factory_dependency,
20
19
  reset_dependency_caches,
20
+ user_name_dependency,
21
21
  )
22
22
  from lsst.resources import ResourcePath
23
23
  from lsst.resources.s3utils import clean_test_environment_for_s3, getS3Client
@@ -148,7 +148,7 @@ def create_test_server(
148
148
  app.dependency_overrides[butler_factory_dependency] = lambda: server_butler_factory
149
149
  # In an actual deployment, these headers would be provided by
150
150
  # the Gafaelfawr ingress.
151
- app.dependency_overrides[auth_dependency] = lambda: "mock-username"
151
+ app.dependency_overrides[user_name_dependency] = lambda: "mock-username"
152
152
  app.dependency_overrides[auth_delegated_token_dependency] = lambda: "mock-delegated-token"
153
153
 
154
154
  # Using TestClient in a context manager ensures that it uses
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.3400"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.3200
3
+ Version: 29.2025.3400
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -42,6 +42,7 @@ from lsst.daf.butler import (
42
42
  SerializedDatasetRefContainerV1,
43
43
  StorageClass,
44
44
  StorageClassFactory,
45
+ UnknownComponentError,
45
46
  )
46
47
  from lsst.daf.butler.datastore.stored_file_info import StoredFileInfo
47
48
  from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ZipIndex
@@ -516,9 +517,12 @@ class DatasetTypeTestCase(unittest.TestCase):
516
517
  self.assertEqual(datasetTypeComponentB.parentStorageClass, storageClass)
517
518
  self.assertIsNone(datasetTypeComposite.parentStorageClass)
518
519
 
519
- with self.assertRaises(KeyError):
520
+ with self.assertRaises(UnknownComponentError):
520
521
  datasetTypeComposite.makeComponentDatasetType("compF")
521
522
 
523
+ with self.assertRaises(UnknownComponentError):
524
+ datasetTypeComposite.componentTypeName("unknown")
525
+
522
526
 
523
527
  class DatasetRefTestCase(unittest.TestCase):
524
528
  """Test for DatasetRef."""
@@ -48,6 +48,7 @@ from lsst.daf.butler import (
48
48
  DimensionConfig,
49
49
  DimensionElement,
50
50
  DimensionGroup,
51
+ DimensionNameError,
51
52
  DimensionPacker,
52
53
  DimensionUniverse,
53
54
  NamedKeyDict,
@@ -797,6 +798,10 @@ class DataCoordinateTestCase(unittest.TestCase):
797
798
  self.assertEqual(dataId, newDataId)
798
799
  self.assertTrue(newDataId.hasFull())
799
800
 
801
+ coord = DataCoordinate.standardize({"instrument": "HSC"}, universe=self.allDataIds.universe)
802
+ with self.assertRaises(DimensionNameError):
803
+ coord.subset(["detector"])
804
+
800
805
  def testUnion(self):
801
806
  """Test `DataCoordinate.union`."""
802
807
  # Make test groups to combine; mostly random, but with a few explicit
@@ -631,6 +631,7 @@ class ButlerClientServerAuthorizationTestCase(unittest.TestCase):
631
631
  """Test server running in CADC auth mode."""
632
632
  with mock_config() as config:
633
633
  config.authentication = "cadc"
634
+ config.gafaelfawr_url = "DISABLED"
634
635
  with create_test_server(TESTDIR, server_config=config) as instance:
635
636
  self.assertIsInstance(instance.remote_butler._connection.auth, CadcAuthenticationProvider)
636
637
 
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.3200"