dkist-processing-common 11.7.0rc6__tar.gz → 11.8.0rc1__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 (143) hide show
  1. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/CHANGELOG.rst +25 -0
  2. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/PKG-INFO +3 -3
  3. dkist_processing_common-11.8.0rc1/changelog/245.feature.1.rst +1 -0
  4. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/trial_catalog.py +38 -0
  5. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/mock_metadata_store.py +39 -0
  6. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_input_dataset.py +1 -37
  7. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_trial_catalog.py +72 -2
  8. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common.egg-info/PKG-INFO +3 -3
  9. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common.egg-info/SOURCES.txt +1 -6
  10. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common.egg-info/requires.txt +2 -2
  11. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/pyproject.toml +2 -2
  12. dkist_processing_common-11.7.0rc6/changelog/267.feature.1.rst +0 -1
  13. dkist_processing_common-11.7.0rc6/changelog/267.feature.2.rst +0 -1
  14. dkist_processing_common-11.7.0rc6/changelog/267.feature.rst +0 -1
  15. dkist_processing_common-11.7.0rc6/changelog/267.misc.rst +0 -1
  16. dkist_processing_common-11.7.0rc6/changelog/267.removal.1.rst +0 -2
  17. dkist_processing_common-11.7.0rc6/changelog/267.removal.rst +0 -1
  18. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/.gitignore +0 -0
  19. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/.pre-commit-config.yaml +0 -0
  20. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/.readthedocs.yml +0 -0
  21. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/.snyk +0 -0
  22. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/README.rst +0 -0
  23. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/bitbucket-pipelines.yml +0 -0
  24. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/changelog/.gitempty +0 -0
  25. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/__init__.py +0 -0
  26. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/_util/__init__.py +0 -0
  27. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/_util/constants.py +0 -0
  28. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/_util/graphql.py +0 -0
  29. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/_util/scratch.py +0 -0
  30. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/_util/tags.py +0 -0
  31. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/__init__.py +0 -0
  32. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/array.py +0 -0
  33. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/asdf.py +0 -0
  34. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/basemodel.py +0 -0
  35. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/bytes.py +0 -0
  36. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/fits.py +0 -0
  37. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/iobase.py +0 -0
  38. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/json.py +0 -0
  39. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/path.py +0 -0
  40. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/quality.py +0 -0
  41. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/codecs/str.py +0 -0
  42. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/config.py +0 -0
  43. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/fonts/Lato-Regular.ttf +0 -0
  44. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/fonts/__init__.py +0 -0
  45. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/manual.py +0 -0
  46. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/__init__.py +0 -0
  47. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/constants.py +0 -0
  48. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/dkist_location.py +0 -0
  49. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/fits_access.py +0 -0
  50. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/flower_pot.py +0 -0
  51. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/fried_parameter.py +0 -0
  52. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/graphql.py +0 -0
  53. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/input_dataset.py +0 -0
  54. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/message.py +0 -0
  55. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/message_queue_binding.py +0 -0
  56. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/metric_code.py +0 -0
  57. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/parameters.py +0 -0
  58. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/quality.py +0 -0
  59. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/tags.py +0 -0
  60. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/task_name.py +0 -0
  61. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/telemetry.py +0 -0
  62. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/models/wavelength.py +0 -0
  63. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/__init__.py +0 -0
  64. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/average_bud.py +0 -0
  65. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/cs_step.py +0 -0
  66. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/dsps_repeat.py +0 -0
  67. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/experiment_id_bud.py +0 -0
  68. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/id_bud.py +0 -0
  69. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/l0_fits_access.py +0 -0
  70. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/l1_fits_access.py +0 -0
  71. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/near_bud.py +0 -0
  72. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/observing_program_id_bud.py +0 -0
  73. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/proposal_id_bud.py +0 -0
  74. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/quality.py +0 -0
  75. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/retarder.py +0 -0
  76. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/single_value_single_key_flower.py +0 -0
  77. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/task.py +0 -0
  78. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/time.py +0 -0
  79. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/unique_bud.py +0 -0
  80. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/parsers/wavelength.py +0 -0
  81. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/__init__.py +0 -0
  82. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/assemble_movie.py +0 -0
  83. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/base.py +0 -0
  84. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/l1_output_data.py +0 -0
  85. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/__init__.py +0 -0
  86. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/globus.py +0 -0
  87. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/interservice_bus.py +0 -0
  88. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/metadata_store.py +0 -0
  89. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/object_store.py +0 -0
  90. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/quality/__init__.py +0 -0
  91. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/quality/_base.py +0 -0
  92. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/mixin/quality/_metrics.py +0 -0
  93. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/output_data_base.py +0 -0
  94. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/parse_l0_input_data.py +0 -0
  95. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/quality_metrics.py +0 -0
  96. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/teardown.py +0 -0
  97. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/transfer_input_data.py +0 -0
  98. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/trial_output_data.py +0 -0
  99. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tasks/write_l1.py +0 -0
  100. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/__init__.py +0 -0
  101. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/conftest.py +0 -0
  102. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_assemble_movie.py +0 -0
  103. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_assemble_quality.py +0 -0
  104. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_base.py +0 -0
  105. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_codecs.py +0 -0
  106. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_constants.py +0 -0
  107. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_cs_step.py +0 -0
  108. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_dkist_location.py +0 -0
  109. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_fits_access.py +0 -0
  110. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_flower_pot.py +0 -0
  111. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_fried_parameter.py +0 -0
  112. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_interservice_bus.py +0 -0
  113. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_interservice_bus_mixin.py +0 -0
  114. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_manual_processing.py +0 -0
  115. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_output_data_base.py +0 -0
  116. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_parameters.py +0 -0
  117. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_parse_l0_input_data.py +0 -0
  118. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_publish_catalog_messages.py +0 -0
  119. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_quality.py +0 -0
  120. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_quality_mixin.py +0 -0
  121. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_scratch.py +0 -0
  122. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_stems.py +0 -0
  123. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_submit_dataset_metadata.py +0 -0
  124. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_tags.py +0 -0
  125. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_task_name.py +0 -0
  126. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_task_parsing.py +0 -0
  127. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_teardown.py +0 -0
  128. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_transfer_input_data.py +0 -0
  129. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_transfer_l1_output_data.py +0 -0
  130. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_trial_output_data.py +0 -0
  131. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_workflow_task_base.py +0 -0
  132. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common/tests/test_write_l1.py +0 -0
  133. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common.egg-info/dependency_links.txt +0 -0
  134. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/dkist_processing_common.egg-info/top_level.txt +0 -0
  135. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/Makefile +0 -0
  136. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/changelog.rst +0 -0
  137. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/conf.py +0 -0
  138. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/index.rst +0 -0
  139. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/landing_page.rst +0 -0
  140. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/make.bat +0 -0
  141. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/docs/requirements.txt +0 -0
  142. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/licenses/LICENSE.rst +0 -0
  143. {dkist_processing_common-11.7.0rc6 → dkist_processing_common-11.8.0rc1}/setup.cfg +0 -0
