dkist-processing-common 10.8.2__py3-none-any.whl → 10.8.4rc1__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 (30) hide show
  1. changelog/235.feature.rst +3 -0
  2. changelog/235.misc.1.rst +2 -0
  3. changelog/235.misc.rst +1 -0
  4. dkist_processing_common/codecs/array.py +19 -0
  5. dkist_processing_common/codecs/basemodel.py +21 -0
  6. dkist_processing_common/codecs/fits.py +12 -6
  7. dkist_processing_common/manual.py +3 -5
  8. dkist_processing_common/models/fried_parameter.py +41 -0
  9. dkist_processing_common/models/graphql.py +13 -3
  10. dkist_processing_common/models/input_dataset.py +113 -0
  11. dkist_processing_common/models/parameters.py +65 -28
  12. dkist_processing_common/parsers/quality.py +1 -0
  13. dkist_processing_common/tasks/mixin/metadata_store.py +7 -4
  14. dkist_processing_common/tasks/mixin/quality/_metrics.py +19 -14
  15. dkist_processing_common/tasks/quality_metrics.py +1 -1
  16. dkist_processing_common/tasks/transfer_input_data.py +61 -70
  17. dkist_processing_common/tasks/write_l1.py +9 -2
  18. dkist_processing_common/tests/conftest.py +24 -7
  19. dkist_processing_common/tests/test_codecs.py +38 -0
  20. dkist_processing_common/tests/test_fried_parameter.py +27 -0
  21. dkist_processing_common/tests/test_input_dataset.py +79 -308
  22. dkist_processing_common/tests/test_parameters.py +71 -22
  23. dkist_processing_common/tests/test_quality_mixin.py +32 -22
  24. dkist_processing_common/tests/test_transfer_input_data.py +131 -45
  25. dkist_processing_common/tests/test_write_l1.py +35 -10
  26. {dkist_processing_common-10.8.2.dist-info → dkist_processing_common-10.8.4rc1.dist-info}/METADATA +1 -1
  27. {dkist_processing_common-10.8.2.dist-info → dkist_processing_common-10.8.4rc1.dist-info}/RECORD +29 -22
  28. dkist_processing_common/tasks/mixin/input_dataset.py +0 -166
  29. {dkist_processing_common-10.8.2.dist-info → dkist_processing_common-10.8.4rc1.dist-info}/WHEEL +0 -0
  30. {dkist_processing_common-10.8.2.dist-info → dkist_processing_common-10.8.4rc1.dist-info}/top_level.txt +0 -0
@@ -39,9 +39,9 @@ def quality_task(tmp_path, recipe_run_id):
39
39
  @pytest.fixture
40
40
  def plot_data():
41
41
  datetimes_a = ["2021-01-01T01:01:01", "2021-01-01T02:01:01"]
42
- values_a = [3, 4]
42
+ values_a = [0.1, 0.2]
43
43
  datetimes_b = ["2020-01-01T01:01:01", "2020-01-01T02:01:01"]
44
- values_b = [1, 2]
44
+ values_b = [0.15, 0.25]
45
45
  return datetimes_a, values_a, datetimes_b, values_b
46
46
 
47
47
 
