dkist-processing-common 13.0.3rc2__tar.gz → 13.0.4__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 (142) hide show
  1. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/.readthedocs.yml +1 -1
  2. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/CHANGELOG.rst +30 -0
  3. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/PKG-INFO +2 -2
  4. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/assemble_movie.py +1 -1
  5. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/quality_metrics.py +21 -33
  6. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/trial_catalog.py +1 -1
  7. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/conftest.py +2 -2
  8. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_codecs.py +8 -11
  9. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_fits_access.py +0 -1
  10. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_interservice_bus.py +24 -5
  11. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_interservice_bus_mixin.py +16 -2
  12. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_quality.py +27 -27
  13. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_quality_mixin.py +2 -2
  14. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_write_l1.py +78 -64
  15. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common.egg-info/PKG-INFO +2 -2
  16. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common.egg-info/SOURCES.txt +0 -1
  17. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common.egg-info/requires.txt +1 -1
  18. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/pyproject.toml +11 -1
  19. dkist_processing_common-13.0.3rc2/changelog/326.feature.rst +0 -1
  20. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/.gitignore +0 -0
  21. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/.pre-commit-config.yaml +0 -0
  22. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/.snyk +0 -0
  23. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/README.rst +0 -0
  24. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/bitbucket-pipelines.yml +0 -0
  25. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/changelog/.gitempty +0 -0
  26. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/__init__.py +0 -0
  27. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/_util/__init__.py +0 -0
  28. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/_util/constants.py +0 -0
  29. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/_util/graphql.py +0 -0
  30. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/_util/scratch.py +0 -0
  31. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/_util/tags.py +0 -0
  32. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/__init__.py +0 -0
  33. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/array.py +0 -0
  34. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/asdf.py +0 -0
  35. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/basemodel.py +0 -0
  36. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/bytes.py +0 -0
  37. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/fits.py +0 -0
  38. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/iobase.py +0 -0
  39. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/json.py +0 -0
  40. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/path.py +0 -0
  41. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/quality.py +0 -0
  42. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/codecs/str.py +0 -0
  43. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/config.py +0 -0
  44. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/fonts/Lato-Regular.ttf +0 -0
  45. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/fonts/__init__.py +0 -0
  46. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/manual.py +0 -0
  47. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/__init__.py +0 -0
  48. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/constants.py +0 -0
  49. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/dkist_location.py +0 -0
  50. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/extras.py +0 -0
  51. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/fits_access.py +0 -0
  52. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/flower_pot.py +0 -0
  53. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/fried_parameter.py +0 -0
  54. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/graphql.py +0 -0
  55. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/input_dataset.py +0 -0
  56. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/message.py +0 -0
  57. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/message_queue_binding.py +0 -0
  58. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/metric_code.py +0 -0
  59. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/parameters.py +0 -0
  60. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/quality.py +0 -0
  61. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/tags.py +0 -0
  62. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/task_name.py +0 -0
  63. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/telemetry.py +0 -0
  64. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/models/wavelength.py +0 -0
  65. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/__init__.py +0 -0
  66. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/average_bud.py +0 -0
  67. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/cs_step.py +0 -0
  68. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/dsps_repeat.py +0 -0
  69. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/experiment_id_bud.py +0 -0
  70. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/id_bud.py +0 -0
  71. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/l0_fits_access.py +0 -0
  72. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/l1_fits_access.py +0 -0
  73. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/lookup_bud.py +0 -0
  74. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/near_bud.py +0 -0
  75. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/observing_program_id_bud.py +0 -0
  76. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/proposal_id_bud.py +0 -0
  77. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/quality.py +0 -0
  78. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/retarder.py +0 -0
  79. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/single_value_single_key_flower.py +0 -0
  80. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/task.py +0 -0
  81. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/time.py +0 -0
  82. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/unique_bud.py +0 -0
  83. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/parsers/wavelength.py +0 -0
  84. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/__init__.py +0 -0
  85. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/base.py +0 -0
  86. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/l1_output_data.py +0 -0
  87. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/__init__.py +0 -0
  88. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/globus.py +0 -0
  89. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/interservice_bus.py +0 -0
  90. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/metadata_store.py +0 -0
  91. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/object_store.py +0 -0
  92. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/quality/__init__.py +0 -0
  93. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/quality/_base.py +0 -0
  94. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/mixin/quality/_metrics.py +0 -0
  95. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/output_data_base.py +0 -0
  96. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/parse_l0_input_data.py +0 -0
  97. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/teardown.py +0 -0
  98. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/transfer_input_data.py +0 -0
  99. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/trial_output_data.py +0 -0
  100. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/write_extra.py +0 -0
  101. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/write_l1.py +0 -0
  102. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tasks/write_l1_base.py +0 -0
  103. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/__init__.py +0 -0
  104. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/mock_metadata_store.py +0 -0
  105. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_assemble_movie.py +0 -0
  106. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_assemble_quality.py +0 -0
  107. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_base.py +0 -0
  108. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_constants.py +0 -0
  109. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_construct_dataset_extras.py +0 -0
  110. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_cs_step.py +0 -0
  111. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_dkist_location.py +0 -0
  112. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_flower_pot.py +0 -0
  113. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_fried_parameter.py +0 -0
  114. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_input_dataset.py +0 -0
  115. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_manual_processing.py +0 -0
  116. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_output_data_base.py +0 -0
  117. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_parameters.py +0 -0
  118. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_parse_l0_input_data.py +0 -0
  119. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_publish_catalog_messages.py +0 -0
  120. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_scratch.py +0 -0
  121. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_stems.py +0 -0
  122. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_submit_dataset_metadata.py +0 -0
  123. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_tags.py +0 -0
  124. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_task_name.py +0 -0
  125. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_task_parsing.py +0 -0
  126. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_teardown.py +0 -0
  127. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_transfer_input_data.py +0 -0
  128. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_transfer_l1_output_data.py +0 -0
  129. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_trial_catalog.py +0 -0
  130. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_trial_output_data.py +0 -0
  131. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common/tests/test_workflow_task_base.py +0 -0
  132. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common.egg-info/dependency_links.txt +0 -0
  133. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/dkist_processing_common.egg-info/top_level.txt +0 -0
  134. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/Makefile +0 -0
  135. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/changelog.rst +0 -0
  136. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/conf.py +0 -0
  137. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/index.rst +0 -0
  138. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/landing_page.rst +0 -0
  139. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/make.bat +0 -0
  140. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/docs/requirements.txt +0 -0
  141. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/licenses/LICENSE.rst +0 -0
  142. {dkist_processing_common-13.0.3rc2 → dkist_processing_common-13.0.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  version: 2
2
2
  build:
3
- os: ubuntu-20.04
3
+ os: ubuntu-24.04
4
4
  tools:
5
5
  python: "3.13"
6
6
  apt_packages:
@@ -1,3 +1,33 @@
1
+ v13.0.4 (2026-04-16)
2
+ ====================
3
+
4
+ Misc
5
+ ----
6
+
7
+ - Convert fits.open usage in tests to context managers. (`#289 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/289>`__)
8
+ - Remove deprecated Astropy usage (e.g., CompImageHeader) and updated tests accordingly. (`#289 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/289>`__)
9
+ - Configure pyproject.toml to turn warnings raised during testing into errors.
10
+ Ignore certain testing warnings that we know are okay. (`#289 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/289>`__)
11
+ - Modernize code to address Python 3.13 deprecations (e.g., datetime.utcnow, Pillow image mode handling). (`#289 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/289>`__)
12
+ - Update dkist-processing-core to v7.2.1, which includes better warning handling and an RTD build OS update. (`#298 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/298>`__)
13
+ - Upgrade Read the Docs LTS build image to Ubuntu 24.04. (`#328 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/328>`__)
14
+
15
+
16
+ v13.0.3 (2026-04-14)
17
+ ====================
18
+
19
+ Features
20
+ --------
21
+
22
+ - Simplify the production of L1 quality metrics. (`#326 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/326>`__)
23
+
24
+
25
+ Misc
26
+ ----
27
+
28
+ - Make isb username and password configurable for local unit tests. (`#322 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/322>`__)
29
+
30
+
1
31
  v13.0.1 (2026-04-07)
2
32
  ====================
3
33
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 13.0.3rc2
3
+ Version: 13.0.4
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
@@ -17,7 +17,7 @@ Requires-Dist: asdf<4.0.0,>=3.5.0
17
17
  Requires-Dist: astropy>=7.0.0
18
18
  Requires-Dist: dkist-fits-specifications<5.0,>=4.24.0
19
19
  Requires-Dist: dkist-header-validator<6.0,>=5.3.0
20
- Requires-Dist: dkist-processing-core==7.1.0
20
+ Requires-Dist: dkist-processing-core==7.2.1
21
21
  Requires-Dist: dkist-processing-pac<4.0,>=3.1
22
22
  Requires-Dist: dkist-service-configuration<5.0,>=4.3.0
23
23
  Requires-Dist: dkist-spectral-lines<4.0,>=3.0.0
@@ -225,7 +225,7 @@ class AssembleMovie(WorkflowTaskBase, ABC):
225
225
  )
