lsst-pipe-base 30.0.1rc1__py3-none-any.whl → 30.2025.5200__py3-none-any.whl

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 (69) hide show
  1. lsst/pipe/base/_instrument.py +20 -31
  2. lsst/pipe/base/_quantumContext.py +3 -3
  3. lsst/pipe/base/_status.py +10 -43
  4. lsst/pipe/base/_task_metadata.py +2 -2
  5. lsst/pipe/base/all_dimensions_quantum_graph_builder.py +3 -8
  6. lsst/pipe/base/automatic_connection_constants.py +1 -20
  7. lsst/pipe/base/cli/cmd/__init__.py +2 -18
  8. lsst/pipe/base/cli/cmd/commands.py +4 -149
  9. lsst/pipe/base/connectionTypes.py +160 -72
  10. lsst/pipe/base/connections.py +9 -6
  11. lsst/pipe/base/execution_reports.py +5 -0
  12. lsst/pipe/base/graph/graph.py +10 -11
  13. lsst/pipe/base/graph/quantumNode.py +4 -4
  14. lsst/pipe/base/graph_walker.py +10 -8
  15. lsst/pipe/base/log_capture.py +5 -9
  16. lsst/pipe/base/mp_graph_executor.py +15 -51
  17. lsst/pipe/base/pipeline.py +6 -5
  18. lsst/pipe/base/pipelineIR.py +8 -2
  19. lsst/pipe/base/pipelineTask.py +7 -5
  20. lsst/pipe/base/pipeline_graph/_dataset_types.py +2 -2
  21. lsst/pipe/base/pipeline_graph/_edges.py +22 -32
  22. lsst/pipe/base/pipeline_graph/_mapping_views.py +7 -4
  23. lsst/pipe/base/pipeline_graph/_pipeline_graph.py +7 -14
  24. lsst/pipe/base/pipeline_graph/expressions.py +2 -2
  25. lsst/pipe/base/pipeline_graph/io.py +10 -7
  26. lsst/pipe/base/pipeline_graph/visualization/_dot.py +12 -13
  27. lsst/pipe/base/pipeline_graph/visualization/_layout.py +18 -16
  28. lsst/pipe/base/pipeline_graph/visualization/_merge.py +7 -4
  29. lsst/pipe/base/pipeline_graph/visualization/_printer.py +10 -10
  30. lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py +0 -7
  31. lsst/pipe/base/prerequisite_helpers.py +1 -2
  32. lsst/pipe/base/quantum_graph/_common.py +20 -19
  33. lsst/pipe/base/quantum_graph/_multiblock.py +31 -37
  34. lsst/pipe/base/quantum_graph/_predicted.py +13 -111
  35. lsst/pipe/base/quantum_graph/_provenance.py +45 -1136
  36. lsst/pipe/base/quantum_graph/aggregator/__init__.py +1 -0
  37. lsst/pipe/base/quantum_graph/aggregator/_communicators.py +289 -204
  38. lsst/pipe/base/quantum_graph/aggregator/_config.py +9 -87
  39. lsst/pipe/base/quantum_graph/aggregator/_ingester.py +12 -13
  40. lsst/pipe/base/quantum_graph/aggregator/_scanner.py +235 -49
  41. lsst/pipe/base/quantum_graph/aggregator/_structs.py +116 -6
  42. lsst/pipe/base/quantum_graph/aggregator/_supervisor.py +39 -29
  43. lsst/pipe/base/quantum_graph/aggregator/_writer.py +351 -34
  44. lsst/pipe/base/quantum_graph/visualization.py +1 -5
  45. lsst/pipe/base/quantum_graph_builder.py +8 -21
  46. lsst/pipe/base/quantum_graph_executor.py +13 -116
  47. lsst/pipe/base/quantum_graph_skeleton.py +29 -31
  48. lsst/pipe/base/quantum_provenance_graph.py +12 -29
  49. lsst/pipe/base/separable_pipeline_executor.py +3 -19
  50. lsst/pipe/base/single_quantum_executor.py +42 -67
  51. lsst/pipe/base/struct.py +0 -4
  52. lsst/pipe/base/testUtils.py +3 -3
  53. lsst/pipe/base/tests/mocks/_storage_class.py +1 -2
  54. lsst/pipe/base/version.py +1 -1
  55. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/METADATA +3 -3
  56. lsst_pipe_base-30.2025.5200.dist-info/RECORD +125 -0
  57. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/WHEEL +1 -1
  58. lsst/pipe/base/log_on_close.py +0 -76
  59. lsst/pipe/base/quantum_graph/aggregator/_workers.py +0 -303
  60. lsst/pipe/base/quantum_graph/formatter.py +0 -171
  61. lsst/pipe/base/quantum_graph/ingest_graph.py +0 -413
  62. lsst_pipe_base-30.0.1rc1.dist-info/RECORD +0 -129
  63. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/entry_points.txt +0 -0
  64. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/COPYRIGHT +0 -0
  65. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/LICENSE +0 -0
  66. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/bsd_license.txt +0 -0
  67. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/gpl-v3.0.txt +0 -0
  68. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/top_level.txt +0 -0
  69. {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/zip-safe +0 -0
@@ -37,13 +37,13 @@ from typing import Any
37
37
 
38
38
  from lsst.daf.butler import (
39
39
  Butler,
40
+ ButlerMetrics,
40
41
  DatasetRef,
41
42
  DatasetType,
42
43
  LimitedButler,
43
44
  NamedKeyDict,
44
45
  Quantum,
45
46
  )
46
- from lsst.daf.butler.logging import ButlerLogRecords
47
47
  from lsst.utils.introspection import get_full_type_name
48
48
  from lsst.utils.timer import logInfo
49
49
 
@@ -59,7 +59,7 @@ from .connections import AdjustQuantumHelper
59
59
  from .log_capture import LogCapture, _ExecutionLogRecordsExtra
60
60
  from .pipeline_graph import TaskNode
61
61
  from .pipelineTask import PipelineTask
62
- from .quantum_graph_executor import QuantumExecutionResult, QuantumExecutor
62
+ from .quantum_graph_executor import QuantumExecutor
63
63
  from .quantum_reports import QuantumReport
64
64
  from .task import _TASK_FULL_METADATA_TYPE, _TASK_METADATA_TYPE
65
65
  from .taskFactory import TaskFactory
@@ -78,12 +78,12 @@ class SingleQuantumExecutor(QuantumExecutor):
78
78
  Instance of a task factory. Defaults to a new instance of
79
79
  `lsst.pipe.base.TaskFactory`.
80
80
  skip_existing_in : `str` or `~collections.abc.Iterable` [ `str` ]
81
- A collection name or list of collections to search for the existing
82
- outputs of quanta, which indicates that those quanta should be skipped.
83
- This class only checks for the presence of butler output run in the
84
- list of collections. If the output run is present in the list then the
85
- quanta whose complete outputs exist in the output run will be skipped.
86
- `None` or empty string/sequence disables skipping.
81
+ Expressions representing the collections to search for existing output
82
+ datasets. See :ref:`daf_butler_ordered_collection_searches` for allowed
83
+ types. This class only checks for the presence of butler output run in
84
+ the list of collections. If the output run is present in the list then
85
+ the quanta whose complete outputs exist in the output run will be
86
+ skipped. `None` or empty string/sequence disables skipping.
87
87
  clobber_outputs : `bool`, optional
88
88
  If `True`, then outputs from a quantum that exist in output run
89
89
  collection will be removed prior to executing a quantum. If
@@ -92,7 +92,7 @@ class SingleQuantumExecutor(QuantumExecutor):
92
92
  `None`.
93
93
  enable_lsst_debug : `bool`, optional
94
94
  Enable debugging with ``lsstDebug`` facility for a task.
95
- limited_butler_factory : `~collections.abc.Callable`, optional
95
+ limited_butler_factory : `Callable`, optional
96
96
  A method that creates a `~lsst.daf.butler.LimitedButler` instance for a
97
97
  given Quantum. This parameter must be defined if ``butler`` is `None`.
98
98
  If ``butler`` is not `None` then this parameter is ignored.
@@ -157,28 +157,21 @@ class SingleQuantumExecutor(QuantumExecutor):
157
157
  self._previous_process_quanta: list[uuid.UUID] = []
158
158
 
159
159
  def execute(
160
- self,
161
- task_node: TaskNode,
162
- /,
163
- quantum: Quantum,
164
- quantum_id: uuid.UUID | None = None,
165
- *,
166
- log_records: ButlerLogRecords | None = None,
167
- ) -> QuantumExecutionResult:
160
+ self, task_node: TaskNode, /, quantum: Quantum, quantum_id: uuid.UUID | None = None
161
+ ) -> tuple[Quantum, QuantumReport | None]:
168
162
  # Docstring inherited from QuantumExecutor.execute
