lsst-daf-butler 29.2025.1900__tar.gz → 29.2025.2100__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 (435) hide show
  1. {lsst_daf_butler-29.2025.1900/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2100}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler.py +34 -4
  3. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_collections.py +4 -0
  4. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_quantum_backed.py +3 -2
  5. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/butler.py +1 -1
  6. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +2 -0
  7. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/commands.py +6 -0
  8. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/utils.py +32 -4
  9. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/formatters.yaml +1 -0
  10. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/storageClasses.yaml +2 -0
  11. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/_datastore.py +26 -4
  12. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/generic_base.py +2 -2
  13. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/chainedDatastore.py +63 -92
  14. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/fileDatastore.py +307 -104
  15. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +33 -5
  16. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_butler/_direct_butler.py +191 -66
  17. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_driver.py +9 -8
  18. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +19 -1
  19. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/overlaps.py +1 -1
  20. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_expression.py +39 -0
  21. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_predicate.py +16 -8
  22. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/bridge/ephemeral.py +16 -6
  23. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/bridge/monolithic.py +78 -37
  24. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/_base.py +23 -6
  25. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +4 -4
  26. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/dimensions/static.py +20 -8
  27. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_bridge.py +13 -1
  28. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +7 -2
  29. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/tests/_registry.py +26 -11
  30. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_http_connection.py +15 -3
  31. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_remote_butler.py +16 -3
  32. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_config.py +109 -0
  33. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_dependencies.py +124 -0
  34. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +125 -0
  35. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/_server.py +11 -4
  36. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/remote_butler/server/_telemetry.py +105 -0
  37. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +10 -2
  38. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +7 -3
  39. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/ingest_zip.py +13 -1
  40. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/removeRuns.py +2 -5
  41. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/retrieveArtifacts.py +1 -0
  42. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/butler_queries.py +23 -0
  43. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/cliCmdTestBase.py +1 -1
  44. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/hybrid_butler.py +20 -5
  45. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/server.py +28 -3
  46. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/version.py +2 -0
  47. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  48. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/SOURCES.txt +3 -0
  49. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_butler.py +61 -10
  50. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliPluginLoader.py +1 -1
  51. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_datasets.py +9 -0
  52. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_datastore.py +37 -0
  53. lsst_daf_butler-29.2025.2100/tests/test_gafaelfawr.py +104 -0
  54. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_interface.py +0 -2
  55. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_remote_butler.py +5 -0
  56. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_server.py +41 -6
  57. lsst_daf_butler-29.2025.1900/python/lsst/daf/butler/remote_butler/server/_config.py +0 -54
  58. lsst_daf_butler-29.2025.1900/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -59
  59. lsst_daf_butler-29.2025.1900/python/lsst/daf/butler/version.py +0 -2
  60. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/COPYRIGHT +0 -0
  61. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/LICENSE +0 -0
  62. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/MANIFEST.in +0 -0
  63. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/README.md +0 -0
  64. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/bsd_license.txt +0 -0
  65. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  66. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  67. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/configuring.rst +0 -0
  68. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/datastores.rst +0 -0
  69. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/dimensions.rst +0 -0
  70. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/formatters.rst +0 -0
  71. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/index.rst +0 -0
  72. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/organizing.rst +0 -0
  73. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/queries.rst +0 -0
  74. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  75. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  76. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/gpl-v3.0.txt +0 -0
  77. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/pyproject.toml +0 -0
  78. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/__init__.py +0 -0
  79. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/__init__.py +0 -0
  80. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/__init__.py +0 -0
  81. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_config.py +0 -0
  82. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  83. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  84. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  85. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_collection_type.py +0 -0
  86. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_column_categorization.py +0 -0
  87. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_column_tags.py +0 -0
  88. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_column_type_info.py +0 -0
  89. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_config.py +0 -0
  90. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_config_support.py +0 -0
  91. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_association.py +0 -0
  92. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  93. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  94. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  95. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_dataset_type.py +0 -0
  96. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  97. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_exceptions.py +0 -0
  98. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  99. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_file_dataset.py +0 -0
  100. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  101. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_formatter.py +0 -0
  102. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  103. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_limited_butler.py +0 -0
  104. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_location.py +0 -0
  105. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_named.py +0 -0
  106. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_quantum.py +0 -0
  107. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  108. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_registry_shim.py +0 -0
  109. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_storage_class.py +0 -0
  110. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  111. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_timespan.py +0 -0
  112. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_topology.py +0 -0
  113. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  114. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  115. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  116. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  117. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/arrow_utils.py +0 -0
  118. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/__init__.py +0 -0
  119. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  120. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  121. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  122. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  123. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  124. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  125. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  126. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/cli/progress.py +0 -0
  127. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/column_spec.py +0 -0
  128. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  129. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  130. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  131. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  132. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  133. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  134. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  135. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  136. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  137. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  138. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  139. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  140. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  141. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  142. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  143. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  144. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  145. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/composites.py +0 -0
  146. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  147. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  148. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  149. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  150. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  151. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  152. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  153. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  154. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  155. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/ddl.py +0 -0
  156. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  157. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  158. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  159. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  160. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  161. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  162. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  163. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  164. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  165. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  166. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  167. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  168. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  169. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  170. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  171. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  172. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  173. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  174. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  175. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  176. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  177. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  178. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  179. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  180. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  181. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  182. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  183. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  184. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  185. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/file.py +0 -0
  186. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/json.py +0 -0
  187. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/logs.py +0 -0
  188. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  189. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/packages.py +0 -0
  190. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  191. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  192. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  193. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  194. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/json.py +0 -0
  195. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/logging.py +0 -0
  196. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/mapping_factory.py +0 -0
  197. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/name_shrinker.py +0 -0
  198. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  199. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/persistence_context.py +0 -0
  200. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/progress.py +0 -0
  201. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/py.typed +0 -0
  202. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  203. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/__init__.py +0 -0
  204. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_base.py +0 -0
  205. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  206. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  207. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  208. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  209. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  210. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  211. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/_query.py +0 -0
  212. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  213. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/driver.py +0 -0
  214. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  215. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  216. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  217. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  218. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  219. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  220. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  221. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  222. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  223. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/queries/visitors.py +0 -0
  224. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/__init__.py +0 -0
  225. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  226. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  227. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  228. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  229. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_config.py +0 -0
  230. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  231. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  232. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_registry.py +0 -0
  233. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  234. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/attributes.py +0 -0
  235. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  236. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  237. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  238. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  239. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  240. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  241. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  242. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  243. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  244. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  245. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  246. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  247. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  248. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  249. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  250. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  251. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  252. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  253. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  254. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  255. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  256. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  257. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  258. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/managers.py +0 -0
  259. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  260. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  261. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  262. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  263. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  264. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  265. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  266. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  267. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  268. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/opaque.py +0 -0
  269. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  270. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  271. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  272. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  273. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  274. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  275. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  276. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  277. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  278. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  279. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  280. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  281. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  282. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  283. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  284. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  285. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  286. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  287. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  288. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  289. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  290. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  291. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  292. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  293. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  294. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  295. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  296. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  297. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  298. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/versions.py +0 -0
  299. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  300. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  301. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  302. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  303. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  304. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  305. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  306. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  307. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  308. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  309. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  310. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  311. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  312. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  313. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  314. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  315. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  316. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  317. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  318. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  319. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  320. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  321. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  322. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  323. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  324. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/repo_relocation.py +0 -0
  325. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/__init__.py +0 -0
  326. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/_associate.py +0 -0
  327. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  328. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  329. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  330. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  331. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/configDump.py +0 -0
  332. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/configValidate.py +0 -0
  333. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/createRepo.py +0 -0
  334. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  335. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  336. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  337. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  338. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  339. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  340. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  341. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  342. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  343. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  344. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  345. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/__init__.py +0 -0
  346. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  347. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  348. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  349. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  350. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  351. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  352. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  353. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  354. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  355. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  356. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  357. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  358. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/tests/utils.py +0 -0
  359. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/time_utils.py +0 -0
  360. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  361. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  362. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/_context.py +0 -0
  363. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  364. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  365. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst/daf/butler/utils.py +0 -0
  366. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  367. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  368. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  369. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  370. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  371. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/setup.cfg +0 -0
  372. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_astropyTableFormatter.py +0 -0
  373. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_authentication.py +0 -0
  374. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_butler_factory.py +0 -0
  375. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdAssociate.py +0 -0
  376. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdConfigDump.py +0 -0
  377. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdConfigValidate.py +0 -0
  378. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdCreate.py +0 -0
  379. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdImport.py +0 -0
  380. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdIngestFiles.py +0 -0
  381. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdPruneDatasets.py +0 -0
  382. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryCollections.py +0 -0
  383. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDataIds.py +0 -0
  384. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  385. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDatasets.py +0 -0
  386. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  387. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdRemoveCollections.py +0 -0
  388. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdRemoveRuns.py +0 -0
  389. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  390. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliLog.py +0 -0
  391. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtilSplitCommas.py +0 -0
  392. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtilSplitKv.py +0 -0
  393. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtilToUpper.py +0 -0
  394. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_cliUtils.py +0 -0
  395. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_column_spec.py +0 -0
  396. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_composites.py +0 -0
  397. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_config.py +0 -0
  398. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_connectionString.py +0 -0
  399. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_constraints.py +0 -0
  400. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_ddl.py +0 -0
  401. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_dimension_record_containers.py +0 -0
  402. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_dimensions.py +0 -0
  403. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_exprParserLex.py +0 -0
  404. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_exprParserYacc.py +0 -0
  405. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_expressions.py +0 -0
  406. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_formatter.py +0 -0
  407. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_location.py +0 -0
  408. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_logFormatter.py +0 -0
  409. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_logging.py +0 -0
  410. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_matplotlibFormatter.py +0 -0
  411. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_nonempty_mapping.py +0 -0
  412. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_normalFormExpression.py +0 -0
  413. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_obscore.py +0 -0
  414. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_packages.py +0 -0
  415. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_parquet.py +0 -0
  416. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_postgresql.py +0 -0
  417. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_progress.py +0 -0
  418. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_pydantic_utils.py +0 -0
  419. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_quantum.py +0 -0
  420. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_quantumBackedButler.py +0 -0
  421. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_direct_postgresql.py +0 -0
  422. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_direct_sqlite.py +0 -0
  423. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_relations.py +0 -0
  424. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_remote.py +0 -0
  425. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_query_utilities.py +0 -0
  426. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_simpleButler.py +0 -0
  427. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_sqlite.py +0 -0
  428. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_storageClass.py +0 -0
  429. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_templates.py +0 -0
  430. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_testRepo.py +0 -0
  431. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_thread_utils.py +0 -0
  432. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_time_utils.py +0 -0
  433. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_timespan.py +0 -0
  434. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_utils.py +0 -0
  435. {lsst_daf_butler-29.2025.1900 → lsst_daf_butler-29.2025.2100}/tests/test_versioning.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-daf-butler
