lsst-daf-butler 29.2025.2700__tar.gz → 29.2025.2900__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 (445) hide show
  1. {lsst_daf_butler-29.2025.2700/python/lsst_daf_butler.egg-info → lsst_daf_butler-29.2025.2900}/PKG-INFO +1 -1
  2. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/queries.rst +30 -3
  3. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/writing-subcommands.rst +2 -0
  4. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler.py +1 -1
  5. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/_transfer.py +4 -4
  6. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_group.py +25 -0
  7. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_expression_strings.py +71 -6
  8. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/_base.py +13 -5
  9. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_database.py +0 -2
  10. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/_predicate.py +34 -0
  11. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/check.py +20 -0
  12. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/normalForm.py +27 -0
  13. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/exprTree.py +153 -6
  14. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/treeVisitor.py +66 -1
  15. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/tests/_registry.py +25 -1
  16. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/butler_queries.py +30 -14
  17. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/spatial.py +54 -9
  18. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/spatial.yaml +1 -1
  19. lsst_daf_butler-29.2025.2900/python/lsst/daf/butler/version.py +2 -0
  20. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900/python/lsst_daf_butler.egg-info}/PKG-INFO +1 -1
  21. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_dimensions.py +18 -0
  22. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_exprParserYacc.py +202 -0
  23. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_normalFormExpression.py +12 -0
  24. lsst_daf_butler-29.2025.2700/python/lsst/daf/butler/version.py +0 -2
  25. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/COPYRIGHT +0 -0
  26. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/LICENSE +0 -0
  27. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/MANIFEST.in +0 -0
  28. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/README.md +0 -0
  29. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/bsd_license.txt +0 -0
  30. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/CHANGES.rst +0 -0
  31. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/concreteStorageClasses.rst +0 -0
  32. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/configuring.rst +0 -0
  33. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/datastores.rst +0 -0
  34. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/dimensions.rst +0 -0
  35. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/formatters.rst +0 -0
  36. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/index.rst +0 -0
  37. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/organizing.rst +0 -0
  38. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/doc/lsst.daf.butler/use-in-tests.rst +0 -0
  39. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/gpl-v3.0.txt +0 -0
  40. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/pyproject.toml +0 -0
  41. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/__init__.py +0 -0
  42. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/__init__.py +0 -0
  43. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/__init__.py +0 -0
  44. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_collections.py +0 -0
  45. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_config.py +0 -0
  46. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_instance_options.py +0 -0
  47. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_metrics.py +0 -0
  48. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_butler_repo_index.py +0 -0
  49. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_collection_type.py +0 -0
  50. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_column_categorization.py +0 -0
  51. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_column_tags.py +0 -0
  52. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_column_type_info.py +0 -0
  53. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_config.py +0 -0
  54. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_config_support.py +0 -0
  55. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_association.py +0 -0
  56. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_existence.py +0 -0
  57. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_provenance.py +0 -0
  58. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_ref.py +0 -0
  59. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_dataset_type.py +0 -0
  60. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_deferredDatasetHandle.py +0 -0
  61. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_exceptions.py +0 -0
  62. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_exceptions_legacy.py +0 -0
  63. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_file_dataset.py +0 -0
  64. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_file_descriptor.py +0 -0
  65. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_formatter.py +0 -0
  66. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_labeled_butler_factory.py +0 -0
  67. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_limited_butler.py +0 -0
  68. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_location.py +0 -0
  69. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_named.py +0 -0
  70. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_quantum.py +0 -0
  71. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_quantum_backed.py +0 -0
  72. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_query_all_datasets.py +0 -0
  73. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_registry_shim.py +0 -0
  74. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_storage_class.py +0 -0
  75. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_storage_class_delegate.py +0 -0
  76. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_timespan.py +0 -0
  77. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_topology.py +0 -0
  78. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/__init__.py +0 -0
  79. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/locked_object.py +0 -0
  80. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/named_locks.py +0 -0
  81. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/_utilities/thread_safe_cache.py +0 -0
  82. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/arrow_utils.py +0 -0
  83. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/__init__.py +0 -0
  84. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/butler.py +0 -0
  85. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cliLog.py +0 -0
  86. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/__init__.py +0 -0
  87. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/_remove_collections.py +0 -0
  88. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/_remove_runs.py +0 -0
  89. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/cmd/commands.py +0 -0
  90. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/__init__.py +0 -0
  91. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/arguments.py +0 -0
  92. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/optionGroups.py +0 -0
  93. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/opt/options.py +0 -0
  94. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/progress.py +0 -0
  95. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/cli/utils.py +0 -0
  96. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/column_spec.py +0 -0
  97. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastore.yaml +0 -0
  98. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/composites.yaml +0 -0
  99. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/fileDatastore.yaml +0 -0
  100. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/formatters.yaml +0 -0
  101. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/datastores/writeRecipes.yaml +0 -0
  102. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/dimensions.yaml +0 -0
  103. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe0.yaml +0 -0
  104. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe1.yaml +0 -0
  105. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe2.yaml +0 -0
  106. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe3.yaml +0 -0
  107. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe4.yaml +0 -0
  108. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe5.yaml +0 -0
  109. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe6.yaml +0 -0
  110. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/old_dimensions/daf_butler_universe7.yaml +0 -0
  111. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/registry.yaml +0 -0
  112. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/repo_transfer_formats.yaml +0 -0
  113. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/configs/storageClasses.yaml +0 -0
  114. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/__init__.py +0 -0
  115. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/_datastore.py +0 -0
  116. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/cache_manager.py +0 -0
  117. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/composites.py +0 -0
  118. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/constraints.py +0 -0
  119. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/file_templates.py +0 -0
  120. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/generic_base.py +0 -0
  121. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/record_data.py +0 -0
  122. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastore/stored_file_info.py +0 -0
  123. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/__init__.py +0 -0
  124. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/chainedDatastore.py +0 -0
  125. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/fileDatastore.py +0 -0
  126. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/fileDatastoreClient.py +0 -0
  127. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/__init__.py +0 -0
  128. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/get.py +0 -0
  129. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/retrieve_artifacts.py +0 -0
  130. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/file_datastore/transfer.py +0 -0
  131. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/datastores/inMemoryDatastore.py +0 -0
  132. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/ddl.py +0 -0
  133. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/delegates/__init__.py +0 -0
  134. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/delegates/arrowtable.py +0 -0
  135. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/__init__.py +0 -0
  136. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_config.py +0 -0
  137. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_coordinate.py +0 -0
  138. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_data_coordinate_iterable.py +0 -0
  139. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_database.py +0 -0
  140. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_elements.py +0 -0
  141. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_governor.py +0 -0
  142. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_packer.py +0 -0
  143. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_record_set.py +0 -0
  144. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_record_table.py +0 -0
  145. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_records.py +0 -0
  146. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_schema.py +0 -0
  147. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_skypix.py +0 -0
  148. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/_universe.py +0 -0
  149. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/construction.py +0 -0
  150. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/dimensions/record_cache.py +0 -0
  151. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_butler/__init__.py +0 -0
  152. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_butler/_direct_butler.py +0 -0
  153. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_butler/_direct_butler_collections.py +0 -0
  154. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/__init__.py +0 -0
  155. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_driver.py +0 -0
  156. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_postprocessing.py +0 -0
  157. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_query_analysis.py +0 -0
  158. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_query_builder.py +0 -0
  159. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_result_page_converter.py +0 -0
  160. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_sql_builders.py +0 -0
  161. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/direct_query_driver/_sql_column_visitor.py +0 -0
  162. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/__init__.py +0 -0
  163. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/astropyTable.py +0 -0
  164. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/file.py +0 -0
  165. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/json.py +0 -0
  166. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/logs.py +0 -0
  167. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/matplotlib.py +0 -0
  168. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/packages.py +0 -0
  169. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/parquet.py +0 -0
  170. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/pickle.py +0 -0
  171. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/typeless.py +0 -0
  172. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/formatters/yaml.py +0 -0
  173. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/json.py +0 -0
  174. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/logging.py +0 -0
  175. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/mapping_factory.py +0 -0
  176. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/name_shrinker.py +0 -0
  177. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/nonempty_mapping.py +0 -0
  178. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/persistence_context.py +0 -0
  179. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/progress.py +0 -0
  180. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/py.typed +0 -0
  181. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/pydantic_utils.py +0 -0
  182. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/__init__.py +0 -0
  183. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_base.py +0 -0
  184. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_data_coordinate_query_results.py +0 -0
  185. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_dataset_query_results.py +0 -0
  186. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_dimension_record_query_results.py +0 -0
  187. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_general_query_results.py +0 -0
  188. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_identifiers.py +0 -0
  189. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/_query.py +0 -0
  190. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/convert_args.py +0 -0
  191. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/driver.py +0 -0
  192. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/expression_factory.py +0 -0
  193. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/overlaps.py +0 -0
  194. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/predicate_constraints_summary.py +0 -0
  195. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/result_specs.py +0 -0
  196. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/__init__.py +0 -0
  197. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_base.py +0 -0
  198. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_expression.py +0 -0
  199. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_literal.py +0 -0
  200. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_reference.py +0 -0
  201. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_column_set.py +0 -0
  202. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_predicate.py +0 -0
  203. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/tree/_query_tree.py +0 -0
  204. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/queries/visitors.py +0 -0
  205. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/__init__.py +0 -0
  206. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_caching_context.py +0 -0
  207. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_collection_record_cache.py +0 -0
  208. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_collection_summary.py +0 -0
  209. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_collection_summary_cache.py +0 -0
  210. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_config.py +0 -0
  211. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_defaults.py +0 -0
  212. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_exceptions.py +0 -0
  213. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_registry.py +0 -0
  214. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/_registry_factory.py +0 -0
  215. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/attributes.py +0 -0
  216. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/bridge/__init__.py +0 -0
  217. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/bridge/ephemeral.py +0 -0
  218. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/bridge/monolithic.py +0 -0
  219. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/__init__.py +0 -0
  220. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/nameKey.py +0 -0
  221. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/collections/synthIntKey.py +0 -0
  222. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/connectionString.py +0 -0
  223. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/databases/__init__.py +0 -0
  224. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/databases/postgresql.py +0 -0
  225. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/databases/sqlite.py +0 -0
  226. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/__init__.py +0 -0
  227. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/__init__.py +0 -0
  228. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/_dataset_type_cache.py +0 -0
  229. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/_manager.py +0 -0
  230. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/summaries.py +0 -0
  231. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/datasets/byDimensions/tables.py +0 -0
  232. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/dimensions/__init__.py +0 -0
  233. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/dimensions/static.py +0 -0
  234. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/__init__.py +0 -0
  235. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_attributes.py +0 -0
  236. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_bridge.py +0 -0
  237. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_collections.py +0 -0
  238. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_database_explain.py +0 -0
  239. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_datasets.py +0 -0
  240. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_dimensions.py +0 -0
  241. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_obscore.py +0 -0
  242. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_opaque.py +0 -0
  243. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/interfaces/_versioning.py +0 -0
  244. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/managers.py +0 -0
  245. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/nameShrinker.py +0 -0
  246. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/__init__.py +0 -0
  247. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_config.py +0 -0
  248. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_manager.py +0 -0
  249. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_records.py +0 -0
  250. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_schema.py +0 -0
  251. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/_spatial.py +0 -0
  252. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/default_spatial.py +0 -0
  253. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/obscore/pgsphere.py +0 -0
  254. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/opaque.py +0 -0
  255. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/__init__.py +0 -0
  256. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_builder.py +0 -0
  257. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_query.py +0 -0
  258. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_query_backend.py +0 -0
  259. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_query_context.py +0 -0
  260. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_readers.py +0 -0
  261. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_results.py +0 -0
  262. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_sql_query_backend.py +0 -0
  263. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_sql_query_context.py +0 -0
  264. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/_structs.py +0 -0
  265. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/butler_sql_engine.py +0 -0
  266. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/__init__.py +0 -0
  267. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/categorize.py +0 -0
  268. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/__init__.py +0 -0
  269. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/parser.py +0 -0
  270. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/parserLex.py +0 -0
  271. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/parserYacc.py +0 -0
  272. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/__init__.py +0 -0
  273. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/lex.py +0 -0
  274. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/expressions/parser/ply/yacc.py +0 -0
  275. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/queries/find_first_dataset.py +0 -0
  276. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/sql_registry.py +0 -0
  277. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/tests/__init__.py +0 -0
  278. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/tests/_database.py +0 -0
  279. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/versions.py +0 -0
  280. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/registry/wildcards.py +0 -0
  281. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/__init__.py +0 -0
  282. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_authentication.py +0 -0
  283. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_collection_args.py +0 -0
  284. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_config.py +0 -0
  285. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_defaults.py +0 -0
  286. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_errors.py +0 -0
  287. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_factory.py +0 -0
  288. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_http_connection.py +0 -0
  289. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_query_driver.py +0 -0
  290. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_query_results.py +0 -0
  291. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_ref_utils.py +0 -0
  292. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_registry.py +0 -0
  293. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_remote_butler.py +0 -0
  294. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_remote_butler_collections.py +0 -0
  295. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/_remote_file_transfer_source.py +0 -0
  296. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/__init__.py +0 -0
  297. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_common.py +0 -0
  298. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_data_coordinates.py +0 -0
  299. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_datasets.py +0 -0
  300. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/registry/_query_dimension_records.py +0 -0
  301. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/__init__.py +0 -0
  302. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_config.py +0 -0
  303. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_dependencies.py +0 -0
  304. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_factory.py +0 -0
  305. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_gafaelfawr.py +0 -0
  306. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_server.py +0 -0
  307. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/_telemetry.py +0 -0
  308. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_external.py +0 -0
  309. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_external_query.py +0 -0
  310. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_internal.py +0 -0
  311. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_limits.py +0 -0
  312. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_serialization.py +0 -0
  313. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_query_streaming.py +0 -0
  314. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server/handlers/_utils.py +0 -0
  315. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/remote_butler/server_models.py +0 -0
  316. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/repo_relocation.py +0 -0
  317. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/__init__.py +0 -0
  318. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/_associate.py +0 -0
  319. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/_pruneDatasets.py +0 -0
  320. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/butlerImport.py +0 -0
  321. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/certifyCalibrations.py +0 -0
  322. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/collectionChain.py +0 -0
  323. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/configDump.py +0 -0
  324. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/configValidate.py +0 -0
  325. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/createRepo.py +0 -0
  326. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/exportCalibs.py +0 -0
  327. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/ingest_files.py +0 -0
  328. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/ingest_zip.py +0 -0
  329. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryCollections.py +0 -0
  330. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDataIds.py +0 -0
  331. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDatasetTypes.py +0 -0
  332. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDatasets.py +0 -0
  333. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/queryDimensionRecords.py +0 -0
  334. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/register_dataset_type.py +0 -0
  335. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/removeCollections.py +0 -0
  336. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/removeDatasetType.py +0 -0
  337. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/removeRuns.py +0 -0
  338. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/retrieveArtifacts.py +0 -0
  339. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/script/transferDatasets.py +0 -0
  340. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/__init__.py +0 -0
  341. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_datasetsHelper.py +0 -0
  342. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_dummyRegistry.py +0 -0
  343. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_examplePythonTypes.py +0 -0
  344. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/_testRepo.py +0 -0
  345. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/cliCmdTestBase.py +0 -0
  346. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/cliLogTestBase.py +0 -0
  347. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/deferredFormatter.py +0 -0
  348. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/dict_convertible_model.py +0 -0
  349. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/hybrid_butler.py +0 -0
  350. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/hybrid_butler_collections.py +0 -0
  351. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/hybrid_butler_registry.py +0 -0
  352. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/postgresql.py +0 -0
  353. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/__init__.py +0 -0
  354. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/base.yaml +0 -0
  355. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset-skymap.yaml +0 -0
  356. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/ci_hsc-subset.yaml +0 -0
  357. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/datasets.yaml +0 -0
  358. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/registry_data/hsc-rc2-subset-v0.yaml +0 -0
  359. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/server.py +0 -0
  360. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/server_utils.py +0 -0
  361. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/testFormatters.py +0 -0
  362. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/tests/utils.py +0 -0
  363. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/time_utils.py +0 -0
  364. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/timespan_database_representation.py +0 -0
  365. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/__init__.py +0 -0
  366. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/_context.py +0 -0
  367. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/_interfaces.py +0 -0
  368. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/transfers/_yaml.py +0 -0
  369. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst/daf/butler/utils.py +0 -0
  370. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/SOURCES.txt +0 -0
  371. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/dependency_links.txt +0 -0
  372. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/entry_points.txt +0 -0
  373. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/requires.txt +0 -0
  374. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/top_level.txt +0 -0
  375. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/python/lsst_daf_butler.egg-info/zip-safe +0 -0
  376. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/setup.cfg +0 -0
  377. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_astropyTableFormatter.py +0 -0
  378. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_authentication.py +0 -0
  379. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_butler.py +0 -0
  380. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_butler_factory.py +0 -0
  381. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdAssociate.py +0 -0
  382. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdConfigDump.py +0 -0
  383. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdConfigValidate.py +0 -0
  384. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdCreate.py +0 -0
  385. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdImport.py +0 -0
  386. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdIngestFiles.py +0 -0
  387. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdPruneDatasets.py +0 -0
  388. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryCollections.py +0 -0
  389. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDataIds.py +0 -0
  390. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDatasetTypes.py +0 -0
  391. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDatasets.py +0 -0
  392. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdQueryDimensionRecords.py +0 -0
  393. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdRemoveCollections.py +0 -0
  394. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdRemoveRuns.py +0 -0
  395. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliCmdRetrieveArtifacts.py +0 -0
  396. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliLog.py +0 -0
  397. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliPluginLoader.py +0 -0
  398. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtilSplitCommas.py +0 -0
  399. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtilSplitKv.py +0 -0
  400. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtilToUpper.py +0 -0
  401. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_cliUtils.py +0 -0
  402. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_column_spec.py +0 -0
  403. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_composites.py +0 -0
  404. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_config.py +0 -0
  405. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_connectionString.py +0 -0
  406. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_constraints.py +0 -0
  407. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_datasets.py +0 -0
  408. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_datastore.py +0 -0
  409. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_ddl.py +0 -0
  410. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_dimension_record_containers.py +0 -0
  411. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_exprParserLex.py +0 -0
  412. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_expressions.py +0 -0
  413. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_formatter.py +0 -0
  414. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_gafaelfawr.py +0 -0
  415. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_location.py +0 -0
  416. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_logFormatter.py +0 -0
  417. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_logging.py +0 -0
  418. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_matplotlibFormatter.py +0 -0
  419. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_nonempty_mapping.py +0 -0
  420. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_obscore.py +0 -0
  421. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_packages.py +0 -0
  422. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_parquet.py +0 -0
  423. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_postgresql.py +0 -0
  424. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_progress.py +0 -0
  425. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_pydantic_utils.py +0 -0
  426. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_quantum.py +0 -0
  427. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_quantumBackedButler.py +0 -0
  428. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_direct_postgresql.py +0 -0
  429. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_direct_sqlite.py +0 -0
  430. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_interface.py +0 -0
  431. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_relations.py +0 -0
  432. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_remote.py +0 -0
  433. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_query_utilities.py +0 -0
  434. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_remote_butler.py +0 -0
  435. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_server.py +0 -0
  436. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_simpleButler.py +0 -0
  437. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_sqlite.py +0 -0
  438. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_storageClass.py +0 -0
  439. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_templates.py +0 -0
  440. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_testRepo.py +0 -0
  441. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_thread_utils.py +0 -0
  442. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_time_utils.py +0 -0
  443. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_timespan.py +0 -0
  444. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/tests/test_utils.py +0 -0
  445. {lsst_daf_butler-29.2025.2700 → lsst_daf_butler-29.2025.2900}/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.2700
