lsst-pipe-base 29.2025.1300__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.1300/python/lsst_pipe_base.egg-info → lsst_pipe_base-29.2025.1400}/PKG-INFO +1 -1
  2. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/all_dimensions_quantum_graph_builder.py +4 -0
  3. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/quantum_graph_skeleton.py +7 -0
  4. lsst_pipe_base-29.2025.1400/python/lsst/pipe/base/version.py +2 -0
  5. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400/python/lsst_pipe_base.egg-info}/PKG-INFO +1 -1
  6. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_graphBuilder.py +70 -2
  7. lsst_pipe_base-29.2025.1300/python/lsst/pipe/base/version.py +0 -2
  8. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/COPYRIGHT +0 -0
  9. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/LICENSE +0 -0
  10. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/MANIFEST.in +0 -0
  11. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/README.md +0 -0
  12. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/bsd_license.txt +0 -0
  13. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/CHANGES.rst +0 -0
  14. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/creating-a-pipeline.rst +0 -0
  15. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/creating-a-pipelinetask.rst +0 -0
  16. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/creating-a-task.rst +0 -0
  17. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/index.rst +0 -0
  18. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/task-framework-overview.rst +0 -0
  19. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/task-retargeting-howto.rst +0 -0
  20. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/testing-a-pipeline-task.rst +0 -0
  21. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/testing-pipelines-with-mocks.rst +0 -0
  22. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/doc/lsst.pipe.base/working-with-pipeline-graphs.rst +0 -0
  23. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/gpl-v3.0.txt +0 -0
  24. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/pyproject.toml +0 -0
  25. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/__init__.py +0 -0
  26. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/__init__.py +0 -0
  27. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/__init__.py +0 -0
  28. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_datasetQueryConstraints.py +0 -0
  29. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_dataset_handle.py +0 -0
  30. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_instrument.py +0 -0
  31. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_observation_dimension_packer.py +0 -0
  32. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_quantumContext.py +0 -0
  33. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_status.py +0 -0
  34. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/_task_metadata.py +0 -0
  35. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/automatic_connection_constants.py +0 -0
  36. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/caching_limited_butler.py +0 -0
  37. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/__init__.py +0 -0
  38. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/_get_cli_subcommands.py +0 -0
  39. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/cmd/__init__.py +0 -0
  40. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/cmd/commands.py +0 -0
  41. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/opt/__init__.py +0 -0
  42. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/opt/arguments.py +0 -0
  43. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/cli/opt/options.py +0 -0
  44. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/config.py +0 -0
  45. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/configOverrides.py +0 -0
  46. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/connectionTypes.py +0 -0
  47. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/connections.py +0 -0
  48. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/dot_tools.py +0 -0
  49. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/executionButlerBuilder.py +0 -0
  50. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/execution_reports.py +0 -0
  51. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/formatters/__init__.py +0 -0
  52. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/formatters/pexConfig.py +0 -0
  53. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/__init__.py +0 -0
  54. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/_implDetails.py +0 -0
  55. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/_loadHelpers.py +0 -0
  56. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/_versionDeserializers.py +0 -0
  57. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/graph.py +0 -0
  58. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/graphSummary.py +0 -0
  59. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/graph/quantumNode.py +0 -0
  60. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/mermaid_tools.py +0 -0
  61. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline.py +0 -0
  62. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipelineIR.py +0 -0
  63. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipelineTask.py +0 -0
  64. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/__init__.py +0 -0
  65. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/__main__.py +0 -0
  66. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_dataset_types.py +0 -0
  67. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_edges.py +0 -0
  68. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_exceptions.py +0 -0
  69. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_mapping_views.py +0 -0
  70. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_nodes.py +0 -0
  71. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_pipeline_graph.py +0 -0
  72. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_task_subsets.py +0 -0
  73. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/_tasks.py +0 -0
  74. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/io.py +0 -0
  75. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/__init__.py +0 -0
  76. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_dot.py +0 -0
  77. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_formatting.py +0 -0
  78. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_layout.py +0 -0
  79. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_merge.py +0 -0
  80. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_mermaid.py +0 -0
  81. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_options.py +0 -0
  82. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_printer.py +0 -0
  83. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/pipeline_graph/visualization/_show.py +0 -0
  84. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/prerequisite_helpers.py +0 -0
  85. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/py.typed +0 -0
  86. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/quantum_graph_builder.py +0 -0
  87. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/quantum_provenance_graph.py +0 -0
  88. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/__init__.py +0 -0
  89. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/register_instrument.py +0 -0
  90. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/retrieve_artifacts_for_quanta.py +0 -0
  91. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/transfer_from_graph.py +0 -0
  92. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/script/zip_from_graph.py +0 -0
  93. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/struct.py +0 -0
  94. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/task.py +0 -0
  95. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/taskFactory.py +0 -0
  96. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/testUtils.py +0 -0
  97. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/__init__.py +0 -0
  98. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/__init__.py +0 -0
  99. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/_data_id_match.py +0 -0
  100. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/_pipeline_task.py +0 -0
  101. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/mocks/_storage_class.py +0 -0
  102. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/no_dimensions.py +0 -0
  103. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/pipelineStepTester.py +0 -0
  104. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/simpleQGraph.py +0 -0
  105. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/tests/util.py +0 -0
  106. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst/pipe/base/utils.py +0 -0
  107. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/SOURCES.txt +0 -0
  108. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/dependency_links.txt +0 -0
  109. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/entry_points.txt +0 -0
  110. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/requires.txt +0 -0
  111. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/top_level.txt +0 -0
  112. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/python/lsst_pipe_base.egg-info/zip-safe +0 -0
  113. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/setup.cfg +0 -0
  114. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_adjust_all_quanta.py +0 -0
  115. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_caching_limited_butler.py +0 -0
  116. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_cliCmdRegisterInstrument.py +0 -0
  117. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_configOverrides.py +0 -0
  118. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_config_formatter.py +0 -0
  119. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_connections.py +0 -0
  120. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_dataid_match.py +0 -0
  121. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_dataset_handle.py +0 -0
  122. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_dot_tools.py +0 -0
  123. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_dynamic_connections.py +0 -0
  124. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_executionButler.py +0 -0
  125. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_execution_reports.py +0 -0
  126. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_init_output_run.py +0 -0
  127. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_instrument.py +0 -0
  128. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_mermaid.py +0 -0
  129. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_pipeline.py +0 -0
  130. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_pipelineIR.py +0 -0
  131. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_pipelineLoadSubset.py +0 -0
  132. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_pipelineTask.py +0 -0
  133. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_pipeline_graph.py +0 -0
  134. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_quantumGraph.py +0 -0
  135. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_quantum_provenance_graph.py +0 -0
  136. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_quantum_success_caveats.py +0 -0
  137. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_struct.py +0 -0
  138. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_task.py +0 -0
  139. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_taskmetadata.py +0 -0
  140. {lsst_pipe_base-29.2025.1300 → lsst_pipe_base-29.2025.1400}/tests/test_testUtils.py +0 -0
  141. {lsst_pipe_base-29.2025.1300 → 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.1300
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
@@ -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.1300
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.1300"