lsst-daf-butler 29.2025.1700__tar.gz → 29.2025.1800__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 (430) hide show
  1. {lsst_daf_butler-29.2025.1700/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.1800}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/queries.rst +12 -6
  3. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/__init__.py +1 -0
  4. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler.py +23 -6
  5. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_instance_options.py +3 -0
  6. lsst_daf_butler-29.2025.1800/python/lsst/daf/butler/_butler_metrics.py +117 -0
  7. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_ref.py +99 -16
  8. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_file_dataset.py +78 -3
  9. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_limited_butler.py +34 -2
  10. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_quantum_backed.py +20 -2
  11. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/arrow_utils.py +4 -4
  12. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/fileDatastore.py +3 -2
  13. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_group.py +15 -5
  14. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_record_set.py +354 -2
  15. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/record_cache.py +1 -2
  16. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_butler/_direct_butler.py +53 -36
  17. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +9 -0
  18. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_expression_strings.py +13 -0
  19. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_identifiers.py +4 -1
  20. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/expression_factory.py +16 -0
  21. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_predicate.py +3 -1
  22. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/databases/postgresql.py +50 -0
  23. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/databases/sqlite.py +46 -0
  24. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_database.py +21 -0
  25. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +4 -0
  26. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/check.py +5 -0
  27. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +6 -0
  28. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +51 -5
  29. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +22 -8
  30. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_remote_butler.py +33 -16
  31. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/butler_queries.py +71 -0
  32. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/hybrid_butler.py +17 -3
  33. lsst_daf_butler-29.2025.1800/python/lsst/daf/butler/version.py +2 -0
  34. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  35. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/SOURCES.txt +1 -0
  36. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_butler.py +66 -14
  37. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_datasets.py +36 -0
  38. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_dimension_record_containers.py +74 -4
  39. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_dimensions.py +10 -0
  40. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_exprParserYacc.py +39 -2
  41. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_expressions.py +7 -0
  42. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_normalFormExpression.py +3 -0
  43. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_quantumBackedButler.py +18 -3
  44. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_simpleButler.py +4 -1
  45. lsst_daf_butler-29.2025.1700/python/lsst/daf/butler/version.py +0 -2
  46. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/COPYRIGHT +0 -0
  47. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/LICENSE +0 -0
  48. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/MANIFEST.in +0 -0
  49. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/README.md +0 -0
  50. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/bsd_license.txt +0 -0
  51. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  52. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  53. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/configuring.rst +0 -0
  54. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/datastores.rst +0 -0
  55. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/dimensions.rst +0 -0
  56. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/formatters.rst +0 -0
  57. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/index.rst +0 -0
  58. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/organizing.rst +0 -0
  59. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  60. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/doc/lsst.daf.butler/writing-subcommands.rst +0 -0
  61. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/gpl-v3.0.txt +0 -0
  62. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/pyproject.toml +0 -0
  63. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/__init__.py +0 -0
  64. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/__init__.py +0 -0
  65. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_collections.py +0 -0
  66. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_config.py +0 -0
  67. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  68. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_collection_type.py +0 -0
  69. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_column_categorization.py +0 -0
  70. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_column_tags.py +0 -0
  71. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_column_type_info.py +0 -0
  72. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_config.py +0 -0
  73. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_config_support.py +0 -0
  74. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_association.py +0 -0
  75. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  76. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  77. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_dataset_type.py +0 -0
  78. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  79. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_exceptions.py +0 -0
  80. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  81. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  82. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_formatter.py +0 -0
  83. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  84. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_location.py +0 -0
  85. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_named.py +0 -0
  86. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_quantum.py +0 -0
  87. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  88. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_registry_shim.py +0 -0
  89. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_storage_class.py +0 -0
  90. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  91. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_timespan.py +0 -0
  92. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_topology.py +0 -0
  93. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  94. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  95. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  96. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  97. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/__init__.py +0 -0
  98. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/butler.py +0 -0
  99. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  100. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  101. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  102. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  103. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  104. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  105. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  106. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  107. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  108. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/progress.py +0 -0
  109. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/cli/utils.py +0 -0
  110. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/column_spec.py +0 -0
  111. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  112. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  113. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  114. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  115. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  116. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  117. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  118. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  119. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  120. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  121. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  122. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  123. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  124. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  125. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  126. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  127. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  128. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  129. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  130. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  131. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/composites.py +0 -0
  132. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  133. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  134. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  135. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  136. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  137. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  138. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  139. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  140. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  141. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  142. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  143. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  144. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/ddl.py +0 -0
  145. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  146. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  147. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  148. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  149. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  150. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  151. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  152. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  153. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  154. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  155. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  156. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  157. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  158. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  159. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  160. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  161. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  162. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  163. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  164. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  165. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  166. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  167. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  168. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  169. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  170. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  171. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  172. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/file.py +0 -0
  173. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/json.py +0 -0
  174. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/logs.py +0 -0
  175. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  176. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/packages.py +0 -0
  177. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  178. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  179. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  180. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  181. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/json.py +0 -0
  182. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/logging.py +0 -0
  183. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/mapping_factory.py +0 -0
  184. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/name_shrinker.py +0 -0
  185. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  186. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/persistence_context.py +0 -0
  187. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/progress.py +0 -0
  188. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/py.typed +0 -0
  189. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  190. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/__init__.py +0 -0
  191. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_base.py +0 -0
  192. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  193. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  194. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  195. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  196. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/_query.py +0 -0
  197. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  198. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/driver.py +0 -0
  199. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  200. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  201. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  202. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  203. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  204. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  205. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  206. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  207. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  208. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  209. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/queries/visitors.py +0 -0
  210. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/__init__.py +0 -0
  211. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  212. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  213. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  214. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  215. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_config.py +0 -0
  216. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  217. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  218. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_registry.py +0 -0
  219. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  220. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/attributes.py +0 -0
  221. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  222. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  223. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  224. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  225. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/_base.py +0 -0
  226. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  227. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  228. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  229. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  230. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  231. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  232. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  233. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  234. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  235. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  236. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  237. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  238. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  239. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  240. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  241. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  242. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  243. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  244. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  245. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  246. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  247. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  248. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/managers.py +0 -0
  249. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  250. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  251. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  252. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  253. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  254. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  255. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  256. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  257. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  258. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/opaque.py +0 -0
  259. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  260. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  261. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  262. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  263. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  264. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  265. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  266. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  267. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  268. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  269. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  270. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  271. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  272. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  273. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  274. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  275. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  276. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  277. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  278. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  279. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  280. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  281. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  282. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  283. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/tests/_registry.py +0 -0
  284. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/versions.py +0 -0
  285. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  286. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  287. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  288. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  289. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  290. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  291. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  292. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  293. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  294. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  295. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  296. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  297. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  298. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  299. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  300. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  301. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  302. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  303. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  304. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  305. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  306. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  307. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  308. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  309. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  310. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  311. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  312. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  313. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  314. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  315. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  316. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/repo_relocation.py +0 -0
  317. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/__init__.py +0 -0
  318. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/_associate.py +0 -0
  319. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  320. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  321. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  322. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  323. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/configDump.py +0 -0
  324. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/configValidate.py +0 -0
  325. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/createRepo.py +0 -0
  326. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  327. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  328. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  329. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  330. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  331. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  332. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  333. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  334. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  335. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  336. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  337. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  338. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  339. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  340. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/__init__.py +0 -0
  341. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  342. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  343. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  344. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  345. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  346. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  347. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  348. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  349. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  350. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  351. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  352. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/server.py +0 -0
  353. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  354. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  355. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/tests/utils.py +0 -0
  356. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/time_utils.py +0 -0
  357. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  358. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  359. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/_context.py +0 -0
  360. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  361. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  362. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst/daf/butler/utils.py +0 -0
  363. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  364. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  365. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  366. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  367. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  368. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/setup.cfg +0 -0
  369. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_astropyTableFormatter.py +0 -0
  370. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_authentication.py +0 -0
  371. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_butler_factory.py +0 -0
  372. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdAssociate.py +0 -0
  373. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdConfigDump.py +0 -0
  374. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdConfigValidate.py +0 -0
  375. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdCreate.py +0 -0
  376. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdImport.py +0 -0
  377. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdIngestFiles.py +0 -0
  378. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdPruneDatasets.py +0 -0
  379. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryCollections.py +0 -0
  380. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDataIds.py +0 -0
  381. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  382. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDatasets.py +0 -0
  383. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  384. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdRemoveCollections.py +0 -0
  385. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdRemoveRuns.py +0 -0
  386. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  387. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliLog.py +0 -0
  388. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliPluginLoader.py +0 -0
  389. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtilSplitCommas.py +0 -0
  390. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtilSplitKv.py +0 -0
  391. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtilToUpper.py +0 -0
  392. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_cliUtils.py +0 -0
  393. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_column_spec.py +0 -0
  394. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_composites.py +0 -0
  395. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_config.py +0 -0
  396. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_connectionString.py +0 -0
  397. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_constraints.py +0 -0
  398. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_datastore.py +0 -0
  399. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_ddl.py +0 -0
  400. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_exprParserLex.py +0 -0
  401. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_formatter.py +0 -0
  402. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_location.py +0 -0
  403. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_logFormatter.py +0 -0
  404. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_logging.py +0 -0
  405. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_matplotlibFormatter.py +0 -0
  406. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_nonempty_mapping.py +0 -0
  407. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_obscore.py +0 -0
  408. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_packages.py +0 -0
  409. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_parquet.py +0 -0
  410. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_postgresql.py +0 -0
  411. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_progress.py +0 -0
  412. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_pydantic_utils.py +0 -0
  413. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_quantum.py +0 -0
  414. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_query_direct_postgresql.py +0 -0
  415. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_query_direct_sqlite.py +0 -0
  416. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_query_interface.py +0 -0
  417. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_query_relations.py +0 -0
  418. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_query_remote.py +0 -0
  419. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_query_utilities.py +0 -0
  420. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_remote_butler.py +0 -0
  421. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_server.py +0 -0
  422. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_sqlite.py +0 -0
  423. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_storageClass.py +0 -0
  424. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_templates.py +0 -0
  425. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_testRepo.py +0 -0
  426. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_thread_utils.py +0 -0
  427. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_time_utils.py +0 -0
  428. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_timespan.py +0 -0
  429. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/tests/test_utils.py +0 -0
  430. {lsst_daf_butler-29.2025.1700 → lsst_daf_butler-29.2025.1800}/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.1700
