lsst-pipe-base 30.2026.400__tar.gz → 30.2026.500__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 (188) hide show
  1. {lsst_pipe_base-30.2026.400/python/lsst_pipe_base.egg-info → lsst_pipe_base-30.2026.500}/PKG-INFO +1 -1
  2. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/CHANGES.rst +3 -3
  3. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/creating-a-pipelinetask.rst +2 -2
  4. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/task-framework-overview.rst +3 -3
  5. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/working-with-pipeline-graphs.rst +1 -1
  6. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/pyproject.toml +1 -0
  7. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_instrument.py +17 -5
  8. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_quantumContext.py +3 -3
  9. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_status.py +14 -0
  10. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/automatic_connection_constants.py +11 -0
  11. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/cmd/__init__.py +2 -0
  12. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/cmd/commands.py +108 -1
  13. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/graph.py +9 -8
  14. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/log_capture.py +1 -1
  15. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline.py +2 -2
  16. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipelineIR.py +1 -1
  17. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_dataset_types.py +2 -2
  18. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_edges.py +11 -11
  19. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_pipeline_graph.py +2 -2
  20. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_dot.py +13 -12
  21. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py +7 -0
  22. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/prerequisite_helpers.py +2 -1
  23. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/_multiblock.py +29 -13
  24. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/_provenance.py +411 -19
  25. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/__init__.py +0 -1
  26. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/formatter.py +4 -4
  27. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/ingest_graph.py +61 -4
  28. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph_builder.py +1 -8
  29. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph_skeleton.py +29 -27
  30. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_provenance_graph.py +12 -10
  31. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/separable_pipeline_executor.py +1 -1
  32. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/single_quantum_executor.py +1 -1
  33. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/mocks/_storage_class.py +2 -1
  34. lsst_pipe_base-30.2026.500/python/lsst/pipe/base/version.py +2 -0
  35. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500/python/lsst_pipe_base.egg-info}/PKG-INFO +1 -1
  36. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_aggregator.py +300 -10
  37. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_configOverrides.py +1 -1
  38. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_init_output_run.py +1 -1
  39. lsst_pipe_base-30.2026.400/python/lsst/pipe/base/version.py +0 -2
  40. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/COPYRIGHT +0 -0
  41. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/LICENSE +0 -0
  42. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/MANIFEST.in +0 -0
  43. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/README.md +0 -0
  44. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/bsd_license.txt +0 -0
  45. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/creating-a-pipeline.rst +0 -0
  46. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/creating-a-task.rst +0 -0
  47. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/index.rst +0 -0
  48. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/recording-provenance.rst +0 -0
  49. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/task-retargeting-howto.rst +0 -0
  50. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/testing-a-pipeline-task.rst +0 -0
  51. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/doc/lsst.pipe.base/testing-pipelines-with-mocks.rst +0 -0
  52. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/gpl-v3.0.txt +0 -0
  53. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/__init__.py +0 -0
  54. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/__init__.py +0 -0
  55. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/__init__.py +0 -0
  56. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_datasetQueryConstraints.py +0 -0
  57. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_dataset_handle.py +0 -0
  58. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_observation_dimension_packer.py +0 -0
  59. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/_task_metadata.py +0 -0
  60. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/all_dimensions_quantum_graph_builder.py +0 -0
  61. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/caching_limited_butler.py +0 -0
  62. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/__init__.py +0 -0
  63. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/_get_cli_subcommands.py +0 -0
  64. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/opt/__init__.py +0 -0
  65. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/opt/arguments.py +0 -0
  66. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/cli/opt/options.py +0 -0
  67. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/config.py +0 -0
  68. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/configOverrides.py +0 -0
  69. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/connectionTypes.py +0 -0
  70. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/connections.py +0 -0
  71. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/dot_tools.py +0 -0
  72. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/exec_fixup_data_id.py +0 -0
  73. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/execution_graph_fixup.py +0 -0
  74. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/execution_reports.py +0 -0
  75. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/formatters/__init__.py +0 -0
  76. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/formatters/pexConfig.py +0 -0
  77. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/__init__.py +0 -0
  78. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/_implDetails.py +0 -0
  79. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/_loadHelpers.py +0 -0
  80. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/_versionDeserializers.py +0 -0
  81. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/graphSummary.py +0 -0
  82. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph/quantumNode.py +0 -0
  83. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/graph_walker.py +0 -0
  84. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/log_on_close.py +0 -0
  85. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/mermaid_tools.py +0 -0
  86. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/mp_graph_executor.py +0 -0
  87. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipelineTask.py +0 -0
  88. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/__init__.py +0 -0
  89. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/__main__.py +0 -0
  90. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_exceptions.py +0 -0
  91. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_mapping_views.py +0 -0
  92. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_nodes.py +0 -0
  93. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_task_subsets.py +0 -0
  94. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/_tasks.py +0 -0
  95. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/expressions.py +0 -0
  96. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/io.py +0 -0
  97. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/__init__.py +0 -0
  98. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_formatting.py +0 -0
  99. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_layout.py +0 -0
  100. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_merge.py +0 -0
  101. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_mermaid.py +0 -0
  102. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_options.py +0 -0
  103. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_printer.py +0 -0
  104. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/pipeline_graph/visualization/_show.py +0 -0
  105. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/py.typed +0 -0
  106. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/__init__.py +0 -0
  107. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/_common.py +0 -0
  108. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/_predicted.py +0 -0
  109. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_communicators.py +0 -0
  110. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_config.py +0 -0
  111. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_ingester.py +0 -0
  112. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_progress.py +0 -0
  113. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_scanner.py +0 -0
  114. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_structs.py +0 -0
  115. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_supervisor.py +0 -0
  116. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/aggregator/_writer.py +0 -0
  117. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph/visualization.py +0 -0
  118. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_graph_executor.py +0 -0
  119. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/quantum_reports.py +0 -0
  120. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/resource_usage.py +0 -0
  121. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/script/__init__.py +0 -0
  122. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/script/register_instrument.py +0 -0
  123. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/script/retrieve_artifacts_for_quanta.py +0 -0
  124. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/script/transfer_from_graph.py +0 -0
  125. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/script/utils.py +0 -0
  126. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/script/zip_from_graph.py +0 -0
  127. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/simple_pipeline_executor.py +0 -0
  128. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/struct.py +0 -0
  129. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/task.py +0 -0
  130. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/taskFactory.py +0 -0
  131. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/testUtils.py +0 -0
  132. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/__init__.py +0 -0
  133. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/in_memory_limited_butler.py +0 -0
  134. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/mocks/__init__.py +0 -0
  135. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/mocks/_data_id_match.py +0 -0
  136. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/mocks/_pipeline_task.py +0 -0
  137. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/mocks/_repo.py +0 -0
  138. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/no_dimensions.py +0 -0
  139. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/pipelineStepTester.py +0 -0
  140. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/simpleQGraph.py +0 -0
  141. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/tests/util.py +0 -0
  142. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst/pipe/base/utils.py +0 -0
  143. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst_pipe_base.egg-info/SOURCES.txt +0 -0
  144. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst_pipe_base.egg-info/dependency_links.txt +0 -0
  145. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst_pipe_base.egg-info/entry_points.txt +0 -0
  146. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst_pipe_base.egg-info/requires.txt +0 -0
  147. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst_pipe_base.egg-info/top_level.txt +0 -0
  148. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/python/lsst_pipe_base.egg-info/zip-safe +0 -0
  149. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/setup.cfg +0 -0
  150. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_adjust_all_quanta.py +0 -0
  151. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_caching_limited_butler.py +0 -0
  152. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_cliCmdRegisterInstrument.py +0 -0
  153. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_config_formatter.py +0 -0
  154. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_connections.py +0 -0
  155. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_dataid_match.py +0 -0
  156. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_dataset_handle.py +0 -0
  157. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_deferredDatasetRef.py +0 -0
  158. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_dot_tools.py +0 -0
  159. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_dynamic_connections.py +0 -0
  160. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_execution_reports.py +0 -0
  161. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_execution_storage_class_conversion.py +0 -0
  162. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_graphBuilder.py +0 -0
  163. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_graph_walker.py +0 -0
  164. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_instrument.py +0 -0
  165. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_mermaid.py +0 -0
  166. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_mp_graph_executor.py +0 -0
  167. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_pipeline.py +0 -0
  168. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_pipelineIR.py +0 -0
  169. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_pipelineLoadSubset.py +0 -0
  170. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_pipelineTask.py +0 -0
  171. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_pipeline_graph.py +0 -0
  172. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_pipeline_graph_expressions.py +0 -0
  173. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_predicted_qg.py +0 -0
  174. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_qg_builder_dimensions.py +0 -0
  175. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_quantumGraph.py +0 -0
  176. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_quantum_provenance_graph.py +0 -0
  177. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_quantum_reports.py +0 -0
  178. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_quantum_success_caveats.py +0 -0
  179. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_script_utils.py +0 -0
  180. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_separable_pipeline_executor.py +0 -0
  181. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_simple_pipeline_executor.py +0 -0
  182. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_single_quantum_executor.py +0 -0
  183. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_struct.py +0 -0
  184. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_task.py +0 -0
  185. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_task_factory.py +0 -0
  186. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_taskmetadata.py +0 -0
  187. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_testUtils.py +0 -0
  188. {lsst_pipe_base-30.2026.400 → lsst_pipe_base-30.2026.500}/tests/test_utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 30.2026.400