3
+ Version: 29.2025.2900
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
@@ -327,6 +327,12 @@ where ``ra`` and ``dec`` are specified as an ICRS sky position in degrees.
327
327
 
328
328
  visit.region OVERLAPS POINT(53.6, -32.7)
329
329
 
330
+ All types of regions supported by the language will work with ``OVERLAP`` as well.
331
+
332
+ .. code-block:: sql
333
+
334
+ visit.region OVERLAPS BOX(53.6, -32.7, 1, 1)
335
+
330
336
  You can check overlaps with arbitrary sky regions by binding values (see
331
337
  :ref:`daf_butler_dimension_expressions_identifiers`). Bound region values may
332
338
  be specified as the following object types:
@@ -364,16 +370,37 @@ consists of an identifier followed by zero or more comma-separated arguments
364
370
  enclosed in parentheses (e.g. ``func(1, 2, 3)``). An argument to a function
365
371
  can be any expression. Names of the functions are not case-sensitive.
366
372
 
367
- Presently the following functions are implemented in the query language:
373
+ A small set of functions is implemented in the query language presently.
374
+
375
+ Functions supporting operations on strings:
368
376
 
369
- - ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
370
- similarly to ADQL syntax.
371
377
  - ``GLOB(expression, pattern)`` - performs case-sensitive match of a string