3
+ Version: 29.2025.1800
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
@@ -229,7 +229,7 @@ Comparison operators
229
229
 
230
230
  Language supports set of regular comparison operators: ``=``, ``!=``, ``<``,
231
231
  ``<=``, ``>``, ``>=``. This can be used on operands that evaluate to a numeric
232
- values or timestamps.
232
+ values, timestamps, or strings.
233
233
 
234
234
  .. note :: The equality comparison operator is a single ``=`` like in SQL, not
235
235
  double ``==`` like in Python or C++.
@@ -272,7 +272,7 @@ as are these:
272
272
 
273
273
  Another usage of ``IN`` operator is for checking whether a timestamp or a time
274
274
  range is contained wholly in other time range. Time range in this case can be
275
- specified as a tuple of two time literals or identifers each representing a
275
+ specified as a tuple of two time literals or identifiers each representing a
276
276
  timestamp, or as a single identifier representing a time range. In case a
277
277
  single identifier appears on the right side of ``IN`` it has to be enclosed
278
278
  in parentheses.
@@ -352,11 +352,17 @@ Function call
352
352
  Function call syntax is similar to other languages, expression for call
353
353
  consists of an identifier followed by zero or more comma-separated arguments
354
354
  enclosed in parentheses (e.g. ``func(1, 2, 3)``). An argument to a function