3
+ Version: 30.2026.500
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-Expression: BSD-3-Clause OR GPL-3.0-or-later
@@ -131,7 +131,7 @@ New Features
131
131
  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>`_)
132
132
  - Swapped to the new butler query system in ``QuantumGraph`` generation.
133
133
 
134
- 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>`)
134
+ 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>`_)
135
135
 
136
136
  Bug Fixes
137
137
  ---------
@@ -175,7 +175,7 @@ New Features
175
175
  For each graph/attempt, the status of each quantum and dataset is recorded in ``QuantumProvenanceGraph.add_new_graph`` and outcomes of quanta over multiple runs are resolved in ``QuantumProvenanceGraph.resolve_duplicates``.
176
176
  At the end of this process, we can combine all attempts into a summary.
177
177
  This serves to answer the question "What happened to this data ID?" in a holistic sense. (`DM-41711 <https://rubinobs.atlassian.net/browse/DM-41711>`_)
178
- - Included the number of expected instances in ``pipetask report`` task-level summary for the `QuantumGraphExecutionReport`. (`DM-44368 <https://rubinobs.atlassian.net/browse/DM-44368>`_)
178
+ - Included the number of expected instances in ``pipetask report`` task-level summary for the ``QuantumGraphExecutionReport``. (`DM-44368 <https://rubinobs.atlassian.net/browse/DM-44368>`_)
179
179
  - Added mocking support for tasks that write regular datasets with config, log, or metadata storage classes. (`DM-44583 <https://rubinobs.atlassian.net/browse/DM-44583>`_)