372
378
  ``expression`` against ``pattern``. Pattern can include ``*`` and ``?``
373
379
  meta-characters, matching any number of characters or a single character
374
380
  respectfully. All other characters in pattern are matched literally, and
375
381
  whole expression string has to match for ``GLOB()`` to return ``True``.
376
382
 
383
+ Functions for defining sky coordinates or regions. All these functions accept
384
+ either numeric literals or bind identifiers (``:name`` syntax):
385
+
386
+ - ``POINT(ra, dec)`` - function which declares (or returns) sky coordinates
387
+ similarly to ADQL syntax, arguments are in degrees.
388
+ - ``CIRCLE(ra, dec, radius)`` - function which returns circular sky region,
389
+ all arguments are in degrees.
390
+ - ``BOX(center_ra, center_dec, width, height)`` - function which returns box
391
+ sky region, all arguments are in degrees.
392
+ - ``POLYGON(ra1, dec1, ra2, dec2, ...)`` - function which returns polygonal
393
+ sky region, all arguments are in degrees, at least three pairs of coordinates
394
+ have to be provided. Note that implementation for this function is based on
395
+ ``lsst.sphgeom.ConvexPolygon`` class which builds a convex hull out of all
396
+ vertices, thus ignoring their order. This is not strictly consistent with
397
+ ADQL definition that relies on ordering of the vertices and allows non-convex
398
+ polygons.
399
+ - ``REGION('string')`` - function returning sky region, string argument uses
400
+ `IVOA SIAv2 POS`_ syntax. Same caveat applies as for ``POLYGON`` function.
401
+
402
+ .. _IVOA SIAv2 POS: https://ivoa.net/documents/SIA/20151223/REC-SIA-2.0-20151223.html#toc12
403
+
377
404
 
