dkist-processing-dlnirsp 1.6.2__tar.gz → 1.6.3__tar.gz

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 (119) hide show
  1. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/CHANGELOG.rst +15 -0
  2. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/PKG-INFO +19 -19
  3. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/dark.py +1 -1
  4. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/dlnirsp_base.py +28 -0
  5. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/geometric.py +1 -1
  6. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/instrument_polarization.py +1 -1
  7. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/lamp.py +1 -1
  8. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/science.py +1 -1
  9. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/solar.py +1 -1
  10. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_dark.py +10 -11
  11. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_dlnirsp_base.py +42 -0
  12. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_geometric.py +10 -9
  13. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_instrument_polarization_calibration.py +10 -10
  14. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_lamp.py +10 -11
  15. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_science.py +10 -11
  16. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_solar.py +10 -11
  17. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp.egg-info/PKG-INFO +19 -19
  18. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp.egg-info/requires.txt +18 -18
  19. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/pyproject.toml +20 -20
  20. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/.gitignore +0 -0
  21. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/.pre-commit-config.yaml +0 -0
  22. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/.readthedocs.yml +0 -0
  23. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/.snyk +0 -0
  24. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/README.rst +0 -0
  25. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/SCIENCE_CHANGELOG.rst +0 -0
  26. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/bitbucket-pipelines.yml +0 -0
  27. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/changelog/.gitempty +0 -0
  28. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/__init__.py +0 -0
  29. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/config.py +0 -0
  30. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/dev_scripts/__init__.py +0 -0
  31. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/dev_scripts/test_slitbeam_group_assignment.py +0 -0
  32. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/models/__init__.py +0 -0
  33. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/models/constants.py +0 -0
  34. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/models/fits_access.py +0 -0
  35. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/models/parameters.py +0 -0
  36. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/models/tags.py +0 -0
  37. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/models/task_name.py +0 -0
  38. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/__init__.py +0 -0
  39. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/dlnirsp_l0_fits_access.py +0 -0
  40. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/dlnirsp_l1_fits_acess.py +0 -0
  41. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/mosaic.py +0 -0
  42. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/task.py +0 -0
  43. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/time.py +0 -0
  44. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/wcs_corrections.py +0 -0
  45. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/parsers/wcs_mosaic.py +0 -0
  46. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/__init__.py +0 -0
  47. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/bad_pixel_map.py +0 -0
  48. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/ifu_drift.py +0 -0
  49. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/l1_output_data.py +0 -0
  50. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/linearity_correction.py +0 -0
  51. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/mixin/__init__.py +0 -0
  52. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/mixin/corrections.py +0 -0
  53. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/mixin/group_id.py +0 -0
  54. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/movie.py +0 -0
  55. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/parse.py +0 -0
  56. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/polcal_as_science.py +0 -0
  57. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/quality_metrics.py +0 -0
  58. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/wavelength_calibration.py +0 -0
  59. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/write_dataset_extras.py +0 -0
  60. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tasks/write_l1.py +0 -0
  61. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/__init__.py +0 -0
  62. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/conftest.py +0 -0
  63. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/__init__.py +0 -0
  64. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_linearize_only.py +0 -0
  65. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  66. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  67. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  68. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_dev_mockers.py +0 -0
  69. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  70. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/local_trial_workflows/translate_files.py +0 -0
  71. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_assemble_quality.py +0 -0
  72. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_bad_pixel_map.py +0 -0
  73. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_corrections.py +0 -0
  74. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_dlnirsp_constants.py +0 -0
  75. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_dlnirsp_fits_access.py +0 -0
  76. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_group_id.py +0 -0
  77. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_ifu_drift.py +0 -0
  78. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_linearity_correction.py +0 -0
  79. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_movie.py +0 -0
  80. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_parameters.py +0 -0
  81. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_parse.py +0 -0
  82. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_polcal_as_science.py +0 -0
  83. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_quality.py +0 -0
  84. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_trial_create_quality_report.py +0 -0
  85. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_wavelength_calibration.py +0 -0
  86. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_wcs_parse.py +0 -0
  87. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_workflows.py +0 -0
  88. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_write_dataset_extras.py +0 -0
  89. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/tests/test_write_l1.py +0 -0
  90. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/workflows/__init__.py +0 -0
  91. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/workflows/l0_processing.py +0 -0
  92. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp/workflows/trial_workflow.py +0 -0
  93. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp.egg-info/SOURCES.txt +0 -0
  94. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp.egg-info/dependency_links.txt +0 -0
  95. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp.egg-info/entry_points.txt +0 -0
  96. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/dkist_processing_dlnirsp.egg-info/top_level.txt +0 -0
  97. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/Makefile +0 -0
  98. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/bad_pixel_calibration.rst +0 -0
  99. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/changelog.rst +0 -0
  100. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/conf.py +0 -0
  101. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/dataset_extras.rst +0 -0
  102. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/gain.rst +0 -0
  103. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/geometric.rst +0 -0
  104. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/ifu_drift.rst +0 -0
  105. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/index.rst +0 -0
  106. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/l0_to_l1_dlnirsp.rst +0 -0
  107. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/l0_to_l1_dlnirsp_full-trial.rst +0 -0
  108. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/landing_page.rst +0 -0
  109. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/linearization.rst +0 -0
  110. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/make.bat +0 -0
  111. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/polarization_calibration.rst +0 -0
  112. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/requirements_table.rst +0 -0
  113. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/science_calibration.rst +0 -0
  114. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/scientific_changelog.rst +0 -0
  115. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/docs/wavelength_calibration.rst +0 -0
  116. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/licenses/LICENSE.rst +0 -0
  117. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/science_towncrier.sh +0 -0
  118. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/setup.cfg +0 -0
  119. {dkist_processing_dlnirsp-1.6.2 → dkist_processing_dlnirsp-1.6.3}/towncrier_science.toml +0 -0