@@ -198,8 +198,9 @@ def test_store_ao_status_and_fried_parameter(quality_task, ao_values):
198
198
  """
199
199
  task = quality_task
200
200
  datetimes = ["2020-01-01T01:01:01", "2020-01-01T02:01:01"]
201
- fried_values = [3.0, 4.0]
202
- combined_values = [[ao, r0] for ao, r0 in zip(ao_values, fried_values)]
201
+ fried_values = [0.1, 0.2]
202
+ oob_values = [25, 50]
203
+ combined_values = [[ao, r0, oob] for ao, r0, oob in zip(ao_values, fried_values, oob_values)]
203
204
  task.quality_store_ao_status_and_fried_parameter(datetimes=datetimes, values=combined_values)
204
205
  path = list(task.read(tags=Tag.quality("AO_STATUS")))
205
206
  assert len(path) == 1
@@ -220,10 +221,11 @@ def test_store_ao_status_and_fried_parameter(quality_task, ao_values):
220
221
  @pytest.mark.parametrize(
221
222
  "combined_values",
222
223
  [
223
- pytest.param([[True, 1], [None, 2]], id="AO_some_none"),
224
- pytest.param([[True, 1], [True, None]], id="Fried_some_none"),
225
- pytest.param([[None, 1], [None, 2]], id="AO_all_none"),
226
- pytest.param([[True, None], [True, None]], id="Fried_all_none"),
224
+ pytest.param([[True, 0.1, 25], [None, 0.2, 25]], id="AO_some_none"),
225
+ pytest.param([[True, 0.1, 25], [True, None, 25]], id="Fried_some_none"),
226
+ pytest.param([[None, 0.1, 25], [None, 0.2, 25]], id="AO_all_none"),
227
+ pytest.param([[True, None, 25], [True, None, 25]], id="Fried_all_none"),
228
+ pytest.param([[True, 0.1, None], [True, 0.2, None]], id="Out_of_bounds_all_none"),
227
229
  ],
228
230
  )
229
231
  def test_store_ao_status_and_fried_parameter_with_nones(quality_task, combined_values):
@@ -231,13 +233,14 @@ def test_store_ao_status_and_fried_parameter_with_nones(quality_task, combined_v
231
233
  datetimes = ["2020-01-01T01:01:01", "2020-01-01T02:01:01"]
232
234
  task.quality_store_ao_status_and_fried_parameter(datetimes=datetimes, values=combined_values)
233
235
  path = list(task.read(tags=Tag.quality("AO_STATUS")))
234
- ao_values = [ao for ao, r0 in combined_values]
235
- fried_values = [r0 for ao, r0 in combined_values]
236
+ ao_values = [ao for ao, r0, oob in combined_values]
237
+ fried_values = [r0 for ao, r0, oob in combined_values]
238
+ ao_out_of_bounds = [oob for ao, r0, oob in combined_values]
236
239
  if not all(ao is None for ao in ao_values):
237
240
  assert len(path) == 1
238
241
  with path[0].open() as f:
239
242
  data = json.load(f)
240
- assert len(data) == sum(1 for ao, r0 in combined_values if ao is not None)
243
+ assert len(data) == sum(1 for ao, r0, oob in combined_values if ao is not None)
241
244
  else:
242
245
  assert len(path) == 0
243
246
  path = list(task.read(tags=Tag.quality("FRIED_PARAMETER")))
@@ -246,7 +249,7 @@ def test_store_ao_status_and_fried_parameter_with_nones(quality_task, combined_v
246
249
  with path[0].open() as f:
247
250
  data = json.load(f)
248
251
  assert len(data["y_values"]) == sum(
249
- 1 for ao, r0 in combined_values if ao is True and r0 is not None
252
+ 1 for ao, r0, oob in combined_values if ao is True and r0 is not None
250
253
  )
251
254
  else:
252
255
  assert len(path) == 0
@@ -263,7 +266,8 @@ def test_build_ao_status(quality_task, plot_data):
263
266
  datetimes = datetimes_a + datetimes_b
264
267
  fried_values = values_a + values_b
265
268
  ao_values = [False, True, True, True]
266
- combined_values = [[ao, r0] for ao, r0 in zip(ao_values, fried_values)]
269
+ oob_values = [25, 50, None, 50]
270
+ combined_values = [[ao, r0, oob] for ao, r0, oob in zip(ao_values, fried_values, oob_values)]
267
271
  task.quality_store_ao_status_and_fried_parameter(datetimes=datetimes, values=combined_values)
268
272
  metric = task.quality_build_ao_status()
269
273
  assert metric["name"] == "Adaptive Optics Status"
@@ -284,9 +288,15 @@ def test_build_fried_parameter(quality_task, plot_data):
284
288
  task = quality_task
285
289
  datetimes_a, fried_values_a, datetimes_b, fried_values_b = plot_data
286
290
  ao_values_a = [True, True]
287
- combined_values_a = [[ao, r0] for ao, r0 in zip(ao_values_a, fried_values_a)]
291
+ oob_values_a = [25, 50]
292
+ combined_values_a = [
293
+ [ao, r0, oob] for ao, r0, oob in zip(ao_values_a, fried_values_a, oob_values_a)
294
+ ]
288
295
  ao_values_b = [True, True]
289
- combined_values_b = [[ao, r0] for ao, r0 in zip(ao_values_b, fried_values_b)]
296
+ oob_values_b = [25, 50]
297
+ combined_values_b = [
298
+ [ao, r0, oob] for ao, r0, oob in zip(ao_values_b, fried_values_b, oob_values_b)
299
+ ]
290
300
  task.quality_store_ao_status_and_fried_parameter(
291
301
  datetimes=datetimes_a, values=combined_values_a
292
302
  )
@@ -307,14 +317,14 @@ def test_build_fried_parameter(quality_task, plot_data):
307
317
  "2021-01-01T02:01:01",
308
318
  ]
309
319
  ]
310
- assert metric["plot_data"]["series_data"][""][1] == [1, 2, 3, 4]
320
+ assert metric["plot_data"]["series_data"][""][1] == [0.15, 0.25, 0.1, 0.2]
311
321
  assert metric["name"] == "Fried Parameter"
312
322
  assert metric["metric_code"] == "FRIED_PARAMETER"
313
323
  assert metric["facet"] is None
314
324
  assert metric["warnings"] is None
315
325
  assert (
316
326
  metric["statement"]
317
- == "Average valid Fried Parameter measurements for L1 dataset: 2.5 ± 1.12 m"
327
+ == "Average valid Fried Parameter measurements for L1 dataset: 0.18 ± 0.06 m"
318
328
  )
319
329
 
320
330
 
@@ -340,12 +350,12 @@ def test_build_light_level(quality_task, plot_data):
340
350
  "2021-01-01T02:01:01",
341
351
  ]
342
352
  ]
343
- assert metric["plot_data"]["series_data"][""][1] == [1, 2, 3, 4]
353
+ assert metric["plot_data"]["series_data"][""][1] == [0.15, 0.25, 0.1, 0.2]
344
354
  assert metric["name"] == "Light Level"
345
355
  assert metric["metric_code"] == "LIGHT_LEVEL"
346
356
  assert metric["facet"] is None
347
357
  assert metric["warnings"] is None
348
- assert metric["statement"] == f"Average Light Level for L1 dataset: 2.5 ± 1.12 adu"
358
+ assert metric["statement"] == f"Average Light Level for L1 dataset: 0.18 ± 0.06 adu"
349
359
 
350
360
 
351
361
  def test_build_frame_average(quality_task, plot_data):
@@ -461,7 +471,7 @@ def test_build_noise(quality_task, plot_data):
461
471
  "2021-01-01T02:01:01",
462
472
  ]
463
473
  ]
464
- assert metric["plot_data"]["series_data"]["I"][1] == [1, 2, 3, 4]
474
+ assert metric["plot_data"]["series_data"]["I"][1] == [0.15, 0.25, 0.1, 0.2]
465
475
  assert metric["name"] == "Noise Estimation"
466
476
  assert metric["metric_code"] == "NOISE"
467
477
  assert metric["facet"] is None
@@ -493,7 +503,7 @@ def test_build_sensitivity(quality_task, plot_data):
493
503
  "2021-01-01T02:01:01",
494
504
  ]
495
505
  ]
496
- assert metric["plot_data"]["series_data"]["I"][1] == [1, 2, 3, 4]
506
+ assert metric["plot_data"]["series_data"]["I"][1] == [0.15, 0.25, 0.1, 0.2]
497
507
  assert metric["name"] == f"Sensitivity"
498
508
  assert metric["metric_code"] == "SENSITIVITY"
499
509
  assert metric["facet"] is None
@@ -692,7 +702,7 @@ def test_build_report(quality_task, plot_data):
692
702
  task.quality_store_task_type_counts(task_type="dark", total_frames=100, frames_not_used=7)
693
703
  task.quality_store_task_type_counts(task_type="gain", total_frames=100, frames_not_used=0)
694
704
  task.quality_store_ao_status_and_fried_parameter(
695
- datetimes=datetimes, values=[[True, values[0]], [True, values[1]]]
705
+ datetimes=datetimes, values=[[True, values[0], values[0]], [True, values[1], values[1]]]
696
706
  )
697
707
  task.quality_store_light_level(datetimes=datetimes, values=values)
698
708
  task.quality_store_frame_average(
@@ -5,10 +5,12 @@ from pathlib import Path
5
5
  import pytest
6
6
 
7
7
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
- from dkist_processing_common.codecs.json import json_decoder
8
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
9
9
  from dkist_processing_common.models.graphql import InputDatasetRecipeRunResponse
10
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
10
11
  from dkist_processing_common.models.tags import Tag
11
12
  from dkist_processing_common.tasks.transfer_input_data import TransferL0Data
13
+ from dkist_processing_common.tests.conftest import create_input_frames
12
14
  from dkist_processing_common.tests.conftest import create_parameter_files
13
15
  from dkist_processing_common.tests.conftest import FakeGQLClient
14
16
 
@@ -18,7 +20,7 @@ class TransferL0DataTask(TransferL0Data):
18
20
  ...
19
21
 
20
22
 
21
- class FakeGQLClientMissingInputDatasetPart(FakeGQLClient):
23
+ class FakeGQLClientMissingInputDatasetCalibrationPart(FakeGQLClient):
22
24
  """Same metadata mocker with calibration input dataset part missing."""
23
25
 
24
26
  def execute_gql_query(self, **kwargs):
@@ -53,103 +55,152 @@ def transfer_l0_data_task(recipe_run_id, tmp_path, mocker):
53
55
 
54
56
 
55
57
  @pytest.fixture
56
- def transfer_l0_data_task_missing_part(recipe_run_id, tmp_path, mocker):
58
+ def transfer_l0_data_task_missing_calibration_part(recipe_run_id, tmp_path, mocker):
57
59
  yield from _transfer_l0_data_task_with_client(
58
- recipe_run_id, tmp_path, mocker, FakeGQLClientMissingInputDatasetPart
60
+ recipe_run_id, tmp_path, mocker, FakeGQLClientMissingInputDatasetCalibrationPart
59
61
  )
60
62
 
61
63
 
62
- def test_download_dataset(transfer_l0_data_task):
64
+ @pytest.mark.parametrize(
65
+ "expected_doc, tag",
66
+ [
67
+ pytest.param(
68
+ FakeGQLClient.observe_frames_doc_object,
69
+ Tag.input_dataset_observe_frames(),
70
+ id="observe_frames",
71
+ ),
72
+ pytest.param(
73
+ FakeGQLClient.calibration_frames_doc_object,
74
+ Tag.input_dataset_calibration_frames(),
75
+ id="calibration_frames",
76
+ ),
77
+ pytest.param(
78
+ FakeGQLClient.parameters_doc_object,
79
+ Tag.input_dataset_parameters(),
80
+ id="parameters",
81
+ ),
82
+ ],
83
+ )
84
+ def test_download_dataset(transfer_l0_data_task, expected_doc, tag):
63
85
  """
