dkist-processing-common 11.8.1rc1__tar.gz → 11.8.2rc1__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 (139) hide show
  1. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/PKG-INFO +5 -5
  2. dkist_processing_common-11.8.2rc1/changelog/276.feature.rst +1 -0
  3. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/graphql.py +0 -33
  4. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/l1_output_data.py +37 -28
  5. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/metadata_store.py +0 -49
  6. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/object_store.py +21 -0
  7. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/quality/_metrics.py +6 -4
  8. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/trial_catalog.py +5 -1
  9. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/trial_output_data.py +1 -1
  10. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/mock_metadata_store.py +0 -4
  11. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_publish_catalog_messages.py +0 -21
  12. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_quality_mixin.py +3 -11
  13. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_submit_dataset_metadata.py +1 -5
  14. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_trial_output_data.py +1 -2
  15. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common.egg-info/PKG-INFO +5 -5
  16. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common.egg-info/SOURCES.txt +1 -2
  17. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common.egg-info/requires.txt +4 -4
  18. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/pyproject.toml +4 -4
  19. dkist_processing_common-11.8.1rc1/changelog/271.misc.2.rst +0 -1
  20. dkist_processing_common-11.8.1rc1/changelog/271.misc.rst +0 -1
  21. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/.gitignore +0 -0
  22. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/.pre-commit-config.yaml +0 -0
  23. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/.readthedocs.yml +0 -0
  24. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/.snyk +0 -0
  25. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/CHANGELOG.rst +0 -0
  26. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/README.rst +0 -0
  27. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/bitbucket-pipelines.yml +0 -0
  28. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/changelog/.gitempty +0 -0
  29. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/__init__.py +0 -0
  30. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/_util/__init__.py +0 -0
  31. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/_util/constants.py +0 -0
  32. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/_util/graphql.py +0 -0
  33. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/_util/scratch.py +0 -0
  34. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/_util/tags.py +0 -0
  35. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/__init__.py +0 -0
  36. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/array.py +0 -0
  37. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/asdf.py +0 -0
  38. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/basemodel.py +0 -0
  39. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/bytes.py +0 -0
  40. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/fits.py +0 -0
  41. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/iobase.py +0 -0
  42. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/json.py +0 -0
  43. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/path.py +0 -0
  44. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/quality.py +0 -0
  45. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/codecs/str.py +0 -0
  46. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/config.py +0 -0
  47. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/fonts/Lato-Regular.ttf +0 -0
  48. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/fonts/__init__.py +0 -0
  49. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/manual.py +0 -0
  50. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/__init__.py +0 -0
  51. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/constants.py +0 -0
  52. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/dkist_location.py +0 -0
  53. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/fits_access.py +0 -0
  54. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/flower_pot.py +0 -0
  55. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/fried_parameter.py +0 -0
  56. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/input_dataset.py +0 -0
  57. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/message.py +0 -0
  58. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/message_queue_binding.py +0 -0
  59. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/metric_code.py +0 -0
  60. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/parameters.py +0 -0
  61. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/quality.py +0 -0
  62. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/tags.py +0 -0
  63. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/task_name.py +0 -0
  64. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/telemetry.py +0 -0
  65. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/models/wavelength.py +0 -0
  66. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/__init__.py +0 -0
  67. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/average_bud.py +0 -0
  68. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/cs_step.py +0 -0
  69. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/dsps_repeat.py +0 -0
  70. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/experiment_id_bud.py +0 -0
  71. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/id_bud.py +0 -0
  72. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/l0_fits_access.py +0 -0
  73. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/l1_fits_access.py +0 -0
  74. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/near_bud.py +0 -0
  75. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/observing_program_id_bud.py +0 -0
  76. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/proposal_id_bud.py +0 -0
  77. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/quality.py +0 -0
  78. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/retarder.py +0 -0
  79. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/single_value_single_key_flower.py +0 -0
  80. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/task.py +0 -0
  81. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/time.py +0 -0
  82. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/unique_bud.py +0 -0
  83. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/parsers/wavelength.py +0 -0
  84. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/__init__.py +0 -0
  85. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/assemble_movie.py +0 -0
  86. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/base.py +0 -0
  87. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/__init__.py +0 -0
  88. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/globus.py +0 -0
  89. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/interservice_bus.py +0 -0
  90. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/quality/__init__.py +0 -0
  91. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/mixin/quality/_base.py +0 -0
  92. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/output_data_base.py +0 -0
  93. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/parse_l0_input_data.py +0 -0
  94. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/quality_metrics.py +0 -0
  95. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/teardown.py +0 -0
  96. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/transfer_input_data.py +0 -0
  97. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tasks/write_l1.py +0 -0
  98. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/__init__.py +0 -0
  99. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/conftest.py +0 -0
  100. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_assemble_movie.py +0 -0
  101. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_assemble_quality.py +0 -0
  102. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_base.py +0 -0
  103. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_codecs.py +0 -0
  104. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_constants.py +0 -0
  105. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_cs_step.py +0 -0
  106. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_dkist_location.py +0 -0
  107. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_fits_access.py +0 -0
  108. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_flower_pot.py +0 -0
  109. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_fried_parameter.py +0 -0
  110. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_input_dataset.py +0 -0
  111. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_interservice_bus.py +0 -0
  112. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_interservice_bus_mixin.py +0 -0
  113. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_manual_processing.py +0 -0
  114. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_output_data_base.py +0 -0
  115. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_parameters.py +0 -0
  116. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_parse_l0_input_data.py +0 -0
  117. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_quality.py +0 -0
  118. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_scratch.py +0 -0
  119. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_stems.py +0 -0
  120. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_tags.py +0 -0
  121. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_task_name.py +0 -0
  122. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_task_parsing.py +0 -0
  123. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_teardown.py +0 -0
  124. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_transfer_input_data.py +0 -0
  125. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_transfer_l1_output_data.py +0 -0
  126. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_trial_catalog.py +0 -0
  127. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_workflow_task_base.py +0 -0
  128. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common/tests/test_write_l1.py +0 -0
  129. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common.egg-info/dependency_links.txt +0 -0
  130. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/dkist_processing_common.egg-info/top_level.txt +0 -0
  131. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/Makefile +0 -0
  132. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/changelog.rst +0 -0
  133. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/conf.py +0 -0
  134. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/index.rst +0 -0
  135. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/landing_page.rst +0 -0
  136. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/make.bat +0 -0
  137. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/docs/requirements.txt +0 -0
  138. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/licenses/LICENSE.rst +0 -0
  139. {dkist_processing_common-11.8.1rc1 → dkist_processing_common-11.8.2rc1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 11.8.1rc1
3
+ Version: 11.8.2rc1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -21,7 +21,7 @@ Requires-Dist: dkist-processing-core==6.0.0
21
21
  Requires-Dist: dkist-processing-pac<4.0,>=3.1
22
22
  Requires-Dist: dkist-service-configuration<5.0,>=4.1.7
23
23
  Requires-Dist: dkist-spectral-lines<4.0,>=3.0.0
24
- Requires-Dist: solar-wavelength-calibration<3.0,>=2.0.0rc2
24
+ Requires-Dist: solar-wavelength-calibration<2.0,>=1.0
25
25
  Requires-Dist: globus-sdk<4.0.0,>=3.12.0
26
26
  Requires-Dist: gqlclient[pydantic]==1.2.3
27
27
  Requires-Dist: sqids==0.5.1
@@ -31,7 +31,7 @@ Requires-Dist: numpy>=1.26.4
31
31
  Requires-Dist: object-clerk==1.0.0
32
32
  Requires-Dist: pandas>=1.4.2
33
33
  Requires-Dist: pillow>=10.2.0
34
- Requires-Dist: pydantic>=2.7.2
34
+ Requires-Dist: pydantic>=2.0
35
35
  Requires-Dist: redis==6.4.0
36
36
  Requires-Dist: requests>=2.23
37
37
  Requires-Dist: scipy>=1.15.1
@@ -57,9 +57,9 @@ Requires-Dist: pytest; extra == "docs"
57
57
  Requires-Dist: towncrier<22.12.0; extra == "docs"
58
58
  Requires-Dist: dkist-sphinx-theme; extra == "docs"
59
59
  Provides-Extra: inventory
60
- Requires-Dist: dkist-inventory<2.0,>=1.11.1; extra == "inventory"
60
+ Requires-Dist: dkist-inventory==1.11.3rc2; extra == "inventory"
61
61
  Provides-Extra: asdf
62
- Requires-Dist: dkist-inventory[asdf]<2.0,>=1.11.1; extra == "asdf"
62
+ Requires-Dist: dkist-inventory[asdf]==1.11.3rc2; extra == "asdf"
63
63
  Provides-Extra: quality
64
64
  Requires-Dist: dkist-quality<3.0,>=2.0.0; extra == "quality"
65
65
 
@@ -0,0 +1 @@
1
+ Store quality data in object store
@@ -176,36 +176,3 @@ class RecipeRunProvenanceMutation(GraphqlBaseModel):
176
176
  libraryVersions: str
177
177
  workflowVersion: str
178
178
  codeVersion: str | None = None
179
-
180
-
181
- class QualityCreation(GraphqlBaseModel):
182
- """Quality data creation record."""
183
-
184
- datasetId: str
185
- metricCode: str
186
- facet: str | None = None
187
- name: str | None = None
188
- description: str | None = None
189
- statement: str | None = None
190
- # JSON array
191
- warnings: str | None = None
192
- # JSON objects
193
- plotData: str | None = None
194
- multiPlotData: str | None = None
195
- tableData: str | None = None
196
- histogramData: str | None = None
197
- modmatData: str | None = None
198
- raincloudData: str | None = None
199
- efficiencyData: str | None = None
200
-
201
-
202
- class QualitiesRequest(GraphqlBaseModel):
203
- """Query parameters for quality data."""
204
-
205
- datasetId: str
206
-
207
-
208
- class QualityResponse(GraphqlBaseModel):
209
- """Query Response for quality data."""
210
-
211
- qualityId: int
@@ -38,8 +38,9 @@ class L1OutputDataBase(OutputDataBase, ABC):
38
38
 
39
39
  @property
40
40
  def dataset_has_quality_data(self) -> bool:
41
- """Return True if quality data has been persisted to the metadata-store."""
42
- return self.metadata_store_quality_data_exists(dataset_id=self.constants.dataset_id)
41
+ """Return True if the dataset has quality data."""
42
+ paths = list(self.read(tags=[Tag.output(), Tag.quality_data()]))
43
+ return len(paths) > 0
43
44
 
44
45
  def rollback(self):
45
46
  """Warn that the metadata-store and the interservice bus retain the effect of this tasks execution. Rolling back this task may not be achievable without other action."""
@@ -58,6 +59,9 @@ class TransferL1Data(TransferDataBase, GlobusMixin):
58
59
  # Movie needs to be transferred separately as the movie headers need to go with it
59
60
  self.transfer_movie()
60
61
 
62
+ with self.telemetry_span("Upload quality data"):
63
+ self.transfer_quality_data()
64
+
61
65
  with self.telemetry_span("Upload science frames"):
62
66
  self.transfer_output_frames()
63
67
 
@@ -101,6 +105,33 @@ class TransferL1Data(TransferDataBase, GlobusMixin):
101
105
  content_type="video/mp4",
102
106
  )
