dkist-processing-visp 5.3.0rc6__tar.gz → 5.3.1__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 (113) hide show
  1. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/.readthedocs.yml +1 -1
  2. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/CHANGELOG.rst +22 -0
  3. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/PKG-INFO +15 -15
  4. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/constants.py +6 -3
  5. dkist_processing_visp-5.3.1/dkist_processing_visp/parsers/modulator_states.py +83 -0
  6. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/raster_step.py +11 -16
  7. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/spectrograph_configuration.py +6 -9
  8. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/time.py +11 -16
  9. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/dark.py +1 -1
  10. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/README.rst +1 -1
  11. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/conftest.py +1 -1
  12. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_dark.py +1 -1
  13. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_parse.py +25 -3
  14. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp.egg-info/PKG-INFO +15 -15
  15. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp.egg-info/SOURCES.txt +0 -1
  16. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp.egg-info/requires.txt +14 -14
  17. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/pyproject.toml +16 -16
  18. dkist_processing_visp-5.3.0rc6/changelog/261.misc.rst +0 -1
  19. dkist_processing_visp-5.3.0rc6/dkist_processing_visp/parsers/modulator_states.py +0 -86
  20. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/.gitignore +0 -0
  21. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/.pre-commit-config.yaml +0 -0
  22. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/.snyk +0 -0
  23. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/README.rst +0 -0
  24. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/SCIENCE_CHANGELOG.rst +0 -0
  25. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/bitbucket-pipelines.yml +0 -0
  26. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/changelog/.gitempty +0 -0
  27. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/__init__.py +0 -0
  28. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/config.py +0 -0
  29. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/fonts/Lato-Regular.ttf +0 -0
  30. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/__init__.py +0 -0
  31. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/fits_access.py +0 -0
  32. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/metric_code.py +0 -0
  33. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/parameters.py +0 -0
  34. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/tags.py +0 -0
  35. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/models/task_name.py +0 -0
  36. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/__init__.py +0 -0
  37. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/map_repeats.py +0 -0
  38. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/polarimeter_mode.py +0 -0
  39. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/visp_l0_fits_access.py +0 -0
  40. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/parsers/visp_l1_fits_access.py +0 -0
  41. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/__init__.py +0 -0
  42. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/assemble_movie.py +0 -0
  43. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/background_light.py +0 -0
  44. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/geometric.py +0 -0
  45. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/instrument_polarization.py +0 -0
  46. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/l1_output_data.py +0 -0
  47. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/lamp.py +0 -0
  48. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/make_movie_frames.py +0 -0
  49. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/mixin/__init__.py +0 -0
  50. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/mixin/beam_access.py +0 -0
  51. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/mixin/corrections.py +0 -0
  52. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/mixin/downsample.py +0 -0
  53. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/parse.py +0 -0
  54. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/quality_metrics.py +0 -0
  55. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/science.py +0 -0
  56. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/solar.py +0 -0
  57. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/visp_base.py +0 -0
  58. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/wavelength_calibration.py +0 -0
  59. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tasks/write_l1.py +0 -0
  60. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/__init__.py +0 -0
  61. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/header_models.py +0 -0
  62. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/local_trial_workflows/__init__.py +0 -0
  63. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/local_trial_workflows/l0_cals_only.py +0 -0
  64. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/local_trial_workflows/l0_polcals_as_science.py +0 -0
  65. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/local_trial_workflows/l0_solar_gain_as_science.py +0 -0
  66. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/local_trial_workflows/l0_to_l1.py +0 -0
  67. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/local_trial_workflows/local_trial_helpers.py +0 -0
  68. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_assemble_movie.py +0 -0
  69. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_assemble_quality.py +0 -0
  70. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_background_light.py +0 -0
  71. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_downsample.py +0 -0
  72. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_fits_access.py +0 -0
  73. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_geometric.py +0 -0
  74. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_instrument_polarization.py +0 -0
  75. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_lamp.py +0 -0
  76. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_make_movie_frames.py +0 -0
  77. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_map_repeats.py +0 -0
  78. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_parameters.py +0 -0
  79. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_quality.py +0 -0
  80. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_science.py +0 -0
  81. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_solar.py +0 -0
  82. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_trial_create_quality_report.py +0 -0
  83. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_visp_constants.py +0 -0
  84. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_wavelength_calibration.py +0 -0
  85. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_workflows.py +0 -0
  86. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/tests/test_write_l1.py +0 -0
  87. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/workflows/__init__.py +0 -0
  88. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/workflows/l0_processing.py +0 -0
  89. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/workflows/single_task_workflows.py +0 -0
  90. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp/workflows/trial_workflows.py +0 -0
  91. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp.egg-info/dependency_links.txt +0 -0
  92. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/dkist_processing_visp.egg-info/top_level.txt +0 -0
  93. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/Makefile +0 -0
  94. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/background_light.rst +0 -0
  95. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/changelog.rst +0 -0
  96. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/conf.py +0 -0
  97. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/gain_correction.rst +0 -0
  98. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/geometric.rst +0 -0
  99. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/index.rst +0 -0
  100. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/l0_to_l1_visp.rst +0 -0
  101. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/l0_to_l1_visp_full-trial.rst +0 -0
  102. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/landing_page.rst +0 -0
  103. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/make.bat +0 -0
  104. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/polarization_calibration.rst +0 -0
  105. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/requirements.txt +0 -0
  106. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/requirements_table.rst +0 -0
  107. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/science_calibration.rst +0 -0
  108. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/scientific_changelog.rst +0 -0
  109. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/docs/wavelength_calibration.rst +0 -0
  110. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/licenses/LICENSE.rst +0 -0
  111. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/science_towncrier.sh +0 -0
  112. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/setup.cfg +0 -0
  113. {dkist_processing_visp-5.3.0rc6 → dkist_processing_visp-5.3.1}/towncrier_science.toml +0 -0