378
405
  .. _time-literals-syntax:
379
406
 
@@ -433,6 +433,8 @@ An example implementation is:
433
433
 
434
434
  Which should be sufficient for most implementations where the commands are already stored in ``__all__``.
435
435
 
436
+ .. _Manifest:
437
+
436
438
  Manifest (Deprecated)
437
439
  ---------------------
438
440
 
@@ -1828,7 +1828,7 @@ class Butler(LimitedButler): # numpydoc ignore=PR02
1828
1828
  provided, the default collections are used. Can be a wildcard if
1829
1829
  ``find_first`` is `False` (if find first is requested the order
1830
1830
  of collections matters and wildcards make the order indeterminate).
1831
- See :ref:`daf_butler_collection_expressions` for more information.
1831
+ See :ref:`daf_butler_collection_expressions` for more information.
1832
1832
  find_first : `bool`, optional
1833
1833
  If `True` (default), for each result data ID, only yield one
1834
1834
  `DatasetRef` of each `DatasetType`, from the first collection in
@@ -56,8 +56,8 @@ class FileTransferSource(Protocol):
56
56
  dataset_ids : `~collections.abc.Iterable` [ `DatasetId` ]
57
57
  List of dataset IDs for which we will retrieve file information.
58
58
 
59
- Return
60
- ------
59
+ Returns
60
+ -------
61
61
  transfer_map : `FileTransferMap`
62
62
  Dictionary from `DatasetId` to a list of files found for that
63
63
  dataset. If information about any given dataset IDs could not
@@ -78,8 +78,8 @@ class FileTransferSource(Protocol):
78
78
  Optional mapping of datastore artifact to existence. Updated by