163
+ assert quantum.dataId is not None, "Quantum DataId cannot be None"
164
+
169
165
  if self._butler is not None:
170
166
  self._butler.registry.refresh()
171
- return self._execute(task_node, quantum, quantum_id=quantum_id, log_records=log_records)
167
+
168
+ result = self._execute(task_node, quantum, quantum_id=quantum_id)
169
+ report = QuantumReport(quantumId=quantum_id, dataId=quantum.dataId, taskLabel=task_node.label)
170
+ return result, report
172
171
 
173
172
  def _execute(
174
- self,
175
- task_node: TaskNode,
176
- /,
177
- quantum: Quantum,
178
- quantum_id: uuid.UUID | None = None,
179
- *,
180
- log_records: ButlerLogRecords | None = None,
181
- ) -> QuantumExecutionResult:
173
+ self, task_node: TaskNode, /, quantum: Quantum, quantum_id: uuid.UUID | None = None
174
+ ) -> Quantum:
182
175
  """Execute the quantum.
183
176
 
184
177
  Internal implementation of `execute()`.
@@ -196,7 +189,7 @@ class SingleQuantumExecutor(QuantumExecutor):
196
189
 
197
190
  try:
198
191
  return self._execute_with_limited_butler(
199
- task_node, limited_butler, quantum=quantum, quantum_id=quantum_id, log_records=log_records
192
+ task_node, limited_butler, quantum=quantum, quantum_id=quantum_id
200
193
  )
201
194
  finally:
202
195
  if used_butler_factory:
@@ -209,17 +202,14 @@ class SingleQuantumExecutor(QuantumExecutor):
209
202
  /,
210
203
  quantum: Quantum,
211
204
  quantum_id: uuid.UUID | None = None,
212
- *,
213
- log_records: ButlerLogRecords | None = None,
214
- ) -> QuantumExecutionResult:
205
+ ) -> Quantum:
215
206
  startTime = time.time()
216
- assert quantum.dataId is not None, "Quantum DataId cannot be None"
217
- report = QuantumReport(quantumId=quantum_id, dataId=quantum.dataId, taskLabel=task_node.label)
207
+
218
208
  if self._butler is not None:
219
209
  log_capture = LogCapture.from_full(self._butler)
220
210
  else:
221
211
  log_capture = LogCapture.from_limited(limited_butler)
222
- with log_capture.capture_logging(task_node, quantum, records=log_records) as captureLog:
212
+ with log_capture.capture_logging(task_node, quantum) as captureLog:
223
213
  # Save detailed resource usage before task start to metadata.
224
214
  quantumMetadata = _TASK_METADATA_TYPE()
225
215
  logInfo(None, "prep", metadata=quantumMetadata) # type: ignore[arg-type]
@@ -238,7 +228,7 @@ class SingleQuantumExecutor(QuantumExecutor):
238
228
  task_node.label,
239
229
  quantum.dataId,
240
230
  )
241
- return QuantumExecutionResult(quantum, report, skipped_existing=True, adjusted_no_work=False)
231
+ return quantum
242
232
  captureLog.store = True
243
233
 
244
234
  captureLog.extra.previous_process_quanta.extend(self._previous_process_quanta)
@@ -254,7 +244,6 @@ class SingleQuantumExecutor(QuantumExecutor):
254
244
  str(exc),
255
245
  )
256
246
  quantumMetadata["caveats"] = QuantumSuccessCaveats.from_adjust_quantum_no_work().value
257
- quantumMetadata["outputs"] = []
258
247
  # Make empty metadata that looks something like what a
259
248
  # do-nothing task would write (but we don't bother with empty
260
249
  # nested PropertySets for subtasks). This is slightly
@@ -267,13 +256,7 @@ class SingleQuantumExecutor(QuantumExecutor):
267
256
  if self._job_metadata is not None:
268
257
  fullMetadata["job"] = self._job_metadata
269
258
  self._write_metadata(quantum, fullMetadata, task_node, limited_butler)
270
- return QuantumExecutionResult(
271
- quantum,
272
- report,
273
- skipped_existing=False,
274
- adjusted_no_work=True,
275
- task_metadata=fullMetadata,
276
- )
259
+ return quantum
277
260
 
278
261
  # enable lsstDebug debugging
279
262
  if self._enable_lsst_debug:
@@ -295,12 +278,10 @@ class SingleQuantumExecutor(QuantumExecutor):
295
278
  )
296
279
  task = self._task_factory.makeTask(task_node, limited_butler, init_input_refs)
297
280
  logInfo(None, "start", metadata=quantumMetadata) # type: ignore[arg-type]
298
- outputs_put: list[uuid.UUID] = []
299
281
  try:
300
- with limited_butler.record_metrics() as butler_metrics:
301
- caveats = self._run_quantum(
302
- task, quantum, task_node, limited_butler, quantum_id=quantum_id, ids_put=outputs_put
303
- )
282
+ caveats, outputsPut, butler_metrics = self._run_quantum(
283
+ task, quantum, task_node, limited_butler, quantum_id=quantum_id
284
+ )
304
285
  except Exception as e:
305
286
  _LOG.error(
306
287
  "Execution of task '%s' on quantum %s failed. Exception %s: %s",
@@ -320,10 +301,10 @@ class SingleQuantumExecutor(QuantumExecutor):
320
301
  quantumMetadata["caveats"] = caveats.value
321
302
  # Stringify the UUID for easier compatibility with
322
303
  # PropertyList.
304
+ quantumMetadata["outputs"] = [str(output) for output in outputsPut]
323
305
  finally:
324
306
  logInfo(None, "end", metadata=quantumMetadata) # type: ignore[arg-type]
325
307
  fullMetadata = task.getFullMetadata()
326
- quantumMetadata["outputs"] = [str(output) for output in outputs_put]
327
308
  fullMetadata["quantum"] = quantumMetadata
328
309
  if self._job_metadata is not None:
329
310
  fullMetadata["job"] = self._job_metadata
@@ -336,13 +317,7 @@ class SingleQuantumExecutor(QuantumExecutor):
336
317
  quantum.dataId,
337
318
  stopTime - startTime,
338
319
  )
339
- return QuantumExecutionResult(
340
- quantum,
341
- report,
342
- skipped_existing=False,
343
- adjusted_no_work=False,
344
- task_metadata=fullMetadata,
345
- )
320
+ return quantum
346
321
 
347
322
  def _check_existing_outputs(
348
323
  self,
@@ -544,9 +519,8 @@ class SingleQuantumExecutor(QuantumExecutor):
544
519
  task_node: TaskNode,
545
520
  /,
546
521
  limited_butler: LimitedButler,
547
- quantum_id: uuid.UUID | None,
548
- ids_put: list[uuid.UUID],
549
- ) -> QuantumSuccessCaveats:
522
+ quantum_id: uuid.UUID | None = None,
523
+ ) -> tuple[QuantumSuccessCaveats, list[uuid.UUID], ButlerMetrics]:
550
524
  """Execute task on a single quantum.
