lsst-pipe-base 29.2025.1500__py3-none-any.whl → 29.2025.1600__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.
@@ -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
lsst/pipe/base/version.py CHANGED
@@ -1,2 +1,2 @@
1
1
  __all__ = ["__version__"]
2
- __version__ = "29.2025.1500"
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
@@ -8,7 +8,7 @@ lsst/pipe/base/_observation_dimension_packer.py,sha256=78Jg2OVFOdXIK62TS2Y3X4095
8
8
  lsst/pipe/base/_quantumContext.py,sha256=gb60mTHbgOIEptYvJ64SaChvViXyeKJlG6kEHq4nYVw,19345
9
9
  lsst/pipe/base/_status.py,sha256=t9jiM0YkL4cAJ1hokRJ4FFntijW86fRWbb_5bKaCDYk,15222
10
10
  lsst/pipe/base/_task_metadata.py,sha256=SfM4L07Pe5itBDCsNh-XjdQvlKLY5LBcG6lpdtpMxHA,24968
11
- lsst/pipe/base/all_dimensions_quantum_graph_builder.py,sha256=Z9MN7y8eltF7VcvQsprbiaf13HRJ-U21jwuXIaqhSfQ,53283
11
+ lsst/pipe/base/all_dimensions_quantum_graph_builder.py,sha256=S7SPu-dUOFTXnGJh7F72fSPhxht7HWsavtZAzphackM,54259
12
12
  lsst/pipe/base/automatic_connection_constants.py,sha256=H5uuh1rYRpjndgPdb0dh1L_-OyLKdT6VWOZTAb__xCU,3298
13
13
  lsst/pipe/base/caching_limited_butler.py,sha256=ZlvjznhHMuKi_0JkVa6WlCwhDXRSOozCcxpOHHSRMIQ,7311
14
14
  lsst/pipe/base/config.py,sha256=yNipVEc6awwhU_O9I01g20OnvQrs28dAwkXuI1hrlYE,11982
@@ -19,8 +19,8 @@ lsst/pipe/base/dot_tools.py,sha256=o_bDp9vW-4PelE7kWodH6pWVIRuyGlTRFv-kR_YKfLo,1
19
19
  lsst/pipe/base/executionButlerBuilder.py,sha256=-vv-1aGm06RM4fJECjvJL0ZXHrwth7Hjt0jIfkKYY18,21254
20
20
  lsst/pipe/base/execution_reports.py,sha256=jYtWCD4PkEAeVUpKIxuiJJVgsCm7qiwCorWVgNHkVgU,17270
21
21
  lsst/pipe/base/mermaid_tools.py,sha256=b_15oqCcxSom4ecMTDX8tfEtxe8W-juPVL65HOMywJ8,17695
22
- lsst/pipe/base/pipeline.py,sha256=bFbgjyJHI4JsuMUPLAW-kg_xZFvWPBEdEb6hCUENpcU,37559
23
- lsst/pipe/base/pipelineIR.py,sha256=-tHyvnc3B9fTEqMh3wXYiTfYI4O5jOk_G0_G9YhPN6U,43660
22
+ lsst/pipe/base/pipeline.py,sha256=FVaiLhgw9Pzo-nzXKS0dLNafegP0AMZKLtPlSvOSkRU,37563
23
+ lsst/pipe/base/pipelineIR.py,sha256=DDOAYHnMP-iw021RDMYsZnvb21tWumLjYqO5d38q_Zk,44300
24
24
  lsst/pipe/base/pipelineTask.py,sha256=K3GdjJLvy8A7I-jzQiERQZaYF7mC1LM3iB5TmUtbOCI,8394
25
25
  lsst/pipe/base/prerequisite_helpers.py,sha256=WxfIGkF0Wlucp9mE3Wp3E6K2M6d66O0oZrWecRqn5CI,28312
26
26
  lsst/pipe/base/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -32,7 +32,7 @@ lsst/pipe/base/task.py,sha256=XHBd-7m1a4-6LgobBYA1DgY4H7EV-_RWKfxbhZbMmD4,15145
32
32
  lsst/pipe/base/taskFactory.py,sha256=4GhN2DozPM8suBYIvoKN4E6VP0I3mYZHBjCUO5JcCGk,2901
33
33
  lsst/pipe/base/testUtils.py,sha256=lSBKMhoKflbi8JkMNYfEqqHNl-rtFI8UYT3QneDYpLo,18477
