lsst-daf-butler 29.2025.4100__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 (453) hide show
  1. {lsst_daf_butler-29.2025.4100/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4200}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_association.py +19 -3
  3. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_registry_shim.py +68 -2
  4. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +15 -0
  5. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +1 -1
  6. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_expression_strings.py +1 -1
  7. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry_base.py +13 -5
  8. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +1 -1
  9. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/sql_registry.py +2 -172
  10. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_registry.py +93 -0
  11. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_factory.py +2 -2
  12. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +3 -1
  13. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/remote_butler/authentication/cadc.py +106 -0
  14. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeCollections.py +46 -13
  15. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/butler_queries.py +40 -1
  16. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/tests/server_available.py +53 -0
  17. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/timespan_database_representation.py +8 -0
  18. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_context.py +5 -16
  19. lsst_daf_butler-29.2025.4200/python/lsst/daf/butler/version.py +2 -0
  20. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  21. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
  22. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_authentication.py +9 -10
  23. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_butler.py +9 -9
  24. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveCollections.py +29 -4
  25. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_gafaelfawr.py +4 -6
  26. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_remote.py +3 -7
  27. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_remote_butler.py +7 -28
  28. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_simpleButler.py +3 -4
  29. lsst_daf_butler-29.2025.4100/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -54
  30. lsst_daf_butler-29.2025.4100/python/lsst/daf/butler/version.py +0 -2
  31. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/COPYRIGHT +0 -0
  32. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/LICENSE +0 -0
  33. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/MANIFEST.in +0 -0
  34. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/README.md +0 -0
  35. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/bsd_license.txt +0 -0
  36. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  37. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  38. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/configuring.rst +0 -0
  39. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/datastores.rst +0 -0
  40. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/dimensions.rst +0 -0
  41. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/formatters.rst +0 -0
  42. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/index.rst +0 -0
  43. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/organizing.rst +0 -0
  44. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/queries.rst +0 -0
  45. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  46. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  47. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/gpl-v3.0.txt +0 -0
  48. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/pyproject.toml +0 -0
  49. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/__init__.py +0 -0
  50. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/__init__.py +0 -0
  51. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/__init__.py +0 -0
  52. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler.py +0 -0
  53. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_collections.py +0 -0
  54. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_config.py +0 -0
  55. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  56. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  57. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  58. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_collection_type.py +0 -0
  59. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_categorization.py +0 -0
  60. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_tags.py +0 -0
  61. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_column_type_info.py +0 -0
  62. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config.py +0 -0
  63. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_config_support.py +0 -0
  64. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  65. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  66. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  67. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_dataset_type.py +0 -0
  68. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  69. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions.py +0 -0
  70. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  71. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_dataset.py +0 -0
  72. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  73. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_formatter.py +0 -0
  74. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  75. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_limited_butler.py +0 -0
  76. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_location.py +0 -0
  77. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_named.py +0 -0
  78. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum.py +0 -0
  79. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  80. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  81. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
  82. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  83. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  84. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class.py +0 -0
  85. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  86. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_timespan.py +0 -0
  87. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_topology.py +0 -0
  88. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  89. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  90. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  91. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  92. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/_uuid.py +0 -0
  93. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/arrow_utils.py +0 -0
  94. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/__init__.py +0 -0
  95. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/butler.py +0 -0
  96. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  97. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  98. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  99. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  100. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  101. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  102. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  103. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  104. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/progress.py +0 -0
  105. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/cli/utils.py +0 -0
  106. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/column_spec.py +0 -0
  107. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  108. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  109. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  110. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  111. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  112. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  113. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  114. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  115. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  116. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  117. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  118. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  119. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  120. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  121. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  122. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  123. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  124. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  125. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  126. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  127. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  128. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/composites.py +0 -0
  129. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  130. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  131. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  132. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  133. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  134. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  135. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  136. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  137. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  138. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  139. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  140. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  141. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  142. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/ddl.py +0 -0
  143. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  144. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  145. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  146. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  147. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  148. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  149. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  150. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  151. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  152. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  153. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  154. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  155. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  156. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  157. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  158. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  159. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  160. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  161. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  162. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  163. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  164. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  165. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  166. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  167. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  168. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  169. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  170. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  171. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  172. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  173. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  174. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/file.py +0 -0
  175. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/json.py +0 -0
  176. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/logs.py +0 -0
  177. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  178. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/packages.py +0 -0
  179. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  180. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  181. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  182. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  183. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/json.py +0 -0
  184. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/logging.py +0 -0
  185. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/mapping_factory.py +0 -0
  186. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/name_shrinker.py +0 -0
  187. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  188. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/persistence_context.py +0 -0
  189. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/progress.py +0 -0
  190. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/py.typed +0 -0
  191. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  192. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/__init__.py +0 -0
  193. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_base.py +0 -0
  194. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  195. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  196. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  197. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  198. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  199. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/_query.py +0 -0
  200. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  201. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/driver.py +0 -0
  202. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  203. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  204. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  205. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  206. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  207. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  208. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  209. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  210. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  211. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  212. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  213. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  214. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/queries/visitors.py +0 -0
  215. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/__init__.py +0 -0
  216. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  217. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  218. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  219. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  220. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_config.py +0 -0
  221. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  222. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  223. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry.py +0 -0
  224. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  225. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/attributes.py +0 -0
  226. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  228. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  229. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  230. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  231. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  232. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  233. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  234. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  235. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  236. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  237. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  238. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  239. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  240. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  241. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  242. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  243. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  244. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  245. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  246. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  247. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  248. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  249. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  250. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  251. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  252. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  253. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  254. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  255. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/managers.py +0 -0
  256. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  257. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  258. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  259. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  260. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  261. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  262. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  263. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  264. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  265. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/opaque.py +0 -0
  266. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  267. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  268. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
  269. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  270. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
  271. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
  272. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
  273. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  274. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  275. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  276. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  277. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  278. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  279. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  280. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  281. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  282. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  283. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  284. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  285. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  286. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  287. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  288. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  289. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  290. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  291. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  292. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  293. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  294. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  295. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/versions.py +0 -0
  296. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  297. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  298. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  299. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  300. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  301. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  302. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  303. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  304. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  305. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  306. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  307. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  308. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  309. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  310. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  311. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  312. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  313. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  314. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  315. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  316. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  317. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  318. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  319. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  320. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  321. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  322. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  323. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  324. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  325. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  326. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  327. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  328. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  329. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  330. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/repo_relocation.py +0 -0
  331. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/__init__.py +0 -0
  332. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_associate.py +0 -0
  333. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  334. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  335. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  336. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  337. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configDump.py +0 -0
  338. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/configValidate.py +0 -0
  339. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/createRepo.py +0 -0
  340. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  341. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  342. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  343. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  344. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  345. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  346. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  347. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  348. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  349. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  350. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  351. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  352. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  353. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/__init__.py +0 -0
  354. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  355. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  356. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  357. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  358. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  359. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  360. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  361. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  362. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  363. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  364. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  365. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  366. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  367. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  368. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  369. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  370. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  371. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  372. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  373. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  374. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server.py +0 -0
  375. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  376. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  377. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/tests/utils.py +0 -0
  378. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/time_utils.py +0 -0
  379. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  380. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  381. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  382. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst/daf/butler/utils.py +0 -0
  383. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  384. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  385. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  386. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  387. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  388. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/setup.cfg +0 -0
  389. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_astropyTableFormatter.py +0 -0
  390. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_butler_factory.py +0 -0
  391. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdAssociate.py +0 -0
  392. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigDump.py +0 -0
  393. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdConfigValidate.py +0 -0
  394. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdCreate.py +0 -0
  395. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdImport.py +0 -0
  396. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdIngestFiles.py +0 -0
  397. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdPruneDatasets.py +0 -0
  398. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryCollections.py +0 -0
  399. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDataIds.py +0 -0
  400. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  401. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDatasets.py +0 -0
  402. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  403. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRemoveRuns.py +0 -0
  404. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  405. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliLog.py +0 -0
  406. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliPluginLoader.py +0 -0
  407. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitCommas.py +0 -0
  408. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilSplitKv.py +0 -0
  409. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtilToUpper.py +0 -0
  410. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_cliUtils.py +0 -0
  411. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_column_spec.py +0 -0
  412. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_composites.py +0 -0
  413. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_config.py +0 -0
  414. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_connectionString.py +0 -0
  415. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_constraints.py +0 -0
  416. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_datasets.py +0 -0
  417. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_datastore.py +0 -0
  418. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_ddl.py +0 -0
  419. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_dimension_record_containers.py +0 -0
  420. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_dimensions.py +0 -0
  421. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserLex.py +0 -0
  422. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_exprParserYacc.py +0 -0
  423. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_expressions.py +0 -0
  424. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_formatter.py +0 -0
  425. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_location.py +0 -0
  426. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_logFormatter.py +0 -0
  427. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_logging.py +0 -0
  428. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_matplotlibFormatter.py +0 -0
  429. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_nonempty_mapping.py +0 -0
  430. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_normalFormExpression.py +0 -0
  431. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_obscore.py +0 -0
  432. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_packages.py +0 -0
  433. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_parquet.py +0 -0
  434. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_postgresql.py +0 -0
  435. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_progress.py +0 -0
  436. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_pydantic_utils.py +0 -0
  437. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_quantum.py +0 -0
  438. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_quantumBackedButler.py +0 -0
  439. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_postgresql.py +0 -0
  440. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_direct_sqlite.py +0 -0
  441. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_interface.py +0 -0
  442. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_query_utilities.py +0 -0
  443. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_server.py +0 -0
  444. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_sqlite.py +0 -0
  445. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_storageClass.py +0 -0
  446. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_templates.py +0 -0
  447. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_testRepo.py +0 -0
  448. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_thread_utils.py +0 -0
  449. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_time_utils.py +0 -0
  450. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_timespan.py +0 -0
  451. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_utils.py +0 -0
  452. {lsst_daf_butler-29.2025.4100 → lsst_daf_butler-29.2025.4200}/tests/test_uuid.py +0 -0
  453. {lsst_daf_butler-29.2025.4100 → 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.4100
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
@@ -36,6 +36,7 @@ from typing import TYPE_CHECKING, Any
36
36
  from ._collection_type import CollectionType
37
37
  from ._dataset_ref import DatasetId, DatasetIdGenEnum, DatasetRef
38
38
  from ._dataset_type import DatasetType
39
+ from ._exceptions import CalibrationLookupError
39
40
  from ._storage_class import StorageClassFactory
40
41
  from ._timespan import Timespan
41
42
  from .dimensions import (
@@ -48,7 +49,9 @@ from .dimensions import (
48
49
  )
49
50
  from .registry._collection_summary import CollectionSummary
50
51
  from .registry._defaults import RegistryDefaults
52
+ from .registry._exceptions import NoDefaultCollectionError
51
53
  from .registry._registry_base import RegistryBase
54
+ from .registry.queries._query_common import resolve_collections
52
55
 
53
56
  if TYPE_CHECKING:
54
57
  from .direct_butler import DirectButler
@@ -182,13 +185,76 @@ class RegistryShim(RegistryBase):
182
185
  *,
183
186
  collections: CollectionArgType | None = None,
184
187
  timespan: Timespan | None = None,
188
+ datastore_records: bool = False,
185
189
  **kwargs: Any,
186
190
  ) -> DatasetRef | None:
187
191
  # Docstring inherited from a base class.
188
- return self._registry.findDataset(
189
- 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,
190
201
  )
191
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
+
192
258
  def insertDatasets(
193
259
  self,
194
260
  datasetType: DatasetType | str,
@@ -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="<")
@@ -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,
@@ -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
 
@@ -231,20 +231,28 @@ class RegistryBase(Registry):
231
231
  collectionTypes: Iterable[CollectionType] = CollectionType.all(),
232
232
  flattenChains: bool = False,
233
233
  ) -> Iterator[DatasetAssociation]:
234
- # queryCollections only accepts DatasetType.
235
234
  if isinstance(datasetType, str):
236
235
  datasetType = self.getDatasetType(datasetType)
237
- resolved_collections = self.queryCollections(
238
- collections, datasetType=datasetType, collectionTypes=collectionTypes, flattenChains=flattenChains
239
- )
240
236
  with self._butler.query() as query:
237
+ resolved_collections = self.queryCollections(
238
+ collections,
239
+ datasetType=datasetType,
240
+ collectionTypes=collectionTypes,
241
+ flattenChains=flattenChains,
242
+ )
243
+ # It's annoyingly difficult to just do the collection query once,
244
+ # since query_info doesn't accept all the expression types that
245
+ # queryCollections does. But it's all cached anyway.
246
+ collection_info = {
247
+ info.name: info for info in self._butler.collections.query_info(resolved_collections)
248
+ }
241
249
  query = query.join_dataset_search(datasetType, resolved_collections)
242
250
  result = query.general(
243
251
  datasetType.dimensions,
244
252
  dataset_fields={datasetType.name: {"dataset_id", "run", "collection", "timespan"}},
245
253
  find_first=False,
246
254
  )
247
- yield from DatasetAssociation.from_query_result(result, datasetType)
255
+ yield from DatasetAssociation.from_query_result(result, datasetType, collection_info)
248
256
 