@@ -2,7 +2,7 @@ version: 2
2
2
  build:
3
3
  os: ubuntu-20.04
4
4
  tools:
5
- python: "3.12"
5
+ python: "3.13"
6
6
  apt_packages:
7
7
  - libopenjp2-7
8
8
  - graphviz
@@ -1,3 +1,25 @@
1
+ v5.3.1 (2026-01-26)
2
+ ===================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Update name of `non_dark_or_polcal_readout_exp_times` constant to more accurately reflect what it is. This changed when
8
+ we stopped using DARK and GAIN task type frames to correct POLCAL data. (`#265 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/265>`__)
9
+ - Use new base `Stems` in `dkist-processing-common` to speed up custom ViSP `Stems`. `TotalRasterStepsBud`, `ReflectedLightAngleBud`,
10
+ and `NonDarkNonPolcalTaskReadoutExpTimesBud` are now based on `SetStem`, and `DarkReadoutExpTimesPickyBud` is based on `ListStem`. (`#265 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/265>`__)
11
+ - Update `dkist-processing-common` to v12.1.0 to take advantage of big speedups in the Parse task. (`#265 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/265>`__)
12
+
13
+
14
+ v5.3.0 (2026-01-22)
15
+ ===================
16
+
17
+ Misc
18
+ ----
19
+
20
+ - Upgrade to use Airflow 3 and a minimum python version of 3.13. (`#261 <https://bitbucket.org/dkistdc/dkist-processing-visp/pull-requests/261>`__)
21
+
22
+
1
23
  v5.2.5 (2026-01-09)
2
24
  ===================
3
25
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.3.0rc6
3
+ Version: 5.3.1
4
4
  Summary: Science processing code for the ViSP 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==12.0.0rc7
16
+ Requires-Dist: dkist-processing-common==12.1.0
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.2.1
@@ -84,7 +84,7 @@ Requires-Dist: aioftp==0.27.2; extra == "frozen"
84
84
  Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
85
85
  Requires-Dist: aiohttp==3.13.3; extra == "frozen"
86
86
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
87
- Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
87
+ Requires-Dist: aiosmtplib==5.1.0; extra == "frozen"
88
88
  Requires-Dist: aiosqlite==0.21.0; extra == "frozen"
89
89
  Requires-Dist: alembic==1.18.1; extra == "frozen"
90
90
  Requires-Dist: amqp==5.3.1; extra == "frozen"
@@ -107,13 +107,13 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
107
107
  Requires-Dist: asgiref==3.11.0; 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.1.19.0.42.31; extra == "frozen"
110
+ Requires-Dist: astropy-iers-data==0.2026.1.26.0.43.56; extra == "frozen"
111
111
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
112
112
  Requires-Dist: attrs==25.4.0; extra == "frozen"
113
113
  Requires-Dist: babel==2.17.0; extra == "frozen"
114
114
  Requires-Dist: billiard==4.2.4; extra == "frozen"
115
- Requires-Dist: boto3==1.42.32; extra == "frozen"
116
- Requires-Dist: botocore==1.42.32; extra == "frozen"
115
+ Requires-Dist: boto3==1.42.34; extra == "frozen"
116
+ Requires-Dist: botocore==1.42.34; extra == "frozen"
117
117
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
118
118
  Requires-Dist: celery==5.6.2; extra == "frozen"
119
119
  Requires-Dist: certifi==2026.1.4; extra == "frozen"
@@ -133,11 +133,11 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
133
133
  Requires-Dist: decorator==5.2.1; extra == "frozen"
134
134
  Requires-Dist: dill==0.4.1; extra == "frozen"
135
135
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
136
- Requires-Dist: dkist-processing-common==12.0.0rc7; extra == "frozen"
137
- Requires-Dist: dkist-processing-core==7.0.0rc9; extra == "frozen"
136
+ Requires-Dist: dkist-processing-common==12.1.0; extra == "frozen"
137
+ Requires-Dist: dkist-processing-core==7.0.1; extra == "frozen"
138
138
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
139
139
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
140
- Requires-Dist: dkist-processing-visp==5.3.0rc6; extra == "frozen"
140
+ Requires-Dist: dkist-processing-visp==5.3.1; extra == "frozen"
141
141
  Requires-Dist: dkist-service-configuration==4.2.0; extra == "frozen"
142
142
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
143
143
  Requires-Dist: dkist_fits_specifications==4.20.0; extra == "frozen"
@@ -154,7 +154,7 @@ Requires-Dist: globus-sdk==4.3.1; extra == "frozen"
154
154
  Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
155
155
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
156
156
  Requires-Dist: greenback==1.3.0; extra == "frozen"
157
- Requires-Dist: greenlet==3.3.0; extra == "frozen"
157
+ Requires-Dist: greenlet==3.3.1; extra == "frozen"
158
158
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
159
159
  Requires-Dist: h11==0.16.0; extra == "frozen"