3
- Version: 29.2025.1900
3
+ Version: 29.2025.2100
4
4
  Summary: An abstraction layer for reading and writing astronomical data to datastores.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -90,6 +90,10 @@ class SpecificButlerDataset:
90
90
  dataset: DatasetRef | None
91
91
 
92
92
 
93
+ class _DeprecatedDefault:
94
+ """Default value for a deprecated parameter."""
95
+
96
+
93
97
  class Butler(LimitedButler): # numpydoc ignore=PR02
94
98
  """Interface for data butler and factory for Butler instances.
95
99
 
@@ -1288,7 +1292,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1288
1292
  raise NotImplementedError()
1289
1293
 
1290
1294
  @abstractmethod
1291
- def removeRuns(self, names: Iterable[str], unstore: bool = True) -> None:
1295
+ def removeRuns(
1296
+ self,
1297
+ names: Iterable[str],
1298
+ unstore: bool | type[_DeprecatedDefault] = _DeprecatedDefault,
1299
+ *,
1300
+ unlink_from_chains: bool = False,
1301
+ ) -> None:
1292
1302
  """Remove one or more `~CollectionType.RUN` collections and the
1293
1303
  datasets within them.
1294
1304
 
@@ -1301,7 +1311,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1301
1311
  they are present, and attempt to rollback the registry deletions if