103
107
 
108
+ def transfer_quality_data(self):
109
+ """Transfer quality data to the object store."""
110
+ paths = list(self.read(tags=[Tag.output(), Tag.quality_data()]))
111
+ if len(paths) == 0:
112
+ logger.warning(
113
+ f"No quality data found to upload for dataset. recipe_run_id={self.recipe_run_id}"
114
+ )
115
+ return
116
+
117
+ if count := len(paths) > 1:
118
+ # dataset inventory does not support multiple quality data object keys
119
+ raise RuntimeError(
120
+ f"Found multiple quality data files to upload. Not supported."
121
+ f"{count=}, recipe_run_id={self.recipe_run_id}"
122
+ )
123
+
124
+ with self.telemetry_span(f"Uploading the trial quality data"):
125
+ path = paths[0]
126
+ logger.info(f"Uploading quality data: recipe_run_id={self.recipe_run_id}, {path=}")
127
+ quality_data_object_key = self.format_object_key(path)
128
+ self.object_store_upload_quality_data(
129
+ quality_data=path,
130
+ bucket=self.destination_bucket,
131
+ object_key=quality_data_object_key,
132
+ content_type="application/json",
133
+ )
134
+
104
135
 
105
136
  class AssembleQualityData(L1OutputDataBase, QualityMixin):