551
525
 
552
526
  Parameters
@@ -559,17 +533,18 @@ class SingleQuantumExecutor(QuantumExecutor):
559
533
  Task definition structure.
560
534
  limited_butler : `~lsst.daf.butler.LimitedButler`
561
535
  Butler to use for dataset I/O.
562
- quantum_id : `uuid.UUID` or `None`
536
+ quantum_id : `uuid.UUID` or `None`, optional
563
537
  ID of the quantum being executed.
564
- ids_put : list[ `uuid.UUID` ]
565
- List to be populated with the dataset IDs that were written by this
566
- quantum. This is an output parameter in order to allow it to be
567
- populated even when an exception is raised.
568
538
 
569
539
  Returns
570
540
  -------
571
541
  flags : `QuantumSuccessCaveats`
572
542
  Flags that describe qualified successes.
543
+ ids_put : list[ `uuid.UUID` ]
544
+ Record of all the dataset IDs that were written by this quantum
545
+ being executed.
546
+ metrics : `lsst.daf.butler.ButlerMetrics`
547
+ Butler metrics recorded for this quantum.
573
548
  """
574
549
  flags = QuantumSuccessCaveats.NO_CAVEATS
575
550
 
@@ -581,7 +556,8 @@ class SingleQuantumExecutor(QuantumExecutor):
581
556
 
582
557
  # Call task runQuantum() method.
583
558
  try:
584
- task.runQuantum(butlerQC, inputRefs, outputRefs)
559
+ with limited_butler.record_metrics() as butler_metrics:
560
+ task.runQuantum(butlerQC, inputRefs, outputRefs)
585
561
  except NoWorkFound as err:
586
562
  # Not an error, just an early exit.
587
563
  _LOG.info(
@@ -619,13 +595,12 @@ class SingleQuantumExecutor(QuantumExecutor):
619
595
  )
620
596
  _LOG.error(error, exc_info=error)
621
597
  flags |= caught.FLAGS
622
- finally:
623
- ids_put.extend(output[2] for output in butlerQC.outputsPut)
624
598
  if not butlerQC.outputsPut:
625
599
  flags |= QuantumSuccessCaveats.ALL_OUTPUTS_MISSING
626
600
  if not butlerQC.outputsPut == butlerQC.allOutputs:
627
601
  flags |= QuantumSuccessCaveats.ANY_OUTPUTS_MISSING
628
- return flags
602
+ ids_put = [output[2] for output in butlerQC.outputsPut]
603
+ return flags, ids_put, butler_metrics
629
604
 
630
605
  def _write_metadata(
631
606
  self, quantum: Quantum, metadata: Any, task_node: TaskNode, /, limited_butler: LimitedButler
lsst/pipe/base/struct.py CHANGED
@@ -116,10 +116,6 @@ class Struct(SimpleNamespace):
116
116
  *nameList : `str`
117
117
  All remaining arguments are names of items to copy.
118
118
 
119
- Returns
120
- -------
121
- None
122
-
123
119
  Raises
124
120
  ------
125
121
  RuntimeError
@@ -341,7 +341,7 @@ def _assertAttributeMatchesConnection(obj: Any, attrName: str, connection: BaseC
341
341
 
342
342
  Raises
343
343
  ------
344
- AssertionError
344
+ AssertionError:
345
345
  Raised if ``obj.attrName`` does not match what's expected
346
346
  from ``connection``.
347
347
  """
