lsst-pipe-base 29.2025.1200__tar.gz → 29.2025.1400__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 (141) hide show
  1. {lsst_pipe_base-29.2025.1200/python/lsst_pipe_base.egg-info → lsst_pipe_base-29.2025.1400}/PKG-INFO +1 -1
  2. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/CHANGES.rst +53 -0
  3. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/all_dimensions_quantum_graph_builder.py +4 -0
  4. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/quantum_graph_skeleton.py +7 -0
  5. lsst_pipe_base-29.2025.1400/python/lsst/pipe/base/version.py +2 -0
  6. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400/python/lsst_pipe_base.egg-info}/PKG-INFO +1 -1
  7. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_graphBuilder.py +70 -2
  8. lsst_pipe_base-29.2025.1200/python/lsst/pipe/base/version.py +0 -2
  9. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/COPYRIGHT +0 -0
  10. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/LICENSE +0 -0
  11. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/MANIFEST.in +0 -0
  12. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/README.md +0 -0
  13. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/bsd_license.txt +0 -0
  14. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/creating-a-pipeline.rst +0 -0
  15. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/creating-a-pipelinetask.rst +0 -0
  16. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/creating-a-task.rst +0 -0
  17. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/index.rst +0 -0
  18. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/task-framework-overview.rst +0 -0
  19. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/task-retargeting-howto.rst +0 -0
  20. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/testing-a-pipeline-task.rst +0 -0
  21. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/testing-pipelines-with-mocks.rst +0 -0
  22. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/working-with-pipeline-graphs.rst +0 -0
  23. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/gpl-v3.0.txt +0 -0
  24. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/pyproject.toml +0 -0
  25. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/__init__.py +0 -0
  26. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/__init__.py +0 -0
  27. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/__init__.py +0 -0
  28. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_datasetQueryConstraints.py +0 -0
  29. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_dataset_handle.py +0 -0
  30. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_instrument.py +0 -0
  31. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_observation_dimension_packer.py +0 -0
  32. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_quantumContext.py +0 -0
  33. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_status.py +0 -0
  34. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_task_metadata.py +0 -0
  35. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/automatic_connection_constants.py +0 -0
  36. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/caching_limited_butler.py +0 -0
  37. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/__init__.py +0 -0
  38. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/_get_cli_subcommands.py +0 -0
  39. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/cmd/__init__.py +0 -0
  40. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/cmd/commands.py +0 -0
  41. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/opt/__init__.py +0 -0
  42. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/opt/arguments.py +0 -0
  43. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/opt/options.py +0 -0
  44. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/config.py +0 -0
  45. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/configOverrides.py +0 -0
  46. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/connectionTypes.py +0 -0
  47. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/connections.py +0 -0
  48. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/dot_tools.py +0 -0
  49. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/executionButlerBuilder.py +0 -0
  50. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/execution_reports.py +0 -0
  51. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/formatters/__init__.py +0 -0
  52. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/formatters/pexConfig.py +0 -0
  53. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/__init__.py +0 -0
  54. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/_implDetails.py +0 -0
  55. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/_loadHelpers.py +0 -0
  56. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/_versionDeserializers.py +0 -0
  57. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/graph.py +0 -0
  58. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/graphSummary.py +0 -0
  59. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/quantumNode.py +0 -0
  60. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/mermaid_tools.py +0 -0
  61. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline.py +0 -0
  62. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipelineIR.py +0 -0
  63. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipelineTask.py +0 -0
  64. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/__init__.py +0 -0
  65. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/__main__.py +0 -0
  66. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_dataset_types.py +0 -0
  67. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_edges.py +0 -0
  68. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_exceptions.py +0 -0
  69. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_mapping_views.py +0 -0
  70. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_nodes.py +0 -0
  71. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_pipeline_graph.py +0 -0
  72. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_task_subsets.py +0 -0
  73. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_tasks.py +0 -0
  74. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/io.py +0 -0
  75. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/__init__.py +0 -0
  76. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_dot.py +0 -0
  77. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_formatting.py +0 -0
  78. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_layout.py +0 -0
  79. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_merge.py +0 -0
  80. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_mermaid.py +0 -0
  81. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_options.py +0 -0
  82. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_printer.py +0 -0
  83. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_show.py +0 -0
  84. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/prerequisite_helpers.py +0 -0
  85. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/py.typed +0 -0
  86. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/quantum_graph_builder.py +0 -0
  87. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/quantum_provenance_graph.py +0 -0
  88. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/__init__.py +0 -0
  89. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/register_instrument.py +0 -0
  90. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/retrieve_artifacts_for_quanta.py +0 -0
  91. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/transfer_from_graph.py +0 -0
  92. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/zip_from_graph.py +0 -0
  93. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/struct.py +0 -0
  94. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/task.py +0 -0
  95. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/taskFactory.py +0 -0
  96. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/testUtils.py +0 -0
  97. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/__init__.py +0 -0
  98. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/__init__.py +0 -0
  99. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/_data_id_match.py +0 -0
  100. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/_pipeline_task.py +0 -0
  101. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/_storage_class.py +0 -0
  102. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/no_dimensions.py +0 -0
  103. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/pipelineStepTester.py +0 -0
  104. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/simpleQGraph.py +0 -0
  105. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/util.py +0 -0
  106. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/utils.py +0 -0
  107. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/SOURCES.txt +0 -0
  108. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/dependency_links.txt +0 -0
  109. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/entry_points.txt +0 -0
  110. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/requires.txt +0 -0
  111. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/top_level.txt +0 -0
  112. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/zip-safe +0 -0
  113. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/setup.cfg +0 -0
  114. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_adjust_all_quanta.py +0 -0
  115. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_caching_limited_butler.py +0 -0
  116. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_cliCmdRegisterInstrument.py +0 -0
  117. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_configOverrides.py +0 -0
  118. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_config_formatter.py +0 -0
  119. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_connections.py +0 -0
  120. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_dataid_match.py +0 -0
  121. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_dataset_handle.py +0 -0
  122. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_dot_tools.py +0 -0
  123. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_dynamic_connections.py +0 -0
  124. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_executionButler.py +0 -0
  125. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_execution_reports.py +0 -0
  126. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_init_output_run.py +0 -0
  127. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_instrument.py +0 -0
  128. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_mermaid.py +0 -0
  129. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_pipeline.py +0 -0
  130. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_pipelineIR.py +0 -0
  131. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_pipelineLoadSubset.py +0 -0
  132. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_pipelineTask.py +0 -0
  133. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_pipeline_graph.py +0 -0
  134. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_quantumGraph.py +0 -0
  135. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_quantum_provenance_graph.py +0 -0
  136. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_quantum_success_caveats.py +0 -0
  137. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_struct.py +0 -0
  138. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_task.py +0 -0
  139. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_taskmetadata.py +0 -0
  140. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_testUtils.py +0 -0
  141. {lsst_pipe_base-29.2025.1200 → lsst_pipe_base-29.2025.1400}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 29.2025.1200