@@ -1,3 +1,28 @@
1
+ v11.7.0 (2025-10-09)
2
+ ====================
3
+
4
+ Features
5
+ --------
6
+
7
+ - Add new buds to parsing for what will become the dataset extras. (`#267 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/267>`__)
8
+ - Add new bud type TaskContributingIdsBud, based on ContributingIdsBud, for for specific task types. (`#267 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/267>`__)
9
+ - Add new bud types TaskAverageBud and TaskBeginDateBud, which is based on new TaskDatetimeBudBase. (`#267 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/267>`__)
10
+
11
+
12
+ Removals
13
+ --------
14
+
15
+ - Remove IdBud, which is just a TaskUniqueBud with the task set to observe, and therefore is not needed. (`#267 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/267>`__)
16
+ - Remove the `_set_metadata_key_value` method from FitsAccessBase. Instead of using `setattr`, attributes
17
+ are assigned explicitly in access classes using `MetadataKey` members in place of header key strings. (`#267 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/267>`__)
18
+
19
+
20
+ Misc
21
+ ----
22
+
23
+ - Rename TimeFlowerBase and TaskTimeBudBase to RoundTimeFlowerBase and TaskRoundTimeBudBase, respectively. (`#267 <https://bitbucket.org/dkistdc/dkist-processing-common/pull-requests/267>`__)
24
+
25
+
1
26
  v11.6.0 (2025-09-26)