226
226
 
227
227
  background = Image.new("RGB", self.MOVIE_FRAME_SHAPE, (0, 0, 0))
228
- frame_im = Image.fromarray(colored_image, mode="RGB")
228
+ frame_im = Image.fromarray(colored_image)
229
229
  frame_im = frame_im.resize(self.MOVIE_FRAME_SHAPE, resample=Image.NEAREST)
230
230
  background.paste(frame_im)
231
231
  draw = ImageDraw.Draw(background)
@@ -439,36 +439,22 @@ class QualityL1Metrics(WorkflowTaskBase, QualityMixin):
439
439
  fits_access_class=L1QualityFitsAccess,
440
440
  )
441
441
 
442
- # accumulate specified L1QualityFitsAccess values into lists, sorted by datetime
443
- rows = sorted(
444
- (
445
- (
446
- # DATE-BEG
447
- datetime.fromisoformat(frame.time_obs),
448
- # LIGHTLVL
449
- frame.light_level,
450
- # DSHEALTH
451
- frame.health_status,
452
- # ATMOS_R0
453
- frame.fried_parameter,
454
- # AO_LOCK
455
- frame.ao_status,
456
- # OOBSHIFT
457
- frame.num_out_of_bounds_ao_values,
458
- )
459
- for frame in frames
460
- ),
461
- # DATE-BEG
462
- key=lambda row: row[0],
463
- )
442
+ # sort by datetime
443
+ sorted_frames = sorted(frames, key=lambda f: datetime.fromisoformat(f.time_obs))
464
444
 
