lsst-daf-butler 29.2025.2900__tar.gz → 29.2025.3100__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 (450) hide show
  1. {lsst_daf_butler-29.2025.2900/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.3100}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler.py +2 -2
  3. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_labeled_butler_factory.py +2 -2
  4. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/_datastore.py +6 -8
  5. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/chainedDatastore.py +2 -3
  6. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/fileDatastore.py +2 -34
  7. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/__init__.py +0 -1
  8. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_config.py +12 -4
  9. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_factory.py +51 -27
  10. lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/_get.py +98 -0
  11. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_http_connection.py +11 -17
  12. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_remote_butler.py +12 -7
  13. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +3 -10
  14. lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication/cadc.py +54 -0
  15. lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication/interface.py +46 -0
  16. lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/remote_butler/_authentication.py → lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication/rubin.py +36 -20
  17. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_config.py +5 -0
  18. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +4 -2
  19. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +29 -12
  20. lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/server/handlers/_file_info.py +72 -0
  21. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server_models.py +38 -3
  22. lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  23. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/server.py +13 -6
  24. lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/version.py +2 -0
  25. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  26. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/SOURCES.txt +6 -2
  27. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_authentication.py +18 -9
  28. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_butler.py +1 -1
  29. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_server.py +52 -6
  30. lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -90
  31. lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/version.py +0 -2
  32. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/COPYRIGHT +0 -0
  33. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/LICENSE +0 -0
  34. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/MANIFEST.in +0 -0
  35. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/README.md +0 -0
  36. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/bsd_license.txt +0 -0
  37. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  38. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  39. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/configuring.rst +0 -0
  40. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/datastores.rst +0 -0
  41. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/dimensions.rst +0 -0
  42. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/formatters.rst +0 -0
  43. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/index.rst +0 -0
  44. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/organizing.rst +0 -0
  45. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/queries.rst +0 -0
  46. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  47. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  48. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/gpl-v3.0.txt +0 -0
  49. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/pyproject.toml +0 -0
  50. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/__init__.py +0 -0
  51. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/__init__.py +0 -0
  52. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/__init__.py +0 -0
  53. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_collections.py +0 -0
  54. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_config.py +0 -0
  55. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  56. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  57. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  58. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_collection_type.py +0 -0
  59. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_column_categorization.py +0 -0
  60. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_column_tags.py +0 -0
  61. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_column_type_info.py +0 -0
  62. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_config.py +0 -0
  63. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_config_support.py +0 -0
  64. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_association.py +0 -0
  65. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  66. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  67. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  68. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_dataset_type.py +0 -0
  69. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  70. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_exceptions.py +0 -0
  71. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  72. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_file_dataset.py +0 -0
  73. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  74. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_formatter.py +0 -0
  75. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_limited_butler.py +0 -0
  76. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_location.py +0 -0
  77. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_named.py +0 -0
  78. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_quantum.py +0 -0
  79. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  80. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  81. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_registry_shim.py +0 -0
  82. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_storage_class.py +0 -0
  83. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  84. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_timespan.py +0 -0
  85. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_topology.py +0 -0
  86. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  87. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  88. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  89. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  90. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/arrow_utils.py +0 -0
  91. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/__init__.py +0 -0
  92. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/butler.py +0 -0
  93. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  94. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  95. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  96. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  97. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  98. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  99. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  100. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  101. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  102. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/progress.py +0 -0
  103. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/cli/utils.py +0 -0
  104. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/column_spec.py +0 -0
  105. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  106. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  107. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  108. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  109. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  110. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  111. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  112. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  113. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  114. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  115. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  116. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  117. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  118. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  119. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  120. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  121. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  122. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  123. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/_transfer.py +0 -0
  124. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  125. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/composites.py +0 -0
  126. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  127. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  128. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  129. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  130. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  131. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  132. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  133. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  134. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  135. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  136. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  137. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/ddl.py +0 -0
  138. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  139. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  140. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  141. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  142. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  143. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  144. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  145. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  146. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  147. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_group.py +0 -0
  148. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  149. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  150. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  151. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  152. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  153. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  154. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  155. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  156. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  157. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  158. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  159. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  160. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  161. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  162. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  163. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  164. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  165. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  166. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  167. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  168. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  169. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  170. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/file.py +0 -0
  171. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/json.py +0 -0
  172. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/logs.py +0 -0
  173. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  174. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/packages.py +0 -0
  175. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  176. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  177. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  178. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  179. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/json.py +0 -0
  180. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/logging.py +0 -0
  181. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/mapping_factory.py +0 -0
  182. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/name_shrinker.py +0 -0
  183. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  184. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/persistence_context.py +0 -0
  185. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/progress.py +0 -0
  186. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/py.typed +0 -0
  187. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  188. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/__init__.py +0 -0
  189. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_base.py +0 -0
  190. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  191. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  192. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  193. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_expression_strings.py +0 -0
  194. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  195. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  196. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/_query.py +0 -0
  197. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  198. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/driver.py +0 -0
  199. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  200. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  201. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  202. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  203. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  204. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  205. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  206. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  207. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  208. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  209. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  210. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  211. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/queries/visitors.py +0 -0
  212. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/__init__.py +0 -0
  213. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  214. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  215. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  216. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  217. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_config.py +0 -0
  218. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  219. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  220. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_registry.py +0 -0
  221. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  222. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/attributes.py +0 -0
  223. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  224. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  225. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  226. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  228. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  229. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  230. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  231. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  232. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  233. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  234. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  235. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  236. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  237. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  238. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  239. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  240. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  241. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  242. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  243. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  244. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  245. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  246. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -0
  247. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  248. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  249. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  250. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  251. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  252. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  253. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/managers.py +0 -0
  254. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  255. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  256. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  257. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  258. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  259. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  260. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  261. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  262. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  263. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/opaque.py +0 -0
  264. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  265. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  266. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  267. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  268. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  269. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  270. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  271. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  272. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  273. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  274. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  275. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  276. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +0 -0
  277. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  278. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/check.py +0 -0
  279. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +0 -0
  280. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  281. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +0 -0
  282. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  283. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  284. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  285. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  286. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  287. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  288. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +0 -0
  289. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  290. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  291. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  292. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  293. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  294. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/versions.py +0 -0
  295. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  296. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  297. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  298. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  299. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  300. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  301. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  302. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  303. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  304. {lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/remote_butler/registry → lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/authentication}/__init__.py +0 -0
  305. {lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/tests/registry_data → lsst_daf_butler-29.2025.3100/python/lsst/daf/butler/remote_butler/registry}/__init__.py +0 -0
  306. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  307. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  308. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  309. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  310. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  311. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  312. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  313. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  314. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  315. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  316. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  317. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  318. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  319. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  320. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  321. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/repo_relocation.py +0 -0
  322. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/__init__.py +0 -0
  323. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/_associate.py +0 -0
  324. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  325. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  326. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  327. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  328. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/configDump.py +0 -0
  329. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/configValidate.py +0 -0
  330. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/createRepo.py +0 -0
  331. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  332. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  333. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  334. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  335. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  336. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  337. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  338. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  339. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  340. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  341. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  342. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  343. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  344. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  345. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/__init__.py +0 -0
  346. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  347. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  348. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  349. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  350. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/butler_queries.py +0 -0
  351. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  352. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  353. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  354. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  355. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  356. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  357. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  358. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  359. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  360. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  361. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  362. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  363. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  364. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/spatial.py +0 -0
  365. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +0 -0
  366. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  367. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  368. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/tests/utils.py +0 -0
  369. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/time_utils.py +0 -0
  370. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  371. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  372. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/_context.py +0 -0
  373. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  374. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  375. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst/daf/butler/utils.py +0 -0
  376. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  377. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  378. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  379. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  380. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  381. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/setup.cfg +0 -0
  382. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_astropyTableFormatter.py +0 -0
  383. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_butler_factory.py +0 -0
  384. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdAssociate.py +0 -0
  385. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdConfigDump.py +0 -0
  386. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdConfigValidate.py +0 -0
  387. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdCreate.py +0 -0
  388. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdImport.py +0 -0
  389. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdIngestFiles.py +0 -0
  390. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdPruneDatasets.py +0 -0
  391. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryCollections.py +0 -0
  392. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDataIds.py +0 -0
  393. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  394. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDatasets.py +0 -0
  395. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  396. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdRemoveCollections.py +0 -0
  397. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdRemoveRuns.py +0 -0
  398. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  399. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliLog.py +0 -0
  400. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliPluginLoader.py +0 -0
  401. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtilSplitCommas.py +0 -0
  402. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtilSplitKv.py +0 -0
  403. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtilToUpper.py +0 -0
  404. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_cliUtils.py +0 -0
  405. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_column_spec.py +0 -0
  406. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_composites.py +0 -0
  407. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_config.py +0 -0
  408. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_connectionString.py +0 -0
  409. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_constraints.py +0 -0
  410. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_datasets.py +0 -0
  411. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_datastore.py +0 -0
  412. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_ddl.py +0 -0
  413. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_dimension_record_containers.py +0 -0
  414. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_dimensions.py +0 -0
  415. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_exprParserLex.py +0 -0
  416. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_exprParserYacc.py +0 -0
  417. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_expressions.py +0 -0
  418. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_formatter.py +0 -0
  419. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_gafaelfawr.py +0 -0
  420. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_location.py +0 -0
  421. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_logFormatter.py +0 -0
  422. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_logging.py +0 -0
  423. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_matplotlibFormatter.py +0 -0
  424. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_nonempty_mapping.py +0 -0
  425. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_normalFormExpression.py +0 -0
  426. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_obscore.py +0 -0
  427. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_packages.py +0 -0
  428. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_parquet.py +0 -0
  429. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_postgresql.py +0 -0
  430. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_progress.py +0 -0
  431. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_pydantic_utils.py +0 -0
  432. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_quantum.py +0 -0
  433. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_quantumBackedButler.py +0 -0
  434. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_direct_postgresql.py +0 -0
  435. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_direct_sqlite.py +0 -0
  436. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_interface.py +0 -0
  437. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_relations.py +0 -0
  438. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_remote.py +0 -0
  439. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_query_utilities.py +0 -0
  440. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_remote_butler.py +0 -0
  441. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_simpleButler.py +0 -0
  442. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_sqlite.py +0 -0
  443. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_storageClass.py +0 -0
  444. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_templates.py +0 -0
  445. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_testRepo.py +0 -0
  446. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_thread_utils.py +0 -0
  447. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_time_utils.py +0 -0
  448. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_timespan.py +0 -0
  449. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/tests/test_utils.py +0 -0
  450. {lsst_daf_butler-29.2025.2900 → lsst_daf_butler-29.2025.3100}/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.2900
