lsst-daf-butler 29.2025.3700__tar.gz → 29.2025.3900__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. {lsst_daf_butler-29.2025.3700/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.3900}/PKG-INFO +9 -2
  2. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/README.md +8 -1
  3. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/utils.py +9 -2
  4. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/column_spec.py +1 -2
  5. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/delegates/arrowtable.py +19 -13
  6. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/parquet.py +13 -3
  7. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/logging.py +3 -3
  8. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +27 -0
  9. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +17 -2
  10. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/spatial.py +1 -1
  11. lsst_daf_butler-29.2025.3900/python/lsst/daf/butler/version.py +2 -0
  12. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900/python/lsst_daf_butler.egg-info}/PKG-INFO +9 -2
  13. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_logging.py +12 -4
  14. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_parquet.py +25 -0
  15. lsst_daf_butler-29.2025.3700/python/lsst/daf/butler/version.py +0 -2
  16. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/COPYRIGHT +0 -0
  17. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/LICENSE +0 -0
  18. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/MANIFEST.in +0 -0
  19. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/bsd_license.txt +0 -0
  20. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  21. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  22. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/configuring.rst +0 -0
  23. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/datastores.rst +0 -0
  24. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/dimensions.rst +0 -0
  25. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/formatters.rst +0 -0
  26. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/index.rst +0 -0
  27. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/organizing.rst +0 -0
  28. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/queries.rst +0 -0
  29. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  30. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  31. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/gpl-v3.0.txt +0 -0
  32. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/pyproject.toml +0 -0
  33. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/__init__.py +0 -0
  34. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/__init__.py +0 -0
  35. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/__init__.py +0 -0
  36. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_butler.py +0 -0
  37. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_butler_collections.py +0 -0
  38. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_butler_config.py +0 -0
  39. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  40. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  41. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  42. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_collection_type.py +0 -0
  43. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_column_categorization.py +0 -0
  44. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_column_tags.py +0 -0
  45. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_column_type_info.py +0 -0
  46. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_config.py +0 -0
  47. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_config_support.py +0 -0
  48. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_dataset_association.py +0 -0
  49. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  50. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  51. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  52. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_dataset_type.py +0 -0
  53. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  54. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_exceptions.py +0 -0
  55. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  56. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_file_dataset.py +0 -0
  57. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  58. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_formatter.py +0 -0
  59. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  60. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_limited_butler.py +0 -0
  61. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_location.py +0 -0
  62. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_named.py +0 -0
  63. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_quantum.py +0 -0
  64. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  65. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  66. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_registry_shim.py +0 -0
  67. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
  68. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  69. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  70. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_storage_class.py +0 -0
  71. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  72. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_timespan.py +0 -0
  73. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_topology.py +0 -0
  74. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  75. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  76. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  77. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  78. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/arrow_utils.py +0 -0
  79. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/__init__.py +0 -0
  80. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/butler.py +0 -0
  81. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  82. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  83. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  84. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  85. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  86. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  87. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  88. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  89. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  90. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/cli/progress.py +0 -0
  91. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  92. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  93. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  94. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  95. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  96. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  97. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  98. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  99. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  100. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  101. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  102. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  103. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  104. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  105. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  106. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  107. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  108. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  109. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  110. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  111. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  112. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/composites.py +0 -0
  113. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  114. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  115. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  116. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  117. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  118. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  119. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  120. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  121. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  122. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  123. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  124. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  125. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  126. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/ddl.py +0 -0
  127. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  129. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  130. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  131. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  132. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  133. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  134. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  135. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  136. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  137. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  138. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  139. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  140. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  141. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  142. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  143. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  144. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  145. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  146. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  147. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  148. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  149. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  150. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  151. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  152. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  153. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  154. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  155. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  156. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  157. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  158. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/file.py +0 -0
  159. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/json.py +0 -0
  160. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/logs.py +0 -0
  161. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  162. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/packages.py +0 -0
  163. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  164. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  165. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  166. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/json.py +0 -0
  167. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/mapping_factory.py +0 -0
  168. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/name_shrinker.py +0 -0
  169. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  170. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/persistence_context.py +0 -0
  171. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/progress.py +0 -0
  172. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/py.typed +0 -0
  173. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  174. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/__init__.py +0 -0
  175. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_base.py +0 -0
  176. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  177. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  178. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  179. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  180. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  181. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  182. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/_query.py +0 -0
  183. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  184. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/driver.py +0 -0
  185. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  186. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  187. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  188. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  189. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  190. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  191. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  192. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  193. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  194. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  195. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  196. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  197. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/queries/visitors.py +0 -0
  198. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/__init__.py +0 -0
  199. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  200. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  201. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  202. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  203. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_config.py +0 -0
  204. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  205. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  206. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_registry.py +0 -0
  207. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  208. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/attributes.py +0 -0
  209. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  210. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  211. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  212. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  213. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  214. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  215. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  216. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  217. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  218. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  219. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  220. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  221. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  222. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  223. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  224. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  225. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  226. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  228. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  229. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  230. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  231. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  232. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  233. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  234. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  235. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  236. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  237. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  238. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  239. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/managers.py +0 -0
  240. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  241. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  242. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  243. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  244. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  245. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  246. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  247. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  248. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  249. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/opaque.py +0 -0
  250. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  251. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  252. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  253. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  254. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  255. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  256. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  257. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  258. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  259. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  260. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  261. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  262. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  263. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  264. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  265. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  266. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  267. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  268. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  269. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  270. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  271. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  272. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  273. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  274. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  275. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  276. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  277. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  278. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  279. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  280. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/versions.py +0 -0
  281. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  282. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  283. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  284. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  285. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  286. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  287. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  288. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  289. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  290. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  291. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  292. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  293. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  294. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  295. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  296. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  297. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  298. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
  299. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  300. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  301. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  302. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  303. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  304. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  305. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  306. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  307. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  308. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  309. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  310. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  311. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  312. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  313. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  314. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  315. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  316. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  317. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  318. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  319. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  320. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/repo_relocation.py +0 -0
  321. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/__init__.py +0 -0
  322. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/_associate.py +0 -0
  323. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  324. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  325. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  326. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  327. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/configDump.py +0 -0
  328. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/configValidate.py +0 -0
  329. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/createRepo.py +0 -0
  330. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  331. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  332. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  333. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  334. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  335. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  336. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  337. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  338. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  339. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  340. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  341. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  342. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  343. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  344. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/__init__.py +0 -0
  345. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  346. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  347. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  348. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  349. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  350. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  351. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  352. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  353. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  354. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  355. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  356. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  357. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  358. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  359. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  360. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  361. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  362. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  363. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  364. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  365. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/server.py +0 -0
  366. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  367. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  368. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/tests/utils.py +0 -0
  369. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/time_utils.py +0 -0
  370. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  371. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  372. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/transfers/_context.py +0 -0
  373. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  374. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  375. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst/daf/butler/utils.py +0 -0
  376. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  377. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  378. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  379. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  380. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  381. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  382. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/setup.cfg +0 -0
  383. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_astropyTableFormatter.py +0 -0
  384. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_authentication.py +0 -0
  385. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_butler.py +0 -0
  386. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_butler_factory.py +0 -0
  387. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdAssociate.py +0 -0
  388. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdConfigDump.py +0 -0
  389. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdConfigValidate.py +0 -0
  390. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdCreate.py +0 -0
  391. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdImport.py +0 -0
  392. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdIngestFiles.py +0 -0
  393. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdPruneDatasets.py +0 -0
  394. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdQueryCollections.py +0 -0
  395. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdQueryDataIds.py +0 -0
  396. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  397. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdQueryDatasets.py +0 -0
  398. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  399. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdRemoveCollections.py +0 -0
  400. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdRemoveRuns.py +0 -0
  401. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  402. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliLog.py +0 -0
  403. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliPluginLoader.py +0 -0
  404. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliUtilSplitCommas.py +0 -0
  405. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliUtilSplitKv.py +0 -0
  406. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliUtilToUpper.py +0 -0
  407. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_cliUtils.py +0 -0
  408. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_column_spec.py +0 -0
  409. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_composites.py +0 -0
  410. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_config.py +0 -0
  411. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_connectionString.py +0 -0
  412. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_constraints.py +0 -0
  413. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_datasets.py +0 -0
  414. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_datastore.py +0 -0
  415. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_ddl.py +0 -0
  416. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_dimension_record_containers.py +0 -0
  417. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_dimensions.py +0 -0
  418. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_exprParserLex.py +0 -0
  419. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_exprParserYacc.py +0 -0
  420. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_expressions.py +0 -0
  421. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_formatter.py +0 -0
  422. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_gafaelfawr.py +0 -0
  423. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_location.py +0 -0
  424. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_logFormatter.py +0 -0
  425. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_matplotlibFormatter.py +0 -0
  426. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_nonempty_mapping.py +0 -0
  427. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_normalFormExpression.py +0 -0
  428. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_obscore.py +0 -0
  429. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_packages.py +0 -0
  430. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_postgresql.py +0 -0
  431. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_progress.py +0 -0
  432. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_pydantic_utils.py +0 -0
  433. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_quantum.py +0 -0
  434. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_quantumBackedButler.py +0 -0
  435. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_query_direct_postgresql.py +0 -0
  436. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_query_direct_sqlite.py +0 -0
  437. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_query_interface.py +0 -0
  438. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_query_relations.py +0 -0
  439. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_query_remote.py +0 -0
  440. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_query_utilities.py +0 -0
  441. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_remote_butler.py +0 -0
  442. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_server.py +0 -0
  443. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_simpleButler.py +0 -0
  444. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_sqlite.py +0 -0
  445. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_storageClass.py +0 -0
  446. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_templates.py +0 -0
  447. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_testRepo.py +0 -0
  448. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_thread_utils.py +0 -0
  449. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_time_utils.py +0 -0
  450. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_timespan.py +0 -0
  451. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/tests/test_utils.py +0 -0
  452. {lsst_daf_butler-29.2025.3700 → lsst_daf_butler-29.2025.3900}/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.3700