34
34
  lsst/pipe/base/utils.py,sha256=JmEt3l0xrh9uayKrSXuQEq12aXOhDr2YXmbYduaxCko,1940
35
- lsst/pipe/base/version.py,sha256=altncYankWkwG1F2OVHhPl0np72lUhdVRAOSqBtd-kc,55
35
+ lsst/pipe/base/version.py,sha256=DWDCyavYRMZByGPGMYcnpz6piNv1sQvCKH8yohX_F3c,55
36
36
  lsst/pipe/base/cli/__init__.py,sha256=861tXIAW7SqtqNUYkjbeEdfg8lDswXsjJQca0gVCFz4,54
37
37
  lsst/pipe/base/cli/_get_cli_subcommands.py,sha256=g_af64klRybBGKAg7fmBSZBdw2LYBAsFON_yQIMZON0,1289
38
38
  lsst/pipe/base/cli/cmd/__init__.py,sha256=BGicstnryQ48rYcNRh4fa6Vy63ZIlZ_pPAEa17jhkwY,1519
@@ -44,9 +44,9 @@ lsst/pipe/base/formatters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
44
44
  lsst/pipe/base/formatters/pexConfig.py,sha256=MA-08FIDV7PmpcV-VtDaBegR6YO6_pEhMB37WKMwup8,2163
45
45
  lsst/pipe/base/graph/__init__.py,sha256=Zs2vwSFNiu1bYDsgrWQZ0qegG5F6PIjiQ5ZGT3EqcfA,118
46
46
  lsst/pipe/base/graph/_implDetails.py,sha256=QQHVnCW78UnIbALXX_v7EW7g6MTUTuuR1Q_Ss_squUw,6784
47
- lsst/pipe/base/graph/_loadHelpers.py,sha256=mzB3vP9dcurPJ1szWcsVF_QTQw_SSjwPGKoyYyg7AQM,11855
47
+ lsst/pipe/base/graph/_loadHelpers.py,sha256=qUfjIgFezaXZRCFV7PFzmz1SSKFjRWOMWJePuyKiD24,12064
48
48
  lsst/pipe/base/graph/_versionDeserializers.py,sha256=pXk63v6jkQSghSOoU1hpPkxVa82WVGitm2jrop85SeM,27992
49
- lsst/pipe/base/graph/graph.py,sha256=34P22Ljc46P2oG5xHckIBocRBlEKlmDBBUQBNPoW9vE,74148
49
+ lsst/pipe/base/graph/graph.py,sha256=CIM7ij7I51rVtVj0jd5dPgOWByALoFZh2Cp61mOEnyQ,74200
50
50
  lsst/pipe/base/graph/graphSummary.py,sha256=aYYZ_fGQWpp2UB4bG99Okeh_7yRGdYTva_wXk_rlwWA,4872
51
51
  lsst/pipe/base/graph/quantumNode.py,sha256=l4mslxBgyUzBAqwjpx6XRP-UPxe-oRMxHJWt-_y3Dm0,7196
52
52
  lsst/pipe/base/pipeline_graph/__init__.py,sha256=yTEuvlzbeKIHIm7GeRmGSsma1wpZFNv8j12WfSH-deY,1516
@@ -66,7 +66,7 @@ lsst/pipe/base/pipeline_graph/visualization/_dot.py,sha256=quja94wafmbCPJvC7HrHR
66
66
  lsst/pipe/base/pipeline_graph/visualization/_formatting.py,sha256=NsBxXwdmISitr8_4wPc-T8CqVB-Mq4pv7DmUefFm3JU,17845
67
67
  lsst/pipe/base/pipeline_graph/visualization/_layout.py,sha256=aMFl2Sgw_2-AfCBr_JBIWSs7VbSfSP7Nuol0mP9lkUo,17157
68
68
  lsst/pipe/base/pipeline_graph/visualization/_merge.py,sha256=cBKhNjgymDkzYtVutrXd9IGa-eE4Q9jnHO9F18e64dY,15435
69
- lsst/pipe/base/pipeline_graph/visualization/_mermaid.py,sha256=YC86ImEha6SIbHU-ZwTwHsCM-LqU64YZoMfLuxy0x_M,20576
69
+ lsst/pipe/base/pipeline_graph/visualization/_mermaid.py,sha256=V_LesIauJStjrxLO-cbvrhaZo5kDYG-JIMuErVu0EPk,20255
70
70
  lsst/pipe/base/pipeline_graph/visualization/_options.py,sha256=vOIp2T7DLA48lTm5mTyCakIByb_wM21U_Crz_83MjoM,5237
