lsst-pipe-base 29.2025.1500__tar.gz → 29.2025.1600__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 (144) hide show
  1. {lsst_pipe_base-29.2025.1500/python/lsst_pipe_base.egg-info → lsst_pipe_base-29.2025.1600}/PKG-INFO +1 -1
  2. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/all_dimensions_quantum_graph_builder.py +17 -0
  3. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/_loadHelpers.py +4 -0
  4. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/graph.py +2 -2
  5. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline.py +1 -1
  6. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipelineIR.py +10 -1
  7. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_mermaid.py +17 -25
  8. lsst_pipe_base-29.2025.1600/python/lsst/pipe/base/version.py +2 -0
  9. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600/python/lsst_pipe_base.egg-info}/PKG-INFO +1 -1
  10. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_pipeline.py +22 -0
  11. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_pipelineIR.py +32 -32
  12. lsst_pipe_base-29.2025.1500/python/lsst/pipe/base/version.py +0 -2
  13. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/COPYRIGHT +0 -0
  14. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/LICENSE +0 -0
  15. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/MANIFEST.in +0 -0
  16. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/README.md +0 -0
  17. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/bsd_license.txt +0 -0
  18. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/CHANGES.rst +0 -0
  19. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/creating-a-pipeline.rst +0 -0
  20. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/creating-a-pipelinetask.rst +0 -0
  21. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/creating-a-task.rst +0 -0
  22. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/index.rst +0 -0
  23. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/task-framework-overview.rst +0 -0
  24. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/task-retargeting-howto.rst +0 -0
  25. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/testing-a-pipeline-task.rst +0 -0
  26. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/testing-pipelines-with-mocks.rst +0 -0
  27. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/doc/lsst.pipe.base/working-with-pipeline-graphs.rst +0 -0
  28. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/gpl-v3.0.txt +0 -0
  29. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/pyproject.toml +0 -0
  30. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/__init__.py +0 -0
  31. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/__init__.py +0 -0
  32. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/__init__.py +0 -0
  33. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_datasetQueryConstraints.py +0 -0
  34. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_dataset_handle.py +0 -0
  35. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_instrument.py +0 -0
  36. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_observation_dimension_packer.py +0 -0
  37. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_quantumContext.py +0 -0
  38. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_status.py +0 -0
  39. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/_task_metadata.py +0 -0
  40. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/automatic_connection_constants.py +0 -0
  41. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/caching_limited_butler.py +0 -0
  42. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/__init__.py +0 -0
  43. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/_get_cli_subcommands.py +0 -0
  44. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/cmd/__init__.py +0 -0
  45. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/cmd/commands.py +0 -0
  46. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/opt/__init__.py +0 -0
  47. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/opt/arguments.py +0 -0
  48. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/cli/opt/options.py +0 -0
  49. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/config.py +0 -0
  50. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/configOverrides.py +0 -0
  51. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/connectionTypes.py +0 -0
  52. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/connections.py +0 -0
  53. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/dot_tools.py +0 -0
  54. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/executionButlerBuilder.py +0 -0
  55. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/execution_reports.py +0 -0
  56. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/formatters/__init__.py +0 -0
  57. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/formatters/pexConfig.py +0 -0
  58. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/__init__.py +0 -0
  59. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/_implDetails.py +0 -0
  60. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/_versionDeserializers.py +0 -0
  61. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/graphSummary.py +0 -0
  62. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/graph/quantumNode.py +0 -0
  63. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/mermaid_tools.py +0 -0
  64. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipelineTask.py +0 -0
  65. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/__init__.py +0 -0
  66. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/__main__.py +0 -0
  67. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_dataset_types.py +0 -0
  68. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_edges.py +0 -0
  69. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_exceptions.py +0 -0
  70. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_mapping_views.py +0 -0
  71. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_nodes.py +0 -0
  72. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_pipeline_graph.py +0 -0
  73. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_task_subsets.py +0 -0
  74. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/_tasks.py +0 -0
  75. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/expressions.py +0 -0
  76. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/io.py +0 -0
  77. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/__init__.py +0 -0
  78. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_dot.py +0 -0
  79. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_formatting.py +0 -0
  80. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_layout.py +0 -0
  81. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_merge.py +0 -0
  82. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_options.py +0 -0
  83. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_printer.py +0 -0
  84. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_show.py +0 -0
  85. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py +0 -0
  86. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/prerequisite_helpers.py +0 -0
  87. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/py.typed +0 -0
  88. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/quantum_graph_builder.py +0 -0
  89. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/quantum_graph_skeleton.py +0 -0
  90. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/quantum_provenance_graph.py +0 -0
  91. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/script/__init__.py +0 -0
  92. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/script/register_instrument.py +0 -0
  93. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/script/retrieve_artifacts_for_quanta.py +0 -0
  94. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/script/transfer_from_graph.py +0 -0
  95. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/script/zip_from_graph.py +0 -0
  96. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/struct.py +0 -0
  97. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/task.py +0 -0
  98. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/taskFactory.py +0 -0
  99. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/testUtils.py +0 -0
  100. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/__init__.py +0 -0
  101. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/mocks/__init__.py +0 -0
  102. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/mocks/_data_id_match.py +0 -0
  103. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/mocks/_pipeline_task.py +0 -0
  104. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/mocks/_storage_class.py +0 -0
  105. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/no_dimensions.py +0 -0
  106. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/pipelineStepTester.py +0 -0
  107. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/simpleQGraph.py +0 -0
  108. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/tests/util.py +0 -0
  109. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst/pipe/base/utils.py +0 -0
  110. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst_pipe_base.egg-info/SOURCES.txt +0 -0
  111. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst_pipe_base.egg-info/dependency_links.txt +0 -0
  112. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst_pipe_base.egg-info/entry_points.txt +0 -0
  113. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst_pipe_base.egg-info/requires.txt +0 -0
  114. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst_pipe_base.egg-info/top_level.txt +0 -0
  115. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/python/lsst_pipe_base.egg-info/zip-safe +0 -0
  116. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/setup.cfg +0 -0
  117. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_adjust_all_quanta.py +0 -0
  118. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_caching_limited_butler.py +0 -0
  119. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_cliCmdRegisterInstrument.py +0 -0
  120. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_configOverrides.py +0 -0
  121. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_config_formatter.py +0 -0
  122. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_connections.py +0 -0
  123. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_dataid_match.py +0 -0
  124. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_dataset_handle.py +0 -0
  125. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_dot_tools.py +0 -0
  126. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_dynamic_connections.py +0 -0
  127. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_executionButler.py +0 -0
  128. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_execution_reports.py +0 -0
  129. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_graphBuilder.py +0 -0
  130. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_init_output_run.py +0 -0
  131. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_instrument.py +0 -0
  132. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_mermaid.py +0 -0
  133. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_pipelineLoadSubset.py +0 -0
  134. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_pipelineTask.py +0 -0
  135. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_pipeline_graph.py +0 -0
  136. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_pipeline_graph_expressions.py +0 -0
  137. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_quantumGraph.py +0 -0
  138. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_quantum_provenance_graph.py +0 -0
  139. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_quantum_success_caveats.py +0 -0
  140. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_struct.py +0 -0
  141. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_task.py +0 -0
  142. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_taskmetadata.py +0 -0
  143. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/tests/test_testUtils.py +0 -0
  144. {lsst_pipe_base-29.2025.1500 → lsst_pipe_base-29.2025.1600}/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.1500