2
27
  ====================
3
28
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 11.7.0rc6
3
+ Version: 11.8.0rc1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -57,9 +57,9 @@ Requires-Dist: pytest; extra == "docs"
57
57
  Requires-Dist: towncrier<22.12.0; extra == "docs"
58
58
  Requires-Dist: dkist-sphinx-theme; extra == "docs"
59
59
  Provides-Extra: inventory
60
- Requires-Dist: dkist-inventory<2.0,>=1.6.0; extra == "inventory"
60
+ Requires-Dist: dkist-inventory<2.0,>=1.11.0; extra == "inventory"
61
61
  Provides-Extra: asdf
62
- Requires-Dist: dkist-inventory[asdf]<2.0,>=1.6.0; extra == "asdf"
62
+ Requires-Dist: dkist-inventory[asdf]<2.0,>=1.11.0; extra == "asdf"
63
63
  Provides-Extra: quality
64
64
  Requires-Dist: dkist-quality<3.0,>=2.0.0; extra == "quality"
65
65
 
@@ -0,0 +1 @@
1
+ Add parameters and their associated values relevant to a particular processing pipeline run to the metadata ASDF file generated in trial workflows.
@@ -5,15 +5,18 @@ import logging
5
5
  from datetime import datetime
6
6
  from itertools import chain
7
7
  from pathlib import Path
8
+ from typing import Any
8
9
  from typing import Generator
9
10
  from uuid import uuid4
10
11
 
11
12
  from dkist_processing_common.codecs.asdf import asdf_fileobj_encoder
13
+ from dkist_processing_common.codecs.basemodel import basemodel_decoder
12
14
  from dkist_processing_common.codecs.fits import fits_access_decoder
13
15
  from dkist_processing_common.codecs.json import json_encoder
14
16
  from dkist_processing_common.codecs.path import path_decoder
15
17
  from dkist_processing_common.codecs.quality import quality_data_decoder
16
18
  from dkist_processing_common.models.fits_access import FitsAccessBase
19
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
17
20
  from dkist_processing_common.models.tags import Tag
18
21
  from dkist_processing_common.tasks.output_data_base import OutputDataBase
19
22
 
@@ -138,11 +141,15 @@ class CreateTrialAsdf(OutputDataBase):
138
141
 
139
142
  def run(self) -> None:
140
143
  """Generate an ASDF file simulating the ASDF file that would be produced when cataloging the dataset."""
144
+ with self.telemetry_span("Collate input dataset parameters"):
145
+ parameters = self.parse_input_dataset_parameters()
146
+
141
147
  with self.telemetry_span("Generate ASDF tree"):
142
148
  tree = asdf_tree_from_filenames(
143
149
  filenames=self.absolute_output_frame_paths,
144
150
  hdu=1, # compressed
145
151
  relative_to=self.scratch.workflow_base_path,
152
+ parameters=parameters,
146
153
  )
147
154
 
148
155
  trial_history = [
@@ -169,6 +176,37 @@ class CreateTrialAsdf(OutputDataBase):
169
176
  ),
170
177
  )
171
178
 
