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.
- lsst/pipe/base/_instrument.py +20 -31
- lsst/pipe/base/_quantumContext.py +3 -3
- lsst/pipe/base/_status.py +10 -43
- lsst/pipe/base/_task_metadata.py +2 -2
- lsst/pipe/base/all_dimensions_quantum_graph_builder.py +3 -8
- lsst/pipe/base/automatic_connection_constants.py +1 -20
- lsst/pipe/base/cli/cmd/__init__.py +2 -18
- lsst/pipe/base/cli/cmd/commands.py +4 -149
- lsst/pipe/base/connectionTypes.py +160 -72
- lsst/pipe/base/connections.py +9 -6
- lsst/pipe/base/execution_reports.py +5 -0
- lsst/pipe/base/graph/graph.py +10 -11
- lsst/pipe/base/graph/quantumNode.py +4 -4
- lsst/pipe/base/graph_walker.py +10 -8
- lsst/pipe/base/log_capture.py +5 -9
- lsst/pipe/base/mp_graph_executor.py +15 -51
- lsst/pipe/base/pipeline.py +6 -5
- lsst/pipe/base/pipelineIR.py +8 -2
- lsst/pipe/base/pipelineTask.py +7 -5
- lsst/pipe/base/pipeline_graph/_dataset_types.py +2 -2
- lsst/pipe/base/pipeline_graph/_edges.py +22 -32
- lsst/pipe/base/pipeline_graph/_mapping_views.py +7 -4
- lsst/pipe/base/pipeline_graph/_pipeline_graph.py +7 -14
- lsst/pipe/base/pipeline_graph/expressions.py +2 -2
- lsst/pipe/base/pipeline_graph/io.py +10 -7
- lsst/pipe/base/pipeline_graph/visualization/_dot.py +12 -13
- lsst/pipe/base/pipeline_graph/visualization/_layout.py +18 -16
- lsst/pipe/base/pipeline_graph/visualization/_merge.py +7 -4
- lsst/pipe/base/pipeline_graph/visualization/_printer.py +10 -10
- lsst/pipe/base/pipeline_graph/visualization/_status_annotator.py +0 -7
- lsst/pipe/base/prerequisite_helpers.py +1 -2
- lsst/pipe/base/quantum_graph/_common.py +20 -19
- lsst/pipe/base/quantum_graph/_multiblock.py +31 -37
- lsst/pipe/base/quantum_graph/_predicted.py +13 -111
- lsst/pipe/base/quantum_graph/_provenance.py +45 -1136
- lsst/pipe/base/quantum_graph/aggregator/__init__.py +1 -0
- lsst/pipe/base/quantum_graph/aggregator/_communicators.py +289 -204
- lsst/pipe/base/quantum_graph/aggregator/_config.py +9 -87
- lsst/pipe/base/quantum_graph/aggregator/_ingester.py +12 -13
- lsst/pipe/base/quantum_graph/aggregator/_scanner.py +235 -49
- lsst/pipe/base/quantum_graph/aggregator/_structs.py +116 -6
- lsst/pipe/base/quantum_graph/aggregator/_supervisor.py +39 -29
- lsst/pipe/base/quantum_graph/aggregator/_writer.py +351 -34
- lsst/pipe/base/quantum_graph/visualization.py +1 -5
- lsst/pipe/base/quantum_graph_builder.py +8 -21
- lsst/pipe/base/quantum_graph_executor.py +13 -116
- lsst/pipe/base/quantum_graph_skeleton.py +29 -31
- lsst/pipe/base/quantum_provenance_graph.py +12 -29
- lsst/pipe/base/separable_pipeline_executor.py +3 -19
- lsst/pipe/base/single_quantum_executor.py +42 -67
- lsst/pipe/base/struct.py +0 -4
- lsst/pipe/base/testUtils.py +3 -3
- lsst/pipe/base/tests/mocks/_storage_class.py +1 -2
- lsst/pipe/base/version.py +1 -1
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/METADATA +3 -3
- lsst_pipe_base-30.2025.5200.dist-info/RECORD +125 -0
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/WHEEL +1 -1
- lsst/pipe/base/log_on_close.py +0 -76
- lsst/pipe/base/quantum_graph/aggregator/_workers.py +0 -303
- lsst/pipe/base/quantum_graph/formatter.py +0 -171
- lsst/pipe/base/quantum_graph/ingest_graph.py +0 -413
- lsst_pipe_base-30.0.1rc1.dist-info/RECORD +0 -129
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/entry_points.txt +0 -0
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/COPYRIGHT +0 -0
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/LICENSE +0 -0
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/bsd_license.txt +0 -0
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/licenses/gpl-v3.0.txt +0 -0
- {lsst_pipe_base-30.0.1rc1.dist-info → lsst_pipe_base-30.2025.5200.dist-info}/top_level.txt +0 -0
- {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
|
|
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
|
-
|
|
82
|
-
|
|
83
|
-
This class only checks for the presence of butler output run in
|
|
84
|
-
list of collections. If the output run is present in the list then
|
|
85
|
-
quanta whose complete outputs exist in the output run will be
|
|
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 :
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
lsst/pipe/base/testUtils.py
CHANGED
|
@@ -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
|
|
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.
|
|
2
|
+
__version__ = "30.2025.5200"
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: lsst-pipe-base
|
|
3
|
-
Version: 30.
|
|
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.
|
|
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,,
|
lsst/pipe/base/log_on_close.py
DELETED
|
@@ -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()
|