dkist-processing-common 11.7.1rc1__py3-none-any.whl → 11.8.0rc1__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 (29) hide show
  1. changelog/245.feature.1.rst +1 -0
  2. dkist_processing_common/models/constants.py +333 -21
  3. dkist_processing_common/models/fits_access.py +16 -25
  4. dkist_processing_common/parsers/average_bud.py +48 -0
  5. dkist_processing_common/parsers/experiment_id_bud.py +8 -4
  6. dkist_processing_common/parsers/id_bud.py +35 -19
  7. dkist_processing_common/parsers/l0_fits_access.py +3 -3
  8. dkist_processing_common/parsers/l1_fits_access.py +47 -21
  9. dkist_processing_common/parsers/near_bud.py +4 -4
  10. dkist_processing_common/parsers/observing_program_id_bud.py +24 -0
  11. dkist_processing_common/parsers/proposal_id_bud.py +11 -5
  12. dkist_processing_common/parsers/single_value_single_key_flower.py +0 -1
  13. dkist_processing_common/parsers/time.py +147 -27
  14. dkist_processing_common/tasks/mixin/quality/_metrics.py +6 -4
  15. dkist_processing_common/tasks/parse_l0_input_data.py +246 -1
  16. dkist_processing_common/tasks/trial_catalog.py +38 -0
  17. dkist_processing_common/tests/mock_metadata_store.py +39 -0
  18. dkist_processing_common/tests/test_fits_access.py +19 -44
  19. dkist_processing_common/tests/test_input_dataset.py +1 -37
  20. dkist_processing_common/tests/test_parse_l0_input_data.py +45 -5
  21. dkist_processing_common/tests/test_quality_mixin.py +3 -11
  22. dkist_processing_common/tests/test_stems.py +162 -10
  23. dkist_processing_common/tests/test_task_parsing.py +6 -6
  24. dkist_processing_common/tests/test_trial_catalog.py +72 -2
  25. {dkist_processing_common-11.7.1rc1.dist-info → dkist_processing_common-11.8.0rc1.dist-info}/METADATA +5 -5
  26. {dkist_processing_common-11.7.1rc1.dist-info → dkist_processing_common-11.8.0rc1.dist-info}/RECORD +28 -26
  27. changelog/271.misc.rst +0 -1
  28. {dkist_processing_common-11.7.1rc1.dist-info → dkist_processing_common-11.8.0rc1.dist-info}/WHEEL +0 -0
  29. {dkist_processing_common-11.7.1rc1.dist-info → dkist_processing_common-11.8.0rc1.dist-info}/top_level.txt +0 -0
@@ -6,16 +6,22 @@ from astropy.io import fits
6
6
 
7
7
  from dkist_processing_common.models.constants import BudName
8
8
  from dkist_processing_common.models.fits_access import FitsAccessBase
9
+ from dkist_processing_common.models.fits_access import MetadataKey
9
10
  from dkist_processing_common.models.tags import StemName
10
11
  from dkist_processing_common.models.task_name import TaskName
12
+ from dkist_processing_common.parsers.average_bud import TaskAverageBud
11
13
  from dkist_processing_common.parsers.cs_step import CSStepFlower
12
14
  from dkist_processing_common.parsers.cs_step import NumCSStepBud
13
15
  from dkist_processing_common.parsers.dsps_repeat import DspsRepeatNumberFlower
14
16
  from dkist_processing_common.parsers.dsps_repeat import TotalDspsRepeatsBud
15
17
  from dkist_processing_common.parsers.experiment_id_bud import ContributingExperimentIdsBud
16
18
  from dkist_processing_common.parsers.experiment_id_bud import ExperimentIdBud
19
+ from dkist_processing_common.parsers.id_bud import TaskContributingIdsBud
17
20
  from dkist_processing_common.parsers.near_bud import NearFloatBud
18
21
  from dkist_processing_common.parsers.near_bud import TaskNearFloatBud
22
+ from dkist_processing_common.parsers.observing_program_id_bud import (
23
+ TaskContributingObservingProgramExecutionIdsBud,
24
+ )
19
25
  from dkist_processing_common.parsers.proposal_id_bud import ContributingProposalIdsBud
20
26
  from dkist_processing_common.parsers.proposal_id_bud import ProposalIdBud
21
27
  from dkist_processing_common.parsers.retarder import RetarderNameBud
@@ -31,9 +37,11 @@ from dkist_processing_common.parsers.time import MaximumCadenceBud
31
37
  from dkist_processing_common.parsers.time import MinimumCadenceBud
32
38
  from dkist_processing_common.parsers.time import ObsIpStartTimeBud
33
39
  from dkist_processing_common.parsers.time import ReadoutExpTimeFlower
40
+ from dkist_processing_common.parsers.time import TaskDateBeginBud
41
+ from dkist_processing_common.parsers.time import TaskDatetimeBudBase
34
42
  from dkist_processing_common.parsers.time import TaskExposureTimesBud
35
43
  from dkist_processing_common.parsers.time import TaskReadoutExpTimesBud
36
- from dkist_processing_common.parsers.time import TaskTimeBudBase
44
+ from dkist_processing_common.parsers.time import TaskRoundTimeBudBase
37
45
  from dkist_processing_common.parsers.time import VarianceCadenceBud
38
46
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
39
47
  from dkist_processing_common.parsers.unique_bud import UniqueBud
@@ -46,6 +54,7 @@ class FitsReaderMetadataKey(StrEnum):
46
54
  near_thing = "near"
47
55
  proposal_id = "ID___013"
48
56
  experiment_id = "ID___012"
57
+ observing_program_execution_id = "ID___008"
49
58
  ip_task_type = "DKIST004"
50
59
  ip_start_time = "DKIST011"
51
60
  fpa_exposure_time_ms = "XPOSURE"
@@ -66,12 +75,38 @@ class FitsReaderMetadataKey(StrEnum):
66
75
  class FitsReader(FitsAccessBase):
67
76
  def __init__(self, hdu, name):
68
77
  super().__init__(hdu, name)