179
+ def parse_input_dataset_parameters(self) -> list[dict[str, Any]]:
180
+ """
181
+ Return the parameters associated with the dataset.
182
+
183
+ Returns
184
+ -------
185
+ list[dict[str, Any]]
186
+ A list of dictionaries, each containing a parameter name and its values.
187
+
188
+ Raises
189
+ ------
190
+ ValueError
191
+ If there is not exactly one ``InputDatasetPartDocumentList`` found.
192
+ """
193
+ part_docs_iter = self.read(
194
+ tags=Tag.input_dataset_parameters(),
195
+ decoder=basemodel_decoder,
196
+ model=InputDatasetPartDocumentList,
197
+ )
198
+ docs = list(part_docs_iter)
199
+
200
+ if not docs:
201
+ logger.warning("No parameter list decoded from files")
202
+ return []
203
+
204
+ if len(docs) > 1:
205
+ raise ValueError(f"Expected 1 parameter list, found {len(docs)}")
206
+
207
+ parameters = docs[0].model_dump(by_alias=True).get("doc_list", [])
208
+ return parameters
209
+
172
210
 
173
211
  class CreateTrialQualityReport(OutputDataBase):
174
212
  """
@@ -6,6 +6,7 @@ import json
6
6
  from abc import ABC
7
7
  from abc import abstractmethod
8
8
  from datetime import datetime
9
+ from datetime import timedelta
9
10
  from pathlib import Path
10
11
  from uuid import uuid4
11
12
 
@@ -234,3 +235,41 @@ def fake_gql_client():
234
235
  Convenience fixture for default mock GQL client. To customize, use fake_gql_client_factory.
235
236
  """
236
237
  return fake_gql_client_factory()
238
+
239
+
240
+ def input_dataset_parameters_part_factory(
241
+ parameter_count: int = 1,
242
+ parameter_value_count: int = 1,
243
+ has_date: bool = False,
244
+ has_file: bool = False,
245
+ ) -> list[dict]:
246
+ """Create a mock InputDatasetPartDocumentList with parameters."""
247
+ result = [
248
+ {
249
+ "parameterName": uuid4().hex[:6],
250
+ "parameterValues": [
251
+ {"parameterValueId": i, "parameterValue": json.dumps(uuid4().hex)}
252
+ for i in range(parameter_value_count)
253
+ ],
254
+ }
255
+ for _ in range(parameter_count)
256
+ ]
257
+ if has_date:
258
+ base = datetime(2018, 9, 14, 0, 0, 0) # This date is before any possible start dates
259
+ for parameter_index, data in enumerate(result):
260
+ for item in data["parameterValues"]:
261
+ dt = base + timedelta(days=parameter_index)
262
+ item["parameterValueStartDate"] = dt.isoformat()
263
+ if has_file:
264
+ for data in result:
265
+ param_list = data["parameterValues"]
266
+ for item in param_list:
267
+ item["parameterValue"] = json.dumps(
268
+ {
269
+ "__file__": {
270
+ "bucket": "data",
271
+ "objectKey": f"parameters/{data['parameterName']}/{uuid4().hex}.dat",
272
+ }
273
+ }
274
+ )
275
+ return result
@@ -1,5 +1,4 @@
1
1
  import json
2
- from datetime import datetime
3
2
  from typing import Any
4
3
  from uuid import uuid4
5
4
 
@@ -8,6 +7,7 @@ import pytest
8
7
  from dkist_processing_common.codecs.basemodel import basemodel_decoder
9
8
  from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
10
9
  from dkist_processing_common.models.tags import Tag
10
+ from dkist_processing_common.tests.mock_metadata_store import input_dataset_parameters_part_factory
11
11
 
12
12
 
13
13
  def input_dataset_frames_part_factory(bucket_count: int = 1) -> list[dict]:
@@ -25,42 +25,6 @@ def flatten_frame_parts(frame_parts: list[dict]) -> list[tuple[str, str]]:
25
25
  return result
26
26
 
27
27
 
