lsst-daf-butler 29.2025.2100__tar.gz → 29.2025.2400__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. {lsst_daf_butler-29.2025.2100/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2400}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_limited_butler.py +8 -1
  3. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/commands.py +16 -1
  4. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/utils.py +1 -1
  5. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/__init__.py +1 -0
  6. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/_datastore.py +16 -14
  7. lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/datastore/_transfer.py +102 -0
  8. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/stored_file_info.py +34 -0
  9. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/chainedDatastore.py +50 -6
  10. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/fileDatastore.py +51 -180
  11. lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/datastores/file_datastore/transfer.py +104 -0
  12. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_coordinate.py +3 -0
  13. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_butler/_direct_butler.py +83 -58
  14. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_driver.py +20 -2
  15. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +74 -17
  16. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/parquet.py +7 -3
  17. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_database.py +1 -2
  18. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_config.py +5 -0
  19. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_records.py +4 -2
  20. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_remote_butler.py +5 -0
  21. lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +82 -0
  22. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +29 -0
  23. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server_models.py +16 -1
  24. lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/script/queryCollections.py +378 -0
  25. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/butler_queries.py +68 -0
  26. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/hybrid_butler.py +5 -1
  27. lsst_daf_butler-29.2025.2400/python/lsst/daf/butler/version.py +2 -0
  28. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  29. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/SOURCES.txt +3 -0
  30. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_butler.py +152 -140
  31. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryCollections.py +124 -1
  32. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_datastore.py +7 -1
  33. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_simpleButler.py +5 -0
  34. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/script/queryCollections.py +0 -222
  35. lsst_daf_butler-29.2025.2100/python/lsst/daf/butler/version.py +0 -2
  36. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/COPYRIGHT +0 -0
  37. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/LICENSE +0 -0
  38. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/MANIFEST.in +0 -0
  39. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/README.md +0 -0
  40. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/bsd_license.txt +0 -0
  41. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  42. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  43. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/configuring.rst +0 -0
  44. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/datastores.rst +0 -0
  45. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/dimensions.rst +0 -0
  46. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/formatters.rst +0 -0
  47. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/index.rst +0 -0
  48. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/organizing.rst +0 -0
  49. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/queries.rst +0 -0
  50. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  51. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  52. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/gpl-v3.0.txt +0 -0
  53. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/pyproject.toml +0 -0
  54. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/__init__.py +0 -0
  55. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/__init__.py +0 -0
  56. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/__init__.py +0 -0
  57. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler.py +0 -0
  58. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_collections.py +0 -0
  59. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_config.py +0 -0
  60. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  61. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  62. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  63. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_collection_type.py +0 -0
  64. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_column_categorization.py +0 -0
  65. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_column_tags.py +0 -0
  66. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_column_type_info.py +0 -0
  67. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_config.py +0 -0
  68. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_config_support.py +0 -0
  69. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_association.py +0 -0
  70. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  71. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  72. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  73. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_dataset_type.py +0 -0
  74. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  75. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_exceptions.py +0 -0
  76. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  77. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_file_dataset.py +0 -0
  78. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  79. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_formatter.py +0 -0
  80. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  81. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_location.py +0 -0
  82. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_named.py +0 -0
  83. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_quantum.py +0 -0
  84. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  85. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  86. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_registry_shim.py +0 -0
  87. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_storage_class.py +0 -0
  88. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  89. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_timespan.py +0 -0
  90. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_topology.py +0 -0
  91. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  92. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  93. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  94. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  95. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/arrow_utils.py +0 -0
  96. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/__init__.py +0 -0
  97. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/butler.py +0 -0
  98. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  99. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  100. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  101. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  102. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  103. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  104. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  105. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  106. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/cli/progress.py +0 -0
  107. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/column_spec.py +0 -0
  108. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  109. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  110. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  111. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  112. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  113. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  114. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  115. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  116. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  117. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  118. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  119. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  120. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  121. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  122. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  123. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  124. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  125. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  126. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/composites.py +0 -0
  127. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  128. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  129. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  130. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  131. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  132. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  133. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  134. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  135. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  136. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  137. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/ddl.py +0 -0
  138. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  139. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  140. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  141. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  142. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  143. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  144. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  145. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  146. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  147. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  148. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  149. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  150. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  151. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  152. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  153. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  154. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  155. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  156. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  157. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  158. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  159. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  160. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  161. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  162. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  163. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  164. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  165. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  166. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/file.py +0 -0
  167. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/json.py +0 -0
  168. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/logs.py +0 -0
  169. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  170. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/packages.py +0 -0
  171. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  172. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  173. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  174. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/json.py +0 -0
  175. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/logging.py +0 -0
  176. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/mapping_factory.py +0 -0
  177. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/name_shrinker.py +0 -0
  178. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  179. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/persistence_context.py +0 -0
  180. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/progress.py +0 -0
  181. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/py.typed +0 -0
  182. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  183. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/__init__.py +0 -0
  184. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_base.py +0 -0
  185. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  186. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  187. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  188. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  189. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  190. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  191. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/_query.py +0 -0
  192. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  193. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/driver.py +0 -0
  194. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  195. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  196. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  197. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  198. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  199. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  200. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  201. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  202. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  203. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  204. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  205. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  206. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/queries/visitors.py +0 -0
  207. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/__init__.py +0 -0
  208. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  209. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  210. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  211. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  212. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_config.py +0 -0
  213. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  214. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  215. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_registry.py +0 -0
  216. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  217. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/attributes.py +0 -0
  218. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  219. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  220. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  221. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  222. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  223. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  224. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  225. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  226. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  228. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  229. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  230. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  231. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  232. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  233. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  234. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  235. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  236. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  237. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  238. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  239. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  240. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  241. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  242. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  243. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  244. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  245. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  246. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  247. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/managers.py +0 -0
  248. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  249. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  250. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  251. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  252. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  253. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  254. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  255. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/opaque.py +0 -0
  256. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  257. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  258. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  259. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  260. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  261. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  262. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  263. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  264. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  265. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  266. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  267. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  268. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  269. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  270. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  271. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  272. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  273. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  274. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  275. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  276. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  277. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  278. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  279. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  280. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  281. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  282. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  283. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  284. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  285. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  286. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/versions.py +0 -0
  287. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  288. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  289. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  290. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  291. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  292. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  293. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  294. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  295. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  296. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  297. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  298. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  299. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  300. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  301. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  302. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  303. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  304. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  305. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  306. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  307. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  308. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  309. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  310. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  311. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  312. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  313. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  314. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  315. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  316. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  317. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  318. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/repo_relocation.py +0 -0
  319. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/__init__.py +0 -0
  320. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/_associate.py +0 -0
  321. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  322. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  323. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  324. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  325. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/configDump.py +0 -0
  326. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/configValidate.py +0 -0
  327. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/createRepo.py +0 -0
  328. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  329. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  330. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  331. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  332. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  333. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  334. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  335. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  336. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  337. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  338. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  339. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  340. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  341. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/__init__.py +0 -0
  342. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  343. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  344. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  345. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  346. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  347. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  348. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  349. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  350. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  351. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  352. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  353. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/server.py +0 -0
  354. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  355. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  356. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/tests/utils.py +0 -0
  357. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/time_utils.py +0 -0
  358. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  359. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  360. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/_context.py +0 -0
  361. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  362. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  363. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst/daf/butler/utils.py +0 -0
  364. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  365. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  366. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  367. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  368. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  369. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/setup.cfg +0 -0
  370. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_astropyTableFormatter.py +0 -0
  371. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_authentication.py +0 -0
  372. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_butler_factory.py +0 -0
  373. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdAssociate.py +0 -0
  374. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdConfigDump.py +0 -0
  375. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdConfigValidate.py +0 -0
  376. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdCreate.py +0 -0
  377. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdImport.py +0 -0
  378. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdIngestFiles.py +0 -0
  379. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdPruneDatasets.py +0 -0
  380. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDataIds.py +0 -0
  381. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  382. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDatasets.py +0 -0
  383. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  384. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdRemoveCollections.py +0 -0
  385. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdRemoveRuns.py +0 -0
  386. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  387. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliLog.py +0 -0
  388. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliPluginLoader.py +0 -0
  389. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtilSplitCommas.py +0 -0
  390. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtilSplitKv.py +0 -0
  391. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtilToUpper.py +0 -0
  392. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_cliUtils.py +0 -0
  393. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_column_spec.py +0 -0
  394. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_composites.py +0 -0
  395. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_config.py +0 -0
  396. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_connectionString.py +0 -0
  397. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_constraints.py +0 -0
  398. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_datasets.py +0 -0
  399. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_ddl.py +0 -0
  400. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_dimension_record_containers.py +0 -0
  401. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_dimensions.py +0 -0
  402. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_exprParserLex.py +0 -0
  403. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_exprParserYacc.py +0 -0
  404. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_expressions.py +0 -0
  405. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_formatter.py +0 -0
  406. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_gafaelfawr.py +0 -0
  407. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_location.py +0 -0
  408. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_logFormatter.py +0 -0
  409. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_logging.py +0 -0
  410. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_matplotlibFormatter.py +0 -0
  411. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_nonempty_mapping.py +0 -0
  412. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_normalFormExpression.py +0 -0
  413. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_obscore.py +0 -0
  414. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_packages.py +0 -0
  415. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_parquet.py +0 -0
  416. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_postgresql.py +0 -0
  417. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_progress.py +0 -0
  418. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_pydantic_utils.py +0 -0
  419. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_quantum.py +0 -0
  420. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_quantumBackedButler.py +0 -0
  421. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_direct_postgresql.py +0 -0
  422. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_direct_sqlite.py +0 -0
  423. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_interface.py +0 -0
  424. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_relations.py +0 -0
  425. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_remote.py +0 -0
  426. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_query_utilities.py +0 -0
  427. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_remote_butler.py +0 -0
  428. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_server.py +0 -0
  429. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_sqlite.py +0 -0
  430. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_storageClass.py +0 -0
  431. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_templates.py +0 -0
  432. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_testRepo.py +0 -0
  433. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_thread_utils.py +0 -0
  434. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_time_utils.py +0 -0
  435. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_timespan.py +0 -0
  436. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/tests/test_utils.py +0 -0
  437. {lsst_daf_butler-29.2025.2100 → lsst_daf_butler-29.2025.2400}/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.2100