249
257
  def _resolve_dataset_types(self, dataset_types: object | None) -> list[str]:
250
258
  if dataset_types is None:
@@ -1425,7 +1425,7 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
1425
1425
  )
1426
1426
  if "timespan" in fields:
1427
1427
  tags_builder.joins.timespans[fields_key] = self._db.getTimespanRepresentation().fromLiteral(
1428
- None
1428
+ Timespan(None, None)
1429
1429
  )
1430
1430
  calibs_builder: SqlSelectBuilder | None = None
1431
1431
  if CollectionType.CALIBRATION in collection_types:
@@ -36,7 +36,7 @@ import logging
36
36
  import warnings
37
37
  from collections import defaultdict
38
38
  from collections.abc import Iterable, Iterator, Mapping, Sequence
39
- from typing import TYPE_CHECKING, Any, cast
39
+ from typing import TYPE_CHECKING, Any
40
40
 
41
41
  import sqlalchemy
42
42
 
@@ -44,16 +44,10 @@ from lsst.resources import ResourcePathExpression
44
44
  from lsst.utils.iteration import ensure_iterable
45
45
 
46
46
  from .._collection_type import CollectionType
47
- from .._column_tags import DatasetColumnTag
48
47
  from .._config import Config
49
48
  from .._dataset_ref import DatasetId, DatasetIdGenEnum, DatasetRef