3
+ Version: 29.2025.1600
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
@@ -39,6 +39,8 @@ from collections import defaultdict
39
39
  from collections.abc import Iterable, Mapping
40
40
  from typing import TYPE_CHECKING, Any, TypeAlias, final
41
41
 
42
+ import astropy.table
43
+
42
44
  from lsst.daf.butler import (
43
45
  Butler,
44
46
  DataCoordinate,
@@ -85,6 +87,11 @@ class AllDimensionsQuantumGraphBuilder(QuantumGraphBuilder):
85
87
  (sometimes catastrophically bad) query plan.
86
88
  bind : `~collections.abc.Mapping`, optional
87
89
  Variable substitutions for the ``where`` expression.
90
+ data_id_tables : `~collections.abc.Iterable` [ `astropy.table.Table` ],\
91
+ optional
92
+ Tables of data IDs to join in as constraints. Missing dimensions that
93
+ are constrained by the ``where`` argument or pipeline data ID will be
94
+ filled in automatically.
88
95
  **kwargs
89
96
  Additional keyword arguments forwarded to `QuantumGraphBuilder`.
90
97
 
@@ -113,6 +120,7 @@ class AllDimensionsQuantumGraphBuilder(QuantumGraphBuilder):
113
120
  where: str = "",
114
121
  dataset_query_constraint: DatasetQueryConstraintVariant = DatasetQueryConstraintVariant.ALL,
115
122
  bind: Mapping[str, Any] | None = None,
123
+ data_id_tables: Iterable[astropy.table.Table] = (),
116
124
  **kwargs: Any,
117
125
  ):