180
180
  - Added new ``show_dot`` functionality.
181
181
 
@@ -251,7 +251,7 @@ New Features
251
251
  This interface is available through YAML pipeline specification by specifying the ``labeledSubsetModifyMode`` key when writing YAML import defectives.
252
252
 
253
253
  New Python interfaces were added for manipulating labeled subsets in a pipeline.
254
- These include; ``Pipeline.subsets`` which is a property returning a `dict`` of subset labels to sets of task labels, ``Pipeline.addLabeledSubset`` to add a new labeled subset to a ``Pipeline``, and ``Pipeline.removeLabeledSubset`` to remove a labeled subset from a pipeline. (`DM-41203 <https://rubinobs.atlassian.net/browse/DM-41203>`_)
254
+ These include; ``Pipeline.subsets`` which is a property returning a `dict` of subset labels to sets of task labels, ``Pipeline.addLabeledSubset`` to add a new labeled subset to a ``Pipeline``, and ``Pipeline.removeLabeledSubset`` to remove a labeled subset from a pipeline. (`DM-41203 <https://rubinobs.atlassian.net/browse/DM-41203>`_)
255
255
  - Added ``QuantumGraph`` summary. (`DM-41542 <https://rubinobs.atlassian.net/browse/DM-41542>`_)
256
256
  - Added human-readable option to report summary dictionaries. (`DM-41606 <https://rubinobs.atlassian.net/browse/DM-41606>`_)
257
257
  - Added a section to pipelines which allows the explicit declaration of which susbsets correspond to steps and the dimensions the step's quanta can be sharded with. (`DM-41650 <https://rubinobs.atlassian.net/browse/DM-41650>`_)
@@ -471,9 +471,9 @@ connection had never existed.
471
471
  Run-time optional inputs
472
472
  ------------------------
473
473
 
474
- A separate mechanism exists that allows an `Input` connection to be made
474
+ A separate mechanism exists that allows an ``Input`` connection to be made
475
475
  run-time optional.
476
- If the `Input.minimum` attribute is initialized to zero for a connection,
476
+ If the ``Input.minimum`` attribute is initialized to zero for a connection,
477
477
  graph-building will still generate a quantum, and the `PipelineTask` will
478
478
  be run, even if no dataset for that input can be found.
479
479
 
@@ -25,14 +25,14 @@ A common use for this is to provide a camera-specific variant of a particular ta
25
25
  Tasks may process multiple items of data in parallel, using the ``ctrl_mpexec`` package and its ``pipetask`` command.
26
26
 
27
27
  Most tasks have a ``run`` method that performs the primary data processing.
28
- Each task's `run` method should return a `~lsst.pipe.base.Struct`.
28
+ Each task's `~lsst.pipe.base.Task.run` method should return a `~lsst.pipe.base.Struct`.
29
29
  This allows named access to returned data, which provides safer evolution than relying on the order of returned values.
30
30
  All task methods that return more than one or two items of data should return the data in a `~lsst.pipe.base.Struct`.
31
31
 
32
32
  Many tasks are found in the ``pipe_tasks`` package, especially tasks that use many different packages and don't seem to belong in any one of them.
33
- Tasks that are associated with a particular package should be in that package; for example the instrument signature removal task ``ip.isr.isrTask.IsrTask`` is in the ``ip_isr`` package.
33
+ Tasks that are associated with a particular package should be in that package; for example the instrument signature removal task ``lsst.ip.isr.isrTask.IsrTask`` is in the ``ip_isr`` package.
34
34
 
35
- `pipe_base` is written purely in Python. The most important contents are:
35
+ ``pipe_base`` is written purely in Python. The most important contents are:
36
36
 
37
37
  - `~lsst.pipe.base.PipelineTask`: base class for pipeline tasks that can be run from pipelines.
38
38
  - `~lsst.pipe.base.Task`: base class for subtasks that are not meant to be run from the