@@ -379,7 +379,7 @@ def assertValidOutput(task: PipelineTask, result: Struct) -> None:
379
379
 
380
380
  Raises
381
381
  ------
382
- AssertionError
382
+ AssertionError:
383
383
  Raised if ``result`` does not match what's expected from ``task's``
384
384
  connections.
385
385
  """
@@ -402,7 +402,7 @@ def assertValidInitOutput(task: PipelineTask) -> None:
402
402
 
403
403
  Raises
404
404
  ------
405
- AssertionError
405
+ AssertionError:
406
406
  Raised if ``task`` does not have the state expected from ``task's``
407
407
  connections.
408
408
  """
@@ -381,8 +381,7 @@ MockDataset.model_rebuild()
381
381
 
382
382
 
383
383
  class MockStorageClassDelegate(StorageClassDelegate):
384
- """Implementation of the `~lsst.daf.butler.StorageClassDelegate` interface
385
- for mock datasets.
384
+ """Implementation of the StorageClassDelegate interface for mock datasets.
386
385
 
387
386
  This class does not implement assembly and disassembly just because it's
388
387
  not needed right now. That could be added in the future with some
lsst/pipe/base/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "30.0.1rc1"
2
+ __version__ = "30.2025.5200"
@@ -1,20 +1,20 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: lsst-pipe-base
3
- Version: 30.0.1rc1
3
+ Version: 30.2025.5200
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
7
7
  Project-URL: Homepage, https://github.com/lsst/pipe_base
8
- Project-URL: Source, https://github.com/lsst/pipe_base
9
8
  Keywords: lsst
10
9
  Classifier: Intended Audience :: Science/Research
11
10
  Classifier: Operating System :: OS Independent
12
11
  Classifier: Programming Language :: Python :: 3
12
+ Classifier: Programming Language :: Python :: 3.11
13
13
  Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
15
  Classifier: Programming Language :: Python :: 3.14
16
16
  Classifier: Topic :: Scientific/Engineering :: Astronomy
17
- Requires-Python: >=3.12.0
17
+ Requires-Python: >=3.11.0
18
18
  Description-Content-Type: text/markdown
19
19
  License-File: COPYRIGHT
20
20
  License-File: LICENSE