50
49
  from .._dataset_type import DatasetType
51
- from .._exceptions import (
52
- CalibrationLookupError,
53
- DataIdValueError,
54
- DimensionNameError,
55
- InconsistentDataIdError,
56
- )
50
+ from .._exceptions import DataIdValueError, DimensionNameError, InconsistentDataIdError
57
51
  from .._storage_class import StorageClassFactory
58
52
  from .._timespan import Timespan
59
53
  from ..dimensions import (
@@ -90,7 +84,6 @@ if TYPE_CHECKING:
90
84
  from .._butler_config import ButlerConfig
91
85
  from ..datastore._datastore import DatastoreOpaqueTable
92
86
  from ..datastore.stored_file_info import StoredDatastoreItemInfo
93
- from ..registry._registry import CollectionArgType
94
87
  from ..registry.interfaces import (
95
88
  CollectionRecord,
96
89
  Database,
@@ -830,169 +823,6 @@ class SqlRegistry:
830
823
  """
831
824
  return True
832
825
 
833
- def findDataset(
834
- self,
835
- datasetType: DatasetType | str,
836
- dataId: DataId | None = None,
837
- *,
838
- collections: CollectionArgType | None = None,
839
- timespan: Timespan | None = None,
840
- datastore_records: bool = False,
841
- **kwargs: Any,
842
- ) -> DatasetRef | None:
843
- """Find a dataset given its `DatasetType` and data ID.
844
-
845
- This can be used to obtain a `DatasetRef` that permits the dataset to
846
- be read from a `Datastore`. If the dataset is a component and can not
847
- be found using the provided dataset type, a dataset ref for the parent
848
- will be returned instead but with the correct dataset type.
849
-
850
- Parameters
851
- ----------
852
- datasetType : `DatasetType` or `str`
853
- A `DatasetType` or the name of one. If this is a `DatasetType`
854
- instance, its storage class will be respected and propagated to
855
- the output, even if it differs from the dataset type definition
856
- in the registry, as long as the storage classes are convertible.
857
- dataId : `dict` or `DataCoordinate`, optional
858
- A `dict`-like object containing the `Dimension` links that identify
859
- the dataset within a collection.
860
- collections : collection expression, optional
861
- An expression that fully or partially identifies the collections to
862
- search for the dataset; see
863
- :ref:`daf_butler_collection_expressions` for more information.
864
- Defaults to ``self.defaults.collections``.
865
- timespan : `Timespan`, optional
866
- A timespan that the validity range of the dataset must overlap.
867
- If not provided, any `~CollectionType.CALIBRATION` collections
868
- matched by the ``collections`` argument will not be searched.
869
- datastore_records : `bool`, optional
870
- Whether to attach datastore records to the `DatasetRef`.
871
- **kwargs
872
- Additional keyword arguments passed to
873
- `DataCoordinate.standardize` to convert ``dataId`` to a true
874
- `DataCoordinate` or augment an existing one.
875
-
876
- Returns
877
- -------
878
- ref : `DatasetRef`
879
- A reference to the dataset, or `None` if no matching Dataset
880
- was found.
881
-
882
- Raises
883
- ------
884
- lsst.daf.butler.registry.NoDefaultCollectionError
885
- Raised if ``collections`` is `None` and
886
- ``self.defaults.collections`` is `None`.
887
- LookupError
888
- Raised if one or more data ID keys are missing.
889
- lsst.daf.butler.registry.MissingDatasetTypeError
890
- Raised if the dataset type does not exist.
891
- lsst.daf.butler.registry.MissingCollectionError
892
- Raised if any of ``collections`` does not exist in the registry.
893
-
894
- Notes
895
- -----
896
- This method simply returns `None` and does not raise an exception even
897
- when the set of collections searched is intrinsically incompatible with
898
- the dataset type, e.g. if ``datasetType.isCalibration() is False``, but
899
- only `~CollectionType.CALIBRATION` collections are being searched.
900
- This may make it harder to debug some lookup failures, but the behavior
901
- is intentional; we consider it more important that failed searches are
902
- reported consistently, regardless of the reason, and that adding
903
- additional collections that do not contain a match to the search path
904
- never changes the behavior.
905
-
906
- This method handles component dataset types automatically, though most
907
- other registry operations do not.
908
- """
909
- if collections is None:
910
- if not self.defaults.collections:
911
- raise NoDefaultCollectionError(
912
- "No collections provided to findDataset, and no defaults from registry construction."
913
- )
914
- collections = self.defaults.collections
915
- backend = queries.SqlQueryBackend(self._db, self._managers, self.dimension_record_cache)
916
- with backend.caching_context():
917
- collection_wildcard = CollectionWildcard.from_expression(collections, require_ordered=True)
918
- if collection_wildcard.empty():
919
- return None
920
- matched_collections = backend.resolve_collection_wildcard(collection_wildcard)
921
- resolved_dataset_type = backend.resolve_single_dataset_type_wildcard(datasetType)
922
- dataId = DataCoordinate.standardize(
923
- dataId,
924
- dimensions=resolved_dataset_type.dimensions,
925
- universe=self.dimensions,
926
- defaults=self.defaults.dataId,
927
- **kwargs,
928
- )
929
- governor_constraints = {name: {cast(str, dataId[name])} for name in dataId.dimensions.governors}
930
- (filtered_collections,) = backend.filter_dataset_collections(
931
- [resolved_dataset_type],
932
- matched_collections,
933
- governor_constraints=governor_constraints,
934
- ).values()
935
- if not filtered_collections:
936
- return None
937
- if timespan is None:
938
- filtered_collections = [
939
- collection_record
940
- for collection_record in filtered_collections
941
- if collection_record.type is not CollectionType.CALIBRATION
942
- ]
943
- if filtered_collections:
944
- requested_columns = {"dataset_id", "run", "collection"}
945
- with backend.context() as context:
946
- predicate = context.make_data_coordinate_predicate(
947
- dataId.subset(resolved_dataset_type.dimensions), full=False
948
- )
949
- if timespan is not None:
950
- requested_columns.add("timespan")
951
- predicate = predicate.logical_and(
952
- context.make_timespan_overlap_predicate(
953
- DatasetColumnTag(resolved_dataset_type.name, "timespan"), timespan
954
- )
955
- )
956
- relation = backend.make_dataset_query_relation(
957
- resolved_dataset_type, filtered_collections, requested_columns, context
958
- ).with_rows_satisfying(predicate)
959
- rows = list(context.fetch_iterable(relation))
960
- else:
961
- rows = []
962
- if not rows:
963
- return None
964
- elif len(rows) == 1:
965
- best_row = rows[0]
966
- else:
967
- rank_by_collection_key = {record.key: n for n, record in enumerate(filtered_collections)}
968
- collection_tag = DatasetColumnTag(resolved_dataset_type.name, "collection")
969
- row_iter = iter(rows)
970
- best_row = next(row_iter)
971
- best_rank = rank_by_collection_key[best_row[collection_tag]]
972
- have_tie = False
973
- for row in row_iter:
974
- if (rank := rank_by_collection_key[row[collection_tag]]) < best_rank:
975
- best_row = row
976
- best_rank = rank
977
- have_tie = False
978
- elif rank == best_rank:
979
- have_tie = True
980
- assert timespan is not None, "Rank ties should be impossible given DB constraints."
981
- if have_tie:
982
- raise CalibrationLookupError(
983
- f"Ambiguous calibration lookup for {resolved_dataset_type.name} in collections "
984
- f"{collection_wildcard.strings} with timespan {timespan}."
985
- )
986
- reader = queries.DatasetRefReader(
987
- resolved_dataset_type,
988
- translate_collection=lambda k: self._managers.collections[k].name,
989
- )
990
- ref = reader.read(best_row, data_id=dataId)
991
- if datastore_records:
992
- ref = self.get_datastore_records(ref)
993
-
994
- return ref
995
-
996
826
  @transactional
997
827
  def insertDatasets(
998
828
  self,
@@ -550,6 +550,11 @@ class RegistryTests(ABC):
550
550
  "bias", instrument="Cam1", detector=2, collections=["empty", "imported_r", "imported_g"]
551
551
  ),
552
552
  )
553
+ # If the input data ID was an expanded DataCoordinate with records,
554
+ # then the output ref has records, too.
555
+ expanded_id = registry.expandDataId({"instrument": "Cam1", "detector": 2})
556
+ expanded_ref = registry.findDataset("bias", expanded_id, collections=["imported_r"])
557
+ self.assertTrue(expanded_ref.dataId.hasRecords())
553
558
  # Search more than one collection, with one of them a CALIBRATION
554
559
  # collection.
555
560
  registry.registerCollection("Cam1/calib", CollectionType.CALIBRATION)
@@ -568,6 +573,18 @@ class RegistryTests(ABC):
568
573
  timespan=timespan,
569
574
  ),
570
575
  )
576
+ self.assertEqual(
577
+ bias1,
578
+ registry.findDataset(
579
+ "bias",
580
+ instrument="Cam1",
581
+ detector=2,
582
+ # Calibration dataset type, with no calibration collection, but
583
+ # a timespan was provided.
584
+ collections=["imported_g"],
585
+ timespan=timespan,
586
+ ),
587
+ )
571
588
  self.assertEqual(
572
589
  bias2,
573
590
  registry.findDataset(
@@ -592,6 +609,82 @@ class RegistryTests(ABC):
592
609
  "bias", instrument="Cam1", detector=2, collections=["empty", "Cam1/calib", "imported_g"]
593
610
  ),
594
611
  )
612
+ self.assertIsNone(
613
+ registry.findDataset("bias", instrument="Cam1", detector=2, collections=["Cam1/calib"])
614
+ )
615
+ # Test non-calibration dataset type.
616
+ registry.registerDatasetType(
617
+ DatasetType("noncalibration", ["instrument", "detector"], "int", universe=butler.dimensions)
618
+ )
619
+ (non_calibration_ref,) = registry.insertDatasets("noncalibration", dataIds=[dataId2], run=run)
620
+ self.assertIsNone(
621
+ registry.findDataset("noncalibration", instrument="Cam1", detector=2, collections=["imported_g"])
622
+ )
623
+ self.assertEqual(
624
+ non_calibration_ref,
625
+ registry.findDataset("noncalibration", instrument="Cam1", detector=2, collections=[run]),
626
+ )
627
+ # Timespan parameter is ignored for non-calibration dataset types.
628
+ self.assertIsNone(
629
+ registry.findDataset(
630
+ "noncalibration", instrument="Cam1", detector=2, collections=["imported_g"], timespan=timespan
631
+ )
632
+ )
633
+ self.assertEqual(
634
+ non_calibration_ref,
635
+ registry.findDataset(
636
+ "noncalibration", instrument="Cam1", detector=2, collections=[run], timespan=timespan
637
+ ),
638
+ )
639
+ self.assertEqual(
640
+ non_calibration_ref,
641
+ registry.findDataset(
642
+ "noncalibration",
643
+ instrument="Cam1",
644
+ detector=2,
645
+ collections=["Cam1/calib", run],
646
+ timespan=timespan,
647
+ ),
648
+ )
649
+ # Add a dataset type whose dimension group involves an "implied"
650
+ # dimension. ("physical_filter" implies "band".)
651
+ registry.registerDatasetType(
652
+ DatasetType(
653
+ "dt_with_implied",
654
+ [
655
+ "instrument",
656
+ "physical_filter",
657
+ ],
658
+ "int",
659
+ universe=butler.dimensions,
660
+ )
661
+ )
662
+ data_id = {"instrument": "Cam1", "physical_filter": "Cam1-G"}
663
+ (implied_ref,) = registry.insertDatasets("dt_with_implied", dataIds=[data_id], run=run)
664
+ found_ref = registry.findDataset("dt_with_implied", data_id, collections=[run])
665
+ self.assertEqual(implied_ref, found_ref)
666
+ # The "full" data ID with implied values is looked up, even though we
667
+ # provided only the "required" values.
668
+ self.assertTrue(found_ref.dataId.hasFull())
669
+ # The search ignores excess data ID values beyond the 'required' set.
670
+ # This is not the correct band value for this physical_filter, but
671
+ # the mismatch is ignored.
672
+ self.assertEqual(
673
+ implied_ref,
674
+ registry.findDataset(
675
+ "dt_with_implied",
676
+ {"instrument": "Cam1", "physical_filter": "Cam1-G", "band": "r"},
677
+ collections=[run],
678
+ ),
679
+ )
680
+ # Correct band value, wrong physical_filter.
681
+ self.assertIsNone(
682
+ registry.findDataset(
683
+ "dt_with_implied",
684
+ {"instrument": "Cam1", "physical_filter": "Cam1-R1", "band": "g"},
685
+ collections=[run],
686
+ ),
687
+ )
595
688
 
596
689
  def testRemoveDatasetTypeSuccess(self):
597
690
  """Test that SqlRegistry.removeDatasetType works when there are no
@@ -136,7 +136,7 @@ class RemoteButlerFactory:
136
136
  if self._config.authentication == "rubin_science_platform":
137
137
  auth = RubinAuthenticationProvider(access_token)
138
138
  elif self._config.authentication == "cadc":
139
- auth = CadcAuthenticationProvider()
139
+ auth = CadcAuthenticationProvider(access_token)
140
140
  return self._create_butler(
141
141
  auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
142
142
  )
@@ -151,7 +151,7 @@ class RemoteButlerFactory:
151
151
  if self._config.authentication == "rubin_science_platform":
152
152
  auth = RubinAuthenticationProvider.create_from_environment(self.server_url)
153
153
  elif self._config.authentication == "cadc":
154
- auth = CadcAuthenticationProvider()
154
+ auth = CadcAuthenticationProvider.create_from_environment(self.server_url)
155
155
 
156
156
  return self._create_butler(
157
157
  auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
@@ -60,7 +60,7 @@ from .._storage_class import StorageClass, StorageClassFactory
60
60
  from .._utilities.locked_object import LockedObject
61
61
  from ..datastore import DatasetRefURIs, DatastoreConfig
62
62
  from ..datastore.cache_manager import AbstractDatastoreCacheManager, DatastoreCacheManager
63
- from ..dimensions import DataIdValue, DimensionConfig, DimensionUniverse, SerializedDataId
63
+ from ..dimensions import DataCoordinate, DataIdValue, DimensionConfig, DimensionUniverse, SerializedDataId
64
64
  from ..queries import Query
65
65
  from ..queries.tree import make_column_literal
66
66
  from ..registry import CollectionArgType, NoDefaultCollectionError, Registry, RegistryDefaults
@@ -435,6 +435,8 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
435
435
  return None
436
436
 
437
437
  ref = DatasetRef.from_simple(model.dataset_ref, universe=self.dimensions)
438
+ if isinstance(data_id, DataCoordinate) and data_id.hasRecords():
439
+ ref = ref.expanded(data_id)
438
440
  return apply_storage_class_override(ref, dataset_type, storage_class)
439
441
 
440
442
  def _retrieve_artifacts(