118
126
  super().__init__(pipeline_graph, butler, **kwargs)
@@ -120,6 +128,7 @@ class AllDimensionsQuantumGraphBuilder(QuantumGraphBuilder):
120
128
  self.where = where
121
129
  self.dataset_query_constraint = dataset_query_constraint
122
130
  self.bind = bind
131
+ self.data_id_tables = list(data_id_tables)
123
132
 
124
133
  @timeMethod
125
134
  def process_subgraph(self, subgraph: PipelineGraph) -> QuantumGraphSkeleton:
@@ -194,6 +203,14 @@ class AllDimensionsQuantumGraphBuilder(QuantumGraphBuilder):
194
203
  f"{self.where!r}, bind={self.bind!r})"
195
204
  )
196
205
  query = query.where(tree.subgraph.data_id, self.where, bind=self.bind)
206
+ # It's important for tables to be joined in last, so data IDs from
207
+ # pipeline and where can be used to fill in missing columns.
208
+ for table in self.data_id_tables:
209
+ # If this is from ctrl_mpexec's pipetask, it'll have added
210
+ # a filename to the metadata for us.
211
+ table_name = table.meta.get("filename", "unknown")
212
+ query_cmd.append(f" query = query.join_data_coordinate_table(<{table_name}>)")
213
+ query = query.join_data_coordinate_table(table)
197
214
  self.log.verbose("Querying for data IDs via: %s", "\n".join(query_cmd))
198
215
  # Allow duplicates from common skypix overlaps to make some queries
199
216
  # run faster.
@@ -65,6 +65,7 @@ class LoadHelper(AbstractContextManager["LoadHelper"]):
65
65
  to upgrade them to the latest format before they can be used in
66
66
  production.
67
67
  """
68
+ fullRead: bool = False
68
69
 
69
70
  def __post_init__(self) -> None:
70
71
  self._resourceHandle: ResourceHandleProtocol | None = None
@@ -261,6 +262,9 @@ class LoadHelper(AbstractContextManager["LoadHelper"]):
261
262
  def __enter__(self) -> LoadHelper:
262
263
  if isinstance(self.uri, BinaryIO | BytesIO | BufferedRandom):
263
264
  self._resourceHandle = self.uri
265
+ elif self.fullRead:
266
+ local = self._exitStack.enter_context(self.uri.as_local())
267
+ self._resourceHandle = self._exitStack.enter_context(local.open("rb"))
264
268
  else:
265
269
  self._resourceHandle = self._exitStack.enter_context(self.uri.open("rb"))
266
270
  self._initialize()
@@ -963,7 +963,7 @@ class QuantumGraph:
963
963
  """
964
964
  uri = ResourcePath(uri)
965
965
  if uri.getExtension() in {".qgraph"}:
966
- with LoadHelper(uri, minimumVersion) as loader:
966
+ with LoadHelper(uri, minimumVersion, fullRead=(nodes is None)) as loader:
967
967
  qgraph = loader.load(universe, nodes, graphID)
968
968
  else:
969
969
  raise ValueError(f"Only know how to handle files saved as `.qgraph`, not {uri}")
@@ -1230,7 +1230,7 @@ class QuantumGraph:
1230
1230
  being loaded or if the supplied uri does not point at a valid
1231
1231
  `QuantumGraph` save file.