@@ -1,3 +1,18 @@
1
+ v1.6.3 (2026-05-04)
2
+ ===================
3
+
4
+ Features
5
+ --------
6
+
7
+ - Add `quality_write_intermediate_task_type_counts` method to `DlnirspTaskBase` workflow task. (`#182 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/182>`__)
8
+
9
+
10
+ Misc
11
+ ----
12
+
13
+ - Update dkist-processing-common to 14.0.2 which converts TASK_TYPES quality metric to the new methodology. (`#182 <https://bitbucket.org/dkistdc/dkist-processing-dlnirsp/pull-requests/182>`__)
14
+
15
+
1
16
  v1.6.2 (2026-04-27)
2
17
  ===================
3
18
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-dlnirsp
3
- Version: 1.6.2
3
+ Version: 1.6.3
4
4
  Summary: Science processing code for the DLNIRSP instrument on DKIST
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -13,7 +13,7 @@ Classifier: Programming Language :: Python :: 3
13
13
  Classifier: Programming Language :: Python :: 3.13
14
14
  Requires-Python: >=3.13
15
15
  Description-Content-Type: text/x-rst
16
- Requires-Dist: dkist-processing-common==14.0.1
16
+ Requires-Dist: dkist-processing-common==14.0.2
17
17
  Requires-Dist: dkist-processing-math==2.2.2
18
18
  Requires-Dist: dkist-processing-pac==3.1.2
19
19
  Requires-Dist: dkist-header-validator==5.3.1
@@ -66,7 +66,7 @@ Provides-Extra: frozen
66
66
  Requires-Dist: Deprecated==1.3.1; extra == "frozen"
67
67
  Requires-Dist: ImageIO==2.37.3; extra == "frozen"
68
68
  Requires-Dist: Jinja2==3.1.6; extra == "frozen"
69
- Requires-Dist: Mako==1.3.11; extra == "frozen"
69
+ Requires-Dist: Mako==1.3.12; extra == "frozen"
70
70
  Requires-Dist: MarkupSafe==3.0.3; extra == "frozen"
71
71
  Requires-Dist: PIMS==0.7; extra == "frozen"
72
72
  Requires-Dist: PeakUtils==1.3.5; extra == "frozen"
@@ -92,7 +92,7 @@ Requires-Dist: annotated-types==0.7.0; extra == "frozen"
92
92
  Requires-Dist: anyio==4.13.0; extra == "frozen"
93
93
  Requires-Dist: apache-airflow==3.1.8; extra == "frozen"
94
94
  Requires-Dist: apache-airflow-core==3.1.8; extra == "frozen"