69
- for key in FitsReaderMetadataKey:
70
- self._set_metadata_key_value(key=key, optional=True)
71
- self._set_metadata_key_value(
72
- FitsReaderMetadataKey.roundable_time, optional=True, default=0.0
73
- )
78
+ self.thing_id: int = self.header.get(FitsReaderMetadataKey.thing_id)
79
+ self.constant_thing: int = self.header.get(FitsReaderMetadataKey.constant_thing)
80
+ self.near_thing: float = self.header.get(FitsReaderMetadataKey.near_thing)
74
81
  self.name = name
82
+ self.proposal_id: str = self.header.get(FitsReaderMetadataKey.proposal_id)
83
+ self.experiment_id: str = self.header.get(FitsReaderMetadataKey.experiment_id)
84
+ self.observing_program_execution_id: str = self.header.get(
85
+ FitsReaderMetadataKey.observing_program_execution_id
86
+ )
87
+ self.ip_task_type: str = self.header.get(FitsReaderMetadataKey.ip_task_type)
88
+ self.ip_start_time: str = self.header.get(FitsReaderMetadataKey.ip_start_time)
89
+ self.fpa_exposure_time_ms: float = self.header.get(
90
+ FitsReaderMetadataKey.fpa_exposure_time_ms
91
+ )
92
+ self.sensor_readout_exposure_time_ms: float = self.header.get(
93
+ FitsReaderMetadataKey.sensor_readout_exposure_time_ms
94
+ )
95
+ self.num_raw_frames_per_fpa: int = self.header.get(
96
+ FitsReaderMetadataKey.num_raw_frames_per_fpa
97
+ )
98
+ self.num_dsps_repeats: int = self.header.get(FitsReaderMetadataKey.num_dsps_repeats)
99
+ self.current_dsps_repeat: int = self.header.get(FitsReaderMetadataKey.current_dsps_repeat)
100
+ self.time_obs: str = self.header.get(FitsReaderMetadataKey.time_obs)
101
+ self.gos_level3_status: str = self.header.get(FitsReaderMetadataKey.gos_level3_status)
102
+ self.gos_level3_lamp_status: str = self.header.get(
103
+ FitsReaderMetadataKey.gos_level3_lamp_status
104
+ )
105
+ self.gos_level0_status: str = self.header.get(FitsReaderMetadataKey.gos_level0_status)
106
+ self.gos_retarder_status: str = self.header.get(FitsReaderMetadataKey.gos_retarder_status)
107
+ self.gos_polarizer_status: str = self.header.get(FitsReaderMetadataKey.gos_polarizer_status)
108
+ self.wavelength: str = self.header.get(FitsReaderMetadataKey.wavelength)
109
+ self.roundable_time: float = self.header.get(FitsReaderMetadataKey.roundable_time, 0.0)
75
110
 
76
111
 
77
112
  @pytest.fixture()
@@ -85,6 +120,7 @@ def basic_header_objs():
85
120
  "DKIST004": "observe",
86
121
  "ID___012": "experiment_id_1",
87
122
  "ID___013": "proposal_id_1",
123
+ "ID___008": "observing_program_execution_id_1",
88
124
  "XPOSURE": 0.0013000123,
89
125
  "TEXPOSUR": 10.0,
90
126
  "NSUMEXP": 3,
@@ -103,6 +139,7 @@ def basic_header_objs():
103
139
  "DKIST004": "observe",
104
140
  "ID___012": "experiment_id_1",
105
141
  "ID___013": "proposal_id_1",
142
+ "ID___008": "observing_program_execution_id_2",
106
143
  "XPOSURE": 0.0013000987,
107
144
  "TEXPOSUR": 10.0,
108
145
  "NSUMEXP": 3,
@@ -122,6 +159,7 @@ def basic_header_objs():
122
159
  "DKIST004": "dark",
123
160
  "ID___012": "experiment_id_2",
124
161
  "ID___013": "proposal_id_2",
162
+ "ID___008": "observing_program_execution_id_2",
125
163
  "XPOSURE": 12.345,
126
164
  "TEXPOSUR": 1.123456789,
127
165
  "NSUMEXP": 1,
@@ -142,6 +180,7 @@ def basic_header_objs():
142
180
  "DKIST004": "observe",
143
181
  "ID___012": "experiment_id_1",
144
182
  "ID___013": "proposal_id_1",
183
+ "ID___008": "observing_program_execution_id_1",
145
184
  "XPOSURE": 100.0,
146
185
  "TEXPOSUR": 11.0,
147
186
  "NSUMEXP": 4,