106
137
  """
@@ -128,7 +159,7 @@ class AssembleQualityData(L1OutputDataBase, QualityMixin):
128
159
  ):
129
160
  self.write(
130
161
  quality_data,
131
- tags=Tag.quality_data(),
162
+ tags=[Tag.output(), Tag.quality_data()],
132
163
  encoder=quality_data_encoder,
133
164
  relative_path=f"{self.constants.dataset_id}_quality_data.json",
134
165
  )
@@ -146,20 +177,10 @@ class SubmitDatasetMetadata(L1OutputDataBase):
146
177
 
147
178
  def run(self) -> None:
148
179
  """Run method for this task."""
149
- with self.telemetry_span(f"Storing quality data to metadata store"):
150
- # each quality_data file is a list - this will combine the elements of multiple lists into a single list
151
- quality_data = list(
152
- chain.from_iterable(
153
- self.read(tags=Tag.quality_data(), decoder=quality_data_decoder)
154
- )
155
- )
156
- self.metadata_store_add_quality_data(
157
- dataset_id=self.constants.dataset_id, quality_data=quality_data
158
- )
159
180
  with self.telemetry_span("Count Expected Outputs"):
160
181
  dataset_id = self.constants.dataset_id
161
182
  expected_object_count = self.count(tags=Tag.output())
162
- if quality_data:
183
+ if self.dataset_has_quality_data:
163
184
  expected_object_count += 1
164
185
  logger.info(
165
186
  f"Adding Dataset Receipt Account: "
@@ -230,24 +251,12 @@ class PublishCatalogAndQualityMessages(L1OutputDataBase, InterserviceBusMixin):
230
251
  messages = [CatalogObjectMessage(body=body) for body in message_bodies]
231
252
  return messages
232
253
 
233
- @property
234
- def quality_report_message(self) -> CreateQualityReportMessage:
235
- """Create the Quality Report Message."""
236
- file_name = Path(f"{self.constants.dataset_id}_quality_report.pdf")
237
- body = CreateQualityReportMessageBody(
238
- bucket=self.destination_bucket,
239
- objectName=self.format_object_key(file_name),
240
- conversationId=str(self.recipe_run_id),
241
- datasetId=self.constants.dataset_id,
242
- incrementDatasetCatalogReceiptCount=True,
243
- )
244
- return CreateQualityReportMessage(body=body)
245
-
246
254
  def run(self) -> None:
247
255
  """Run method for this task."""
248
256
  with self.telemetry_span("Gather output data"):
249
257
  frames = self.read(tags=self.output_frame_tags)
250
258
  movies = self.read(tags=[Tag.output(), Tag.movie()])
259
+ quality_data = self.read(tags=[Tag.output(), Tag.quality_data()])
251
260
  with self.telemetry_span("Create message objects"):
252
261
  messages = []
253
262
  messages += self.frame_messages(paths=frames)
@@ -256,7 +265,7 @@ class PublishCatalogAndQualityMessages(L1OutputDataBase, InterserviceBusMixin):
256
265
  object_message_count = len(messages) - frame_message_count
257
266
  dataset_has_quality_data = self.dataset_has_quality_data
258
267
  if dataset_has_quality_data:
259
- messages.append(self.quality_report_message)
268
+ messages += self.object_messages(paths=quality_data, object_type="QDATA")
260
269
  with self.telemetry_span(
261
270
  f"Publish messages: {frame_message_count = }, {object_message_count = }, {dataset_has_quality_data = }"
262
271
  ):
@@ -1,6 +1,5 @@
1
1
  """Mixin for a WorkflowDataTaskBase subclass which implements Metadata Store data access functionality."""
2
2
 
3
- import json
4
3
  import logging
5
4
  from functools import cached_property
6
5
  from typing import Literal
@@ -8,15 +7,11 @@ from typing import Literal
8
7
  from pydantic import validate_call
9
8
 
10
9
  from dkist_processing_common._util.graphql import GraphQLClient
11
- from dkist_processing_common.codecs.quality import QualityDataEncoder
12
10
  from dkist_processing_common.config import common_configurations
13
11
  from dkist_processing_common.models.graphql import DatasetCatalogReceiptAccountMutation
14
12
  from dkist_processing_common.models.graphql import DatasetCatalogReceiptAccountResponse
15
13
  from dkist_processing_common.models.graphql import InputDatasetPartResponse
16
14
  from dkist_processing_common.models.graphql import InputDatasetRecipeRunResponse
17
- from dkist_processing_common.models.graphql import QualitiesRequest
18
- from dkist_processing_common.models.graphql import QualityCreation
19
- from dkist_processing_common.models.graphql import QualityResponse
20
15
  from dkist_processing_common.models.graphql import RecipeRunMutation
21
16
  from dkist_processing_common.models.graphql import RecipeRunMutationResponse
22
17
  from dkist_processing_common.models.graphql import RecipeRunProvenanceMutation
@@ -150,50 +145,6 @@ class MetadataStoreMixin:
150
145
  mutation_response_cls=RecipeRunProvenanceResponse,
151
146
  )
152
147
 
153
- # QUALITY
154
-
155
- def metadata_store_add_quality_data(self, dataset_id: str, quality_data: list[dict]):
156
- """Add the quality data to the metadata-store."""
157
- if self.metadata_store_quality_data_exists(dataset_id):
158
- raise RuntimeError(f"Quality data already persisted for dataset {dataset_id!r}")
159
- for metric in quality_data:
160
- if (metric_code := metric.get("metric_code")) is None:
161
- name = metric.get("name")
162
- raise ValueError(f"No metric_code for {name!r} in dataset {dataset_id!r}")
163
- params = QualityCreation(
164
- datasetId=dataset_id,
165
- metricCode=metric_code,
166
- facet=metric.get("facet"),
167
- name=metric.get("name"),
168
- description=metric.get("description"),
169
- statement=metric.get("statement"),
170
- # JSON array
171
- warnings=json.dumps(metric.get("warnings")),
172
- # JSON objects
173
- plotData=json.dumps(metric.get("plot_data"), cls=QualityDataEncoder),
174
- multiPlotData=json.dumps(metric.get("multi_plot_data"), cls=QualityDataEncoder),
175
- tableData=json.dumps(metric.get("table_data"), cls=QualityDataEncoder),
176
- histogramData=json.dumps(metric.get("histogram_data"), cls=QualityDataEncoder),
177
- modmatData=json.dumps(metric.get("modmat_data"), cls=QualityDataEncoder),
178
- raincloudData=json.dumps(metric.get("raincloud_data"), cls=QualityDataEncoder),
179
- efficiencyData=json.dumps(metric.get("efficiency_data"), cls=QualityDataEncoder),
180
- )
181
- self.metadata_store_client.execute_gql_mutation(
182
- mutation_base="createQuality",
183
- mutation_parameters=params,
184
- mutation_response_cls=QualityResponse,
185
- )
186
-
187
- def metadata_store_quality_data_exists(self, dataset_id: str) -> bool:
188
- """Return True if quality data exists in the metadata-store for the given dataset id."""
189
- params = QualitiesRequest(datasetId=dataset_id)
190
- response = self.metadata_store_client.execute_gql_query(
191
- query_base="qualities",
192
- query_response_cls=QualityResponse,
193
- query_parameters=params,
194
- )
195
- return bool(response)
196
-
197
148
  # INPUT DATASET RECIPE RUN
198
149
 
199
150
  @cached_property
@@ -55,6 +55,27 @@ class ObjectStoreMixin:
55
55
  },
56
56
  )
57
57
 
58
+ def object_store_upload_quality_data(
59
+ self,
60
+ quality_data: Path | bytes,
61
+ bucket: str,
62
+ object_key: str,
63
+ content_type: str = "application/json",
64
+ ):
65
+ """Upload quality data to the object store."""
66
+ self.object_store_client.upload_object(
67
+ object_data=quality_data,
68
+ bucket=bucket,
69
+ object_key=object_key,
70
+ verify_checksum=True,
71
+ content_type=content_type,
72
+ metadata={
73
+ "groupname": "DATASET",
74
+ "groupid": self.constants.dataset_id,
75
+ "objecttype": "QDATA",
76
+ },
77
+ )
78
+
58
79
  def object_store_remove_folder_objects(self, bucket: str, path: Path | str) -> list[str]:
59
80
  """