3
+ Version: 29.2025.3900
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -63,7 +63,8 @@ Please cite [the SPIE paper](https://doi.org/10.1117/12.2629569) when using this
63
63
 
64
64
  This is a **Python 3 only** package (we assume Python 3.11 or higher).
65
65
 
66
- * SPIE Paper from 2022: [The Vera C. Rubin Observatory Data Butler and Pipeline Execution System](https://doi.org/10.1117/12.2629569) ([arXiv](https://arxiv.org/abs/2206.14941))
66
+ * SPIE paper from 2024: [Converting Rubin Observatory's data butler to a client/server architecture](https://doi.org/10.1117/12.3019130) ([Tech note](https://dmtn-288.lsst.io))
67
+ * SPIE Paper from 2022: [The Vera C. Rubin Observatory Data Butler and Pipeline Execution System](https://doi.org/10.1117/12.2629569) ([arXiv](https://arxiv.org/abs/2206.14941)) \[Primary reference]
67
68
  * ADASS paper from 2019: [Abstracting the Storage and Retrieval of Image Data at the LSST](https://ui.adsabs.harvard.edu/abs/2019ASPC..523..653J/abstract).
68
69
  * Early design note: [DMTN-056](https://dmtn-056.lsst.io)
69
70
 
@@ -71,3 +72,9 @@ PyPI: [lsst-daf-butler](https://pypi.org/project/lsst-daf-butler/)
71
72
 
72
73
  This software is dual licensed under the GNU General Public License (version 3 of the License, or (at your option) any later version, and also under a 3-clause BSD license).
73
74
  Recipients may choose which of these licenses to use; please see the files gpl-3.0.txt and/or bsd_license.txt, respectively.
75
+
76
+ ## Arrow Memory Leaks
77
+
78
+ From version 18 of arrow we have seen significant memory leaks when accessing parquet files using the default memory allocator.
79
+ If you see such leaks the workaround is to set the `ARROW_DEFAULT_MEMORY_POOL` environment variable to `jemalloc` following the advice from [apache/arrow#45882](https://github.com/apache/arrow/issues/45882).
80
+ For EUPS users this variable is automatically set.
@@ -8,7 +8,8 @@ Please cite [the SPIE paper](https://doi.org/10.1117/12.2629569) when using this
8
8
 
9
9
  This is a **Python 3 only** package (we assume Python 3.11 or higher).
10
10
 
11
- * SPIE Paper from 2022: [The Vera C. Rubin Observatory Data Butler and Pipeline Execution System](https://doi.org/10.1117/12.2629569) ([arXiv](https://arxiv.org/abs/2206.14941))
11
+ * SPIE paper from 2024: [Converting Rubin Observatory's data butler to a client/server architecture](https://doi.org/10.1117/12.3019130) ([Tech note](https://dmtn-288.lsst.io))
12
+ * SPIE Paper from 2022: [The Vera C. Rubin Observatory Data Butler and Pipeline Execution System](https://doi.org/10.1117/12.2629569) ([arXiv](https://arxiv.org/abs/2206.14941)) \[Primary reference]
12
13
  * ADASS paper from 2019: [Abstracting the Storage and Retrieval of Image Data at the LSST](https://ui.adsabs.harvard.edu/abs/2019ASPC..523..653J/abstract).
13
14
  * Early design note: [DMTN-056](https://dmtn-056.lsst.io)
14
15
 
@@ -16,3 +17,9 @@ PyPI: [lsst-daf-butler](https://pypi.org/project/lsst-daf-butler/)
16
17
 
17
18
  This software is dual licensed under the GNU General Public License (version 3 of the License, or (at your option) any later version, and also under a 3-clause BSD license).
18
19
  Recipients may choose which of these licenses to use; please see the files gpl-3.0.txt and/or bsd_license.txt, respectively.
20
+
21
+ ## Arrow Memory Leaks
22
+
23
+ From version 18 of arrow we have seen significant memory leaks when accessing parquet files using the default memory allocator.
24
+ If you see such leaks the workaround is to set the `ARROW_DEFAULT_MEMORY_POOL` environment variable to `jemalloc` following the advice from [apache/arrow#45882](https://github.com/apache/arrow/issues/45882).
25
+ For EUPS users this variable is automatically set.
@@ -74,6 +74,7 @@ from typing import TYPE_CHECKING, Any, cast
74
74
  from unittest.mock import patch
75
75
 
76
76
  import click
77
+ import click.core
77
78
  import click.exceptions
78
79
  import click.testing
79
80
  import yaml
@@ -95,6 +96,11 @@ if _click_version >= Version("8.2.0"):
95
96
  else:
96
97
  _click_make_metavar_has_context = False
97
98
 
99
+ # Starting from Click 8.3.0, a special `UNSET` sentinel value is used to
100
+ # indicate the absence of a default value for a parameter. Prior to 8.3.0,
101
+ # they just used `None`.
102
+ _CLICK_UNSET_SENTINEL = getattr(click.core, "UNSET", None)
103
+
98
104
  log = logging.getLogger(__name__)
99
105
 
100
106
  # This is used as the metavar argument to Options that accept multiple string
@@ -554,7 +560,7 @@ def split_kv(
554
560
 
555
561
  if add_to_default:
556
562
  default = param.get_default(context)
557
- if default:
563
+ if default and default != _CLICK_UNSET_SENTINEL:
558
564
  vals = tuple(v for v in itertools.chain(default, vals)) # Convert to tuple for mypy
559
565
 
560
566
  ret: RetDict | RetTuple
@@ -1013,7 +1019,8 @@ class MWCommand(click.Command):
1013
1019
  captured_args.append(val)
1014
1020
  elif isinstance(param, click.Argument):
1015
1021
  param_name = cast(str, param.name)
1016
- if (opt := opts[param_name]) is not None:
1022
+ opt = opts[param_name]
1023
+ if opt is not None and opt != _CLICK_UNSET_SENTINEL:
1017
1024
  captured_args.append(opt)
1018
1025
  else:
1019
1026
  raise AssertionError("All parameters should be an Option or an Argument")
@@ -52,7 +52,6 @@ from typing import (
52
52
  Any,
53
53
  ClassVar,
54
54
  Literal,
55
- Optional,
56
55
  TypeAlias,
57
56
  Union,
58
57
  final,
@@ -254,7 +253,7 @@ class _BaseColumnSpec(pydantic.BaseModel, ABC):
254
253
  """
255
254
  base = self._get_base_annotated_type()
256
255
  if self.nullable:
257
- return Optional[base]
256
+ return base | None
258
257
  return base
259
258
 
260
259
  @abstractmethod
@@ -32,6 +32,7 @@ from __future__ import annotations
32
32
  __all__ = ["ArrowTableDelegate"]
33
33
 
34
34
  from collections.abc import Mapping
35
+ from fnmatch import fnmatchcase
35
36
  from typing import TYPE_CHECKING, Any
36
37
 
37
38
  import pyarrow as pa
@@ -162,28 +163,33 @@ class ArrowTableDelegate(StorageClassDelegate):
162
163
  parameters["columns"],
163
164
  stringify=False,
164
165
  )
166
+ # Ensure uniqueness, keeping order.
167
+ readColumns = list(dict.fromkeys(readColumns))
165
168
  else:
166
- readColumns = list(ensure_iterable(parameters["columns"]))
169
+ readColumnsIn = list(dict.fromkeys(ensure_iterable(parameters["columns"])))
167
170
 
168
- for column in readColumns:
171
+ if typeString == "pandas":
172
+ # Exclude index columns from the subset.
173
+ readColumnsIn = [
174
+ name for name in readColumnsIn if name not in inMemoryDataset.index.names
175
+ ]
176
+
177
+ readColumnsDict = {}
178
+ for column in readColumnsIn:
169
179
  if not isinstance(column, str):
170
180
  raise NotImplementedError(
171
181
  f"InMemoryDataset of a {get_full_type_name(inMemoryDataset)} only "
172
182
  "supports string column names."
173
183
  )
174
- if column not in allColumns:
184
+ found = False
185
+ for allColumn in allColumns:
186
+ if fnmatchcase(allColumn, column):
187
+ found = True
188
+ readColumnsDict[allColumn] = True
189
+ if not found:
175
190
  raise ValueError(f"Unrecognized column name {column!r}.")
176
191
 
177
- if typeString == "pandas":
178
- # Exclude index columns from the subset.
179
- readColumns = [
180
- name
181
- for name in ensure_iterable(parameters["columns"])
182
- if name not in inMemoryDataset.index.names
183
- ]
184
-
185
- # Ensure uniqueness, keeping order.
186
- readColumns = list(dict.fromkeys(readColumns))
192
+ readColumns = list(readColumnsDict.keys())
187
193
 
188
194
  if typeString == "arrow":
189
195
  return inMemoryDataset.select(readColumns)
@@ -54,6 +54,7 @@ import json
54
54
  import logging
55
55
  import re
56
56
  from collections.abc import Iterable, Sequence
57
+ from fnmatch import fnmatchcase
57
58
  from typing import TYPE_CHECKING, Any, cast
58
59
 
59
60
  import pyarrow as pa
@@ -154,14 +155,23 @@ class ParquetFormatter(FormatterV2):
154
155
 
155
156
  if not has_pandas_multi_index:
156
157
  # Ensure uniqueness, keeping order.
157
- par_columns = list(dict.fromkeys(ensure_iterable(par_columns)))
158
+ par_columns_in = list(dict.fromkeys(ensure_iterable(par_columns)))
158
159
  file_columns = [name for name in schema.names if not name.startswith("__")]
159
160
 
160
- for par_column in par_columns:
161
- if par_column not in file_columns:
161
+ # Do case-sensitive glob-style matching, again ensuring
162
+ # uniqueness and ordering.
163
+ par_columns = {}
164
+ for par_column in par_columns_in:
165
+ found = False
166
+ for file_column in file_columns:
167
+ if fnmatchcase(file_column, par_column):
168
+ found = True
169
+ par_columns[file_column] = True
170
+ if not found:
162
171
  raise ValueError(
163
172
  f"Column {par_column} specified in parameters not available in parquet file."
164
173
  )
174
+ par_columns = list(par_columns.keys())
165
175
  else:
166
176
  par_columns = _standardize_multi_index_columns(
167
177
  arrow_schema_to_pandas_index(schema),
@@ -36,7 +36,7 @@ from collections.abc import Callable, Generator, Iterable, Iterator
36
36
  from contextlib import contextmanager
37
37
  from logging import Formatter, LogRecord, StreamHandler
38
38
  from types import TracebackType
39
- from typing import IO, Any, ClassVar, overload
39
+ from typing import IO, Any, ClassVar, Literal, overload
40
40
 
41
41
  from pydantic import BaseModel, ConfigDict, PrivateAttr, RootModel
42
42
 
@@ -174,7 +174,7 @@ class ButlerMDC:
174
174
  lno: int,
175
175
  msg: str,
176
176
  args: tuple,
177
- exc_info: tuple | None,
177
+ exc_info: tuple | None | Literal[False],
178
178
  func: str | None = None,
179
179
  sinfo: TracebackType | None = None,
180
180
  **kwargs: Any,
@@ -182,7 +182,7 @@ class ButlerMDC:
182
182
  record = old_factory(name, level, fn, lno, msg, args, exc_info, func, sinfo, **kwargs)
183
183
  # Make sure we send a copy of the global dict in the record.
184
184
  mdc = MDCDict(cls._MDC)
185
- if exc_info is not None:
185
+ if exc_info is not None and exc_info is not False:
186
186
  _, ex, _ = exc_info
187
187
  # TODO: this doesn't handle chained exceptions, fix on DM-47546
188
188
  if hasattr(ex, "mdc"):
@@ -29,6 +29,8 @@ from typing import Annotated
29
29
 
30
30
  from fastapi import Depends, Header, HTTPException
31
31
  from safir.dependencies.gafaelfawr import auth_delegated_token_dependency
32
+ from safir.dependencies.logger import logger_dependency as safir_logger_dependency
33
+ from structlog.stdlib import BoundLogger
32
34
 
33
35
  from lsst.daf.butler import LabeledButlerFactory
34
36
 
@@ -117,6 +119,31 @@ async def repository_authorization_dependency(
117
119
  )
118
120
 
119
121
 
122
+ async def logger_dependency(
123
+ logger: Annotated[BoundLogger, Depends(safir_logger_dependency)],
124
+ repository: str,
125
+ user_name: Annotated[str | None, Depends(user_name_dependency)],
126
+ x_auth_request_service: Annotated[str | None, Header()] = None,
127
+ ) -> BoundLogger:
128
+ """Return a logger with additional bound context information.
129
+
130
+ Parameters
131
+ ----------
132
+ logger : `structlog.stdlib.BoundLogger`
133
+ Logger provided by Safir.
134
+ repository : `str`
135
+ Butler repository that is being accessed.
136
+ user_name : `str` or `None`
137
+ Name of the user accessing the repository, from Gafaelfawr headers.
138
+ x_auth_request_service : `str` or `None`
139
+ Name of the service being used to access the repository, from
140
+ Gafaelfawr headers.
141
+ """
142
+ return logger.bind(
143
+ butler_repo=repository, requester={"username": user_name, "service": x_auth_request_service}
144
+ )
145
+
146
+
120
147
  async def factory_dependency(
121
148
  repository: str,
122
149
  butler_factory: Annotated[LabeledButlerFactory, Depends(butler_factory_dependency)],
@@ -30,10 +30,11 @@ from __future__ import annotations
30
30
  __all__ = ()
31
31
 
32
32
  import uuid
33
- from typing import Any
33
+ from typing import Annotated, Any
34
34
 
35
35
  from fastapi import APIRouter, Depends, HTTPException, Request
36
36
  from fastapi.responses import RedirectResponse
37
+ from structlog.stdlib import BoundLogger
37
38
 
38
39
  from ...._butler import Butler
39
40
  from ...._collection_type import CollectionType
@@ -64,7 +65,7 @@ from ...server_models import (
64
65
  QueryDatasetTypesResponseModel,
65
66
  )
66
67
  from .._config import load_config
67
- from .._dependencies import factory_dependency
68
+ from .._dependencies import factory_dependency, logger_dependency
68
69
  from .._factory import Factory
69
70
  from ._file_info import get_file_info_payload
70
71
  from ._utils import generate_file_download_uri, set_default_data_id
@@ -184,12 +185,14 @@ def expand_data_id(
184
185
  )
185
186
  def get_file(
186
187
  dataset_id: uuid.UUID,
188
+ logger: Annotated[BoundLogger, Depends(logger_dependency)],
187
189
  factory: Factory = Depends(factory_dependency),
188
190
  ) -> GetFileResponseModel:
189
191
  butler = factory.create_butler()
190
192
  ref = butler.get_dataset(dataset_id, datastore_records=True)
191
193
  if ref is None:
192
194
  raise DatasetNotFoundError(f"Dataset ID {dataset_id} not found")
195
+ _log_file_access(logger, ref, "uuid")
193
196
  return _get_file_info_response(butler, ref)
194
197
 
195
198
 
@@ -200,6 +203,7 @@ def get_file(
200
203
  )
201
204
  def get_file_by_data_id(
202
205
  request: GetFileByDataIdRequestModel,
206
+ logger: Annotated[BoundLogger, Depends(logger_dependency)],
203
207
  factory: Factory = Depends(factory_dependency),
204
208
  ) -> GetFileResponseModel:
205
209
  butler = factory.create_butler()
@@ -211,6 +215,7 @@ def get_file_by_data_id(
211
215
  datastore_records=True,
212
216
  timespan=request.timespan,
213
217
  )
218
+ _log_file_access(logger, ref, "data-id")
214
219
  return _get_file_info_response(butler, ref)
215
220
 
216
221
 
@@ -220,12 +225,21 @@ def _get_file_info_response(butler: Butler, ref: DatasetRef) -> GetFileResponseM
220
225
  )
221
226
 
222
227
 
228
+ def _log_file_access(logger: BoundLogger, ref: DatasetRef, access_method: str) -> None:
229
+ logger.info(
230
+ "file-access",
231
+ dataset={"uuid": str(ref.id), "type": ref.datasetType.name, "data_id": dict(ref.dataId.required)},
232
+ file_access_endpoint=access_method,
233
+ )
234
+
235
+
223
236
  @external_router.get(
224
237
  "/v1/dataset/{dataset_id}/download",
225
238
  summary="Return an HTTP redirect to a location where you can download the artifact file for the dataset.",
226
239
  )
227
240
  def redirect_to_dataset_download(
228
241
  dataset_id: uuid.UUID,
242
+ logger: Annotated[BoundLogger, Depends(logger_dependency)],
229
243
  component: str | None = None,
230
244
  factory: Factory = Depends(factory_dependency),
231
245
  ) -> RedirectResponse:
@@ -245,6 +259,7 @@ def redirect_to_dataset_download(
245
259
  # files, and you must specify the component to pick which one you want
246
260
  # to download.
247
261
  if info.datastoreRecords.component == component:
262
+ _log_file_access(logger, ref, "uuid-redirect")
248
263
  return RedirectResponse(status_code=307, url=str(info.url))
249
264
 
250
265
  found_components = [info.datastoreRecords.component for info in payload.file_info]
@@ -55,7 +55,7 @@ from astropy.time import Time
55
55
  from astropy.wcs import WCS
56
56
  from matplotlib import pyplot
57
57
 
58
- import lsst.daf.butler # noqa:F401; register Time/YAML conversions.
58
+ import lsst.daf.butler # register Time/YAML conversions. # noqa: F401
59
59
  from lsst.sphgeom import (
60
60
  ConvexPolygon,
61
61
  HealpixPixelization,
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.3900"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.3700
3
+ Version: 29.2025.3900
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -63,7 +63,8 @@ Please cite [the SPIE paper](https://doi.org/10.1117/12.2629569) when using this
63
63
 
64
64
  This is a **Python 3 only** package (we assume Python 3.11 or higher).
65
65
 
66
- * SPIE Paper from 2022: [The Vera C. Rubin Observatory Data Butler and Pipeline Execution System](https://doi.org/10.1117/12.2629569) ([arXiv](https://arxiv.org/abs/2206.14941))
66
+ * SPIE paper from 2024: [Converting Rubin Observatory's data butler to a client/server architecture](https://doi.org/10.1117/12.3019130) ([Tech note](https://dmtn-288.lsst.io))
67
+ * SPIE Paper from 2022: [The Vera C. Rubin Observatory Data Butler and Pipeline Execution System](https://doi.org/10.1117/12.2629569) ([arXiv](https://arxiv.org/abs/2206.14941)) \[Primary reference]
67
68
  * ADASS paper from 2019: [Abstracting the Storage and Retrieval of Image Data at the LSST](https://ui.adsabs.harvard.edu/abs/2019ASPC..523..653J/abstract).
68
69
  * Early design note: [DMTN-056](https://dmtn-056.lsst.io)
69
70
 
@@ -71,3 +72,9 @@ PyPI: [lsst-daf-butler](https://pypi.org/project/lsst-daf-butler/)
71
72
 
72
73
  This software is dual licensed under the GNU General Public License (version 3 of the License, or (at your option) any later version, and also under a 3-clause BSD license).
73
74
  Recipients may choose which of these licenses to use; please see the files gpl-3.0.txt and/or bsd_license.txt, respectively.
75
+
76
+ ## Arrow Memory Leaks
77
+
78
+ From version 18 of arrow we have seen significant memory leaks when accessing parquet files using the default memory allocator.
79
+ If you see such leaks the workaround is to set the `ARROW_DEFAULT_MEMORY_POOL` environment variable to `jemalloc` following the advice from [apache/arrow#45882](https://github.com/apache/arrow/issues/45882).
80
+ For EUPS users this variable is automatically set.
@@ -118,8 +118,13 @@ class LoggingTestCase(unittest.TestCase):
118
118
  self.log.warning("warning message")
119
119
  self.log.critical("critical message")
120
120
  self.log.verbose("verbose message")
121
+ self.log.error("error message")
122
+ try:
123
+ raise RuntimeError("An error has occurred")
124
+ except RuntimeError:
125
+ self.log.exception("exception message")
121
126
 
122
- self.assertEqual(len(self.handler.records), 4)
127
+ self.assertEqual(len(self.handler.records), 6)
123
128
 
124
129
  format_default = str(self.handler.records)
125
130
 
@@ -128,7 +133,7 @@ class LoggingTestCase(unittest.TestCase):
128
133
  format_override = str(self.handler.records)
129
134
 
130
135
  self.assertNotEqual(format_default, format_override)
131
- self.assertEqual(format_override, "DEBUG\nWARNING\nCRITICAL\nVERBOSE")
136
+ self.assertEqual(format_override, "DEBUG\nWARNING\nCRITICAL\nVERBOSE\nERROR\nERROR")
132
137
 
133
138
  # Reset the log format and it should match the original text.
134
139
  self.handler.records.set_log_format(None)
@@ -284,11 +289,14 @@ class LoggingTestCase(unittest.TestCase):
284
289
  self.log.exception("Exception raised:")
285
290
  self.log.warning("Implied exception", exc_info=True)
286
291
  self.log.critical("Explicit exception", exc_info=e)
292
+ self.log.error("Explicit exception info", exc_info=(Exception, e, e.__traceback__))
287
293
  # Is original context used *only* when logging the exception?
288
294
  self.log.error("Something went wrong")
289
- for i in [-4, -3, -2]:
295
+ self.log.error("Boolean disabled exc info", exc_info=False)
296
+ for i in [-6, -5, -4, -3]:
290
297
  self.assertEqual(self.handler.records[i].MDC, {"foo": "fum", "answer": "42"})
291
- self.assertEqual(self.handler.records[-1].MDC, {"foo": "bar"})
298
+ for i in [-2, -1]:
299
+ self.assertEqual(self.handler.records[i].MDC, {"foo": "bar"})
292
300
 
293
301
  self.log.setLevel(logging.INFO)
294
302
  self.log.info("Normal log")
@@ -400,6 +400,10 @@ class ParquetFormatterDataFrameTestCase(unittest.TestCase):
400
400
  self.assertTrue(df1.loc[:, ["ddd"]].equals(df6))
401
401
  df7 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["a", "a"]})
402
402
  self.assertTrue(df1.loc[:, ["a"]].equals(df7))
403
+ df8 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["d*"]})
404
+ self.assertTrue(df1.loc[:, ["ddd", "dtn", "dtu"]].equals(df8))
405
+ df9 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["d*", "d*"]})
406
+ self.assertTrue(df1.loc[:, ["ddd", "dtn", "dtu"]].equals(df9))
403
407
  # Passing an unrecognized column should be a ValueError.
404
408
  with self.assertRaises(ValueError):
405
409
  self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["e"]})
@@ -989,6 +993,10 @@ class ParquetFormatterArrowAstropyTestCase(unittest.TestCase):
989
993
  _checkAstropyTableEquality(tab1[("ddd",)], tab6)
990
994
  tab7 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["a", "a"]})
991
995
  _checkAstropyTableEquality(tab1[("a",)], tab7)
996
+ tab8 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["d??"]})
997
+ _checkAstropyTableEquality(tab1[("ddd", "dtn", "dtu")], tab8)
998
+ tab9 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["d??", "a*"]})
999
+ _checkAstropyTableEquality(tab1[("ddd", "dtn", "dtu", "a")], tab9)
992
1000
  # Passing an unrecognized column should be a ValueError.
993
1001
  with self.assertRaises(ValueError):
994
1002
  self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["e"]})
@@ -1401,6 +1409,18 @@ class ParquetFormatterArrowNumpyTestCase(unittest.TestCase):
1401
1409
  ],
1402
1410
  tab7,
1403
1411
  )
1412
+ tab8 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["d??", "a*"]})
1413
+ _checkNumpyTableEquality(
1414
+ tab1[
1415
+ [
1416
+ "ddd",
1417
+ "dtn",
1418
+ "dtu",
1419
+ "a",
1420
+ ]
1421
+ ],
1422
+ tab8,
1423
+ )
1404
1424
  # Passing an unrecognized column should be a ValueError.
1405
1425
  with self.assertRaises(ValueError):
1406
1426
  self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["e"]})
@@ -1673,6 +1693,8 @@ class ParquetFormatterArrowTableTestCase(unittest.TestCase):
1673
1693
  self.assertEqual(tab6, tab1.select(("ddd",)))
1674
1694
  tab7 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["a", "a"]})
1675
1695
  self.assertEqual(tab7, tab1.select(("a",)))
1696
+ tab8 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["a*", "d??"]})
1697
+ self.assertEqual(tab8, tab1.select(("a", "ddd", "dtn", "dtu")))
1676
1698
  # Passing an unrecognized column should be a ValueError.
1677
1699
  with self.assertRaises(ValueError):
1678
1700
  self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["e"]})
@@ -1984,6 +2006,9 @@ class ParquetFormatterArrowNumpyDictTestCase(unittest.TestCase):
1984
2006
  tab7 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["a", "a"]})
1985
2007
  subdict = {key: dict1[key] for key in ["a"]}
1986
2008
  _checkNumpyDictEquality(subdict, tab7)
2009
+ tab8 = self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["d??", "a*"]})
2010
+ subdict = {key: dict1[key] for key in ["ddd", "dtn", "dtu", "a"]}
2011
+ _checkNumpyDictEquality(subdict, tab8)
1987
2012
  # Passing an unrecognized column should be a ValueError.
1988
2013
  with self.assertRaises(ValueError):
1989
2014
  self.butler.get(self.datasetType, dataId={}, parameters={"columns": ["e"]})
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.3700"