@@ -157,6 +196,7 @@ def basic_header_objs():
157
196
  {
158
197
  "DKIST004": "gain",
159
198
  "ID___013": "proposal_id_1",
199
+ "ID___008": "observing_program_execution_id_1",
160
200
  "id_key": 0,
161
201
  "constant": 6.28,
162
202
  "near": 1.23,
@@ -386,6 +426,38 @@ def test_single_value_single_key_flower(basic_header_objs):
386
426
  assert petals[2].keys == ["thing2"]
387
427
 
388
428
 
429
+ @pytest.mark.parametrize(
430
+ "ip_task_type, expected_value",
431
+ [
432
+ pytest.param("dark", (1655503202.0,), id="single_task_type"),
433
+ pytest.param(["dark", "gain"], (1655503202.0, 1655503203.0), id="task_type_list"),
434
+ pytest.param(
435
+ ["dark", "gain", "observe"],
436
+ (1655503200.0, 1655503201.0, 1655503202.0, 1655503203.0, 1655503203.0),
437
+ id="task_type_list2",
438
+ ),
439
+ ],
440
+ )
441
+ def test_task_datetime_base_bud(basic_header_objs, ip_task_type, expected_value):
442
+ """
443
+ Given: A set of headers with a datetime value that does not need to be rounded
444
+ When: Ingesting headers with a `TaskDatetimeBudBase` bud and asking for the value
445
+ Then: The bud's value is the list of datetimes in seconds
446
+ """
447
+ bud = TaskDatetimeBudBase(
448
+ stem_name="datetimes",
449
+ metadata_key=FitsReaderMetadataKey.time_obs,
450
+ ip_task_types=ip_task_type,
451
+ )
452
+ assert bud.stem_name == "datetimes"
453
+ for fo in basic_header_objs:
454
+ key = fo.name
455
+ bud.update(key, fo)
456
+
457
+ petal = list(bud.petals)
458
+ assert petal[0].value == expected_value
459
+
460
+
389
461
  @pytest.mark.parametrize(
390
462
  "ip_task_type, expected_value",
391
463
  [
@@ -394,13 +466,13 @@ def test_single_value_single_key_flower(basic_header_objs):
394
466
  pytest.param(["dark", "gain", "observe"], (0.0, 2.34), id="task_type_list2"),
395
467
  ],
396
468
  )
397
- def test_task_time_base_bud(basic_header_objs, ip_task_type, expected_value):
469
+ def test_task_round_time_base_bud(basic_header_objs, ip_task_type, expected_value):
398
470
  """
399
- Given: A set of headers with a value that needs to be rounded
400
- When: Ingesting headers with a `TaskTimeBudBase` bud and asking for the value
471
+ Given: A set of headers with a time value that needs to be rounded
472
+ When: Ingesting headers with a `TaskRoundTimeBudBase` bud and asking for the value
401
473
  Then: The bud's value is the header constant value
402
474
  """
403
- bud = TaskTimeBudBase(
475
+ bud = TaskRoundTimeBudBase(
404
476
  stem_name="rounded_time", metadata_key="roundable_time", ip_task_types=ip_task_type
405
477
  )
406
478
  assert bud.stem_name == "rounded_time"
@@ -522,6 +594,50 @@ def test_contributing_experiment_ids_bud(basic_header_objs):
522
594
  assert sorted(list(petal[0].value)) == ["experiment_id_1", "experiment_id_2"]
523
595
 
524
596
 
597
+ def test_task_contributing_ids_bud(basic_header_objs):
598
+ """
599
+ Given: A set of headers with experiment ID values for different tasks
600
+ When: Ingesting the headers with a TaskContributingIdsBud for the dark task
601
+ Then: The Bud's petal is just the experiment ID for the dark task
602
+ """
603
+ bud = TaskContributingIdsBud(
604
+ constant_name=BudName.experiment_id,
605
+ metadata_key=MetadataKey.experiment_id,
606
+ ip_task_types=TaskName.dark,
607
+ )
608
+ assert bud.stem_name == BudName.experiment_id.value
609
+ for fo in basic_header_objs:
610
+ key = fo.name
611
+ bud.update(key, fo)
612
+
613
+ petal = list(bud.petals)
614
+ assert len(petal) == 1
615
+ assert sorted(list(petal[0].value)) == ["experiment_id_2"]
616
+
617
+
618
+ def test_task_contributing_observing_program_execution_ids_bud(basic_header_objs):
619
+ """
620
+ Given: A set of headers with observing program execution ID values for different tasks
621
+ When: Ingesting the headers with a TaskContributingObservingProgramExecutionIdsBud for a task type
622
+ Then: The Bud's petal is the observing program execution IDs for the that task type
623
+ """
624
+ bud = TaskContributingObservingProgramExecutionIdsBud(
625
+ constant_name="NOT_A_REAL_BUD",
626
+ ip_task_types=TaskName.observe,
627
+ )
628
+ assert bud.stem_name == "NOT_A_REAL_BUD"
629
+ for fo in basic_header_objs:
630
+ key = fo.name
631
+ bud.update(key, fo)
632
+
633
+ petal = list(bud.petals)
634
+ assert len(petal) == 1
635
+ assert sorted(list(petal[0].value)) == [
636
+ "observing_program_execution_id_1",
637
+ "observing_program_execution_id_2",
638
+ ]
639
+
640
+
525
641
  def test_exp_time_flower(basic_header_objs):
526
642
  """
527
643
  Given: A set of filepaths and associated headers with XPOSURE keywords
@@ -783,6 +899,23 @@ def test_variance_cadence_bud(basic_header_objs):
783
899
  assert petal[0].value == 0.25
784
900
 
785
901
 
902
+ def test_task_date_begin_bud(basic_header_objs):
903
+ """
904
+ Given: A set of filepaths and associated headers with time_obs metadata keys
905
+ When: Ingesting with the TaskDateBeginBud
906
+ Then: The correct value is returned
907
+ """
908
+ bud = TaskDateBeginBud(constant_name=BudName.dark_date_begin, ip_task_types=TaskName.dark)
909
+ assert bud.stem_name == BudName.dark_date_begin.value
910
+ for fo in basic_header_objs:
911
+ key = fo.name
912
+ bud.update(key, fo)
913
+
914
+ petal = list(bud.petals)
915
+ assert len(petal) == 1
916
+ assert petal[0].value == "2022-06-17T22:00:02.000000"
917
+
918
+
786
919
  def test_observe_wavelength_bud(basic_header_objs):
787
920
  """
788
921
  Given: A set of headers with wavelength values
@@ -935,4 +1068,23 @@ def test_retarder_name_bud_error(bad_polcal_header_objs):
935
1068
  _ = bud.bud
936
1069
 
937
1070
 
1071
+ def test_task_average_bud(basic_header_objs):
1072
+ """
1073
+ Given: A set of headers with a differently valued header key
1074
+ When: Ingesting headers with an TaskAverageBud and asking for the value
1075
+ Then: The bud's value is the average of the header values of that task type
1076
+ """
1077
+ bud = TaskAverageBud(
1078
+ constant_name="average", metadata_key="near_thing", ip_task_types="observe"
1079
+ )
1080
+ assert bud.stem_name == "average"
1081
+ for fo in basic_header_objs:
1082
+ key = fo.name
1083
+ bud.update(key, fo)
1084
+
1085
+ petal = list(bud.petals)
1086
+ assert len(petal) == 1
1087
+ assert round(petal[0].value, 3) == 1.227
1088
+
1089
+
938
1090
  # TODO: test new stem types that have been added to parse_l0_input_data
@@ -28,12 +28,12 @@ class DummyFitsAccess(FitsAccessBase):
28
28
  auto_squeeze: bool = False, # Because L1 data should always have the right form, right?
29
29
  ):
30
30
  super().__init__(hdu=hdu, name=name, auto_squeeze=auto_squeeze)
31
- self._set_metadata_key_value(DummyMetadataKey.ip_task_type)
32
- self._set_metadata_key_value(DummyMetadataKey.gos_level3_status)
33
- self._set_metadata_key_value(DummyMetadataKey.gos_level3_lamp_status)
34
- self._set_metadata_key_value(DummyMetadataKey.gos_level0_status)
35
- self._set_metadata_key_value(DummyMetadataKey.gos_retarder_status)
36
- self._set_metadata_key_value(DummyMetadataKey.gos_polarizer_status)
31
+ self.ip_task_type = self.header[DummyMetadataKey.ip_task_type]
32
+ self.gos_level3_status = self.header[DummyMetadataKey.gos_level3_status]
33
+ self.gos_level3_lamp_status = self.header[DummyMetadataKey.gos_level3_lamp_status]
34
+ self.gos_level0_status = self.header[DummyMetadataKey.gos_level0_status]
35
+ self.gos_retarder_status = self.header[DummyMetadataKey.gos_retarder_status]
36
+ self.gos_polarizer_status = self.header[DummyMetadataKey.gos_polarizer_status]
37
37
 
38
38
 
39
39
  @pytest.fixture
@@ -12,14 +12,30 @@ from sqids import Sqids
12
12
 
13
13
  from dkist_processing_common._util.scratch import WorkflowFileSystem
14
14
  from dkist_processing_common.codecs.asdf import asdf_decoder
15
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
15
16
  from dkist_processing_common.codecs.bytes import bytes_decoder
16
17
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
17
18
  from dkist_processing_common.codecs.json import json_decoder
18
19
  from dkist_processing_common.codecs.quality import quality_data_encoder
20
+ from dkist_processing_common.models.input_dataset import InputDatasetParameter
21
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
19
22
  from dkist_processing_common.models.tags import Tag
20
23
  from dkist_processing_common.tasks import CreateTrialAsdf
21
24
  from dkist_processing_common.tasks import CreateTrialDatasetInventory
22
25
  from dkist_processing_common.tasks import CreateTrialQualityReport
26
+ from dkist_processing_common.tests.mock_metadata_store import input_dataset_parameters_part_factory
27
+
28
+
29
+ @pytest.fixture()
30
+ def mock_input_dataset_parts() -> InputDatasetPartDocumentList:
31
+ """An InputDatasetPartDocumentList with two parameters, each with one value and a date."""
32
+ raw = input_dataset_parameters_part_factory(
33
+ parameter_count=2,
34
+ parameter_value_count=1,
35
+ has_date=True,
36
+ has_file=False,
37
+ )
38
+ return InputDatasetPartDocumentList.model_validate({"doc_list": raw})
23
39
 
24
40
 
25
41
  @pytest.fixture()
@@ -41,6 +57,24 @@ def scratch_with_l1_frames(recipe_run_id, tmp_path) -> WorkflowFileSystem:
41
57
  scratch.write(
42
58
  file_obj, tags=[Tag.output(), Tag.frame()], relative_path=f"{uuid4().hex}.dat"
43
59
  )
60
+
61
+ return scratch
62
+
63
+
64
+ @pytest.fixture()
65
+ def scratch_with_l1_frames_and_parameters(
66
+ scratch_with_l1_frames, mock_input_dataset_parts
67
+ ) -> WorkflowFileSystem:
68
+ """Scratch instance for a recipe run id with tagged L1 frames and input parameters."""
69
+ scratch = scratch_with_l1_frames
70
+
71
+ # Write validated Pydantic model bytes expected by InputDatasetPartDocumentList
72
+ file_obj = basemodel_encoder(mock_input_dataset_parts)
73
+ scratch.write(
74
+ file_obj,
75
+ tags=Tag.input_dataset_parameters(),
76
+ relative_path=f"{uuid4().hex}.json",
77
+ )
44
78
  return scratch
45
79
 
46
80
 
@@ -85,6 +119,22 @@ def create_trial_asdf_task(
85
119
  task._purge()
86
120
 
87
121
 
122
+ @pytest.fixture(scope="function")
123
+ def create_trial_asdf_task_with_params(
124
+ recipe_run_id, tmp_path, scratch_with_l1_frames_and_parameters, fake_constants_db
125
+ ) -> CreateTrialAsdf:
126
+ """An instance of CreateTrialAsdf with L1 frames and input parameters tagged in scratch."""
127
+ task = CreateTrialAsdf(
128
+ recipe_run_id=recipe_run_id,
129
+ workflow_name="trial_asdf",
130
+ workflow_version="trial_asdf_version",
131
+ )
132
+ task.scratch = scratch_with_l1_frames_and_parameters
133
+ task.constants._update(fake_constants_db)
134
+ yield task
135
+ task._purge()
136
+
137
+
88
138
  @pytest.fixture()
89
139
  def create_trial_quality_report_task(
90
140
  recipe_run_id, tmp_path, fake_constants_db
@@ -143,25 +193,32 @@ def test_create_trial_dataset_inventory(create_trial_dataset_inventory_task):
143
193
  assert len(inventory) > 20 # a bunch
144
194
 
145
195
 
146
- def test_create_trial_asdf(create_trial_asdf_task, recipe_run_id):
196
+ @pytest.mark.parametrize("with_params", [False, True], ids=["no_params", "with_params"])
197
+ def test_create_trial_asdf(with_params, request, recipe_run_id, mock_input_dataset_parts):
147
198
  """
148
199
  :Given: An instance of CreateTrialAsdf with L1 frames tagged in scratch
149
200
  :When: CreateTrialAsdf is run
150
201
  :Then: An asdf file for the dataset is tagged in scratch
151
202
  """
152
- task = create_trial_asdf_task
203
+ task = request.getfixturevalue(
204
+ "create_trial_asdf_task_with_params" if with_params else "create_trial_asdf_task"
205
+ )
153
206
  # When
154
207
  task()
208
+
155
209
  # Then
156
210
  asdf_tags = [Tag.output(), Tag.asdf()]
157
211
  filepaths = list(task.scratch.find_all(tags=asdf_tags))
158
212
  assert len(filepaths) == 1
159
213
  dataset_id = Sqids(min_length=6, alphabet=ascii_uppercase).encode([recipe_run_id])
160
214
  assert filepaths[0].name == f"INSTRUMENT_L1_20240416T160000_{dataset_id}_metadata.asdf"
215
+
161
216
  results = list(task.read(tags=asdf_tags, decoder=asdf_decoder))
162
217
  assert len(results) == 1
218
+
163
219
  tree = results[0]
164
220
  assert isinstance(tree, dict)
221
+
165
222
  for file_name in tree["dataset"].files.filenames:
166
223
  # This is a slightly better than check that `not Path(file_name).is_absolute()` because it confirms
167
224
  # we've correctly stripped the path of *all* parents (not just those that start at root).
@@ -169,6 +226,19 @@ def test_create_trial_asdf(create_trial_asdf_task, recipe_run_id):
169
226
  # `scratch.workflow_base_path`
170
227
  assert Path(file_name).name == file_name
171
228
 
229
+ # Only check parameters when present
230
+ ds = tree["dataset"]
231
+ assert "parameters" in ds.meta
232
+ parameters = ds.meta["parameters"]
233
+ assert isinstance(parameters, list)
234
+ if with_params:
235
+ assert parameters, f"ASDF tree must include input parameters: {parameters}"
236
+ assert len(parameters) == len(mock_input_dataset_parts.doc_list)
237
+ for param in parameters:
238
+ assert InputDatasetParameter.model_validate(param) in mock_input_dataset_parts.doc_list
239
+ else:
240
+ assert ds.meta["parameters"] == []
241
+
172
242
 
173
243
  def test_create_trial_quality_report(create_trial_quality_report_task):
174
244
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 11.7.1rc1
3
+ Version: 11.8.0rc1
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
@@ -21,8 +21,8 @@ Requires-Dist: dkist-processing-core==6.0.0
21
21
  Requires-Dist: dkist-processing-pac<4.0,>=3.1
22
22
  Requires-Dist: dkist-service-configuration<5.0,>=4.1.7
23
23
  Requires-Dist: dkist-spectral-lines<4.0,>=3.0.0
24
- Requires-Dist: solar-wavelength-calibration<3.0,>=2.0.0rc1
25
- Requires-Dist: globus-sdk>=3.12.0
24
+ Requires-Dist: solar-wavelength-calibration<2.0,>=1.0
25
+ Requires-Dist: globus-sdk<4.0.0,>=3.12.0
26
26
  Requires-Dist: gqlclient[pydantic]==1.2.3
27
27
  Requires-Dist: sqids==0.5.1
28
28
  Requires-Dist: matplotlib>=3.4
@@ -57,9 +57,9 @@ Requires-Dist: pytest; extra == "docs"
57
57
  Requires-Dist: towncrier<22.12.0; extra == "docs"
58
58
  Requires-Dist: dkist-sphinx-theme; extra == "docs"
59
59
  Provides-Extra: inventory
60
- Requires-Dist: dkist-inventory<2.0,>=1.6.0; extra == "inventory"
60
+ Requires-Dist: dkist-inventory<2.0,>=1.11.0; extra == "inventory"
61
61
  Provides-Extra: asdf
62
- Requires-Dist: dkist-inventory[asdf]<2.0,>=1.6.0; extra == "asdf"
62
+ Requires-Dist: dkist-inventory[asdf]<2.0,>=1.11.0; extra == "asdf"
63
63
  Provides-Extra: quality
64
64
  Requires-Dist: dkist-quality<3.0,>=2.0.0; extra == "quality"
65
65
 
@@ -1,5 +1,5 @@
1
1
  changelog/.gitempty,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- changelog/271.misc.rst,sha256=YxeCttyTuraW8dlIRP99Pf9XHQrjQMPdSO9bm8r2Kk0,104
2
+ changelog/245.feature.1.rst,sha256=BBwCgALdFPqX7ZI0Uj-z9piaGplVKbgErZ6LuMH3qbA,148
3
3
  dkist_processing_common/__init__.py,sha256=GQ9EBnYhkOnt-qODclAoLS_g5YVhurxfg1tjVtI9rDI,320
4
4
  dkist_processing_common/config.py,sha256=kkFm-Q6jGGoV3Zdf3PSfk3xNYd2vSH0J2R8dBBav3Og,5218
5
5
  dkist_processing_common/manual.py,sha256=bIVVyLsbXMh-g_2L3kGROL-1TtJe0_XviHsp7Br31x8,7023
@@ -22,9 +22,9 @@ dkist_processing_common/codecs/str.py,sha256=Xqt5k8IhLc95KiiNiFwB1JWcVVc6T8AfcLr
22
22
  dkist_processing_common/fonts/Lato-Regular.ttf,sha256=1jbkaDIx-THtoiLViOlE0IK_0726AvkovuRhwPGFslE,656568
23
23
  dkist_processing_common/fonts/__init__.py,sha256=hBvZRtkoGRPlNDWCK-ZePXdSIlThCcjwBDfYaamVgAw,101
24
24
  dkist_processing_common/models/__init__.py,sha256=6LMqemdzVZ87fRrpAsbEnTtWZ02_Gu_oajsUlwGRH_Q,74
25
- dkist_processing_common/models/constants.py,sha256=oghBiVmtVk7YLkaQ2v8oZ-COHlAhmfjSvO9ZwzXCvLw,5828
25
+ dkist_processing_common/models/constants.py,sha256=VDYPfrZtmBDNaWc3EvbpX7Hs87wJ6cA2BqZQJhb2B1Q,19773
26
26
  dkist_processing_common/models/dkist_location.py,sha256=6Nk0wvv4R8ptlrV7BXon7abq4YLvmTdUmPsDN5G8nWc,971
27
- dkist_processing_common/models/fits_access.py,sha256=NLxvIsaFrv4Fui1EhGzkV5XXjv-Vi8DQaLfMHOrRdzc,5949
27
+ dkist_processing_common/models/fits_access.py,sha256=imKqL4-_g6gTR-IeIjZ6qkMhQX3JujdrKFrTd9gOXnw,5605
28
28
  dkist_processing_common/models/flower_pot.py,sha256=_J7DwHM8u5kQfdPCpk5pUmALtLrM1L_h-x8JW5BSjXA,5129
29
29
  dkist_processing_common/models/fried_parameter.py,sha256=ro_H2Eo3I88lRf1wJjZfTc_XOjhgLt4whIQR_sjAFbM,1609
30
30
  dkist_processing_common/models/graphql.py,sha256=oSEcdVsVRytnIDEORLs4b6r3C2Lr7gqEEMHu82zpOOg,5912
@@ -39,19 +39,21 @@ dkist_processing_common/models/task_name.py,sha256=uAl7qTK4Xx1nqPAhNAe5nAXqxwPwQ
39
39
  dkist_processing_common/models/telemetry.py,sha256=XVcLNgHCZsP9L7oYiklyLUoqQtWt_xjEkuf70Kbudz4,839
40
40
  dkist_processing_common/models/wavelength.py,sha256=4UhRVoNvCHZitXo5S1oRdewadbmGfmDK6wetMV06POA,967
41
41
  dkist_processing_common/parsers/__init__.py,sha256=XJQzHtPb78F6-qXXKXjyztc0x-aHVlgv1C_l4dR88tI,67
42
+ dkist_processing_common/parsers/average_bud.py,sha256=86zgcgLdDd8_Stf4RhZ9wfsmeuLXLA1jc-zcPHAz4YQ,1454
42
43
  dkist_processing_common/parsers/cs_step.py,sha256=rL2gdstKEV5aqdPDs3a5EuUaOT_6YXDJVqIPIVKSw8M,6450
43
44
  dkist_processing_common/parsers/dsps_repeat.py,sha256=Jg6oI9-PtFQbQHbGul6_eiRzBKr0Z2HIGOitG0G5CD4,1642
44
- dkist_processing_common/parsers/experiment_id_bud.py,sha256=5ARnj6M5PEef_5-IVD1W6zl5DkYqx8eyt5-26Se-X2s,804
45
- dkist_processing_common/parsers/id_bud.py,sha256=XohLGwVC-AD66qJe6I3AKdm5ArQIf3ryfDzPCQ5hEBk,1688
46
- dkist_processing_common/parsers/l0_fits_access.py,sha256=gbE_4vFexOeKNLvqWvUFNxg-zBRpY1rCfRpIWHFpt_0,1009
47
- dkist_processing_common/parsers/l1_fits_access.py,sha256=dJbbKRExoRpl94cSpgZg5SQZLh4tkV8p0vsKO8P8FLE,2814
48
- dkist_processing_common/parsers/near_bud.py,sha256=lOHrjERKh3ooFusbd3_N-IDDpEOD9VWq2G82_wJ2c08,4002
49
- dkist_processing_common/parsers/proposal_id_bud.py,sha256=tKW8dwh7XkECU1Z0T1E4AHj42emV3-RRVBBpVUZloTk,753
45
+ dkist_processing_common/parsers/experiment_id_bud.py,sha256=LUehIqB56hmDwARph1itSUsPenFHScfrrRuZmcCi4xA,960
46
+ dkist_processing_common/parsers/id_bud.py,sha256=dWNr-njRqDzTnXa2WLZQEb48ul7RdeGzSsURt74978w,2340
47
+ dkist_processing_common/parsers/l0_fits_access.py,sha256=Ol3eo8yyNbGqbN2whhD2jBNoqhOrlwmH8DbMmCLtNk0,1033
48
+ dkist_processing_common/parsers/l1_fits_access.py,sha256=BWojvcFl_RmkrRWHe1WxDCsPeexervlRFPothuXAyoI,4410
49
+ dkist_processing_common/parsers/near_bud.py,sha256=ithuQpnAaK5MDXFhMPNoNIGuF2M94q0n6_qofGl-CdU,4006
50
+ dkist_processing_common/parsers/observing_program_id_bud.py,sha256=foESQTMShcp-aPGZFcLEdXIdi5Y6vFeus-W447olQEc,884
51
+ dkist_processing_common/parsers/proposal_id_bud.py,sha256=VvVoYM-MUivra2fMZOSAOgGQslLROZxFuwHnuAZyAjc,942
50
52
  dkist_processing_common/parsers/quality.py,sha256=hhCT-bHODOYSp9jvgsiWfYcLYtQCSWgfuy0xZnkYXwo,1141
51
53
  dkist_processing_common/parsers/retarder.py,sha256=AvDrMLmxuwKOIP3NNm9mtV7dV2kw_aqW92hTLd1UdK0,1507
52
- dkist_processing_common/parsers/single_value_single_key_flower.py,sha256=3mcPOG6dEU7IHWm0Jtjx3FVzbxAJCiKtLyVwZqFd2lA,1425
54
+ dkist_processing_common/parsers/single_value_single_key_flower.py,sha256=Xy0_55H2VInGkMKSPOQjcYiMW0DFlDOn27n5jC2PKzE,1358
53
55
  dkist_processing_common/parsers/task.py,sha256=nuGxDl5_gjbi07jMOrCPD5J9L51lyZZ6VS25FuDC3V8,3990
54
- dkist_processing_common/parsers/time.py,sha256=z9zHV3Fz6ebEDgiPhv6H-aAS8e-sSW3EkBbPbtHpzGY,8576
56
+ dkist_processing_common/parsers/time.py,sha256=rbtC86d0-Dd1arsxitpixA8Vzg_GD2vE3uFQVN7vSqw,11686
55
57
  dkist_processing_common/parsers/unique_bud.py,sha256=IkS2zZkVzn3PRsYF2ksBkUxl_HJ4TxCqBKJUs1WdL54,3310
56
58
  dkist_processing_common/parsers/wavelength.py,sha256=P5C9mG8DAKK3GB3vWNRBI5l7pAW68lJK-kw-4eqERuQ,612
57
59
  dkist_processing_common/tasks/__init__.py,sha256=l23ctjNsKJbHbbqaZBMeOPaOtw0hmITEljI_JJ-CVsU,627
@@ -59,11 +61,11 @@ dkist_processing_common/tasks/assemble_movie.py,sha256=1ixDG-f4ODt0vywqVccG3aodL
59
61
  dkist_processing_common/tasks/base.py,sha256=itAHCvzcodo-q8_AjpWoRaM86BlcjWDpCIiUP7uwmP0,13236
60
62
  dkist_processing_common/tasks/l1_output_data.py,sha256=D4S3kH2uRKp1b8_xF2YiWO_mGj19UJS5wKQZ4OdatGs,10568
61
63
  dkist_processing_common/tasks/output_data_base.py,sha256=r1Bu3FX5zTVj66GTMWtaV_NdhxjyjSm661Bt2Mxmfi4,3685
62
- dkist_processing_common/tasks/parse_l0_input_data.py,sha256=Gf8tA0aKqKuhkuxJqtblLL9y_ARCKoMb1cztSt_2hSU,8343
64
+ dkist_processing_common/tasks/parse_l0_input_data.py,sha256=KguXT0Xavynu7C8NFMjsV4628LRoTvfeSuApb6v4Neg,18835
63
65
  dkist_processing_common/tasks/quality_metrics.py,sha256=cvGF6tJ8yAvxOvkeG3tWxYwL885BrFW5X3V7_MSzL-A,12481
64
66
  dkist_processing_common/tasks/teardown.py,sha256=rwT9lWINVDF11-az_nx-Z5ykMTX_SJCchobpU6sErgk,2360
65
67
  dkist_processing_common/tasks/transfer_input_data.py,sha256=DAYfS-B1o-iBT9MXU-TiJG4Hv05Z0c_JzPrnFgvnK9g,5786
66
- dkist_processing_common/tasks/trial_catalog.py,sha256=iAaMT_oLnupA1O3xAtqVjsqRY5f_hyvMps-fXg6KlHU,8729
68
+ dkist_processing_common/tasks/trial_catalog.py,sha256=43XN4Hz4uNBGEps3O5RLfFHRfyo9FZPzMwkcapniztQ,10049
67
69
  dkist_processing_common/tasks/trial_output_data.py,sha256=CPMXXODvN5RTcu9bTF8v6AXciCl212EWP6qTiARvUNk,6837
68
70
  dkist_processing_common/tasks/write_l1.py,sha256=Xy834RTp3F95kLcW4ba5gfHMUocfZd82ZQQKnvQcP2M,23204
69
71
  dkist_processing_common/tasks/mixin/__init__.py,sha256=-g-DQbU7m1bclJYuFe3Yh757V-35GIDTbstardKQ7nU,68
@@ -73,10 +75,10 @@ dkist_processing_common/tasks/mixin/metadata_store.py,sha256=QeZV3BITUzCErUt7mbk
73
75
  dkist_processing_common/tasks/mixin/object_store.py,sha256=zGAyRR1O6EN52p7sFQtDWxa7ASx3HJSsO4d4tJr-beE,3237
74
76
  dkist_processing_common/tasks/mixin/quality/__init__.py,sha256=GOI_PBUxTmYp5IIuYFbwpA5Vx0jUwpdBBYYrnZMTh0E,384
75
77
  dkist_processing_common/tasks/mixin/quality/_base.py,sha256=qt9TZZ140skFWFmabrjlGdm60OLWEfx_xZAaohr6dLM,8492
76
- dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=TtM6V7qy0U6ofFmjXNoJKkaECoPSfJsU4Ziu1UQgPZs,60457
78
+ dkist_processing_common/tasks/mixin/quality/_metrics.py,sha256=k0hlthVbW7Jso9q_P0-hWGfp190kQO_oUQyGBRvxgqo,60626
77
79
  dkist_processing_common/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
80
  dkist_processing_common/tests/conftest.py,sha256=Tm-Yq956EAafpDtu1d7JjdVY0Unp9e4z9ak-yf4wnH4,22320
79
- dkist_processing_common/tests/mock_metadata_store.py,sha256=fbCvSk1-s0ojN6l538RWodPW7dx6k4eXqipemnHKO0Y,8248
81
+ dkist_processing_common/tests/mock_metadata_store.py,sha256=-uzwbLeRn19_Pq1hr97R4hpUD5K5sv8Zy1U8gG0GdSQ,9657
80
82
  dkist_processing_common/tests/test_assemble_movie.py,sha256=dyVhowxB-Kc6GuxlDs74UrPtK9fwdUL7y5haA3Bidz0,4065
81
83
  dkist_processing_common/tests/test_assemble_quality.py,sha256=-F22jMY6mPy65VZ1TZY2r1vsxMXOPmZHArGx70OD3BA,17832
82
84
  dkist_processing_common/tests/test_base.py,sha256=gsyBG2R6Ufx7CzbHeGMagUwM9yCfpN4gCSZ6-aH2q48,6643
@@ -84,29 +86,29 @@ dkist_processing_common/tests/test_codecs.py,sha256=XuvG1sG8DECMPmxtDEi98TxlvTSA
84
86
  dkist_processing_common/tests/test_constants.py,sha256=I_KcJs7ScCn53GYhEO6qjWrrnfZuyC1IVYOy87Pjlg4,6565
85
87
  dkist_processing_common/tests/test_cs_step.py,sha256=RA0QD3D8eaL3YSOL_gIJ9wkngy14RQ2jbD-05KAziW4,2408
86
88
  dkist_processing_common/tests/test_dkist_location.py,sha256=-_OoSw4SZDLFyIuOltHvM6PQjxm5hTiJQsiTGZ8Sadc,456
87
- dkist_processing_common/tests/test_fits_access.py,sha256=IYLrGRq71ve_yKJA6N-Gxz2-r9iISExwM8Zt6bB-jJI,13832
89
+ dkist_processing_common/tests/test_fits_access.py,sha256=a50B4IAAH5NH5zeudTqyy0b5uWKJwJuzQLUdK1LoOHM,12832
88
90
  dkist_processing_common/tests/test_flower_pot.py,sha256=X9_UI3maa3ZQncV3jYHgovWnawDsdEkEB5vw6EAB96o,3151
89
91
  dkist_processing_common/tests/test_fried_parameter.py,sha256=iXtlQIifZ6cDOkEi-YDgP3oAlss2loq08Uohgvy1byQ,1295
90
- dkist_processing_common/tests/test_input_dataset.py,sha256=pQ01rWAkQ2XQojyHWzAqeOdrMXshNcgEVL5I_9bBTdo,9610
92
+ dkist_processing_common/tests/test_input_dataset.py,sha256=wnQbZxBYywG5CEXces2WWk6I0QA7HjStaYSTVVbe5r0,8499
91
93
  dkist_processing_common/tests/test_interservice_bus.py,sha256=QrBeZ8dh497h6nxA8-aVUIGDcSj8y9DIXIk9I_HkXr0,3001
92
94
  dkist_processing_common/tests/test_interservice_bus_mixin.py,sha256=IptJkW7Qeu2Y742NKXEgkok2VdS600keLgCD3Y9iw3A,4131
93
95
  dkist_processing_common/tests/test_manual_processing.py,sha256=iHF7yQPlar9niYAGXtFv28Gw3Undlds38yMfszk4ccY,1037
94
96
  dkist_processing_common/tests/test_output_data_base.py,sha256=D8b1XKvbE3C5cGOiHq58yJ2pzQL3iL0wLZy_AkDdB9Y,3085
95
97
  dkist_processing_common/tests/test_parameters.py,sha256=CUEUIGBPMCUXPll0G0UxFDbMXi8lmnjRwXBarGX1PAQ,14033
96
- dkist_processing_common/tests/test_parse_l0_input_data.py,sha256=rwmtQJQo7SNdzPVzMOFxXS35H_nOLWYgbZsc9QuMEgc,10503
98
+ dkist_processing_common/tests/test_parse_l0_input_data.py,sha256=9OOqeMX8ReQO67ldoMHOBKLQg7Nd5qWHOEoHygcN5Ic,11889
97
99
  dkist_processing_common/tests/test_publish_catalog_messages.py,sha256=l6Wga1s2wNBIf4wGZ78ZIO_rtqjdidmtvlN9nMnQUAs,3222
98
100
  dkist_processing_common/tests/test_quality.py,sha256=IPz7liXcmoqWIsY78oX07Ui0nWHxoUH2FbKGEmMle7E,10258
99
- dkist_processing_common/tests/test_quality_mixin.py,sha256=L-_kSIKs8A48LGt9QaItZWZqIcRF0MhBCAZQZYdSflk,55575
101
+ dkist_processing_common/tests/test_quality_mixin.py,sha256=qanm3SXEiLb0OJDawbh8ixVAG9uRglFMzwxTeYxkDsM,55369
100
102
  dkist_processing_common/tests/test_scratch.py,sha256=WO8C1VJlkcC5IzST9Hj08CyyrINwYcN8pyteD9x38xs,16482
101
- dkist_processing_common/tests/test_stems.py,sha256=8Im6TtEEwkU6MN5wAAbq2gL4Z5bCQp-rbVH_QEdc880,32316
103
+ dkist_processing_common/tests/test_stems.py,sha256=p__51u-b8vfWLI71aLxF3w2tcWtv6M6DyHJ7_6FZMHI,38949
102
104
  dkist_processing_common/tests/test_submit_dataset_metadata.py,sha256=LHEyjoIxJHXXssqKkr8Qn1NzzHD1FLJiD3lP8yaLiXU,3764
103
105
  dkist_processing_common/tests/test_tags.py,sha256=w5gmVfp3Ck92KNV80lJQRMz0OYgTYzWtwVUFWv1b5i8,5024
104
106
  dkist_processing_common/tests/test_task_name.py,sha256=kqFr59XX2K87xzfTlClzDV4-Je1dx72LvdaJ22UE8UU,1233
105
- dkist_processing_common/tests/test_task_parsing.py,sha256=leXQrIWU5CIkUWRaiG0hW4NCmFtlpxHNsgl4Jz2EghA,4368
107
+ dkist_processing_common/tests/test_task_parsing.py,sha256=2_OOmeZQWD17XAd_ECYmodJzD_iRIBKjCYdGh38BOx4,4421
106
108
  dkist_processing_common/tests/test_teardown.py,sha256=DaliHSGsiQBZaFkf5wb3XBo6rHNPmx2bmQtVymYeBN4,5601
107
109
  dkist_processing_common/tests/test_transfer_input_data.py,sha256=eyAAWXpTHQ8aew87-MncWpYBn4DAZrTSOL3LvlQfR5Q,12611
108
110
  dkist_processing_common/tests/test_transfer_l1_output_data.py,sha256=PVGDJBEUk4kAeu8ivrhlCE7yd29R18t9kZLFx-mpBwY,2063
109
- dkist_processing_common/tests/test_trial_catalog.py,sha256=Efq4yP1_0jccCFTi0_inyf4utC-oJVpGoAZ13fBP7I0,6778
111
+ dkist_processing_common/tests/test_trial_catalog.py,sha256=CxjtVABE5Fw2EvyXR56IJ3PPi9QvEOjccH0OzzRWk30,9424
110
112
  dkist_processing_common/tests/test_trial_output_data.py,sha256=YwmSfhNsSG-kdnvNlq7Ku0PNi_onTvU6uxn_nLiAKZw,12008
111
113
  dkist_processing_common/tests/test_workflow_task_base.py,sha256=LTVusltNrsGUOvw9G323am4CXebgE4tJhP6gZCcS0CQ,10457
112
114
  dkist_processing_common/tests/test_write_l1.py,sha256=alN-lozKEm6vKNdhtvzjnuPqv-NjHyUg16Op7SkMH-c,27964
@@ -118,7 +120,7 @@ docs/landing_page.rst,sha256=aPAuXFhBx73lEZ59B6E6JXxkK0LlxzD0n-HXqHrfumQ,746
118
120
  docs/make.bat,sha256=mBAhtURwhQ7yc95pqwJzlhqBSvRknr1aqZ5s8NKvdKs,4513
119
121
  docs/requirements.txt,sha256=Kbl_X4c7RQZw035YTeNB63We6I7pvXFU4T0Uflp2yDY,29
120
122
  licenses/LICENSE.rst,sha256=piZaQplkzOMmH1NXg6QIdo9wwo9pPCoHkvm2-DmH76E,1462
121
- dkist_processing_common-11.7.1rc1.dist-info/METADATA,sha256=VLi5DszJYXgtOb_O0CZV9_JCPEQe8-cPFdkJnWavVLQ,13321
122
- dkist_processing_common-11.7.1rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
123
- dkist_processing_common-11.7.1rc1.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
124
- dkist_processing_common-11.7.1rc1.dist-info/RECORD,,
123
+ dkist_processing_common-11.8.0rc1.dist-info/METADATA,sha256=k1cSXjEW_NNR3JwR7h55s9SFLH-H2k4XfT-RigHlAsQ,13325
124
+ dkist_processing_common-11.8.0rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
125
+ dkist_processing_common-11.8.0rc1.dist-info/top_level.txt,sha256=LJhd1W-Vn90K8HnQDIE4r52YDpUjjMWDnllAWHBByW0,48
126
+ dkist_processing_common-11.8.0rc1.dist-info/RECORD,,
changelog/271.misc.rst DELETED
@@ -1 +0,0 @@
1
- Move `solar-wavelength-calibration` dep to 2.0.0 and make use of new helper properties in that release.