79
79
  this method with details of all artifacts tested.
80
80
 
81
- Return
82
- ------
81
+ Returns
82
+ -------
83
83
  transfer_map : `FileTransferMap`
84
84
  Dictionary from `DatasetId` to a list of files found for that
85
85
  dataset. If information about any given dataset IDs could not
@@ -414,12 +414,37 @@ class DimensionGroup: # numpydoc ignore=PR02
414
414
  names = set(self.names).intersection(*[other.names for other in others])
415
415
  return DimensionGroup(self.universe, names=names)
416
416
 
417
+ def difference(self, other: DimensionGroup) -> DimensionGroup:
418
+ """Construct a new group with dimensions that are in ``self`` but not
419
+ ``other`` OR dependencies of those in ``self`` but not in ``other``.
420
+
421
+ Parameters
422
+ ----------
423
+ other : `DimensionGroup`
424
+ Other group to compare with.
425
+
426
+ Returns
427
+ -------
428
+ diff : `DimensionGroup`
429
+ Difference of the two groups.
430
+
431
+ Notes
432
+ -----
433
+ This is not exactly equivalent to a true `set` difference, because the
434
+ result must be expanded to include required and implied dependencies,
435
+ and those may be common to ``self`` and ``other``.
436
+ """
437
+ return DimensionGroup(self.universe, names=self.names - other.names)
438
+
417
439
  def __or__(self, other: DimensionGroup) -> DimensionGroup:
418
440
  return self.union(other)
419
441
 
420
442
  def __and__(self, other: DimensionGroup) -> DimensionGroup:
421
443
  return self.intersection(other)
422
444
 
445
+ def __sub__(self, other: DimensionGroup) -> DimensionGroup:
446
+ return self.difference(other)
447
+
423
448
  @property
424
449
  def data_coordinate_keys(self) -> Set[str]:
425
450
  """A set of dimensions ordered like `DataCoordinate.mapping`.
@@ -40,7 +40,17 @@ from .._timespan import Timespan
40
40
  from ..column_spec import ColumnType
41
41
  from ..dimensions import DimensionUniverse
42
42
  from ..registry.queries.expressions.categorize import ExpressionConstant, categorizeConstant
43
- from ..registry.queries.expressions.parser import Node, PointNode, RangeLiteral, TreeVisitor, parse_expression
43
+ from ..registry.queries.expressions.parser import (
44
+ BoxNode,
45
+ CircleNode,
46
+ Node,
47
+ PointNode,
48
+ PolygonNode,
49
+ RangeLiteral,
50
+ RegionNode,
51
+ TreeVisitor,
52
+ parse_expression,
53
+ )
44
54
  from ._identifiers import IdentifierContext, interpret_identifier
45
55
  from .tree import (
46
56
  BinaryExpression,
@@ -251,12 +261,67 @@ class _ConversionVisitor(TreeVisitor[_VisitorResult]):
251
261
  return expression
252
262
 
253
263
  def visitPointNode(self, ra: _VisitorResult, dec: _VisitorResult, node: PointNode) -> _VisitorResult:
254
- ra_value = _get_float_literal_value(ra, node.ra)
255
- dec_value = _get_float_literal_value(dec, node.dec)
264
+ ra_value = _get_float_literal_value(ra, node.ra, "POINT")
265
+ dec_value = _get_float_literal_value(dec, node.dec, "POINT")
256
266
 
257
267
  lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
258
268
  return _make_literal(lon_lat)
259
269
 
270
+ def visitCircleNode(
271
+ self, ra: _VisitorResult, dec: _VisitorResult, radius: _VisitorResult, node: CircleNode
272
+ ) -> _VisitorResult:
273
+ ra_value = _get_float_literal_value(ra, node.ra, "CIRCLE")
274
+ dec_value = _get_float_literal_value(dec, node.dec, "CIRCLE")
275
+ radius_value = _get_float_literal_value(radius, node.radius, "CIRCLE")
276
+
277
+ lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
278
+ open_angle = lsst.sphgeom.Angle.fromDegrees(radius_value * 2)
279
+ vec = lsst.sphgeom.UnitVector3d(lon_lat)
280
+ circle = lsst.sphgeom.Circle(vec, open_angle)
281
+ return _make_literal(circle)
282
+
283
+ def visitBoxNode(
284
+ self,
285
+ ra: _VisitorResult,
286
+ dec: _VisitorResult,
287
+ width: _VisitorResult,
288
+ height: _VisitorResult,
289
+ node: BoxNode,
290
+ ) -> _VisitorResult:
291
+ ra_value = _get_float_literal_value(ra, node.ra, "BOX")
292
+ dec_value = _get_float_literal_value(dec, node.dec, "BOX")
293
+ width_value = _get_float_literal_value(width, node.width, "BOX")
294
+ height_value = _get_float_literal_value(height, node.height, "BOX")
295
+
296
+ lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
297
+ half_width = lsst.sphgeom.Angle.fromDegrees(width_value / 2)
298
+ half_height = lsst.sphgeom.Angle.fromDegrees(height_value / 2)
299
+ box = lsst.sphgeom.Box(lon_lat, half_width, half_height)
300
+ return _make_literal(box)
301
+
302
+ def visitPolygonNode(
303
+ self, vertices: list[tuple[_VisitorResult, _VisitorResult]], node: PolygonNode
304
+ ) -> _VisitorResult:
305
+ sphgeom_vertices = []
306
+ for ra, dec in vertices:
307
+ ra_value = _get_float_literal_value(ra, node, "POLYGON")
308
+ dec_value = _get_float_literal_value(dec, node, "POLYGON")
309
+ lon_lat = lsst.sphgeom.LonLat.fromDegrees(ra_value, dec_value)
310
+ sphgeom_vertices.append(lsst.sphgeom.UnitVector3d(lon_lat))
311
+
312
+ polygon = lsst.sphgeom.ConvexPolygon(sphgeom_vertices)
313
+ return _make_literal(polygon)
314
+
315
+ def visitRegionNode(self, pos: _VisitorResult, node: RegionNode) -> _VisitorResult:
316
+ if isinstance(pos, _ColExpr):
317
+ expr = pos.value
318
+ if expr.expression_type == "string":
319
+ pos_str = expr.value
320
+ region = lsst.sphgeom.Region.from_ivoa_pos(pos_str)
321
+ return _make_literal(region)
322
+
323
+ raise InvalidQueryError(f"Expression '{node.pos}' in REGION() is not a literal string.")
324
+
260
325
  def visitRangeLiteral(
261
326
  self, start: int, stop: int, stride: int | None, node: RangeLiteral
262
327
  ) -> _VisitorResult:
@@ -379,7 +444,7 @@ def _get_boolean_column_reference(predicate: Predicate) -> ColumnReference | Non
379
444
  return None
380
445
 
381
446
 
382
- def _get_float_literal_value(value: _VisitorResult, node: Node) -> float:
447
+ def _get_float_literal_value(value: _VisitorResult, node: Node, name: str) -> float:
383
448
  """If the given ``value`` is a literal `float` or `int` expression, return