465
445
  return L1QualityData(
466
- datetimes=tuple(row[0] for row in rows),
467
- light_level_values=tuple(row[1] for row in rows),
468
- health_status_values=tuple(row[2] for row in rows),
469
- fried_parameter_values=tuple(row[3] for row in rows),
470
- ao_lock_values=tuple(row[4] for row in rows),
471
- ao_oob_values=tuple(row[5] for row in rows),
446
+ # DATE-BEG
447
+ datetimes=tuple(datetime.fromisoformat(f.time_obs) for f in sorted_frames),
448
+ # LIGHTLVL
449
+ light_level_values=tuple(f.light_level for f in sorted_frames),
450
+ # DSHEALTH
451
+ health_status_values=tuple(f.health_status for f in sorted_frames),
452
+ # ATMOS_R0
453
+ fried_parameter_values=tuple(f.fried_parameter for f in sorted_frames),
454
+ # AO_LOCK
455
+ ao_lock_values=tuple(f.ao_status for f in sorted_frames),
456
+ # OOBSHIFT
457
+ ao_oob_values=tuple(f.num_out_of_bounds_ao_values for f in sorted_frames),
472
458
  )
473
459
 
474
460
  def compute_and_write_l1_quality_metrics(self, l1_quality_data: L1QualityData) -> None:
@@ -575,19 +561,21 @@ class QualityL1Metrics(WorkflowTaskBase, QualityMixin):
575
561
  rows.extend(tuple(z) for z in zip(statuses, counts))
576
562
  table_data = TableData(rows=tuple(rows))
577
563
 
564
+ warnings = None
565
+ if any(s in statuses for s in ["bad", "ill", "unknown"]):
566
+ warnings = [
567
+ "Data sourced from components with a health status of 'ill', 'bad', or 'unknown'."
568
+ ]
569
+
578
570
  metric = QualityMetric(
579
571
  name="Data Source Health",
580
572
  description="This metric contains the worst health status of the data source during "
581
573
  "data acquisition. One reading is taken per L1 frame.",
582
574
  metric_code=MetricCode.health_status,
583
575
  table_data=[table_data],
576
+ warnings=warnings,
584
577
  )
585
578
 
586
- if any(s in statuses for s in ["bad", "ill", "unknown"]):
587
- metric.warnings = [
588
- "Data sourced from components with a health status of 'ill', 'bad', or 'unknown'."
589
- ]
590
-
591
579
  self.write(metric, tags=Tag.quality("GENERIC"), encoder=basemodel_encoder)
592
580
 
593
581
  def compute_and_write_light_level(self, l1_quality_data: L1QualityData) -> None:
@@ -93,7 +93,7 @@ class CreateTrialDatasetInventory(OutputDataBase):
93
93
  frame_inventory["_id"] = uuid4().hex
94
94
  frame_inventory["bucket"] = self.destination_bucket
95
95
  frame_inventory["frameStatus"] = "AVAILABLE"