3
+ Version: 29.2025.2400
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
@@ -42,7 +42,7 @@ from ._dataset_provenance import DatasetProvenance
42
42
  from ._dataset_ref import DatasetRef
43
43
  from ._deferredDatasetHandle import DeferredDatasetHandle
44
44
  from ._storage_class import StorageClass, StorageClassFactory
45
- from .datastore import DatasetRefURIs, Datastore
45
+ from .datastore import DatasetRefURIs, Datastore, FileTransferSource
46
46
  from .dimensions import DimensionUniverse
47
47
 
48
48
  log = logging.getLogger(__name__)
@@ -450,6 +450,13 @@ class LimitedButler(ABC):
450
450
  """
451
451
  raise NotImplementedError()
452
452
 
453
+ @property
454
+ def _file_transfer_source(self) -> FileTransferSource:
455
+ """Object that manages the transfer of files between Butler
456
+ repositories.
457
+ """
458
+ return self._datastore
459
+
453
460
  _datastore: Datastore
454
461
  """The object that manages actual dataset storage (`Datastore`)."""
455
462
 
@@ -424,6 +424,21 @@ def prune_datasets(**kwargs: Any) -> None:
424
424
  case_sensitive=False,
425
425
  ),
426
426
  )
427
+ @click.option(
428
+ "-t",
429
+ "--show-dataset-types",
430
+ is_flag=True,
431
+ help="Also show the dataset types registered within each collection.",
432
+ )
433
+ @click.option(
434
+ "--exclude-dataset-types",
435
+ type=click.STRING,
436
+ multiple=True,
437
+ default=["*_config,*_log,*_metadata,packages"],
438
+ callback=split_commas,
439
+ show_default=True,
440
+ help="Dataset types (comma-separated) to exclude. Only valid with --show-dataset-types.",
441
+ )
427
442
  @options_file_option()
428
443
  def query_collections(*args: Any, **kwargs: Any) -> None:
429
444
  """Get the collections whose names match an expression."""
@@ -454,7 +469,7 @@ def query_dataset_types(*args: Any, **kwargs: Any) -> None:
454
469
  """Get the dataset types in a repository."""
455
470
  table = script.queryDatasetTypes(*args, **kwargs)
456
471
  if table:
457
- table.pprint_all()
472
+ table.pprint_all(align="<")
458
473
  else:
459
474
  print("No results. Try --help for more information.")
460
475
 
@@ -1057,7 +1057,7 @@ class MWCommand(click.Command):
1057
1057
  return ret
1058
1058
 
1059
1059
  @epilog.setter
1060
- def epilog(self, val: str) -> None:
1060
+ def epilog(self, val: str | None) -> None:
1061
1061
  self._epilog = val
1062
1062
 
1063
1063
 
@@ -26,3 +26,4 @@
26
26
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
27
 
28
28
  from ._datastore import *
29
+ from ._transfer import *
@@ -54,6 +54,7 @@ from .._config import Config, ConfigSubset
54
54
  from .._exceptions import DatasetTypeNotSupportedError, ValidationError
55
55
  from .._file_dataset import FileDataset
56
56
  from .._storage_class import StorageClassFactory
57
+ from ._transfer import FileTransferMap, FileTransferSource
57
58
  from .constraints import Constraints
58
59
 
59
60
  if TYPE_CHECKING:
@@ -62,7 +63,7 @@ if TYPE_CHECKING:
62
63
  from .. import ddl
63
64
  from .._config_support import LookupKey
64
65
  from .._dataset_provenance import DatasetProvenance
65
- from .._dataset_ref import DatasetRef
66
+ from .._dataset_ref import DatasetId, DatasetRef
66
67
  from .._dataset_type import DatasetType
67
68
  from .._storage_class import StorageClass
68
69
  from ..datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo
@@ -283,7 +284,7 @@ class DatasetRefURIs(abc.Sequence):
283
284
  return f"DatasetRefURIs({repr(self.primaryURI)}, {repr(self.componentURIs)})"
284
285
 
285
286
 
286
- class Datastore(metaclass=ABCMeta):
287
+ class Datastore(FileTransferSource, metaclass=ABCMeta):
287
288
  """Datastore interface.