1302
1312
  datastore deletions fail (which may not always be possible). If
1303
1313
  `False`, datastore records for these datasets are still removed,
1304
- but any artifacts (e.g. files) will not be.
1314
+ but any artifacts (e.g. files) will not be. This parameter is now
1315
+ deprecated and no longer has any effect. Files are always deleted
1316
+ from datastores unless they were ingested using full URIs.
1317
+ unlink_from_chains : `bool`, optional
1318
+ If `True` remove the RUN collection from any chains prior to
1319
+ removing the RUN. If `False` the removal will fail if any chains
1320
+ still refer to the RUN.
1305
1321
 
1306
1322
  Raises
1307
1323
  ------
@@ -1374,7 +1390,14 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1374
1390
  raise NotImplementedError()
1375
1391
 
1376
1392
  @abstractmethod
1377
- def ingest_zip(self, zip_file: ResourcePathExpression, transfer: str = "auto") -> None:
1393
+ def ingest_zip(
1394
+ self,
1395
+ zip_file: ResourcePathExpression,
1396
+ transfer: str = "auto",
1397
+ *,
1398
+ transfer_dimensions: bool = False,
1399
+ dry_run: bool = False,
1400
+ ) -> None:
1378
1401
  """Ingest a Zip file into this butler.
1379
1402
 
1380
1403
  The Zip file must have been created by `retrieve_artifacts_zip`.
@@ -1385,10 +1408,17 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1385
1408
  Path to the Zip file.
1386
1409
  transfer : `str`, optional
1387
1410
  Method to use to transfer the Zip into the datastore.
1411
+ transfer_dimensions : `bool`, optional
1412
+ If `True`, dimension record data associated with the new datasets
1413
+ will be transferred from the Zip file, if present.
1414
+ dry_run : `bool`, optional
1415
+ If `True` the ingest will be processed without any modifications
1416
+ made to the target butler and as if the target butler did not
1417
+ have any of the datasets.
1388
1418
 
1389
1419
  Notes
1390
1420
  -----
1391
- Run collections are created as needed.
1421
+ Run collections and dataset types are created as needed.
1392
1422
  """
