lsst-daf-butler 29.2025.4000__tar.gz → 29.2025.4200__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 (457) hide show
  1. {lsst_daf_butler-29.2025.4000/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4200}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_association.py +19 -3
  3. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_ref.py +10 -3
  4. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_type.py +2 -2
  5. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_registry_shim.py +77 -98
  6. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/__init__.py +3 -0
  7. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/_uuid.py +79 -0
  8. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +15 -0
  9. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_coordinate.py +3 -3
  10. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_elements.py +3 -2
  11. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_records.py +3 -3
  12. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +1 -1
  13. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_driver.py +5 -1
  14. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_expression_strings.py +1 -1
  15. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_query.py +4 -0
  16. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +8 -3
  17. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_query_tree.py +5 -0
  18. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry.py +6 -3
  19. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/_registry_base.py +273 -0
  20. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +1 -1
  21. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -120
  22. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -40
  23. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -3
  24. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -65
  25. {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_common.py +73 -31
  26. {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_data_coordinates.py +51 -14
  27. {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_datasets.py +8 -11
  28. {lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/registry/queries}/_query_dimension_records.py +7 -8
  29. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_results.py +2 -316
  30. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +1 -147
  31. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/sql_registry.py +2 -777
  32. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_registry.py +202 -451
  33. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_factory.py +2 -2
  34. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_registry.py +3 -219
  35. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +3 -1
  36. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/remote_butler/authentication/cadc.py +106 -0
  37. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeCollections.py +46 -13
  38. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/butler_queries.py +40 -1
  39. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +3 -94
  40. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/tests/server_available.py +53 -0
  41. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/timespan_database_representation.py +8 -0
  42. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_context.py +5 -16
  43. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/version.py +2 -0
  44. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  45. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/SOURCES.txt +8 -8
  46. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_authentication.py +9 -10
  47. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_butler.py +9 -9
  48. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveCollections.py +29 -4
  49. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_gafaelfawr.py +4 -6
  50. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_postgresql.py +6 -3
  51. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_remote.py +3 -7
  52. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_remote_butler.py +7 -54
  53. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_simpleButler.py +3 -4
  54. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_sqlite.py +0 -6
  55. lsst_daf_butler-29.2025.4200/tests/test_uuid.py +53 -0
  56. lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/registry/queries/_builder.py +0 -276
  57. lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/registry/queries/_query.py +0 -1087
  58. lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/registry/queries/_structs.py +0 -525
  59. lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -54
  60. lsst_daf_butler-29.2025.4000/python/lsst/daf/butler/version.py +0 -2
  61. lsst_daf_butler-29.2025.4000/tests/test_query_relations.py +0 -361
  62. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/COPYRIGHT +0 -0
  63. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/LICENSE +0 -0
  64. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/MANIFEST.in +0 -0
  65. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/README.md +0 -0
  66. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/bsd_license.txt +0 -0
  67. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  68. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  69. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/configuring.rst +0 -0
  70. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/datastores.rst +0 -0
  71. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/dimensions.rst +0 -0
  72. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/formatters.rst +0 -0
  73. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/index.rst +0 -0
  74. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/organizing.rst +0 -0
  75. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/queries.rst +0 -0
  76. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  77. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  78. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/gpl-v3.0.txt +0 -0
  79. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/pyproject.toml +0 -0
  80. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/__init__.py +0 -0
  81. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/__init__.py +0 -0
  82. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/__init__.py +0 -0
  83. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler.py +0 -0
  84. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_collections.py +0 -0
  85. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_config.py +0 -0
  86. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  87. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  88. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  89. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_collection_type.py +0 -0
  90. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_categorization.py +0 -0
  91. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_tags.py +0 -0
  92. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_type_info.py +0 -0
  93. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config.py +0 -0
  94. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config_support.py +0 -0
  95. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  96. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  97. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  98. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions.py +0 -0
  99. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  100. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_dataset.py +0 -0
  101. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  102. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_formatter.py +0 -0
  103. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  104. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_limited_butler.py +0 -0
  105. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_location.py +0 -0
  106. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_named.py +0 -0
  107. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum.py +0 -0
  108. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  109. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  110. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  111. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  112. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class.py +0 -0
  113. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  114. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_timespan.py +0 -0
  115. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_topology.py +0 -0
  116. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  117. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  118. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  119. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  120. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/arrow_utils.py +0 -0
  121. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/__init__.py +0 -0
  122. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/butler.py +0 -0
  123. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  124. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  125. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  126. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  127. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  129. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  130. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  131. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/progress.py +0 -0
  132. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/utils.py +0 -0
  133. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/column_spec.py +0 -0
  134. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  135. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  136. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  137. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  138. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  139. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  140. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  141. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  142. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  143. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  144. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  145. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  146. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  147. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  148. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  149. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  150. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  151. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  152. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  153. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  154. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  155. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/composites.py +0 -0
  156. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  157. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  158. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  159. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  160. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  161. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  162. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  163. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  164. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  165. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  166. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  167. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  168. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  169. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/ddl.py +0 -0
  170. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  171. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  172. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  173. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  174. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  175. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  176. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  177. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  178. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  179. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  180. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  181. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  182. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  183. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  184. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  185. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  186. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  187. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  188. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  189. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  190. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  191. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  192. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  193. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  194. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  195. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  196. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  197. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/file.py +0 -0
  198. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/json.py +0 -0
  199. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/logs.py +0 -0
  200. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  201. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/packages.py +0 -0
  202. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  203. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  204. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  205. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  206. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/json.py +0 -0
  207. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/logging.py +0 -0
  208. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/mapping_factory.py +0 -0
  209. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/name_shrinker.py +0 -0
  210. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  211. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/persistence_context.py +0 -0
  212. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/progress.py +0 -0
  213. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/py.typed +0 -0
  214. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  215. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/__init__.py +0 -0
  216. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_base.py +0 -0
  217. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  218. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  219. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  220. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  221. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  222. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  223. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/driver.py +0 -0
  224. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  225. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  226. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  227. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  228. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  229. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  230. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  231. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  232. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  233. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  234. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/visitors.py +0 -0
  235. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/__init__.py +0 -0
  236. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  237. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  238. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  239. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  240. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_config.py +0 -0
  241. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  242. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  243. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  244. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/attributes.py +0 -0
  245. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  246. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  247. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  248. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  249. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  250. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  251. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  252. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  253. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  254. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  255. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  256. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  257. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  258. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  259. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  260. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  261. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  262. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  263. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  264. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  265. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  266. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  267. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  268. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  269. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  270. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  271. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  272. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/managers.py +0 -0
  273. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  274. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  275. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  276. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  277. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  278. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  279. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  280. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  281. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  282. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/opaque.py +0 -0
  283. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  284. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  285. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  286. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  287. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  288. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  289. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  290. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  291. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  292. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  293. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  294. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  295. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  296. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  297. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  298. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  299. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  300. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  301. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  302. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  303. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  304. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/versions.py +0 -0
  305. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  306. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  307. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  308. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  309. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  310. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  311. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  312. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  313. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  314. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  315. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  316. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  317. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  318. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  319. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  320. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  321. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  322. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  323. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  324. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  325. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  326. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  327. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  328. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  329. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  330. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  331. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  332. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  333. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  334. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  335. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  336. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  337. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  338. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/repo_relocation.py +0 -0
  339. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/__init__.py +0 -0
  340. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_associate.py +0 -0
  341. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  342. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  343. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  344. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  345. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configDump.py +0 -0
  346. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configValidate.py +0 -0
  347. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/createRepo.py +0 -0
  348. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  349. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  350. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  351. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  352. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  353. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  354. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  355. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  356. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  357. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  358. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  359. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  360. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  361. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/__init__.py +0 -0
  362. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  363. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  364. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  365. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  366. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  367. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  368. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  369. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  370. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  371. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  372. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  373. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  374. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  375. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  376. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  377. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  378. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  379. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  380. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  381. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server.py +0 -0
  382. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  383. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  384. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/utils.py +0 -0
  385. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/time_utils.py +0 -0
  386. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  387. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  388. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  389. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/utils.py +0 -0
  390. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  391. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  392. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  393. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  394. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  395. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/setup.cfg +0 -0
  396. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_astropyTableFormatter.py +0 -0
  397. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_butler_factory.py +0 -0
  398. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdAssociate.py +0 -0
  399. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigDump.py +0 -0
  400. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigValidate.py +0 -0
  401. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdCreate.py +0 -0
  402. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdImport.py +0 -0
  403. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdIngestFiles.py +0 -0
  404. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdPruneDatasets.py +0 -0
  405. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryCollections.py +0 -0
  406. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDataIds.py +0 -0
  407. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  408. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasets.py +0 -0
  409. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  410. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveRuns.py +0 -0
  411. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  412. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliLog.py +0 -0
  413. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliPluginLoader.py +0 -0
  414. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitCommas.py +0 -0
  415. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitKv.py +0 -0
  416. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilToUpper.py +0 -0
  417. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtils.py +0 -0
  418. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_column_spec.py +0 -0
  419. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_composites.py +0 -0
  420. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_config.py +0 -0
  421. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_connectionString.py +0 -0
  422. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_constraints.py +0 -0
  423. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_datasets.py +0 -0
  424. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_datastore.py +0 -0
  425. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_ddl.py +0 -0
  426. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_dimension_record_containers.py +0 -0
  427. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_dimensions.py +0 -0
  428. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserLex.py +0 -0
  429. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserYacc.py +0 -0
  430. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_expressions.py +0 -0
  431. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_formatter.py +0 -0
  432. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_location.py +0 -0
  433. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_logFormatter.py +0 -0
  434. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_logging.py +0 -0
  435. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_matplotlibFormatter.py +0 -0
  436. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_nonempty_mapping.py +0 -0
  437. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_normalFormExpression.py +0 -0
  438. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_obscore.py +0 -0
  439. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_packages.py +0 -0
  440. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_parquet.py +0 -0
  441. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_progress.py +0 -0
  442. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_pydantic_utils.py +0 -0
  443. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_quantum.py +0 -0
  444. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_quantumBackedButler.py +0 -0
  445. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_postgresql.py +0 -0
  446. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_sqlite.py +0 -0
  447. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_interface.py +0 -0
  448. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_query_utilities.py +0 -0
  449. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_server.py +0 -0
  450. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_storageClass.py +0 -0
  451. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_templates.py +0 -0
  452. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_testRepo.py +0 -0
  453. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_thread_utils.py +0 -0
  454. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_time_utils.py +0 -0
  455. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_timespan.py +0 -0
  456. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/tests/test_utils.py +0 -0
  457. {lsst_daf_butler-29.2025.4000 → lsst_daf_butler-29.2025.4200}/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.4000
3
+ Version: 29.2025.4200
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
@@ -29,15 +29,17 @@ from __future__ import annotations
29
29
 
30
30
  __all__ = ("DatasetAssociation",)
31
31
 
32
- from collections.abc import Iterator
32
+ from collections.abc import Iterator, Mapping
33
33
  from dataclasses import dataclass
34
34
  from typing import TYPE_CHECKING, Any
35
35
 
36
+ from ._collection_type import CollectionType
36
37
  from ._dataset_ref import DatasetRef
37
38
  from ._dataset_type import DatasetType
38
39
  from ._timespan import Timespan
39
40
 
40
41
  if TYPE_CHECKING:
42
+ from ._butler_collections import CollectionInfo
41
43
  from .queries._general_query_results import GeneralQueryResults
42
44
 
43
45
 
@@ -66,7 +68,10 @@ class DatasetAssociation:
66
68
 
67
69
  @classmethod
68
70
  def from_query_result(
69
- cls, result: GeneralQueryResults, dataset_type: DatasetType
71
+ cls,
72
+ result: GeneralQueryResults,
73
+ dataset_type: DatasetType,
74
+ collection_info: Mapping[str, CollectionInfo],
70
75
  ) -> Iterator[DatasetAssociation]:
71
76
  """Construct dataset associations from the result of general query.
72
77
 
@@ -79,11 +84,22 @@ class DatasetAssociation:
79
84
  "timespan" dataset fields for ``dataset_type``.
80
85
  dataset_type : `DatasetType`
81
86
  Dataset type, query has to include this dataset type.
87
+ collection_info : `~collections.abc.Mapping` [`str`, `CollectionInfo`]
88
+ Mapping from collection name to information about it for all
89
+ collections that may appear in the query results.
82
90
  """
83
91
  timespan_key = f"{dataset_type.name}.timespan"
84
92
  collection_key = f"{dataset_type.name}.collection"
85
93
  for _, refs, row_dict in result.iter_tuples(dataset_type):
86
- yield DatasetAssociation(refs[0], row_dict[collection_key], row_dict[timespan_key])
94
+ collection = row_dict[collection_key]
95
+ timespan = row_dict[timespan_key]
96
+ if collection_info[collection].type is not CollectionType.CALIBRATION:
97
+ # This behavior is for backwards compatibility only; in most
98
+ # contexts it makes sense to consider the timespan of a RUN
99
+ # or TAGGED collection to be unbounded, not None, and that's
100
+ # what the query results we're iterating over do.
101
+ timespan = None
102
+ yield DatasetAssociation(refs[0], collection, timespan)
87
103
 
88
104
  def __lt__(self, other: Any) -> bool:
89
105
  # Allow sorting of associations
@@ -42,7 +42,7 @@ import enum
42
42
  import logging
43
43
  import sys
44
44
  import uuid
45
- from collections.abc import Iterable, Mapping
45
+ from collections.abc import Callable, Iterable, Mapping
46
46
  from typing import (
47
47
  TYPE_CHECKING,
48
48
  Annotated,
@@ -52,6 +52,7 @@ from typing import (
52
52
  Protocol,
53
53
  Self,
54
54
  TypeAlias,
55
+ cast,
55
56
  runtime_checkable,
56
57
  )
57
58
 
@@ -63,6 +64,7 @@ from lsst.utils.classes import immutable
63
64
  from ._config_support import LookupKey
64
65
  from ._dataset_type import DatasetType, SerializedDatasetType
65
66
  from ._named import NamedKeyDict
67
+ from ._uuid import generate_uuidv7
66
68
  from .datastore.stored_file_info import StoredDatastoreItemInfo
67
69
  from .dimensions import (
68
70
  DataCoordinate,
@@ -181,7 +183,12 @@ class DatasetIdFactory:
181
183
  Dataset identifier.
182
184
  """
183
185
  if idGenerationMode is DatasetIdGenEnum.UNIQUE:
184
- return uuid.uuid4()
186
+ # Earlier versions of this code used UUIDv4. However, totally
187
+ # random IDs create problems for Postgres insert performance,
188
+ # because it scatters index updates randomly around the disk.
189
+ # UUIDv7 has similar uniqueness properties to v4, but IDs generated
190
+ # at the same time are close together in the index.
191
+ return generate_uuidv7()
185
192
  else:
186
193
  # WARNING: If you modify this code make sure that the order of
187
194
  # items in the `items` list below never changes.
@@ -559,7 +566,7 @@ class DatasetRef:
559
566
  return ref
560
567
 
561
568
  to_json = to_json_pydantic
562
- from_json: ClassVar = classmethod(from_json_pydantic)
569
+ from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
563
570
 
564
571
  @classmethod
565
572
  def _unpickle(
@@ -33,7 +33,7 @@ import re
33
33
  from collections.abc import Callable, Iterable, Mapping
34
34
  from copy import deepcopy
35
35
  from types import MappingProxyType
36
- from typing import TYPE_CHECKING, Any, ClassVar
36
+ from typing import TYPE_CHECKING, Any, ClassVar, Self, cast
37
37
 
38
38
  from pydantic import BaseModel, StrictBool, StrictStr
39
39
 
@@ -756,7 +756,7 @@ class DatasetType:
756
756
  return newType
757
757
 
758
758
  to_json = to_json_pydantic
759
- from_json: ClassVar = classmethod(from_json_pydantic)
759
+ from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
760
760
 
761
761
  def __reduce__(
762
762
  self,
@@ -27,16 +27,17 @@
27
27
 
28
28
  from __future__ import annotations
29
29
 
30
- __all__ = ("Registry",)
30
+ __all__ = ("RegistryShim",)
31
31
 
32
32
  import contextlib
33
33
  from collections.abc import Iterable, Iterator, Mapping, Sequence
34
34
  from typing import TYPE_CHECKING, Any
35
35
 
36
36
  from ._collection_type import CollectionType
37
- from ._dataset_association import DatasetAssociation
38
37
  from ._dataset_ref import DatasetId, DatasetIdGenEnum, DatasetRef
39
38
  from ._dataset_type import DatasetType
39
+ from ._exceptions import CalibrationLookupError
40
+ from ._storage_class import StorageClassFactory
40
41
  from ._timespan import Timespan
41
42
  from .dimensions import (
42
43
  DataCoordinate,
@@ -46,10 +47,11 @@ from .dimensions import (
46
47
  DimensionRecord,
47
48
  DimensionUniverse,
48
49
  )
49
- from .registry import Registry
50
50
  from .registry._collection_summary import CollectionSummary
51
51
  from .registry._defaults import RegistryDefaults
52
- from .registry.queries import DataCoordinateQueryResults, DatasetQueryResults, DimensionRecordQueryResults
52
+ from .registry._exceptions import NoDefaultCollectionError
53
+ from .registry._registry_base import RegistryBase
54
+ from .registry.queries._query_common import resolve_collections
53
55
 
54
56
  if TYPE_CHECKING:
55
57
  from .direct_butler import DirectButler
@@ -57,7 +59,7 @@ if TYPE_CHECKING:
57
59
  from .registry.interfaces import ObsCoreTableManager
58
60
 
59
61
 
60
- class RegistryShim(Registry):
62
+ class RegistryShim(RegistryBase):
61
63
  """Implementation of `Registry` interface exposed to clients by `Butler`.
62
64
 
63
65
  Parameters
@@ -74,7 +76,7 @@ class RegistryShim(Registry):
74
76
  """
75
77
 
76
78
  def __init__(self, butler: DirectButler):
77
- self._butler = butler
79
+ super().__init__(butler)
78
80
  self._registry = butler._registry
79
81
 
80
82
  def isWriteable(self) -> bool:
@@ -183,13 +185,76 @@ class RegistryShim(Registry):
183
185
  *,
184
186
  collections: CollectionArgType | None = None,
185
187
  timespan: Timespan | None = None,
188
+ datastore_records: bool = False,
186
189
  **kwargs: Any,
187
190
  ) -> DatasetRef | None:
188
191
  # Docstring inherited from a base class.
189
- return self._registry.findDataset(
190
- datasetType, dataId, collections=collections, timespan=timespan, **kwargs
192
+ if not isinstance(datasetType, DatasetType):
193
+ datasetType = self.getDatasetType(datasetType)
194
+
195
+ dataId = DataCoordinate.standardize(
196
+ dataId,
197
+ dimensions=datasetType.dimensions,
198
+ universe=self.dimensions,
199
+ defaults=self.defaults.dataId,
200
+ **kwargs,
191
201
  )
192
202
 
203
+ with self._butler.query() as query:
204
+ resolved_collections = resolve_collections(self._butler, collections)
205
+ if not resolved_collections:
206
+ if collections is None:
207
+ raise NoDefaultCollectionError("No collections provided, and no default collections set")
208
+ else:
209
+ return None
210
+
211
+ if datasetType.isCalibration() and timespan is None:
212
+ # Filter out calibration collections, because with no timespan
213
+ # we have no way of selecting a dataset from them.
214
+ collection_info = self._butler.collections.query_info(
215
+ resolved_collections, flatten_chains=True
216
+ )
217
+ resolved_collections = [
218
+ info.name for info in collection_info if info.type != CollectionType.CALIBRATION
219
+ ]
220
+ if not resolved_collections:
221
+ return None
222
+
223
+ result = query.datasets(datasetType, resolved_collections, find_first=True).limit(2)
224
+ dataset_type_name = result.dataset_type.name
225
+ # Search only on the 'required' dimensions for the dataset type.
226
+ # Any extra values provided by the user are ignored.
227
+ minimal_data_id = DataCoordinate.standardize(
228
+ dataId.subset(datasetType.dimensions.required).required, universe=self.dimensions
229
+ )
230
+ result = result.where(minimal_data_id)
231
+ if (
232
+ datasetType.isCalibration()
233
+ and timespan is not None
234
+ and (timespan.begin is not None or timespan.end is not None)
235
+ ):
236
+ timespan_column = query.expression_factory[dataset_type_name].timespan
237
+ result = result.where(timespan_column.overlaps(timespan))
238
+
239
+ datasets = list(result)
240
+ if len(datasets) == 1:
241
+ ref = datasets[0]
242
+ if dataId.hasRecords():
243
+ ref = ref.expanded(dataId)
244
+ # Propagate storage class from user-provided DatasetType, which
245
+ # may not match the definition in the database.
246
+ ref = ref.overrideStorageClass(datasetType.storageClass_name)
247
+ if datastore_records:
248
+ ref = self._registry.get_datastore_records(ref)
249
+ return ref
250
+ elif len(datasets) == 0:
251
+ return None
252
+ else:
253
+ raise CalibrationLookupError(
254
+ f"Ambiguous calibration lookup for {datasetType} with timespan {timespan}"
255
+ f" in collections {resolved_collections}."
256
+ )
257
+
193
258
  def insertDatasets(
194
259
  self,
195
260
  datasetType: DatasetType | str,
@@ -299,97 +364,11 @@ class RegistryShim(Registry):
299
364
  expression, datasetType, collectionTypes, flattenChains, includeChains
300
365
  )
301
366
 
302
- def queryDatasets(
303
- self,
304
- datasetType: Any,
305
- *,
306
- collections: CollectionArgType | None = None,
307
- dimensions: Iterable[str] | None = None,
308
- dataId: DataId | None = None,
309
- where: str = "",
310
- findFirst: bool = False,
311
- bind: Mapping[str, Any] | None = None,
312
- check: bool = True,
313
- **kwargs: Any,
314
- ) -> DatasetQueryResults:
315
- # Docstring inherited from a base class.
316
- return self._registry.queryDatasets(
317
- datasetType,
318
- collections=collections,
319
- dimensions=dimensions,
320
- dataId=dataId,
321
- where=where,
322
- findFirst=findFirst,
323
- bind=bind,
324
- check=check,
325
- **kwargs,
326
- )
327
-
328
- def queryDataIds(
329
- self,
330
- dimensions: DimensionGroup | Iterable[str] | str,
331
- *,
332
- dataId: DataId | None = None,
333
- datasets: Any = None,
334
- collections: CollectionArgType | None = None,
335
- where: str = "",
336
- bind: Mapping[str, Any] | None = None,
337
- check: bool = True,
338
- **kwargs: Any,
339
- ) -> DataCoordinateQueryResults:
340
- # Docstring inherited from a base class.
341
- return self._registry.queryDataIds(
342
- dimensions,
343
- dataId=dataId,
344
- datasets=datasets,
345
- collections=collections,
346
- where=where,
347
- bind=bind,
348
- check=check,
349
- **kwargs,
350
- )
351
-
352
- def queryDimensionRecords(
353
- self,
354
- element: DimensionElement | str,
355
- *,
356
- dataId: DataId | None = None,
357
- datasets: Any = None,
358
- collections: CollectionArgType | None = None,
359
- where: str = "",
360
- bind: Mapping[str, Any] | None = None,
361
- check: bool = True,
362
- **kwargs: Any,
363
- ) -> DimensionRecordQueryResults:
364
- # Docstring inherited from a base class.
365
- return self._registry.queryDimensionRecords(
366
- element,
367
- dataId=dataId,
368
- datasets=datasets,
369
- collections=collections,
370
- where=where,
371
- bind=bind,
372
- check=check,
373
- **kwargs,
374
- )
375
-
376
- def queryDatasetAssociations(
377
- self,
378
- datasetType: str | DatasetType,
379
- collections: CollectionArgType | None = ...,
380
- *,
381
- collectionTypes: Iterable[CollectionType] = CollectionType.all(),
382
- flattenChains: bool = False,
383
- ) -> Iterator[DatasetAssociation]:
384
- # Docstring inherited from a base class.
385
- return self._registry.queryDatasetAssociations(
386
- datasetType,
387
- collections,
388
- collectionTypes=collectionTypes,
389
- flattenChains=flattenChains,
390
- )
391
-
392
367
  @property
393
368
  def obsCoreTableManager(self) -> ObsCoreTableManager | None:
394
369
  # Docstring inherited from a base class.
395
370
  return self._registry.obsCoreTableManager
371
+
372
+ @property
373
+ def storageClasses(self) -> StorageClassFactory:
374
+ return self._registry.storageClasses
@@ -29,3 +29,6 @@
29
29
  by other LSST packages. The interfaces and behavior of these functions are
30
30
  subject to change at any time.
31
31
  """
32
+
33
+ # UUIDv7 generation is used by pipe_base.
34
+ from .._uuid import generate_uuidv7
@@ -0,0 +1,79 @@
1
+ # This file is part of daf_butler.
2
+ #
3
+ # Developed for the LSST Data Management System.
4
+ # This product includes software developed by the LSST Project
5
+ # (http://www.lsst.org).
6
+ # See the COPYRIGHT file at the top-level directory of this distribution
7
+ # for details of code ownership.
8
+ #
9
+ # This software is dual licensed under the GNU General Public License and also
10
+ # under a 3-clause BSD license. Recipients may choose which of these licenses
11
+ # to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
12
+ # respectively. If you choose the GPL option then the following text applies
13
+ # (but note that there is still no warranty even if you opt for BSD instead):
14
+ #
15
+ # This program is free software: you can redistribute it and/or modify
16
+ # it under the terms of the GNU General Public License as published by
17
+ # the Free Software Foundation, either version 3 of the License, or
18
+ # (at your option) any later version.
19
+ #
20
+ # This program is distributed in the hope that it will be useful,
21
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
+ # GNU General Public License for more details.
24
+ #
25
+ # You should have received a copy of the GNU General Public License
26
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
+
28
+ from __future__ import annotations
29
+
30
+ __all__ = ("generate_uuidv7",)
31
+
32
+ import time
33
+ from uuid import UUID, uuid4
34
+
35
+
36
+ def generate_uuidv7() -> UUID:
37
+ """Generate a v7 UUID compliant with IETF RFC-9562.
38
+
39
+ Returns
40
+ -------
41
+ uuid : `uuid.UUID`
42
+ Version 7 UUID.
43
+ """
44
+ # Python 3.14 will include an implementation of UUIDv7 that can replace
45
+ # this, but at the time of writing 3.14 hasn't been released and we're
46
+ # still supporting 3.12. There are a few libraries on PyPI with an
47
+ # implementation of v7 UUIDs, but none of them look well-maintained.
48
+ #
49
+ # This is the format of a v7 UUID:
50
+ # 0 1 2 3
51
+ # 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
52
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
53
+ # | unix_ts_ms |
54
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
55
+ # | unix_ts_ms | ver | rand_a |
56
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
57
+ # |var| rand_b |
58
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59
+ # | rand_b |
60
+ # +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
61
+ #
62
+ # It's basically identical to a UUID v4, but with the top 6 bytes
63
+ # replaced with a millisecond UNIX timestamp.
64
+
65
+ # Generate a UUIDv4 for the random portion of the data.
66
+ # A little wasteful, but means we inherit the best practices from
67
+ # the standard library for generating this random data.
68
+ byte_data = bytearray(uuid4().bytes)
69
+
70
+ # Replace high 6 bytes with millisecond UNIX timestamp.
71
+ timestamp = time.time_ns() // 1_000_000
72
+ timestamp_bytes = timestamp.to_bytes(length=6, byteorder="big")
73
+ byte_data[0:6] = timestamp_bytes
74
+
75
+ # Set 4-bit version field to 7.
76
+ byte_data[6] &= 0x0F
77
+ byte_data[6] |= 0x70
78
+
79
+ return UUID(bytes=bytes(byte_data))
@@ -41,6 +41,8 @@ from ..utils import ButlerCommand
41
41
  noNonRunCollectionsMsg = "No non-RUN collections were found."
42
42
  willRemoveCollectionMsg = "The following collections will be removed:"
43
43
  removedCollectionsMsg = "Removed collections"
44
+ willRemoveCollectionChainsMsg = "Collections to be removed from their parent collection chains:"
45
+ removedCollectionChainsMsg = "Removed collections from their parent collection chains:"
44
46
  canNotRemoveFoundRuns = "The following RUN collections were found but can NOT be removed by this command:"
45
47
  didNotRemoveFoundRuns = "Found RUN collections but they can NOT be removed by this command:"
46
48
  abortedMsg = "Aborted."
@@ -53,6 +55,11 @@ abortedMsg = "Aborted."
53
55
  )
54
56
  @confirm_option()
55
57
  @options_file_option()
58
+ @click.option(
59
+ "--remove-from-parents",
60
+ is_flag=True,
61
+ help="Forcibly remove the collection even if it is still referenced from collection chains.",
62
+ )
56
63
  def remove_collections(**kwargs: Any) -> None: # numpydoc ignore=PR01
57
64
  """Remove one or more non-RUN collections.
58
65
 
@@ -73,6 +80,10 @@ def remove_collections(**kwargs: Any) -> None: # numpydoc ignore=PR01
73
80
  result.removeCollectionsTable.pprint_all(align="<")
74
81
  else:
75
82
  print("\n" + noNonRunCollectionsMsg)
83
+ if len(result.removeChainsTable):
84
+ print("\n" + willRemoveCollectionChainsMsg)
85
+ result.removeChainsTable.pprint_all(align="<")
86
+ print()
76
87
  if len(result.runsTable):
77
88
  print("\n" + canNotRemoveFoundRuns)
78
89
  result.runsTable.pprint_all(align="<")
@@ -86,6 +97,10 @@ def remove_collections(**kwargs: Any) -> None: # numpydoc ignore=PR01
86
97
  else:
87
98
  print("\n" + removedCollectionsMsg + ":\n")
88
99
  result.removeCollectionsTable.pprint_all(align="<")
100
+ if len(result.removeChainsTable):
101
+ print("\n" + removedCollectionChainsMsg)
102
+ result.removeChainsTable.pprint_all(align="<")
103
+ print()
89
104
  if len(result.runsTable):
90
105
  print("\n" + didNotRemoveFoundRuns)
91
106
  result.runsTable.pprint_all(align="<")
@@ -43,8 +43,8 @@ __all__ = (
43
43
 
44
44
  import numbers
45
45
  from abc import abstractmethod
46
- from collections.abc import Iterable, Iterator, Mapping
47
- from typing import TYPE_CHECKING, Any, ClassVar, TypeAlias, overload
46
+ from collections.abc import Callable, Iterable, Iterator, Mapping
47
+ from typing import TYPE_CHECKING, Any, ClassVar, Self, TypeAlias, cast, overload
48
48
 
49
49
  import pydantic
50
50
 
@@ -753,7 +753,7 @@ class DataCoordinate:
753
753
  return dataId
754
754
 
755
755
  to_json = to_json_pydantic
756
- from_json: ClassVar = classmethod(from_json_pydantic)
756
+ from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
757
757
 
758
758
 
759
759
  DataId = DataCoordinate | Mapping[str, Any]
@@ -34,7 +34,8 @@ __all__ = (
34
34
  )
35
35
 
36
36
  from abc import abstractmethod
37
- from typing import TYPE_CHECKING, Annotated, Any, ClassVar, TypeAlias, Union, cast
37
+ from collections.abc import Callable
38
+ from typing import TYPE_CHECKING, Annotated, Any, ClassVar, Self, TypeAlias, Union, cast
38
39
 
39
40
  import pydantic
40
41
  from pydantic_core import core_schema
@@ -212,7 +213,7 @@ class DimensionElement(TopologicalRelationshipEndpoint):
212
213
  return universe[simple]
213
214
 
214
215
  to_json = to_json_generic
215
- from_json: ClassVar = classmethod(from_json_generic)
216
+ from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_generic))
216
217
 
217
218
  def hasTable(self) -> bool:
218
219
  """Indicate if this element is associated with a table.
@@ -30,8 +30,8 @@ from __future__ import annotations
30
30
  __all__ = ("DimensionRecord", "SerializedDimensionRecord", "SerializedKeyValueDimensionRecord")
31
31
 
32
32
  import itertools
33
- from collections.abc import Hashable
34
- from typing import TYPE_CHECKING, Any, ClassVar, TypeAlias
33
+ from collections.abc import Callable, Hashable
34
+ from typing import TYPE_CHECKING, Any, ClassVar, Self, TypeAlias, cast
35
35
 
36
36
  import pydantic
37
37
  from pydantic import BaseModel, Field, StrictBool, StrictFloat, StrictInt, StrictStr, create_model
@@ -505,7 +505,7 @@ class DimensionRecord:
505
505
  return dimRec
506
506
 
507
507
  to_json = to_json_pydantic
508
- from_json: ClassVar = classmethod(from_json_pydantic)
508
+ from_json: ClassVar[Callable[..., Self]] = cast(Callable[..., Self], classmethod(from_json_pydantic))
509
509
 
510
510
  def toDict(self, splitTimespan: bool = False) -> dict[str, Any]:
511
511
  """Return a vanilla `dict` representation of this record.
@@ -1302,7 +1302,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
1302
1302
 
1303
1303
  data_id, kwargs = self._rewrite_data_id(data_id, parent_type, **kwargs)
1304
1304
 
1305
- ref = self._registry.findDataset(
1305
+ ref = self.registry.findDataset(
1306
1306
  parent_type,
1307
1307
  data_id,
1308
1308
  collections=collections,
@@ -641,7 +641,11 @@ class DirectQueryDriver(QueryDriver):
641
641
  # datasets later.
642
642
  predicate_constraints = PredicateConstraintsSummary(tree.predicate)
643
643
  # Use the default data ID to apply additional constraints where needed.
644
- predicate_constraints.apply_default_data_id(self._default_data_id, tree.dimensions)
644
+ predicate_constraints.apply_default_data_id(
645
+ self._default_data_id,
646
+ tree.dimensions,
647
+ validate_governor_constraints=tree.validateGovernorConstraints,
648
+ )
645
649
  predicate = predicate_constraints.predicate
646
650
  # Delegate to the dimensions manager to rewrite the predicate and start
647
651
  # a SqlSelectBuilder to cover any spatial overlap joins or constraints.
@@ -241,7 +241,7 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
241
241
 
242
242
  def visitBind(self, name: str, node: Node) -> _VisitorResult:
243
243
  if name not in self.context.bind:
244
- raise InvalidQueryError("Name {name!r} is not in the bind map.")
244
+ raise InvalidQueryError(f"Name {name!r} is not in the bind map.")
245
245
  # Logic in visitIdentifier handles binds.
246
246
  return self.visitIdentifier(name, node)
247
247
 
@@ -746,6 +746,10 @@ class Query(QueryBase):
746
746
  driver=self._driver,
747
747
  )
748
748
 
749
+ def _skip_governor_validation(self) -> Query:
750
+ tree = self._tree.model_copy(update={"validateGovernorConstraints": False})
751
+ return Query(tree=tree, driver=self._driver)
752
+
749
753
  def _join_dataset_search_impl(
750
754
  self,
751
755
  dataset_type: str | DatasetType,
@@ -71,7 +71,10 @@ class PredicateConstraintsSummary:
71
71
  )
72
72
 
73
73
  def apply_default_data_id(
74
- self, default_data_id: DataCoordinate, query_dimensions: DimensionGroup
74
+ self,
75
+ default_data_id: DataCoordinate,
76
+ query_dimensions: DimensionGroup,
77
+ validate_governor_constraints: bool,
75
78
  ) -> None:
76
79
  """Augment the predicate and summary by adding missing constraints for
77
80
  governor dimensions using a default data ID.
@@ -81,9 +84,11 @@ class PredicateConstraintsSummary:
81
84
  default_data_id : `DataCoordinate`
82
85
  Data ID values that will be used to constrain the query if governor
83
86
  dimensions have not already been constrained by the predicate.
84
-
85
87
  query_dimensions : `DimensionGroup`
86
88
  The set of dimensions returned in result rows from the query.
89
+ validate_governor_constraints : `bool`
90
+ If `True`, enforce the requirement that governor dimensions must be
91
+ constrained if any dimensions that depend on them have constraints.
87
92
  """
88
93
  # Find governor dimensions required by the predicate.
89
94
  # If these are not constrained by the predicate or the default data ID,
@@ -108,7 +113,7 @@ class PredicateConstraintsSummary:
108
113
  self.predicate = self.predicate.logical_and(
109
114
  _create_data_id_predicate(governor, data_id_value, query_dimensions.universe)
110
115
  )
111
- elif governor in where_governors:
116
+ elif governor in where_governors and validate_governor_constraints:
112
117
  # Check that the predicate doesn't reference any dimensions
113
118
  # without constraining their governor dimensions, since
114
119
  # that's a particularly easy mistake to make and it's
@@ -146,6 +146,11 @@ class QueryTree(QueryTreeBase):
146
146
  predicate: Predicate = Predicate.from_bool(True)
147
147
  """Boolean expression trees whose logical AND defines a row filter."""
148
148
 
149
+ validateGovernorConstraints: bool = True
150
+ """If True, enforce the requirement that governor dimensions must be
151
+ constrained if any dimensions that depend on them have constraints.
152
+ """
153
+
149
154
  def iter_all_dataset_searches(self) -> Iterator[tuple[str | AnyDatasetType, DatasetSearch]]:
150
155
  yield from self.datasets.items()
151
156
  if self.any_dataset is not None:
@@ -1449,6 +1449,9 @@ class Registry(ABC):
1449
1449
  """
1450
1450
  return None
1451
1451
 
1452
- storageClasses: StorageClassFactory
1453
- """All storage classes known to the registry (`StorageClassFactory`).
1454
- """
1452
+ @property
1453
+ def storageClasses(self) -> StorageClassFactory:
1454
+ """All storage classes known to the registry
1455
+ (`StorageClassFactory`).
1456
+ """
1457
+ raise NotImplementedError()