3
+ Version: 29.2025.1400
4
4
  Summary: Pipeline infrastructure for the Rubin Science Pipelines.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -1,3 +1,56 @@
1
+ lsst-pipe-base v29.0.0 (2025-03-25)
2
+ ===================================
3
+
4
+ New Features
5
+ ------------
6
+
7
+ - * Modified ``QuantumContext`` such that it now tracks all datasets that are retrieved and records them in ``dataset_provenance``.
8
+ This provenance is then passed to Butler on ``put()``.
9
+ * Added ``QuantumContext.add_additional_provenance()`` to allow a pipeline task author to attach additional provenance information to be recorded and associated with a particular input dataset. (`DM-35396 <https://rubinobs.atlassian.net/browse/DM-35396>`_)
10
+ - Finished support for "steps" in pipelines and pipeline graphs.
11
+
12
+ Steps are an ordered sequence of special pipeline subsets that provide extra information and validation about how pipelines should actually be run. (`DM-46023 <https://rubinobs.atlassian.net/browse/DM-46023>`_)
13
+ - Added Mermaid for pipeline and quantum graph visualization with tools for documentation/presentation purposes. (`DM-46503 <https://rubinobs.atlassian.net/browse/DM-46503>`_)
14
+ - Added ``zip-from-graph`` subcommand for ``butler`` command-line to enable output artifacts associated with a graph to be combined into a Zip archive. (`DM-46776 <https://rubinobs.atlassian.net/browse/DM-46776>`_)
15
+ - Added ``UpstreamFailureNoWorkFound``, an exception that is handled the same way as ``NoWorkFound`` that indicates that the root problem is probably in an upstream ``PipelineTask``. (`DM-46948 <https://rubinobs.atlassian.net/browse/DM-46948>`_)
16
+ - Plugin discovery is now automated through Python entry points when using ``pip``.
17
+ It is now an error if the ``DAF_BUTLER_PLUGINS`` environment variable is set for this package. (`DM-47143 <https://rubinobs.atlassian.net/browse/DM-47143>`_)
18
+ - * Added new command-line ``butler retrieve-artifacts-for-quanta`` which can be used to retrieve input or output datasets associated with a graph or specific quanta.
19
+ * Added new ``QuantumGraph.get_refs()`` method to retrieve dataset refs from a graph. (`DM-47328 <https://rubinobs.atlassian.net/browse/DM-47328>`_)
20
+ - Add the ``QuantumSuccessCaveats`` flag enum, which can be used to report on ``NoWorkFound`` and other qualified successes in execution.
21
+
22
+ This adds the flag enum itself and functionality in ``QuantumProvenanceGraph`` (which backs ``pipetask report --force-v2``) to include it in reports.
23
+ It relies on additional changes in ``lsst.ctrl.mpexec.SingleQuantumExecutor`` to write the caveat flags into task metadata. (`DM-47730 <https://rubinobs.atlassian.net/browse/DM-47730>`_)
24
+ - ``QuantumProvenanceGraph`` and ``pipetask report --force-v2`` can now report on exceptions raised and then ignored via the ``--no-raise-on-partial-outputs`` option.
25
+
26
+ Exceptions that lead to task failures are not yet tracked, because we do not write task metadata for failures and hence have nowhere to put the information. (`DM-48536 <https://rubinobs.atlassian.net/browse/DM-48536>`_)
27
+ - Swapped to the new butler query system in ``QuantumGraph`` generation.
28
+
29
+ This change should be mostly transparent to users, aside from small changes in speed (typically faster, but not always). (`DM-45896 <https://rubinobs.atlassian.net/browse/DM-45896>`)
30
+
31
+ Bug Fixes
32
+ ---------
33
+
34
+ - Fixed a bug in QG generation that could lead to an error when using ``--skip-existing-in`` on a collection that had a successful quantum that did not write all of its predicted outputs. (`DM-49266 <https://rubinobs.atlassian.net/browse/DM-49266>`_)
35
+
36
+
37
+ Performance Enhancement
38
+ -----------------------
39
+
40
+ - ``QuantumGraph`` generation has been partially rewritten to support building larger graphs and build all graphs faster.
41
+
42
+ With this change, ``QuantumGraph`` generation no longer uses a long-lived temporary table in the butler database for followup queries, and instead uploads a set of data IDs to the database for each query.
43
+ In addition, the algorithm for adding nodes and edges from the data ID query results has been reworked to duplicate irrelevant dimensions earlier, making it much faster. (`DM-49296 <https://rubinobs.atlassian.net/browse/DM-49296>`_)
44
+
45
+
46
+ Other Changes and Additions
47
+ ---------------------------
48
+
49
+ - Modified ``TaskMetadata`` such that it can now be assigned an empty list.
50
+ This list can be retrieved with ``getArray`` but if an attempt is made to get a scalar `KeyError` will be raised. (`DM-35396 <https://rubinobs.atlassian.net/browse/DM-35396>`_)
51
+ - ``QuantumGraph`` generation will no longer fail when the ``--dataset-query-constraint`` argument includes a dataset type that is not relevant for one or more pipeline subgraphs. (`DM-47505 <https://rubinobs.atlassian.net/browse/DM-47505>`_)
52
+
53
+
1
54
  lsst-pipe-base v28.0.0 (2024-11-21)