1232
1232
  """
1233
- with LoadHelper(file, minimumVersion) as loader:
1233
+ with LoadHelper(file, minimumVersion, fullRead=(nodes is None)) as loader:
1234
1234
  qgraph = loader.load(universe, nodes, graphID)
1235
1235
  if not isinstance(qgraph, QuantumGraph):
1236
1236
  raise TypeError(f"QuantumGraph file contains unexpected object type: {type(qgraph)}")
@@ -427,7 +427,7 @@ class Pipeline:
427
427
  if "," in label_subset:
428
428
  if ".." in label_subset:
429
429
  raise ValueError(
430
- "Can only specify a list of labels or a rangewhen loading a Pipline not both"
430
+ "Can only specify a list of labels or a range when loading a Pipeline, not both."
431
431
  )
432
432
  args = {"labels": set(label_subset.split(","))}
433
433
  # labels supplied as a range
@@ -980,10 +980,19 @@ class PipelineIR:
980
980
  if extraTaskLabels := (labeled_subset.subset - pipeline.tasks.keys()):
981
981
  match subsetCtrl:
982
982
  case PipelineSubsetCtrl.DROP:
983
- pipeline.labeled_subsets.pop(label)
983
+ del pipeline.labeled_subsets[label]
984
984
  case PipelineSubsetCtrl.EDIT:
985
985
  for extra in extraTaskLabels:
986
986
  labeled_subset.subset.discard(extra)
987
+ elif subsetCtrl is PipelineSubsetCtrl.DROP and not labeled_subset.subset:
988
+ # When mode is DROP, also drop any subsets that were already
989
+ # empty. This ensures we drop steps that were emptied-out by
990
+ # (earlier) imports with exclude in EDIT mode. Note that we
991
+ # don't want to drop those steps when they're first excluded
992
+ # down to nothing, because the pipeline might be about to add
993
+ # new tasks back into them, and then we'd want to preserve the
994
+ # step definitions.
995
+ del pipeline.labeled_subsets[label]
987
996
 
988
997
  # remove any steps that correspond to removed subsets
989
998
  new_steps = []
@@ -32,8 +32,8 @@ import html
32
32
  import os
33
33
  import sys
34
34
  from collections.abc import Mapping
35
- from io import BufferedIOBase, BytesIO, StringIO, TextIOBase
36
- from typing import Any, TextIO
35
+ from io import StringIO
36
+ from typing import IO, Any
37
37
 
38
38
  from .._nodes import NodeType
39
39
  from .._pipeline_graph import PipelineGraph
@@ -58,7 +58,7 @@ _OVERFLOW_MAX_LINES = 20
58
58
 
59
59
  def show_mermaid(
60
60
  pipeline_graph: PipelineGraph,
61
- stream: TextIO | BytesIO = sys.stdout,
61
+ stream: IO[Any] = sys.stdout,
62
62
  output_format: str = "mmd",
63
63
  width: int | None = None,
64
64
  height: int | None = None,
@@ -78,7 +78,7 @@ def show_mermaid(
78
78
  ----------
79
79
  pipeline_graph : `PipelineGraph`
80
80
  The pipeline graph to visualize.
81
- stream : `TextIO` or `BytesIO`, optional
81
+ stream : `typing.IO`, optional
82
82
  The output stream where Mermaid code is written. Defaults to
83
83
  `sys.stdout`.
84
84
  output_format : str, optional
@@ -113,19 +113,11 @@ def show_mermaid(
113
113
  mermaid_source = _generate_mermaid_source(pipeline_graph, **kwargs)
114
114
 
115
115
  if output_format == "mmd":
116
- if isinstance(stream, TextIOBase):
117
- # Write Mermaid source as a string.
118
- stream.write(mermaid_source)
119
- else:
120
- raise TypeError(f"Expected a text stream, but got {type(stream)}.")
116
+ # Write Mermaid source as a string.
117
+ stream.write(mermaid_source)
121
118
  else:
122
- if isinstance(stream, BufferedIOBase):
123
- # Render Mermaid source as an image and write to binary stream.
124
- _render_mermaid_image(
125
- mermaid_source, stream, output_format, width=width, height=height, scale=scale
126
- )
127
- else:
128
- raise ValueError(f"Expected a binary stream, but got {type(stream)}.")
119
+ # Render Mermaid source as an image and write to binary stream.
120
+ _render_mermaid_image(mermaid_source, stream, output_format, width=width, height=height, scale=scale)
129
121
 
130
122
 
131
123
  def _generate_mermaid_source(pipeline_graph: PipelineGraph, **kwargs: Any) -> str:
@@ -210,7 +202,7 @@ def _generate_mermaid_source(pipeline_graph: PipelineGraph, **kwargs: Any) -> st
210
202
 
211
203
  def _render_mermaid_image(
212
204
  mermaid_source: str,
213
- binary_stream: BytesIO,
205
+ binary_stream: IO[bytes],
214
206
  output_format: str,
215
207
  width: int | None = None,
216
208
  height: int | None = None,
@@ -287,7 +279,7 @@ def _render_task_node(
287
279
  node_key: NodeKey,
288
280
  node_data: Mapping[str, Any],
289
281
  options: NodeAttributeOptions,
290
- stream: TextIO,
282
+ stream: IO[str],
291
283
  ) -> None:
292
284
  """Render a Mermaid node for a task or task-init node.
