lsst-daf-butler 29.2025.4700__tar.gz → 29.2025.4900__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 (437) hide show
  1. {lsst_daf_butler-29.2025.4700/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.4900}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler.py +6 -1
  3. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_labeled_butler_factory.py +47 -30
  4. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_limited_butler.py +29 -4
  5. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_quantum_backed.py +12 -2
  6. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +13 -0
  7. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/commands.py +6 -3
  8. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/formatters.yaml +3 -2
  9. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +6 -6
  10. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
  11. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_butler/_direct_butler.py +35 -21
  12. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/parquet.py +30 -18
  13. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/logging.py +17 -7
  14. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/sql_registry.py +30 -9
  15. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_remote_butler.py +3 -0
  16. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/_associate.py +13 -15
  17. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/_pruneDatasets.py +33 -31
  18. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/butlerImport.py +11 -12
  19. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/certifyCalibrations.py +19 -19
  20. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/collectionChain.py +27 -28
  21. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/configValidate.py +11 -9
  22. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/exportCalibs.py +60 -61
  23. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/ingest_files.py +13 -14
  24. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/ingest_zip.py +2 -3
  25. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryCollections.py +141 -138
  26. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDataIds.py +80 -77
  27. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDatasetTypes.py +24 -21
  28. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDatasets.py +4 -14
  29. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/queryDimensionRecords.py +61 -60
  30. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/register_dataset_type.py +15 -14
  31. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/removeCollections.py +39 -34
  32. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/removeDatasetType.py +2 -2
  33. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/removeRuns.py +3 -5
  34. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/retrieveArtifacts.py +30 -27
  35. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/transferDatasets.py +29 -28
  36. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/hybrid_butler.py +4 -0
  37. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/server.py +4 -5
  38. lsst_daf_butler-29.2025.4900/python/lsst/daf/butler/version.py +2 -0
  39. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  40. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_astropyTableFormatter.py +1 -0
  41. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_butler.py +89 -3
  42. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_butler_factory.py +4 -1
  43. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdIngestFiles.py +2 -0
  44. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdPruneDatasets.py +77 -24
  45. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryCollections.py +2 -0
  46. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDataIds.py +1 -0
  47. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDatasets.py +41 -1
  48. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDimensionRecords.py +3 -0
  49. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdRemoveCollections.py +3 -0
  50. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdRemoveRuns.py +3 -1
  51. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdRetrieveArtifacts.py +1 -0
  52. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtilSplitKv.py +4 -2
  53. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_dimension_record_containers.py +1 -0
  54. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_dimensions.py +3 -3
  55. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_logFormatter.py +49 -0
  56. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_matplotlibFormatter.py +1 -0
  57. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_obscore.py +4 -1
  58. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_packages.py +1 -0
  59. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_parquet.py +7 -0
  60. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_postgresql.py +5 -1
  61. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_quantumBackedButler.py +15 -1
  62. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_direct_postgresql.py +1 -0
  63. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_direct_sqlite.py +1 -0
  64. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_server.py +1 -0
  65. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_simpleButler.py +9 -1
  66. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_sqlite.py +25 -6
  67. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_testRepo.py +5 -1
  68. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_versioning.py +3 -1
  69. lsst_daf_butler-29.2025.4700/python/lsst/daf/butler/version.py +0 -2
  70. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/COPYRIGHT +0 -0
  71. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/LICENSE +0 -0
  72. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/MANIFEST.in +0 -0
  73. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/README.md +0 -0
  74. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/bsd_license.txt +0 -0
  75. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  76. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  77. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/configuring.rst +0 -0
  78. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/datastores.rst +0 -0
  79. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/dimensions.rst +0 -0
  80. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/formatters.rst +0 -0
  81. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/index.rst +0 -0
  82. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/organizing.rst +0 -0
  83. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/queries.rst +0 -0
  84. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  85. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  86. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/gpl-v3.0.txt +0 -0
  87. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/pyproject.toml +0 -0
  88. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/__init__.py +0 -0
  89. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/__init__.py +0 -0
  90. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/__init__.py +0 -0
  91. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_collections.py +0 -0
  92. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_config.py +0 -0
  93. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  94. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  95. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  96. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_collection_type.py +0 -0
  97. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_config.py +0 -0
  98. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_config_support.py +0 -0
  99. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_association.py +0 -0
  100. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  101. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  102. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  103. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_dataset_type.py +0 -0
  104. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  105. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_exceptions.py +0 -0
  106. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  107. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_file_dataset.py +0 -0
  108. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  109. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_formatter.py +0 -0
  110. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_location.py +0 -0
  111. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_named.py +0 -0
  112. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_quantum.py +0 -0
  113. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  114. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_registry_shim.py +0 -0
  115. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
  116. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  117. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  118. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_storage_class.py +0 -0
  119. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  120. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_timespan.py +0 -0
  121. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_topology.py +0 -0
  122. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  123. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  124. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  125. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/_uuid.py +0 -0
  126. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/arrow_utils.py +0 -0
  127. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/butler.py +0 -0
  129. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  130. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  131. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  132. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  133. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  134. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  135. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  136. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  137. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/progress.py +0 -0
  138. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/cli/utils.py +0 -0
  139. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/column_spec.py +0 -0
  140. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  141. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  142. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  143. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  144. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  145. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  146. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  147. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  148. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  149. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  150. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  151. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  152. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  153. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  154. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  155. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  156. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  157. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  158. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/composites.py +0 -0
  159. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  160. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  161. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  162. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  163. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  164. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  165. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  166. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  167. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  168. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  169. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  170. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  171. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  172. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/ddl.py +0 -0
  173. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  174. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  175. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  176. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  177. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  178. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  179. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  180. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  181. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  182. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  183. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  184. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  185. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  186. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  187. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  188. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  189. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  190. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  191. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  192. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  193. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  194. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  195. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  196. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  197. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  198. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  199. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  200. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  201. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  202. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  203. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  204. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/file.py +0 -0
  205. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/json.py +0 -0
  206. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/logs.py +0 -0
  207. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  208. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/packages.py +0 -0
  209. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  210. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  211. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  212. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/json.py +0 -0
  213. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/mapping_factory.py +0 -0
  214. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/name_shrinker.py +0 -0
  215. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  216. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/persistence_context.py +0 -0
  217. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/progress.py +0 -0
  218. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/py.typed +0 -0
  219. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  220. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/__init__.py +0 -0
  221. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_base.py +0 -0
  222. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  223. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  224. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  225. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  226. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  227. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  228. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/_query.py +0 -0
  229. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  230. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/driver.py +0 -0
  231. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  232. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/__init__.py +0 -0
  233. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/categorize.py +0 -0
  234. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/__init__.py +0 -0
  235. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/exprTree.py +0 -0
  236. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/parser.py +0 -0
  237. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/parserLex.py +0 -0
  238. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/parserYacc.py +0 -0
  239. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/ply/__init__.py +0 -0
  240. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/ply/lex.py +0 -0
  241. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/ply/yacc.py +0 -0
  242. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/expressions/parser/treeVisitor.py +0 -0
  243. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  244. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  245. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  246. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  247. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  248. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  249. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  250. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  251. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  252. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  253. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  254. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/queries/visitors.py +0 -0
  255. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/__init__.py +0 -0
  256. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  257. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  258. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  259. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  260. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_config.py +0 -0
  261. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  262. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  263. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_registry.py +0 -0
  264. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
  265. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  266. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/attributes.py +0 -0
  267. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  268. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  269. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  270. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  271. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  272. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  273. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  274. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  275. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  276. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  277. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  278. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  279. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  280. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  281. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  282. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  283. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  284. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  285. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  286. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  287. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  288. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  289. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  290. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  291. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  292. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  293. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  294. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  295. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  296. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  297. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/managers.py +0 -0
  298. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  299. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  300. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  301. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  302. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  303. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  304. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  305. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  306. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  307. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/opaque.py +0 -0
  308. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  309. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
  310. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
  311. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
  312. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
  313. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  314. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  315. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  316. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  317. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/versions.py +0 -0
  318. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  319. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  320. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  321. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  322. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  323. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  324. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  325. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  326. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  327. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  328. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  329. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  330. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  331. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  332. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  333. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  334. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
  335. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  336. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  337. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  338. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  339. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  340. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  341. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  342. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  343. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  344. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  345. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  346. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  347. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  348. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  349. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  350. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  351. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  352. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  353. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  354. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/repo_relocation.py +0 -0
  355. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/__init__.py +0 -0
  356. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/configDump.py +0 -0
  357. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/script/createRepo.py +0 -0
  358. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/__init__.py +0 -0
  359. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  360. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  361. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  362. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  363. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  364. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  365. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  366. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  367. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  368. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  369. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  370. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  371. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  372. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  373. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  374. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  375. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  376. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  377. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  378. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  379. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/server_available.py +0 -0
  380. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  381. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  382. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/tests/utils.py +0 -0
  383. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/time_utils.py +0 -0
  384. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  385. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  386. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/_context.py +0 -0
  387. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  388. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  389. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst/daf/butler/utils.py +0 -0
  390. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  391. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  392. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  393. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  394. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  395. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  396. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/setup.cfg +0 -0
  397. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_authentication.py +0 -0
  398. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdAssociate.py +0 -0
  399. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdConfigDump.py +0 -0
  400. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdConfigValidate.py +0 -0
  401. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdCreate.py +0 -0
  402. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdImport.py +0 -0
  403. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  404. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliLog.py +0 -0
  405. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliPluginLoader.py +0 -0
  406. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtilSplitCommas.py +0 -0
  407. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtilToUpper.py +0 -0
  408. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_cliUtils.py +0 -0
  409. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_column_spec.py +0 -0
  410. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_composites.py +0 -0
  411. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_config.py +0 -0
  412. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_connectionString.py +0 -0
  413. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_constraints.py +0 -0
  414. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_datasets.py +0 -0
  415. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_datastore.py +0 -0
  416. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_ddl.py +0 -0
  417. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_exprParserLex.py +0 -0
  418. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_exprParserYacc.py +0 -0
  419. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_formatter.py +0 -0
  420. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_gafaelfawr.py +0 -0
  421. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_location.py +0 -0
  422. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_logging.py +0 -0
  423. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_nonempty_mapping.py +0 -0
  424. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_progress.py +0 -0
  425. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_pydantic_utils.py +0 -0
  426. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_quantum.py +0 -0
  427. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_interface.py +0 -0
  428. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_remote.py +0 -0
  429. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_query_utilities.py +0 -0
  430. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_remote_butler.py +0 -0
  431. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_storageClass.py +0 -0
  432. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_templates.py +0 -0
  433. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_thread_utils.py +0 -0
  434. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_time_utils.py +0 -0
  435. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_timespan.py +0 -0
  436. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_utils.py +0 -0
  437. {lsst_daf_butler-29.2025.4700 → lsst_daf_butler-29.2025.4900}/tests/test_uuid.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.4700