2
55
  ===================================
3
56
 
@@ -130,6 +130,10 @@ class AllDimensionsQuantumGraphBuilder(QuantumGraphBuilder):
130
130
  tree = _DimensionGroupTree(subgraph)
131
131
  self._query_for_data_ids(tree)
132
132
  skeleton = self._make_subgraph_skeleton(tree)
133
+ if not skeleton.has_any_quanta:
134
+ # QG is going to be empty; exit early not just for efficiency, but
135
+ # also so downstream code doesn't have to guard against this case.
136
+ return skeleton
133
137
  self._find_followup_datasets(tree, skeleton)
134
138
  dimension_records = self._fetch_most_dimension_records(tree)
135
139
  leftovers = self._attach_most_dimension_records(skeleton, dimension_records)
@@ -194,6 +194,13 @@ class QuantumGraphSkeleton:
194
194
  """The total number of edges."""
195
195
  return len(self._xgraph.edges)
196
196
 
197
+ @property
198
+ def has_any_quanta(self) -> bool:
199
+ """Test whether this graph has any quanta."""
200
+ for _ in self.iter_all_quanta():
201
+ return True
202
+ return False
203
+
197
204
  def has_task(self, task_label: str) -> bool:
198
205
  """Test whether the given task is in this skeleton.
199
206
 
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.1400"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 29.2025.1200
3
+ Version: 29.2025.1400
4
4
  Summary: Pipeline infrastructure for the Rubin Science Pipelines.
5
5
  Author-email: Rubin Observatory Data Management <dm-admin@lists.lsst.org>
6
6
  License: BSD 3-Clause License
@@ -32,10 +32,21 @@ import logging
32
32
  import unittest
33
33
 
34
34
  import lsst.utils.tests
35
+ from lsst.daf.butler import Butler, DatasetType
35
36
  from lsst.daf.butler.registry import UserExpressionError
36
- from lsst.pipe.base import QuantumGraph
37
- from lsst.pipe.base.all_dimensions_quantum_graph_builder import DatasetQueryConstraintVariant
37
+ from lsst.pipe.base import PipelineGraph, QuantumGraph
38
+ from lsst.pipe.base.all_dimensions_quantum_graph_builder import (
39
+ AllDimensionsQuantumGraphBuilder,
40
+ DatasetQueryConstraintVariant,
41
+ )
38
42
  from lsst.pipe.base.tests import simpleQGraph
43
+ from lsst.pipe.base.tests.mocks import (
44
+ DynamicConnectionConfig,
45
+ DynamicTestPipelineTask,
46
+ DynamicTestPipelineTaskConfig,
47
+ MockDataset,
48
+ MockStorageClass,
49
+ )
39
50
  from lsst.utils.tests import temporaryDirectory
40
51
 
41
52
  _LOG = logging.getLogger(__name__)
@@ -82,6 +93,63 @@ class GraphBuilderTestCase(unittest.TestCase):
82
93
  )
83
94
  self.assertEqual(len(qgraph3), 5)
84
95
 
96
+ def test_empty_qg(self):
97
+ """Test that making an empty QG doesn't raise exceptions."""
98
+ config = DynamicTestPipelineTaskConfig()
99
+ config.inputs["i"] = DynamicConnectionConfig(
100
+ dataset_type_name="input",
101
+ storage_class="StructuredDataDict",
102
+ dimensions=["detector"],
103
+ )
104
+ config.init_inputs["ii"] = DynamicConnectionConfig(
105
+ dataset_type_name="init_input",
106
+ storage_class="StructuredDataDict",
107
+ )
108
+ config.outputs["o"] = DynamicConnectionConfig(
109
+ dataset_type_name="output",
110
+ storage_class="StructuredDataDict",
111
+ dimensions=["detector"],
112
+ )
113
+ config.init_outputs["io"] = DynamicConnectionConfig(
114
+ dataset_type_name="init_output",
115
+ storage_class="StructuredDataDict",
116
+ )
117
+ pipeline_graph = PipelineGraph()
118
+ pipeline_graph.add_task("a", DynamicTestPipelineTask, config)
119
+ with temporaryDirectory() as repo_path:
120
+ Butler.makeRepo(repo_path)
121
+ butler = Butler.from_config(repo_path, writeable=True, run="test_empty_qg")
122
+ MockStorageClass.get_or_register_mock("StructuredDataDict")
123
+ butler.registry.registerDatasetType(
124
+ DatasetType(
125
+ "input",
126
+ dimensions=butler.dimensions.conform(["detector"]),
127
+ storageClass="_mock_StructuredDataDict",
128
+ )
129
+ )
130
+ init_input_dataset_type = DatasetType(
131
+ "init_input",
132
+ dimensions=butler.dimensions.empty,
133
+ storageClass="_mock_StructuredDataDict",
134
+ )
135
+ butler.registry.registerDatasetType(init_input_dataset_type)
136
+ # Init-input initially exists, but input does not (hence empty QG).
137
+ butler.put(
138
+ MockDataset(
139
+ dataset_id=None,
140
+ dataset_type=init_input_dataset_type.to_simple(),
141
+ data_id={},
142
+ run=butler.run,
143
+ ),
144
+ "init_input",
145
+ )
146
+ # Attempt to make QG; should just be empty, with no exceptions.
147
+ self.assertFalse(AllDimensionsQuantumGraphBuilder(pipeline_graph, butler).build())
148
+ # Initialize the output run, try again, with same expected result.
149
+ pipeline_graph.register_dataset_types(butler)
150
+ pipeline_graph.init_output_run(butler)
151
+ self.assertFalse(AllDimensionsQuantumGraphBuilder(pipeline_graph, butler).build())
152
+
85
153
  # Inconsistent governor dimensions are no longer an error, so this test
86
154
  # fails with the new query system. We should probably check instead that
87
155
  # logging includes an explanation for the empty QG, but it might not
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.1200"