3
+ Version: 29.2025.3100
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
@@ -347,13 +347,13 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
347
347
  without_datastore=without_datastore,
348
348
  )
349
349
  case ButlerType.REMOTE:
350
- from .remote_butler import RemoteButlerFactory
350
+ from .remote_butler._factory import RemoteButlerFactory
351
351
 
352
352
  # Assume this is being created by a client who would like
353
353
  # default caching of remote datasets.
354
354
  factory = RemoteButlerFactory.create_factory_from_config(butler_config)
355
355
  return factory.create_butler_with_credentials_from_environment(
356
- butler_options=options, use_disabled_datastore_cache=False
356
+ butler_options=options, enable_datastore_cache=True
357
357
  )
358
358
  case _:
359
359
  raise TypeError(f"Unknown Butler type '{butler_type}'")
@@ -198,9 +198,9 @@ def _create_direct_butler_factory(config: ButlerConfig, preload_unsafe_caches: b
198
198
 
199
199
 
200
200
  def _create_remote_butler_factory(config: ButlerConfig) -> _FactoryFunction:
201
- import lsst.daf.butler.remote_butler
201
+ import lsst.daf.butler.remote_butler._factory
202
202
 
203
- factory = lsst.daf.butler.remote_butler.RemoteButlerFactory.create_factory_from_config(config)
203
+ factory = lsst.daf.butler.remote_butler._factory.RemoteButlerFactory.create_factory_from_config(config)
204
204
 
205
205
  def create_butler(access_token: str | None) -> Butler:
206
206
  if access_token is None:
@@ -66,8 +66,8 @@ if TYPE_CHECKING:
66
66
  from .._dataset_ref import DatasetId, DatasetRef
67
67
  from .._dataset_type import DatasetType
68
68
  from .._storage_class import StorageClass
69
+ from ..datastores.file_datastore.get import DatasetLocationInformation
69
70
  from ..datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo
70
- from ..datastores.fileDatastoreClient import FileDatastoreGetPayload
71
71
  from ..registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
72
72
  from .record_data import DatastoreRecordData
73
73
  from .stored_file_info import StoredDatastoreItemInfo
@@ -614,8 +614,8 @@ class Datastore(FileTransferSource, metaclass=ABCMeta):
614
614
  """
615
615
  raise NotImplementedError("Must be implemented by subclass")
616
616
 
617
- def prepare_get_for_external_client(self, ref: DatasetRef) -> FileDatastoreGetPayload | None:
618
- """Retrieve serializable data that can be used to execute a ``get()``.
617
+ def prepare_get_for_external_client(self, ref: DatasetRef) -> list[DatasetLocationInformation] | None:
618
+ """Retrieve data that can be used to execute a ``get()``.
619
619
 
620
620
  Parameters
621
621
  ----------
@@ -624,11 +624,9 @@ class Datastore(FileTransferSource, metaclass=ABCMeta):
624
624
 
625
625
  Returns
626
626
  -------
627
- payload : `object` | `None`
628
- Serializable payload containing the information needed to perform a
629
- get() operation. This payload may be sent over the wire to another
630
- system to perform the get(). Returns `None` if the dataset is not
631
- known to this datastore.
627
+ payload : `list` [ `DatasetLocationInformation` ] | `None`
628
+ Information needed to perform a get() operation. Returns `None` if
629
+ the dataset is not known to this datastore.
632
630
  """
633
631
  raise NotImplementedError()
634
632
 
@@ -47,6 +47,7 @@ from lsst.daf.butler.datastore import (
47
47
  )
48
48
  from lsst.daf.butler.datastore.constraints import Constraints
49
49
  from lsst.daf.butler.datastore.record_data import DatastoreRecordData
50
+ from lsst.daf.butler.datastores.file_datastore.get import DatasetLocationInformation
50
51
  from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import ArtifactIndexInfo, ZipIndex
51
52
  from lsst.resources import ResourcePath
52
53
  from lsst.utils import doImportType
@@ -61,8 +62,6 @@ if TYPE_CHECKING:
61
62
  from lsst.daf.butler.registry.interfaces import DatasetIdRef, DatastoreRegistryBridgeManager
62
63
  from lsst.resources import ResourcePathExpression
63
64
 
64
- from .fileDatastoreClient import FileDatastoreGetPayload
65
-
66
65
  log = getLogger(__name__)
67
66
 
68
67
 
@@ -411,7 +410,7 @@ class ChainedDatastore(Datastore):
411
410
 
412
411
  raise FileNotFoundError(f"Dataset {ref} could not be found in any of the datastores")
413
412
 
414
- def prepare_get_for_external_client(self, ref: DatasetRef) -> FileDatastoreGetPayload | None:
413
+ def prepare_get_for_external_client(self, ref: DatasetRef) -> list[DatasetLocationInformation] | None:
415
414
  datastore = self._get_matching_datastore(ref)
416
415
  if datastore is None:
417
416
  return None
@@ -89,10 +89,6 @@ from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import (
89
89
  determine_destination_for_retrieved_artifact,
90
90
  unpack_zips,
91
91
  )
92
- from lsst.daf.butler.datastores.fileDatastoreClient import (
93
- FileDatastoreGetPayload,
94
- FileDatastoreGetPayloadFileInfo,
95
- )
96
92
  from lsst.daf.butler.registry.interfaces import (
97
93
  DatabaseInsertMode,
98
94
  DatastoreRegistryBridge,
@@ -110,7 +106,6 @@ from lsst.utils.logging import VERBOSE, getLogger
110
106
  from lsst.utils.timer import time_this
111
107
 
112
108
  from ..datastore import FileTransferMap, FileTransferRecord
113
- from ..datastore.stored_file_info import make_datastore_path_relative
114
109
 
115
110
  if TYPE_CHECKING:
116
111
  from lsst.daf.butler import DatasetProvenance, LookupKey
@@ -2304,27 +2299,14 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
2304
2299
  allGetInfo, ref=ref, parameters=parameters, cache_manager=self.cacheManager
2305
2300
  )
2306
2301
 
2307
- def prepare_get_for_external_client(self, ref: DatasetRef) -> FileDatastoreGetPayload | None:
2302
+ def prepare_get_for_external_client(self, ref: DatasetRef) -> list[DatasetLocationInformation] | None:
2308
2303
  # Docstring inherited
2309
2304
 
2310
- # 1 hour. Chosen somewhat arbitrarily -- this is long enough that the
2311
- # client should have time to download a large file with retries if
2312
- # needed, but short enough that it will become obvious quickly that
2313
- # these URLs expire.
2314
- # From a strictly technical standpoint there is no reason this
2315
- # shouldn't be a day or more, but there seems to be a political issue
2316
- # where people think there is a risk of end users posting presigned
2317
- # URLs for people without access rights to download.
2318
- url_expiration_time_seconds = 1 * 60 * 60
2319
-
2320
2305
  locations = self._get_dataset_locations_info(ref)
2321
2306
  if len(locations) == 0:
2322
2307
  return None
2323
2308
 
2324
- return FileDatastoreGetPayload(
2325
- datastore_type="file",
2326
- file_info=[_to_file_info_payload(info, url_expiration_time_seconds) for info in locations],
2327
- )
2309
+ return locations
2328
2310
 
2329
2311
  @transactional
2330
2312
  def put(self, inMemoryDataset: Any, ref: DatasetRef, provenance: DatasetProvenance | None = None) -> None:
@@ -3229,17 +3211,3 @@ class FileDatastore(GenericBaseDatastore[StoredFileInfo]):
3229
3211
  def get_opaque_table_definitions(self) -> Mapping[str, DatastoreOpaqueTable]:
3230
3212
  # Docstring inherited from the base class.
3231
3213
  return {self._opaque_table_name: DatastoreOpaqueTable(self.makeTableSpec(), StoredFileInfo)}
3232
-
3233
-
3234
- def _to_file_info_payload(
3235
- info: DatasetLocationInformation, url_expiration_time_seconds: int
3236
- ) -> FileDatastoreGetPayloadFileInfo:
3237
- location, file_info = info
3238
-
3239
- datastoreRecords = file_info.to_simple()
3240
- datastoreRecords.path = make_datastore_path_relative(datastoreRecords.path)
3241
-
3242
- return FileDatastoreGetPayloadFileInfo(
3243
- url=location.uri.generate_presigned_get_url(expiration_time_seconds=url_expiration_time_seconds),
3244
- datastoreRecords=datastoreRecords,
3245
- )
@@ -25,6 +25,5 @@
25
25
  # You should have received a copy of the GNU General Public License
26
26
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
27
 
28
- from ._factory import *
29
28
  from ._http_connection import ButlerServerError
30
29
  from ._remote_butler import *
@@ -25,16 +25,24 @@
25
25
  # You should have received a copy of the GNU General Public License
26
26
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
27
 
28
+ from __future__ import annotations
29
+
30
+ from typing import Literal, TypeAlias
31
+
28
32
  from pydantic import AnyHttpUrl, BaseModel
29
33
 
30
34
 
35
+ class RemoteButlerConfigModel(BaseModel):
36
+ """ButlerConfig properties for RemoteButler."""
37
+
38
+ remote_butler: RemoteButlerOptionsModel
39
+
40
+
31
41
  class RemoteButlerOptionsModel(BaseModel):
32
42
  """Model representing the remote server connection."""
33
43
 
34
44
  url: AnyHttpUrl
45
+ authentication: AuthenticationMode = "rubin_science_platform"
35
46
 
36
47
 
37
- class RemoteButlerConfigModel(BaseModel):
38
- """Configuration representing a remote butler."""
39
-
40
- remote_butler: RemoteButlerOptionsModel
48
+ AuthenticationMode: TypeAlias = Literal["rubin_science_platform", "cadc"]
@@ -36,10 +36,12 @@ from lsst.daf.butler.repo_relocation import replaceRoot
36
36
  from .._butler_config import ButlerConfig
37
37
  from .._butler_instance_options import ButlerInstanceOptions
38
38
  from ..registry import RegistryDefaults
39
- from ._authentication import get_authentication_token_from_environment
40
- from ._config import RemoteButlerConfigModel
39
+ from ._config import RemoteButlerConfigModel, RemoteButlerOptionsModel
41
40
  from ._http_connection import RemoteButlerHttpConnection
42
41
  from ._remote_butler import RemoteButler, RemoteButlerCache
42
+ from .authentication.cadc import CadcAuthenticationProvider
43
+ from .authentication.interface import RemoteButlerAuthenticationProvider
44
+ from .authentication.rubin import RubinAuthenticationProvider
43
45
 
44
46
 
45
47
  class RemoteButlerFactory:
@@ -49,9 +51,9 @@ class RemoteButlerFactory:
49
51
 
50
52
  Parameters
51
53
  ----------
52
- server_url : `str`
53
- The URL of the Butler server that RemoteButler instances created by
54
- this factory will connect to.
54
+ config : `RemoteButlerOptionsModel`
55
+ `RemoteButler` configuration information (as read from `ButlerConfig`
56
+ YAML file).
55
57
  http_client : `httpx.Client`, optional
56
58
  The httpx connection pool that RemoteButler instances created by this
57
59
  factory will use for making HTTP requests. If omitted, creates a new
@@ -60,11 +62,12 @@ class RemoteButlerFactory:
60
62
  Notes
61
63
  -----
62
64
  Most users should not directly call this constructor -- instead use
63
- ``create_factory_from_config`` or ``create_factory_for_url``.
65
+ ``create_factory_from_config``.
64
66
  """
65
67
 
66
- def __init__(self, server_url: str, http_client: httpx.Client | None = None):
67
- self.server_url = server_url
68
+ def __init__(self, config: RemoteButlerOptionsModel, http_client: httpx.Client | None = None):
69
+ self._config = config
70
+ self.server_url = str(config.url)
68
71
  if http_client is not None:
69
72
  self.http_client = http_client
70
73
  else:
@@ -83,7 +86,9 @@ class RemoteButlerFactory:
83
86
  self._cache = RemoteButlerCache()
84
87
 
85
88
  @staticmethod
86
- def create_factory_from_config(config: ButlerConfig) -> RemoteButlerFactory:
89
+ def create_factory_from_config(
90
+ config: ButlerConfig, http_client: httpx.Client | None = None
91
+ ) -> RemoteButlerFactory:
87
92
  # There is a convention in Butler config files where <butlerRoot> in a
88
93
  # configuration option refers to the directory containing the
89
94
  # configuration file. We allow this for the remote butler's URL so
@@ -93,42 +98,61 @@ class RemoteButlerFactory:
93
98
  if server_url_key in config:
94
99
  config[server_url_key] = replaceRoot(config[server_url_key], config.configDir)
95
100
  remote_config = RemoteButlerConfigModel.model_validate(config)
96
- return RemoteButlerFactory.create_factory_for_url(str(remote_config.remote_butler.url))
101
+ return RemoteButlerFactory(remote_config.remote_butler, http_client=http_client)
97
102
 
98
103
  @staticmethod
99
- def create_factory_for_url(server_url: str) -> RemoteButlerFactory:
100
- return RemoteButlerFactory(server_url)
104
+ def create_factory_for_url(
105
+ server_url: str, http_client: httpx.Client | None = None
106
+ ) -> RemoteButlerFactory:
107
+ config = ButlerConfig(server_url)
108
+ return RemoteButlerFactory.create_factory_from_config(config, http_client=http_client)
101
109
 
102
- def create_butler_for_access_token(
110
+ def _create_butler(
103
111
  self,
104
- access_token: str,
105
112
  *,
106
- butler_options: ButlerInstanceOptions | None = None,
107
- use_disabled_datastore_cache: bool = True,
113
+ auth: RemoteButlerAuthenticationProvider,
114
+ butler_options: ButlerInstanceOptions | None,
115
+ enable_datastore_cache: bool = False,
108
116
  ) -> RemoteButler:
109
117
  if butler_options is None:
110
118
  butler_options = ButlerInstanceOptions()
111
119
  return RemoteButler(
112
120
  connection=RemoteButlerHttpConnection(
113
- http_client=self.http_client, server_url=self.server_url, access_token=access_token
121
+ http_client=self.http_client, server_url=self.server_url, auth=auth
114
122
  ),
115
123
  defaults=RegistryDefaults.from_butler_instance_options(butler_options),
116
124
  cache=self._cache,
117
- use_disabled_datastore_cache=use_disabled_datastore_cache,
125
+ use_disabled_datastore_cache=not enable_datastore_cache,
126
+ )
127
+
128
+ def create_butler_for_access_token(
129
+ self,
130
+ access_token: str,
131
+ *,
132
+ butler_options: ButlerInstanceOptions | None = None,
133
+ enable_datastore_cache: bool = False,
134
+ ) -> RemoteButler:
135
+ auth: RemoteButlerAuthenticationProvider
136
+ if self._config.authentication == "rubin_science_platform":
137
+ auth = RubinAuthenticationProvider(access_token)
138
+ elif self._config.authentication == "cadc":
139
+ auth = CadcAuthenticationProvider()
140
+ return self._create_butler(
141
+ auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
118
142
  )
119
143
 
120
144
  def create_butler_with_credentials_from_environment(
121
145
  self,
122
146
  *,
123
147
  butler_options: ButlerInstanceOptions | None = None,
124
- use_disabled_datastore_cache: bool = True,
148
+ enable_datastore_cache: bool = True,
125
149
  ) -> RemoteButler:
126
- token = get_authentication_token_from_environment(self.server_url)
127
- if token is None:
128
- raise RuntimeError(
129
- "Attempting to connect to Butler server,"
130
- " but no access credentials were found in the environment."
131
- )
132
- return self.create_butler_for_access_token(
133
- token, butler_options=butler_options, use_disabled_datastore_cache=use_disabled_datastore_cache
150
+ auth: RemoteButlerAuthenticationProvider
151
+ if self._config.authentication == "rubin_science_platform":
152
+ auth = RubinAuthenticationProvider.create_from_environment(self.server_url)
153
+ elif self._config.authentication == "cadc":
154
+ auth = CadcAuthenticationProvider()
155
+
156
+ return self._create_butler(
157
+ auth=auth, butler_options=butler_options, enable_datastore_cache=enable_datastore_cache
134
158
  )
@@ -0,0 +1,98 @@
1
+ from typing import Any
2
+
3
+ from pydantic import AnyHttpUrl
4
+
5
+ from lsst.resources import ResourcePath
6
+ from lsst.resources.http import HttpResourcePath
7
+
8
+ from .._dataset_ref import DatasetRef
9
+ from .._location import Location
10
+ from ..datastore.cache_manager import AbstractDatastoreCacheManager, DatastoreDisabledCacheManager
11
+ from ..datastore.stored_file_info import StoredFileInfo
12
+ from ..datastores.file_datastore.get import (
13
+ DatasetLocationInformation,
14
+ Mapping,
15
+ generate_datastore_get_information,
16
+ get_dataset_as_python_object_from_get_info,
17
+ )
18
+ from .authentication.interface import RemoteButlerAuthenticationProvider
19
+ from .server_models import FileAuthenticationMode, FileInfoPayload, FileInfoRecord
20
+
21
+
22
+ def get_dataset_as_python_object(
23
+ ref: DatasetRef,
24
+ payload: FileInfoPayload,
25
+ *,
26
+ auth: RemoteButlerAuthenticationProvider,
27
+ parameters: Mapping[str, Any] | None,
28
+ cache_manager: AbstractDatastoreCacheManager | None = None,
29
+ ) -> Any:
30
+ """Retrieve an artifact from storage and return it as a Python object.
31
+
32
+ Parameters
33
+ ----------
34
+ ref : `DatasetRef`
35
+ Metadata about this artifact.
36
+ payload : `FileInfoPayload`
37
+ Pre-processed information about each file associated with this
38
+ artifact.
39
+ auth : `RemoteButlerAuthenticationProvider`
40
+ Provides authentication headers for HTTP service hosting the artifact
41
+ files.
42
+ parameters : `Mapping`[`str`, `typing.Any`]
43
+ `StorageClass` and `Formatter` parameters to be used when converting
44
+ the artifact to a Python object.
45
+ cache_manager : `AbstractDatastoreCacheManager` or `None`, optional
46
+ Cache manager to use. If `None` the cache is disabled.
47
+
48
+ Returns
49
+ -------
50
+ python_object : `typing.Any`
51
+ The retrieved artifact, converted to a Python object.
52
+ """
53
+ fileLocations = [_to_dataset_location_information(file_info, auth) for file_info in payload.file_info]
54
+
55
+ datastore_file_info = generate_datastore_get_information(
56
+ fileLocations,
57
+ ref=ref,
58
+ parameters=parameters,
59
+ )
60
+ if cache_manager is None:
61
+ cache_manager = DatastoreDisabledCacheManager()
62
+ return get_dataset_as_python_object_from_get_info(
63
+ datastore_file_info, ref=ref, parameters=parameters, cache_manager=cache_manager
64
+ )
65
+
66
+
67
+ def convert_http_url_to_resource_path(
68
+ url: AnyHttpUrl, auth: RemoteButlerAuthenticationProvider, auth_mode: FileAuthenticationMode
69
+ ) -> ResourcePath:
70
+ """Convert an HTTP URL to a ResourcePath instance with authentication
71
+ headers attached.
72
+
73
+ Parameters
74
+ ----------
75
+ url : `AnyHttpUrl`
76
+ URL to convert.
77
+ auth : `RemoteButlerAuthenticationProvider`
78
+ Provides authentication headers for the URL.
79
+ auth_mode : `FileAuthenticationMode`
80
+ Specifies which authentication headers to use.
81
+ """
82
+ if auth_mode == "none":
83
+ headers = None
84
+ elif auth_mode == "gafaelfawr":
85
+ headers = auth.get_server_headers()
86
+ elif auth_mode == "datastore":
87
+ headers = auth.get_datastore_headers()
88
+ else:
89
+ raise ValueError(f"Unknown authentication type: '{auth_mode}'")
90
+
91
+ return HttpResourcePath.create_http_resource_path(str(url), extra_headers=headers)
92
+
93
+
94
+ def _to_dataset_location_information(
95
+ file_info: FileInfoRecord, auth: RemoteButlerAuthenticationProvider
96
+ ) -> DatasetLocationInformation:
97
+ path = convert_http_url_to_resource_path(file_info.url, auth, auth_mode=file_info.auth)
98
+ return (Location(None, path), StoredFileInfo.from_simple(file_info.datastoreRecords))
@@ -42,13 +42,15 @@ from pydantic import BaseModel, ValidationError
42
42
 
43
43
  from lsst.daf.butler import __version__
44
44
 
45
- from ._authentication import get_authentication_headers
46
45
  from ._errors import deserialize_butler_user_error
46
+ from .authentication.interface import RemoteButlerAuthenticationProvider
47
47
  from .server_models import CLIENT_REQUEST_ID_HEADER_NAME, ERROR_STATUS_CODE, ErrorResponseModel
48
48
 
49
49
  _AnyPydanticModel = TypeVar("_AnyPydanticModel", bound=BaseModel)
50
50
  """Generic type variable that accepts any Pydantic model class."""
51
51
 
52
+ _USER_AGENT = f"RemoteButler/{__version__}"
53
+
52
54
 
53
55
  class RemoteButlerHttpConnection:
54
56
  """HTTP connection to a Butler server.
@@ -59,24 +61,16 @@ class RemoteButlerHttpConnection:
59
61
  HTTP connection pool we will use to connect to the server.
60
62
  server_url : `str`
61
63
  URL of the Butler server we will connect to.
62
- access_token : `str`
63
- Rubin Science Platform Gafaelfawr access token that will be used to
64
- authenticate with the server.
64
+ auth : `RemoteButlerAuthenticationProvider`
65
+ Provides headers that will be used to authenticate with the server.
65
66
  """
66
67
 
67
- def __init__(self, http_client: httpx.Client, server_url: str, access_token: str) -> None:
68
+ def __init__(
69
+ self, http_client: httpx.Client, server_url: str, auth: RemoteButlerAuthenticationProvider
70
+ ) -> None:
68
71
  self._client = http_client
69
72
  self.server_url = server_url
70
- self._access_token = access_token
71
-
72
- self._auth_headers = get_authentication_headers(access_token)
73
- headers = {"user-agent": f"RemoteButler/{__version__}"}
74
-
75
- self._headers = self._auth_headers | headers
76
-
77
- @property
78
- def authentication_headers(self) -> dict[str, str]:
79
- return self._auth_headers
73
+ self.auth = auth
80
74
 
81
75
  def post(self, path: str, model: BaseModel) -> httpx.Response:
82
76
  """Send a POST request to the Butler server.
@@ -196,8 +190,8 @@ class RemoteButlerHttpConnection:
196
190
  url = self._get_url(path)
197
191
 
198
192
  request_id = str(uuid4())
199
- request_headers = {CLIENT_REQUEST_ID_HEADER_NAME: request_id}
200
- request_headers.update(self._headers)
193
+ request_headers = {CLIENT_REQUEST_ID_HEADER_NAME: request_id, "user-agent": _USER_AGENT}
194
+ request_headers.update(self.auth.get_server_headers())
201
195
  if headers is not None:
202
196
  request_headers.update(headers)
203
197
 
@@ -45,10 +45,6 @@ from lsst.daf.butler.datastores.file_datastore.retrieve_artifacts import (
45
45
  retrieve_and_zip,
46
46
  unpack_zips,
47
47
  )
48
- from lsst.daf.butler.datastores.fileDatastoreClient import (
49
- FileDatastoreGetPayload,
50
- get_dataset_as_python_object,
51
- )
52
48
  from lsst.resources import ResourcePath, ResourcePathExpression
53
49
 
54
50
  from .._butler import Butler, _DeprecatedDefault
@@ -70,6 +66,7 @@ from ..queries.tree import make_column_literal
70
66
  from ..registry import CollectionArgType, NoDefaultCollectionError, Registry, RegistryDefaults
71
67
  from ._collection_args import convert_collection_arg_to_glob_string_list
72
68
  from ._defaults import DefaultsHolder
69
+ from ._get import convert_http_url_to_resource_path, get_dataset_as_python_object
73
70
  from ._http_connection import RemoteButlerHttpConnection, parse_model, quote_path_variable
74
71
  from ._query_driver import RemoteQueryDriver
75
72
  from ._query_results import convert_dataset_ref_results, read_query_results
@@ -79,6 +76,7 @@ from ._remote_butler_collections import RemoteButlerCollections
79
76
  from ._remote_file_transfer_source import RemoteFileTransferSource
80
77
  from .server_models import (
81
78
  CollectionList,
79
+ FileInfoPayload,
82
80
  FindDatasetRequestModel,
83
81
  FindDatasetResponseModel,
84
82
  GetDatasetTypeResponseModel,
@@ -303,6 +301,7 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
303
301
  return get_dataset_as_python_object(
304
302
  ref,
305
303
  _to_file_payload(model),
304
+ auth=self._connection.auth,
306
305
  parameters=parameters,
307
306
  cache_manager=self._cache_manager,
308
307
  )
@@ -355,7 +354,11 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
355
354
  response = self._get_file_info(datasetRefOrType, dataId, collections, None, kwargs)
356
355
  file_info = _to_file_payload(response).file_info
357
356
  if len(file_info) == 1:
358
- return DatasetRefURIs(primaryURI=ResourcePath(str(file_info[0].url)))
357
+ return DatasetRefURIs(
358
+ primaryURI=convert_http_url_to_resource_path(
359
+ file_info[0].url, self._connection.auth, file_info[0].auth
360
+ )
361
+ )
359
362
  else:
360
363
  components = {}
361
364
  for f in file_info:
@@ -365,7 +368,9 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
365
368
  f"DatasetId {response.dataset_ref.id} has a component file"
366
369
  " with no component name defined"
367
370
  )
368
- components[component] = ResourcePath(str(f.url))
371
+ components[component] = convert_http_url_to_resource_path(
372
+ f.url, self._connection.auth, f.auth
373
+ )
369
374
  return DatasetRefURIs(componentURIs=components)
370
375
 
371
376
  def get_dataset_type(self, name: str) -> DatasetType:
@@ -734,7 +739,7 @@ class RemoteButler(Butler): # numpydoc ignore=PR02
734
739
  return self._registry_defaults.get().dataId.to_simple(minimal=True).dataId
735
740
 
736
741
 
737
- def _to_file_payload(get_file_response: GetFileResponseModel) -> FileDatastoreGetPayload:
742
+ def _to_file_payload(get_file_response: GetFileResponseModel) -> FileInfoPayload:
738
743
  if get_file_response.artifact is None:
739
744
  ref = get_file_response.dataset_ref
740
745
  raise DatasetNotFoundError(f"Dataset is known, but artifact is not available. (datasetId='{ref.id}')")
@@ -37,6 +37,7 @@ from lsst.utils.iteration import chunk_iterable
37
37
  from .._location import Location
38
38
  from ..datastore import FileTransferMap, FileTransferRecord, FileTransferSource
39
39
  from ..datastore.stored_file_info import StoredFileInfo
40
+ from ._get import convert_http_url_to_resource_path
40
41
  from ._http_connection import RemoteButlerHttpConnection, parse_model
41
42
  from .server_models import (
42
43
  FileTransferRecordModel,
@@ -78,15 +79,7 @@ class RemoteFileTransferSource(FileTransferSource):
78
79
  return {}
79
80
 
80
81
  def _deserialize_file_transfer_record(self, record: FileTransferRecordModel) -> FileTransferRecord:
81
- # If the server tells us it is necessary, attach the Gafaelfawr
82
- # authentication headers to the URL.
83
- if record.auth == "none":
84
- headers = None
85
- elif record.auth == "gafaelfawr":
86
- headers = self._connection.authentication_headers
87
- else:
88
- raise ValueError(f"Unknown authentication type {record.auth}")
89
- resource_path = HttpResourcePath.create_http_resource_path(str(record.url), extra_headers=headers)
82
+ resource_path = convert_http_url_to_resource_path(record.url, self._connection.auth, record.auth)
90
83
  resource_path = _tweak_uri_for_unit_test(resource_path)
91
84
 
92
85
  return FileTransferRecord(
@@ -95,7 +88,7 @@ class RemoteFileTransferSource(FileTransferSource):
95
88
  )
96
89
 
97
90
 
98
- def _tweak_uri_for_unit_test(path: HttpResourcePath) -> HttpResourcePath:
91
+ def _tweak_uri_for_unit_test(path: ResourcePath) -> ResourcePath:
99
92
  # Provide a place for unit tests to hook in and modify URLs, since there is
100
93
  # no actual HTTP server reachable via a domain name during testing.
101
94
  return path
@@ -0,0 +1,54 @@
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 .interface import RemoteButlerAuthenticationProvider
31
+
32
+
33
+ class CadcAuthenticationProvider(RemoteButlerAuthenticationProvider):
34
+ """Provide HTTP headers required for authenticating the user at the
35
+ Canadian Astronomy Data Centre.
36
+ """
37
+
38
+ # NOTE -- This object needs to be pickleable. It will sometimes be
39
+ # serialized and transferred to another process to execute file transfers.
40
+
41
+ def __init__(self) -> None:
42
+ # TODO: Load authentication information somehow
43
+ pass
44
+
45
+ def get_server_headers(self) -> dict[str, str]:
46
+ # TODO: I think you mentioned that you might not require
47
+ # authentication for the Butler server REST API initially --
48
+ # if so, you can leave this blank.
49
+ return {}
50
+
51
+ def get_datastore_headers(self) -> dict[str, str]:
52
+ # TODO: Supply the headers needed to access the Storage Inventory
53
+ # system.
54
+ return {"Authorization": "Bearer stub"}