288
289
 
289
290
  Parameters
@@ -868,7 +869,7 @@ class Datastore(metaclass=ABCMeta):
868
869
 
869
870
  def transfer_from(
870
871
  self,
871
- source_datastore: Datastore,
872
+ source_records: FileTransferMap,
872
873
  refs: Collection[DatasetRef],
873
874
  transfer: str = "auto",
874
875
  artifact_existence: dict[ResourcePath, bool] | None = None,
@@ -878,9 +879,8 @@ class Datastore(metaclass=ABCMeta):
878
879
 
879
880
  Parameters
880
881
  ----------
881
- source_datastore : `Datastore`
882
- The datastore from which to transfer artifacts. That datastore
883
- must be compatible with this datastore receiving the artifacts.
882
+ source_records : `FileTransferMap`
883
+ The artifacts to be transferred into this datastore.
884
884
  refs : `~collections.abc.Collection` of `DatasetRef`
885
885
  The datasets to transfer from the source datastore.
886
886
  transfer : `str`, optional
@@ -915,13 +915,7 @@ class Datastore(metaclass=ABCMeta):
915
915
  TypeError
916
916
  Raised if the two datastores are not compatible.
917
917
  """
918
- if type(self) is not type(source_datastore):
919
- raise TypeError(
920
- f"Datastore mismatch between this datastore ({type(self)}) and the "
921
- f"source datastore ({type(source_datastore)})."
922
- )
923
-
924
- raise NotImplementedError(f"Datastore {type(self)} must implement a transfer_from method.")
918
+ raise NotImplementedError(f"Datastore {type(self)} does not implement a transfer_from method.")
925
919
 
926
920
  def getManyURIs(
927
921
  self,
@@ -1420,6 +1414,14 @@ class Datastore(metaclass=ABCMeta):
1420
1414
  """
1421
1415
  raise NotImplementedError()
1422
1416
 
1417
+ def get_file_info_for_transfer(self, dataset_ids: Iterable[DatasetId]) -> FileTransferMap:
1418
+ raise NotImplementedError(f"Transferring files is not supported by datastore {self}")
1419
+
1420
+ def locate_missing_files_for_transfer(
1421
+ self, refs: Iterable[DatasetRef], artifact_existence: dict[ResourcePath, bool]
1422
+ ) -> FileTransferMap:
1423
+ return {}
1424
+
1423
1425
 
1424
1426
  class NullDatastore(Datastore):
1425
1427
  """A datastore that implements the `Datastore` API but always fails when
@@ -1494,7 +1496,7 @@ class NullDatastore(Datastore):
1494
1496
 
1495
1497
  def transfer_from(
1496
1498
  self,
1497
- source_datastore: Datastore,
1499
+ source_records: FileTransferMap,
1498
1500
  refs: Iterable[DatasetRef],
1499
1501
  transfer: str = "auto",
1500
1502
  artifact_existence: dict[ResourcePath, bool] | None = None,
@@ -0,0 +1,102 @@
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
+ from collections.abc import Iterable
31
+ from typing import NamedTuple, Protocol, TypeAlias
32
+
33
+ from lsst.resources import ResourcePath
34
+
35
+ from .._dataset_ref import DatasetId, DatasetRef
36
+ from .stored_file_info import Location, StoredFileInfo
37
+
38
+ __all__ = ("FileTransferMap", "FileTransferRecord", "FileTransferSource")
39
+
40
+
41
+ class FileTransferSource(Protocol):
42
+ """Protocol for an object that can return information about files that need
43
+ to be transferred to copy datasets from one Butler repository to another.
44
+ """
45
+
46
+ name: str
47
+ """A human-readable, descriptive name for this file transfer source."""
48
+
49
+ def get_file_info_for_transfer(self, dataset_ids: Iterable[DatasetId]) -> FileTransferMap:
50
+ """Given a list of dataset IDs, return all file information associated
51
+ with the datasets that can be determined without searching the
52
+ filesystem.
53
+
54
+ Parameters
55
+ ----------
56
+ dataset_ids : `~collections.abc.Iterable` [ `DatasetId` ]
57
+ List of dataset IDs for which we will retrieve file information.
58
+
59
+ Return
60
+ ------
61
+ transfer_map : `FileTransferMap`
62
+ Dictionary from `DatasetId` to a list of files found for that
63
+ dataset. If information about any given dataset IDs could not
64
+ be found, the missing IDs are omitted from the dictionary.
65
+ """
66
+
67
+ def locate_missing_files_for_transfer(
68
+ self, refs: Iterable[DatasetRef], artifact_existence: dict[ResourcePath, bool]
69
+ ) -> FileTransferMap:
70
+ """Given a list of `DatasetRef`, search the filesystem to locate
71
+ artifacts associated with the dataset.
72
+
73
+ Parameters
74
+ ----------
75
+ refs : iterable of `DatasetRef`
76
+ The datasets to be checked.
77
+ artifact_existence : `dict` [`lsst.resources.ResourcePath`, `bool`]
78
+ Optional mapping of datastore artifact to existence. Updated by
79
+ this method with details of all artifacts tested.
80
+
81
+ Return
82
+ ------
83
+ transfer_map : `FileTransferMap`
84
+ Dictionary from `DatasetId` to a list of files found for that
85
+ dataset. If information about any given dataset IDs could not
86
+ be found, the missing IDs are omitted from the dictionary.
87
+ """
88
+
89
+
90
+ class FileTransferRecord(NamedTuple):
91
+ """Information needed to transfer a file from one Butler repository to
92
+ another.
93
+ """
94
+
95
+ location: Location
96
+ file_info: StoredFileInfo
97
+
98
+
99
+ FileTransferMap: TypeAlias = dict[DatasetId, list[FileTransferRecord]]
100
+ """A dictionary from `DatasetId` to a list of `FileTransferRecord`, containing
101
+ the datastore information about a set of files to be transferred.
102
+ """
@@ -395,3 +395,37 @@ class SerializedStoredFileInfo(pydantic.BaseModel):
395
395
 
396
396
  file_size: int
397
397
  """Size of the serialized dataset in bytes."""
398
+
399
+
400
+ def make_datastore_path_relative(path: str) -> str:
401
+ """Normalize a path from a `StoredFileInfo` object so
402
+ that it is always relative.
403
+
404
+ Parameters
405
+ ----------
406
+ path : `str`
407
+ The file path from a `StoredFileInfo`.
408
+
409
+ Return
410
+ ------
411
+ normalized_path : `str`
412
+ The original path, if it was relative. Otherwise, a version of it that
413
+ was converted to a relative path, stripping URI scheme and netloc from
414
+ it.
415
+ """
416
+ # Force the datastore file path sent to the client to be relative, since
417
+ # absolute URLs in the server will generally not be reachable by the
418
+ # client. If an absolute URL is sent, it (or a portion of it) can end up
419
+ # baked into the FileDatastore that is the target of the transfer in some
420
+ # cases.
421
+ rpath = ResourcePath(path, forceAbsolute=False, forceDirectory=False)
422
+ if rpath.isabs():
423
+ relative = rpath.relativeToPathRoot
424
+ if rpath.fragment:
425
+ # Preserve the fragment, since this used to indicate special
426
+ # processing like zip extraction.
427
+ return f"{relative}#{rpath.fragment}"
428
+ else:
429
+ return relative
430
+ else:
431
+ return path
@@ -50,8 +50,12 @@ from lsst.daf.butler.datastore.record_data import DatastoreRecordData
50
50
  from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo, ZipIndex
51
51
  from lsst.resources import ResourcePath
52
52
  from lsst.utils import doImportType
53
+ from lsst.utils.introspection import get_full_type_name
53
54
  from lsst.utils.logging import getLogger
54
55
 
56
+ from .._dataset_ref import DatasetId
57
+ from ..datastore import FileTransferMap
58
+
55
59
  if TYPE_CHECKING:
56
60
  from lsst.daf.butler import Config, DatasetProvenance, DatasetType, LookupKey, StorageClass
57
61
  from lsst.daf.butler.registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
@@ -1234,9 +1238,50 @@ class ChainedDatastore(Datastore):
1234
1238
  raise FileNotFoundError(f"Failed to export dataset {refs[i]}.")
1235
1239
  yield dataset
1236
1240
 
1241
+ def get_file_info_for_transfer(self, dataset_ids: Iterable[DatasetId]) -> FileTransferMap:
1242
+ unassigned_ids = set(dataset_ids)
1243
+ output: FileTransferMap = {}
1244
+ found_acceptable_datastore = False
1245
+ for datastore in self.datastores:
1246
+ try:
1247
+ found = datastore.get_file_info_for_transfer(unassigned_ids)
1248
+ found_acceptable_datastore = True
1249
+ output.update(found)
1250
+ unassigned_ids -= found.keys()
1251
+ except NotImplementedError:
1252
+ pass
1253
+
1254
+ if not found_acceptable_datastore:
1255
+ types = {get_full_type_name(d) for d in self.datastores}
1256
+ raise TypeError(
1257
+ "ChainedDatastore had no datastores able to provide file transfer information."
1258
+ f" Had {','.join(types)}"
1259
+ )
1260
+
1261
+ return output
1262
+
1263
+ def locate_missing_files_for_transfer(
1264
+ self, refs: Iterable[DatasetRef], artifact_existence: dict[ResourcePath, bool]
1265
+ ) -> FileTransferMap:
1266
+ missing_refs = {ref.id: ref for ref in refs}
1267
+ output: FileTransferMap = {}
1268
+ for datastore in self.datastores:
1269
+ # Have to check each datastore in turn. If we do not do
1270
+ # this warnings will be issued further down for datasets
1271
+ # that are in one and not the other. The existence cache
1272
+ # will prevent repeat checks.
1273
+
1274
+ found = datastore.locate_missing_files_for_transfer(missing_refs.values(), artifact_existence)
1275
+ output.update(found)
1276
+ for id in found.keys():
1277
+ missing_refs.pop(id)
1278
+ log.debug("Adding %d missing refs to list for transfer from %s", len(found), datastore.name)
1279
+
1280
+ return output
1281
+
1237
1282
  def transfer_from(
1238
1283
  self,
1239
- source_datastore: Datastore,
1284
+ source_records: FileTransferMap,
1240
1285
  refs: Collection[DatasetRef],
1241
1286
  transfer: str = "auto",
1242
1287
  artifact_existence: dict[ResourcePath, bool] | None = None,
@@ -1259,7 +1304,7 @@ class ChainedDatastore(Datastore):
1259
1304
  rejected: set[DatasetRef] = set()
1260
1305
  nsuccess = 0
1261
1306
 
1262
- log.debug("Initiating transfer to chained datastore %s from %s", self.name, source_datastore.name)
1307
+ log.debug("Initiating transfer to chained datastore %s", self.name)
1263
1308
  for datastore in self.datastores:
1264
1309
  # Rejections from this datastore might be acceptances in the next.
1265
1310
  # We add them all up but then recalculate at the end.
@@ -1269,7 +1314,7 @@ class ChainedDatastore(Datastore):
1269
1314
 
1270
1315
  try:
1271
1316
  current_accepted, current_rejected = datastore.transfer_from(
1272
- source_datastore,
1317
+ source_records,
1273
1318
  available_refs,
1274
1319
  transfer=transfer,
1275
1320
  artifact_existence=artifact_existence,
@@ -1288,13 +1333,12 @@ class ChainedDatastore(Datastore):
1288
1333
  rejected.update(current_rejected)
1289
1334
 
1290
1335
  if nsuccess == 0:
1291
- raise TypeError(f"None of the child datastores could accept transfers from {source_datastore!r}")
1336
+ raise TypeError("None of the child datastores could accept file transfers")
1292
1337
 
1293
1338
  # It's not rejected if some other datastore accepted it.
1294
1339
  rejected -= accepted
1295
1340
  log.verbose(
1296
- "Finished transfer_from %s to %s with %d accepted, %d rejected from %d requested.",
1297
- source_datastore.name,
1341
+ "Finished transfer_from to %s with %d accepted, %d rejected from %d requested.",
1298
1342
  self.name,
1299
1343
  len(accepted),
1300
1344
  len(rejected),