64
86
  :Given: a TransferL0Data task with a valid input dataset
65
87
  :When: downloading the dataset documents from the metadata store
66
- :Then: the correct documents are written to disk
88
+ :Then: the correct documents are written to disk, along with tags for file parameters
67
89
  """
68
90
  # Given
69
91
  task = transfer_l0_data_task
70
92
  # When
71
93
  task.download_input_dataset()
72
94
  # Then
73
- expected_observe_doc = FakeGQLClient.observe_frames_doc_object
74
- observe_doc_from_file = next(
75
- task.read(tags=Tag.input_dataset_observe_frames(), decoder=json_decoder)
76
- )
77
- assert observe_doc_from_file == expected_observe_doc
78
- expected_calibration_doc = FakeGQLClient.calibration_frames_doc_object
79
- calibration_doc_from_file = next(
80
- task.read(tags=Tag.input_dataset_calibration_frames(), decoder=json_decoder)
81
- )
82
- assert calibration_doc_from_file == expected_calibration_doc
83
- expected_parameters_doc = FakeGQLClient.parameters_doc_object
84
- parameters_doc_from_file = next(
85
- task.read(tags=Tag.input_dataset_parameters(), decoder=json_decoder)
95
+ doc_from_file = next(
96
+ task.read(tags=tag, decoder=basemodel_decoder, model=InputDatasetPartDocumentList)
86
97
  )
87
- assert parameters_doc_from_file == expected_parameters_doc
98
+ doc_list_from_file = doc_from_file.model_dump()["doc_list"]
99
+ if (
100
+ tag == Tag.input_dataset_parameters()
101
+ ): # parameter doc gets written with tags for file objects
102
+ for item in expected_doc:
103
+ for val in item["parameterValues"]:
104
+ if "__file__" in val["parameterValue"]:
105
+ file_dict = json.loads(val["parameterValue"])["__file__"]
106
+ file_dict["tag"] = Tag.parameter(Path(file_dict["objectKey"]).name)
107
+ val["parameterValue"] = json.dumps({"__file__": file_dict})
108
+ assert doc_list_from_file == expected_doc
88
109
 
89
110
 
90
- def test_download_dataset_missing_part(transfer_l0_data_task_missing_part):
111
+ def test_download_dataset_missing_part(transfer_l0_data_task_missing_calibration_part):
91
112
  """
92
113
  :Given: a TransferL0Data task with a valid input dataset without calibration frames
93
114
  :When: downloading the dataset documents from the metadata store
94
115
  :Then: the correct number of documents are written to disk
95
116
  """
96
117
  # Given
97
- task = transfer_l0_data_task_missing_part
118
+ task = transfer_l0_data_task_missing_calibration_part
98
119
  # When
99
120
  task.download_input_dataset()
100
121
  # Then
101
122
  observe_doc_from_file = next(
102
- task.read(tags=Tag.input_dataset_observe_frames(), decoder=json_decoder)
123
+ task.read(
124
+ tags=Tag.input_dataset_observe_frames(),
125
+ decoder=basemodel_decoder,
126
+ model=InputDatasetPartDocumentList,
127
+ )
103
128
  )
104
129
  parameters_doc_from_file = next(
105
- task.read(tags=Tag.input_dataset_parameters(), decoder=json_decoder)
130
+ task.read(
131
+ tags=Tag.input_dataset_parameters(),
132
+ decoder=basemodel_decoder,
133
+ model=InputDatasetPartDocumentList,
134
+ )
106
135
  )
107
136
  with pytest.raises(StopIteration):
108
137
  calibration_doc_from_file = next(
109
- task.read(tags=Tag.input_dataset_calibration_frames(), decoder=json_decoder)
138
+ task.read(
139
+ tags=Tag.input_dataset_calibration_frames(),
140
+ decoder=basemodel_decoder,
141
+ model=InputDatasetPartDocumentList,
142
+ )
110
143
  )
111
144
 
112
145
 
113
- def test_format_frame_transfer_items(transfer_l0_data_task):
146
+ @pytest.mark.parametrize(
147
+ "task_name",
148
+ [
149
+ pytest.param(
150
+ "transfer_l0_data_task",
151
+ id="observe_and_calibration_frames",
152
+ ),
153
+ pytest.param(
154
+ "transfer_l0_data_task_missing_calibration_part",
155
+ id="calibration_frames_missing",
156
+ ),
157
+ ],
158
+ )
159
+ def test_build_frame_transfer_list_formatted(request, task_name):
114
160
  """