384
449
  it as a float. Otherwise raise an `InvalidQueryError` identifying a
385
450
  problem with the given ``node``.
@@ -391,6 +456,6 @@ def _get_float_literal_value(value: _VisitorResult, node: Node) -> float:
391
456
  elif expr.expression_type == "int":
392
457
  return float(expr.value)
393
458
  elif expr.expression_type == "unary" and expr.operator == "-":
394
- return -1 * _get_float_literal_value(_ColExpr(expr.operand), node)
459
+ return -1 * _get_float_literal_value(_ColExpr(expr.operand), node, name)
395
460
 
396
- raise InvalidQueryError(f"Expression '{node}' in POINT() is not a literal number.")
461
+ raise InvalidQueryError(f"Expression '{node}' in {name}() is not a literal number.")
@@ -427,11 +427,13 @@ class DefaultCollectionManager(CollectionManager[K]):
427
427
  cache: CollectionRecordCache | None = None
428
428
  result: list[CollectionRecord[K]] = []
429
429
  done_keys: set[K] = set()
430
+ explicit_names = list(wildcard.strings)
430
431
  if wildcard.patterns:
431
- if wildcard.strings:
432
+ if explicit_names or flatten_chains:
432
433
  # To be efficient in case both patterns and strings are
433
434
  # specified we want to have caching enabled for at least the
434
- # duration of this call.
435
+ # duration of this call. Chains flattening can also produce
436
+ # additional names to look for.
435
437
  cache = self._caching_context.collection_records or CollectionRecordCache()
436
438
  all_records = self._fetch_all(cache)
437
439
  for record in filter_types(all_records):
@@ -439,11 +441,17 @@ class DefaultCollectionManager(CollectionManager[K]):
439
441
  if any(p.fullmatch(record.name) for p in wildcard.patterns):
440
442
  result.append(record)
441
443
  done_keys.add(record.key)
442
-
443
- if wildcard.strings:
444
+ if flatten_chains:
445
+ # If flattening include children names of all matching chains.
446
+ for record in all_records:
447
+ if isinstance(record, ChainedCollectionRecord):
448
+ if any(p.fullmatch(record.name) for p in wildcard.patterns):
449
+ explicit_names.extend(record.children)
450
+
451
+ if explicit_names:
444
452
  # _find_many() returns correctly ordered records, but there may be
445
453
  # duplicates.
446
- for record in filter_types(self._find_many(wildcard.strings, flatten_chains, cache)):
454
+ for record in filter_types(self._find_many(explicit_names, flatten_chains, cache)):
447
455
  if record.key not in done_keys:
448
456
  result.append(record)
449
457
  done_keys.add(record.key)
@@ -561,8 +561,6 @@ class Database(ABC):
561
561
  try:
562
562
  yield table
563
563
  finally:
564
- with self._transaction():
565
- table.drop(connection)
566
564
  self._temp_tables.remove(table.key)
567
565
  self._metadata.remove_table(table.name)
568
566
 
@@ -457,6 +457,40 @@ class PredicateConversionVisitor(TreeVisitor[VisitorResult]):
457
457
  # do not support actual use just yet.
458
458
  raise NotImplementedError("POINT() function is not supported yet")
459
459
 
460
+ def visitCircleNode(
461
+ self, ra: VisitorResult, dec: VisitorResult, radius: VisitorResult, node: Node
462
+ ) -> VisitorResult:
463
+ # Docstring inherited.
464
+
465
+ # this is a placeholder for future extension, we enabled syntax but
466
+ # do not support actual use just yet.
467
+ raise NotImplementedError("CIRCLE() function is not supported yet")
468
+
469
+ def visitBoxNode(
470
+ self, ra: VisitorResult, dec: VisitorResult, width: VisitorResult, height: VisitorResult, node: Node
471
+ ) -> VisitorResult:
472
+ # Docstring inherited.
473
+
474
+ # this is a placeholder for future extension, we enabled syntax but
475
+ # do not support actual use just yet.
476
+ raise NotImplementedError("BOX() function is not supported yet")
477
+
478
+ def visitPolygonNode(
479
+ self, vertices: list[tuple[VisitorResult, VisitorResult]], node: Node
480
+ ) -> VisitorResult:
481
+ # Docstring inherited.
482
+
483
+ # this is a placeholder for future extension, we enabled syntax but
484
+ # do not support actual use just yet.
485
+ raise NotImplementedError("POLYGON() function is not supported yet")
486
+
487
+ def visitRegionNode(self, pos: VisitorResult, node: Node) -> VisitorResult:
488
+ # Docstring inherited.
489
+
490
+ # this is a placeholder for future extension, we enabled syntax but
491
+ # do not support actual use just yet.
492
+ raise NotImplementedError("REGION() function is not supported yet")
493
+
460
494
  def visitRangeLiteral(self, start: int, stop: int, stride: int | None, node: Node) -> VisitorResult:
461
495
  # Docstring inherited.
462
496
  return ColumnContainer.range_literal(range(start, stop + 1, stride or 1))
@@ -285,6 +285,26 @@ class InspectionVisitor(TreeVisitor[TreeSummary]):
285
285
  # Docstring inherited from base class
286
286
  return TreeSummary()
287
287
 