293
285
 
@@ -301,7 +293,7 @@ def _render_task_node(
301
293
  options : NodeAttributeOptions
302
294
  Rendering options controlling whether to show dimensions, storage
303
295
  classes, etc.
304
- stream : TextIO
296
+ stream : `typing.IO` [ `str` ]
305
297
  The output stream for Mermaid syntax.
306
298
  """
307
299
  # Convert node_key into a label, handling line splitting and prefix
@@ -337,7 +329,7 @@ def _render_dataset_type_node(
337
329
  node_key: NodeKey,
338
330
  node_data: Mapping[str, Any],
339
331
  options: NodeAttributeOptions,
340
- stream: TextIO,
332
+ stream: IO[str],
341
333
  overflow_ref: int,
342
334
  ) -> tuple[int, list[str]]:
343
335
  """Render a Mermaid node for a dataset-type node, handling overflow lines
@@ -355,7 +347,7 @@ def _render_dataset_type_node(
355
347
  options : NodeAttributeOptions
356
348
  Rendering options controlling whether to show dimensions and storage
357
349
  classes.
358
- stream : TextIO
350
+ stream : `typing.IO` [ `str` ]
359
351
  The output stream for Mermaid syntax.
360
352
  overflow_ref : int
361
353
  The current reference number for overflow nodes. If overflow occurs,
@@ -414,7 +406,7 @@ def _render_dataset_type_node(
414
406
  return overflow_ref, overflow_ids
415
407
 
416
408
 
417
- def _render_simple_node(node_id: str, lines: list[str], node_class: str, stream: TextIO) -> None:
409
+ def _render_simple_node(node_id: str, lines: list[str], node_class: str, stream: IO[str]) -> None:
418
410
  """Render a simple Mermaid node with given lines and a class.
419
411
 
420
412
  This helper function is used for both primary nodes and overflow nodes once
@@ -429,7 +421,7 @@ def _render_simple_node(node_id: str, lines: list[str], node_class: str, stream:
429
421
  node_class : str
430
422
  Mermaid class name to style the node (e.g., 'dsType', 'task',
431
423
  'taskInit').
432
- stream : TextIO
424
+ stream : `typing.IO` [ `str` ]
433
425
  The output stream.
434
426
  """
435
427
  label = "<br>".join(lines)
@@ -437,7 +429,7 @@ def _render_simple_node(node_id: str, lines: list[str], node_class: str, stream:
437
429
  print(f"class {node_id} {node_class};", file=stream)
438
430
 
439
431
 
440
- def _render_edge(from_node_id: str, to_node_id: str, is_prerequisite: bool, stream: TextIO) -> None:
432
+ def _render_edge(from_node_id: str, to_node_id: str, is_prerequisite: bool, stream: IO[str]) -> None:
441
433
  """Render a Mermaid edge from one node to another.
442
434
 
443
435
  Edges in Mermaid are normally specified as `A --> B`. Prerequisite edges
@@ -453,7 +445,7 @@ def _render_edge(from_node_id: str, to_node_id: str, is_prerequisite: bool, stre
453
445
  is_prerequisite : bool
454
446
  If True, this edge represents a prerequisite connection and will be
455
447
  styled as dashed.
456
- stream : TextIO
448
+ stream : `typing.IO` [ `str` ]
457
449
  The output stream for Mermaid syntax.
458
450
  """
459
451
  # At this stage, we simply print the edge. The styling (dashed) for
@@ -0,0 +1,2 @@
1
+ __all__ = ["__version__"]
2
+ __version__ = "29.2025.1600"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 29.2025.1500
3
+ Version: 29.2025.1600
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
@@ -27,6 +27,7 @@
27
27
 
28
28
  """Simple unit test for Pipeline."""
29
29
 
30
+ import os
30
31
  import pickle
31
32
  import textwrap
32
33
  import unittest
@@ -36,6 +37,9 @@ from lsst.pipe.base import LabelSpecifier, Pipeline, TaskDef
36
37
  from lsst.pipe.base.pipelineIR import LabeledSubset
37
38
  from lsst.pipe.base.tests.simpleQGraph import AddTask, makeSimplePipeline
38
39
 
40
+ # Find where the test pipelines exist and store it in an environment variable.
41
+ os.environ["TESTDIR"] = os.path.dirname(__file__)
42
+
39
43
 
40
44
  class PipelineTestCase(unittest.TestCase):
41
45
  """A test case for TaskDef and Pipeline."""
@@ -201,6 +205,24 @@ class PipelineTestCase(unittest.TestCase):
201
205
  pipeline_graph = pipeline.to_graph()
202
206
  self.assertEqual(list(pipeline_graph.steps), ["step1"])
203
207
 
208
+ def test_excluded_steps(self) -> None:
209
+ """Test that a step that is modified on import to contain no tasks is
210
+ initially preserved, but dropped later in further subsetting with
211
+ mode=DROP (e.g. with URI parameters).
212
+ """
213
+ # This pipeline has two steps, but the second empty due to an import
214
+ # exclusion of the only task in it.
215
+ pg1 = Pipeline.from_uri("$TESTDIR/pipelines/step-exclusion.yaml").to_graph()
216
+ self.assertEqual(list(pg1.steps), ["step1", "step2"])
217
+ self.assertEqual(pg1.task_subsets["step1"], {"a", "b"})
218
+ self.assertEqual(pg1.task_subsets["step2"], set())
219
+ # If we load just one task from the pipeline (which subsets in DROP
220
+ # mode), we want the already-empty step to be dropped as well, since
221
+ # otherwise we'll get a complaint that there are steps and task 'a' is
222
+ # not in any of them.
223
+ pg2 = Pipeline.from_uri("$TESTDIR/pipelines/step-exclusion.yaml#a").to_graph()
224
+ self.assertEqual(list(pg2.steps), [])
225
+
204
226
 
205
227
  class MyMemoryTestCase(lsst.utils.tests.MemoryTestCase):
206
228
  """Run file leak tests."""
@@ -129,8 +129,8 @@ class PipelineIRTestCase(unittest.TestCase):
129
129
  """
130
130
  description: Test Pipeline
131
131
  imports:
132
- - $TESTDIR/testPipeline1.yaml
133
- - $TESTDIR/testPipeline2.yaml
132
+ - $TESTDIR/pipelines/testPipeline1.yaml
133
+ - $TESTDIR/pipelines/testPipeline2.yaml
134
134
  """
135
135
  )
136
136
  # "modA" is the duplicated label, and it should appear in the error.
@@ -142,9 +142,9 @@ class PipelineIRTestCase(unittest.TestCase):
142
142
  """
143
143
  description: Test Pipeline
144
144
  imports:
145
- - location: $TESTDIR/testPipeline1.yaml
145
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
146
146
  exclude: modA
147
- - $TESTDIR/testPipeline2.yaml
147
+ - $TESTDIR/pipelines/testPipeline2.yaml
148
148
  """
149
149
  )
150
150
  pipeline = PipelineIR.from_string(pipeline_str)
@@ -155,10 +155,10 @@ class PipelineIRTestCase(unittest.TestCase):
155
155
  """
156
156
  description: Test Pipeline
157
157
  imports:
158
- - location: $TESTDIR/testPipeline1.yaml
158
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
159
159
  include: modB
160
160
  labeledSubsetModifyMode: DROP
161
- - $TESTDIR/testPipeline2.yaml
161
+ - $TESTDIR/pipelines/testPipeline2.yaml
162
162
  """
163
163
  )
164
164
 
@@ -170,11 +170,11 @@ class PipelineIRTestCase(unittest.TestCase):
170
170
  """
171
171
  description: Test Pipeline
172
172
  imports:
173
- - location: $TESTDIR/testPipeline1.yaml
173
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
174
174
  exclude: modA
175
175
  include: modB
176
176
  labeledSubsetModifyMode: EDIT
177
- - $TESTDIR/testPipeline2.yaml
177
+ - $TESTDIR/pipelines/testPipeline2.yaml
178
178
  """
179
179
  )
