lsst-daf-butler 30.2025.5000__tar.gz → 30.2025.5200__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 (438) hide show
  1. {lsst_daf_butler-30.2025.5000/python/lsst_daf_butler.egg-info → lsst_daf_butler-30.2025.5200}/PKG-INFO +1 -1
  2. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_formatter.py +2 -9
  3. lsst_daf_butler-30.2025.5200/python/lsst/daf/butler/_rubin/temporary_for_ingest.py +207 -0
  4. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/record_data.py +1 -1
  5. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/fileDatastore.py +14 -0
  6. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/bridge/monolithic.py +17 -13
  7. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +49 -45
  8. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_database.py +6 -1
  9. lsst_daf_butler-30.2025.5200/python/lsst/daf/butler/version.py +2 -0
  10. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  11. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
  12. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_butler.py +16 -0
  13. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_datastore.py +40 -0
  14. lsst_daf_butler-30.2025.5000/python/lsst/daf/butler/version.py +0 -2
  15. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/COPYRIGHT +0 -0
  16. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/LICENSE +0 -0
  17. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/MANIFEST.in +0 -0
  18. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/README.md +0 -0
  19. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/bsd_license.txt +0 -0
  20. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  21. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  22. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/configuring.rst +0 -0
  23. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/datastores.rst +0 -0
  24. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/dimensions.rst +0 -0
  25. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/formatters.rst +0 -0
  26. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/index.rst +0 -0
  27. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/organizing.rst +0 -0
  28. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/queries.rst +0 -0
  29. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  30. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  31. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/gpl-v3.0.txt +0 -0
  32. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/pyproject.toml +0 -0
  33. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/__init__.py +0 -0
  34. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/__init__.py +0 -0
  35. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/__init__.py +0 -0
  36. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler.py +0 -0
  37. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_collections.py +0 -0
  38. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_config.py +0 -0
  39. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  40. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  41. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  42. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_collection_type.py +0 -0
  43. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_config.py +0 -0
  44. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_config_support.py +0 -0
  45. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_association.py +0 -0
  46. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  47. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  48. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  49. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_dataset_type.py +0 -0
  50. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  51. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_exceptions.py +0 -0
  52. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  53. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_file_dataset.py +0 -0
  54. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  55. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  56. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_limited_butler.py +0 -0
  57. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_location.py +0 -0
  58. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_named.py +0 -0
  59. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_quantum.py +0 -0
  60. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  61. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  62. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_registry_shim.py +0 -0
  63. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_rubin/__init__.py +0 -0
  64. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_rubin/file_datasets.py +0 -0
  65. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_standalone_datastore.py +0 -0
  66. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_storage_class.py +0 -0
  67. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  68. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_timespan.py +0 -0
  69. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_topology.py +0 -0
  70. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  71. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  72. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  73. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  74. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/_uuid.py +0 -0
  75. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/arrow_utils.py +0 -0
  76. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/__init__.py +0 -0
  77. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/butler.py +0 -0
  78. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  79. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  80. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  81. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  82. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  83. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  84. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  85. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  86. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  87. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/progress.py +0 -0
  88. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/cli/utils.py +0 -0
  89. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/column_spec.py +0 -0
  90. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  91. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  92. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  93. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  94. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  95. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  96. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  97. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  98. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  99. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  100. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  101. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  102. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  103. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  104. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  105. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  106. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  107. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  108. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  109. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  110. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  111. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/composites.py +0 -0
  112. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  113. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  114. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  115. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  116. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  117. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  118. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  119. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  120. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  121. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  122. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  123. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/ddl.py +0 -0
  124. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  125. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  126. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  127. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  128. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  129. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  130. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  131. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  132. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  133. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  134. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  135. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  136. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  137. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  138. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  139. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  140. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  141. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  142. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  143. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  144. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  145. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  146. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  147. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  148. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  149. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  150. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  151. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  152. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  153. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  154. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  155. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  156. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/file.py +0 -0
  157. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/json.py +0 -0
  158. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/logs.py +0 -0
  159. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  160. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/packages.py +0 -0
  161. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  162. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  163. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  164. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  165. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/json.py +0 -0
  166. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/logging.py +0 -0
  167. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/mapping_factory.py +0 -0
  168. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/name_shrinker.py +0 -0
  169. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  170. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/persistence_context.py +0 -0
  171. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/progress.py +0 -0
  172. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/py.typed +0 -0
  173. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  174. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/__init__.py +0 -0
  175. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_base.py +0 -0
  176. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  177. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  178. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  179. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  180. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  181. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  182. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/_query.py +0 -0
  183. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  184. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/driver.py +0 -0
  185. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  186. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/__init__.py +0 -0
  187. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/categorize.py +0 -0
  188. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/__init__.py +0 -0
  189. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/exprTree.py +0 -0
  190. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/parser.py +0 -0
  191. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/parserLex.py +0 -0
  192. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/parserYacc.py +0 -0
  193. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/ply/__init__.py +0 -0
  194. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/ply/lex.py +0 -0
  195. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/ply/yacc.py +0 -0
  196. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/expressions/parser/treeVisitor.py +0 -0
  197. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  198. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  199. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  200. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  201. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  202. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  203. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  204. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  205. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  206. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  207. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  208. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/queries/visitors.py +0 -0
  209. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/__init__.py +0 -0
  210. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  211. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  212. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  213. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  214. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_config.py +0 -0
  215. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  216. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  217. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_registry.py +0 -0
  218. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_registry_base.py +0 -0
  219. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  220. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/attributes.py +0 -0
  221. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  222. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  223. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  224. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  225. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  226. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  227. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  228. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  229. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  230. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  231. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  232. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  233. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  234. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  235. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  236. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  237. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  238. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  239. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  240. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  241. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  242. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  243. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  244. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  245. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  246. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  247. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  248. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/managers.py +0 -0
  249. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  250. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  251. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  252. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  253. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  254. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  255. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  256. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  257. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  258. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/opaque.py +0 -0
  259. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  260. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_common.py +0 -0
  261. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_data_coordinates.py +0 -0
  262. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_datasets.py +0 -0
  263. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_query_dimension_records.py +0 -0
  264. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  265. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  266. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  267. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  268. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  269. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/versions.py +0 -0
  270. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  271. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  272. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  273. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  274. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  275. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  276. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  277. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_get.py +0 -0
  278. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  279. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  280. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  281. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  282. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  283. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  284. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  285. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  286. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/__init__.py +0 -0
  287. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/cadc.py +0 -0
  288. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/interface.py +0 -0
  289. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/authentication/rubin.py +0 -0
  290. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  291. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  292. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  293. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  294. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  295. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  296. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  297. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  298. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  299. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  300. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +0 -0
  301. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  302. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  303. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  304. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  305. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  306. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  307. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/repo_relocation.py +0 -0
  308. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/__init__.py +0 -0
  309. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/_associate.py +0 -0
  310. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  311. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  312. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  313. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  314. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/configDump.py +0 -0
  315. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/configValidate.py +0 -0
  316. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/createRepo.py +0 -0
  317. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  318. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  319. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  320. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  321. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  322. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  323. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  324. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  325. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  326. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  327. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  328. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  329. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  330. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  331. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/__init__.py +0 -0
  332. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  333. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  334. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  335. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  336. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  337. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  338. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  339. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  340. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  341. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  342. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  343. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  344. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  345. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  346. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  347. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  348. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  349. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  350. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  351. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  352. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  353. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/server.py +0 -0
  354. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/server_available.py +0 -0
  355. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  356. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  357. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/tests/utils.py +0 -0
  358. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/time_utils.py +0 -0
  359. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  360. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  361. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/_context.py +0 -0
  362. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  363. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  364. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst/daf/butler/utils.py +0 -0
  365. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  366. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  367. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  368. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  369. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  370. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/setup.cfg +0 -0
  371. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_astropyTableFormatter.py +0 -0
  372. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_authentication.py +0 -0
  373. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_butler_factory.py +0 -0
  374. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdAssociate.py +0 -0
  375. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdConfigDump.py +0 -0
  376. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdConfigValidate.py +0 -0
  377. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdCreate.py +0 -0
  378. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdImport.py +0 -0
  379. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdIngestFiles.py +0 -0
  380. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdPruneDatasets.py +0 -0
  381. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryCollections.py +0 -0
  382. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDataIds.py +0 -0
  383. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  384. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDatasets.py +0 -0
  385. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  386. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdRemoveCollections.py +0 -0
  387. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdRemoveRuns.py +0 -0
  388. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  389. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliLog.py +0 -0
  390. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliPluginLoader.py +0 -0
  391. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtilSplitCommas.py +0 -0
  392. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtilSplitKv.py +0 -0
  393. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtilToUpper.py +0 -0
  394. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_cliUtils.py +0 -0
  395. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_column_spec.py +0 -0
  396. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_composites.py +0 -0
  397. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_config.py +0 -0
  398. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_connectionString.py +0 -0
  399. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_constraints.py +0 -0
  400. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_datasets.py +0 -0
  401. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_ddl.py +0 -0
  402. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_dimension_record_containers.py +0 -0
  403. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_dimensions.py +0 -0
  404. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_exprParserLex.py +0 -0
  405. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_exprParserYacc.py +0 -0
  406. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_formatter.py +0 -0
  407. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_gafaelfawr.py +0 -0
  408. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_location.py +0 -0
  409. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_logFormatter.py +0 -0
  410. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_logging.py +0 -0
  411. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_matplotlibFormatter.py +0 -0
  412. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_nonempty_mapping.py +0 -0
  413. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_obscore.py +0 -0
  414. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_packages.py +0 -0
  415. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_parquet.py +0 -0
  416. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_postgresql.py +0 -0
  417. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_progress.py +0 -0
  418. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_pydantic_utils.py +0 -0
  419. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_quantum.py +0 -0
  420. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_quantumBackedButler.py +0 -0
  421. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_direct_postgresql.py +0 -0
  422. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_direct_sqlite.py +0 -0
  423. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_interface.py +0 -0
  424. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_remote.py +0 -0
  425. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_query_utilities.py +0 -0
  426. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_remote_butler.py +0 -0
  427. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_server.py +0 -0
  428. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_simpleButler.py +0 -0
  429. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_sqlite.py +0 -0
  430. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_storageClass.py +0 -0
  431. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_templates.py +0 -0
  432. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_testRepo.py +0 -0
  433. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_thread_utils.py +0 -0
  434. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_time_utils.py +0 -0
  435. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_timespan.py +0 -0
  436. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_utils.py +0 -0
  437. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_uuid.py +0 -0
  438. {lsst_daf_butler-30.2025.5000 → lsst_daf_butler-30.2025.5200}/tests/test_versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 30.2025.5000