288
+ def visitCircleNode(
289
+ self, ra: TreeSummary, dec: TreeSummary, radius: TreeSummary, node: Node
290
+ ) -> TreeSummary:
291
+ # Docstring inherited from base class
292
+ return TreeSummary()
293
+
294
+ def visitPolygonNode(self, vertices: list[tuple[TreeSummary, TreeSummary]], node: Node) -> TreeSummary:
295
+ # Docstring inherited from base class
296
+ return TreeSummary()
297
+
298
+ def visitRegionNode(self, pos: TreeSummary, node: Node) -> TreeSummary:
299
+ # Docstring inherited from base class
300
+ return TreeSummary()
301
+
302
+ def visitBoxNode(
303
+ self, ra: TreeSummary, dec: TreeSummary, width: TreeSummary, height: TreeSummary, node: Node
304
+ ) -> TreeSummary:
305
+ # Docstring inherited from base class
306
+ return TreeSummary()
307
+
288
308
  def visitGlobNode(self, expression: TreeSummary, pattern: TreeSummary, node: Node) -> TreeSummary:
289
309
  # Docstring inherited from base class
290
310
  # pattern is a literal, but expression should refer to a dimension.
@@ -1098,6 +1098,33 @@ class TransformationVisitor(TreeVisitor[TransformationWrapper]):
1098
1098
  # Docstring inherited from TreeVisitor.visitPointNode
1099
1099
  raise NotImplementedError("POINT() function is not supported yet")
1100
1100
 
1101
+ def visitCircleNode(
1102
+ self, ra: TransformationWrapper, dec: TransformationWrapper, radius: TransformationWrapper, node: Node
1103
+ ) -> TransformationWrapper:
1104
+ # Docstring inherited from TreeVisitor.visitCircleNode
1105
+ raise NotImplementedError("CIRCLE() function is not supported yet")
1106
+
1107
+ def visitBoxNode(
1108
+ self,
1109
+ ra: TransformationWrapper,
1110
+ dec: TransformationWrapper,
1111
+ width: TransformationWrapper,
1112
+ height: TransformationWrapper,
1113
+ node: Node,
1114
+ ) -> TransformationWrapper:
1115
+ # Docstring inherited from TreeVisitor.visitBoxNode
1116
+ raise NotImplementedError("BOX() function is not supported yet")
1117
+
1118
+ def visitPolygonNode(
1119
+ self, vertices: list[tuple[TransformationWrapper, TransformationWrapper]], node: Node
1120
+ ) -> TransformationWrapper:
1121
+ # Docstring inherited from TreeVisitor.visitPolygonNode
1122
+ raise NotImplementedError("POLYGON() function is not supported yet")
1123
+
1124
+ def visitRegionNode(self, pos: TransformationWrapper, node: Node) -> TransformationWrapper:
1125
+ # Docstring inherited from TreeVisitor.visitRegionNode
1126
+ raise NotImplementedError("REGION() function is not supported yet")
1127
+
1101
1128
  def visitGlobNode(
1102
1129
  self, expression: TransformationWrapper, pattern: TransformationWrapper, node: Node
1103
1130
  ) -> TransformationWrapper:
@@ -39,6 +39,8 @@ from __future__ import annotations
39
39
 