1393
1423
  raise NotImplementedError()
1394
1424
 
@@ -108,6 +108,10 @@ class ButlerCollections(ABC, Sequence):
108
108
  """Collection defaults associated with this butler."""
109
109
  raise NotImplementedError("Defaults must be implemented by a subclass")
110
110
 
111
+ def __str__(self) -> str:
112
+ """Return string representation."""
113
+ return f"{self.__class__.__name__}(defaults={self.defaults})"
114
+
111
115
  @abstractmethod
112
116
  def extend_chain(self, parent_collection_name: str, child_collection_names: str | Iterable[str]) -> None:
113
117
  """Add children to the end of a CHAINED collection.
@@ -516,8 +516,9 @@ class QuantumBackedButler(LimitedButler):
516
516
  self._actual_output_refs.discard(ref)
517
517
 
518
518
  if unstore:
519
- # Point of no return for removing artifacts
520
- self._datastore.emptyTrash()
519
+ # Point of no return for removing artifacts. Only try to remove
520
+ # refs associated with this pruning.
521
+ self._datastore.emptyTrash(refs=refs)
521
522
 
522
523
  def retrieve_artifacts_zip(
523
524
  self,
@@ -102,7 +102,7 @@ class PluginCommand:
102
102
  """Where the command came from (`str`)."""
103
103
 
104
104
 
105
- class LoaderCLI(click.MultiCommand, abc.ABC):
105
+ class LoaderCLI(click.Group, abc.ABC):
106
106
  """Extends `click.MultiCommand`, which dispatches to subcommands, to load
107
107
  subcommands at runtime.
108
108
 