71
71
  lsst/pipe/base/pipeline_graph/visualization/_printer.py,sha256=yJMRJ-aXd3nYDgs1FqS2l_hzNbQ50HUVm55VVaNi71s,16537
72
72
  lsst/pipe/base/pipeline_graph/visualization/_show.py,sha256=lPRjO1To2n5r3f_Wgcwy-7TmyJ7UszGGFXAlOtN1wDs,10510
@@ -85,13 +85,13 @@ lsst/pipe/base/tests/mocks/__init__.py,sha256=NrIJYDeYgR3HsOJXBEXi8EXDhhV7iw7dgw
85
85
  lsst/pipe/base/tests/mocks/_data_id_match.py,sha256=MRGZUSD6ES0EiVG7kOIGZaJbZsaSIXB2M6tI9RpdUAc,6491
86
86
  lsst/pipe/base/tests/mocks/_pipeline_task.py,sha256=fqaJ-tB7K3jxlfCvCSnVd_GNrz-JhX7FB914h7nHLXc,29366
87
87
  lsst/pipe/base/tests/mocks/_storage_class.py,sha256=JvUmyXQC5DwOkFoLHkJk6u0ldn1VgZVVjh9GjpXRGg0,25211
88
- lsst_pipe_base-29.2025.1500.dist-info/licenses/COPYRIGHT,sha256=kB3Z9_f6a6uFLGpEmNJT_n186CE65H6wHu4F6BNt_zA,368
89
- lsst_pipe_base-29.2025.1500.dist-info/licenses/LICENSE,sha256=pRExkS03v0MQW-neNfIcaSL6aiAnoLxYgtZoFzQ6zkM,232
90
- lsst_pipe_base-29.2025.1500.dist-info/licenses/bsd_license.txt,sha256=7MIcv8QRX9guUtqPSBDMPz2SnZ5swI-xZMqm_VDSfxY,1606
91
- lsst_pipe_base-29.2025.1500.dist-info/licenses/gpl-v3.0.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
- lsst_pipe_base-29.2025.1500.dist-info/METADATA,sha256=atznQZNRN24fuGmUKBmOSg24OPkl3R-WyEtE6PBcWnE,2195
93
- lsst_pipe_base-29.2025.1500.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
94
- lsst_pipe_base-29.2025.1500.dist-info/entry_points.txt,sha256=bnmUhJBsChxMdqST9VmFBYYKxLQoToOfqW1wjW7khjk,64
95
- lsst_pipe_base-29.2025.1500.dist-info/top_level.txt,sha256=eUWiOuVVm9wwTrnAgiJT6tp6HQHXxIhj2QSZ7NYZH80,5
96
- lsst_pipe_base-29.2025.1500.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
97
- lsst_pipe_base-29.2025.1500.dist-info/RECORD,,
88
+ lsst_pipe_base-29.2025.1600.dist-info/licenses/COPYRIGHT,sha256=kB3Z9_f6a6uFLGpEmNJT_n186CE65H6wHu4F6BNt_zA,368
89
+ lsst_pipe_base-29.2025.1600.dist-info/licenses/LICENSE,sha256=pRExkS03v0MQW-neNfIcaSL6aiAnoLxYgtZoFzQ6zkM,232
90
+ lsst_pipe_base-29.2025.1600.dist-info/licenses/bsd_license.txt,sha256=7MIcv8QRX9guUtqPSBDMPz2SnZ5swI-xZMqm_VDSfxY,1606
91
+ lsst_pipe_base-29.2025.1600.dist-info/licenses/gpl-v3.0.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
92
+ lsst_pipe_base-29.2025.1600.dist-info/METADATA,sha256=5tga2n-mXMaHPtXtye8Xifv1tW6b2HsjYO_oZIaweNc,2195
93
+ lsst_pipe_base-29.2025.1600.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
94
+ lsst_pipe_base-29.2025.1600.dist-info/entry_points.txt,sha256=bnmUhJBsChxMdqST9VmFBYYKxLQoToOfqW1wjW7khjk,64
95
+ lsst_pipe_base-29.2025.1600.dist-info/top_level.txt,sha256=eUWiOuVVm9wwTrnAgiJT6tp6HQHXxIhj2QSZ7NYZH80,5
96
+ lsst_pipe_base-29.2025.1600.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
97
+ lsst_pipe_base-29.2025.1600.dist-info/RECORD,,