160
160
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
@@ -186,7 +186,7 @@ Requires-Dist: methodtools==0.4.7; extra == "frozen"
186
186
  Requires-Dist: more-itertools==10.8.0; extra == "frozen"
187
187
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
188
188
  Requires-Dist: msgspec==0.20.0; extra == "frozen"
189
- Requires-Dist: multidict==6.7.0; extra == "frozen"
189
+ Requires-Dist: multidict==6.7.1; extra == "frozen"
190
190
  Requires-Dist: natsort==8.4.0; extra == "frozen"
191
191
  Requires-Dist: nbformat==5.10.4; extra == "frozen"
192
192
  Requires-Dist: networkx==3.6.1; extra == "frozen"
@@ -219,7 +219,7 @@ Requires-Dist: opentelemetry-util-http==0.60b1; extra == "frozen"
219
219
  Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
220
220
  Requires-Dist: packaging==26.0; extra == "frozen"
221
221
  Requires-Dist: pandas==3.0.0; extra == "frozen"
222
- Requires-Dist: parfive==2.2.0; extra == "frozen"
222
+ Requires-Dist: parfive==2.3.0; extra == "frozen"
223
223
  Requires-Dist: pathspec==1.0.3; extra == "frozen"
224
224
  Requires-Dist: pendulum==3.1.0; extra == "frozen"
225
225
  Requires-Dist: pika==1.3.2; extra == "frozen"
@@ -245,13 +245,13 @@ Requires-Dist: pyparsing==3.3.2; extra == "frozen"
245
245
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
246
246
  Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
247
247
  Requires-Dist: python-dotenv==1.2.1; extra == "frozen"
248
- Requires-Dist: python-multipart==0.0.21; extra == "frozen"
248
+ Requires-Dist: python-multipart==0.0.22; extra == "frozen"
249
249
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
250
250
  Requires-Dist: pytz==2025.2; extra == "frozen"
251
251
  Requires-Dist: redis==6.4.0; extra == "frozen"
252
252
  Requires-Dist: referencing==0.37.0; extra == "frozen"
253
253
  Requires-Dist: requests==2.32.5; extra == "frozen"
254
- Requires-Dist: rich==14.2.0; extra == "frozen"
254
+ Requires-Dist: rich==14.3.1; extra == "frozen"
255
255
  Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
256
256
  Requires-Dist: rich-toolkit==0.17.1; extra == "frozen"
257
257
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
@@ -296,7 +296,7 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
296
296
  Requires-Dist: vine==5.1.0; extra == "frozen"
297
297
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
298
298
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
299
- Requires-Dist: wcwidth==0.3.0; extra == "frozen"
299
+ Requires-Dist: wcwidth==0.4.0; extra == "frozen"
300
300
  Requires-Dist: websockets==16.0; extra == "frozen"
301
301
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
302
302
  Requires-Dist: wrapt==1.17.3; extra == "frozen"
@@ -23,7 +23,7 @@ class VispBudName(Enum):
23
23
  observe_readout_exp_times = "OBSERVE_READOUT_EXP_TIMES"
24
24
  polcal_exposure_times = "POLCAL_EXPOSURE_TIMES"
25
25
  polcal_readout_exp_times = "POLCAL_READOUT_EXP_TIMES"
26
- non_dark_task_readout_exp_times = "NON_DARK_TASK_READOUT_EXP_TIMES"
26
+ non_dark_or_polcal_readout_exp_times = "NON_DARK_OR_POLCAL_READOUT_EXP_TIMES"
27
27
  num_map_scans = "NUM_MAP_SCANS"
28
28
  incident_light_angle_deg = "INCIDENT_LIGHT_ANGLE_DEG"
29
29
  reflected_light_angle_deg = "REFLECTED_LIGHT_ANGLE_DEG"
@@ -134,14 +134,17 @@ class VispConstants(ConstantsBase):
134
134
  return []
135
135
 
136
136
  @property
137
- def non_dark_task_readout_exp_times(self) -> list[float]:
137
+ def non_dark_or_polcal_readout_exp_times(self) -> list[float]:
138
138
  """
139
139
  Find all readout exposure times that *need* to exist in a dark IP.
140
140
 
141
141
  Every non-dark task needs to be corrected with an average dark frame of the same readout exp time, which means
142
142
  we need DARK IP task frames for all of these readout exposure times.
143
+
144
+ We don't care about the readout exposure time of the POLCAL frames because they do their own dark correction from
145
+ the polcal Calibration Sequence.
143
146
  """
144
- return self._db_dict[VispBudName.non_dark_task_readout_exp_times.value]
147
+ return self._db_dict[VispBudName.non_dark_or_polcal_readout_exp_times.value]
145
148
 
146
149
  @property
147
150
  def observe_readout_exp_times(self) -> list[float]:
@@ -0,0 +1,83 @@
1
+ """ViSP modulator state parser."""
2
+
3
+ from dkist_processing_common.models.constants import BudName
4
+ from dkist_processing_common.models.tags import StemName
5
+ from dkist_processing_common.parsers.single_value_single_key_flower import (
6
+ SingleValueSingleKeyFlower,
7
+ )
8
+ from dkist_processing_common.parsers.unique_bud import UniqueBud
9
+
10
+ from dkist_processing_visp.models.fits_access import VispMetadataKey
11
+ from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
12
+
13
+
14
+ class ObserveFrameError(BaseException):
15
+ """Error raised when no observe frames are identified by polarization mode."""
16
+
17
+ pass
18
+
19
+
20
+ class NumberModulatorStatesBud(UniqueBud):
21
+ """Bud to check the number of modulator states."""
22
+
23
+ def __init__(self):
24
+ super().__init__(
25
+ constant_name=BudName.num_modstates.value,
26
+ metadata_key=VispMetadataKey.number_of_modulator_states,
27
+ )
28
+ self.polarimeter_mode_set = set()
29
+
30
+ def setter(self, fits_obj: VispL0FitsAccess) -> int:
31
+ """
32
+ Set the value of the bud.
33
+
34
+ Parameters
35
+ ----------
36
+ fits_obj:
37
+ A single FitsAccess object
38
+ """
39
+ pol_mode = getattr(fits_obj, VispMetadataKey.polarimeter_mode.name)
40
+ self.polarimeter_mode_set.add(pol_mode)
41
+ return super().setter(fits_obj)
42
+
43
+ def getter(self):
44
+ """Get the value of the bud, checking for restrictions on polarimetric observe data."""
45
+ if "observe_intensity" in self.polarimeter_mode_set:
46
+ return 1
47
+
48
+ # Polarimetric data must have the same number of modulator states in all frames
49
+ if "observe_polarimetric" in self.polarimeter_mode_set:
50
+ return super().getter()
51
+
52
+ raise ObserveFrameError(
53
+ "No valid observe frames types were found in the headers of the data. Check the input data."
54
+ )
55
+
56
+
57
+ class ModulatorStateFlower(SingleValueSingleKeyFlower):
58
+ """Flower to find the ip task type."""
59
+
60
+ def __init__(self):
61
+ super().__init__(
62
+ tag_stem_name=StemName.modstate.value, metadata_key=VispMetadataKey.modulator_state
63
+ )
64
+ self.polarimeter_mode_set = set()
65
+
66
+ def setter(self, fits_obj: VispL0FitsAccess) -> int:
67
+ """
68
+ Set value of the flower.
69
+
70
+ Parameters
71
+ ----------
72
+ fits_obj:
73
+ A single FitsAccess object
74
+ """
75
+ pol_mode = getattr(fits_obj, VispMetadataKey.polarimeter_mode.name)
76
+ self.polarimeter_mode_set.add(pol_mode)
77
+ return super().setter(fits_obj)
78
+
79
+ def getter(self, key: str) -> int:
80
+ """Return the modulator state given in the header of each file unless it is in intensity mode - then return modulator state = 1 for everything."""
81
+ if "observe_intensity" in self.polarimeter_mode_set:
82
+ return 1
83
+ return super().getter(key)
@@ -2,8 +2,8 @@
2
2
 
3
3
  from typing import Type
4
4
 
5
+ from dkist_processing_common.models.flower_pot import SetStem
5
6
  from dkist_processing_common.models.flower_pot import SpilledDirt
6
- from dkist_processing_common.models.flower_pot import Stem
7
7
  from dkist_processing_common.models.task_name import TaskName