60
81
  Remove folder objects (end with /) in the specified bucket and path.
@@ -1356,13 +1356,15 @@ class _WavecalQualityMixin:
1356
1356
  Note that the residuals are the *unweighed* residuals.
1357
1357
  """
1358
1358
  weight_data = np.ones(input_wavelength.size) if weights is None else weights
1359
- prepared_weights = fit_result.prepared_weights
1359
+ prepared_weights = np.sqrt(weight_data / np.sum(weight_data))
1360
1360
  residuals = fit_result.minimizer_result.residual / prepared_weights
1361
1361
  residuals[~np.isfinite(residuals)] = 0.0
1362
+ best_fit_atlas = input_spectrum - residuals
1362
1363
  normalized_residuals = residuals / input_spectrum
1363
1364
 
1364
- best_fit_atlas = fit_result.best_fit_atlas
1365
- best_fit_wavelength = fit_result.best_fit_wavelength_vector
1365
+ best_fit_header = fit_result.wavelength_parameters.to_header(axis_num=1)
1366
+ wcs = WCS(best_fit_header)
1367
+ best_fit_wavelength = wcs.spectral.pixel_to_world(np.arange(input_spectrum.size))
1366
1368
 
1367
1369
  finite_idx = (
1368
1370
  np.isfinite(input_wavelength)
@@ -1376,7 +1378,7 @@ class _WavecalQualityMixin:
1376
1378
  data = {
1377
1379
  "input_wavelength_nm": input_wavelength.to_value(u.nm)[finite_idx].tolist(),
1378
1380
  "input_spectrum": input_spectrum[finite_idx].tolist(),
1379
- "best_fit_wavelength_nm": best_fit_wavelength[finite_idx].tolist(),
1381
+ "best_fit_wavelength_nm": best_fit_wavelength.to_value(u.nm)[finite_idx].tolist(),
1380
1382
  "best_fit_atlas": best_fit_atlas[finite_idx].tolist(),
1381
1383
  "normalized_residuals": normalized_residuals[finite_idx].tolist(),
1382
1384
  "weights": None if weights is None else weight_data[finite_idx].tolist(),
@@ -9,6 +9,8 @@ from typing import Any
9
9
  from typing import Generator
10
10
  from uuid import uuid4
11
11
 
12
+ from dkist_inventory.inventory import generate_quality_report_filename
13
+
12
14
  from dkist_processing_common.codecs.asdf import asdf_fileobj_encoder
13
15
  from dkist_processing_common.codecs.basemodel import basemodel_decoder
14
16
  from dkist_processing_common.codecs.fits import fits_access_decoder
@@ -245,5 +247,7 @@ class CreateTrialQualityReport(OutputDataBase):
245
247
  self.write(
246
248
  quality_report,
247
249
  tags=[Tag.output(), Tag.quality_report()],
248
- relative_path=f"{self.constants.dataset_id}_quality_report.pdf",
250
+ relative_path=generate_quality_report_filename(
251
+ dataset_id=self.constants.dataset_id
252
+ ),
249
253
  )
@@ -100,7 +100,7 @@ class TransferTrialData(TransferDataBase, GlobusMixin):
100
100
  tag_list = []
101
101
  tag_list += [[Tag.output(), Tag.dataset_inventory()]]
102
102
  tag_list += [[Tag.output(), Tag.asdf()]]
103
- tag_list += [[Tag.quality_data()]] # quality data is not tagged as OUTPUT
103
+ tag_list += [[Tag.output(), Tag.quality_data()]]
104
104
  tag_list += [[Tag.output(), Tag.quality_report()]]
105
105
  tag_list += [[Tag.output(), Tag.movie()]]
106
106
  return tag_list
@@ -135,10 +135,6 @@ class InputDatasetRecipeRunResponseMapping(ResponseMapping):
135
135
  return Unset
136
136
 
137
137
 
138
- class QualityResponseMapping(ResponseMapping):
139
- pass # TODO
140
-
141
-
142
138
  def make_default_recipe_run_status_response() -> RecipeRunStatusResponse:
143
139
  return RecipeRunStatusResponse(recipeRunStatusId=1)
144
140
 
@@ -57,24 +57,3 @@ def test_object_messages(publish_catalog_and_quality_messages_task):
57
57
  assert message.body.conversationId == str(task.recipe_run_id)
58
58
  assert message.body.objectType == object_type
59
59
  assert message.body.groupId == task.constants.dataset_id
60
-
61
-
62
- def test_quality_report_message(publish_catalog_and_quality_messages_task):
63
- """
64
- :Given: a PublishCatalogAndQualityMessages task
65
- :When: creating quality report message
66
- :Then: the attributes are correctly populated
67
- """
68
- # Given
69
- task, proposal_id = publish_catalog_and_quality_messages_task
70
- # When
71
- message = task.quality_report_message
72
- # Then
73
- assert isinstance(message, CreateQualityReportMessage)
74
- assert message.body.bucket == task.destination_bucket
75
- # objectName exists and can be evaluated as a valid path
76
- assert message.body.objectName
77
- _ = Path(message.body.objectName)
78
- assert message.body.datasetId == task.constants.dataset_id
79
- assert message.body.conversationId == str(task.recipe_run_id)
80
- assert message.body.incrementDatasetCatalogReceiptCount is True
@@ -1214,20 +1214,12 @@ def wavecal_weights(wavecal_input_wavelength) -> np.ndarray:
1214
1214
 
1215
1215
 
1216
1216
  @pytest.fixture(scope="session")
1217
- def wavecal_fit_result(wavecal_input_wavelength, wavecal_input_spectrum) -> FitResult:
1217
+ def wavecal_fit_result(wavecal_input_wavelength) -> FitResult:
1218
1218
  wavelength_params = WavelengthParameters(
1219
1219
  crpix=1, crval=10.0, dispersion=1, grating_constant=1, order=1, incident_light_angle=0
1220
1220
  )
1221
-
1222
- residuals = np.random.random(wavecal_input_wavelength.size)
1223
- residuals[-1] = np.nan
1224
- minimizer_result = MinimizerResult(residual=residuals)
1225
- return FitResult(
1226
- wavelength_parameters=wavelength_params,
1227
- minimizer_result=minimizer_result,
1228
- input_wavelength_vector=wavecal_input_wavelength,
1229
- input_spectrum=wavecal_input_spectrum,
1230
- )
1221
+ minimizer_result = MinimizerResult(residual=np.random.random(wavecal_input_wavelength.size))
1222
+ return FitResult(wavelength_parameters=wavelength_params, minimizer_result=minimizer_result)
1231
1223
 
1232
1224
 
1233
1225
  @pytest.mark.parametrize(
@@ -95,13 +95,10 @@ def test_submit_dataset_metadata(
95
95
  mocker.patch(
96
96
  "dkist_processing_common.tasks.mixin.metadata_store.GraphQLClient", new=fake_gql_client
97
97
  )
98
- # intercept these two GraphQLClient calls so they can be confirmed
98
+ # intercept this GraphQLClient call so it can be confirmed
99
99
  mocked_metadata_store_add_dataset_receipt_account = mocker.patch.object(
100
100
  metadata_store.MetadataStoreMixin, "metadata_store_add_dataset_receipt_account"
101
101
  )
102
- mocked_metadata_store_add_quality_data = mocker.patch.object(
103
- metadata_store.MetadataStoreMixin, "metadata_store_add_quality_data"
104
- )
105
102
  task = submit_dataset_metadata_task
106
103
 
107
104
  # When
@@ -109,4 +106,3 @@ def test_submit_dataset_metadata(
109
106
 
110
107
  # Then
111
108
  mocked_metadata_store_add_dataset_receipt_account.assert_called_once()
112
- mocked_metadata_store_add_quality_data.assert_called_once()
@@ -158,13 +158,12 @@ def complete_trial_output_task(
158
158
  task.write(asdf_file_obj, relative_path=asdf_file_name, tags=[Tag.output(), Tag.asdf()])
159
159
 
160
160
  # Write quality data
161
- # quality data is not tagged as OUTPUT
162
161
  quality_data_obj = uuid4().hex.encode("utf8")
163
162
  quality_data_name = "quality_data.json"
164
163
  task.write(
165
164
  quality_data_obj,
166
165
  relative_path=quality_data_name,
167
- tags=Tag.quality_data(),
166
+ tags=[Tag.output(), Tag.quality_data()],
168
167
  )
169
168
 
170
169
  # Write a quality report file
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 11.8.1rc1
3
+ Version: 11.8.2rc1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -21,7 +21,7 @@ Requires-Dist: dkist-processing-core==6.0.0
21
21
  Requires-Dist: dkist-processing-pac<4.0,>=3.1
22
22
  Requires-Dist: dkist-service-configuration<5.0,>=4.1.7
23
23
  Requires-Dist: dkist-spectral-lines<4.0,>=3.0.0
24
- Requires-Dist: solar-wavelength-calibration<3.0,>=2.0.0rc2
24
+ Requires-Dist: solar-wavelength-calibration<2.0,>=1.0
25
25
  Requires-Dist: globus-sdk<4.0.0,>=3.12.0
26
26
  Requires-Dist: gqlclient[pydantic]==1.2.3
27
27
  Requires-Dist: sqids==0.5.1
@@ -31,7 +31,7 @@ Requires-Dist: numpy>=1.26.4
31
31
  Requires-Dist: object-clerk==1.0.0
32
32
  Requires-Dist: pandas>=1.4.2
33
33
  Requires-Dist: pillow>=10.2.0
34
- Requires-Dist: pydantic>=2.7.2
34
+ Requires-Dist: pydantic>=2.0
35
35
  Requires-Dist: redis==6.4.0
36
36
  Requires-Dist: requests>=2.23
37
37
  Requires-Dist: scipy>=1.15.1
@@ -57,9 +57,9 @@ Requires-Dist: pytest; extra == "docs"
57
57
  Requires-Dist: towncrier<22.12.0; extra == "docs"
58
58
  Requires-Dist: dkist-sphinx-theme; extra == "docs"
59
59
  Provides-Extra: inventory
60
- Requires-Dist: dkist-inventory<2.0,>=1.11.1; extra == "inventory"
60
+ Requires-Dist: dkist-inventory==1.11.3rc2; extra == "inventory"
61
61
  Provides-Extra: asdf
62
- Requires-Dist: dkist-inventory[asdf]<2.0,>=1.11.1; extra == "asdf"
62
+ Requires-Dist: dkist-inventory[asdf]==1.11.3rc2; extra == "asdf"
63
63
  Provides-Extra: quality
64
64
  Requires-Dist: dkist-quality<3.0,>=2.0.0; extra == "quality"
65
65
 
@@ -7,8 +7,7 @@ README.rst
7
7
  bitbucket-pipelines.yml
8
8
  pyproject.toml
9
9
  changelog/.gitempty
10
- changelog/271.misc.2.rst
11
- changelog/271.misc.rst
10
+ changelog/276.feature.rst
12
11
  dkist_processing_common/__init__.py
13
12
  dkist_processing_common/config.py
14
13
  dkist_processing_common/manual.py
@@ -6,7 +6,7 @@ dkist-processing-core==6.0.0
6
6
  dkist-processing-pac<4.0,>=3.1
7
7
  dkist-service-configuration<5.0,>=4.1.7
8
8
  dkist-spectral-lines<4.0,>=3.0.0
9
- solar-wavelength-calibration<3.0,>=2.0.0rc2
9
+ solar-wavelength-calibration<2.0,>=1.0
10
10
  globus-sdk<4.0.0,>=3.12.0
11
11
  gqlclient[pydantic]==1.2.3
12
12
  sqids==0.5.1
@@ -16,7 +16,7 @@ numpy>=1.26.4
16
16
  object-clerk==1.0.0
17
17
  pandas>=1.4.2
18
18
  pillow>=10.2.0
19
- pydantic>=2.7.2
19
+ pydantic>=2.0
20
20
  redis==6.4.0
21
21
  requests>=2.23
22
22
  scipy>=1.15.1
@@ -24,7 +24,7 @@ sunpy>=3.0.0
24
24
  talus==1.3.4
25
25
 
26
26
  [asdf]
27
- dkist-inventory[asdf]<2.0,>=1.11.1
27
+ dkist-inventory[asdf]==1.11.3rc2
28
28
 
29
29
  [docs]
30
30
  sphinx
@@ -36,7 +36,7 @@ towncrier<22.12.0
36
36
  dkist-sphinx-theme
37
37
 
38
38
  [inventory]
39
- dkist-inventory<2.0,>=1.11.1
39
+ dkist-inventory==1.11.3rc2
40
40
 
41
41
  [quality]
42
42
  dkist-quality<3.0,>=2.0.0
@@ -29,7 +29,7 @@ dependencies = [
29
29
  "dkist-processing-pac >= 3.1, <4.0",
30
30
  "dkist-service-configuration >= 4.1.7, <5.0",
31
31
  "dkist-spectral-lines >= 3.0.0, <4.0",
32
- "solar-wavelength-calibration >= 2.0.0rc2, <3.0",
32
+ "solar-wavelength-calibration >= 1.0, <2.0",
33
33
  "globus-sdk >= 3.12.0, <4.0.0",
34
34
  "gqlclient[pydantic] == 1.2.3",
35
35
  "sqids == 0.5.1",
@@ -39,7 +39,7 @@ dependencies = [
39
39
  "object-clerk == 1.0.0",
40
40
  "pandas >= 1.4.2",
41
41
  "pillow >= 10.2.0",
42
- "pydantic >= 2.7.2",
42
+ "pydantic >= 2.0",
43
43
  "redis == 6.4.0",
44
44
  "requests >= 2.23",
45
45
  "scipy >= 1.15.1",
@@ -76,10 +76,10 @@ docs = [
76
76
  "dkist-sphinx-theme",
77
77
  ]
78
78
  inventory = [
79
- "dkist-inventory >= 1.11.1, <2.0",
79
+ "dkist-inventory == 1.11.3rc2",
80
80
  ]
81
81
  asdf = [
82
- "dkist-inventory[asdf] >= 1.11.1, <2.0",
82
+ "dkist-inventory[asdf] == 1.11.3rc2",
83
83
  ]
84
84
  quality = [
85
85
  "dkist-quality >= 2.0.0, <3.0",
@@ -1 +0,0 @@
1
- Bump minimum version of `pydantic` to 2.7.2 to avoid install failures for python versions >= 3.12.
@@ -1 +0,0 @@
1
- Move `solar-wavelength-calibration` dep to 2.0.0 and make use of new helper properties in that release.