@@ -81,7 +81,9 @@ def _print_remove(will: bool, runs: Sequence[script.RemoveRun], datasets: Mappin
81
81
  else:
82
82
  print(run.name)
83
83
  print("\n" + willRemoveDatasetsMsg if will else didRemoveDatasetsMsg)
84
+ total = sum(datasets.values())
84
85
  print(", ".join([f"{i[0]}({i[1]})" for i in datasets.items()]))
86
+ print("Total number of datasets to remove: ", total)
85
87
 
86
88
 
87
89
  def _print_requires_confirmation(runs: Sequence[script.RemoveRun], datasets: Mapping[str, int]) -> None:
@@ -829,6 +829,12 @@ def export_calibs(*args: Any, **kwargs: Any) -> None:
829
829
  @repo_argument(required=True)
830
830
  @click.argument("zip", required=True)
831
831
  @transfer_option()
832
+ @transfer_dimensions_option(
833
+ default=False, help="Attempt to register missing dimension records during ingest."
834
+ )
835
+ @click.option(
836
+ "--dry-run/--no-dry-run", default=False, help="Enable dry run mode and do not ingest any datasets."
837
+ )
832
838
  def ingest_zip(**kwargs: Any) -> None:
833
839
  """Ingest a Zip file created by retrieve-artifacts.
834
840
 
@@ -55,6 +55,7 @@ __all__ = (
55
55
  )
56
56
 
57
57
 
58
+ import importlib.metadata
58
59
  import itertools
59
60
  import logging
60
61
  import os
@@ -76,6 +77,7 @@ import click
76
77
  import click.exceptions
77
78
  import click.testing
78
79
  import yaml
80
+ from packaging.version import Version
79
81
 
80
82
  from lsst.utils.iteration import ensure_iterable
81
83
 
@@ -87,6 +89,12 @@ if TYPE_CHECKING:
87
89
 
88
90
  from lsst.daf.butler import Dimension
89
91
 
92
+ _click_version = Version(importlib.metadata.version("click"))
93
+ if _click_version >= Version("8.2.0"):
94
+ _click_make_metavar_has_context = True
95
+ else:
96
+ _click_make_metavar_has_context = False
97
+
90
98
  log = logging.getLogger(__name__)
91
99
 
92
100
  # This is used as the metavar argument to Options that accept multiple string
@@ -741,9 +749,16 @@ class MWPath(click.Path):
741
749
  class MWOption(click.Option):
742
750
  """Overrides click.Option with desired behaviors."""
743
751
 
744
- def make_metavar(self) -> str:
752
+ def make_metavar(self, ctx: click.Context | None = None) -> str:
745
753
  """Make the metavar for the help menu.
746
754
 
755
+ Parameters
756
+ ----------
757
+ ctx : `click.Context` or `None`
758
+ Context from the command.
759
+
760
+ Notes
761
+ -----
747
762
  Overrides `click.Option.make_metavar`.
748
763
  Adds a space and an ellipsis after the metavar name if
749
764
  the option accepts multiple inputs, otherwise defers to the base
@@ -758,7 +773,10 @@ class MWOption(click.Option):
758
773
  transformation that must apply to all types should be applied in
759
774
  get_help_record.
760
775
  """
761
- metavar = super().make_metavar()
776
+ if _click_make_metavar_has_context:
777
+ metavar = super().make_metavar(ctx=ctx) # type: ignore
778
+ else:
779
+ metavar = super().make_metavar() # type: ignore
762
780
  if self.multiple and self.nargs == 1:
763
781
  metavar += " ..."
764
782
  elif self.nargs != 1:
@@ -769,9 +787,16 @@ class MWOption(click.Option):
769
787
  class MWArgument(click.Argument):
770
788
  """Overrides click.Argument with desired behaviors."""
771
789
 
772
- def make_metavar(self) -> str:
790
+ def make_metavar(self, ctx: click.Context | None = None) -> str:
773
791
  """Make the metavar for the help menu.
774
792
 
793
+ Parameters
794
+ ----------
795
+ ctx : `click.Context` or `None`
796
+ Context from the command.
797
+
798
+ Notes
799
+ -----
775
800
  Overrides `click.Option.make_metavar`.
776
801
  Always adds a space and an ellipsis (' ...') after the
777
802
  metavar name if the option accepts multiple inputs.
@@ -784,7 +809,10 @@ class MWArgument(click.Argument):
784
809
  metavar : `str`
785
810
  The metavar value.
786
811
  """
787
- metavar = super().make_metavar()
812
+ if _click_make_metavar_has_context:
813
+ metavar = super().make_metavar(ctx=ctx) # type: ignore
814
+ else:
815
+ metavar = super().make_metavar() # type: ignore
788
816
  if self.nargs != 1:
789
817
  metavar = f"{metavar[:-3]} ..."
790
818
  return metavar
@@ -94,3 +94,4 @@ Timespan: lsst.daf.butler.formatters.json.JsonFormatter
94
94
  RegionTimeInfo: lsst.daf.butler.formatters.json.JsonFormatter
95
95
  QPEnsemble: lsst.meas.pz.qp_formatter.QPFormatter
96
96
  PZModel: lsst.meas.pz.model_formatter.ModelFormatter
97
+ VisitBackgroundModel: lsst.daf.butler.formatters.json.JsonFormatter
@@ -426,3 +426,5 @@ storageClasses:
426
426
  pytype: qp.Ensemble
427
427
  PZModel:
428
428
  pytype: rail.core.model.Model
429
+ VisitBackgroundModel:
430
+ pytype: lsst.drp.tasks.fit_visit_background.VisitBackgroundModel
@@ -1082,7 +1082,7 @@ class Datastore(metaclass=ABCMeta):
1082
1082
  raise NotImplementedError()
1083
1083
 
1084
1084
  @abstractmethod
1085
- def ingest_zip(self, zip_path: ResourcePath, transfer: str | None) -> None:
1085
+ def ingest_zip(self, zip_path: ResourcePath, transfer: str | None, *, dry_run: bool = False) -> None:
1086
1086
  """Ingest an indexed Zip file and contents.
1087
1087
 
1088
1088
  The Zip file must have an index file as created by `retrieveArtifacts`.
@@ -1093,6 +1093,10 @@ class Datastore(metaclass=ABCMeta):
1093
1093
  Path to the Zip file.
1094
1094
  transfer : `str`
1095
1095
  Method to use for transferring the Zip file into the datastore.
1096
+ dry_run : `bool`, optional
1097
+ If `True` the ingest will be processed without any modifications
1098
+ made to the target datastore and as if the target datastore did not
1099
+ have any of the datasets.
1096
1100
  """
1097
1101
  raise NotImplementedError()
1098
1102
 
@@ -1160,13 +1164,29 @@ class Datastore(metaclass=ABCMeta):
1160
1164
  raise NotImplementedError("Must be implemented by subclass")
1161
1165
 
1162
1166
  @abstractmethod
1163
- def emptyTrash(self, ignore_errors: bool = True) -> None:
1167
+ def emptyTrash(
1168
+ self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
1169
+ ) -> set[ResourcePath]:
1164
1170
  """Remove all datasets from the trash.
1165
1171
 
1166
1172
  Parameters
1167
1173
  ----------
1168
1174
  ignore_errors : `bool`, optional
1169
1175
  Determine whether errors should be ignored.
1176
+ refs : `collections.abc.Collection` [ `DatasetRef` ] or `None`
1177
+ Explicit list of datasets that can be removed from trash. If listed
1178
+ datasets are not already stored in the trash table they will be
1179
+ ignored. If `None` every entry in the trash table will be
1180
+ processed.
1181
+ dry_run : `bool`, optional
1182
+ If `True`, the trash table will be queried and results reported
1183
+ but no artifacts will be removed.
1184
+
1185
+ Returns
1186
+ -------
1187
+ removed : `set` [ `lsst.resources.ResourcePath` ]
1188
+ List of artifacts that were removed. Can return nothing if
1189
+ artifacts cannot be represented by URIs.
1170
1190
 
1171
1191
  Notes
1172
1192
  -----
@@ -1488,7 +1508,7 @@ class NullDatastore(Datastore):
1488
1508
  def getURI(self, datasetRef: DatasetRef, predict: bool = False) -> ResourcePath:
1489
1509
  raise FileNotFoundError("This is a no-op datastore that can not access a real datastore")
1490
1510
 
1491
- def ingest_zip(self, zip_path: ResourcePath, transfer: str | None) -> None:
1511
+ def ingest_zip(self, zip_path: ResourcePath, transfer: str | None, *, dry_run: bool = False) -> None:
1492
1512
  raise NotImplementedError("Can only ingest a Zip into a real datastore.")
1493
1513
 
1494
1514
  def retrieveArtifacts(
@@ -1512,7 +1532,9 @@ class NullDatastore(Datastore):
1512
1532
  def trash(self, ref: DatasetRef | Iterable[DatasetRef], ignore_errors: bool = True) -> None:
1513
1533
  raise NotImplementedError("This is a no-op datastore that can not access a real datastore")
1514
1534
 
1515
- def emptyTrash(self, ignore_errors: bool = True) -> None:
1535
+ def emptyTrash(
1536
+ self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
1537
+ ) -> set[ResourcePath]:
1516
1538
  raise NotImplementedError("This is a no-op datastore that can not access a real datastore")
1517
1539
 
1518
1540
  def transfer(self, inputDatastore: Datastore, datasetRef: DatasetRef) -> None:
@@ -80,7 +80,7 @@ class GenericBaseDatastore(Datastore, Generic[_InfoType]):
80
80
  encountered during removal are not ignored.
81
81
  """
82
82
  self.trash(ref, ignore_errors=False)
83
- self.emptyTrash(ignore_errors=False)
83
+ self.emptyTrash(ignore_errors=False, refs=[ref])
84
84
 
85
85
  def transfer(self, inputDatastore: Datastore, ref: DatasetRef) -> None:
86
86
  """Retrieve a dataset from an input `Datastore`,
@@ -89,7 +89,7 @@ class GenericBaseDatastore(Datastore, Generic[_InfoType]):
89
89
  Parameters
90
90
  ----------
91
91
  inputDatastore : `Datastore`
92
- The external `Datastore` from which to retreive the Dataset.
92
+ The external `Datastore` from which to retrieve the Dataset.
93
93
  ref : `DatasetRef`
94
94
  Reference to the required dataset in the input data store.
95
95
  """
@@ -32,7 +32,6 @@ from __future__ import annotations
32
32
  __all__ = ("ChainedDatastore",)
33
33
 
34
34
  import itertools
35
- import logging
36
35
  import time
37
36
  import warnings
38
37
  from collections.abc import Callable, Collection, Iterable, Mapping, Sequence
@@ -51,13 +50,14 @@ from lsst.daf.butler.datastore.record_data import DatastoreRecordData
51
50
  from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo, ZipIndex
52
51
  from lsst.resources import ResourcePath
53
52
  from lsst.utils import doImportType
53
+ from lsst.utils.logging import getLogger
54
54
 
55
55
  if TYPE_CHECKING:
56
56
  from lsst.daf.butler import Config, DatasetProvenance, DatasetType, LookupKey, StorageClass
57
57
  from lsst.daf.butler.registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
58
58
  from lsst.resources import ResourcePathExpression
59
59
 
60
- log = logging.getLogger(__name__)
60
+ log = getLogger(__name__)
61
61
 
62
62
 
63
63
  class _IngestPrepData(Datastore.IngestPrepData):
@@ -912,7 +912,7 @@ class ChainedDatastore(Datastore):
912
912
 
913
913
  return merged_artifact_map
914
914
 
915
- def ingest_zip(self, zip_path: ResourcePath, transfer: str | None) -> None:
915
+ def ingest_zip(self, zip_path: ResourcePath, transfer: str | None, *, dry_run: bool = False) -> None:
916
916
  """Ingest an indexed Zip file and contents.
917
917
 
918
918
  The Zip file must have an index file as created by `retrieveArtifacts`.
@@ -923,6 +923,10 @@ class ChainedDatastore(Datastore):
923
923
  Path to the Zip file.
924
924
  transfer : `str`
925
925
  Method to use for transferring the Zip file into the datastore.
926
+ dry_run : `bool`, optional
927
+ If `True` the ingest will be processed without any modifications
928
+ made to the target datastore and as if the target datastore did not
929
+ have any of the datasets.
926
930
 
927
931
  Notes
928
932
  -----
@@ -966,7 +970,7 @@ class ChainedDatastore(Datastore):
966
970
  log.debug("Datastore %s skipping zip ingest due to constraints", datastore.name)
967
971
  continue
968
972
  try:
969
- datastore.ingest_zip(zip_path, transfer=transfer)
973
+ datastore.ingest_zip(zip_path, transfer=transfer, dry_run=dry_run)
970
974
  except NotImplementedError:
971
975
  continue
972
976
  except Exception as e:
@@ -999,7 +1003,7 @@ class ChainedDatastore(Datastore):
999
1003
  """
1000
1004
  log.debug("Removing %s", ref)
1001
1005
  self.trash(ref, ignore_errors=False)
1002
- self.emptyTrash(ignore_errors=False)
1006
+ self.emptyTrash(ignore_errors=False, refs=[ref])
1003
1007
 
1004
1008
  def forget(self, refs: Iterable[DatasetRef]) -> None:
1005
1009
  for datastore in tuple(self.datastores):
@@ -1028,9 +1032,13 @@ class ChainedDatastore(Datastore):
1028
1032
  else:
1029
1033
  raise FileNotFoundError(err_msg)
1030
1034
 
1031
- def emptyTrash(self, ignore_errors: bool = True) -> None:
1035
+ def emptyTrash(
1036
+ self, ignore_errors: bool = True, refs: Collection[DatasetRef] | None = None, dry_run: bool = False
1037
+ ) -> set[ResourcePath]:
1038
+ removed = set()
1032
1039
  for datastore in self.datastores:
1033
- datastore.emptyTrash(ignore_errors=ignore_errors)
1040
+ removed.update(datastore.emptyTrash(ignore_errors=ignore_errors, refs=refs, dry_run=dry_run))
1041
+ return removed
1034
1042
 
1035
1043
  def transfer(self, inputDatastore: Datastore, ref: DatasetRef) -> None:
1036
1044
  """Retrieve a dataset from an input `Datastore`,
@@ -1039,7 +1047,7 @@ class ChainedDatastore(Datastore):
1039
1047
  Parameters
1040
1048
  ----------
1041
1049
  inputDatastore : `Datastore`
1042
- The external `Datastore` from which to retreive the Dataset.
1050
+ The external `Datastore` from which to retrieve the Dataset.
1043
1051
  ref : `DatasetRef`
1044
1052
  Reference to the required dataset in the input data store.
1045
1053
 
@@ -1235,102 +1243,65 @@ class ChainedDatastore(Datastore):
1235
1243
  dry_run: bool = False,
1236
1244
  ) -> tuple[set[DatasetRef], set[DatasetRef]]:
1237
1245
  # Docstring inherited
1238
- # mypy does not understand "type(self) is not type(source)"
1239
- if isinstance(source_datastore, ChainedDatastore):
1240
- # Both the source and destination are chained datastores.
1241
- source_datastores = tuple(source_datastore.datastores)
1242
- else:
1243
- # The source datastore is different, forward everything to the
1244
- # child datastores.
1245
- source_datastores = (source_datastore,)
1246
-
1247
1246
  if not refs:
1248
- # Nothing to transfer.
1249
1247
  return set(), set()
1250
1248
 
1251
- # Need to know the set of all possible refs that could be transferred.
1252
- remaining_refs = set(refs)
1253
-
1254
- missing_from_source: set[DatasetRef] | None = None
1255
- all_accepted = set()
1249
+ # Assume that each child datastore knows how to look inside a chained
1250
+ # datastore for compatible datastores (and so there is no need to
1251
+ # unpack the source datastores here).
1252
+ # Need to decide if a ref accepted by one datastore should be sent to
1253
+ # later datastores (as is done in put()). More efficient to filter out
1254
+ # accepted datasets.
1255
+ if artifact_existence is None:
1256
+ artifact_existence = {}
1257
+ available_refs = set(refs)
1258
+ accepted: set[DatasetRef] = set()
1259
+ rejected: set[DatasetRef] = set()
1256
1260
  nsuccess = 0
1257
- for source_child in source_datastores:
1258
- # If we are reading from a chained datastore, it's possible that
1259
- # only a subset of the datastores know about the dataset. We can't
1260
- # ask the receiving datastore to copy it when it doesn't exist
1261
- # so we have to filter again based on what the source datastore
1262
- # understands.
1263
- known_to_source = source_child.knows_these(list(refs))
1264
-
1265
- # Need to know that there is a possibility that some of these
1266
- # datasets exist but are unknown to the source datastore if
1267
- # trust is enabled.
1268
- if getattr(source_child, "trustGetRequest", False):
1269
- unknown = [ref for ref, known in known_to_source.items() if not known]
1270
- existence = source_child.mexists(unknown, artifact_existence)
1271
- for ref, exists in existence.items():
1272
- known_to_source[ref] = exists
1273
-
1274
- missing = {ref for ref, known in known_to_source.items() if not known}
1275
- if missing:
1276
- if missing_from_source is None:
1277
- missing_from_source = missing
1278
- else:
1279
- missing_from_source &= missing
1280
-
1281
- # Try to transfer from each source datastore to each child
1282
- # datastore. Have to make sure we don't transfer something
1283
- # we've already transferred to this destination on later passes.
1284
-
1285
- # Filter the initial list based on the datasets we have
1286
- # not yet transferred.
1287
- these_refs = []
1288
- for ref in refs:
1289
- if ref in remaining_refs and known_to_source[ref]:
1290
- these_refs.append(ref)
1291
-
1292
- if not these_refs:
1293
- # Already transferred all datasets known to this datastore.
1294
- continue
1295
1261
 
1296
- for datastore, constraints in zip(self.datastores, self.datastoreConstraints, strict=True):
1297
- if constraints is not None:
1298
- filtered_refs = []
1299
- for ref in these_refs:
1300
- if constraints.isAcceptable(ref):
1301
- filtered_refs.append(ref)
1302
- else:
1303
- log.debug("Rejecting ref by constraints: %s", ref)
1304
- else:
1305
- filtered_refs = list(these_refs)
1306
- try:
1307
- accepted, _ = datastore.transfer_from(
1308
- source_child,
1309
- filtered_refs,
1310
- transfer,
1311
- artifact_existence,
1312
- dry_run=dry_run,
1313
- )
1314
- except (TypeError, NotImplementedError):
1315
- # The datastores were incompatible.
1316
- continue
1317
- else:
1318
- nsuccess += 1
1262
+ log.debug("Initiating transfer to chained datastore %s from %s", self.name, source_datastore.name)
1263
+ for datastore in self.datastores:
1264
+ # Rejections from this datastore might be acceptances in the next.
1265
+ # We add them all up but then recalculate at the end.
1266
+ if not available_refs:
1267
+ break
1268
+ log.verbose("Transferring %d datasets to %s from chain", len(available_refs), datastore.name)
1319
1269
 
1320
- # Remove the accepted datasets from those remaining.
1321
- remaining_refs = remaining_refs - accepted
1270
+ try:
1271
+ current_accepted, current_rejected = datastore.transfer_from(
1272
+ source_datastore,
1273
+ available_refs,
1274
+ transfer=transfer,
1275
+ artifact_existence=artifact_existence,
1276
+ dry_run=dry_run,
1277
+ )
1278
+ except (TypeError, NotImplementedError):
1279
+ # The datastores were incompatible.
1280
+ continue
1281
+ else:
1282
+ nsuccess += 1
1322
1283
 
1323
- # Keep track of everything we have accepted.
1324
- all_accepted.update(accepted)
1284
+ # Do not send accepted refs to later datastores.
1285
+ available_refs -= current_accepted
1325
1286
 
1326
- if missing_from_source:
1327
- for ref in missing_from_source:
1328
- log.warning("Asked to transfer dataset %s but no file artifacts exist for it", ref)
1287
+ accepted.update(current_accepted)
1288
+ rejected.update(current_rejected)
1329
1289
 
1330
1290
  if nsuccess == 0:
1331
1291
  raise TypeError(f"None of the child datastores could accept transfers from {source_datastore!r}")
1332
1292
 
1333
- return all_accepted, remaining_refs
1293
+ # It's not rejected if some other datastore accepted it.
1294
+ rejected -= accepted
1295
+ log.verbose(
1296
+ "Finished transfer_from %s to %s with %d accepted, %d rejected from %d requested.",
1297
+ source_datastore.name,
1298
+ self.name,
1299
+ len(accepted),
1300
+ len(rejected),
1301
+ len(refs),
1302
+ )
1303
+
1304
+ return accepted, rejected
1334
1305
 
1335
1306
  def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
1336
1307
  # Docstring inherited from the base class.