8
8
  from dkist_processing_common.parsers.single_value_single_key_flower import (
9
9
  SingleValueSingleKeyFlower,
@@ -15,14 +15,12 @@ from dkist_processing_visp.models.tags import VispStemName
15
15
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
16
16
 
17
17
 
18
- class TotalRasterStepsBud(Stem):
18
+ class TotalRasterStepsBud(SetStem):
19
19
  """Bud for finding the total number of raster steps."""
20
20
 
21
21
  def __init__(self):
22
22
  super().__init__(stem_name=VispBudName.num_raster_steps.value)
23
-
24
- self.total_num_key = "total_raster_steps"
25
- self.single_step_key = "raster_scan_step"
23
+ self.num_steps_set = set()
26
24
 
27
25
  def setter(self, fits_obj: VispL0FitsAccess) -> Type[SpilledDirt] | tuple[int, int]:
28
26
  """
@@ -36,29 +34,26 @@ class TotalRasterStepsBud(Stem):
36
34
  if fits_obj.ip_task_type.casefold() != TaskName.observe.value.casefold():
37
35
  return SpilledDirt
38
36
 
39
- num_raster = getattr(fits_obj, self.total_num_key)
40
- single_step = getattr(fits_obj, self.single_step_key)
37
+ num_raster = getattr(fits_obj, VispMetadataKey.total_raster_steps.name)
38
+ self.num_steps_set.add(num_raster)
39
+ single_step = getattr(fits_obj, VispMetadataKey.raster_scan_step.name)
41
40
 
42
- return num_raster, single_step
41
+ return single_step
43
42
 
44
- def getter(self, key) -> str | float | int:
43
+ def getter(self) -> int:
45
44
  """
46
45
  Getter and check for bud.
47
46
 
48
47
  Return value if only a single value was found in dataset. Error if multiple values were found or if the actual
49
48
  raster steps found do not form a complete set based on the number-of-raster-steps header key.
50
49
  """
51
- values = self.key_to_petal_dict.values()
52
- num_steps_set = set([v[0] for v in values])
53
-
54
- # This is copied from UniqueBud because we still want to check this
55
- if len(num_steps_set) > 1:
50
+ if len(self.num_steps_set) > 1:
56
51
  raise ValueError(
57
- f"Multiple {self.stem_name} values found for key {key}. Values: {num_steps_set}"
52
+ f"Found multiple values for total number of raster steps. Values: {self.num_steps_set}"
58
53
  )
59
54
 
60
55
  # Now check that all the steps we expect are present
61
- all_steps = sorted(list(set([v[1] for v in values])))
56
+ all_steps = sorted(self.value_set)
62
57
  if all_steps != list(range(0, max(all_steps) + 1)):
63
58
  raise ValueError(f"Not all sequential steps could be found. Found {all_steps}")
64
59
 
@@ -1,7 +1,7 @@
1
1
  """Buds for parsing the incident and reflected light angles of the ViSP spectrograph."""
2
2
 
3
+ from dkist_processing_common.models.flower_pot import SetStem
3
4
  from dkist_processing_common.models.flower_pot import SpilledDirt
4
- from dkist_processing_common.models.flower_pot import Stem
5
5
  from dkist_processing_common.models.task_name import TaskName
6
6
  from dkist_processing_common.parsers.task import parse_header_ip_task_with_gains
7
7
  from dkist_processing_common.parsers.unique_bud import TaskUniqueBud
@@ -37,11 +37,9 @@ class IncidentLightAngleBud(TaskUniqueBud):
37
37
  return convert_grating_angle_to_incident_light_angle(grating_angle)
38
38
 
39
39
 
40
- class ReflectedLightAngleBud(Stem):
40
+ class ReflectedLightAngleBud(SetStem):
41
41
  """Bud that combines the incident light angle and arm position header values to compute the reflected light angle."""
42
42
 
43
- key_to_petal_dict: dict[str, float]
44
-
45
43
  def __init__(self):
46
44
  super().__init__(stem_name=VispBudName.reflected_light_angle_deg.value)
47
45
  self.ip_task_types = [
@@ -65,11 +63,10 @@ class ReflectedLightAngleBud(Stem):
65
63
 
66
64
  return SpilledDirt
67
65
 
68
- def getter(self, key: str) -> float:
66
+ def getter(self) -> float:
69
67
  """Get the value for the reflected light angle and raise an error if it is not unique."""
70
- value_set = set(self.key_to_petal_dict.values())
71
- if len(value_set) > 1:
68
+ if len(self.value_set) > 1:
72
69
  raise ValueError(
73
- f"Multiple {self.stem_name} values found for key {key}. Values: {value_set}"
70
+ f"Multiple {self.stem_name} values found for key. Values: {self.value_set}"
74
71
  )
75
- return value_set.pop()
72
+ return self.value_set.pop()
@@ -1,11 +1,12 @@
1
1
  """Stems for parsing constants and tags related to time header keys."""
2
2
 
3
- from pathlib import Path
4
3
  from typing import NamedTuple
4
+ from typing import Type
5
5
 
6
6
  from dkist_processing_common.models.fits_access import MetadataKey
7
+ from dkist_processing_common.models.flower_pot import ListStem
8
+ from dkist_processing_common.models.flower_pot import SetStem
7
9
  from dkist_processing_common.models.flower_pot import SpilledDirt
8
- from dkist_processing_common.models.flower_pot import Stem
9
10
  from dkist_processing_common.models.flower_pot import Thorn
10
11
  from dkist_processing_common.models.tags import EXP_TIME_ROUND_DIGITS
11
12
  from dkist_processing_common.models.task_name import TaskName
@@ -14,14 +15,14 @@ from dkist_processing_visp.models.constants import VispBudName
14
15
  from dkist_processing_visp.parsers.visp_l0_fits_access import VispL0FitsAccess
15
16
 
16
17
 
17
- class NonDarkNonPolcalTaskReadoutExpTimesBud(Stem):
18
+ class NonDarkNonPolcalTaskReadoutExpTimesBud(SetStem):
18
19
  """Produce a tuple of all exposure times present in the dataset for ip task types that are not DARK or POLCAL."""
19
20
 
20
21
  def __init__(self):
21
- super().__init__(stem_name=VispBudName.non_dark_task_readout_exp_times.value)
22
+ super().__init__(stem_name=VispBudName.non_dark_or_polcal_readout_exp_times.value)
22
23
  self.metadata_key = MetadataKey.sensor_readout_exposure_time_ms.name
23
24
 
24
- def setter(self, fits_obj: VispL0FitsAccess) -> float | SpilledDirt:
25
+ def setter(self, fits_obj: VispL0FitsAccess) -> float | Type[SpilledDirt]:
25
26
  """
26
27
  Set the task exposure time for this fits object.
27
28
 
@@ -41,20 +42,15 @@ class NonDarkNonPolcalTaskReadoutExpTimesBud(Stem):
41
42
 
42
43
  return SpilledDirt
43
44
 
44
- def getter(self, key: str | Path) -> (float, ...):
45
+ def getter(self) -> tuple[float, ...]:
45
46
  """
46
47
  Get the list of exposure times.
47
48
 
48
- Parameters
49
- ----------
50
- key
51
- The input key
52
-
53
49
  Returns
54
50
  -------
55
51
  A tuple of exposure times
56
52
  """
57
- exposure_times = tuple(sorted(set(self.key_to_petal_dict.values())))
53
+ exposure_times = tuple(sorted(self.value_set))
58
54
  return exposure_times
59
55
 
60
56
 
@@ -66,11 +62,10 @@ class ReadoutExposureTimeContainer(NamedTuple):
66
62
  readout_exposure_time: float
67
63
 
68
64
 
69
- class DarkReadoutExpTimePickyBud(Stem):
65
+ class DarkReadoutExpTimePickyBud(ListStem):
70
66
  """Parse exposure times to ensure existence of the necessary DARK exposure times."""
71
67
 
72
68
  ReadoutExposureTime: ReadoutExposureTimeContainer = ReadoutExposureTimeContainer
73
- key_to_petal_dict: dict[str | Path, ReadoutExposureTimeContainer] # For type hinting
74
69
 
75
70
  def __init__(self):
76
71
  super().__init__(stem_name=VispBudName.dark_readout_exp_time_picky_bud.value)
@@ -97,7 +92,7 @@ class DarkReadoutExpTimePickyBud(Stem):
97
92
  is_dark=is_dark, is_polcal=is_polcal, readout_exposure_time=exposure_time
98
93
  )