@@ -0,0 +1,125 @@
1
+ lsst/__init__.py,sha256=_2bZAHuDVAx7MM7KA7pt3DYp641NY4RzSoRAwesWKfU,67
2
+ lsst/pipe/__init__.py,sha256=_2bZAHuDVAx7MM7KA7pt3DYp641NY4RzSoRAwesWKfU,67
3
+ lsst/pipe/base/__init__.py,sha256=qBLN0yYQjIcLBLb4jFKM_ppopuqTnCehcUdFcEe69Js,970
4
+ lsst/pipe/base/_datasetQueryConstraints.py,sha256=bFH0_lVc49NS2_4v_i6r9POr500c0K-OHLMhMX5FjkQ,6373
5
+ lsst/pipe/base/_dataset_handle.py,sha256=ft_ke1LbhLLndDPARsHSQJUA05LgUFnfWOq2vbwH3wI,11353
6
+ lsst/pipe/base/_instrument.py,sha256=I9UTaj81krR1zkTZ1owfOPBzHN29PY3Egg7fIE5obxQ,30057
7
+ lsst/pipe/base/_observation_dimension_packer.py,sha256=78Jg2OVFOdXIK62TS2Y3X4095xqCzmiIx9o4TXyADYA,8027
8
+ lsst/pipe/base/_quantumContext.py,sha256=gb60mTHbgOIEptYvJ64SaChvViXyeKJlG6kEHq4nYVw,19345
9
+ lsst/pipe/base/_status.py,sha256=7gJPrqt03t1fO5tREc_sfQaN7XmDBvruihORXPnRqUE,21216
10
+ lsst/pipe/base/_task_metadata.py,sha256=Y4rjrYWvYxYCJwy86VvzxKMkNxEJbYVgLVuXo6KiXac,25638
11
+ lsst/pipe/base/all_dimensions_quantum_graph_builder.py,sha256=nazY74jrdSCr6CFfPp78JecM_-udW95EYP7grLPO2hg,70830
12
+ lsst/pipe/base/automatic_connection_constants.py,sha256=H5uuh1rYRpjndgPdb0dh1L_-OyLKdT6VWOZTAb__xCU,3298
13
+ lsst/pipe/base/caching_limited_butler.py,sha256=FEQK_QesUWG9sK0w9m6_SA5OPcrd6vqyq8oDKE9Wu6I,7858
14
+ lsst/pipe/base/config.py,sha256=yNipVEc6awwhU_O9I01g20OnvQrs28dAwkXuI1hrlYE,11982
15
+ lsst/pipe/base/configOverrides.py,sha256=B0An8EaX76VzWnC5dJxvyZ2AhVzawMtq7qlE9ma5lkc,14661
16
+ lsst/pipe/base/connectionTypes.py,sha256=inUDyzbM1sKMCtHaRkhx3dWSPHPBIDVMHOPhzB13Kdw,16720
17
+ lsst/pipe/base/connections.py,sha256=UIe1km5_bOth5o9LZtjpT2r9vc44K4TGmz5Fvmqu5rA,67178
18
+ lsst/pipe/base/dot_tools.py,sha256=vriWMaB8YTEKKvhJE5KYdVGE4gB5XmiYfD2f18Fue-c,4285
19
+ lsst/pipe/base/exec_fixup_data_id.py,sha256=9OjOcH-6AHZ1JnD_CemieI0wWX90J_VdaY9v1oXwMdQ,4187
20
+ lsst/pipe/base/execution_graph_fixup.py,sha256=ND0x4hlpeEW-gudo-i2K7HT7MoM5sp_mcoqRMCopSqQ,3815
21
+ lsst/pipe/base/execution_reports.py,sha256=jYtWCD4PkEAeVUpKIxuiJJVgsCm7qiwCorWVgNHkVgU,17270
22
+ lsst/pipe/base/graph_walker.py,sha256=Ij7JfYF0srA29VgM_DhbNBxUBeOHDOnujrTQPjVNha0,4694
23
+ lsst/pipe/base/log_capture.py,sha256=2kuapttiMwpvevOleOMDcjEorXBCiVNSzsKj9fMDhI4,10818
24
+ lsst/pipe/base/mermaid_tools.py,sha256=cdlDJQ1x8k7-VvCLEUqvSC3GR1zCsB-aUTxOjYejNWc,5216
25
+ lsst/pipe/base/mp_graph_executor.py,sha256=FKlFxjtU2-6SFzX_wsdtMMAj5P09ZE8V65-Sg585g2Y,35501
26
+ lsst/pipe/base/pipeline.py,sha256=FVaiLhgw9Pzo-nzXKS0dLNafegP0AMZKLtPlSvOSkRU,37563
27
+ lsst/pipe/base/pipelineIR.py,sha256=UuZ02NLhVmzzekbuWlyar7cPLCf_4yfzD5qFEmGHs_A,45821
28
+ lsst/pipe/base/pipelineTask.py,sha256=K3GdjJLvy8A7I-jzQiERQZaYF7mC1LM3iB5TmUtbOCI,8394
29
+ lsst/pipe/base/prerequisite_helpers.py,sha256=bmiebQ4veSrypZgAXjmCBFfj8fUtPW9eRQaVShhxdBQ,28446
30
+ lsst/pipe/base/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ lsst/pipe/base/quantum_graph_builder.py,sha256=YM3pvt4ignAZnpO9bpBc_Yl8V-y2r3SQmYJdWnyQQNI,68742
32
+ lsst/pipe/base/quantum_graph_executor.py,sha256=WP41iQmihy1jfgaHV6eu2aSrqQx_Fydq3mbEF6CLQ-s,4419
33
+ lsst/pipe/base/quantum_graph_skeleton.py,sha256=hxSbeNhdCSBO2aqdIMRyQaejiUxKQfE6bSn0S0qWBNo,28395
34
+ lsst/pipe/base/quantum_provenance_graph.py,sha256=33S5iCVxD9Co4oJSU_N8AJXL14Nw0UwGzPEc3gpQiqk,91981
35
+ lsst/pipe/base/quantum_reports.py,sha256=ut235L88v7SXaeVUvMA9qFl7tpeMwGnzob3X0QoOI_s,14210
36
+ lsst/pipe/base/resource_usage.py,sha256=LfH7Qf6taI3lxw0aB90riRMn1UxUTMBSqtBjKPJ-XuY,6759
37
+ lsst/pipe/base/separable_pipeline_executor.py,sha256=vXqJrRI5GNezzGV9QsiaRHEhioDF2Y_W7JQYQCzHR7A,16720
38
+ lsst/pipe/base/simple_pipeline_executor.py,sha256=_HGeAOgHUiRdQwsmD_qira-vcHZXlLbf_LmhLJffh2U,29563
39
+ lsst/pipe/base/single_quantum_executor.py,sha256=yCpDS_eHsJTOu34mHYv8DJjj8UG0GjPdCuXdb74A2p8,28543
40
+ lsst/pipe/base/struct.py,sha256=Fa-UkpuXOxdzKWbHrMUkJYOszZuBXCm2NesXNR0IOPQ,5048
41
+ lsst/pipe/base/task.py,sha256=XHBd-7m1a4-6LgobBYA1DgY4H7EV-_RWKfxbhZbMmD4,15145
42
+ lsst/pipe/base/taskFactory.py,sha256=MsDGECJqZLSZk8SGhpuVhNaP32UWuNvxZiDcZExPFG8,3412
43
+ lsst/pipe/base/testUtils.py,sha256=lSBKMhoKflbi8JkMNYfEqqHNl-rtFI8UYT3QneDYpLo,18477
44
+ lsst/pipe/base/utils.py,sha256=JmEt3l0xrh9uayKrSXuQEq12aXOhDr2YXmbYduaxCko,1940
45
+ lsst/pipe/base/version.py,sha256=ViUKxGsTVoNOYgWzjL3nVBfNBOiNf71erkUgj_xAp8o,55
46
+ lsst/pipe/base/cli/__init__.py,sha256=861tXIAW7SqtqNUYkjbeEdfg8lDswXsjJQca0gVCFz4,54
47
+ lsst/pipe/base/cli/_get_cli_subcommands.py,sha256=g_af64klRybBGKAg7fmBSZBdw2LYBAsFON_yQIMZON0,1289
48
+ lsst/pipe/base/cli/cmd/__init__.py,sha256=3UF2IQEEBor4YMGRNPdcZAVCAI5yFyeHp5nGul4IoyM,1557
49
+ lsst/pipe/base/cli/cmd/commands.py,sha256=ilwKms1Gq4vc6Mddz3MB0fFcgWidseZeYlxTrOQlg8Q,9743
50
+ lsst/pipe/base/cli/opt/__init__.py,sha256=DN17wUbMwNIgbDBfF35sdyGfaMT81f3b_CA5Pp8POdk,1347
51
+ lsst/pipe/base/cli/opt/arguments.py,sha256=9LhDnsM98_2zOqqm-eyv_nnZmAQcBG5OpHzeJYw_eTw,1484
52
+ lsst/pipe/base/cli/opt/options.py,sha256=d5mC2WXZJiUbkdaIo_VUsvNxShD3GmredbEN5jQD64Q,1900
53
+ lsst/pipe/base/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
+ lsst/pipe/base/formatters/pexConfig.py,sha256=MA-08FIDV7PmpcV-VtDaBegR6YO6_pEhMB37WKMwup8,2163
55
+ lsst/pipe/base/graph/__init__.py,sha256=Zs2vwSFNiu1bYDsgrWQZ0qegG5F6PIjiQ5ZGT3EqcfA,118
56
+ lsst/pipe/base/graph/_implDetails.py,sha256=QQHVnCW78UnIbALXX_v7EW7g6MTUTuuR1Q_Ss_squUw,6784
57
+ lsst/pipe/base/graph/_loadHelpers.py,sha256=qUfjIgFezaXZRCFV7PFzmz1SSKFjRWOMWJePuyKiD24,12064
58
+ lsst/pipe/base/graph/_versionDeserializers.py,sha256=Xwq-MHfxaml2bL5cxSF8qmb6rjEHHZBuSengX8iggRg,28011
59
+ lsst/pipe/base/graph/graph.py,sha256=AZzq8HXUbWLcRKIGnKpwcCA8q0Fz-BT2pn0tFU1zulo,75148
60
+ lsst/pipe/base/graph/graphSummary.py,sha256=F0ET5H4cBFYNPXvHuUBa3nTCj99rpf0JwxPG5Kfi7iw,6352
61
+ lsst/pipe/base/graph/quantumNode.py,sha256=l4mslxBgyUzBAqwjpx6XRP-UPxe-oRMxHJWt-_y3Dm0,7196
62
+ lsst/pipe/base/pipeline_graph/__init__.py,sha256=yTEuvlzbeKIHIm7GeRmGSsma1wpZFNv8j12WfSH-deY,1516
63
+ lsst/pipe/base/pipeline_graph/__main__.py,sha256=E6ugEwJbds22wjgcfcgzeyO04JofQwVhn_Y8kZYY1lQ,20769
64
+ lsst/pipe/base/pipeline_graph/_dataset_types.py,sha256=MzpiI4bOUgwUpnse4Bj_KFAUFm_uERCHWd0BwAhKksc,11333
65
+ lsst/pipe/base/pipeline_graph/_edges.py,sha256=n6iCYql-TvAyM1xrINt7m02efjebJlIwhk254CCzfn8,35300
66
+ lsst/pipe/base/pipeline_graph/_exceptions.py,sha256=3jvCXms0_5ThLGtsOlKxsI1vWiq3gY4hba8fRBW0tgI,3943
67
+ lsst/pipe/base/pipeline_graph/_mapping_views.py,sha256=9nLKPA8j7sS09haShbJnEtGXbb4vy_cWpbLeMLBmVvs,9194
68
+ lsst/pipe/base/pipeline_graph/_nodes.py,sha256=GGXfzXvrjNbwPt-0w8cC0l_I6CCNskoDNjA8Ds4ILS0,4236
69
+ lsst/pipe/base/pipeline_graph/_pipeline_graph.py,sha256=V5xvlH0VxPsSctWYD5kDT-HybfZqYjMtnZi6n48GEM4,122536
70
+ lsst/pipe/base/pipeline_graph/_task_subsets.py,sha256=lLvcndSGcZigteWd4eeAM8LxQ1lHPBoysY8PjJTxx1c,13244
71
+ lsst/pipe/base/pipeline_graph/_tasks.py,sha256=jTLpm5dZMXRNrGi3L45-3DtF95PGwhmejWLZ-zcSTzo,42802
72
+ lsst/pipe/base/pipeline_graph/expressions.py,sha256=wNNVSWVMDZs_dp4Xd30rt1Xj8PfzWikJKo-amaJ-leM,7690
73
+ lsst/pipe/base/pipeline_graph/io.py,sha256=zVIybq5JyR1u1FwqF60wG0bIhz_SkgzzQiw2A7a1oNk,30943
74
+ lsst/pipe/base/pipeline_graph/visualization/__init__.py,sha256=qQctfWuFpcmgRdgu8Y6OsJ_pXpLKrCK-alqfVtIecls,1551
75
+ lsst/pipe/base/pipeline_graph/visualization/_dot.py,sha256=hgy5Wk4GXptb9GbjPn8-0D9EjWsXKBEEVs1ocHLh_MA,13535
76
+ lsst/pipe/base/pipeline_graph/visualization/_formatting.py,sha256=NsBxXwdmISitr8_4wPc-T8CqVB-Mq4pv7DmUefFm3JU,17845
77
+ lsst/pipe/base/pipeline_graph/visualization/_layout.py,sha256=aMFl2Sgw_2-AfCBr_JBIWSs7VbSfSP7Nuol0mP9lkUo,17157
78
+ lsst/pipe/base/pipeline_graph/visualization/_merge.py,sha256=cBKhNjgymDkzYtVutrXd9IGa-eE4Q9jnHO9F18e64dY,15435
79
+ lsst/pipe/base/pipeline_graph/visualization/_mermaid.py,sha256=V_LesIauJStjrxLO-cbvrhaZo5kDYG-JIMuErVu0EPk,20255
80
+ lsst/pipe/base/pipeline_graph/visualization/_options.py,sha256=vOIp2T7DLA48lTm5mTyCakIByb_wM21U_Crz_83MjoM,5237
81
+ lsst/pipe/base/pipeline_graph/visualization/_printer.py,sha256=yJMRJ-aXd3nYDgs1FqS2l_hzNbQ50HUVm55VVaNi71s,16537
82
+ lsst/pipe/base/pipeline_graph/visualization/_show.py,sha256=lPRjO1To2n5r3f_Wgcwy-7TmyJ7UszGGFXAlOtN1wDs,10510
83
+ lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py,sha256=dp7PXl9Cu7GfWjBi5g8KjXZgnF1KGg_idKKxtICL53Q,8679
84
+ lsst/pipe/base/quantum_graph/__init__.py,sha256=-Gp3LihB0AXCvhG387wKAEpHRM-NrHGSXMti8cHee90,1437
85
+ lsst/pipe/base/quantum_graph/_common.py,sha256=tgQsIylvs5wSAKs3SVp5_XJ7XEBJwBcRUbBGR2EFuwU,22714
86
+ lsst/pipe/base/quantum_graph/_multiblock.py,sha256=kc2pqezfU7xOAxYZa41mz3G4X5w4GVfovw3ZcjNgK2Y,27950
87
+ lsst/pipe/base/quantum_graph/_predicted.py,sha256=ImcH5nYvbUD7bfEnm5sp9wTcEn01ZwseqK1UkQeZ1Sc,87933
88
+ lsst/pipe/base/quantum_graph/_provenance.py,sha256=R1SoRxyi6cNi9fXSc7ybrbri9anuYnliJ6SBmVUrh40,55102
89
+ lsst/pipe/base/quantum_graph/visualization.py,sha256=EbTWhk9aPq7sX6bcHmnEIsr2xuuR6d1SxspQbRe8D0Q,12235
90
+ lsst/pipe/base/quantum_graph/aggregator/__init__.py,sha256=4CK8sP_ZjUKmxKS3LnCH1zG7XSk9IEwijrluRBHhEMU,7436
91
+ lsst/pipe/base/quantum_graph/aggregator/_communicators.py,sha256=w7hNEQjE1Qjhi6u4Tx4wS_1RrV3-WQRCz1FACd-vmro,36396
92
+ lsst/pipe/base/quantum_graph/aggregator/_config.py,sha256=iV1Ejfk-UnFoQ8TkpJE_jMZYHsmZcdLm5R-FnQEqO7s,5167
93
+ lsst/pipe/base/quantum_graph/aggregator/_ingester.py,sha256=lhu8I0R3IwoLkVcrqF1ypoHAFamNapSoMcG9aYFjbQ4,14158
94
+ lsst/pipe/base/quantum_graph/aggregator/_progress.py,sha256=jiz9Np73uUQ03CtH7pI6TXxXrwFUChh5hSj_gbMGHr0,7207
95
+ lsst/pipe/base/quantum_graph/aggregator/_scanner.py,sha256=4wg2cgVcAoqyuZZUBogHXWkSr9X6sVwnJLu_o96D204,22758
96
+ lsst/pipe/base/quantum_graph/aggregator/_structs.py,sha256=bM-MejZz5DFUFQCH8kZDykuMBmBJYbQMl15nBm-3dtc,5499
97
+ lsst/pipe/base/quantum_graph/aggregator/_supervisor.py,sha256=5-6CshU9RFyVEgYI3qJwuVEGw8YtT9Ei7cNkcghXzMk,9290
98
+ lsst/pipe/base/quantum_graph/aggregator/_writer.py,sha256=fYQrJGCg3MQQQF1feWXCLyG6m5ucnzFrIINawWgnF8g,21504
99
+ lsst/pipe/base/script/__init__.py,sha256=cLEXE7aq5UZ0juL_ScmRw0weFgp4tDgwEX_ts-NEYic,1522
100
+ lsst/pipe/base/script/register_instrument.py,sha256=neQ2MTPtAiV_Hl2yatQ8-vQC24xHjhpI7VJUHf5kPX4,2445
101
+ lsst/pipe/base/script/retrieve_artifacts_for_quanta.py,sha256=Cr0HpzXm_C3LnIOQg5tNJht02O6xoqtWWIphjugasMA,3957
102
+ lsst/pipe/base/script/transfer_from_graph.py,sha256=NelxNU_aNEwPHDZnDGXA07oeuSkeXqEZ6KG0ax6VE8c,7254
103
+ lsst/pipe/base/script/utils.py,sha256=zNqpHG3kXA8OaNXnwYIo0Hu_LCie1qoBAARAME3WEjs,3739
104
+ lsst/pipe/base/script/zip_from_graph.py,sha256=dMyyTGzEBCMMmR6Ts8R7QXUJrbtdrac_i-iy87lFDSI,3242
105
+ lsst/pipe/base/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
+ lsst/pipe/base/tests/in_memory_limited_butler.py,sha256=UzLh416H67nCUhD9y3cniAAjY7VojvhOLjF3gHHgjA4,8679
107
+ lsst/pipe/base/tests/no_dimensions.py,sha256=58UpyRN8cLAMZtkOmjTm3dJZyRFRekotQ-7-OgEfiAI,4710
108
+ lsst/pipe/base/tests/pipelineStepTester.py,sha256=KGxdB8gdVpSey2RUGURDIzIfPL-4qvQCsBpMrhG4Z2M,7208
109
+ lsst/pipe/base/tests/simpleQGraph.py,sha256=V_h1SifQ27vnjz5Fax1KZYyn6yPUDNfc8gRjc7SFbhE,20197
110
+ lsst/pipe/base/tests/util.py,sha256=IXpZOC58fdRnurB5lPcNX-xRgKEV-cPNkWKJDFIr1gs,4772
111
+ lsst/pipe/base/tests/mocks/__init__.py,sha256=fDy9H9vRAIBpKDJEXNZuDWJMzWZfpcBT4TmyOw4o-RY,1572
112
+ lsst/pipe/base/tests/mocks/_data_id_match.py,sha256=jVekStcrItC0tqOCc01VjYaiE9exYm3MRkwB0Gh_3J0,7465
113
+ lsst/pipe/base/tests/mocks/_pipeline_task.py,sha256=N3fC4OMAMWWnYtyLkVdMfb9ZiFse39HniRDvlAOofOY,30691
114
+ lsst/pipe/base/tests/mocks/_repo.py,sha256=SH-jzynS-H2xc_3GLjF7ln-kHdRoSeVVaal5qLd2hXI,28359
115
+ lsst/pipe/base/tests/mocks/_storage_class.py,sha256=12IFfJMbZ5GkYlMX6ZMWiG8pMZc2Jlxke3qQW-bljdU,27434
116
+ lsst_pipe_base-30.2025.5200.dist-info/licenses/COPYRIGHT,sha256=kB3Z9_f6a6uFLGpEmNJT_n186CE65H6wHu4F6BNt_zA,368
117
+ lsst_pipe_base-30.2025.5200.dist-info/licenses/LICENSE,sha256=pRExkS03v0MQW-neNfIcaSL6aiAnoLxYgtZoFzQ6zkM,232
118
+ lsst_pipe_base-30.2025.5200.dist-info/licenses/bsd_license.txt,sha256=7MIcv8QRX9guUtqPSBDMPz2SnZ5swI-xZMqm_VDSfxY,1606
119
+ lsst_pipe_base-30.2025.5200.dist-info/licenses/gpl-v3.0.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
120
+ lsst_pipe_base-30.2025.5200.dist-info/METADATA,sha256=a4P2CJs2aOgD6zyw3VkPFsw7nj3Ol45dUv9d7mKQO3E,2257
121
+ lsst_pipe_base-30.2025.5200.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
122
+ lsst_pipe_base-30.2025.5200.dist-info/entry_points.txt,sha256=bnmUhJBsChxMdqST9VmFBYYKxLQoToOfqW1wjW7khjk,64
123
+ lsst_pipe_base-30.2025.5200.dist-info/top_level.txt,sha256=eUWiOuVVm9wwTrnAgiJT6tp6HQHXxIhj2QSZ7NYZH80,5
124
+ lsst_pipe_base-30.2025.5200.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
125
+ lsst_pipe_base-30.2025.5200.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.10.2)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,76 +0,0 @@
1
- # This file is part of pipe_base.
2
- #
3
- # Developed for the LSST Data Management System.
4
- # This product includes software developed by the LSST Project
5
- # (http://www.lsst.org).
6
- # See the COPYRIGHT file at the top-level directory of this distribution
7
- # for details of code ownership.
8
- #
9
- # This software is dual licensed under the GNU General Public License and also
10
- # under a 3-clause BSD license. Recipients may choose which of these licenses
11
- # to use; please see the files gpl-3.0.txt and/or bsd_license.txt,
12
- # respectively. If you choose the GPL option then the following text applies
13
- # (but note that there is still no warranty even if you opt for BSD instead):
14
- #
15
- # This program is free software: you can redistribute it and/or modify
16
- # it under the terms of the GNU General Public License as published by
17
- # the Free Software Foundation, either version 3 of the License, or
18
- # (at your option) any later version.
19
- #
20
- # This program is distributed in the hope that it will be useful,
21
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
22
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
- # GNU General Public License for more details.
24
- #
25
- # You should have received a copy of the GNU General Public License
26
- # along with this program. If not, see <http://www.gnu.org/licenses/>.
27
-
28
- from __future__ import annotations
29
-
30
- __all__ = ("LogOnClose",)
31
-
32
- from collections.abc import Callable, Iterator
33
- from contextlib import AbstractContextManager, contextmanager
34
-
35
- from lsst.utils.logging import VERBOSE
36
-
37
-
38
- class LogOnClose:
39
- """A factory for context manager wrappers that emit a log message when
40
- they are closed.
41
-
42
- Parameters
43
- ----------
44
- log_func : `~collections.abc.Callable` [ `int`, `str` ]
45
- Callable that takes an integer log level and a string message and emits
46
- a log message. Note that placeholder formatting is not supported.
47
- """
48
-
49
- def __init__(self, log_func: Callable[[int, str], None]):
50
- self.log_func = log_func
51
-
52
- def wrap[T](
53
- self,
54
- cm: AbstractContextManager[T],
55
- msg: str,
56
- level: int = VERBOSE,
57
- ) -> AbstractContextManager[T]:
58
- """Wrap a context manager to log when it is exited.
59
-
60
- Parameters
61
- ----------
62
- cm : `contextlib.AbstractContextManager`
63
- Context manager to wrap.
64
- msg : `str`
65
- Log message.
66
- level : `int`, optional
67
- Log level.
68
- """
69
-
70
- @contextmanager
71
- def wrapper() -> Iterator[T]:
72
- with cm as result:
73
- yield result
74
- self.log_func(level, msg)
75
-
76
- return wrapper()