@@ -64,7 +64,7 @@ In some cases it may be more convenient to add tasks to an existing `PipelineGra
64
64
 
65
65
  **The most important thing to remember when modifying `PipelineGraph` objects is that modifications typically reset some or all of the graph to an unresolved state.**
66
66
 
67
- The reference documentation for these methods describes exactly what guarantees they make about existing resolutions in detail, and what operations are still supported on unresolved or partially-resolved graphs, but it is easiest to just ensure `resolve` is called after any modifications are complete.
67
+ The reference documentation for these methods describes exactly what guarantees they make about existing resolutions in detail, and what operations are still supported on unresolved or partially-resolved graphs, but it is easiest to just ensure ``resolve`` is called after any modifications are complete.
68
68
 
69
69
  `PipelineGraph` mutator methods provide strong exception safety (the graph is left unchanged when an exception is raised and caught by calling code) unless the exception type raised is `PipelineGraphExceptionSafetyError`.
70
70
 
@@ -205,6 +205,7 @@ checks = [
205
205
  "RT01", # Unfortunately our @property trigger this.
206
206
  "RT02", # Does not want named return value. DM style says we do.
207
207
  "SS05", # pydocstyle is better at finding infinitive verb.
208
+ "RT03", # sphinx bug requiring empty Returns.
208
209
  ]
209
210
  exclude = [
210
211
  '^__init__$',
@@ -35,7 +35,7 @@ from abc import ABCMeta, abstractmethod
35
35
  from collections.abc import Sequence
36
36
  from typing import TYPE_CHECKING, Any, Self, cast, final
37
37
 
38
- from lsst.daf.butler import DataCoordinate, DataId, DimensionPacker, DimensionRecord, Formatter
38
+ from lsst.daf.butler import DataCoordinate, DataId, DimensionPacker, DimensionRecord, Formatter, FormatterV2
39
39
  from lsst.daf.butler.registry import DataIdError
40
40
  from lsst.pex.config import Config, RegistryField
41
41
  from lsst.resources import ResourcePath, ResourcePathExpression
@@ -311,7 +311,7 @@ class Instrument(metaclass=ABCMeta):
311
311
  return instrument_cls(collection_prefix=collection_prefix)
312
312
 
313
313
  @staticmethod
314
- def importAll(registry: Registry) -> None:
314
+ def importAll(registry: Registry) -> dict[str, type[Instrument]]:
315
315
  """Import all the instruments known to this registry.
316
316
 
317
317
  This will ensure that all metadata translators have been registered.
@@ -321,20 +321,31 @@ class Instrument(metaclass=ABCMeta):
321
321
  registry : `lsst.daf.butler.Registry`
322
322
  Butler registry to query to find the information.
323
323
 
324
+ Returns
325
+ -------
326
+ imported : `dict` [`str`, `type` [`Instrument`]]
327
+ A mapping containing all the instrument classes that were loaded
328
+ successfully, keyed by their butler names.
329
+
324
330
  Notes
325
331
  -----
326
332
  It is allowed for a particular instrument class to fail on import.
327
333
  This might simply indicate that a particular obs package has
328
334
  not been setup.
329
335
  """
336
+ imported: dict[str, type[Instrument]] = {}
330
337
  records = list(registry.queryDimensionRecords("instrument"))
331
338
  for record in records:
332
339
  cls = record.class_name
340
+ instrument_name: str = cast(str, record.name)
333
341
  with contextlib.suppress(Exception):
334
- doImportType(cls)
342
+ instr = doImportType(cls)
343
+ assert issubclass(instr, Instrument)
344
+ imported[instrument_name] = instr
345
+ return imported
335
346
 
336
347
  @abstractmethod
337
- def getRawFormatter(self, dataId: DataId) -> type[Formatter]:
348
+ def getRawFormatter(self, dataId: DataId) -> type[Formatter | FormatterV2]:
338
349
  """Return the Formatter class that should be used to read a particular
339
350
  raw file.
340
351
 
@@ -345,7 +356,8 @@ class Instrument(metaclass=ABCMeta):
345
356
 
346
357
  Returns
347
358
  -------
348
- formatter : `lsst.daf.butler.Formatter` class
359
+ formatter : `type` \
360
+ [`lsst.daf.butler.Formatter` | `lsst.daf.butler.FormatterV2` ]
349
361
  Class to be used that reads the file into the correct
350
362
  Python object for the raw data.
351
363
  """
@@ -380,8 +380,8 @@ class QuantumContext:
380
380
  if dataset is directly a `list` of `~lsst.daf.butler.DatasetRef`
381
381
  or a single `~lsst.daf.butler.DatasetRef`. If ``values.NAME`` is
382
382
  None, no output is written.
383
- dataset : `OutputQuantizedConnection` or `list`[`DatasetRef`] \
384
- or `DatasetRef`
383
+ dataset : `OutputQuantizedConnection` or `list` \
384
+ [`lsst.daf.butler.DatasetRef`] or `lsst.daf.butler.DatasetRef`
385
385
  This argument may either be an `InputQuantizedConnection` which
386
386
  describes all the inputs of a quantum, a list of
387
387
  `lsst.daf.butler.DatasetRef`, or a single
@@ -460,7 +460,7 @@ class QuantumContext:
460
460
 
461
461
  Parameters
462
462
  ----------
463
- ref : `DatasetRef`
463
+ ref : `lsst.daf.butler.DatasetRef`
464
464
  The dataset to attach provenance to. This dataset must have been
465
465
  retrieved by this quantum context.
466
466
  extra : `dict` [ `str`, `int` | `float` | `str` | `bool` ]
@@ -338,6 +338,20 @@ class QuantumAttemptStatus(enum.Enum):
338
338
  """Whether the log dataset was produced."""
339
339
  return self is self.SUCCESSFUL or self is self.FAILED
340
340
 
341
+ @property
342
+ def title(self) -> str:
343
+ """A version of this status' name suitable for use as a title in a plot
344
+ or table.
345
+ """
346
+ return self.name.capitalize().replace("_", " ")
347
+
348
+ @property
349
+ def is_rare(self) -> bool:
350
+ """Whether this status is rare enough that it should only be listed
351
+ when it actually occurs.
352
+ """
353
+ return self in (self.ABORTED, self.ABORTED_SUCCESS, self.UNKNOWN)
354
+
341
355
 
342
356
  class GetSetDictMetadataHolder(Protocol):
343
357
  """Protocol for objects that have a ``metadata`` attribute that satisfies
@@ -45,6 +45,8 @@ __all__ = (
45
45
  "PACKAGES_INIT_OUTPUT_STORAGE_CLASS",
46
46
  "PROVENANCE_DATASET_TYPE_NAME",
47
47
  "PROVENANCE_STORAGE_CLASS",
48
+ "RESOURCE_USAGE_STORAGE_CLASS",
49
+ "RESOURCE_USAGE_TEMPLATE",
48
50
  )
49
51
 
50
52
 
@@ -99,3 +101,12 @@ PROVENANCE_DATASET_TYPE_NAME: str = "run_provenance"
99
101
 
100
102
  PROVENANCE_STORAGE_CLASS: str = "ProvenanceQuantumGraph"
101
103
  """Name of the storage class used to store provenance."""
104
+
105
+ RESOURCE_USAGE_TEMPLATE: str = "{label}_resource_usage"
106
+ """String template used to form the name of the resource usage dataset type for
107
+ a task.
108
+ """
109
+
110
+ RESOURCE_USAGE_STORAGE_CLASS: str = "ArrowAstropy"
111
+ """Storage class of the resource usage dataset type for a task.
112
+ """
@@ -32,6 +32,7 @@ __all__ = [
32
32
  "retrieve_artifacts_for_quanta",
33
33
  "aggregate_graph",
34
34
  "ingest_graph",
35
+ "provenance_report",
35
36
  ]
36
37
 
37
38
  from .commands import (
@@ -41,4 +42,5 @@ from .commands import (
41
42
  zip_from_graph,
42
43
  aggregate_graph,
43
44
  ingest_graph,
45
+ provenance_report,
44
46
  )
@@ -25,6 +25,9 @@
25
25
  # You should have received a copy of the GNU General Public License
26
26
  # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
27
 
28
+ import functools
29
+ import operator
30
+ from collections.abc import Iterable
28
31
  from typing import Any
29
32
 
30
33
  import click
@@ -40,6 +43,7 @@ from lsst.daf.butler.cli.opt import (
40
43
  from lsst.daf.butler.cli.utils import ButlerCommand, split_commas, unwrap
41
44
 
42
45
  from ... import script
46
+ from ..._status import QuantumAttemptStatus, QuantumSuccessCaveats
43
47
  from ...quantum_graph import aggregator
44
48
  from ..opt import instrument_argument, update_output_chain_option
45
49
 
@@ -279,7 +283,7 @@ def aggregate_graph(predicted_graph: str, repo: str, **kwargs: Any) -> None:
279
283
 
280
284
 
281
285
  @click.command(
282
- short_help="Ingest a provenance quantum graph into a butler, finalizing a RUN collection.",
286
+ short_help="Ingest a provenance quantum graph into a butler.",
283
287
  cls=ButlerCommand,
284
288
  )
285
289
  @repo_argument(required=True, help="Path or alias for the butler repository.")
@@ -306,3 +310,106 @@ def ingest_graph(
306
310
  from ...quantum_graph.ingest_graph import ingest_graph as ingest_graph_py
307
311
 
308
312
  ingest_graph_py(repo, provenance_graph, transfer=transfer, batch_size=batch_size, output_run=output_run)
313
+
314
+
315
+ @click.command(
316
+ short_help="Print and write provenance reports.",
317
+ cls=ButlerCommand,
318
+ )
319
+ @click.argument("repo_or_qg")
320
+ @click.argument("collection", required=False, default=None)
321
+ @click.option(
322
+ "--state",
323
+ multiple=True,
324
+ type=click.Choice(QuantumAttemptStatus),
325
+ help=(
326
+ "Additional quantum state to include in the status report and data ID tables "
327
+ "(FAILED, ABORTED, and ABORTED_SUCCESS are included by default)."
328
+ ),
329
+ )
330
+ @click.option(
331
+ "--no-state",
332
+ multiple=True,
333
+ type=str,
334
+ metavar="STATE",
335
+ help="Quantum state to drop from in status report and data ID tables (same options as --state).",
336
+ )
337
+ @click.option(
338
+ "--status-report",
339
+ default=None,
340
+ metavar="URI",
341
+ help="File or URI (.json) for a detailed report (with data IDs) on quanta with certain states.",
342
+ )
343
+ @click.option(
344
+ "--quantum-table/--no-quantum-table",
345
+ default=True,
346
+ help="Whether to print summary of quantum status counts to STDOUT.",
347
+ )
348
+ @click.option(
349
+ "--exception-table/--no-exception-table",
350
+ default=True,
351
+ help="Whether to print summary of exception type counts STDOUT.",
352
+ )
353
+ @click.option(
354
+ "--caveat",
355
+ multiple=True,
356
+ type=click.Choice(QuantumSuccessCaveats),
357
+ help=(
358
+ "Include successful quanta in the status report if they have this caveat. "
359
+ "May be passed multiple times; any matching caveat is included. "
360
+ "Passing this option implicitly adds '--state SUCCESSFUL'."
361
+ ),
362
+ )
363
+ @click.option(
364
+ "--data-id-table-dir",
365
+ default=None,
366
+ metavar="URI",
367
+ help=(
368
+ "Directory (may be a URI) for a tree of data ID tables for each "
369
+ "task label, status, and exception type combination in the status report."
370
+ ),
371
+ )
372
+ def provenance_report(
373
+ *,
374
+ repo_or_qg: str,
375
+ collection: str | None,
376
+ state: Iterable[QuantumAttemptStatus],
377
+ no_state: Iterable[str],
378
+ status_report: str | None,
379
+ quantum_table: bool = False,
380
+ exception_table: bool = False,
381
+ caveat: Iterable[QuantumSuccessCaveats],
382
+ data_id_table_dir: str | None,
383
+ ) -> None:
384
+ """Read a provenance quantum graph from a butler or file and use it to
385
+ generate reports.
386
+
387
+ REPO_OR_QG is a path or alias for the butler repository (if reading an
388
+ ingested graph, as indicated by passing COLLECTION), or the path to a
389
+ provenance quantum graph file.
390
+ """
391
+ from ...quantum_graph import ProvenanceQuantumGraph
392
+
393
+ states = set(state)
394
+ states.add(QuantumAttemptStatus.FAILED)
395
+ states.add(QuantumAttemptStatus.ABORTED)
396
+ states.add(QuantumAttemptStatus.ABORTED_SUCCESS)
397
+ for state_name in no_state:
398
+ states.discard(QuantumAttemptStatus.__members__[state_name])
399
+ with_caveats: QuantumSuccessCaveats | None = None
400
+ if caveat:
401
+ states.add(QuantumAttemptStatus.SUCCESSFUL)
402
+ with_caveats = functools.reduce(
403
+ operator.__or__,
404
+ caveat,
405
+ QuantumSuccessCaveats.NO_CAVEATS,
406
+ )
407
+ with ProvenanceQuantumGraph.from_args(repo_or_qg, collection=collection, datasets=()) as (graph, _):
408
+ graph.make_many_reports(
409
+ status_report_file=status_report,
410
+ states=states,
411
+ print_quantum_table=quantum_table,
412
+ print_exception_table=exception_table,
413
+ with_caveats=with_caveats,
414
+ data_id_table_dir=data_id_table_dir,
415
+ )
@@ -136,13 +136,14 @@ class QuantumGraph:
136
136
  Maps tasks to their InitOutput dataset refs. Dataset refs can be either
137
137
  resolved or non-resolved. For intermediate resolved refs their dataset
138
138
  ID must match ``initInputs`` and Quantum ``initInputs``.
139
- globalInitOutputs : iterable [ `~lsst.daf.butler.DatasetRef` ], optional
139
+ globalInitOutputs : `~collections.abc.Iterable` \
140
+ [ `~lsst.daf.butler.DatasetRef` ], optional
140
141
  Dataset refs for some global objects produced by pipeline. These
141
142
  objects include task configurations and package versions. Typically
142
143
  they have an empty DataId, but there is no real restriction on what
143
144
  can appear here.
144
- registryDatasetTypes : iterable [ `~lsst.daf.butler.DatasetType` ], \
145
- optional
145
+ registryDatasetTypes : `~collections.abc.Iterable` \
146
+ [ `~lsst.daf.butler.DatasetType` ], optional
146
147
  Dataset types which are used by this graph, their definitions must
147
148
  match registry. If registry does not define dataset type yet, then
148
149
  it should match one that will be created later.
@@ -488,7 +489,7 @@ class QuantumGraph:
488
489
 
489
490
  Returns
490
491
  -------
491
- tasks : iterable of `TaskDef`
492
+ tasks : `~collections.abc.Iterable` [ `TaskDef` ]
492
493
  `TaskDef` objects that have the specified `DatasetTypeName` as an
493
494
  input, list will be empty if no tasks use specified
494
495
  `DatasetTypeName` as an input.
@@ -537,7 +538,7 @@ class QuantumGraph:
537
538
 
538
539
  Returns
539
540
  -------
540
- result : iterable of `TaskDef`
541
+ result : `~collections.abc.Iterable` [`TaskDef`]
541
542
  `TaskDef` objects that are associated with the specified
542
543
  `DatasetTypeName`.
543
544
 
@@ -935,7 +936,7 @@ class QuantumGraph:
935
936
  saved structure. If supplied, the
936
937
  `~lsst.daf.butler.DimensionUniverse` from the loaded `QuantumGraph`
937
938
  will be validated against the supplied argument for compatibility.
938
- nodes : iterable of [ `uuid.UUID` | `str` ] or `None`
939
+ nodes : `~collections.abc.Iterable` [ `uuid.UUID` | `str` ] or `None`
939
940
  UUIDs that correspond to nodes in the graph. If specified, only
940
941
  these nodes will be loaded. Defaults to None, in which case all
941
942
  nodes will be loaded.
@@ -1220,7 +1221,7 @@ class QuantumGraph:
1220
1221
  saved structure. If supplied, the
1221
1222
  `~lsst.daf.butler.DimensionUniverse` from the loaded `QuantumGraph`
1222
1223
  will be validated against the supplied argument for compatibility.
1223
- nodes : iterable of `uuid.UUID` or `None`
1224
+ nodes : `~collections.abc.Iterable` [`uuid.UUID`] or `None`
1224
1225
  UUIDs that correspond to nodes in the graph. If specified, only
1225
1226
  these nodes will be loaded. Defaults to None, in which case all
1226
1227
  nodes will be loaded.
@@ -1438,7 +1439,7 @@ class QuantumGraph:
1438
1439
  Returns
1439
1440
  -------
1440
1441
  summary : `QgraphSummary`
1441
- Summary of QuantumGraph.
1442
+ Summary of QuantumGraph.
1442
1443
  """
1443
1444
  inCollection = self.metadata.get("input", None)
1444
1445
  if isinstance(inCollection, str):
@@ -103,7 +103,7 @@ class _ExecutionLogRecordsExtra(pydantic.BaseModel):
103
103
 
104
104
  Parameters
105
105
  ----------
106
- log_records : `ButlerLogRecords`
106
+ log_records : `lsst.daf.butler.ButlerLogRecords`
107
107
  Logs from a past attempt to run a quantum.
108
108
  """
109
109
  previous = self.model_validate(log_records.extra)
@@ -495,7 +495,7 @@ class Pipeline:
495
495
  Returns
496
496
  -------
497
497
  pipeline: `Pipeline`
498
- The new pipeline.
498
+ The new pipeline.
499
499
  """
500
500
  return cls.fromIR(copy.deepcopy(pipeline._pipelineIR))
501
501
 
@@ -605,7 +605,7 @@ class Pipeline:
605
605
 
606
606
  @property
607
607
  def subsets(self) -> MappingProxyType[str, set]:
608
- """Returns a `MappingProxyType` where the keys are the labels of
608
+ """Returns a `types.MappingProxyType` where the keys are the labels of
609
609
  labeled subsets in the `Pipeline` and the values are the set of task
610
610
  labels contained within that subset.
611
611
  """
@@ -700,7 +700,7 @@ class PipelineIR:
700
700
 
701
701
  Parameters
702
702
  ----------
703
- loaded_yaml: `dict`
703
+ loaded_yaml : `dict`
704
704
  A dictionary which matches the structure that would be produced
705
705
  by a yaml reader which parses a pipeline definition document
706
706
  """
@@ -106,8 +106,8 @@ class DatasetTypeNode:
106
106
  The internal networkx graph.
107
107
  get_registered : `~collections.abc.Callable` or `None`
108
108
  Callable that takes a dataset type name and returns the
109
- `DatasetType` registered in the data repository, or `None` if it is
110
- not registered.
109
+ `~lsst.daf.butler.DatasetType` registered in the data repository,
110
+ or `None` if it is not registered.
111
111
  dimensions : `lsst.daf.butler.DimensionUniverse`
112
112
  Definitions of all dimensions.
113
113
  previous : `DatasetTypeNode` or `None`
@@ -480,11 +480,11 @@ class ReadEdge(Edge):
480
480
  Parameters
481
481
  ----------
482
482
  current : `lsst.daf.butler.DatasetType` or `None`
483
- The current graph-wide `DatasetType`, or `None`. This will always
484
- be the registry's definition of the parent dataset type, if one
485
- exists. If not, it will be the dataset type definition from the
486
- task in the graph that writes it, if there is one. If there is no
487
- such task, this will be `None`.
483
+ The current graph-wide `~lsst.daf.butler.DatasetType`, or `None`.
484
+ This will always be the registry's definition of the parent dataset
485
+ type, if one exists. If not, it will be the dataset type
486
+ definition from the task in the graph that writes it, if there is
487
+ one. If there is no such task, this will be `None`.
488
488
  is_initial_query_constraint : `bool`
489
489
  Whether this dataset type is currently marked as a constraint on
490
490
  the initial data ID query in QuantumGraph generation.
@@ -496,7 +496,7 @@ class ReadEdge(Edge):
496
496
  producer : `str` or `None`
497
497
  The label of the task that produces this dataset type in the
498
498
  pipeline, or `None` if it is an overall input.
499
- consumers : `Sequence` [ `str` ]
499
+ consumers : `~collections.abc.Sequence` [ `str` ]
500
500
  Labels for other consuming tasks that have already participated in
501
501
  this dataset type's resolution.
502
502
  is_registered : `bool`
@@ -512,7 +512,7 @@ class ReadEdge(Edge):
512
512
 
513
513
  Returns
514
514
  -------
515
- dataset_type : `DatasetType`
515
+ dataset_type : `~lsst.daf.butler.DatasetType`
516
516
  The updated graph-wide dataset type. If ``current`` was provided,
517
517
  this must be equal to it.
518
518
  is_initial_query_constraint : `bool`
@@ -800,15 +800,15 @@ class WriteEdge(Edge):
800
800
  Parameters
801
801
  ----------
802
802
  current : `lsst.daf.butler.DatasetType` or `None`
803
- The current graph-wide `DatasetType`, or `None`. This will always
804
- be the registry's definition of the parent dataset type, if one
805
- exists.
803
+ The current graph-wide `~lsst.daf.butler.DatasetType`, or `None`.
804
+ This will always be the registry's definition of the parent dataset
805
+ type, if one exists.
806
806
  universe : `lsst.daf.butler.DimensionUniverse`
807
807
  Object that holds all dimension definitions.
808
808
 
809
809
  Returns
810
810
  -------
811
- dataset_type : `DatasetType`
811
+ dataset_type : `~lsst.daf.butler.DatasetType`
812
812
  A dataset type compatible with this edge. If ``current`` was
813
813
  provided, this must be equal to it.
814
814
 
@@ -1636,7 +1636,7 @@ class PipelineGraph:
1636
1636
 
1637
1637
  Returns
1638
1638
  -------
1639
- subgraphs : `Iterable` [ `PipelineGraph` ]
1639
+ subgraphs : `~collections.abc.Iterable` [ `PipelineGraph` ]
1640
1640
  An iterable over component subgraphs that could be run
1641
1641
  independently (they have only overall inputs in common). May be a
1642
1642
  lazy iterator.
@@ -2236,7 +2236,7 @@ class PipelineGraph:
2236
2236
 
2237
2237
  Parameters
2238
2238
  ----------
2239
- updates : `Mapping` [ `str`, `TaskNode` ]
2239
+ updates : `~collections.abc.Mapping` [ `str`, `TaskNode` ]
2240
2240
  New task nodes with task label keys. All keys must be task labels
2241
2241
  that are already present in the graph.
2242
2242
  check_edges_unchanged : `bool`, optional
@@ -66,7 +66,7 @@ def show_dot(
66
66
  ----------
67
67
  pipeline_graph : `PipelineGraph`
68
68
  Pipeline graph to show.
69
- stream : `TextIO`, optional
69
+ stream : `io.TextIO`, optional
70
70
  Stream to write the DOT representation to.
71
71
  label_edge_connections : `bool`, optional
72
72
  If `True`, label edges with their connection names.
@@ -167,21 +167,22 @@ def _render_dataset_type_node(
167
167
 
168
168
  Parameters
169
169
  ----------
170
- node_key : NodeKey
171
- The key for the node
172
- node_data : Mapping[str, Any]
173
- The data associated with the node
174
- options : NodeAttributeOptions
175
- Options for rendering the node
176
- stream : TextIO
177
- The stream to write the node to
170
+ node_key : `NodeKey`
171
+ The key for the node.
172
+ node_data : `~collections.abc.Mapping` [`str`, `typing.Any`]
173
+ The data associated with the node.
174
+ options : `NodeAttributeOptions`
175
+ Options for rendering the node.
176
+ stream : `io.TextIO`
177
+ The stream to write the node to.
178
+ overflow_ref : `int`, optional
178
179
 
179
180
  Returns
180
181
  -------
181
182
  overflow_ref : int
182
- The reference number for the next overflow node
183
+ The reference number for the next overflow node.
183
184
  overflow_ids : str | None
184
- The ID of the overflow node, if any
185
+ The ID of the overflow node, if any.
185
186
  """
186
187
  labels, label_extras, common_prefix = _format_label(str(node_key), _LABEL_MAX_LINES_SOFT)
187
188
  if len(labels) + len(label_extras) <= _LABEL_MAX_LINES_HARD:
@@ -271,7 +272,7 @@ def _render_edge(from_node_id: str, to_node_id: str, stream: TextIO, **kwargs: A
271
272
  The unique ID of the node the edge is going to
272
273
  stream : TextIO
273
274
  The stream to write the edge to
274
- kwargs : Any
275
+ **kwargs : Any
275
276
  Additional keyword arguments to pass to the edge
276
277
  """
277
278
  if kwargs:
@@ -200,6 +200,13 @@ class QuantumGraphExecutionStatusAnnotator:
200
200
  """Annotates a networkx graph with task and dataset status information from
201
201
  a quantum graph execution summary, implementing the StatusAnnotator
202
202
  protocol to update the graph with status data.
203
+
204
+ Parameters
205
+ ----------
206
+ *args : `typing.Any`
207
+ Arbitrary arguments.
208
+ **kwargs : `typing.Any`
209
+ Arbitrary keyword arguments.
203
210
  """
204
211
 
205
212
  def __init__(self, *args: Any, **kwargs: Any) -> None:
@@ -252,7 +252,8 @@ class PrerequisiteFinder:
252
252
  Sequence of collections to search, in order.
253
253
  data_id : `lsst.daf.butler.DataCoordinate`
254
254
  Data ID for the quantum.
255
- skypix_bounds : `Mapping` [ `str`, `lsst.sphgeom.RangeSet` ]
255
+ skypix_bounds : `~collections.abc.Mapping` \
256
+ [ `str`, `lsst.sphgeom.RangeSet` ]
256
257
  The spatial bounds of this quantum in various skypix dimensions.
257
258
  Keys are skypix dimension names (a superset of those in
258
259
  `dataset_skypix`) and values are sets of integer pixel ID ranges.