355
- can be any expression.
355
+ can be any expression. Names of the functions are not case-sensitive.
356
356
 
357
- Presently there only one construct that uses this syntax, ``POINT(ra, dec)``
358
- is function which declares (or returns) sky coordinates similarly to ADQL
359
- syntax. Name of the ``POINT`` function is not case-sensitive.
357
+ Presently the following functions are implemented in the query language:
358
+
359
+ - ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
360
+ similarly to ADQL syntax.
361
+ - ``GLOB(expression, pattern)`` - performs case-sensitive match of a string
362
+ ``expression`` against ``pattern``. Pattern can include ``*`` and ``?``
363
+ meta-characters, matching any number of characters or a single character
364
+ respectfully. All other characters in pattern are matched literally, and
365
+ whole expression string has to match for ``GLOB()`` to return ``True``.
360
366
 
361
367
 
362
368
  .. _time-literals-syntax:
@@ -38,6 +38,7 @@ from . import ddl, time_utils
38
38
  from ._butler import *
39
39
  from ._butler_collections import *
40
40
  from ._butler_config import *
41
+ from ._butler_metrics import *
41
42
  from ._butler_repo_index import *
42
43
  from ._collection_type import CollectionType
43
44
  from ._column_categorization import *
@@ -46,6 +46,7 @@ from lsst.utils.logging import getLogger
46
46
  from ._butler_collections import ButlerCollections
47
47
  from ._butler_config import ButlerConfig, ButlerType
48
48
  from ._butler_instance_options import ButlerInstanceOptions
49
+ from ._butler_metrics import ButlerMetrics
49
50
  from ._butler_repo_index import ButlerRepoIndex
50
51
  from ._config import Config, ConfigSubset