40
40
  __all__ = [
41
41
  "BinaryOp",
42
+ "BoxNode",
43
+ "CircleNode",
42
44
  "FunctionCall",
43
45
  "Identifier",
44
46
  "IsIn",
@@ -46,7 +48,9 @@ __all__ = [
46
48
  "NumericLiteral",
47
49
  "Parens",
48
50
  "PointNode",
51
+ "PolygonNode",
49
52
  "RangeLiteral",
53
+ "RegionNode",
50
54
  "StringLiteral",
51
55
  "TimeLiteral",
52
56
  "TupleNode",
@@ -218,7 +222,7 @@ class TimeLiteral(LiteralNode):
218
222
  return visitor.visitTimeLiteral(self.value, self)
219
223
 
220
224
  def __str__(self) -> str:
221
- return "'{value}'".format(**vars(self))
225
+ return "T'{value}'".format(**vars(self))
222
226
 
223
227
 
224
228
  class NumericLiteral(LiteralNode):
@@ -263,7 +267,7 @@ class UuidLiteral(LiteralNode):
263
267
  return visitor.visitUuidLiteral(self.value, self)
264
268
 
265
269
  def __str__(self) -> str:
266
- return str(self.value)
270
+ return f"UUID('{self.value}')"
267
271
 
268
272
 
269
273
  class Identifier(Node):
@@ -310,7 +314,7 @@ class BindName(Node):
310
314
  return visitor.visitBind(self.name, self)
311
315
 
312
316
  def __str__(self) -> str:
313
- return "{name}".format(**vars(self))
317
+ return ":{name}".format(**vars(self))
314
318
 
315
319
 
316
320
  class RangeLiteral(LiteralNode):
@@ -488,6 +492,115 @@ class PointNode(Node):
488
492
  return f"POINT({self.ra}, {self.dec})"
489
493
 
490
494
 
495
+ class CircleNode(Node):
496
+ """Node representing a circle, (ra, dec, radius) pair.
497
+
498
+ Parameters
499
+ ----------
500
+ ra : `Node`
501
+ Node representing circle center ra value.
502
+ dec : `Node`
503
+ Node representing circle center dec value.
504
+ radius : `Node`
505
+ Node representing circle radius value.
506
+ """
507
+
508
+ def __init__(self, ra: Node, dec: Node, radius: Node):
509
+ super().__init__((ra, dec, radius))
510
+ self.ra = ra
511
+ self.dec = dec
512
+ self.radius = radius
513
+
514
+ def visit(self, visitor: TreeVisitor) -> Any:
515
+ # Docstring inherited from Node.visit
516
+ ra = self.ra.visit(visitor)
517
+ dec = self.dec.visit(visitor)
518
+ radius = self.radius.visit(visitor)
519
+ return visitor.visitCircleNode(ra, dec, radius, self)
520
+
521
+ def __str__(self) -> str:
522
+ return f"CIRCLE({self.ra}, {self.dec}, {self.radius})"
523
+
524
+
525
+ class BoxNode(Node):
526
+ """Node representing box region in ADQL notation (ra, dec, width, height).
527
+
528
+ Parameters
529
+ ----------
530
+ ra : `Node`
531
+ Node representing box center ra value.
532
+ dec : `Node`
533
+ Node representing box center dec value.
534
+ width : `Node`
535
+ Node representing box ra width value.
536
+ height : `Node`
537
+ Node representing box dec height value.
538
+ """
539
+
540
+ def __init__(self, ra: Node, dec: Node, width: Node, height: Node):
541
+ super().__init__((ra, dec, width, height))
542
+ self.ra = ra
543
+ self.dec = dec
544
+ self.width = width
545
+ self.height = height
546
+
547
+ def visit(self, visitor: TreeVisitor) -> Any:
548
+ # Docstring inherited from Node.visit
549
+ ra = self.ra.visit(visitor)
550
+ dec = self.dec.visit(visitor)
551
+ width = self.width.visit(visitor)
552
+ height = self.height.visit(visitor)
553
+ return visitor.visitBoxNode(ra, dec, width, height, self)
554
+
555
+ def __str__(self) -> str:
556
+ return f"BOX({self.ra}, {self.dec}, {self.width}, {self.height})"
557
+
558
+
559
+ class PolygonNode(Node):
560
+ """Node representing polygon region in ADQL notation.
561
+
562
+ Parameters
563
+ ----------
564
+ vertices : `list`[`tuple`[`Node`, `Node`]]
565
+ Node representing vertices of polygon.
566
+ """
567
+
568
+ def __init__(self, vertices: list[tuple[Node, Node]]):
569
+ super().__init__(sum(vertices, start=()))
570
+ self.vertices = vertices
571
+
572
+ def visit(self, visitor: TreeVisitor) -> Any:
573
+ # Docstring inherited from Node.visit
574
+ vertices = [(ra.visit(visitor), dec.visit(visitor)) for ra, dec in self.vertices]
575
+ return visitor.visitPolygonNode(vertices, self)
576
+
577
+ def __str__(self) -> str:
578
+ params = ", ".join(str(param) for param in self.children)
579
+ return f"POLYGON({params})"
580
+
581
+
582
+ class RegionNode(Node):
583
+ """Node representing region using IVOA SIAv2 POS notation.
584
+
585
+ Parameters
586
+ ----------
587
+ pos : `Node`
588
+ IVOA SIAv2 POS string representation of a region.
589
+ """
590
+
591
+ def __init__(self, pos: Node):
592
+ super().__init__((pos,))
593
+ self.pos = pos
594
+
595
+ def visit(self, visitor: TreeVisitor) -> Any:
596
+ # Docstring inherited from Node.visit
597
+ pos = self.pos.visit(visitor)
598
+ return visitor.visitRegionNode(pos, self)
599
+
600
+ def __str__(self) -> str:
601
+ return f"REGION({self.pos})"
602
+
603
+
491
604
  class GlobNode(Node):
492
605
  """Node representing a call to GLOB(pattern, expression) function.
493
606
 
@@ -536,11 +649,45 @@ def function_call(function: str, args: list[Node]) -> Node:
536
649
  functions. Tree visitors will most likely raise an error when visiting
537
650
  `FunctionCall` nodes.
538
651
  """
539
- if function.upper() == "POINT":
652
+ function_name = function.upper()
653
+ if function_name == "POINT":
540
654
  if len(args) != 2:
541
655
  raise ValueError("POINT requires two arguments (ra, dec)")
542
656
  return PointNode(*args)
543
- elif function.upper() == "GLOB":
657
+ elif function_name == "CIRCLE":
658
+ if len(args) != 3:
659
+ raise ValueError("CIRCLE requires three arguments (ra, dec, radius)")
660
+ # Check types of arguments, we want to support expressions too.
661
+ for name, arg in zip(("ra", "dec", "radius"), args, strict=True):
662
+ if not isinstance(arg, NumericLiteral | BindName | Identifier | BinaryOp | UnaryOp):
663
+ raise ValueError(f"CIRCLE {name} argument must be either numeric expression or bind value.")
664
+ return CircleNode(*args)
665
+ elif function_name == "BOX":
666
+ if len(args) != 4:
667
+ raise ValueError("CIRCLE requires four arguments (ra, dec, width, height)")
668
+ # Check types of arguments, we want to support expressions too.
669
+ for name, arg in zip(("ra", "dec", "width", "height"), args, strict=True):
670
+ if not isinstance(arg, NumericLiteral | BindName | Identifier | BinaryOp | UnaryOp):
671
+ raise ValueError(f"BOX {name} argument must be either numeric expression or bind value.")
672
+ return BoxNode(*args)
673
+ elif function_name == "POLYGON":
674
+ if len(args) % 2 != 0:
675
+ raise ValueError("POLYGON requires even number of arguments")
676
+ if len(args) < 6:
677
+ raise ValueError("POLYGON requires at least three vertices")
678
+ # Check types of arguments, we want to support expressions too.
679
+ for arg in args:
680
+ if not isinstance(arg, NumericLiteral | BindName | Identifier | BinaryOp | UnaryOp):
681
+ raise ValueError("POLYGON argument must be either numeric expression or bind value.")
682
+ vertices = list(zip(args[::2], args[1::2]))
683
+ return PolygonNode(vertices)
684
+ elif function_name == "REGION":
685
+ if len(args) != 1:
686
+ raise ValueError("REGION requires a single string argument")
687
+ if not isinstance(args[0], StringLiteral | BindName | Identifier):
688
+ raise ValueError("REGION argument must be either a string or a bind value")
689
+ return RegionNode(args[0])
690
+ elif function_name == "GLOB":
544
691
  if len(args) != 2:
545
692
  raise ValueError("GLOB requires two arguments (pattern, expression)")
546
693
  expression, pattern = (_strip_parens(arg) for arg in args)
@@ -549,7 +696,7 @@ def function_call(function: str, args: list[Node]) -> Node:
549
696
  if not isinstance(pattern, StringLiteral | BindName):
550
697
  raise TypeError("glob() second argument must be a string or a bind name (prefixed with colon)")
551
698
  return GlobNode(expression, pattern)
552
- elif function.upper() == "UUID":
699
+ elif function_name == "UUID":
553
700
  if len(args) != 1:
554
701
  raise ValueError("UUID() requires a single arguments (uuid-string)")
555
702
  argument = _strip_parens(args[0])