180
180
 
@@ -186,11 +186,11 @@ class PipelineIRTestCase(unittest.TestCase):
186
186
  """
187
187
  description: Test Pipeline
188
188
  imports:
189
- - location: $TESTDIR/testPipeline1.yaml
189
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
190
190
  exclude: modA
191
191
  include: modB
192
192
  labeledSubsetModifyMode: WRONG
193
- - $TESTDIR/testPipeline2.yaml
193
+ - $TESTDIR/pipelines/testPipeline2.yaml
194
194
  """
195
195
  )
196
196
  with self.assertRaises(ValueError):
@@ -201,7 +201,7 @@ class PipelineIRTestCase(unittest.TestCase):
201
201
  """
202
202
  description: Test Pipeline
203
203
  imports:
204
- - $TESTDIR/testPipeline1.yaml
204
+ - $TESTDIR/pipelines/testPipeline1.yaml
205
205
  """
206
206
  )
207
207
 
@@ -213,7 +213,7 @@ class PipelineIRTestCase(unittest.TestCase):
213
213
  """
214
214
  description: Test Pipeline
215
215
  imports:
216
- - location: $TESTDIR/testPipeline1.yaml
216
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
217
217
  importContracts: False
218
218
  """
219
219
  )
@@ -227,7 +227,7 @@ class PipelineIRTestCase(unittest.TestCase):
227
227
  """
228
228
  description: Test Pipeline
229
229
  imports:
230
- - $TESTDIR/testPipeline2.yaml
230
+ - $TESTDIR/pipelines/testPipeline2.yaml
231
231
  tasks:
232
232
  modA:
233
233
  class: "test.moduleA"
@@ -244,7 +244,7 @@ class PipelineIRTestCase(unittest.TestCase):
244
244
  """