51
52
  from ._exceptions import EmptyQueryResultError, InvalidQueryError
@@ -154,6 +155,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
154
155
  writeable: bool | None = None,
155
156
  inferDefaults: bool = True,
156
157
  without_datastore: bool = False,
158
+ metrics: ButlerMetrics | None = None,
157
159
  **kwargs: Any,
158
160
  ) -> Butler:
159
161
  if cls is Butler:
@@ -165,6 +167,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
165
167
  writeable=writeable,
166
168
  inferDefaults=inferDefaults,
167
169
  without_datastore=without_datastore,
170
+ metrics=metrics,
168
171
  **kwargs,
169
172
  )
170
173
 
@@ -183,6 +186,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
183
186
  writeable: bool | None = None,
184
187
  inferDefaults: bool = True,
185
188
  without_datastore: bool = False,
189
+ metrics: ButlerMetrics | None = None,
186
190
  **kwargs: Any,
187
191
  ) -> Butler:
188
192
  """Create butler instance from configuration.
@@ -230,6 +234,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
230
234
  without_datastore : `bool`, optional
231
235
  If `True` do not attach a datastore to this butler. Any attempts
232
236
  to use a datastore will fail.
237
+ metrics : `ButlerMetrics` or `None`, optional
238
+ Metrics object to record butler usage statistics.
233
239
  **kwargs : `Any`
234
240
  Default data ID key-value pairs. These may only identify
235
241
  "governor" dimensions like ``instrument`` and ``skymap``.
@@ -300,6 +306,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
300
306
  # passing the "butler" parameter to its constructor. This has
301
307
  # been moved out of the constructor into Butler.clone().
302
308
  butler = kwargs.pop("butler", None)
309
+ metrics = metrics if metrics is not None else ButlerMetrics()
303
310
  if butler is not None:
304
311
  if not isinstance(butler, Butler):
305
312
  raise TypeError("'butler' parameter must be a Butler instance")
@@ -307,10 +314,17 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
307
314
  raise TypeError(
308
315
  "Cannot pass 'config', 'searchPaths', or 'writeable' arguments with 'butler' argument."
309
316
  )
310
- return butler.clone(collections=collections, run=run, inferDefaults=inferDefaults, dataId=kwargs)
317
+ return butler.clone(
318
+ collections=collections, run=run, inferDefaults=inferDefaults, metrics=metrics, dataId=kwargs
319
+ )
311
320
 
312
321
  options = ButlerInstanceOptions(
313
- collections=collections, run=run, writeable=writeable, inferDefaults=inferDefaults, kwargs=kwargs
322
+ collections=collections,
323
+ run=run,
324
+ writeable=writeable,
325
+ inferDefaults=inferDefaults,
326
+ metrics=metrics,
327
+ kwargs=kwargs,
314
328
  )
315
329
 
316
330
  # Load the Butler configuration. This may involve searching the
@@ -1741,8 +1755,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1741
1755
  warn_limit = True
1742
1756
  with self.query() as query:
1743
1757
  result = (
1744
- query.where(data_id, where, bind=bind, **kwargs)
1745
- .data_ids(dimensions)
1758
+ query.data_ids(dimensions)
1759
+ .where(data_id, where, bind=bind, **kwargs)
1746
1760
  .order_by(*ensure_iterable(order_by))
1747
1761
  .limit(query_limit)
1748
1762
  )
@@ -1979,8 +1993,8 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1979
1993
  warn_limit = True
1980
1994
  with self.query() as query:
1981
1995
  result = (
1982
- query.where(data_id, where, bind=bind, **kwargs)
1983
- .dimension_records(element)
1996
+ query.dimension_records(element)
1997
+ .where(data_id, where, bind=bind, **kwargs)
1984
1998
  .order_by(*ensure_iterable(order_by))
1985
1999
  .limit(query_limit)
1986
2000
  )
@@ -2123,6 +2137,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
2123
2137
  run: str | None | EllipsisType = ...,
2124
2138
  inferDefaults: bool | EllipsisType = ...,
2125
2139
  dataId: dict[str, str] | EllipsisType = ...,
2140
+ metrics: ButlerMetrics | None = None,
2126
2141
  ) -> Butler:
2127
2142
  """Return a new Butler instance connected to the same repository
2128
2143
  as this one, optionally overriding ``collections``, ``run``,
@@ -2142,5 +2157,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
2142
2157
  dataId : `str`
2143
2158
  Same as ``kwargs`` passed to the constructor. If omitted, copies
2144
2159
  values from original object.