115
- :Given: a TransferL0Data task with a downloaded input dataset
116
- :When: formatting frames in the input dataset for transfer
117
- :Then: the items are correctly loaded into GlobusTransferItem objects
161
+ :Given: a TransferL0Data task with downloaded input dataset docs
162
+ :When: building a list of frames in the input dataset formatted for transfer
163
+ :Then: the correct items are correctly loaded into GlobusTransferItem objects
118
164
  """
119
165
  # Given
120
- task = transfer_l0_data_task
166
+ task = request.getfixturevalue(task_name)
121
167
  task.download_input_dataset()
122
168
  # When
123
- transfer_items = task.format_frame_transfer_items()
169
+ observe_transfer_objects = task.build_transfer_list(doc_tag=Tag.input_dataset_observe_frames())
170
+ calibration_transfer_objects = task.build_transfer_list(
171
+ doc_tag=Tag.input_dataset_calibration_frames()
172
+ )
173
+ transfer_objects = observe_transfer_objects + calibration_transfer_objects
174
+ formatted_transfer_items = task.format_transfer_items(input_dataset_objects=transfer_objects)
124
175
  # Then
125
176
  source_filenames = []
126
177
  destination_filenames = []
127
- all_frames = (
128
- FakeGQLClient.observe_frames_doc_object + FakeGQLClient.calibration_frames_doc_object
129
- )
130
- for frame_set in all_frames:
178
+ expected_frames = list(FakeGQLClient.observe_frames_doc_object)
179
+ if "missing_calibration_part" not in task_name:
180
+ expected_frames += FakeGQLClient.calibration_frames_doc_object
181
+ for frame_set in expected_frames:
131
182
  for key in frame_set["object_keys"]:
132
183
  source_filenames.append(os.path.join("/", frame_set["bucket"], key))
133
184
  destination_filenames.append(Path(key).name)
134
- assert len(transfer_items) == len(source_filenames)
135
- for item in transfer_items:
185
+ assert len(formatted_transfer_items) == len(source_filenames)
186
+ for item in formatted_transfer_items:
136
187
  assert item.source_path.as_posix() in source_filenames
137
188
  assert item.destination_path.name in destination_filenames
138
189
  assert not item.recursive
139
190
 
140
191
 
141
- def test_format_parameter_file_transfer_items(transfer_l0_data_task):
192
+ def test_build_parameter_file_transfer_items(transfer_l0_data_task):
142
193
  """
143
- :Given: a TransferL0Data task with a downloaded input dataset
144
- :When: formatting parameter files in the input dataset for transfer
145
- :Then: the items are correctly loaded into GlobusTransferItem objects
194
+ :Given: a TransferL0Data task with downloaded input dataset docs
195
+ :When: building a list of parameter files formatted for transfer
196
+ :Then: the correct items are correctly loaded into GlobusTransferItem objects
146
197
  """
147
198
  # Given
148
199
  task = transfer_l0_data_task
149
200
  task.download_input_dataset()
150
- create_parameter_files(task)
151
201
  # When
152
- transfer_items = task.format_parameter_transfer_items()
202
+ transfer_objects = task.build_transfer_list(doc_tag=Tag.input_dataset_parameters())
203
+ formatted_transfer_items = task.format_transfer_items(input_dataset_objects=transfer_objects)
153
204
  # Then
154
205
  source_filenames = []
155
206
  destination_filenames = []
@@ -162,9 +213,44 @@ def test_format_parameter_file_transfer_items(transfer_l0_data_task):
162
213
  object_key = value_dict["__file__"]["objectKey"]
163
214
  source_filenames.append(os.path.join("/", bucket, object_key))
164
215
  destination_filenames.append(Path(object_key).name)
165
- assert len(transfer_items) == len(source_filenames)
166
- for transfer_item in transfer_items:
216
+ assert len(formatted_transfer_items) == len(source_filenames)
217
+ for transfer_item in formatted_transfer_items:
167
218
  assert transfer_item.source_path.as_posix() in source_filenames
168
219
  assert transfer_item.destination_path.name in destination_filenames
169
220
  assert str(transfer_item.destination_path).startswith(str(task.scratch.workflow_base_path))
170
221
  assert not transfer_item.recursive
222
+
223
+
224
+ def test_tag_transfer_items(transfer_l0_data_task):
225
+ """
226
+ :Given: a TransferL0Data task with downloaded input dataset frames and parameter files
227
+ :When: tagging the downloaded files
228
+ :Then: the downloaded items are correctly tagged
229
+ """
230
+ # Given
231
+ task = transfer_l0_data_task
232
+ task.download_input_dataset()
233
+ observe_transfer_objects = task.build_transfer_list(doc_tag=Tag.input_dataset_observe_frames())
234
+ calibration_transfer_objects = task.build_transfer_list(
235
+ doc_tag=Tag.input_dataset_calibration_frames()
236
+ )
237
+ frame_transfer_objects = observe_transfer_objects + calibration_transfer_objects
238
+ create_input_frames(task)
239
+ parameter_transfer_objects = task.build_transfer_list(doc_tag=Tag.input_dataset_parameters())
240
+ create_parameter_files(task)
241
+ # When
242
+ transfer_objects = frame_transfer_objects + parameter_transfer_objects
243
+ task.tag_transfer_objects(input_dataset_objects=transfer_objects)
244
+ # Then
245
+ input_tags = [Tag.input(), Tag.frame()]
246
+ input_frames_on_disk = list(task.scratch.find_all(tags=input_tags))
247
+ for obj in frame_transfer_objects:
248
+ destination_path = task.scratch.absolute_path(obj.object_key)
249
+ assert destination_path in input_frames_on_disk
250
+ assert len(input_frames_on_disk) == len(frame_transfer_objects)
251
+ for obj in parameter_transfer_objects:
252
+ destination_path = task.scratch.absolute_path(obj.object_key)
253
+ param_tag = Tag.parameter(Path(obj.object_key))
254
+ param_file_on_disk = list(task.scratch.find_all(tags=param_tag))
255
+ assert destination_path in param_file_on_disk
256
+ assert len(param_file_on_disk) == 1
@@ -25,7 +25,7 @@ from dkist_processing_common.tasks.write_l1 import WriteL1Frame
25
25
  from dkist_processing_common.tests.conftest import FakeGQLClient
26
26
  from dkist_processing_common.tests.conftest import TILE_SIZE
27
27
  from dkist_processing_common.tests.test_transfer_input_data import (
28
- FakeGQLClientMissingInputDatasetPart,
28
+ FakeGQLClientMissingInputDatasetCalibrationPart,
29
29
  )
30
30
 
31
31
 
@@ -201,9 +201,32 @@ def write_l1_task_with_empty_waveband(recipe_run_id, tmp_path, request):
201
201
  @pytest.fixture(
202
202
  scope="function",
203
203
  params=[
204
- pytest.param({"AO_LOCK": True}, id="AO_LOCK_True"),
205
- pytest.param({"AO_LOCK": False}, id="AO_LOCK_False"),
206
- pytest.param({}, id="AO_LOCK_missing"),
204
+ pytest.param(
205
+ {"AO_LOCK": True, "ATMOS_R0": 0.2, "OOBSHIFT": 17}, id="AO_LOCK_True_good_R0_good_oob"
206
+ ),
207
+ pytest.param(
208
+ {"AO_LOCK": True, "ATMOS_R0": 1, "OOBSHIFT": 17}, id="AO_LOCK_True_bad_R0_good_oob"
209
+ ),
210
+ pytest.param(
211
+ {"AO_LOCK": False, "ATMOS_R0": 0.2, "OOBSHIFT": 17}, id="AO_LOCK_False_good_R0_good_oob"
212
+ ),
213
+ pytest.param(
214
+ {"AO_LOCK": False, "ATMOS_R0": 1, "OOBSHIFT": 17}, id="AO_LOCK_False_bad_R0_good_oob"
215
+ ),
216
+ pytest.param(
217
+ {"AO_LOCK": True, "ATMOS_R0": 0.2, "OOBSHIFT": 150}, id="AO_LOCK_True_good_R0_bad_oob"
218
+ ),
219
+ pytest.param(
220
+ {"AO_LOCK": True, "ATMOS_R0": 1, "OOBSHIFT": 150}, id="AO_LOCK_True_bad_R0_bad_oob"
221
+ ),
222
+ pytest.param(
223
+ {"AO_LOCK": False, "ATMOS_R0": 0.2, "OOBSHIFT": 150}, id="AO_LOCK_False_good_R0_bad_oob"
224
+ ),
225
+ pytest.param(
226
+ {"AO_LOCK": False, "ATMOS_R0": 1, "OOBSHIFT": 150}, id="AO_LOCK_False_bad_R0_bad_oob"
227
+ ),
228
+ pytest.param({"ATMOS_R0": 0.2, "OOBSHIFT": 17}, id="AO_LOCK_missing"),
229
+ pytest.param({"ATMOS_R0": 0.2, "AO_LOCK": True}, id="OOBSHIFT_missing"),
207
230
  ],
208
231
  )
209
232
  def write_l1_task_no_data(request, recipe_run_id, tmp_path, complete_common_header):
@@ -216,10 +239,10 @@ def write_l1_task_no_data(request, recipe_run_id, tmp_path, complete_common_head
216
239
  ):
217
240
  task.scratch = WorkflowFileSystem(recipe_run_id=recipe_run_id, scratch_base_path=tmp_path)
218
241
  header = complete_common_header
219
- header.pop("AO_LOCK", None) # If it's not required, shouldn't be here in the first place??
242
+ header.pop("AO_LOCK", None)
243
+ header.pop("ATMOS_R0", None)
244
+ header.pop("OOBSHIFT", None)
220
245
  header.update(request.param)
221
- fried_parameter = 0.2
222
- header["ATMOS_R0"] = fried_parameter
223
246
  hdu = fits.PrimaryHDU(data=np.random.random(size=(1, 1, 1)) * 1, header=header)
224
247
  hdul = fits.HDUList([hdu])
225
248
  task.write(
@@ -231,7 +254,9 @@ def write_l1_task_no_data(request, recipe_run_id, tmp_path, complete_common_head
231
254
  encoder=fits_hdulist_encoder,
232
255
  )
233
256
  task.constants._update(asdict(FakeConstantDb()))
234
- yield task, header, fried_parameter
257
+ fried_parameter = request.param["ATMOS_R0"]
258
+ oob_shift = request.param.get("OOBSHIFT")
259
+ yield task, header, fried_parameter, oob_shift
235
260
  task._purge()
236
261
 
237
262
 
@@ -547,7 +572,7 @@ def test_missing_input_dataset_part(write_l1_task, mocker):
547
572
  """