95
- Requires-Dist: apache-airflow-providers-celery==3.18.0; extra == "frozen"
95
+ Requires-Dist: apache-airflow-providers-celery==3.19.0; extra == "frozen"
96
96
  Requires-Dist: apache-airflow-providers-common-compat==1.14.3; extra == "frozen"
97
97
  Requires-Dist: apache-airflow-providers-common-io==1.7.2; extra == "frozen"
98
98
  Requires-Dist: apache-airflow-providers-common-sql==1.35.0; extra == "frozen"
@@ -107,14 +107,14 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
107
107
  Requires-Dist: asgiref==3.11.1; extra == "frozen"
108
108
  Requires-Dist: asteval==1.0.8; extra == "frozen"
109
109
  Requires-Dist: astropy==7.0.2; extra == "frozen"
110
- Requires-Dist: astropy-iers-data==0.2026.4.27.1.3.2; extra == "frozen"
110
+ Requires-Dist: astropy-iers-data==0.2026.5.4.1.4.54; extra == "frozen"
111
111
  Requires-Dist: astropy_healpix==1.1.3; extra == "frozen"
112
112
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
113
113
  Requires-Dist: attrs==26.1.0; extra == "frozen"
114
114
  Requires-Dist: babel==2.18.0; extra == "frozen"
115
115
  Requires-Dist: billiard==4.2.4; extra == "frozen"
116
- Requires-Dist: boto3==1.42.97; extra == "frozen"
117
- Requires-Dist: botocore==1.42.97; extra == "frozen"
116
+ Requires-Dist: boto3==1.43.3; extra == "frozen"
117
+ Requires-Dist: botocore==1.43.3; extra == "frozen"
118
118
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
119
119
  Requires-Dist: celery==5.6.3; extra == "frozen"
120
120
  Requires-Dist: certifi==2026.4.22; extra == "frozen"
@@ -129,16 +129,16 @@ Requires-Dist: colorlog==6.10.1; extra == "frozen"
129
129
  Requires-Dist: contourpy==1.3.3; extra == "frozen"
130
130
  Requires-Dist: cron_descriptor==2.0.8; extra == "frozen"
131
131
  Requires-Dist: croniter==6.2.2; extra == "frozen"
132
- Requires-Dist: cryptography==47.0.0; extra == "frozen"
132
+ Requires-Dist: cryptography==48.0.0; extra == "frozen"
133
133
  Requires-Dist: cycler==0.12.1; extra == "frozen"
134
134
  Requires-Dist: dask==2026.3.0; extra == "frozen"
135
135
  Requires-Dist: dask-image==2025.11.0; extra == "frozen"
136
136
  Requires-Dist: decorator==5.2.1; extra == "frozen"
137
137
  Requires-Dist: dill==0.4.1; extra == "frozen"
138
138
  Requires-Dist: dkist-header-validator==5.3.1; extra == "frozen"
139
- Requires-Dist: dkist-processing-common==14.0.1; extra == "frozen"
139
+ Requires-Dist: dkist-processing-common==14.0.2; extra == "frozen"
140
140
  Requires-Dist: dkist-processing-core==7.2.1; extra == "frozen"
141
- Requires-Dist: dkist-processing-dlnirsp==1.6.2; extra == "frozen"
141
+ Requires-Dist: dkist-processing-dlnirsp==1.6.3; extra == "frozen"
142
142
  Requires-Dist: dkist-processing-math==2.2.2; extra == "frozen"
143
143
  Requires-Dist: dkist-processing-pac==3.1.2; extra == "frozen"
144
144
  Requires-Dist: dkist-service-configuration==4.3.0; extra == "frozen"
@@ -153,7 +153,7 @@ Requires-Dist: fastjsonschema==2.21.2; extra == "frozen"
153
153
  Requires-Dist: flower==2.0.1; extra == "frozen"
154
154
  Requires-Dist: fonttools==4.62.1; extra == "frozen"
155
155
  Requires-Dist: frozenlist==1.8.0; extra == "frozen"
156
- Requires-Dist: fsspec==2026.3.0; extra == "frozen"
156
+ Requires-Dist: fsspec==2026.4.0; extra == "frozen"
157
157
  Requires-Dist: globus-sdk==4.5.0; extra == "frozen"
158
158
  Requires-Dist: google-crc32c==1.8.0; extra == "frozen"
159
159
  Requires-Dist: googleapis-common-protos==1.74.0; extra == "frozen"