99
94
 
100
- def getter(self, key: str | Path) -> Thorn:
95
+ def getter(self) -> Type[Thorn]:
101
96
  """
102
97
  Parse all exposure times and raise an error if any non-dark exposure time is missing from the set of dark exposure times.
103
98
 
@@ -110,7 +105,7 @@ class DarkReadoutExpTimePickyBud(Stem):
110
105
  -------
111
106
  Thorn
112
107
  """
113
- readout_exp_tuples = list(self.key_to_petal_dict.values())
108
+ readout_exp_tuples = self.value_list
114
109
 
115
110
  dark_readout_exp_times = {
116
111
  exp_time.readout_exposure_time for exp_time in readout_exp_tuples if exp_time.is_dark
@@ -47,7 +47,7 @@ class DarkCalibration(VispTaskBase, BeamAccessMixin, QualityMixin):
47
47
  None
48
48
 
49
49
  """
50
- required_readout_exp_times = list(self.constants.non_dark_task_readout_exp_times)
50
+ required_readout_exp_times = list(self.constants.non_dark_or_polcal_readout_exp_times)
51
51
  logger.info(f"{required_readout_exp_times = }")
52
52
 
53
53
  with self.telemetry_span(
@@ -254,7 +254,7 @@ Here is a set of example tests showing usage of all the patterns discussed above
254
254
  task = dark_calibration_task
255
255
 
256
256
  # This test needs some unique constants
257
- init_visp_constants_db(task.recipe_run_id, VispConstantsDb(NON_DARK_TASK_READOUT_EXP_TIMES=(10.,)))
257
+ init_visp_constants_db(task.recipe_run_id, VispConstantsDb(NON_DARK_OR_POLCAL_READOUT_EXP_TIMES=(10.,)))
258
258
 
259
259
  assert True
260
260
 
@@ -63,7 +63,7 @@ class VispConstantsDb:
63
63
  MAXIMUM_CADENCE: float = 10.0
64
64
  VARIANCE_CADENCE: float = 0.0
65
65
  WAVELENGTH: float = 588.0
66
- NON_DARK_TASK_READOUT_EXP_TIMES: tuple[float, ...] = (200.0, 2.0, 0.02)
66
+ NON_DARK_OR_POLCAL_READOUT_EXP_TIMES: tuple[float, ...] = (200.0, 2.0, 0.02)
67
67
  LAMP_EXPOSURE_TIMES: tuple[float] = (100.0,)
68
68
  SOLAR_EXPOSURE_TIMES: tuple[float] = (1.0,)
69
69
  OBSERVE_EXPOSURE_TIMES: tuple[float] = (0.01,)
@@ -70,7 +70,7 @@ def write_darks_to_task(
70
70
  def dark_calibration_task(tmp_path, init_visp_constants_db, recipe_run_id):
71
71
  readout_exp_times = [0.02, 2.0, 200.0]
72
72
  constants_db = VispConstantsDb(
73
- NON_DARK_TASK_READOUT_EXP_TIMES=tuple(readout_exp_times),
73
+ NON_DARK_OR_POLCAL_READOUT_EXP_TIMES=tuple(readout_exp_times),
74
74
  )
75
75
  init_visp_constants_db(recipe_run_id, constants_db)
76
76
  with DarkCalibration(
@@ -394,12 +394,13 @@ def test_parse_visp_input_data(
394
394
  )
395
395
  task = parse_task_with_no_data
396
396
  write_input_cal_frames_to_task(task)
397
+ num_steps = 3
397
398
  for obs_readout_exp_time, obs_exp_time in zip(observe_readout_exp_times, observe_exp_times):
398
399
  write_input_observe_frames_to_task(
399
400
  task,
400
401
  num_maps=1,
401
402
  num_modstates=num_modstates,
402
- num_steps=3,
403
+ num_steps=num_steps,
403
404
  readout_exp_time=obs_readout_exp_time,
404
405
  exp_time=obs_exp_time,
405
406
  arm_id=testing_arm_id,
@@ -421,10 +422,24 @@ def test_parse_visp_input_data(
421
422
  assert (
422
423
  len(list(task.read(tags=[Tag.input(), Tag.task_polcal()]))) == 6
423
424
  ) # 2 polcal observes, 2 darks, 2 gains
424
- assert list(task.read(tags=[Tag.input(), Tag.task_observe()]))
425
425
  assert len(list(task.read(tags=[Tag.input(), Tag.task_polcal_dark()]))) == 2 # 2 polcal darks
426
426
  assert len(list(task.read(tags=[Tag.input(), Tag.task_polcal_gain()]))) == 2 # 2 polcal gains
427
427
 
428
+ for m in range(1, num_modstates + 1):
429
+ for s in range(num_steps):
430
+ assert len(
431
+ list(
432
+ task.read(
433
+ tags=[
434
+ Tag.input(),
435
+ Tag.task_observe(),
436
+ VispTag.modstate(m),
437
+ VispTag.raster_step(s),
438
+ ]
439
+ )
440
+ )
441
+ ) == len(observe_exp_times)
442
+
428
443
 
429
444
  def test_parse_visp_input_data_constants(
430
445
  parse_task_with_no_data,
@@ -515,6 +530,13 @@ def test_parse_visp_input_data_constants(
515
530
  assert task.constants._db_dict["SOLAR_GAIN_GOS_LEVEL3_STATUS"] == "clear"
516
531
  assert task.constants._db_dict["SOLAR_GAIN_NUM_RAW_FRAMES_PER_FPA"] == 10
517
532
  assert task.constants._db_dict["POLCAL_NUM_RAW_FRAMES_PER_FPA"] == 10
533
+ expected_non_dark_polcal_readout_times = sorted(
534
+ [lamp_readout_exp_time, solar_readout_exp_time] + observe_readout_exp_times
535
+ )
536
+ assert (
537
+ task.constants._db_dict["NON_DARK_OR_POLCAL_READOUT_EXP_TIMES"]
538
+ == expected_non_dark_polcal_readout_times
539
+ )
518
540
 
519
541
 
520
542
  def test_parse_visp_values(
@@ -584,7 +606,7 @@ def test_multiple_num_raster_steps_raises_error(
584
606
  obs_dataset_class=VispHeadersMultiNumRasterSteps,
585
607
  )
586
608
 
587
- with pytest.raises(ValueError, match="Multiple NUM_RASTER_STEPS values found"):
609
+ with pytest.raises(ValueError, match="Found multiple values for total number of raster steps"):
588
610
  task()
589
611
 
590
612
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-visp
3
- Version: 5.3.0rc6
3
+ Version: 5.3.1
4
4
  Summary: Science processing code for the ViSP 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==12.0.0rc7
16
+ Requires-Dist: dkist-processing-common==12.1.0
17
17
  Requires-Dist: dkist-processing-math==2.2.1
18
18
  Requires-Dist: dkist-processing-pac==3.1.1
19
19
  Requires-Dist: dkist-header-validator==5.2.1
@@ -84,7 +84,7 @@ Requires-Dist: aioftp==0.27.2; extra == "frozen"
84
84
  Requires-Dist: aiohappyeyeballs==2.6.1; extra == "frozen"
85
85
  Requires-Dist: aiohttp==3.13.3; extra == "frozen"
86
86
  Requires-Dist: aiosignal==1.4.0; extra == "frozen"
87
- Requires-Dist: aiosmtplib==5.0.0; extra == "frozen"
87
+ Requires-Dist: aiosmtplib==5.1.0; extra == "frozen"
88
88
  Requires-Dist: aiosqlite==0.21.0; extra == "frozen"
89
89
  Requires-Dist: alembic==1.18.1; extra == "frozen"
90
90
  Requires-Dist: amqp==5.3.1; extra == "frozen"
@@ -107,13 +107,13 @@ Requires-Dist: asdf_transform_schemas==0.6.0; extra == "frozen"
107
107
  Requires-Dist: asgiref==3.11.0; 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.1.19.0.42.31; extra == "frozen"
110
+ Requires-Dist: astropy-iers-data==0.2026.1.26.0.43.56; extra == "frozen"
111
111
  Requires-Dist: asyncpg==0.31.0; extra == "frozen"
112
112
  Requires-Dist: attrs==25.4.0; extra == "frozen"
113
113
  Requires-Dist: babel==2.17.0; extra == "frozen"
114
114
  Requires-Dist: billiard==4.2.4; extra == "frozen"
115
- Requires-Dist: boto3==1.42.32; extra == "frozen"
116
- Requires-Dist: botocore==1.42.32; extra == "frozen"
115
+ Requires-Dist: boto3==1.42.34; extra == "frozen"
116
+ Requires-Dist: botocore==1.42.34; extra == "frozen"
117
117
  Requires-Dist: cadwyn==5.4.6; extra == "frozen"
118
118
  Requires-Dist: celery==5.6.2; extra == "frozen"
119
119
  Requires-Dist: certifi==2026.1.4; extra == "frozen"
@@ -133,11 +133,11 @@ Requires-Dist: dacite==1.9.2; extra == "frozen"
133
133
  Requires-Dist: decorator==5.2.1; extra == "frozen"
134
134
  Requires-Dist: dill==0.4.1; extra == "frozen"
135
135
  Requires-Dist: dkist-header-validator==5.2.1; extra == "frozen"
136
- Requires-Dist: dkist-processing-common==12.0.0rc7; extra == "frozen"
137
- Requires-Dist: dkist-processing-core==7.0.0rc9; extra == "frozen"
136
+ Requires-Dist: dkist-processing-common==12.1.0; extra == "frozen"
137
+ Requires-Dist: dkist-processing-core==7.0.1; extra == "frozen"
138
138
  Requires-Dist: dkist-processing-math==2.2.1; extra == "frozen"
139
139
  Requires-Dist: dkist-processing-pac==3.1.1; extra == "frozen"
140
- Requires-Dist: dkist-processing-visp==5.3.0rc6; extra == "frozen"
140
+ Requires-Dist: dkist-processing-visp==5.3.1; extra == "frozen"
141
141
  Requires-Dist: dkist-service-configuration==4.2.0; extra == "frozen"
142
142
  Requires-Dist: dkist-spectral-lines==3.0.0; extra == "frozen"
143
143
  Requires-Dist: dkist_fits_specifications==4.20.0; extra == "frozen"
@@ -154,7 +154,7 @@ Requires-Dist: globus-sdk==4.3.1; extra == "frozen"
154
154
  Requires-Dist: googleapis-common-protos==1.72.0; extra == "frozen"
155
155
  Requires-Dist: gqlclient==1.2.3; extra == "frozen"
156
156
  Requires-Dist: greenback==1.3.0; extra == "frozen"
157
- Requires-Dist: greenlet==3.3.0; extra == "frozen"
157
+ Requires-Dist: greenlet==3.3.1; extra == "frozen"
158
158
  Requires-Dist: grpcio==1.76.0; extra == "frozen"
159
159
  Requires-Dist: h11==0.16.0; extra == "frozen"
160
160
  Requires-Dist: httpcore==1.0.9; extra == "frozen"
@@ -186,7 +186,7 @@ Requires-Dist: methodtools==0.4.7; extra == "frozen"
186
186
  Requires-Dist: more-itertools==10.8.0; extra == "frozen"
187
187
  Requires-Dist: moviepy==2.1.2; extra == "frozen"
188
188
  Requires-Dist: msgspec==0.20.0; extra == "frozen"
189
- Requires-Dist: multidict==6.7.0; extra == "frozen"
189
+ Requires-Dist: multidict==6.7.1; extra == "frozen"
190
190
  Requires-Dist: natsort==8.4.0; extra == "frozen"
191
191
  Requires-Dist: nbformat==5.10.4; extra == "frozen"
192
192
  Requires-Dist: networkx==3.6.1; extra == "frozen"
@@ -219,7 +219,7 @@ Requires-Dist: opentelemetry-util-http==0.60b1; extra == "frozen"
219
219
  Requires-Dist: outcome==1.3.0.post0; extra == "frozen"
220
220
  Requires-Dist: packaging==26.0; extra == "frozen"
221
221
  Requires-Dist: pandas==3.0.0; extra == "frozen"
222
- Requires-Dist: parfive==2.2.0; extra == "frozen"
222
+ Requires-Dist: parfive==2.3.0; extra == "frozen"
223
223
  Requires-Dist: pathspec==1.0.3; extra == "frozen"
224
224
  Requires-Dist: pendulum==3.1.0; extra == "frozen"
225
225
  Requires-Dist: pika==1.3.2; extra == "frozen"
@@ -245,13 +245,13 @@ Requires-Dist: pyparsing==3.3.2; extra == "frozen"
245
245
  Requires-Dist: python-daemon==3.1.2; extra == "frozen"
246
246
  Requires-Dist: python-dateutil==2.9.0.post0; extra == "frozen"
247
247
  Requires-Dist: python-dotenv==1.2.1; extra == "frozen"
248
- Requires-Dist: python-multipart==0.0.21; extra == "frozen"
248
+ Requires-Dist: python-multipart==0.0.22; extra == "frozen"
249
249
  Requires-Dist: python-slugify==8.0.4; extra == "frozen"
250
250
  Requires-Dist: pytz==2025.2; extra == "frozen"
251
251
  Requires-Dist: redis==6.4.0; extra == "frozen"
252
252
  Requires-Dist: referencing==0.37.0; extra == "frozen"
253
253
  Requires-Dist: requests==2.32.5; extra == "frozen"
254
- Requires-Dist: rich==14.2.0; extra == "frozen"
254
+ Requires-Dist: rich==14.3.1; extra == "frozen"
255
255
  Requires-Dist: rich-argparse==1.7.2; extra == "frozen"
256
256
  Requires-Dist: rich-toolkit==0.17.1; extra == "frozen"
257
257
  Requires-Dist: rpds-py==0.30.0; extra == "frozen"
@@ -296,7 +296,7 @@ Requires-Dist: uvloop==0.22.1; extra == "frozen"
296
296
  Requires-Dist: vine==5.1.0; extra == "frozen"
297
297
  Requires-Dist: voluptuous==0.16.0; extra == "frozen"
298
298
  Requires-Dist: watchfiles==1.1.1; extra == "frozen"
299
- Requires-Dist: wcwidth==0.3.0; extra == "frozen"
299
+ Requires-Dist: wcwidth==0.4.0; extra == "frozen"
300
300
  Requires-Dist: websockets==16.0; extra == "frozen"
301
301
  Requires-Dist: wirerope==1.0.0; extra == "frozen"
302
302
  Requires-Dist: wrapt==1.17.3; extra == "frozen"