96
- frame_inventory["createDate"] = datetime.utcnow().isoformat("T")
96
+ frame_inventory["createDate"] = datetime.now().isoformat("T")
97
97
  frame_inventory["updateDate"] = None
98
98
  frame_inventory["lostDate"] = None
99
99
  frame_inventory["headerHDU"] = 1
@@ -617,7 +617,7 @@ def visp_modulation_matrix() -> np.ndarray:
617
617
 
618
618
  @pytest.fixture(scope="session")
619
619
  def fully_realistic_local_cs(
620
- cs_with_correct_geometry, visp_modulation_matrix, pac_fit_mode, pac_init_set
620
+ cs_with_correct_geometry, visp_modulation_matrix, pac_fit_mode, pac_init_set, cs_data_shape
621
621
  ):
622
622
 
623
623
  cs_dict = cs_with_correct_geometry
@@ -643,7 +643,7 @@ def fully_realistic_local_cs(
643
643
  # Now set the "observed" value for each of the input objects
644
644
  for m in range(dresser.nummod):
645
645
  for n in range(dresser.numsteps):
646
- cs_dict[n][m].data *= observed[m, n] / np.mean(cs_dict[n][m].data)
646
+ cs_dict[n][m].data = np.ones(cs_data_shape) * observed[m, n]
647
647
 
648
648
  return cs_dict
649
649
 
@@ -454,11 +454,10 @@ def test_fits_array_encoder_header_preserved(ndarray_object, header_func: Callab
454
454
  header = header_func(raw_header)
455
455
  encoded_data = fits_array_encoder(data=ndarray_object, header=header)
456
456
  bytes_reader = BytesIO(encoded_data)
457
- hdul = fits.open(bytes_reader)
458
-
459
- assert len(hdul) == 1
460
- np.testing.assert_equal(hdul[0].data, ndarray_object)
461
- assert hdul[0].header["KEY1"] == "VALUE1"
457
+ with fits.open(bytes_reader) as hdul:
458
+ assert len(hdul) == 1
459
+ np.testing.assert_equal(hdul[0].data, ndarray_object)
460
+ assert hdul[0].header["KEY1"] == "VALUE1"
462
461
 
463
462
 
464
463
  @pytest.mark.parametrize(
@@ -584,13 +583,11 @@ def test_fits_header_decoder(path_fixture_name, request):
584
583
  if init_num_fd is not None:
585
584
  assert init_num_fd == post_num_fd
586
585
 
587
- hdul = fits.open(file_path, disable_image_compression=True)
588
- if "compressed" in path_fixture_name:
589
- expected_header = hdul[1].header
590
- else:
591
- expected_header = hdul[0].header
586
+ with fits.open(file_path, disable_image_compression=True) as hdul:
587
+ index = 1 if "compressed" in path_fixture_name else 0
588
+ expected_header = hdul[index].header
592
589
 
593
- assert header == expected_header
590
+ assert header == expected_header
594
591
 
595
592
 
596
593
  @pytest.mark.parametrize(
@@ -342,7 +342,6 @@ def test_header_dict(hdu_with_special_keys):
342
342
  [
343
343
  pytest.param(dict, id="Dict"),
344
344
  pytest.param(fits.header.Header, id="Header"),
345
- pytest.param(fits.hdu.compressed.CompImageHeader, id="CompHeader"),
346
345
  ],
347
346
  )
348
347
  def test_from_header_naxis_preserved(header_type):
@@ -4,8 +4,9 @@ from typing import Type
4
4
  from uuid import uuid4
5
5
 
6
6
  import pytest
7
+ from pika import ConnectionParameters
8
+ from pika.credentials import PlainCredentials
7
9
  from pydantic import BaseModel
8
- from pydantic import Field
9
10
  from talus import Binding
10
11
  from talus import ConsumeMessageBase
11
12
  from talus import DurableConsumer
@@ -15,6 +16,8 @@ from talus import MessageBodyBase
15
16
  from talus import PublishMessageBase
16
17
  from talus import Queue
17
18
 
19
+ from dkist_processing_common.config import common_configurations
20
+
18
21
 
19
22
  @pytest.fixture
20
23
  def sample_message_body():
@@ -59,19 +62,35 @@ def consume_message(sample_message):
59
62
 
60
63
 
61
64
  @pytest.fixture
62
- def producer(sample_message, publish_message):
65
+ def connection_parameters() -> ConnectionParameters:
66
+ isb_username = common_configurations.isb_username
67
+ isb_password = common_configurations.isb_password
68
+ connection_parameters = ConnectionParameters(
69
+ credentials=PlainCredentials(isb_username, isb_password)
70
+ )
71
+ return connection_parameters
72
+
73
+
74
+ @pytest.fixture
75
+ def producer(sample_message, publish_message, connection_parameters):
63
76
  exchange = sample_message.exchange
64
77
  binding = Binding(queue=sample_message.queue, message=publish_message)
65
- with DurableProducer(queue_bindings=binding, publish_exchange=exchange) as p:
78
+ with DurableProducer(
79
+ queue_bindings=binding,
80
+ publish_exchange=exchange,
81
+ connection_parameters=connection_parameters,
82
+ ) as p:
66
83
  yield p
67
84
  p.channel.queue_delete(queue=sample_message.queue.name)
68
85
  p.channel.exchange_delete(exchange=sample_message.exchange.name)
69
86
 
70
87
 
71
88
  @pytest.fixture
72
- def consumer(sample_message):
89
+ def consumer(sample_message, connection_parameters):
73
90
  queue = sample_message.queue
74
- with DurableConsumer(consume_queue=queue, prefetch_count=100) as c:
91
+ with DurableConsumer(
92
+ consume_queue=queue, prefetch_count=100, connection_parameters=connection_parameters
93
+ ) as c:
75
94
  yield c
76
95
  c.channel.queue_delete(queue=sample_message.queue.name)
77
96
  c.channel.exchange_delete(exchange=sample_message.exchange.name)
@@ -5,6 +5,8 @@ from typing import Dict
5
5
  from typing import Type
6
6
 
7
7
  import pytest
8
+ from pika import ConnectionParameters
9
+ from pika.credentials import PlainCredentials
8
10
  from pydantic import BaseModel
9
11
  from talus import ConsumeMessageBase
10
12
  from talus import DurableConsumer
@@ -77,9 +79,21 @@ def consume_message(task_message):
77
79
 
78
80
 
79
81
  @pytest.fixture
80
- def consumer(task_message):
82
+ def connection_parameters() -> ConnectionParameters:
83
+ isb_username = common_configurations.isb_username
84
+ isb_password = common_configurations.isb_password
85
+ connection_parameters = ConnectionParameters(
86
+ credentials=PlainCredentials(isb_username, isb_password)
87
+ )
88
+ return connection_parameters
89
+
90
+
91
+ @pytest.fixture
92
+ def consumer(task_message, connection_parameters):
81
93
  queue = task_message.queue
82
- with DurableConsumer(consume_queue=queue, prefetch_count=100) as c:
94
+ with DurableConsumer(
95
+ consume_queue=queue, prefetch_count=100, connection_parameters=connection_parameters
96
+ ) as c:
83
97
  yield c
84
98
  # Clean up all the queues, skipping queues that are not empty:
85
99
  for binding in common_message_queue_bindings:
@@ -737,9 +737,9 @@ def test_ao_status(quality_l1_task_with_calibrated_frames: QualityL1Metrics):
737
737
  # Then
738
738
  metric_code = "AO_STATUS"
739
739
  tags = [Tag.quality("GENERIC")]
740
- metrics = [
741
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
742
- ]
740
+ metrics: list[QualityMetric] = list(
741
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
742
+ )
743
743
  assert len([metric for metric in metrics if metric.metric_code in metric_code]) == 1
744
744
  for metric in metrics:
745
745
  if metric.metric_code != metric_code:
@@ -772,9 +772,9 @@ def test_fried_parameter(
772
772
  # Then
773
773
  metric_code = "FRIED_PARAMETER"
774
774
  tags = [Tag.quality("GENERIC")]
775
- metrics = [
776
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
777
- ]
775
+ metrics: list[QualityMetric] = list(
776
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
777
+ )
778
778
  assert len([metric for metric in metrics if metric.metric_code in metric_code]) == 1
779
779
  for metric in metrics:
780
780
  if metric.metric_code != metric_code:
@@ -823,9 +823,9 @@ def test_health_status(quality_l1_task_with_calibrated_frames: QualityL1Metrics)
823
823
  # Then
824
824
  metric_code = "HEALTH_STATUS"
825
825
  tags = [Tag.quality("GENERIC")]
826
- metrics = [
827
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
828
- ]
826
+ metrics: list[QualityMetric] = list(
827
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
828
+ )
829
829
  assert len([metric for metric in metrics if metric.metric_code in metric_code]) == 1
830
830
  for metric in metrics:
831
831
  if metric.metric_code != metric_code:
@@ -867,9 +867,9 @@ def test_light_level(
867
867
  # Then
868
868
  metric_code = "LIGHT_LEVEL"
869
869
  tags = [Tag.quality("GENERIC")]
870
- metrics = [
871
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
872
- ]
870
+ metrics: list[QualityMetric] = list(
871
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
872
+ )
873
873
  assert len([metric for metric in metrics if metric.metric_code in metric_code]) == 1
874
874
  for metric in metrics:
875
875
  if metric.metric_code != metric_code:
@@ -919,9 +919,9 @@ def test_compute_and_write_ao_status(
919
919
  task.compute_and_write_ao_status(l1_quality_data)
920
920
  # Then
921
921
  tags = [Tag.quality("GENERIC")]
922
- metrics: list[QualityMetric] = [
923
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
924
- ]
922
+ metrics: list[QualityMetric] = list(
923
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
924
+ )
925
925
  assert len(metrics) == 1
926
926
  metric = metrics[0]
927
927
  # basics
@@ -956,9 +956,9 @@ def test_compute_and_write_fried_parameter(
956
956
  task.compute_and_write_fried_parameter(l1_quality_data)
957
957
  # Then
958
958
  tags = [Tag.quality("GENERIC")]
959
- metrics: list[QualityMetric] = [
960
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
961
- ]
959
+ metrics: list[QualityMetric] = list(
960
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
961
+ )
962
962
  assert len(metrics) == 1
963
963
  metric = metrics[0]
964
964
  # basics
@@ -1013,9 +1013,9 @@ def test_compute_and_write_health_status(
1013
1013
  task.compute_and_write_health_status(l1_quality_data)
1014
1014
  # Then
1015
1015
  tags = [Tag.quality("GENERIC")]
1016
- metrics: list[QualityMetric] = [
1017
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
1018
- ]
1016
+ metrics: list[QualityMetric] = list(
1017
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
1018
+ )
1019
1019
  assert len(metrics) == 1
1020
1020
  metric = metrics[0]
1021
1021
  # basics
@@ -1069,9 +1069,9 @@ def test_compute_and_write_light_level(
1069
1069
  task.compute_and_write_light_level(l1_quality_data)
1070
1070
  # Then
1071
1071
  tags = [Tag.quality("GENERIC")]
1072
- metrics: list[QualityMetric] = [
1073
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
1074
- ]
1072
+ metrics: list[QualityMetric] = list(
1073
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
1074
+ )
1075
1075
  assert len(metrics) == 1
1076
1076
  metric = metrics[0]
1077
1077
  # basics
@@ -1122,7 +1122,7 @@ def test_no_calibration_frames_no_l1_metrics(quality_l1_task_no_scratch_data: Qu
1122
1122
  task()
1123
1123
  # Then
1124
1124
  tags = [Tag.quality("GENERIC")]
1125
- metrics = [
1126
- metric for metric in task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
1127
- ]
1125
+ metrics: list[QualityMetric] = list(
1126
+ task.read(tags=tags, decoder=basemodel_decoder, model=QualityMetric)
1127
+ )
1128
1128
  assert len(metrics) == 0
@@ -1074,8 +1074,8 @@ def test_validate_vertical_multi_pane_plot_model():
1074
1074
  # Test invalid case
1075
1075
  with pytest.raises(
1076
1076
  ValidationError,
1077
- match="The number of items in `top_to_bottom_height_ratios` list \(3\) is not "
1078
- "the same as the number of plots \(2\)",
1077
+ match=r"The number of items in `top_to_bottom_height_ratios` list \(3\) is not "
1078
+ r"the same as the number of plots \(2\)",
1079
1079
  ):
1080
1080
  _ = VerticalMultiPanePlot2D(
1081
1081
  top_to_bottom_plot_list=[plot2d, plot2d], top_to_bottom_height_ratios=[1.0, 2.0, 3.0]
@@ -445,17 +445,18 @@ def test_solarnet_keys(write_l1_task, mocker, fake_gql_client):
445
445
  task()
446
446
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
447
447
  for file in files:
448
- header = fits.open(file)[1].header
449
- assert header["DATEREF"] == header["DATE-BEG"]
450
- assert round(header["OBSGEO-X"]) == -5466045
451
- assert round(header["OBSGEO-Y"]) == -2404389
452
- assert round(header["OBSGEO-Z"]) == 2242134
453
- assert header["SOLARRAD"] == 975.58
454
- assert header["SPECSYS"] == "TOPOCENT"
455
- assert header["VELOSYS"] == 0.0
456
- assert header["WAVEBAND"] == "Fe XIII (1079.8 nm)"
457
- assert header["WAVEMIN"] == 1075.0
458
- assert header["WAVEMAX"] == 1085.0
448
+ with fits.open(file) as hdu:
449
+ header = hdu[1].header
450
+ assert header["DATEREF"] == header["DATE-BEG"]
451
+ assert round(header["OBSGEO-X"]) == -5466045
452
+ assert round(header["OBSGEO-Y"]) == -2404389
453
+ assert round(header["OBSGEO-Z"]) == 2242134
454
+ assert header["SOLARRAD"] == 975.58
455
+ assert header["SPECSYS"] == "TOPOCENT"
456
+ assert header["VELOSYS"] == 0.0
457
+ assert header["WAVEBAND"] == "Fe XIII (1079.8 nm)"
458
+ assert header["WAVEMIN"] == 1075.0
459
+ assert header["WAVEMAX"] == 1085.0
459
460
 
460
461
 
461
462
  def test_documentation_keys(write_l1_task, mocker, fake_gql_client):
@@ -477,18 +478,20 @@ def test_documentation_keys(write_l1_task, mocker, fake_gql_client):
477
478
  task()
478
479
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
479
480
  for file in files:
480
- header = fits.open(file)[1].header
481
- assert header["INFO_URL"] == task.docs_base_url
482
- assert header["HEADVERS"] == spec_version
483
- assert (
484
- header["HEAD_URL"] == f"{task.docs_base_url}/projects/data-products/en/v{spec_version}"
485
- )
486
- calvers = task.version_from_module_name()
487
- assert header["CALVERS"] == calvers
488
- assert (
489
- header["CAL_URL"]
490
- == f"{task.docs_base_url}/projects/{task.constants.instrument.lower()}/en/v{calvers}/{task.workflow_name}.html"
491
- )
481
+ with fits.open(file) as hdu:
482
+ header = hdu[1].header
483
+ assert header["INFO_URL"] == task.docs_base_url
484
+ assert header["HEADVERS"] == spec_version
485
+ assert (
486
+ header["HEAD_URL"]
487
+ == f"{task.docs_base_url}/projects/data-products/en/v{spec_version}"
488
+ )
489
+ calvers = task.version_from_module_name()
490
+ assert header["CALVERS"] == calvers
491
+ assert (
492
+ header["CAL_URL"]
493
+ == f"{task.docs_base_url}/projects/{task.constants.instrument.lower()}/en/v{calvers}/{task.workflow_name}.html"
494
+ )
492
495
 
493
496
 
494
497
  def test_get_version_from_module(write_l1_task):
@@ -519,13 +522,13 @@ def test_rice_compression_with_specified_tile_size(write_l1_task, mocker, fake_g
519
522
  task()
520
523
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
521
524
  for file in files:
522
- hdul = fits.open(file)
523
- bintable = hdul[1]._get_bintable_without_data()
524
- comp_header = bintable.header
525
- data_shape = list(hdul[1].data.shape)
526
- data_shape.reverse()
527
- for i, dim in enumerate(data_shape):
528
- assert comp_header["ZTILE" + str(i + 1)] == min(dim, TILE_SIZE)
525
+ with fits.open(file) as hdul:
526
+ bintable = hdul[1]._get_bintable_without_data()
527
+ comp_header = bintable.header
528
+ data_shape = list(hdul[1].data.shape)
529
+ data_shape.reverse()
530
+ for i, dim in enumerate(data_shape):
531
+ assert comp_header["ZTILE" + str(i + 1)] == min(dim, TILE_SIZE)
529
532
 
530
533
 
531
534
  def test_rice_compression_with_default_tile_size(
@@ -547,14 +550,14 @@ def test_rice_compression_with_default_tile_size(
547
550
  assert task.tile_size_param == None
548
551
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
549
552
  for file in files:
550
- hdul = fits.open(file)
551
- bintable = hdul[1]._get_bintable_without_data()
552
- comp_header = bintable.header
553
- data_shape = list(hdul[1].data.shape)
554
- data_shape.reverse()
555
- assert comp_header["ZTILE1"] == data_shape[0]
556
- assert comp_header["ZTILE2"] == 128
557
- assert comp_header["ZTILE3"] == 1
553
+ with fits.open(file) as hdul:
554
+ bintable = hdul[1]._get_bintable_without_data()
555
+ comp_header = bintable.header
556
+ data_shape = list(hdul[1].data.shape)
557
+ data_shape.reverse()
558
+ assert comp_header["ZTILE1"] == data_shape[0]
559
+ assert comp_header["ZTILE2"] == 128
560
+ assert comp_header["ZTILE3"] == 1
558
561
 
559
562
 
560
563
  def test_reprocessing_keys(write_l1_task, mocker, fake_gql_client):
@@ -571,20 +574,26 @@ def test_reprocessing_keys(write_l1_task, mocker, fake_gql_client):
571
574
  task()
572
575
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
573
576
  for file in files:
574
- header = fits.open(file)[1].header
575
- assert header["IDSPARID"] == task.metadata_store_input_dataset_parameters.inputDatasetPartId
576
- assert (
577
- header["IDSOBSID"]
578
- == task.metadata_store_input_dataset_observe_frames.inputDatasetPartId
579
- )
580
- assert (
581
- header["IDSCALID"]
582
- == task.metadata_store_input_dataset_calibration_frames.inputDatasetPartId
583
- )
584
- assert header["WKFLNAME"] == task.workflow_name
585
- assert header["WKFLVERS"] == task.workflow_version
586
- assert header["PROCTYPE"] == "L1"
587
- assert header["PRODUCT"] == task.compute_product_id(header["IDSOBSID"], header["PROCTYPE"])
577
+ with fits.open(file) as hdu:
578
+ header = hdu[1].header
579
+ assert (
580
+ header["IDSPARID"]
581
+ == task.metadata_store_input_dataset_parameters.inputDatasetPartId
582
+ )
583
+ assert (
584
+ header["IDSOBSID"]
585
+ == task.metadata_store_input_dataset_observe_frames.inputDatasetPartId
586
+ )
587
+ assert (
588
+ header["IDSCALID"]
589
+ == task.metadata_store_input_dataset_calibration_frames.inputDatasetPartId
590
+ )
591
+ assert header["WKFLNAME"] == task.workflow_name
592
+ assert header["WKFLVERS"] == task.workflow_version
593
+ assert header["PROCTYPE"] == "L1"
594
+ assert header["PRODUCT"] == task.compute_product_id(
595
+ header["IDSOBSID"], header["PROCTYPE"]
596
+ )
588
597
 
589
598
 
590
599
  def test_missing_input_dataset_part(
@@ -603,13 +612,17 @@ def test_missing_input_dataset_part(
603
612
  task()
604
613
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
605
614
  for file in files:
606
- header = fits.open(file)[1].header
607
- assert header["IDSPARID"] == task.metadata_store_input_dataset_parameters.inputDatasetPartId
608
- assert (
609
- header["IDSOBSID"]
610
- == task.metadata_store_input_dataset_observe_frames.inputDatasetPartId
611
- )
612
- assert "IDSCALID" not in header
615
+ with fits.open(file) as hdu:
616
+ header = hdu[1].header
617
+ assert (
618
+ header["IDSPARID"]
619
+ == task.metadata_store_input_dataset_parameters.inputDatasetPartId
620
+ )
621
+ assert (
622
+ header["IDSOBSID"]
623
+ == task.metadata_store_input_dataset_observe_frames.inputDatasetPartId
624
+ )
625
+ assert "IDSCALID" not in header
613
626
 
614
627
 
615
628
  @pytest.mark.parametrize(
@@ -757,8 +770,9 @@ def test_empty_waveband(write_l1_task_with_empty_waveband, mocker, fake_gql_clie
757
770
  task()
758
771
  files = list(task.read(tags=[Tag.frame(), Tag.output()]))
759
772
  for file in files:
760
- header = fits.open(file)[1].header
761
- assert header["WAVEMIN"] == 10000
762
- assert header["WAVEMAX"] == 10050
763
- with pytest.raises(KeyError):
764
- header["WAVEBAND"]
773
+ with fits.open(file) as hdu:
774
+ header = hdu[1].header
775
+ assert header["WAVEMIN"] == 10000
776
+ assert header["WAVEMAX"] == 10050
777
+ with pytest.raises(KeyError):
778
+ header["WAVEBAND"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 13.0.3rc2
3
+ Version: 13.0.4
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
@@ -17,7 +17,7 @@ Requires-Dist: asdf<4.0.0,>=3.5.0
17
17
  Requires-Dist: astropy>=7.0.0
18
18
  Requires-Dist: dkist-fits-specifications<5.0,>=4.24.0
19
19
  Requires-Dist: dkist-header-validator<6.0,>=5.3.0
20
- Requires-Dist: dkist-processing-core==7.1.0
20
+ Requires-Dist: dkist-processing-core==7.2.1
21
21
  Requires-Dist: dkist-processing-pac<4.0,>=3.1
22
22
  Requires-Dist: dkist-service-configuration<5.0,>=4.3.0
23
23
  Requires-Dist: dkist-spectral-lines<4.0,>=3.0.0