245
245
  description: Test Pipeline
246
246
  imports:
247
- - $TESTDIR/testPipeline2.yaml
247
+ - $TESTDIR/pipelines/testPipeline2.yaml
248
248
  tasks:
249
249
  modA:
250
250
  class: "test.moduleAReplace"
@@ -260,7 +260,7 @@ class PipelineIRTestCase(unittest.TestCase):
260
260
  """
261
261
  description: Test Pipeline
262
262
  imports:
263
- - $TESTDIR/testPipeline2.yaml
263
+ - $TESTDIR/pipelines/testPipeline2.yaml
264
264
  """
265
265
  )
266
266
  pipeline = PipelineIR.from_string(pipeline_str)
@@ -272,7 +272,7 @@ class PipelineIRTestCase(unittest.TestCase):
272
272
  """
273
273
  description: Test Pipeline
274
274
  imports:
275
- - $TESTDIR/testPipeline2.yaml
275
+ - $TESTDIR/pipelines/testPipeline2.yaml
276
276
  tasks:
277
277
  modE: "test.moduleE"
278
278
  subsets:
@@ -290,8 +290,8 @@ class PipelineIRTestCase(unittest.TestCase):
290
290
  """
291
291
  description: Test Pipeline
292
292
  imports:
293
- - $TESTDIR/testPipeline2.yaml
294
- - $TESTDIR/testPipeline3.yaml
293
+ - $TESTDIR/pipelines/testPipeline2.yaml
294
+ - $TESTDIR/pipelines/testPipeline3.yaml
295
295
  """
296
296
  )
297
297
  with self.assertRaises(ValueError):
@@ -303,7 +303,7 @@ class PipelineIRTestCase(unittest.TestCase):
303
303
  """
304
304
  description: Test Pipeline
305
305
  imports:
306
- - $TESTDIR/testPipeline2.yaml
306
+ - $TESTDIR/pipelines/testPipeline2.yaml
307
307
  tasks:
308
308
  modSubset: "test.moduleE"
309
309
  """
@@ -316,8 +316,8 @@ class PipelineIRTestCase(unittest.TestCase):
316
316
  """
317
317
  description: Test Pipeline
318
318
  imports:
319
- - $TESTDIR/testPipeline2.yaml
320
- - $TESTDIR/testPipeline4.yaml
319
+ - $TESTDIR/pipelines/testPipeline2.yaml
320
+ - $TESTDIR/pipelines/testPipeline4.yaml
321
321
  """
322
322
  )
323
323
  with self.assertRaises(ValueError):
@@ -328,7 +328,7 @@ class PipelineIRTestCase(unittest.TestCase):
328
328
  """