3
+ Version: 29.2025.4900
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
@@ -506,9 +506,10 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
506
506
  # Create Registry and populate tables
507
507
  registryConfig = RegistryConfig(config.get("registry"))
508
508
  dimensionConfig = DimensionConfig(dimensionConfig)
509
- _RegistryFactory(registryConfig).create_from_config(
509
+ registry = _RegistryFactory(registryConfig).create_from_config(
510
510
  dimensionConfig=dimensionConfig, butlerRoot=root_uri
511
511
  )
512
+ registry.close()
512
513
 
513
514
  _LOG.verbose("Wrote new Butler configuration file to %s", configURI)
514
515
 
@@ -2222,3 +2223,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
2222
2223
  Metrics object to record butler statistics.
2223
2224
  """
2224
2225
  raise NotImplementedError()
2226
+
2227
+ @abstractmethod
2228
+ def close(self) -> None:
2229
+ raise NotImplementedError()
@@ -25,9 +25,11 @@
25
25
  # You should have received a copy of the GNU General Public License
26
26
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
27
 
28
+ from __future__ import annotations
29
+
28
30
  __all__ = ("LabeledButlerFactory", "LabeledButlerFactoryProtocol")
29
31
 
30
- from collections.abc import Callable, Mapping
32
+ from collections.abc import Mapping
31
33
  from typing import Protocol
32
34
 
33
35
  from lsst.resources import ResourcePathExpression
@@ -38,10 +40,6 @@ from ._butler_repo_index import ButlerRepoIndex
38
40
  from ._utilities.named_locks import NamedLocks
39
41
  from ._utilities.thread_safe_cache import ThreadSafeCache
40
42
 
41
- _FactoryFunction = Callable[[str | None], Butler]
42
- """Function that takes an access token string or `None`, and returns a Butler
43
- instance."""
44
-
45
43
 
46
44
  class LabeledButlerFactoryProtocol(Protocol):
47
45
  """Callable to retrieve a butler from a label."""
@@ -84,7 +82,7 @@ class LabeledButlerFactory:
84
82
  else:
85
83
  self._repositories = dict(repositories)
86
84
 
87
- self._factories = ThreadSafeCache[str, _FactoryFunction]()
85
+ self._factories = ThreadSafeCache[str, _ButlerFactory]()
88
86
  self._initialization_locks = NamedLocks()
89
87
 
90
88
  # This may be overridden by unit tests.
@@ -138,10 +136,18 @@ class LabeledButlerFactory:
138
136
  based on the end user instead of the service. See
139
137
  https://gafaelfawr.lsst.io/user-guide/gafaelfawringress.html#requesting-delegated-tokens
140
138
  """
141
- factory = self._get_or_create_butler_factory_function(label)
142
- return factory(access_token)
139
+ factory = self._get_or_create_butler_factory(label)
140
+ return factory.create_butler(access_token)
141
+
142
+ def close(self) -> None:
143
+ """Reset the factory cache, and release any resources associated with
144
+ the cached instances.
145
+ """
146
+ factories = self._factories.clear()
147
+ for factory in factories.values():
148
+ factory.close()
143
149
 
144
- def _get_or_create_butler_factory_function(self, label: str) -> _FactoryFunction:
150
+ def _get_or_create_butler_factory(self, label: str) -> _ButlerFactory:
145
151
  # We maintain a separate lock per label. We only want to instantiate
146
152
  # one factory function per label, because creating the factory sets up
147
153
  # shared state that should only exist once per repository. However, we
@@ -154,16 +160,16 @@ class LabeledButlerFactory:
154
160
  factory = self._create_butler_factory_function(label)
155
161
  return self._factories.set_or_get(label, factory)
156
162
 
157
- def _create_butler_factory_function(self, label: str) -> _FactoryFunction:
163
+ def _create_butler_factory_function(self, label: str) -> _ButlerFactory:
158
164
  config_uri = self._get_config_uri(label)
159
165
  config = ButlerConfig(config_uri)
160
166
  butler_type = config.get_butler_type()
161
167
 
162
168
  match butler_type:
163
169
  case ButlerType.DIRECT:
164
- return _create_direct_butler_factory(config, self._preload_unsafe_direct_butler_caches)
170
+ return _DirectButlerFactory(config, self._preload_unsafe_direct_butler_caches)
165
171
  case ButlerType.REMOTE:
166
- return _create_remote_butler_factory(config)
172
+ return _RemoteButlerFactory(config)
167
173
  case _:
168
174
  raise TypeError(f"Unknown butler type '{butler_type}' for label '{label}'")
169
175
 
@@ -177,34 +183,45 @@ class LabeledButlerFactory:
177
183
  return config_uri
178
184
 
179
185
 
180
- def _create_direct_butler_factory(config: ButlerConfig, preload_unsafe_caches: bool) -> _FactoryFunction:
181
- import lsst.daf.butler.direct_butler
186
+ class _ButlerFactory(Protocol):
187
+ def create_butler(self, access_token: str | None) -> Butler: ...
188
+ def close(self) -> None: ...
189
+
190
+
191
+ class _DirectButlerFactory(_ButlerFactory):
192
+ def __init__(self, config: ButlerConfig, preload_unsafe_caches: bool) -> None:
193
+ import lsst.daf.butler.direct_butler
182
194
 
183
- # Create a 'template' Butler that will be cloned when callers request an
184
- # instance.
185
- butler = Butler.from_config(config)
186
- assert isinstance(butler, lsst.daf.butler.direct_butler.DirectButler)
195
+ # Create a 'template' Butler that will be cloned when callers request
196
+ # an instance.
197
+ self._butler = Butler.from_config(config)
198
+ assert isinstance(self._butler, lsst.daf.butler.direct_butler.DirectButler)
187
199
 
188
- # Load caches so that data is available in cloned instances without
189
- # needing to refetch it from the database for every instance.
190
- butler._preload_cache(load_dimension_record_cache=preload_unsafe_caches)
200
+ # Load caches so that data is available in cloned instances without
201
+ # needing to refetch it from the database for every instance.
202
+ self._butler._preload_cache(load_dimension_record_cache=preload_unsafe_caches)
191
203
 
192
- def create_butler(access_token: str | None) -> Butler:
204
+ def create_butler(self, access_token: str | None) -> Butler:
193
205
  # Access token is ignored because DirectButler does not use Gafaelfawr
194
206
  # authentication.
195
- return butler.clone()
207
+ return self._butler.clone()
196
208
 
197
- return create_butler
209
+ def close(self) -> None:
210
+ self._butler.close()
198
211
 
199
212
 
200
- def _create_remote_butler_factory(config: ButlerConfig) -> _FactoryFunction:
201
- import lsst.daf.butler.remote_butler._factory
213
+ class _RemoteButlerFactory(_ButlerFactory):
214
+ def __init__(self, config: ButlerConfig) -> None:
215
+ import lsst.daf.butler.remote_butler._factory
202
216
 
203
- factory = lsst.daf.butler.remote_butler._factory.RemoteButlerFactory.create_factory_from_config(config)
217
+ self._factory = lsst.daf.butler.remote_butler._factory.RemoteButlerFactory.create_factory_from_config(
218
+ config
219
+ )
204
220
 
205
- def create_butler(access_token: str | None) -> Butler:
221
+ def create_butler(self, access_token: str | None) -> Butler:
206
222
  if access_token is None:
207
223
  raise ValueError("Access token is required to connect to a Butler server")
208
- return factory.create_butler_for_access_token(access_token)
224
+ return self._factory.create_butler_for_access_token(access_token)
209
225
 
210
- return create_butler
226
+ def close(self) -> None:
227
+ pass
@@ -30,10 +30,10 @@ from __future__ import annotations
30
30
  __all__ = ("LimitedButler",)
31
31
 
32
32
  import logging
33
- from abc import ABC, abstractmethod
33
+ from abc import abstractmethod
34
34
  from collections.abc import Iterable, Iterator
35
- from contextlib import contextmanager
36
- from typing import Any, ClassVar
35
+ from contextlib import AbstractContextManager, contextmanager
36
+ from typing import Any, ClassVar, Literal, Self
37
37
 
38
38
  from lsst.resources import ResourcePath
39
39
 
@@ -48,7 +48,7 @@ from .dimensions import DimensionUniverse
48
48
  log = logging.getLogger(__name__)
49
49
 
50
50
 
51
- class LimitedButler(ABC):
51
+ class LimitedButler(AbstractContextManager):
52
52
  """A minimal butler interface that is sufficient to back
53
53
  `~lsst.pipe.base.PipelineTask` execution.
54
54
  """
@@ -100,6 +100,31 @@ class LimitedButler(ABC):
100
100
  """
101
101
  raise NotImplementedError()
102
102
 
103
+ def __enter__(self) -> Self:
104
+ return self
105
+
106
+ def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> Literal[False]:
107
+ try:
108
+ self.close()
109
+ except Exception:
110
+ log.exception("An exception occurred during Butler.close()")
111
+ return False
112
+
113
+ def close(self) -> None:
114
+ """Release all resources associated with this Butler instance. The
115
+ instance may no longer be used after this is called.
116
+
117
+ Notes
118
+ -----
119
+ Instead of calling ``close()`` directly, you can use the Butler object
120
+ as a context manager. For example::
121
+
122
+ with Butler(...) as butler:
123
+ butler.get(...)
124
+ # butler is closed after exiting the block.
125
+ """
126
+ pass
127
+
103
128
  def get(
104
129
  self,
105
130
  ref: DatasetRef,
@@ -55,7 +55,7 @@ from .datastore import Datastore
55
55
  from .datastore.record_data import DatastoreRecordData, SerializedDatastoreRecordData
56
56
  from .datastores.file_datastore.retrieve_artifacts import retrieve_and_zip
57
57
  from .dimensions import DimensionUniverse
58
- from .registry.interfaces import DatastoreRegistryBridgeManager, OpaqueTableStorageManager
58
+ from .registry.interfaces import Database, DatastoreRegistryBridgeManager, OpaqueTableStorageManager
59
59
 
60
60
  if TYPE_CHECKING:
61
61
  from ._butler import Butler
@@ -83,6 +83,9 @@ class QuantumBackedButler(LimitedButler):
83
83
  The registry dataset type definitions, indexed by name.
84
84
  metrics : `lsst.daf.butler.ButlerMetrics` or `None`, optional
85
85
  Metrics object for tracking butler statistics.
86
+ database : `Database`, optional
87
+ Database instance used by datastore. Not required -- only provided
88
+ to allow database connections to be closed during cleanup.
86
89
 
87
90
  Notes
88
91
  -----
@@ -130,6 +133,7 @@ class QuantumBackedButler(LimitedButler):
130
133
  storageClasses: StorageClassFactory,
131
134
  dataset_types: Mapping[str, DatasetType] | None = None,
132
135
  metrics: ButlerMetrics | None = None,
136
+ database: Database | None = None,
133
137
  ):
134
138
  self._dimensions = dimensions
135
139
  self._predicted_inputs = set(predicted_inputs)
@@ -142,6 +146,7 @@ class QuantumBackedButler(LimitedButler):
142
146
  self.storageClasses = storageClasses
143
147
  self._dataset_types: Mapping[str, DatasetType] = {}
144
148
  self._metrics = metrics if metrics is not None else ButlerMetrics()
149
+ self._database = database
145
150
  if dataset_types is not None:
146
151
  self._dataset_types = dataset_types
147
152
  self._datastore.set_retrieve_dataset_type_method(self._retrieve_dataset_type)
@@ -321,7 +326,7 @@ class QuantumBackedButler(LimitedButler):
321
326
  Metrics object for gathering butler statistics.
322
327
  """
323
328
  butler_config = ButlerConfig(config, searchPaths=search_paths)
324
- datastore, _ = instantiate_standalone_datastore(
329
+ datastore, database = instantiate_standalone_datastore(
325
330
  butler_config, dimensions, filename, OpaqueManagerClass, BridgeManagerClass
326
331
  )
327
332
 
@@ -342,8 +347,13 @@ class QuantumBackedButler(LimitedButler):
342
347
  storageClasses=storageClasses,
343
348
  dataset_types=dataset_types,
344
349
  metrics=metrics,
350
+ database=database,
345
351
  )
346
352
 
353
+ def close(self) -> None:
354
+ if self._database is not None:
355
+ self._database.dispose()
356
+
347
357
  def _retrieve_dataset_type(self, name: str) -> DatasetType | None:
348
358
  """Return DatasetType defined in registry given dataset type name."""
349
359
  return self._dataset_types.get(name)
@@ -76,3 +76,16 @@ class ThreadSafeCache(Generic[TKey, TValue]):
76
76
  """
77
77
  with self._mutex:
78
78
  return self._cache.setdefault(key, value)
79
+
80
+ def clear(self) -> dict[TKey, TValue]:
81
+ """Clear the cache.
82
+
83
+ Returns
84
+ -------
85
+ old_cache : `dict`
86
+ The values that were contained in the cache prior to clearing it.
87
+ """
88
+ with self._mutex:
89
+ old = self._cache
90
+ self._cache = {}
91
+ return old
@@ -33,6 +33,7 @@ from typing import Any
33
33
  import click
34
34
 
35
35
  from ... import script
36
+ from ..._butler import Butler
36
37
  from ..opt import (
37
38
  collection_argument,
38
39
  collection_type_option,
@@ -487,9 +488,11 @@ def remove_dataset_type(*args: Any, **kwargs: Any) -> None:
487
488
  @options_file_option()
488
489
  def query_datasets(**kwargs: Any) -> None:
489
490
  """List the datasets in a repository."""
490
- for table in script.QueryDatasets(**kwargs).getTables():
491
- print("")
492
- table.pprint_all()
491
+ repo = kwargs.pop("repo")
492
+ with Butler.from_config(repo, writeable=False) as butler:
493
+ for table in script.QueryDatasets(butler=butler, **kwargs).getTables():
494
+ print("")
495
+ table.pprint_all()
493
496
  print("")
494
497
 
495
498
 
@@ -93,8 +93,9 @@ MultipleCellCoadd: lsst.cell_coadds.CellCoaddFitsFormatter
93
93
  NNModelPackagePayload: lsst.meas.transiNet.modelPackages.NNModelPackageFormatter
94
94
  Timespan: lsst.daf.butler.formatters.json.JsonFormatter
95
95
  RegionTimeInfo: lsst.daf.butler.formatters.json.JsonFormatter
96
- QPEnsemble: lsst.meas.pz.qp_formatter.QPFormatter
97
- PZModel: lsst.meas.pz.model_formatter.ModelFormatter
96
+ QPEnsemble: lsst.meas.photoz.base.qp_formatter.QPFormatter
97
+ PZModel: lsst.meas.photoz.base.model_formatter.ModelFormatter
98
+ PhotozModel: lsst.meas.photoz.base.model_formatter.ModelFormatter
98
99
  VisitBackgroundModel: lsst.daf.butler.formatters.json.JsonFormatter
99
100
  VignettingCorrection: lsst.ts.observatory.control.utils.extras.vignetting_storage.VignettingCorrectionFormatter
100
101
  SSPAuxiliaryFile: lsst.pipe.tasks.sspAuxiliaryFile.SSPAuxiliaryFileFormatter
@@ -12,19 +12,19 @@ lsst.obs.base.formatters.fitsExposure.StandardFitsImageFormatterBase: &StandardF
12
12
  variance:
13
13
  <<: *losslessOptions
14
14
 
15
- # Basic lossy (quantizing) compression
16
- lossyBasic: &lossyBasic
17
- image: &lossyBasicOptions
15
+ # Lossy (quantizing) compression with noise sigma subdivided into 16.
16
+ lossy16:
17
+ image: &lossy16Options
18
18
  algorithm: RICE_1
19
19
  quantization:
20
20
  dither: SUBTRACTIVE_DITHER_2
21
21
  scaling: STDEV_MASKED
22
- mask_planes: ["NO_DATA"]
23
- level: 10.0
22
+ mask_planes: ["NO_DATA", "INTRP"]
23
+ level: 16.0
24
24
  mask:
25
25
  <<: *losslessOptions
26
26
  variance:
27
- <<: *lossyBasicOptions
27
+ <<: *lossy16Options
28
28
 
29
29
  # Set the default
30
30
  default:
@@ -433,6 +433,8 @@ storageClasses:
433
433
  pytype: qp.Ensemble
434
434
  PZModel:
435
435
  pytype: rail.core.model.Model
436
+ PhotozModel:
437
+ pytype: rail.core.model.Model
436
438
  VisitBackgroundModel:
437
439
  pytype: lsst.drp.tasks.fit_visit_background.VisitBackgroundModel
438
440
  VignettingCorrection:
@@ -45,6 +45,7 @@ import uuid
45
45
  import warnings
46
46
  from collections import Counter, defaultdict
47
47
  from collections.abc import Collection, Iterable, Iterator, MutableMapping, Sequence
48
+ from functools import partial
48
49
  from types import EllipsisType
49
50
  from typing import TYPE_CHECKING, Any, ClassVar, NamedTuple, TextIO, cast
50
51
 
@@ -160,9 +161,9 @@ class DirectButler(Butler): # numpydoc ignore=PR02
160
161
  # dependency-inversion trick. This is not used by regular butler,
161
162
  # but we do not have a way to distinguish regular butler from execution
162
163
  # butler.
163
- self._datastore.set_retrieve_dataset_type_method(self._retrieve_dataset_type)
164
+ self._datastore.set_retrieve_dataset_type_method(partial(_retrieve_dataset_type, registry))
164
165
 
165
- self._registry_shim = RegistryShim(self)
166
+ self._closed = False
166
167
 
167
168
  return self
168
169
 
@@ -250,6 +251,18 @@ class DirectButler(Butler): # numpydoc ignore=PR02
250
251
  metrics=metrics,
251
252
  )
252
253
 
254
+ def close(self) -> None:
255
+ if not self._closed:
256
+ self._closed = True
257
+ self._registry.close()
258
+ # Cause exceptions to be raised if a user attempts to use the
259
+ # instance after closing it. Without this, Butler would still
260
+ # work after being closed because of implementation details
261
+ # of SqlAlchemy, but this may not continue to be the case in the
262
+ # future and we don't want users to get in the habit of doing this.
263
+ self._registry = _BUTLER_CLOSED_INSTANCE
264
+ self._datastore = _BUTLER_CLOSED_INSTANCE
265
+
253
266
  GENERATION: ClassVar[int] = 3
254
267
  """This is a Generation 3 Butler.
255
268
 
@@ -258,13 +271,6 @@ class DirectButler(Butler): # numpydoc ignore=PR02
258
271
  code.
259
272
  """
260
273
 
261
- def _retrieve_dataset_type(self, name: str) -> DatasetType | None:
262
- """Return DatasetType defined in registry given dataset type name."""
263
- try:
264
- return self.get_dataset_type(name)
265
- except MissingDatasetTypeError:
266
- return None
267
-
268
274
  @classmethod
269
275
  def _unpickle(
270
276
  cls,
@@ -2530,7 +2536,7 @@ class DirectButler(Butler): # numpydoc ignore=PR02
2530
2536
  are accessible only via `Registry` methods. Eventually these methods
2531
2537
  will be replaced by equivalent `Butler` methods.
2532
2538
  """
2533
- return self._registry_shim
2539
+ return RegistryShim(self)
2534
2540
 
2535
2541
  @property
2536
2542
  def dimensions(self) -> DimensionUniverse:
@@ -2574,22 +2580,14 @@ class DirectButler(Butler): # numpydoc ignore=PR02
2574
2580
  accessible only via `SqlRegistry` methods.
2575
2581
  """
2576
2582
 
2577
- datastore: Datastore
2578
- """The object that manages actual dataset storage (`Datastore`).
2579
-
2580
- Direct user access to the datastore should rarely be necessary; the primary
2581
- exception is the case where a `Datastore` implementation provides extra
2582
- functionality beyond what the base class defines.
2583
- """
2584
-
2585
2583
  storageClasses: StorageClassFactory
2586
2584
  """An object that maps known storage class names to objects that fully
2587
2585
  describe them (`StorageClassFactory`).
2588
2586
  """
2589
2587
 
2590
- _registry_shim: RegistryShim
2591
- """Shim object to provide a legacy public interface for querying via the
2592
- the ``registry`` property.
2588
+ _closed: bool
2589
+ """`True` if close() has already been called on this instance; `False`
2590
+ otherwise.
2593
2591
  """
2594
2592
 
2595
2593
 
@@ -2614,3 +2612,19 @@ def _to_uuid(id: DatasetId | str) -> uuid.UUID:
2614
2612
  return id
2615
2613
  else:
2616
2614
  return uuid.UUID(id)
2615
+
2616
+
2617
+ class _ButlerClosed:
2618
+ def __getattr__(self, name: str) -> Any:
2619
+ raise RuntimeError("Attempted to use a Butler instance which has been closed.")
2620
+
2621
+
2622
+ _BUTLER_CLOSED_INSTANCE: Any = _ButlerClosed()
2623
+
2624
+
2625
+ def _retrieve_dataset_type(registry: SqlRegistry, name: str) -> DatasetType | None:
2626
+ """Return DatasetType defined in registry given dataset type name."""
2627
+ try:
2628
+ return registry.getDatasetType(name)
2629
+ except MissingDatasetTypeError:
2630
+ return None
@@ -49,13 +49,14 @@ __all__ = (
49
49
  )
50
50
 
51
51
  import collections.abc
52
+ import contextlib
52
53
  import itertools
53
54
  import json
54
55
  import logging
55
56
  import re
56
- from collections.abc import Iterable, Sequence
57
+ from collections.abc import Generator, Iterable, Sequence
57
58
  from fnmatch import fnmatchcase
58
- from typing import TYPE_CHECKING, Any, cast
59
+ from typing import IO, TYPE_CHECKING, Any, cast
59
60
 
60
61
  import pyarrow as pa
61
62
  import pyarrow.parquet as pq
@@ -84,6 +85,16 @@ TARGET_ROW_GROUP_BYTES = 1_000_000_000
84
85
  ASTROPY_PANDAS_INDEX_KEY = "lsst::arrow::astropy_pandas_index"
85
86
 
86
87
 
88
+ @contextlib.contextmanager
89
+ def generic_open(path: str, fs: AbstractFileSystem | None) -> Generator[IO]:
90
+ if fs is None:
91
+ with open(path, "rb") as fh:
92
+ yield fh
93
+ else:
94
+ with fs.open(path) as fh:
95
+ yield fh
96
+
97
+
87
98
  class ParquetFormatter(FormatterV2):
88
99
  """Interface for reading and writing Arrow Table objects to and from
89
100
  Parquet files.
@@ -120,7 +131,8 @@ class ParquetFormatter(FormatterV2):
120
131
  component: str | None = None,
121
132
  expected_size: int = -1,
122
133
  ) -> Any:
123
- schema = pq.read_schema(path, filesystem=fs)
134
+ with generic_open(path, fs) as handle:
135
+ schema = pq.read_schema(handle)
124
136
 
125
137
  schema_names = ["ArrowSchema", "DataFrameSchema", "ArrowAstropySchema", "ArrowNumpySchema"]
126
138
 
@@ -133,13 +145,13 @@ class ParquetFormatter(FormatterV2):
133
145
  if b"lsst::arrow::rowcount" in schema.metadata:
134
146
  return int(schema.metadata[b"lsst::arrow::rowcount"])
135
147
 
136
- temp_table = pq.read_table(
137
- path,
138
- filesystem=fs,
139
- columns=[schema.names[0]],
140
- use_threads=False,
141
- use_pandas_metadata=False,
142
- )
148
+ with generic_open(path, fs) as handle:
149
+ temp_table = pq.read_table(
150
+ handle,
151
+ columns=[schema.names[0]],
152
+ use_threads=False,
153
+ use_pandas_metadata=False,
154
+ )
143
155
 
144
156
  return len(temp_table[schema.names[0]])
145
157
 
@@ -148,7 +160,7 @@ class ParquetFormatter(FormatterV2):
148
160
  par_columns = self.file_descriptor.parameters.pop("columns", None)
149
161
  if par_columns:
150
162
  has_pandas_multi_index = False
151
- if b"pandas" in schema.metadata:
163
+ if schema.metadata and b"pandas" in schema.metadata:
152
164
  md = json.loads(schema.metadata[b"pandas"])
153
165
  if len(md["column_indexes"]) > 1:
154
166
  has_pandas_multi_index = True
@@ -184,13 +196,13 @@ class ParquetFormatter(FormatterV2):
184
196
  )
185
197
 
186
198
  metadata = schema.metadata if schema.metadata is not None else {}
187
- arrow_table = pq.read_table(
188
- path,
189
- filesystem=fs,
190
- columns=par_columns,
191
- use_threads=False,
192
- use_pandas_metadata=(b"pandas" in metadata),
193
- )
199
+ with generic_open(path, fs) as handle:
200
+ arrow_table = pq.read_table(
201
+ handle,
202
+ columns=par_columns,
203
+ use_threads=False,
204
+ use_pandas_metadata=(b"pandas" in metadata),
205
+ )
194
206
 
195
207
  return arrow_table
196
208
 
@@ -537,6 +537,9 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
537
537
  if cls._generic_startswith(startdata, "["):
538
538
  # This is a JSON array of records.
539
539
  return _ButlerLogRecordsModelV1
540
+ elif cls._generic_startswith(startdata, cls.STREAMING_EXTRA_DELIMITER):
541
+ # This is an empty log file with a log record per line format.
542
+ return None
540
543
  elif not cls._generic_startswith(startdata, "{"):
541
544
  # Limit the length of string reported in error message in case
542
545
  # this is an enormous file.
@@ -570,9 +573,12 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
570
573
  """
571
574
  first_line = stream.readline()
572
575
 
576
+ empty_stream = False
573
577
  if not first_line:
574
578
  # Empty file, return zero records.
575
579
  return cls.from_records([])
580
+ elif cls._generic_startswith(first_line, cls.STREAMING_EXTRA_DELIMITER):
581
+ empty_stream = True
576
582
 
577
583
  model_type = cls._detect_model(first_line)
578
584
 
@@ -583,13 +589,17 @@ class ButlerLogRecords(MutableSequence[ButlerLogRecord]):
583
589
  return model_type.model_validate_json(all).wrap(cls)
584
590
 
585
591
  # A stream of records with one record per line.
586
- records = [ButlerLogRecord.model_validate_json(first_line)]
587
- for line in stream:
588
- line = line.rstrip()
589
- if cls._generic_startswith(line, "###EXTRA###"):
590
- break
591
- elif line: # skip blank lines
592
- records.append(ButlerLogRecord.model_validate_json(line))
592
+ if not empty_stream:
593
+ records = [ButlerLogRecord.model_validate_json(first_line)]
594
+ for line in stream:
595
+ line = line.rstrip()
596
+ if cls._generic_startswith(line, cls.STREAMING_EXTRA_DELIMITER):
597
+ break
598
+ elif line: # skip blank lines
599
+ records.append(ButlerLogRecord.model_validate_json(line))
600
+ else:
601
+ # No records but might have extra metadata.
602
+ records = []
593
603
  extra_data = stream.read()
594
604
  if extra_data:
595
605
  extra = pydantic_core.from_json(extra_data)