3
+ Version: 30.2025.5200
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
@@ -54,6 +54,7 @@ from ._config import Config
54
54
  from ._config_support import LookupKey, processLookupConfigs
55
55
  from ._file_descriptor import FileDescriptor
56
56
  from ._location import Location
57
+ from ._rubin.temporary_for_ingest import TemporaryForIngest
57
58
  from .dimensions import DataCoordinate, DimensionUniverse
58
59
  from .mapping_factory import MappingFactory
59
60
 
@@ -1031,15 +1032,7 @@ class FormatterV2:
1031
1032
  """
1032
1033
  cache_manager = self._ensure_cache(cache_manager)
1033
1034
 
1034
- # Always write to a temporary even if
1035
- # using a local file system -- that gives us atomic writes.
1036
- # If a process is killed as the file is being written we do not
1037
- # want it to remain in the correct place but in corrupt state.
1038
- # For local files write to the output directory not temporary dir.
1039
- prefix = uri.dirname() if uri.isLocal else None
1040
- if prefix is not None:
1041
- prefix.mkdir()
1042
- with ResourcePath.temporary_uri(suffix=uri.getExtension(), prefix=prefix) as temporary_uri:
1035
+ with TemporaryForIngest.make_path(uri) as temporary_uri:
1043
1036
  # Need to configure the formatter to write to a different
1044
1037
  # location and that needs us to overwrite internals
1045
1038
  log.debug("Writing dataset to temporary location at %s", temporary_uri)
@@ -0,0 +1,207 @@
1
+ # This file is part of daf_butler.
2
+ #
3
+ # Developed for the LSST Data Management System.
4
+ # This product includes software developed by the LSST Project
5
+ # (http://www.lsst.org).
6
+ # See the COPYRIGHT file at the top-level directory of this distribution
7
+ # for details of code ownership.
8
+ #
9
+ # This software is dual licensed under the GNU General Public License and also
10
+ # under a 3-clause BSD license. Recipients may choose which of these licenses
11
+ # to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
12
+ # respectively. If you choose the GPL option then the following text applies
13
+ # (but note that there is still no warranty even if you opt for BSD instead):
14
+ #
15
+ # This program is free software: you can redistribute it and/or modify
16
+ # it under the terms of the GNU General Public License as published by
17
+ # the Free Software Foundation, either version 3 of the License, or
18
+ # (at your option) any later version.
19
+ #
20
+ # This program is distributed in the hope that it will be useful,
21
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
+ # GNU General Public License for more details.
24
+ #
25
+ # You should have received a copy of the GNU General Public License
26
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
+
28
+ from __future__ import annotations
29
+
30
+ __all__ = ("TemporaryForIngest",)
31
+
32
+ import dataclasses
33
+ import glob
34
+ from contextlib import contextmanager
35
+ from typing import TYPE_CHECKING, Self, cast
36
+
37
+ from lsst.resources import ResourcePath
38
+
39
+ if TYPE_CHECKING:
40
+ from collections.abc import Iterator
41
+ from types import TracebackType
42
+
43
+ from .._butler import Butler
44
+ from .._dataset_ref import DatasetRef
45
+ from .._file_dataset import FileDataset
46
+ from .._limited_butler import LimitedButler
47
+
48
+
49
+ @dataclasses.dataclass
50
+ class TemporaryForIngest:
51
+ """A context manager for generating temporary paths that will be ingested
52
+ as butler datasets.
53
+
54
+ Notes
55
+ -----
56
+ Neither this class nor its `make_path` method run ingest automatically when
57
+ their context manager is exited; the `ingest` method must always be called
58
+ explicitly.
59
+ """
60
+
61
+ butler: Butler
62
+ """Full butler to obtain a predicted path from and ingest into."""
63
+
64
+ ref: DatasetRef
65
+ """Description of the dataset to ingest."""
66
+
67
+ dataset: FileDataset = dataclasses.field(init=False)
68
+ """The dataset that will be passed to `Butler.ingest`."""
69
+
70
+ @property
71
+ def path(self) -> ResourcePath:
72
+ """The temporary path.
73
+
74
+ Guaranteed to be a local POSIX path.
75
+ """
76
+ return cast(ResourcePath, self.dataset.path)
77
+
78
+ @property
79
+ def ospath(self) -> str:
80
+ """The temporary path as a complete filename."""
81
+ return self.path.ospath
82
+
83
+ @classmethod
84
+ @contextmanager
85
+ def make_path(cls, final_path: ResourcePath) -> Iterator[ResourcePath]:
86
+ """Return a temporary path context manager given the predicted final
87
+ path.
88
+
89
+ Parameters
90
+ ----------
91
+ final_path : `lsst.resources.ResourcePath`
92
+ Predicted final path.
93
+
94
+ Returns
95
+ -------
96
+ context : `contextlib.AbstractContextManager`
97
+ A context manager that yields the temporary
98
+ `~lsst.resources.ResourcePath` when entered and deletes that file
99
+ when exited.
100
+ """
101
+ # Always write to a temporary even if using a local file system -- that
102
+ # gives us atomic writes. If a process is killed as the file is being
103
+ # written we do not want it to remain in the correct place but in
104
+ # corrupt state. For local files write to the output directory not
105
+ # temporary dir.
106
+ prefix = final_path.dirname() if final_path.isLocal else None
107
+ if prefix is not None:
108
+ prefix.mkdir()
109
+ with ResourcePath.temporary_uri(
110
+ suffix=cls._get_temporary_suffix(final_path), prefix=prefix
111
+ ) as temporary_path:
112
+ yield temporary_path
113
+
114
+ def ingest(self, record_validation_info: bool = True) -> None:
115
+ """Ingest the file into the butler.
116
+
117
+ Parameters
118
+ ----------
119
+ record_validation_info : `bool`, optional
120
+ Whether to- record the file size and checksum upon ingest.
121
+ """
122
+ self.butler.ingest(self.dataset, transfer="move", record_validation_info=record_validation_info)
123
+
124
+ def __enter__(self) -> Self:
125
+ from .._file_dataset import FileDataset
126
+
127
+ final_path = self.butler.getURI(self.ref, predict=True).replace(fragment="")
128
+ prefix = final_path.dirname() if final_path.isLocal else None
129
+ if prefix is not None:
130
+ prefix.mkdir()
131
+ self._temporary_path_context = self.make_path(final_path)
132
+ temporary_path = self._temporary_path_context.__enter__()
133
+ self.dataset = FileDataset(temporary_path, [self.ref], formatter=None)
134
+ return self
135
+
136
+ def __exit__(
137
+ self,
138
+ exc_type: type[BaseException] | None,
139
+ exc_value: BaseException | None,
140
+ traceback: TracebackType | None,
141
+ ) -> bool | None:
142
+ return self._temporary_path_context.__exit__(exc_type, exc_value, traceback)
143
+
144
+ @classmethod
145
+ def find_orphaned_temporaries_by_path(cls, final_path: ResourcePath) -> list[ResourcePath]:
146
+ """Search for temporary files that were not successfully ingested.
147
+
148
+ Parameters
149
+ ----------
150
+ final_path : `lsst.resources.ResourcePath`
151
+ Final path a successfully-ingested file would have.
152
+
153
+ Returns
154
+ -------
155
+ paths : `list` [ `lsst.resources.ResourcePath` ]
156
+ Files that look like temporaries that might have been created while
157
+ trying to write the target dataset.
158
+
159
+ Notes
160
+ -----
161
+ Orphaned files are only possible when a context manager is interrupted
162
+ by a hard error that prevents any cleanup code from running (e.g.
163
+ sudden loss of power).
164
+ """
165
+ if not final_path.isLocal:
166
+ # We return true tempfile for non-local predicted paths, so orphans
167
+ # are not our problem (the OS etc. will take care of them).
168
+ return []
169
+ return [
170
+ ResourcePath(filename)
171
+ for filename in glob.glob(
172
+ f"{glob.escape(final_path.dirname().ospath)}*{glob.escape(cls._get_temporary_suffix(final_path))}"
173
+ )
174
+ if filename != final_path.ospath
175
+ ]
176
+
177
+ @classmethod
178
+ def find_orphaned_temporaries_by_ref(cls, ref: DatasetRef, butler: LimitedButler) -> list[ResourcePath]:
179
+ """Search for temporary files that were not successfully ingested.
180
+
181
+ Parameters
182
+ ----------
183
+ ref : `..DatasetRef`
184
+ A dataset reference the temporaries correspond to.
185
+ butler : `lsst.daf.butler.LimitedButler`
186
+ Butler that can be used to obtain a predicted URI for a dataset.
187
+
188
+ Returns
189
+ -------
190
+ paths : `list` [ `lsst.resources.ResourcePath` ]
191
+ Files that look like temporaries that might have been created while
192
+ trying to write the target dataset.
193
+
194
+ Notes
195
+ -----
196
+ Orphaned files are only possible when a context manager is interrupted
197
+ by a hard error that prevents any cleanup code from running (e.g.
198
+ sudden loss of power).
199
+ """
200
+ final_path = butler.getURI(ref, predict=True).replace(fragment="")
201
+ return cls.find_orphaned_temporaries_by_path(final_path)
202
+
203
+ @staticmethod
204
+ def _get_temporary_suffix(path: ResourcePath) -> str:
205
+ ext = path.getExtension()
206
+ basename = path.basename().removesuffix(ext)
207
+ return f"{basename}.tmp{ext}"
@@ -49,7 +49,7 @@ if TYPE_CHECKING:
49
49
  # Pydantic requires the possible value types to be explicitly enumerated in
50
50
  # order for `uuid.UUID` in particular to work. `typing.Any` does not work
51
51
  # here.
52
- _Record: TypeAlias = dict[str, int | str | uuid.UUID | None]
52
+ _Record: TypeAlias = dict[str, int | str | None]
53
53
 
54
54
 
55
55
  class SerializedDatastoreRecordData(pydantic.BaseModel):
@@ -3166,6 +3166,20 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
3166
3166
 
3167
3167
  def export_records(self, refs: Iterable[DatasetIdRef]) -> Mapping[str, DatastoreRecordData]:
3168
3168
  # Docstring inherited from the base class.
3169
+
3170
+ # This call to 'bridge.check' filters out "partially deleted" datasets.
3171
+ # Specifically, ones in the unusual edge state that:
3172
+ # 1. They have an entry in the registry dataset tables
3173
+ # 2. They were "trashed" from the datastore, so they are not
3174
+ # present in the "dataset_location" table.)
3175
+ # 3. But the trash has not been "emptied", so there are still entries
3176
+ # in the "opaque" datastore records table.
3177
+ #
3178
+ # As far as I can tell, this can only occur in the case of a concurrent
3179
+ # or aborted call to `Butler.pruneDatasets(unstore=True, purge=False)`.
3180
+ # Datasets (with or without files existing on disk) can persist in
3181
+ # this zombie state indefinitely, until someone manually empties
3182
+ # the trash.
3169
3183
  exported_refs = list(self._bridge.check(refs))
3170
3184
  ids = {ref.id for ref in exported_refs}
3171
3185
  records: dict[DatasetId, dict[str, list[StoredDatastoreItemInfo]]] = {id: {} for id in ids}
@@ -215,20 +215,24 @@ class MonolithicDatastoreRegistryBridge(DatastoreRegistryBridge):
215
215
  def check(self, refs: Iterable[DatasetIdRef]) -> Iterable[DatasetIdRef]:
216
216
  # Docstring inherited from DatastoreRegistryBridge
217
217
  byId = {ref.id: ref for ref in refs}
218
- sql = (
219
- sqlalchemy.sql.select(self._tables.dataset_location.columns.dataset_id)
220
- .select_from(self._tables.dataset_location)
221
- .where(
222
- sqlalchemy.sql.and_(
223
- self._tables.dataset_location.columns.datastore_name == self.datastoreName,
224
- self._tables.dataset_location.columns.dataset_id.in_(byId.keys()),
218
+ found: list[DatasetIdRef] = []
219
+ with self._db.session():
220
+ for batch in chunk_iterable(byId.keys(), 50000):
221
+ sql = (
222
+ sqlalchemy.sql.select(self._tables.dataset_location.columns.dataset_id)
223
+ .select_from(self._tables.dataset_location)
224
+ .where(
225
+ sqlalchemy.sql.and_(
226
+ self._tables.dataset_location.columns.datastore_name == self.datastoreName,
227
+ self._tables.dataset_location.columns.dataset_id.in_(batch),
228
+ )
229
+ )
225
230
  )
226
- )
227
- )
228
- with self._db.query(sql) as sql_result:
229
- sql_rows = sql_result.fetchall()
230
- for row in sql_rows:
231
- yield byId[row.dataset_id]
231
+ with self._db.query(sql) as sql_result:
232
+ sql_ids = sql_result.scalars().all()
233
+ found.extend(byId[id] for id in sql_ids)
234
+
235
+ return found
232
236
 
233
237
  @contextmanager
234
238
  def emptyTrash(
@@ -12,6 +12,8 @@ from typing import TYPE_CHECKING, Any, ClassVar
12
12
  import astropy.time
13
13
  import sqlalchemy
14
14
 
15
+ from lsst.utils.iteration import chunk_iterable
16
+
15
17
  from .... import ddl
16
18
  from ...._collection_type import CollectionType
17
19
  from ...._dataset_ref import DatasetId, DatasetIdFactory, DatasetIdGenEnum, DatasetRef
@@ -424,17 +426,18 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
424
426
  return result
425
427
 
426
428
  def get_dataset_refs(self, ids: list[DatasetId]) -> list[DatasetRef]:
427
- # Look up the dataset types corresponding to the given Dataset IDs.
428
- id_col = self._static.dataset.columns["id"]
429
- sql = sqlalchemy.sql.select(
430
- id_col,
431
- self._static.dataset.columns["dataset_type_id"],
432
- ).where(id_col.in_(ids))
433
- with self._db.query(sql) as sql_result:
434
- dataset_rows = sql_result.mappings().all()
435
- dataset_type_map: dict[DatasetId, DatasetType] = {
436
- row["id"]: self._get_dataset_type_by_id(row["dataset_type_id"]) for row in dataset_rows
437
- }
429
+ dataset_type_map: dict[DatasetId, DatasetType] = {}
430
+ for batch in chunk_iterable(set(ids), 50000):
431
+ # Look up the dataset types corresponding to the given Dataset IDs.
432
+ id_col = self._static.dataset.columns["id"]
433
+ sql = sqlalchemy.sql.select(
434
+ id_col,
435
+ self._static.dataset.columns["dataset_type_id"],
436
+ ).where(id_col.in_(batch))
437
+ with self._db.query(sql) as sql_result:
438
+ dataset_rows = sql_result.mappings().all()
439
+ for row in dataset_rows:
440
+ dataset_type_map[row["id"]] = self._get_dataset_type_by_id(row["dataset_type_id"])
438
441
 
439
442
  # Group the given dataset IDs by the DimensionGroup of their dataset
440
443
  # types -- there is a separate tags table for each DimensionGroup.
@@ -448,40 +451,41 @@ class ByDimensionsDatasetRecordStorageManagerUUID(DatasetRecordStorageManager):
448
451
  # data IDs corresponding to the UUIDs found from the dataset table.
449
452
  dynamic_tables = self._get_dynamic_tables(dimension_group)
450
453
  tags_table = self._get_tags_table(dynamic_tables)
451
- tags_sql = tags_table.select().where(tags_table.columns["dataset_id"].in_(datasets))
452
- # Join in the collection table to fetch the run name.
453
- collection_column = tags_table.columns[self._collections.getCollectionForeignKeyName()]
454
- joined_collections = self._collections.join_collections_sql(collection_column, tags_sql)
455
- tags_sql = joined_collections.joined_sql
456
- run_name_column = joined_collections.name_column
457
- tags_sql = tags_sql.add_columns(run_name_column)
458
- # Tags table includes run collections and tagged
459
- # collections.
460
- # In theory the data ID for a given dataset should be the
461
- # same in both, but nothing actually guarantees this.
462
- # So skip any tagged collections, using the run collection
463
- # as the definitive definition.
464
- tags_sql = tags_sql.where(joined_collections.type_column == int(CollectionType.RUN))
465
-
466
- with self._db.query(tags_sql) as sql_result:
467
- data_id_rows = sql_result.mappings().all()
468
-
469
- assert run_name_column.key is not None
470
- for data_id_row in data_id_rows:
471
- id = data_id_row["dataset_id"]
472
- dataset_type = dataset_type_map[id]
473
- run_name = data_id_row[run_name_column.key]
474
- data_id = DataCoordinate.from_required_values(
475
- dimension_group,
476
- tuple(data_id_row[dimension] for dimension in dimension_group.required),
477
- )
478
- ref = DatasetRef(
479
- datasetType=dataset_type,
480
- dataId=data_id,
481
- id=id,
482
- run=run_name,
483
- )
484
- output_refs.append(ref)
454
+ for batch in chunk_iterable(datasets, 50000):
455
+ tags_sql = tags_table.select().where(tags_table.columns["dataset_id"].in_(batch))
456
+ # Join in the collection table to fetch the run name.
457
+ collection_column = tags_table.columns[self._collections.getCollectionForeignKeyName()]
458
+ joined_collections = self._collections.join_collections_sql(collection_column, tags_sql)
459
+ tags_sql = joined_collections.joined_sql
460
+ run_name_column = joined_collections.name_column
461
+ tags_sql = tags_sql.add_columns(run_name_column)
462
+ # Tags table includes run collections and tagged
463
+ # collections.
464
+ # In theory the data ID for a given dataset should be the
465
+ # same in both, but nothing actually guarantees this.
466
+ # So skip any tagged collections, using the run collection
467
+ # as the definitive definition.
468
+ tags_sql = tags_sql.where(joined_collections.type_column == int(CollectionType.RUN))
469
+
470
+ with self._db.query(tags_sql) as sql_result:
471
+ data_id_rows = sql_result.mappings().all()
472
+
473
+ assert run_name_column.key is not None
474
+ for data_id_row in data_id_rows:
475
+ id = data_id_row["dataset_id"]
476
+ dataset_type = dataset_type_map[id]
477
+ run_name = data_id_row[run_name_column.key]
478
+ data_id = DataCoordinate.from_required_values(
479
+ dimension_group,
480
+ tuple(data_id_row[dimension] for dimension in dimension_group.required),
481
+ )
482
+ ref = DatasetRef(
483
+ datasetType=dataset_type,
484
+ dataId=data_id,
485
+ id=id,
486
+ run=run_name,
487
+ )
488
+ output_refs.append(ref)
485
489
 
486
490
  return output_refs
487
491
 
@@ -1562,7 +1562,12 @@ class Database(ABC):
1562
1562
  return None
1563
1563
  else:
1564
1564
  sql = table.insert()
1565
- return [connection.execute(sql, row).inserted_primary_key[0] for row in rows]
1565
+ ids = []
1566
+ for row in rows:
1567
+ key = connection.execute(sql, row).inserted_primary_key
1568
+ assert key is not None
1569
+ ids.append(key[0])
1570
+ return ids
1566
1571
 
1567
1572
  @abstractmethod
1568
1573
  def replace(self, table: sqlalchemy.schema.Table, *rows: dict) -> None:
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "30.2025.5200"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 30.2025.5000
3
+ Version: 30.2025.5200
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
@@ -73,6 +73,7 @@ python/lsst/daf/butler/utils.py
73
73
  python/lsst/daf/butler/version.py
74
74
  python/lsst/daf/butler/_rubin/__init__.py
75
75
  python/lsst/daf/butler/_rubin/file_datasets.py
76
+ python/lsst/daf/butler/_rubin/temporary_for_ingest.py
76
77
  python/lsst/daf/butler/_utilities/__init__.py
77
78
  python/lsst/daf/butler/_utilities/locked_object.py
78
79
  python/lsst/daf/butler/_utilities/named_locks.py
@@ -90,6 +90,7 @@ from lsst.daf.butler import (
90
90
  script,
91
91
  )
92
92
  from lsst.daf.butler._rubin.file_datasets import transfer_datasets_to_datastore
93
+ from lsst.daf.butler._rubin.temporary_for_ingest import TemporaryForIngest
93
94
  from lsst.daf.butler.datastore import NullDatastore
94
95
  from lsst.daf.butler.datastore.file_templates import FileTemplate, FileTemplateValidationError
95
96
  from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ZipIndex
@@ -2441,6 +2442,21 @@ class PosixDatastoreButlerTestCase(FileDatastoreButlerTests, unittest.TestCase):
2441
2442
  self.assertIsNotNone(target_butler.get(repo.ref2))
2442
2443
  self.assertIsNotNone(target_butler.get(other_ref))
2443
2444
 
2445
+ def test_temporary_for_ingest(self) -> None:
2446
+ """Test the `lsst.daf.butler._rubin.ingest_from_temporary` module."""
2447
+ with self.create_empty_butler("example_run") as butler:
2448
+ dataset_type = DatasetType("example", butler.dimensions.empty, "StructuredDataDict")
2449
+ butler.registry.registerDatasetType(dataset_type)
2450
+ ref = DatasetRef(dataset_type, DataCoordinate.make_empty(butler.dimensions), "example_run")
2451
+ with TemporaryForIngest(butler, ref) as temporary:
2452
+ temporary.path.write(b"three: 3")
2453
+ found = TemporaryForIngest.find_orphaned_temporaries_by_ref(ref, butler)
2454
+ self.assertEqual(found, [temporary.path])
2455
+ self.assertIn(".tmp", temporary.ospath)
2456
+ temporary.ingest()
2457
+ loaded = butler.get(ref)
2458
+ self.assertEqual(loaded, {"three": 3})
2459
+
2444
2460
 
2445
2461
  class PostgresPosixDatastoreButlerTestCase(FileDatastoreButlerTests, unittest.TestCase):
2446
2462
  """PosixDatastore specialization of a butler using Postgres"""
@@ -61,6 +61,7 @@ from lsst.daf.butler.datastore.cache_manager import (
61
61
  DatastoreCacheManagerConfig,
62
62
  DatastoreDisabledCacheManager,
63
63
  )
64
+ from lsst.daf.butler.datastore.record_data import DatastoreRecordData, SerializedDatastoreRecordData
64
65
  from lsst.daf.butler.datastore.stored_file_info import StoredFileInfo, make_datastore_path_relative
65
66
  from lsst.daf.butler.formatters.yaml import YamlFormatter
66
67
  from lsst.daf.butler.tests import (
@@ -77,6 +78,7 @@ from lsst.daf.butler.tests.dict_convertible_model import DictConvertibleModel
77
78
  from lsst.daf.butler.tests.utils import TestCaseMixin
78
79
  from lsst.resources import ResourcePath
79
80
  from lsst.utils import doImport
81
+ from lsst.utils.introspection import get_full_type_name
80
82
 
81
83
  TESTDIR = os.path.dirname(__file__)
82
84
 
@@ -2252,6 +2254,44 @@ class StoredFileInfoTestCase(DatasetTestHelper, unittest.TestCase):
2252
2254
  self.assertEqual(make_datastore_path_relative("http://server.com/some/path"), "some/path")
2253
2255
  self.assertEqual(make_datastore_path_relative("http://server.com/some/path#frag"), "some/path#frag")
2254
2256
 
2257
+ def test_datastore_record_data_json_types(self):
2258
+ """Test that we don't round-trip checksums to UUIDs when deserializing
2259
+ datastore record data.
2260
+ """
2261
+ test_json = """
2262
+ {
2263
+ "dataset_ids": [
2264
+ "74478304-abf1-4a9c-9eb2-926090a84446"
2265
+ ],
2266
+ "records": {
2267
+ "lsst.daf.butler.datastore.stored_file_info.StoredFileInfo": {
2268
+ "74478304abf14a9c9eb2926090a84446": {
2269
+ "file_datastore_records": [
2270
+ {
2271
+ "formatter": "lsst.daf.butler.formatters.yaml.YamlFormatter",
2272
+ "path": "gain_factors/base-2025-158/gain_factors_spx_base-2025-158.yaml",
2273
+ "storage_class": "GainFactors",
2274
+ "component": "__NULL_STRING__",
2275
+ "checksum": "cab515f6-ab67-0484-393f-aaa525dd526f",
2276
+ "file_size": 5412
2277
+ }
2278
+ ]
2279
+ }
2280
+ }
2281
+ }
2282
+ }
2283
+ """
2284
+ id_str = "74478304abf14a9c9eb2926090a84446"
2285
+ s = SerializedDatastoreRecordData.model_validate_json(test_json)
2286
+ self.assertIsInstance(
2287
+ s.records[get_full_type_name(StoredFileInfo)][id_str]["file_datastore_records"][0]["checksum"],
2288
+ str,
2289
+ )
2290
+ id = uuid.UUID(id_str)
2291
+ d = DatastoreRecordData.from_simple(s)
2292
+ self.assertIsInstance(d.records[id]["file_datastore_records"][0], StoredFileInfo)
2293
+ self.assertIsInstance(d.records[id]["file_datastore_records"][0].checksum, str)
2294
+
2255
2295
 
2256
2296
  @contextlib.contextmanager
2257
2297
  def _temp_yaml_file(data: Any) -> Iterator[str]:
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "30.2025.5000"