329
329
  description: Test Pipeline
330
330
  imports:
331
- - $TESTDIR/testPipeline5.yaml
331
+ - $TESTDIR/pipelines/testPipeline5.yaml
332
332
  steps:
333
333
  - label: sub1
334
334
  dimensions: ['a', 'e']
@@ -342,7 +342,7 @@ class PipelineIRTestCase(unittest.TestCase):
342
342
  """
343
343
  description: Test Pipeline
344
344
  imports:
345
- - location: $TESTDIR/testPipeline5.yaml
345
+ - location: $TESTDIR/pipelines/testPipeline5.yaml
346
346
  importSteps: false
347
347
  steps:
348
348
  - label: sub1
@@ -356,7 +356,7 @@ class PipelineIRTestCase(unittest.TestCase):
356
356
  """
357
357
  description: Test Pipeline
358
358
  imports:
359
- - location: $TESTDIR/testPipeline5.yaml
359
+ - location: $TESTDIR/pipelines/testPipeline5.yaml
360
360
  """
361
361
  )
362
362
  pipeline = PipelineIR.from_string(pipeline_str)
@@ -446,8 +446,8 @@ class PipelineIRTestCase(unittest.TestCase):
446
446
  """
447
447
  description: Test Pipeline
448
448
  imports:
449
- - $TESTDIR/testPipeline1.yaml
450
- - location: $TESTDIR/testPipeline2.yaml
449
+ - $TESTDIR/pipelines/testPipeline1.yaml
450
+ - location: $TESTDIR/pipelines/testPipeline2.yaml
451
451
  exclude:
452
452
  - modA
453
453
 
@@ -468,7 +468,7 @@ class PipelineIRTestCase(unittest.TestCase):
468
468
  """
469
469
  description: Test Pipeline
470
470
  imports:
471
- - $TESTDIR/testPipeline1.yaml
471
+ - $TESTDIR/pipelines/testPipeline1.yaml
472
472
  """
473
473
  )
474
474
  pipeline = PipelineIR.from_string(pipeline_str)
@@ -479,7 +479,7 @@ class PipelineIRTestCase(unittest.TestCase):
479
479
  """
480
480
  description: Test Pipeline
481
481
  imports:
482
- - location: $TESTDIR/testPipeline1.yaml
482
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
483
483
  instrument: None
484
484
  """
485
485
  )
@@ -491,7 +491,7 @@ class PipelineIRTestCase(unittest.TestCase):
491
491
  """
492
492
  description: Test Pipeline
493
493
  imports:
494
- - location: $TESTDIR/testPipeline1.yaml
494
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
495
495
  instrument: new.instrument
496
496
  """
497
497
  )
@@ -505,7 +505,7 @@ class PipelineIRTestCase(unittest.TestCase):
505
505
  description: Test Pipeline
506
506
  instrument: new.instrument
507
507
  imports:
508
- - location: $TESTDIR/testPipeline1.yaml
508
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
509
509
  """
510
510
  )
511
511
  with self.assertRaisesRegex(ValueError, "new.instrument .* test.instrument."):
@@ -531,7 +531,7 @@ class PipelineIRTestCase(unittest.TestCase):
531
531
 
532
532
  def testReadContracts(self):
533
533
  # Verify that contracts are read in from a pipeline
534
- location = "$TESTDIR/testPipeline1.yaml"
534
+ location = "$TESTDIR/pipelines/testPipeline1.yaml"
535
535
  pipeline = PipelineIR.from_uri(location)
536
536
  self.assertEqual(pipeline.contracts[0].contract, "modA.b == modA.c")
537
537
 
@@ -739,7 +739,7 @@ class PipelineIRTestCase(unittest.TestCase):
739
739
  description: Test Pipeline
740
740
  instrument: dummyCam
741
741
  imports:
742
- - location: $TESTDIR/testPipeline1.yaml
742
+ - location: $TESTDIR/pipelines/testPipeline1.yaml
743
743
  instrument: None
744
744
  tasks:
745
745
  modC:
@@ -1,2 +0,0 @@
1
- __all__ = ["__version__"]
2
- __version__ = "29.2025.1500"