2160
+ metrics : `ButlerMetrics` or `None`, optional
2161
+ Metrics object to record butler statistics.
2145
2162
  """
2146
2163
  raise NotImplementedError()
@@ -30,6 +30,8 @@ __all__ = ("ButlerInstanceOptions",)
30
30
  import dataclasses
31
31
  from typing import Any
32
32
 
33
+ from ._butler_metrics import ButlerMetrics
34
+
33
35
 
34
36
  @dataclasses.dataclass(frozen=True)
35
37
  class ButlerInstanceOptions:
@@ -43,4 +45,5 @@ class ButlerInstanceOptions:
43
45
  run: str | None = None
44
46
  writeable: bool | None = None
45
47
  inferDefaults: bool = True
48
+ metrics: ButlerMetrics = dataclasses.field(default_factory=ButlerMetrics)
46
49
  kwargs: dict[str, Any] = dataclasses.field(default_factory=dict)
@@ -0,0 +1,117 @@
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 Callable, Iterator
31
+ from contextlib import contextmanager
32
+
33
+ from pydantic import BaseModel
34
+
35
+ from lsst.utils.logging import LsstLoggers
36
+ from lsst.utils.timer import time_this
37
+
38
+
39
+ class ButlerMetrics(BaseModel):
40
+ """Metrics collected during Butler operations."""
41
+
42
+ time_in_put: float = 0.0
43
+ """Wall-clock time, in seconds, spent in put()."""
44
+
45
+ time_in_get: float = 0.0
46
+ """Wall-clock time, in seconds, spent in get()."""
47
+
48
+ n_get: int = 0
49
+ """Number of datasets retrieved with get()."""
50
+
51
+ n_put: int = 0
52
+ """Number of datasets stored with put()."""
53
+
54
+ def reset(self) -> None:
55
+ """Reset all metrics."""
56
+ self.time_in_put = 0.0
57
+ self.time_in_get = 0.0
58
+ self.n_get = 0
59
+ self.n_put = 0
60
+
61
+ def increment_get(self, duration: float) -> None:
62
+ """Increment time for get().
63
+
64
+ Parameters
65
+ ----------
66
+ duration : `float`
67
+ Duration to add to the get() statistics.
68
+ """
69
+ self.time_in_get += duration
70
+ self.n_get += 1
71
+
72
+ def increment_put(self, duration: float) -> None:
73
+ """Increment time for put().
74
+
75
+ Parameters
76
+ ----------
77
+ duration : `float`
78
+ Duration to add to the put() statistics.
79
+ """
80
+ self.time_in_put += duration
81
+ self.n_put += 1
82
+
83
+ @contextmanager
84
+ def _timer(
85
+ self, handler: Callable[[float], None], log: LsstLoggers | None = None, msg: str | None = None
86
+ ) -> Iterator[None]:
87
+ with time_this(log=log, msg=msg) as timer:
88
+ yield
89
+ handler(timer.duration)
90
+
91
+ @contextmanager
92
+ def instrument_get(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
93
+ """Run code and increment get statistics.
94
+
95
+ Parameters
96
+ ----------
97
+ log : `logging.Logger` or `None`
98
+ Logger to use for any timing information.
99
+ msg : `str` or `None`
100
+ Any message to be included in log output.
101
+ """
102
+ with self._timer(self.increment_get, log=log, msg=msg):
103
+ yield
104
+
105
+ @contextmanager
106
+ def instrument_put(self, log: LsstLoggers | None = None, msg: str | None = None) -> Iterator[None]:
107
+ """Run code and increment put statistics.
108
+
109
+ Parameters
110
+ ----------
111
+ log : `logging.Logger` or `None`
112
+ Logger to use for any timing information.
113
+ msg : `str` or `None`
114
+ Any message to be included in log output.
115
+ """
116
+ with self._timer(self.increment_put, log=log, msg=msg):
117
+ yield
@@ -66,8 +66,11 @@ from ._named import NamedKeyDict
66
66
  from .datastore.stored_file_info import StoredDatastoreItemInfo
67
67
  from .dimensions import (
68
68
  DataCoordinate,
69
+ DimensionDataAttacher,
70
+ DimensionDataExtractor,
69
71
  DimensionGroup,
70
72
  DimensionUniverse,
73
+ SerializableDimensionData,
71
74
  SerializedDataCoordinate,
72
75
  SerializedDataId,
73
76
  )
@@ -907,6 +910,62 @@ class MinimalistSerializableDatasetRef(pydantic.BaseModel):
907
910
  data_id: SerializedDataId
908
911
  """Data coordinate of this dataset."""
909
912
 
913
+ def to_dataset_ref(
914
+ self,
915
+ id: DatasetId,
916
+ *,
917
+ dataset_type: DatasetType,
918
+ universe: DimensionUniverse,
919
+ attacher: DimensionDataAttacher | None = None,
920
+ ) -> DatasetRef:
921
+ """Convert serialized object to a `DatasetRef`.
922
+
923
+ Parameters
924
+ ----------
925
+ id : `DatasetId`
926
+ UUID identifying the dataset.
927
+ dataset_type : `DatasetType`
928
+ `DatasetType` record corresponding to the dataset type name in the
929
+ serialized object.
930
+ universe : `DimensionUniverse`
931
+ Dimension universe for the dataset.
932
+ attacher : `DimensionDataAttacher`, optional
933
+ If provided, will be used to add dimension records to the
934
+ deserialized `DatasetRef` instance.
935
+
936
+ Returns
937
+ -------
938
+ ref : `DatasetRef`
939
+ The deserialized object.
940
+ """
941
+ assert dataset_type.name == self.dataset_type_name, (
942
+ "Given DatasetType does not match the serialized dataset type name"
943
+ )
944
+ simple_data_id = SerializedDataCoordinate(dataId=self.data_id)
945
+ data_id = DataCoordinate.from_simple(simple=simple_data_id, universe=universe)
946
+ if attacher:
947
+ data_ids = attacher.attach(dataset_type.dimensions, [data_id])
948
+ data_id = data_ids[0]
949
+ return DatasetRef(
950
+ id=id,
951
+ run=self.run,
952
+ datasetType=dataset_type,
953
+ dataId=data_id,
954
+ )
955
+
956
+ @staticmethod
957
+ def from_dataset_ref(ref: DatasetRef) -> MinimalistSerializableDatasetRef:
958
+ """Serialize a ``DatasetRef` to a simplified format.
959
+
960
+ Parameters
961
+ ----------
962
+ ref : `DatasetRef`
963
+ `DatasetRef` object to serialize.
964
+ """
965
+ return MinimalistSerializableDatasetRef(
966
+ dataset_type_name=ref.datasetType.name, run=ref.run, data_id=dict(ref.dataId.mapping)
967
+ )
968
+
910
969
 
911
970
  class SerializedDatasetRefContainer(pydantic.BaseModel):
912
971
  """Serializable model for a collection of DatasetRef.
@@ -938,6 +997,9 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
938
997
  compact_refs: dict[uuid.UUID, MinimalistSerializableDatasetRef]
939
998
  """Minimal dataset ref information indexed by UUID."""
940
999
 
1000
+ dimension_records: SerializableDimensionData | None = None
1001
+ """Dimension record information"""
1002
+
941
1003
  def __len__(self) -> int:
942
1004
  """Return the number of datasets in the container."""
943
1005
  return len(self.compact_refs)
@@ -957,19 +1019,32 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
957
1019
  universe: DimensionUniverse | None = None
958
1020
  dataset_types: dict[str, SerializedDatasetType] = {}
959
1021
  compact_refs: dict[uuid.UUID, MinimalistSerializableDatasetRef] = {}
1022
+ data_ids: list[DataCoordinate] = []
1023
+ dimensions: list[DimensionGroup] = []
960
1024
  for ref in refs:
961
- simple_ref = ref.to_simple()
962
- dataset_type = simple_ref.datasetType
963
- assert dataset_type is not None # For mypy
964
1025
  if universe is None:
965
1026
  universe = ref.datasetType.dimensions.universe
966
- if (name := dataset_type.name) not in dataset_types:
967
- dataset_types[name] = dataset_type
968
- data_id = simple_ref.dataId
969
- assert data_id is not None # For mypy
970
- compact_refs[simple_ref.id] = MinimalistSerializableDatasetRef(
971
- dataset_type_name=name, run=simple_ref.run, data_id=data_id.dataId
1027
+ if (name := ref.datasetType.name) not in dataset_types:
1028
+ dataset_types[name] = ref.datasetType.to_simple()
1029
+ compact_refs[ref.id] = MinimalistSerializableDatasetRef.from_dataset_ref(ref)
1030
+ if ref.dataId.hasRecords():
1031
+ dimensions.append(ref.datasetType.dimensions)
1032
+ data_ids.append(ref.dataId)
1033
+
1034
+ # Extract dimension record metadata if present.
1035
+ dimension_records = None
1036
+ if data_ids and len(compact_refs) == len(data_ids):
1037
+ dimension_group = DimensionGroup.union(*dimensions, universe=universe)
1038
+
1039
+ # Records were attached to all refs. Store them.
1040
+ extractor = DimensionDataExtractor.from_dimension_group(
1041
+ dimension_group,
1042
+ ignore_cached=False,
1043
+ include_skypix=False,
972
1044
  )
1045
+ extractor.update(data_ids)
1046
+ dimension_records = SerializableDimensionData.from_record_sets(extractor.records.values())
1047
+
973
1048
  if universe:
974
1049
  universe_version = universe.version
975
1050
  universe_namespace = universe.namespace
@@ -982,6 +1057,7 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
982
1057
  universe_namespace=universe_namespace,
983
1058
  dataset_types=dataset_types,
984
1059
  compact_refs=compact_refs,
1060
+ dimension_records=dimension_records,
985
1061
  )
986
1062
 
987
1063
  def to_refs(self, universe: DimensionUniverse) -> list[DatasetRef]:
@@ -1019,15 +1095,22 @@ class SerializedDatasetRefContainerV1(SerializedDatasetRefContainer):
1019
1095
  name: DatasetType.from_simple(dtype, universe=universe)
1020
1096
  for name, dtype in self.dataset_types.items()
1021
1097
  }
1098
+
1099
+ # Dimension records can be attached if available.
1100
+ # We assume that all dimension information was stored.
1101
+ attacher = None
1102
+ if self.dimension_records:
1103
+ attacher = DimensionDataAttacher(
1104
+ deserializers=self.dimension_records.make_deserializers(universe)
1105
+ )
1106
+
1022
1107
  refs: list[DatasetRef] = []
1023
1108
  for id_, minimal in self.compact_refs.items():
1024
- simple_data_id = SerializedDataCoordinate(dataId=minimal.data_id)
1025
- data_id = DataCoordinate.from_simple(simple=simple_data_id, universe=universe)
1026
- ref = DatasetRef(
1027
- id=id_,
1028
- run=minimal.run,
1029
- datasetType=dataset_types[minimal.dataset_type_name],
1030
- dataId=data_id,
1109
+ ref = minimal.to_dataset_ref(
1110
+ id_,
1111
+ dataset_type=dataset_types[minimal.dataset_type_name],
1112
+ universe=universe,
1113
+ attacher=attacher,
1031
1114
  )
1032
1115
  refs.append(ref)
1033
1116
  return refs
@@ -27,15 +27,21 @@
27
27
 
28
28
  from __future__ import annotations
29
29
 
30
- __all__ = ["FileDataset"]
30
+ __all__ = ("FileDataset", "SerializedFileDataset")
31
31
 
32
+ import uuid
33
+ from collections.abc import Callable
32
34
  from dataclasses import dataclass
33
- from typing import Any
35
+ from typing import Any, TypeAlias
36
+
37
+ import pydantic
34
38
 
35
39
  from lsst.resources import ResourcePath, ResourcePathExpression
36
40
 
37
- from ._dataset_ref import DatasetRef
41
+ from ._dataset_ref import DatasetRef, MinimalistSerializableDatasetRef
42
+ from ._dataset_type import DatasetType
38
43
  from ._formatter import FormatterParameter
44
+ from .dimensions import DimensionUniverse
39
45
 
40
46
 
41
47
  @dataclass
@@ -87,3 +93,72 @@ class FileDataset:
87
93
  if not isinstance(other, type(self)):
88
94
  return NotImplemented
89
95
  return str(self.path) < str(other.path)
96
+
97
+ def to_simple(self) -> SerializedFileDataset:
98
+ """
99
+ Convert this instance to a simplified, JSON-serializable object.
100
+
101
+ Returns
102
+ -------
103
+ serialized : `SerializedFileDataset`
104
+ Serializable representation of this `FileDataset` instance.
105
+ """
106
+ if self.formatter is None:
107
+ formatter = None
108
+ elif isinstance(self.formatter, str):
109
+ formatter = self.formatter
110
+ else:
111
+ formatter = self.formatter.name()
112
+
113
+ refs = {ref.id: MinimalistSerializableDatasetRef.from_dataset_ref(ref) for ref in self.refs}
114
+
115
+ return SerializedFileDataset(
116
+ refs=refs,
117
+ path=str(self.path),
118
+ formatter=formatter,
119
+ )
120
+
121
+ @staticmethod
122
+ def from_simple(
123
+ dataset: SerializedFileDataset, *, dataset_type_loader: DatasetTypeLoader, universe: DimensionUniverse
124
+ ) -> FileDataset:
125
+ """
126
+ Deserialize a `SerializedFileDataset` into a `FileDataset`.
127
+
128
+ Parameters
129
+ ----------
130
+ dataset : `SerializedFileDataset`
131
+ Object to deserialize.
132
+ dataset_type_loader : `Callable` [[ `str` ], `DatasetType` ]
133
+ Function that takes a string dataset type name as its
134
+ only parameter, and returns an instance of `DatasetType`.
135
+ Used to deserialize the `DatasetRef` instances contained
136
+ in the serialized `FileDataset`.
137
+ universe : `DimensionUniverse`
138
+ Dimension universe associated with the `Butler` instance that
139
+ created the serialized `FileDataset` instance.
140
+
141
+ Returns
142
+ -------
143
+ file_dataset : `FileDataset`
144
+ Deserialized equivalent of the input dataset.
145
+ """
146
+ refs = [
147
+ ref.to_dataset_ref(id, universe=universe, dataset_type=dataset_type_loader(ref.dataset_type_name))
148
+ for id, ref in dataset.refs.items()
149
+ ]
150
+ return FileDataset(path=dataset.path, refs=refs, formatter=dataset.formatter)
151
+
152
+
153
+ DatasetTypeLoader: TypeAlias = Callable[[str], DatasetType]
154
+ """Type signature for a function that takes a string dataset type name as its
155
+ only parameter, and returns an instance of `DatasetType`.
156
+ """
157
+
158
+
159
+ class SerializedFileDataset(pydantic.BaseModel):
160
+ """Serializable format of `FileDataset` object."""
161
+
162
+ refs: dict[uuid.UUID, MinimalistSerializableDatasetRef]
163
+ path: str
164
+ formatter: str | None = None
@@ -31,11 +31,13 @@ __all__ = ("LimitedButler",)
31
31
 
32
32
  import logging
33
33
  from abc import ABC, abstractmethod
34
- from collections.abc import Iterable
34
+ from collections.abc import Iterable, Iterator
35
+ from contextlib import contextmanager
35
36
  from typing import Any, ClassVar
36
37
 
37
38
  from lsst.resources import ResourcePath
38
39
 
40
+ from ._butler_metrics import ButlerMetrics
39
41
  from ._dataset_provenance import DatasetProvenance
40
42
  from ._dataset_ref import DatasetRef
41
43
  from ._deferredDatasetHandle import DeferredDatasetHandle
@@ -138,7 +140,8 @@ class LimitedButler(ABC):
138
140
  to use a resolved `DatasetRef`. Subclasses can support more options.
139
141
  """
140
142
  log.debug("Butler get: %s, parameters=%s, storageClass: %s", ref, parameters, storageClass)
141
- return self._datastore.get(ref, parameters=parameters, storageClass=storageClass)
143
+ with self._metrics.instrument_get(log, msg="Retrieved dataset"):
144
+ return self._datastore.get(ref, parameters=parameters, storageClass=storageClass)
142
145
 
143
146
  def getDeferred(
144
147
  self,
@@ -415,6 +418,30 @@ class LimitedButler(ABC):
415
418
  """
416
419
  raise NotImplementedError()
417
420
 
421
+ @contextmanager
422
+ def record_metrics(self, metrics: ButlerMetrics | None = None) -> Iterator[ButlerMetrics]:
423
+ """Enable new metrics recording context.
424
+
425
+ Parameters
426
+ ----------
427
+ metrics : `lsst.daf.butler.ButlerMetrics`
428
+ Optional override metrics object. If given, this will be the
429
+ same object returned by the context manager.
430
+
431
+ Yields
432
+ ------
433
+ metrics : `lsst.daf.butler.ButlerMetrics`
434
+ Metrics recorded within this context. This temporarily replaces
435
+ any existing metrics object associated with this butler.
436
+ """
437
+ old_metrics = self._metrics
438
+ new_metrics = metrics if metrics is not None else ButlerMetrics()
439
+ try:
440
+ self._metrics = new_metrics
441
+ yield new_metrics
442
+ finally:
443
+ self._metrics = old_metrics
444
+
418
445
  @property
419
446
  @abstractmethod
420
447
  def dimensions(self) -> DimensionUniverse:
@@ -430,3 +457,8 @@ class LimitedButler(ABC):
430
457
  """An object that maps known storage class names to objects that fully
431
458
  describe them (`StorageClassFactory`).
432
459
  """
460
+
461
+ _metrics: ButlerMetrics
462
+ """An object for recording metrics associated with this butler.
463
+ (`ButlerMetrics`)
464
+ """