@@ -233,7 +233,7 @@ Requires-Dist: pathspec==1.1.1; extra == "frozen"
233
233
  Requires-Dist: pendulum==3.2.0; extra == "frozen"
234
234
  Requires-Dist: pika==1.3.2; extra == "frozen"
235
235
  Requires-Dist: pillow==11.3.0; extra == "frozen"
236
- Requires-Dist: pip==26.1; extra == "frozen"
236
+ Requires-Dist: pip==26.1.1; extra == "frozen"
237
237
  Requires-Dist: platformdirs==4.9.6; extra == "frozen"
238
238
  Requires-Dist: pluggy==1.6.0; extra == "frozen"
239
239
  Requires-Dist: pooch==1.9.0; extra == "frozen"
@@ -257,16 +257,16 @@ Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
257
257
  Requires-Dist: python-dotenv==1.2.2; extra == "frozen"
258
258
  Requires-Dist: python-multipart==0.0.27; extra == "frozen"
259
259
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
260
- Requires-Dist: pytz==2026.1.post1; extra == "frozen"
260
+ Requires-Dist: pytz==2026.2; extra == "frozen"
261
261
  Requires-Dist: redis==6.4.0; extra == "frozen"
262
262
  Requires-Dist: referencing==0.37.0; extra == "frozen"
263
263
  Requires-Dist: reproject==0.19.0; extra == "frozen"
264
264
  Requires-Dist: requests==2.33.1; extra == "frozen"
265
265
  Requires-Dist: rich==15.0.0; extra == "frozen"
266
- Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
266
+ Requires-Dist: rich-argparse==1.8.0; extra == "frozen"
267
267
  Requires-Dist: rich-toolkit==0.19.7; extra == "frozen"
268
268
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
269
- Requires-Dist: s3transfer==0.16.1; extra == "frozen"
269
+ Requires-Dist: s3transfer==0.17.0; extra == "frozen"
270
270
  Requires-Dist: scikit-image==0.26.0; extra == "frozen"
271
271
  Requires-Dist: scipy==1.15.3; extra == "frozen"
272
272
  Requires-Dist: semantic-version==2.10.0; extra == "frozen"
@@ -287,12 +287,12 @@ Requires-Dist: talus==1.3.4; extra == "frozen"
287
287
  Requires-Dist: tenacity==8.5.0; extra == "frozen"
288
288
  Requires-Dist: termcolor==3.3.0; extra == "frozen"
289
289
  Requires-Dist: text-unidecode==1.3; extra == "frozen"
290
- Requires-Dist: tifffile==2026.4.11; extra == "frozen"
290
+ Requires-Dist: tifffile==2026.5.2; extra == "frozen"
291
291
  Requires-Dist: toolz==1.1.0; extra == "frozen"
292
292
  Requires-Dist: tornado==6.5.5; extra == "frozen"
293
293
  Requires-Dist: tqdm==4.67.3; extra == "frozen"
294
294
  Requires-Dist: traitlets==5.14.3; extra == "frozen"
295
- Requires-Dist: typer==0.25.0; extra == "frozen"
295
+ Requires-Dist: typer==0.25.1; extra == "frozen"
296
296
  Requires-Dist: typing-inspection==0.4.2; extra == "frozen"
297
297
  Requires-Dist: typing_extensions==4.15.0; extra == "frozen"
298
298
  Requires-Dist: tzdata==2026.2; extra == "frozen"
@@ -307,13 +307,13 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
307
307
  Requires-Dist: vine==5.1.0; extra == "frozen"
308
308
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
309
309
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
310
- Requires-Dist: wcwidth==0.6.0; extra == "frozen"
310
+ Requires-Dist: wcwidth==0.7.0; extra == "frozen"
311
311
  Requires-Dist: websockets==16.0; extra == "frozen"
312
312
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
313
313
  Requires-Dist: wrapt==2.1.2; extra == "frozen"
314
314
  Requires-Dist: yamale==6.1.0; extra == "frozen"
315
315
  Requires-Dist: yarl==1.23.0; extra == "frozen"
316
- Requires-Dist: zarr==3.1.6; extra == "frozen"
316
+ Requires-Dist: zarr==3.2.0; extra == "frozen"
317
317
  Requires-Dist: zipp==3.23.1; extra == "frozen"
318
318
 
319
319
  dkist-processing-dlnirsp