548
573
  mocker.patch(
549
574
  "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient",
550
- new=FakeGQLClientMissingInputDatasetPart,
575
+ new=FakeGQLClientMissingInputDatasetCalibrationPart,
551
576
  )
552
577
  task, _, _ = write_l1_task
553
578
  task()
@@ -650,7 +675,7 @@ def test_check_r0_ao_lock(write_l1_task_no_data):
650
675
  :When: writing, check if the AO lock is on
651
676
  :Then: write the r0 value if AO lock on, don't write if AO lock off
652
677
  """
653
- task, header, r0 = write_l1_task_no_data
678
+ task, header, r0, _ = write_l1_task_no_data
654
679
  header_after_check = task.remove_invalid_r0_values(header=header)
655
680
  if header.get("AO_LOCK"):
656
681
  assert header_after_check["ATMOS_R0"] == header["ATMOS_R0"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 10.8.2
3
+ Version: 10.8.4rc1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -1,16 +1,21 @@
1
1
  changelog/.gitempty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ changelog/235.feature.rst,sha256=F27MUnNkqjcmlmRQ6NQUi2wd5M9dOjN2jZ70TV95Y20,365
3
+ changelog/235.misc.1.rst,sha256=kQujVYRa_axHQSRFxW3SNPNMgEL-YgtnyLud-aJljL8,234
4
+ changelog/235.misc.rst,sha256=ooK2tbA5EEFyYNZLLvgYiMZ-Eza5UzPHN9MvpuX-cu4,92
2
5
  dkist_processing_common/__init__.py,sha256=490Fwm_GgqpwriQlsYfKcLUZNhZ6GkINtJqcYSIEKoU,319
3
6
  dkist_processing_common/config.py,sha256=IcpaD_NvHZU-aLlUNOTdRC4V7ADIvVQwrZ2dHhIr4NY,4247
4
- dkist_processing_common/manual.py,sha256=IH72QxdGlr-BuWq2EDrfC9yStegO-elUWrobQqT4710,7042
7
+ dkist_processing_common/manual.py,sha256=M7FW1viESaTfK1jLqHLp7JMGTGeoTxHtgCXRjZpDR8g,6990
5
8
  dkist_processing_common/_util/__init__.py,sha256=xf6JNpMKQgbhE2Jivymt-WO0WF6PpGt9rl604YpuTWk,92
6
9
  dkist_processing_common/_util/constants.py,sha256=b0zlRaT09aGj2RU72OQ5J-8u6Z_RevPXtcyx5tlnf-Y,3244
7
10
  dkist_processing_common/_util/graphql.py,sha256=qjsvLWDHqb1X7hDLA8uqbpOIDjZZ2mjsSIL0Wkt1TJc,3420
8
11
  dkist_processing_common/_util/scratch.py,sha256=4X5K260ffBHWvyVfP0SCk_-QTWEcTougB7qu9TdF7LM,10364
9
12
  dkist_processing_common/_util/tags.py,sha256=8r62_-x3xpbCoCu5dd09Q2u-OYzYiML6SlPUf9LXCEw,6220
10
13
  dkist_processing_common/codecs/__init__.py,sha256=du1iitvsudSSOMENSywXmXSLOlvIocJsPbvfEcyqFNc,159
14
+ dkist_processing_common/codecs/array.py,sha256=GeIB6mTMZuQK4Jxn2tGmMmYgA-bLik2SAlWopRZhEO8,575
11
15
  dkist_processing_common/codecs/asdf.py,sha256=2GHCFOZk1j-ml4EolXac_sUzk7aPYJUGqKYxZk4mG_c,1046
16
+ dkist_processing_common/codecs/basemodel.py,sha256=6w7OjsPLdsmY_tiwveBmDthYW3WLtAWqM3hjrQa5UhA,814
12
17
  dkist_processing_common/codecs/bytes.py,sha256=tiVEUu_Gzc5NfW1_qsJtHDlYAZzgIqA7f4cfAwN734k,495
13
- dkist_processing_common/codecs/fits.py,sha256=0D6tDvt13OhVXok4tS8VGHdd8OSV8DrRet8VCD6Zt3g,2346
18
+ dkist_processing_common/codecs/fits.py,sha256=AxS3AKjB22JZl9sSk2A5JI7-Yyb9dOXw84bTpYqbPoQ,2585
14
19
  dkist_processing_common/codecs/iobase.py,sha256=r0ImN0CxfjAnfMflNv7w2pGDp2i6EQg0p2OaEkE82pk,977
15
20
  dkist_processing_common/codecs/json.py,sha256=OWXzoFWccJiojkiKSeDrMdL9f7EpdNIOMvO9YBBg-Yg,939
16
21
  dkist_processing_common/codecs/path.py,sha256=LU5Kh1ew2PQI9hcpzbnZkE47k-zAMZDDV4cgqHRcDkY,197
@@ -22,11 +27,13 @@ dkist_processing_common/models/__init__.py,sha256=6LMqemdzVZ87fRrpAsbEnTtWZ02_Gu
22
27
  dkist_processing_common/models/constants.py,sha256=1Eb8RDeuCr6brl237iGKxYLWCH49I6bOUEj_Tv-zFbQ,5441
23
28
  dkist_processing_common/models/fits_access.py,sha256=Au9JROwhVla9zb_u0dN8mIWiSJd_Pca0oOr4N1hN0HY,4113
24
29
  dkist_processing_common/models/flower_pot.py,sha256=59C5uGYKyMyncqQYxhzDZWl8k1DRZFB6s9RF-HFp9mY,5128
25
- dkist_processing_common/models/graphql.py,sha256=t2PYEjEwSq08zq0HcVH2RG5FX4PVXgs4BdM2gunJ8fs,4747
30
+ dkist_processing_common/models/fried_parameter.py,sha256=ro_H2Eo3I88lRf1wJjZfTc_XOjhgLt4whIQR_sjAFbM,1609
31
+ dkist_processing_common/models/graphql.py,sha256=BBJBIBADAPQAskqS8Qh58DYEyFjY9GY9ZN8nrJ1EKHs,5364
32
+ dkist_processing_common/models/input_dataset.py,sha256=OZDxyjHZfFrksFGpas1gsB14Q77CeNsk_nI-EYo3ZRI,4121
26
33
  dkist_processing_common/models/message.py,sha256=DRW7Qhl01dF5KagcqLta5U-uzdOMewrsHvMatDT6jnk,1684
27
34
  dkist_processing_common/models/message_queue_binding.py,sha256=ROQ2ZQE3TCr4gVbz4WggvUSExAiWP8SD_GjjQl482M8,1012
28
35
  dkist_processing_common/models/metric_code.py,sha256=McXAEF1Sa0_YlR1niXYLJWLFHhdLQhmYw9Xtpr5FGws,815
29
- dkist_processing_common/models/parameters.py,sha256=Ymx-wvPVMkXg5emhOivv7NG0QsAt98If4KotopLIRrw,7736
36
+ dkist_processing_common/models/parameters.py,sha256=dTup7mPTEmySXP0O3j4sPPY8Jqe2zf-3sr2hjeMatEY,9649
30
37
  dkist_processing_common/models/quality.py,sha256=ONz1A6_qyEoZhQkVp9LChAgm93aGt1O5WSRneE3XCCA,2319
31
38
  dkist_processing_common/models/tags.py,sha256=ykOYqWMU7_ffvRCv84-avjXyty9pHBo7EXwsjIjStjs,12058
32
39
  dkist_processing_common/models/task_name.py,sha256=NL0n92A9vVYBV-yvh8d-qFOCxVy0X2GECDmLgIzrmOY,565
@@ -40,7 +47,7 @@ dkist_processing_common/parsers/l0_fits_access.py,sha256=mhgezAA0X5zvgEmZFPIgKYp
40
47
  dkist_processing_common/parsers/l1_fits_access.py,sha256=o0_7XfcCcuKpuN8K0E_dfEnPvB1a9VxqKBaxpRGDOL0,2595
41
48
  dkist_processing_common/parsers/near_bud.py,sha256=gLTr7EILVCREAhmE0VaU7-KKc7aosoMmZmQtJEXxs2I,3733
42
49
  dkist_processing_common/parsers/proposal_id_bud.py,sha256=61uRxT538UDiEg3_By_asSzQ96xkAuCEEZZTrk0UF0E,677
43
- dkist_processing_common/parsers/quality.py,sha256=5f6Go-xf3kcmQyZ4NCcwRNG7OwQFATCp1YvYJtJBOh0,1058
50
+ dkist_processing_common/parsers/quality.py,sha256=Lg5z53kAvJuw-lPrX9HSkkFi0Bk0D5oDv8TAIgbLOMo,1140
44
51
  dkist_processing_common/parsers/retarder.py,sha256=OzhdC8VoV2zdcvq8Nn5Ghc-Q3BFfMRITLx5jMHrWNqI,1440
45
52
  dkist_processing_common/parsers/single_value_single_key_flower.py,sha256=cQX_C_Ms6EIOCW5TTDo6PnLoJ6In6MQTShKdMvt57OU,1230
46
53
  dkist_processing_common/parsers/task.py,sha256=RTNGSg3BUpEYLOcolN79Wc16s86FqRcDP-H7Hj9ovGg,3938
@@ -53,41 +60,41 @@ dkist_processing_common/tasks/base.py,sha256=k_IJR5sVV6ennX0sbeb0C6dciqshdY7CKjt
53
60
  dkist_processing_common/tasks/l1_output_data.py,sha256=IM-nvGaTM5r-z-9vHr2wovPVUpuNCah-cWIFMO2fcII,10576
54
61
  dkist_processing_common/tasks/output_data_base.py,sha256=CC1TnCrChi8_iuMymr425CJqpY4jCggnVUMfqzFkpnw,3682
55
62
  dkist_processing_common/tasks/parse_l0_input_data.py,sha256=iRMGdvhxBobNsTDQ0IEl0myDfB4P_xpxA00guuBWDj8,7986
56
- dkist_processing_common/tasks/quality_metrics.py,sha256=g6MUq8s8jELDinkn6o45rfONyODw92JyVMrzb7Dd7OI,12458
63
+ dkist_processing_common/tasks/quality_metrics.py,sha256=dWuPKBD5elRCZEs4ZC91tyXxkuPUwMuvy9OoGU9Zs04,12489
57
64
  dkist_processing_common/tasks/teardown.py,sha256=e4LKnphJDYDVDAez2tH7MxpZgCmxYsKrq9Zk0qAkzzM,2355
58
- dkist_processing_common/tasks/transfer_input_data.py,sha256=afEW0glpCFMZRj90nFtQo_4XOQ4CuoOh86jahP6a-a0,5548
65
+ dkist_processing_common/tasks/transfer_input_data.py,sha256=8dDOfnT46qavGW-6fy-FT9LVb0TXANSpk1WpACpWK70,5787
59
66
  dkist_processing_common/tasks/trial_catalog.py,sha256=Y3DKstRfMS8nWWtJFMB0MUVPlZ1jWS_2jhJGMWwxy50,8748
60
67
  dkist_processing_common/tasks/trial_output_data.py,sha256=aI_aRuu0qVO8zFGrr_9baxx9i3jUEHZSmsmbO6ytlkE,6960
61
- dkist_processing_common/tasks/write_l1.py,sha256=vwNJs8gSzc0RPIfcpZ267L6pIJWdbPQ8ZmKR6hX1BIs,23498
68
+ dkist_processing_common/tasks/write_l1.py,sha256=EBQEViaLG2MzWsXOvNi8tsVsgzVJXBrLSGmYtsVgSlo,23781
62
69
  dkist_processing_common/tasks/mixin/__init__.py,sha256=-g-DQbU7m1bclJYuFe3Yh757V-35GIDTbstardKQ7nU,68
63
70
  dkist_processing_common/tasks/mixin/globus.py,sha256=QAV8VElxMAqxJ2KSB_bJaraceovYfjHXjOdocrTCkIA,6592
64
- dkist_processing_common/tasks/mixin/input_dataset.py,sha256=dkW5vf_QPgWedHO_Lf9GjBxr1QrUCKs6gIXufUTi7GE,6813
65
71
  dkist_processing_common/tasks/mixin/interservice_bus.py,sha256=I7BUh0o8AEX-FZv7gxCts6is0uq9lycWjtTB2KqwBrU,1080
66
- dkist_processing_common/tasks/mixin/metadata_store.py,sha256=dMwjlhBI89xX0Pagub2Bk09z0fToipFN51DwyQEIHbk,11510
72
+ dkist_processing_common/tasks/mixin/metadata_store.py,sha256=yTKijpQ-tNx_H2V_9HsZjMzkrzBDSQaSKkySV6VnnOM,11618
67
73
  dkist_processing_common/tasks/mixin/object_store.py,sha256=Vn4l2XuCimii9Fc3gM-pQGIkTKMv_ldqljlxkLesZLU,3236
68
74
  dkist_processing_common/tasks/mixin/quality/__init__.py,sha256=Bgu-DHW7yXLiehglldOCWluEkAP5qh0Hp1F30rh5NFw,383
69
75
  dkist_processing_common/tasks/mixin/quality/_base.py,sha256=nZ9IC-O-hsLXa5-tk29B13CZyQIdhJCv0eO9cdkAhWc,8303
70
- dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=WenTfa12guIUfm0GzkrK2gduKaOHs03e6RhE6j37Les,54304
76
+ dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=lkHU6SeWeMfzf0QPM28_K9znllKx6rK91v1TiQ7vYfw,54556
71
77
  dkist_processing_common/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- dkist_processing_common/tests/conftest.py,sha256=h_ObhpXb1S0-db0Je8XoHNLkrXxXW_0B0TMhbnbDjMo,30160
78
+ dkist_processing_common/tests/conftest.py,sha256=Rz1r2_by8aRZslSkS4AduEtpu3cpPxsAonZQyUCBPSQ,30867
73
79
  dkist_processing_common/tests/test_assemble_movie.py,sha256=XY_ruXSYP5k6s2gUAwlFdnhJ81eyWLSd2O9IkX4RXeo,4165
74
80
  dkist_processing_common/tests/test_assemble_quality.py,sha256=fWSHK4UdVqgNjvxQuD40NBUnXrtmthUP7PUbISPV4MQ,16897
75
81
  dkist_processing_common/tests/test_base.py,sha256=4ST3__jEHitEQaQs9-0OcqtyEJfIjZsk_6PRYZFV2-U,7124
76
- dkist_processing_common/tests/test_codecs.py,sha256=9Ln8FJs319rbHpCukO9lKLk3aDrdyDREjA4nCHsxDCA,20796
82
+ dkist_processing_common/tests/test_codecs.py,sha256=FGhldrTdc28YD9FKrsW3lZ34LtvzecGP1qNi9fGHVGQ,22173
77
83
  dkist_processing_common/tests/test_constants.py,sha256=Kc9k5TdYy5QkRRlGav6kfI2dy5HHKqtpf9qOuaAfDZU,5903
78
84
  dkist_processing_common/tests/test_cs_step.py,sha256=RA0QD3D8eaL3YSOL_gIJ9wkngy14RQ2jbD-05KAziW4,2408
79
85
  dkist_processing_common/tests/test_fits_access.py,sha256=tyUPNbUqoTPhQgzua_doWP9l9ee4ir_LLV-I9rHktcs,11393
80
86
  dkist_processing_common/tests/test_flower_pot.py,sha256=X9_UI3maa3ZQncV3jYHgovWnawDsdEkEB5vw6EAB96o,3151
81
- dkist_processing_common/tests/test_input_dataset.py,sha256=AI5uqaDea4kOwpwAU5qQdzUbxMpBwD20YCAvB7nzD5o,18766
87
+ dkist_processing_common/tests/test_fried_parameter.py,sha256=iXtlQIifZ6cDOkEi-YDgP3oAlss2loq08Uohgvy1byQ,1295
88
+ dkist_processing_common/tests/test_input_dataset.py,sha256=pQ01rWAkQ2XQojyHWzAqeOdrMXshNcgEVL5I_9bBTdo,9610
82
89
  dkist_processing_common/tests/test_interservice_bus.py,sha256=M_iv2CLmx5TnCB1VUN4YjkQ2LEUjfCKk7-ZlkV62XEQ,3000
83
90
  dkist_processing_common/tests/test_interservice_bus_mixin.py,sha256=8TTl0aypkq5gBPeyqSaQHbz_jmt5RmSD2oI8kT4Q1ZA,4195
84
91
  dkist_processing_common/tests/test_manual_processing.py,sha256=wAZJztsF33jzJE3m3vJ6cJT0ujgIkMg01jGq-Ys_a4c,1045
85
92
  dkist_processing_common/tests/test_output_data_base.py,sha256=Y9MFz5xw11tAnKjpHH7qrzsRYP1rZM_Trt4AylY0S6k,3120
86
- dkist_processing_common/tests/test_parameters.py,sha256=Tr0Wu8-_rj9Lp7CkUVmJjSouW7CAL_ZwhShK_U1GzVs,12384
93
+ dkist_processing_common/tests/test_parameters.py,sha256=kNzX89vfrNRJ8d9rusMVv4DM9rPD3l-7HIstZsLoYBE,14033
87
94
  dkist_processing_common/tests/test_parse_l0_input_data.py,sha256=SMNV1qyQTvnMx94MCNsiA-RyS9uxaxIABEDDxsuVzqY,10629
88
95
  dkist_processing_common/tests/test_publish_catalog_messages.py,sha256=wB2lcAnT77yVnqO0cFWOPxGf-tZ8U62kvvpiB5roBwQ,3268
89
96
  dkist_processing_common/tests/test_quality.py,sha256=vomy2YSPadKqJj2tG8sCs-UkQVvfKus7Cum7_Hpee4I,10257
90
- dkist_processing_common/tests/test_quality_mixin.py,sha256=dLMJFK8V-KQyitdwnbNON7GEyghp6Wq2EszOsIM-uZ4,46538
97
+ dkist_processing_common/tests/test_quality_mixin.py,sha256=hliXew6Sq7R166B2WZf022LyMKDio5G8jvkebHTm4ok,47067
91
98
  dkist_processing_common/tests/test_scratch.py,sha256=7f28FMiSskSNX-bkRSrpJf2u1HQIbSvYajbjkeGMF9s,16481
92
99
  dkist_processing_common/tests/test_stems.py,sha256=DRTfSVC1bVJ8mD9E9eR1W5lUHXBR2uBNkYBcWnVlA5E,28471
93
100
  dkist_processing_common/tests/test_submit_dataset_metadata.py,sha256=F1IKBFWhjjMhONxEgs5p-cpjbQwxh7BLhDFw9b6j874,3806
@@ -95,12 +102,12 @@ dkist_processing_common/tests/test_tags.py,sha256=UwlOJ45rkvbfbd5L5m5YltvOxQc8kG
95
102
  dkist_processing_common/tests/test_task_name.py,sha256=kqFr59XX2K87xzfTlClzDV4-Je1dx72LvdaJ22UE8UU,1233
96
103
  dkist_processing_common/tests/test_task_parsing.py,sha256=QXt1X6DTO3_liBD2c-t84DToLeEn7B3J-eteIyN4HEM,4027
97
104
  dkist_processing_common/tests/test_teardown.py,sha256=w2sATQHkg2lMLvm6VFZF1mNGFYHwWj_SxvF9RQu-tuY,5362
98
- dkist_processing_common/tests/test_transfer_input_data.py,sha256=kE-FQTcN9nft5bh2Rhtp-8ldCTvGXTvWFcsNm6DY7lk,6619
105
+ dkist_processing_common/tests/test_transfer_input_data.py,sha256=B-kDsGJTUxxnamN4xjn69TFiY_TEN8MmhHNndP6bKac,10301
99
106
  dkist_processing_common/tests/test_transfer_l1_output_data.py,sha256=27PifkyH3RZg0nsM-AjmrFJ-hbYuCk5Tt_0Zx8PJBfM,2109
100
107
  dkist_processing_common/tests/test_trial_catalog.py,sha256=SZ-nyn0MXU9Lkg_94FbKER_cwiGoi06GYlzF_3AmvKg,6802
101
108
  dkist_processing_common/tests/test_trial_output_data.py,sha256=cBCj0kXyF5NEMzKh6zPVksdoXyE8ju1opJgWgjdcJWA,12790
102
109
  dkist_processing_common/tests/test_workflow_task_base.py,sha256=Z5aPW5LQtS0UWJiYho4X0r-2gPLfzpkmMwfmaoFLjMg,10517
103
- dkist_processing_common/tests/test_write_l1.py,sha256=ahAdMg3QhE-gnV_UMhL_xne-H5nHHDVMOWrP1vonIQ0,25962
110
+ dkist_processing_common/tests/test_write_l1.py,sha256=TKRSx1qX9shFlafP5H0tHy5ouIVzFLU0AMJOjViNygQ,27077
104
111
  docs/Makefile,sha256=qnlVz6PuBqE39NfHWuUnHhNEA-EFgT2-WJNNNy9ttfk,4598
105
112
  docs/changelog.rst,sha256=S2jPASsWlQxSlAPqdvNrYvhk9k3FcFWNXFNDYXBSjl4,120
106
113
  docs/conf.py,sha256=FkX575cqTqZGCcLAjg2MlvE8Buj1Vt3CpHNgZxG256E,1890
@@ -109,7 +116,7 @@ docs/landing_page.rst,sha256=aPAuXFhBx73lEZ59B6E6JXxkK0LlxzD0n-HXqHrfumQ,746
109
116
  docs/make.bat,sha256=mBAhtURwhQ7yc95pqwJzlhqBSvRknr1aqZ5s8NKvdKs,4513
110
117
  docs/requirements.txt,sha256=Kbl_X4c7RQZw035YTeNB63We6I7pvXFU4T0Uflp2yDY,29
111
118
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
112
- dkist_processing_common-10.8.2.dist-info/METADATA,sha256=8bbHCAylpH-0Ux_TMjUDNRySAFXKZHStbLWMYaQSKF8,7147
113
- dkist_processing_common-10.8.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
114
- dkist_processing_common-10.8.2.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
115
- dkist_processing_common-10.8.2.dist-info/RECORD,,
119
+ dkist_processing_common-10.8.4rc1.dist-info/METADATA,sha256=mvmjsxz0nAMy1AaYE1etUD0u3QXFz4R2D3zaZca8csY,7150
120
+ dkist_processing_common-10.8.4rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
121
+ dkist_processing_common-10.8.4rc1.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
122
+ dkist_processing_common-10.8.4rc1.dist-info/RECORD,,