28
- def input_dataset_parameters_part_factory(
29
- parameter_count: int = 1,
30
- parameter_value_count: int = 1,
31
- has_date: bool = False,
32
- has_file: bool = False,
33
- ) -> list[dict]:
34
- result = [
35
- {
36
- "parameterName": uuid4().hex[:6],
37
- "parameterValues": [
38
- {"parameterValueId": i, "parameterValue": json.dumps(uuid4().hex)}
39
- for i in range(parameter_value_count)
40
- ],
41
- }
42
- for _ in range(parameter_count)
43
- ]
44
- if has_date:
45
- for data in result:
46
- param_list = data["parameterValues"]
47
- for item in param_list:
48
- item["parameterValueStartDate"] = datetime(2022, 9, 14).isoformat()
49
- if has_file:
50
- for data in result:
51
- param_list = data["parameterValues"]
52
- for item in param_list:
53
- item["parameterValue"] = json.dumps(
54
- {
55
- "__file__": {
56
- "bucket": "data",
57
- "objectKey": f"parameters/{data['parameterName']}/{uuid4().hex}.dat",
58
- }
59
- }
60
- )
61
- return result
62
-
63
-
64
28
  @pytest.mark.parametrize(
65
29
  "input_dataset_parts",
66
30
  [
@@ -12,14 +12,30 @@ from sqids import Sqids
12
12
 
13
13
  from dkist_processing_common._util.scratch import WorkflowFileSystem
14
14
  from dkist_processing_common.codecs.asdf import asdf_decoder
15
+ from dkist_processing_common.codecs.basemodel import basemodel_encoder
15
16
  from dkist_processing_common.codecs.bytes import bytes_decoder
16
17
  from dkist_processing_common.codecs.fits import fits_hdulist_encoder
17
18
  from dkist_processing_common.codecs.json import json_decoder
18
19
  from dkist_processing_common.codecs.quality import quality_data_encoder
20
+ from dkist_processing_common.models.input_dataset import InputDatasetParameter
21
+ from dkist_processing_common.models.input_dataset import InputDatasetPartDocumentList
19
22
  from dkist_processing_common.models.tags import Tag
20
23
  from dkist_processing_common.tasks import CreateTrialAsdf
21
24
  from dkist_processing_common.tasks import CreateTrialDatasetInventory
22
25
  from dkist_processing_common.tasks import CreateTrialQualityReport
26
+ from dkist_processing_common.tests.mock_metadata_store import input_dataset_parameters_part_factory
27
+
28
+
29
+ @pytest.fixture()
30
+ def mock_input_dataset_parts() -> InputDatasetPartDocumentList:
31
+ """An InputDatasetPartDocumentList with two parameters, each with one value and a date."""
32
+ raw = input_dataset_parameters_part_factory(
33
+ parameter_count=2,
34
+ parameter_value_count=1,
35
+ has_date=True,
36
+ has_file=False,
37
+ )
38
+ return InputDatasetPartDocumentList.model_validate({"doc_list": raw})
23
39
 
24
40
 
25
41
  @pytest.fixture()
@@ -41,6 +57,24 @@ def scratch_with_l1_frames(recipe_run_id, tmp_path) -> WorkflowFileSystem:
41
57
  scratch.write(
42
58
  file_obj, tags=[Tag.output(), Tag.frame()], relative_path=f"{uuid4().hex}.dat"
43
59
  )
60
+
61
+ return scratch
62
+
63
+
64
+ @pytest.fixture()
65
+ def scratch_with_l1_frames_and_parameters(
66
+ scratch_with_l1_frames, mock_input_dataset_parts
67
+ ) -> WorkflowFileSystem:
68
+ """Scratch instance for a recipe run id with tagged L1 frames and input parameters."""
69
+ scratch = scratch_with_l1_frames
70
+
71
+ # Write validated Pydantic model bytes expected by InputDatasetPartDocumentList
72
+ file_obj = basemodel_encoder(mock_input_dataset_parts)
73
+ scratch.write(
74
+ file_obj,
75
+ tags=Tag.input_dataset_parameters(),
76
+ relative_path=f"{uuid4().hex}.json",
77
+ )
44
78
  return scratch
45
79
 
46
80
 
@@ -85,6 +119,22 @@ def create_trial_asdf_task(
85
119
  task._purge()
86
120
 
87
121
 
122
+ @pytest.fixture(scope="function")
123
+ def create_trial_asdf_task_with_params(
124
+ recipe_run_id, tmp_path, scratch_with_l1_frames_and_parameters, fake_constants_db
125
+ ) -> CreateTrialAsdf:
126
+ """An instance of CreateTrialAsdf with L1 frames and input parameters tagged in scratch."""
127
+ task = CreateTrialAsdf(
128
+ recipe_run_id=recipe_run_id,
129
+ workflow_name="trial_asdf",
130
+ workflow_version="trial_asdf_version",
131
+ )
132
+ task.scratch = scratch_with_l1_frames_and_parameters
133
+ task.constants._update(fake_constants_db)
134
+ yield task
135
+ task._purge()
136
+
137
+
88
138
  @pytest.fixture()
89
139
  def create_trial_quality_report_task(
90
140
  recipe_run_id, tmp_path, fake_constants_db
@@ -143,25 +193,32 @@ def test_create_trial_dataset_inventory(create_trial_dataset_inventory_task):
143
193
  assert len(inventory) > 20 # a bunch
144
194
 
145
195
 
146
- def test_create_trial_asdf(create_trial_asdf_task, recipe_run_id):
196
+ @pytest.mark.parametrize("with_params", [False, True], ids=["no_params", "with_params"])
197
+ def test_create_trial_asdf(with_params, request, recipe_run_id, mock_input_dataset_parts):
147
198
  """
148
199
  :Given: An instance of CreateTrialAsdf with L1 frames tagged in scratch
149
200
  :When: CreateTrialAsdf is run
150
201
  :Then: An asdf file for the dataset is tagged in scratch
151
202
  """
152
- task = create_trial_asdf_task
203
+ task = request.getfixturevalue(
204
+ "create_trial_asdf_task_with_params" if with_params else "create_trial_asdf_task"
205
+ )
153
206
  # When
154
207
  task()
208
+
155
209
  # Then
156
210
  asdf_tags = [Tag.output(), Tag.asdf()]
157
211
  filepaths = list(task.scratch.find_all(tags=asdf_tags))
158
212
  assert len(filepaths) == 1
159
213
  dataset_id = Sqids(min_length=6, alphabet=ascii_uppercase).encode([recipe_run_id])
160
214
  assert filepaths[0].name == f"INSTRUMENT_L1_20240416T160000_{dataset_id}_metadata.asdf"
215
+
161
216
  results = list(task.read(tags=asdf_tags, decoder=asdf_decoder))
162
217
  assert len(results) == 1
218
+
163
219
  tree = results[0]
164
220
  assert isinstance(tree, dict)
221
+
165
222
  for file_name in tree["dataset"].files.filenames:
166
223
  # This is a slightly better than check that `not Path(file_name).is_absolute()` because it confirms
167
224
  # we've correctly stripped the path of *all* parents (not just those that start at root).
@@ -169,6 +226,19 @@ def test_create_trial_asdf(create_trial_asdf_task, recipe_run_id):
169
226
  # `scratch.workflow_base_path`
170
227
  assert Path(file_name).name == file_name
171
228
 
229
+ # Only check parameters when present
230
+ ds = tree["dataset"]
231
+ assert "parameters" in ds.meta
232
+ parameters = ds.meta["parameters"]
233
+ assert isinstance(parameters, list)
234
+ if with_params:
235
+ assert parameters, f"ASDF tree must include input parameters: {parameters}"
236
+ assert len(parameters) == len(mock_input_dataset_parts.doc_list)
237
+ for param in parameters:
238
+ assert InputDatasetParameter.model_validate(param) in mock_input_dataset_parts.doc_list
239
+ else:
240
+ assert ds.meta["parameters"] == []
241
+
172
242
 
173
243
  def test_create_trial_quality_report(create_trial_quality_report_task):
174
244
  """
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dkist-processing-common
3
- Version: 11.7.0rc6
3
+ Version: 11.8.0rc1
4
4
  Summary: Common task classes used by the DKIST science data processing pipelines
5
5
  Author-email: NSO / AURA <dkistdc@nso.edu>
6
6
  License: BSD-3-Clause
@@ -57,9 +57,9 @@ Requires-Dist: pytest; extra == "docs"
57
57
  Requires-Dist: towncrier<22.12.0; extra == "docs"
58
58
  Requires-Dist: dkist-sphinx-theme; extra == "docs"
59
59
  Provides-Extra: inventory
60
- Requires-Dist: dkist-inventory<2.0,>=1.6.0; extra == "inventory"
60
+ Requires-Dist: dkist-inventory<2.0,>=1.11.0; extra == "inventory"
61
61
  Provides-Extra: asdf
62
- Requires-Dist: dkist-inventory[asdf]<2.0,>=1.6.0; extra == "asdf"
62
+ Requires-Dist: dkist-inventory[asdf]<2.0,>=1.11.0; extra == "asdf"
63
63
  Provides-Extra: quality
64
64
  Requires-Dist: dkist-quality<3.0,>=2.0.0; extra == "quality"
65
65
 
@@ -7,12 +7,7 @@ README.rst
7
7
  bitbucket-pipelines.yml
8
8
  pyproject.toml
9
9
  changelog/.gitempty
10
- changelog/267.feature.1.rst
11
- changelog/267.feature.2.rst
12
- changelog/267.feature.rst
13
- changelog/267.misc.rst
14
- changelog/267.removal.1.rst
15
- changelog/267.removal.rst
10
+ changelog/245.feature.1.rst
16
11
  dkist_processing_common/__init__.py
17
12
  dkist_processing_common/config.py
18
13
  dkist_processing_common/manual.py
@@ -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.6.0
27
+ dkist-inventory[asdf]<2.0,>=1.11.0
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.6.0
39
+ dkist-inventory<2.0,>=1.11.0
40
40
 
41
41
  [quality]
42
42
  dkist-quality<3.0,>=2.0.0
@@ -76,10 +76,10 @@ docs = [
76
76
  "dkist-sphinx-theme",
77
77
  ]
78
78
  inventory = [
79
- "dkist-inventory >= 1.6.0, <2.0",
79
+ "dkist-inventory >= 1.11.0, <2.0",
80
80
  ]
81
81
  asdf = [
82
- "dkist-inventory[asdf] >= 1.6.0, <2.0",
82
+ "dkist-inventory[asdf] >= 1.11.0, <2.0",
83
83
  ]
84
84
  quality = [
85
85
  "dkist-quality >= 2.0.0, <3.0",
@@ -1 +0,0 @@
1
- Add new bud types TaskAverageBud and TaskBeginDateBud, which is based on new TaskDatetimeBudBase.
@@ -1 +0,0 @@
1
- Add new bud type TaskContributingIdsBud, based on ContributingIdsBud, for for specific task types.
@@ -1 +0,0 @@
1
- Add new buds to parsing for what will become the dataset extras.
@@ -1 +0,0 @@
1
- Rename TimeFlowerBase and TaskTimeBudBase to RoundTimeFlowerBase and TaskRoundTimeBudBase, respectively.
@@ -1,2 +0,0 @@
1
- Remove the `_set_metadata_key_value` method from FitsAccessBase. Instead of using `setattr`, attributes
2
- are assigned explicitly in access classes using `MetadataKey` members in place of header key strings.
@@ -1 +0,0 @@
1
- Remove IdBud, which is just a TaskUniqueBud with the task set to observe, and therefore is not needed.