@@ -82,7 +82,7 @@ class DarkCalibration(DlnirspTaskBase, QualityMixin):
82
82
  ],
83
83
  )
84
84
  unused_count = int(no_of_raw_dark_frames - total_dark_frames_used)
85
- self.quality_store_task_type_counts(
85
+ self.quality_write_intermediate_task_type_counts(
86
86
  task_type=TaskName.dark.value,
87
87
  total_frames=no_of_raw_dark_frames,
88
88
  frames_not_used=unused_count,
@@ -2,10 +2,14 @@
2
2
 
3
3
  from abc import ABC
4
4
 
5
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
6
+ from dkist_processing_common.models.metric_code import MetricCode
7
+ from dkist_processing_common.models.quality import TaskCount
5
8
  from dkist_processing_common.tasks import WorkflowTaskBase
6
9
 
7
10
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
8
11
  from dkist_processing_dlnirsp.models.parameters import DlnirspParameters
12
+ from dkist_processing_dlnirsp.models.tags import DlnirspTag
9
13
  from dkist_processing_dlnirsp.tasks.mixin.group_id import GroupIdMixin
10
14
 
11
15
 
@@ -51,3 +55,27 @@ class DlnirspTaskBase(
51
55
  obs_ip_start_time=self.constants.obs_ip_start_time,
52
56
  arm_id=self.constants.arm_id,
53
57
  )
58
+
59
+ def quality_write_intermediate_task_type_counts(
60
+ self, task_type: str, total_frames: int, frames_not_used: int = 0
61
+ ):
62
+ """
63
+ Write intermediate task type data.
64
+
65
+ Parameters
66
+ ----------
67
+ task_type:
68
+ task type as listed in the headers
69
+ total_frames:
70
+ total number of frames supplied of the given task type
71
+ frames_not_used:
72
+ if some frames aren't used, how many
73
+ """
74
+ task_count = TaskCount(
75
+ task_type=task_type,
76
+ total_frames=total_frames,
77
+ frames_not_used=frames_not_used,
78
+ )
79
+ self.write(
80
+ task_count, tags=DlnirspTag.quality(MetricCode.task_types), encoder=basemodel_encoder
81
+ )
@@ -80,7 +80,7 @@ class GeometricCalibration(DlnirspTaskBase, CorrectionsMixin, QualityMixin):
80
80
  tags=[DlnirspTag.linearized_frame(), DlnirspTag.task_solar_gain()],
81
81
  )
82
82
 
83
- self.quality_store_task_type_counts(
83
+ self.quality_write_intermediate_task_type_counts(
84
84
  task_type=TaskName.geometric.value, total_frames=no_of_raw_solar_frames
85
85
  )
86
86
 
@@ -160,7 +160,7 @@ class InstrumentPolarizationCalibration(DlnirspTaskBase, QualityMixin):
160
160
  tags=[DlnirspTag.linearized_frame(), DlnirspTag.task_polcal()],
161
161
  )
162
162
 
163
- self.quality_store_task_type_counts(
163
+ self.quality_write_intermediate_task_type_counts(
164
164
  task_type=TaskName.polcal.value, total_frames=no_of_raw_lamp_frames
165
165
  )
166
166
 
@@ -99,7 +99,7 @@ class LampCalibration(DlnirspTaskBase, QualityMixin):
99
99
  tags=[DlnirspTag.linearized_frame(), DlnirspTag.task_lamp_gain()],
100
100
  )
101
101
 
102
- self.quality_store_task_type_counts(
102
+ self.quality_write_intermediate_task_type_counts(
103
103
  task_type=TaskName.lamp_gain.value, total_frames=no_of_raw_lamp_frames
104
104
  )
105
105
 
@@ -168,7 +168,7 @@ class ScienceCalibration(
168
168
  ],
169
169
  )
170
170
 
171
- self.quality_store_task_type_counts(
171
+ self.quality_write_intermediate_task_type_counts(
172
172
  task_type=TaskName.observe.value, total_frames=no_of_raw_science_frames
173
173
  )
174
174
 
@@ -104,7 +104,7 @@ class SolarCalibration(DlnirspTaskBase, CorrectionsMixin, QualityMixin, GroupIdM
104
104
  tags=[DlnirspTag.linearized_frame(), DlnirspTag.task_solar_gain()],
105
105
  )
106
106
 
107
- self.quality_store_task_type_counts(
107
+ self.quality_write_intermediate_task_type_counts(
108
108
  task_type=TaskName.solar_gain.value, total_frames=no_of_raw_solar_frames
109
109
  )
110
110
 
@@ -1,10 +1,10 @@
1
- import json
2
-
3
1
  import numpy as np
4
2
  import pytest
5
3
  from astropy.io import fits
6
4
  from dkist_data_simulator.spec122 import Spec122Dataset
7
5
  from dkist_processing_common._util.scratch import WorkflowFileSystem
6
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
7
+ from dkist_processing_common.models.quality import TaskCount
8
8
  from dkist_processing_common.models.task_name import TaskName
9
9
 
10
10
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -100,12 +100,11 @@ def test_dark_calibration_task(dark_task, mocker, fake_gql_client):
100
100
  )
101
101
  assert len(unused_dark_list) == 0
102
102
 
103
- quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
104
- assert len(quality_files) == 1
105
- file = quality_files[0]
106
- with file.open() as f:
107
- data = json.load(f)
108
- assert isinstance(data, dict)
109
- assert data["task_type"] == TaskName.dark.value
110
- assert data["total_frames"] == num_frames_per_exp * 4 # For lamp, solar, obs, and unused
111
- assert data["frames_not_used"] == num_frames_per_exp
103
+ task_counts: list[TaskCount] = list(
104
+ task.read(tags=DlnirspTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
105
+ )
106
+ assert isinstance(task_counts, list)
107
+ assert len(task_counts) == 1
108
+ assert task_counts[0].task_type == TaskName.dark.value
109
+ assert task_counts[0].total_frames == num_frames_per_exp * 4 # For lamp, solar, obs, and unused
110
+ assert task_counts[0].frames_not_used == num_frames_per_exp
@@ -1,4 +1,6 @@
1
1
  import pytest
2
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
3
+ from dkist_processing_common.models.quality import TaskCount
2
4
 
3
5
  from dkist_processing_dlnirsp.models.constants import DlnirspConstants
4
6
  from dkist_processing_dlnirsp.models.parameters import DlnirspParameters
@@ -57,3 +59,43 @@ def test_base_parameters_class(dlnirsp_science_task, dummy_arm_id):
57
59
  else:
58
60
  with pytest.raises(AttributeError):
59
61
  task.parameters
62
+
63
+
64
+ @pytest.mark.parametrize(
65
+ "task_type, total_frames, frames_not_used",
66
+ [
67
+ pytest.param("one", 1, 1, id="simple"),
68
+ pytest.param("two", 2, 0, id="not_used_zero"),
69
+ pytest.param("three", 3, None, id="not_used_none"),
70
+ ],
71
+ )
72
+ def test_quality_write_intermediate_task_type_counts(
73
+ task_type: str, total_frames: int, frames_not_used: int | None, dlnirsp_science_task
74
+ ):
75
+ """
76
+ Given: Valid intermediate task type count input
77
+ When: Running DlnirspTaskBase quality_write_intermediate_task_type_counts()
78
+ Then: A single TaskCount file gets created
79
+ """
80
+ # Given
81
+ task = dlnirsp_science_task
82
+
83
+ # When
84
+ if frames_not_used is not None:
85
+ task.quality_write_intermediate_task_type_counts(task_type, total_frames, frames_not_used)
86
+ else:
87
+ task.quality_write_intermediate_task_type_counts(task_type, total_frames)
88
+
89
+ # Then
90
+ task_counts: list[TaskCount] = list(
91
+ task.read(tags="QUALITY_TASK_TYPES", decoder=basemodel_decoder, model=TaskCount)
92
+ )
93
+ assert isinstance(task_counts, list)
94
+ assert len(task_counts) == 1
95
+ task_count = task_counts[0]
96
+ assert task_count.task_type == str(task_type).upper()
97
+ assert task_count.total_frames == total_frames
98
+ if frames_not_used is not None:
99
+ assert task_count.frames_not_used == frames_not_used
100
+ else:
101
+ assert task_count.frames_not_used == 0
@@ -5,8 +5,10 @@ import numpy as np
5
5
  import pytest
6
6
  from dkist_data_simulator.spec122 import Spec122Dataset
7
7
  from dkist_processing_common._util.scratch import WorkflowFileSystem
8
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
8
9
  from dkist_processing_common.codecs.fits import fits_array_decoder
9
10
  from dkist_processing_common.codecs.fits import fits_array_encoder
11
+ from dkist_processing_common.models.quality import TaskCount
10
12
  from dkist_processing_common.models.task_name import TaskName
11
13
 
12
14
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -210,12 +212,11 @@ def test_geometric_task_completes(geometric_task_for_basic_corrections, mocker,
210
212
  dispersion = json.load(f)
211
213
  assert isinstance(dispersion, float)
212
214
 
213
- quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
214
- assert len(quality_files) == 1
215
- file = quality_files[0]
216
- with file.open() as f:
217
- data = json.load(f)
218
- assert isinstance(data, dict)
219
- assert data["task_type"] == TaskName.geometric.value
220
- assert data["total_frames"] == num_solar_frames
221
- assert data["frames_not_used"] == 0
215
+ task_counts: list[TaskCount] = list(
216
+ task.read(tags=DlnirspTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
217
+ )
218
+ assert isinstance(task_counts, list)
219
+ assert len(task_counts) == 1
220
+ assert task_counts[0].task_type == TaskName.geometric.value
221
+ assert task_counts[0].total_frames == num_solar_frames
222
+ assert task_counts[0].frames_not_used == 0
@@ -1,4 +1,3 @@
1
- import json
2
1
  from unittest.mock import ANY
3
2
  from unittest.mock import patch
4
3
 
@@ -9,9 +8,11 @@ from astropy.io import fits
9
8
  from astropy.time import Time
10
9
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
11
10
  from dkist_processing_common._util.scratch import WorkflowFileSystem
11
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
12
12
  from dkist_processing_common.codecs.fits import fits_array_decoder
13
13
  from dkist_processing_common.codecs.fits import fits_array_encoder
14
14
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
15
+ from dkist_processing_common.models.quality import TaskCount
15
16
  from dkist_processing_common.models.task_name import TaskName
16
17
  from dkist_processing_pac.fitter.polcal_fitter import PolcalFitter
17
18
  from dkist_processing_pac.input_data.dresser import Dresser
@@ -605,15 +606,14 @@ def test_instrument_polarization_task(
605
606
  assert len(demod_array) == 1
606
607
  assert demod_array[0].shape == array_shape + (4, 8)
607
608
 
608
- quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
609
- assert len(quality_files) == 1
610
- file = quality_files[0]
611
- with file.open() as f:
612
- data = json.load(f)
613
- assert isinstance(data, dict)
614
- assert data["task_type"] == TaskName.polcal.value
615
- assert data["total_frames"] == num_polcal_frames
616
- assert data["frames_not_used"] == 0
609
+ task_counts: list[TaskCount] = list(
610
+ task.read(tags=DlnirspTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
611
+ )
612
+ assert isinstance(task_counts, list)
613
+ assert len(task_counts) == 1
614
+ assert task_counts[0].task_type == TaskName.polcal.value
615
+ assert task_counts[0].total_frames == num_polcal_frames
616
+ assert task_counts[0].frames_not_used == 0
617
617
 
618
618
  for label, skip_constants in zip(polcal_quality_beam_labels, polcal_quality_skip_constants):
619
619
  quality_metric_mocker.assert_any_call(
@@ -1,10 +1,10 @@
1
- import json
2
-
3
1
  import numpy as np
4
2
  import pytest
5
3
  from astropy.io import fits
6
4
  from dkist_data_simulator.spec122 import Spec122Dataset
7
5
  from dkist_processing_common._util.scratch import WorkflowFileSystem
6
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
7
+ from dkist_processing_common.models.quality import TaskCount
8
8
  from dkist_processing_common.models.task_name import TaskName
9
9
 
10
10
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -118,12 +118,11 @@ def test_lamp_calibration_task(lamp_task, lamp_signal, mocker, fake_gql_client):
118
118
  with fits.open(file_list[0], memmap=False) as data:
119
119
  assert np.allclose(data[0].data, lamp_signal)
120
120
 
121
- quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
122
- assert len(quality_files) == 1
123
- file = quality_files[0]
124
- with file.open() as f:
125
- data = json.load(f)
126
- assert isinstance(data, dict)
127
- assert data["task_type"] == TaskName.lamp_gain.value
128
- assert data["total_frames"] == num_lamp_frames
129
- assert data["frames_not_used"] == 0
121
+ task_counts: list[TaskCount] = list(
122
+ task.read(tags=DlnirspTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
123
+ )
124
+ assert isinstance(task_counts, list)
125
+ assert len(task_counts) == 1
126
+ assert task_counts[0].task_type == TaskName.lamp_gain.value
127
+ assert task_counts[0].total_frames == num_lamp_frames
128
+ assert task_counts[0].frames_not_used == 0
@@ -1,5 +1,3 @@
1
- import json
2
-
3
1
  import numpy as np
4
2
  import pytest
5
3
  from astropy.convolution import Gaussian2DKernel
@@ -9,7 +7,9 @@ from astropy.time import TimeDelta
9
7
  from dkist_data_simulator.spec122 import Spec122Dataset
10
8
  from dkist_header_validator.translator import translate_spec122_to_spec214_l0
11
9
  from dkist_processing_common._util.scratch import WorkflowFileSystem
10
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
12
11
  from dkist_processing_common.codecs.fits import fits_array_encoder
12
+ from dkist_processing_common.models.quality import TaskCount
13
13
  from dkist_processing_common.models.task_name import TaskName
14
14
 
15
15
  from dkist_processing_dlnirsp.models.fits_access import DlnirspMetadataKey
@@ -470,15 +470,14 @@ def test_science_task_completes(science_task_with_data, is_polarimetric, mocker,
470
470
  assert bad_pixel_cube.dtype is np.dtype("int8")
471
471
  np.testing.assert_equal(np.unique(bad_pixel_cube), np.array([0, 1]))
472
472
 
473
- quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
474
- assert len(quality_files) == 1
475
- file = quality_files[0]
476
- with file.open() as f:
477
- data = json.load(f)
478
- assert isinstance(data, dict)
479
- assert data["task_type"] == TaskName.observe.value
480
- assert data["total_frames"] == num_observe_frames
481
- assert data["frames_not_used"] == 0
473
+ task_counts: list[TaskCount] = list(
474
+ task.read(tags=DlnirspTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
475
+ )
476
+ assert isinstance(task_counts, list)
477
+ assert len(task_counts) == 1
478
+ assert task_counts[0].task_type == TaskName.observe.value
479
+ assert task_counts[0].total_frames == num_observe_frames
480
+ assert task_counts[0].frames_not_used == 0
482
481
 
483
482
 
484
483
  @pytest.mark.parametrize("is_polarimetric", [pytest.param(True, id="polarimetric")])
@@ -1,11 +1,11 @@
1
- import json
2
-
3
1
  import numpy as np
4
2
  import pytest
5
3
  from dkist_data_simulator.spec122 import Spec122Dataset
6
4
  from dkist_processing_common._util.scratch import WorkflowFileSystem
5
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
7
6
  from dkist_processing_common.codecs.fits import fits_array_decoder
8
7
  from dkist_processing_common.codecs.fits import fits_array_encoder
8
+ from dkist_processing_common.models.quality import TaskCount
9
9
  from dkist_processing_common.models.task_name import TaskName
10
10
 
11
11
  from dkist_processing_dlnirsp.models.tags import DlnirspTag
@@ -450,12 +450,11 @@ def test_solar_task_completes(
450
450
  if not is_polarimetric:
451
451
  assert task.count(tags=tags + [DlnirspTag.stokes("I")]) == 0
452
452
 
453
- quality_files = list(task.read(tags=[DlnirspTag.quality("TASK_TYPES")]))
454
- assert len(quality_files) == 1
455
- file = quality_files[0]
456
- with file.open() as f:
457
- data = json.load(f)
458
- assert isinstance(data, dict)
459
- assert data["task_type"] == TaskName.solar_gain.value
460
- assert data["total_frames"] == num_solar_frames
461
- assert data["frames_not_used"] == 0
453
+ task_counts: list[TaskCount] = list(
454
+ task.read(tags=DlnirspTag.quality("TASK_TYPES"), decoder=basemodel_decoder, model=TaskCount)
455
+ )
456
+ assert isinstance(task_counts, list)
457
+ assert len(task_counts) == 1
458
+ assert task_counts[0].task_type == TaskName.solar_gain.value
459
+ assert task_counts[0].total_frames == num_solar_frames
460
+ assert task_counts[0].frames_not_used == 0