dkist 1.9.0__tar.gz → 1.9.2__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 (233) hide show
  1. {dkist-1.9.0 → dkist-1.9.2}/.cruft.json +11 -3
  2. dkist-1.9.2/.github/workflows/build_workshop.yml +50 -0
  3. {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/prepare-release.yml +1 -1
  4. {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/sub_package_update.yml +33 -17
  5. {dkist-1.9.0 → dkist-1.9.2}/.pre-commit-config.yaml +1 -1
  6. dkist-1.9.2/.ruff.toml +122 -0
  7. {dkist-1.9.0 → dkist-1.9.2}/CHANGELOG.rst +32 -0
  8. {dkist-1.9.0/dkist.egg-info → dkist-1.9.2}/PKG-INFO +11 -5
  9. {dkist-1.9.0 → dkist-1.9.2}/changelog/README.rst +1 -0
  10. {dkist-1.9.0 → dkist-1.9.2}/dkist/__init__.py +1 -1
  11. {dkist-1.9.0 → dkist-1.9.2}/dkist/_version.py +2 -2
  12. {dkist-1.9.0 → dkist-1.9.2}/dkist/conftest.py +18 -0
  13. dkist-1.9.2/dkist/data/api_search_values.json +1 -0
  14. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/sample.py +1 -1
  15. dkist-1.9.2/dkist/data/test/croppable_cryo.asdf.gz +0 -0
  16. dkist-1.9.2/dkist/data/test/croppable_visp.asdf.gz +0 -0
  17. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/loader.py +85 -7
  18. dkist-1.9.2/dkist/dataset/tests/test_crop_dataset.py +185 -0
  19. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/test_dataset.py +14 -0
  20. dkist-1.9.2/dkist/dataset/tests/test_load_dataset.py +203 -0
  21. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/test_tiled_dataset.py +8 -4
  22. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/utils.py +18 -7
  23. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/loaders.py +1 -1
  24. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/attrs.py +27 -7
  25. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/client.py +1 -1
  26. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/endpoints.py +1 -1
  27. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/test_transfer.py +7 -7
  28. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/transfer.py +2 -2
  29. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/test_benchmarks.py +10 -0
  30. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/inventory.py +1 -1
  31. {dkist-1.9.0 → dkist-1.9.2/dkist.egg-info}/PKG-INFO +11 -5
  32. {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/SOURCES.txt +6 -4
  33. {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/requires.txt +3 -2
  34. {dkist-1.9.0 → dkist-1.9.2}/docs/index.rst +0 -1
  35. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/index.md +2 -2
  36. {dkist-1.9.0 → dkist-1.9.2}/pyproject.toml +58 -41
  37. {dkist-1.9.0 → dkist-1.9.2}/pytest.ini +1 -0
  38. dkist-1.9.2/tools/build_workshop_materials.py +123 -0
  39. {dkist-1.9.0 → dkist-1.9.2}/tox.ini +1 -0
  40. dkist-1.9.0/.ruff.toml +0 -78
  41. dkist-1.9.0/dkist/data/api_search_values.json +0 -1
  42. dkist-1.9.0/dkist/dataset/tests/test_load_dataset.py +0 -116
  43. dkist-1.9.0/docs/tutorial/1_astropy_and_sunpy_NOTES.md +0 -239
  44. dkist-1.9.0/docs/tutorial/2_search_and_asdf_download_NOTES.md +0 -67
  45. dkist-1.9.0/docs/tutorial/3_the_dataset_NOTES.md +0 -178
  46. {dkist-1.9.0 → dkist-1.9.2}/.circleci/codecov_upload.sh +0 -0
  47. {dkist-1.9.0 → dkist-1.9.2}/.circleci/config.yml +0 -0
  48. {dkist-1.9.0 → dkist-1.9.2}/.circleci/early_exit.sh +0 -0
  49. {dkist-1.9.0 → dkist-1.9.2}/.codecov.yaml +0 -0
  50. {dkist-1.9.0 → dkist-1.9.2}/.codespell-dict.txt +0 -0
  51. {dkist-1.9.0 → dkist-1.9.2}/.codespellrc +0 -0
  52. {dkist-1.9.0 → dkist-1.9.2}/.coveragerc +0 -0
  53. {dkist-1.9.0 → dkist-1.9.2}/.flake8 +0 -0
  54. {dkist-1.9.0 → dkist-1.9.2}/.github/ISSUE_TEMPLATE/BUG_REPORT.md +0 -0
  55. {dkist-1.9.0 → dkist-1.9.2}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
  56. {dkist-1.9.0 → dkist-1.9.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  57. {dkist-1.9.0 → dkist-1.9.2}/.github/dependabot.yml +0 -0
  58. {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/codspeed.yml +0 -0
  59. {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/main.yml +0 -0
  60. {dkist-1.9.0 → dkist-1.9.2}/.gitignore +0 -0
  61. {dkist-1.9.0 → dkist-1.9.2}/.gitmodules +0 -0
  62. {dkist-1.9.0 → dkist-1.9.2}/.isort.cfg +0 -0
  63. {dkist-1.9.0 → dkist-1.9.2}/.readthedocs.yaml +0 -0
  64. {dkist-1.9.0 → dkist-1.9.2}/.rtd-environment.yml +0 -0
  65. {dkist-1.9.0 → dkist-1.9.2}/CODE_OF_CONDUCT.md +0 -0
  66. {dkist-1.9.0 → dkist-1.9.2}/CONTRIBUTING.md +0 -0
  67. {dkist-1.9.0 → dkist-1.9.2}/LICENSE.rst +0 -0
  68. {dkist-1.9.0 → dkist-1.9.2}/MANIFEST.in +0 -0
  69. {dkist-1.9.0 → dkist-1.9.2}/README.rst +0 -0
  70. {dkist-1.9.0 → dkist-1.9.2}/conftest.py +0 -0
  71. {dkist-1.9.0 → dkist-1.9.2}/dkist/config/__init__.py +0 -0
  72. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/README.rst +0 -0
  73. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/VISP_HEADER.hdr +0 -0
  74. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/__init__.py +0 -0
  75. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/_sample.py +0 -0
  76. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/5d_gwcs.asdf +0 -0
  77. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/AGLKO-inv.ecsv +0 -0
  78. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.000010_s.fits +0 -0
  79. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.020010_s.fits +0 -0
  80. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.030011_s.fits +0 -0
  81. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.040010_s.fits +0 -0
  82. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.050010_s.fits +0 -0
  83. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.060010_s.fits +0 -0
  84. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.080010_s.fits +0 -0
  85. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.090010_s.fits +0 -0
  86. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.100010_s.fits +0 -0
  87. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.110010_s.fits +0 -0
  88. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.120010_s.fits +0 -0
  89. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/eit_test_dataset.asdf +0 -0
  90. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/__init__.py +0 -0
  91. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-0.1.0.asdf +0 -0
  92. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-0.2.0.asdf +0 -0
  93. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-0.3.0.asdf +0 -0
  94. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-1.0.0.asdf +0 -0
  95. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-1.1.0.asdf +0 -0
  96. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-1.2.0.asdf +0 -0
  97. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/globus_operation_ls_response.json +0 -0
  98. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/globus_search_response.json +0 -0
  99. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/large_vbi.asdf.gz +0 -0
  100. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/large_visp.asdf.gz +0 -0
  101. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/0.fits +0 -0
  102. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/1.fits +0 -0
  103. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/2.fits +0 -0
  104. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/test_visp.asdf +0 -0
  105. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_old_wcs_BRMQY.asdf +0 -0
  106. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.0.0.asdf +0 -0
  107. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.1.0.asdf +0 -0
  108. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.2.0.asdf +0 -0
  109. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/visp_no_headers.asdf.gz +0 -0
  110. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/tests/__init__.py +0 -0
  111. {dkist-1.9.0 → dkist-1.9.2}/dkist/data/tests/test_sample.py +0 -0
  112. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/__init__.py +0 -0
  113. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/dataset.py +0 -0
  114. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/__init__.py +0 -0
  115. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/test_plotting.py +0 -0
  116. {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tiled_dataset.py +0 -0
  117. {dkist-1.9.0 → dkist-1.9.2}/dkist/dkist.cfg +0 -0
  118. {dkist-1.9.0 → dkist-1.9.2}/dkist/extern/__init__.py +0 -0
  119. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/__init__.py +0 -0
  120. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/__init__.py +0 -0
  121. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/__init__.py +0 -0
  122. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/dataset.py +0 -0
  123. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/file_manager.py +0 -0
  124. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/models.py +0 -0
  125. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/tiled_dataset.py +0 -0
  126. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/entry_points.py +0 -0
  127. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/__init__.py +0 -0
  128. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-0.9.0.yaml +0 -0
  129. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-1.0.0.yaml +0 -0
  130. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-1.1.0.yaml +0 -0
  131. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-1.2.0.yaml +0 -0
  132. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.0.0.yaml +0 -0
  133. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.1.0.yaml +0 -0
  134. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.2.0.yaml +0 -0
  135. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.3.0.yaml +0 -0
  136. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/asymmetric_mapping_model-1.0.0.yaml +0 -0
  137. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/asymmetric_mapping_model-1.1.0.yaml +0 -0
  138. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/coupled_compound_model-1.0.0.yaml +0 -0
  139. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/coupled_compound_model-1.1.0.yaml +0 -0
  140. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-0.1.0.yaml +0 -0
  141. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-0.2.0.yaml +0 -0
  142. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-0.3.0.yaml +0 -0
  143. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-1.0.0.yaml +0 -0
  144. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-1.1.0.yaml +0 -0
  145. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/file_manager-1.0.0.yaml +0 -0
  146. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/ravel_model-1.0.0.yaml +0 -0
  147. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/ravel_model-1.1.0.yaml +0 -0
  148. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/tiled_dataset-0.1.0.yaml +0 -0
  149. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/tiled_dataset-1.0.0.yaml +0 -0
  150. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/varying_celestial_transform-1.0.0.yaml +0 -0
  151. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/varying_celestial_transform-1.1.0.yaml +0 -0
  152. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/__init__.py +0 -0
  153. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/conftest.py +0 -0
  154. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/test_dataset.py +0 -0
  155. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/test_models.py +0 -0
  156. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/test_tiled_dataset.py +0 -0
  157. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/dask_utils.py +0 -0
  158. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/file_manager.py +0 -0
  159. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/level_1_dataset_schema.yaml +0 -0
  160. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/tests/__init__.py +0 -0
  161. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/tests/test_file_manager.py +0 -0
  162. {dkist-1.9.0 → dkist-1.9.2}/dkist/io/tests/test_fits.py +0 -0
  163. {dkist-1.9.0 → dkist-1.9.2}/dkist/logger.py +0 -0
  164. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/__init__.py +0 -0
  165. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/attr_walker.py +0 -0
  166. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/attrs_values.py +0 -0
  167. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/__init__.py +0 -0
  168. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/auth.py +0 -0
  169. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/__init__.py +0 -0
  170. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/conftest.py +0 -0
  171. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/test_auth.py +0 -0
  172. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/test_endpoints.py +0 -0
  173. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/helpers.py +0 -0
  174. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/__init__.py +0 -0
  175. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/conftest.py +0 -0
  176. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/strategies.py +0 -0
  177. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_attr_walker.py +0 -0
  178. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_attrs.py +0 -0
  179. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_attrs_values.py +0 -0
  180. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_client.py +0 -0
  181. {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_helpers.py +0 -0
  182. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/__init__.py +0 -0
  183. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/figure_hashes_mpl_391_ft_261_astropy_611_animators_111_ndcube_222.json +0 -0
  184. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/figure_hashes_mpl_dev_ft_261_astropy_dev_animators_dev_ndcube_dev.json +0 -0
  185. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/generate_aia_dataset.py +0 -0
  186. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/generate_eit_test_dataset.py +0 -0
  187. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/generate_eit_tiled_dataset.py +0 -0
  188. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/helpers.py +0 -0
  189. {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/test_logger.py +0 -0
  190. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/__init__.py +0 -0
  191. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/_model_to_graphviz.py +0 -0
  192. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/decorators.py +0 -0
  193. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/exceptions.py +0 -0
  194. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/sysinfo.py +0 -0
  195. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/tests/__init__.py +0 -0
  196. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/tests/test_inventory.py +0 -0
  197. {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/tests/test_sysinfo.py +0 -0
  198. {dkist-1.9.0 → dkist-1.9.2}/dkist/version.py +0 -0
  199. {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/__init__.py +0 -0
  200. {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/models.py +4 -4
  201. {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/tests/__init__.py +0 -0
  202. {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/tests/test_coupled_compound_model.py +0 -0
  203. {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/tests/test_models.py +0 -0
  204. {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/dependency_links.txt +0 -0
  205. {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/entry_points.txt +0 -0
  206. {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/not-zip-safe +0 -0
  207. {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/top_level.txt +0 -0
  208. {dkist-1.9.0 → dkist-1.9.2}/docs/Makefile +0 -0
  209. {dkist-1.9.0 → dkist-1.9.2}/docs/conf.py +0 -0
  210. {dkist-1.9.0 → dkist-1.9.2}/docs/developer.rst +0 -0
  211. {dkist-1.9.0 → dkist-1.9.2}/docs/howto_guides/index.rst +0 -0
  212. {dkist-1.9.0 → dkist-1.9.2}/docs/howto_guides/reproject_vbi_mosaic.md +0 -0
  213. {dkist-1.9.0 → dkist-1.9.2}/docs/installation.rst +0 -0
  214. {dkist-1.9.0 → dkist-1.9.2}/docs/logo/icon_square.jpg +0 -0
  215. {dkist-1.9.0 → dkist-1.9.2}/docs/make.bat +0 -0
  216. {dkist-1.9.0 → dkist-1.9.2}/docs/reference.rst +0 -0
  217. {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/index.rst +0 -0
  218. {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/level1data.rst +0 -0
  219. {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/loading.rst +0 -0
  220. {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/net.rst +0 -0
  221. {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/usertools.rst +0 -0
  222. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/1_astropy_and_sunpy.md +0 -0
  223. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/2_search_and_asdf_download.md +0 -0
  224. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/3_the_dataset.md +0 -0
  225. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/4_more_dataset.md +0 -0
  226. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/5_downloading_data.md +0 -0
  227. {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/6_visualization.md +0 -0
  228. {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/1.0.rst +0 -0
  229. {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/1.1.rst +0 -0
  230. {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/changelog.rst +0 -0
  231. {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/index.rst +0 -0
  232. {dkist-1.9.0 → dkist-1.9.2}/setup.cfg +0 -0
  233. {dkist-1.9.0 → dkist-1.9.2}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "template": "https://github.com/sunpy/package-template",
3
- "commit": "aec53b81aed2e7e534045e59303d82712fe82fb1",
3
+ "commit": "d6b86e07efa31959f43e99ba32d323cf76736a05",
4
4
  "checkout": null,
5
5
  "context": {
6
6
  "cookiecutter": {
@@ -10,13 +10,20 @@
10
10
  "author_name": "NSO / AURA",
11
11
  "author_email": "stuart@cadair.com",
12
12
  "project_url": "https://github.com/DKISTDC/dkist",
13
+ "github_repo": "DKISTDC/dkist",
14
+ "sourcecode_url": "https://github.com/DKISTDC/dkist",
15
+ "download_url": "https://pypi.org/project/dkist",
16
+ "documentation_url": "https://docs.dkist.nso.edu/projects/python-tools/en/stable/",
17
+ "changelog_url": "https://docs.dkist.nso.edu/projects/python-tools/en/stable/whatsnew/changelog.html",
18
+ "issue_tracker_url": "https://github.com/DKISTDC/dkist/issues",
13
19
  "license": "BSD 3-Clause",
14
20
  "minimum_python_version": "3.10",
15
21
  "use_compiled_extensions": "n",
16
22
  "enable_dynamic_dev_versions": "y",
17
23
  "include_example_code": "n",
18
24
  "include_cruft_update_github_workflow": "y",
19
- "_sphinx_theme": "alabaster",
25
+ "use_extended_ruff_linting": "y",
26
+ "_sphinx_theme": "sunpy",
20
27
  "_parent_project": "",
21
28
  "_install_requires": "",
22
29
  "_copy_without_render": [
@@ -24,7 +31,8 @@
24
31
  "docs/_static",
25
32
  ".github/workflows/sub_package_update.yml"
26
33
  ],
27
- "_template": "https://github.com/sunpy/package-template"
34
+ "_template": "https://github.com/sunpy/package-template",
35
+ "_commit": "d6b86e07efa31959f43e99ba32d323cf76736a05"
28
36
  }
29
37
  },
30
38
  "directory": null
@@ -0,0 +1,50 @@
1
+ name: Build Workshop Repo
2
+
3
+ on:
4
+ # Allow manual runs through the web UI
5
+ workflow_dispatch:
6
+ # Push to the main branch of the workshop repo on release
7
+ release:
8
+ types: [published]
9
+
10
+ concurrency:
11
+ group: ${{ github.workflow }}-${{ github.ref }}
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ build_workshop:
16
+ runs-on: ubuntu-latest
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Setup Python 3.13
23
+ uses: actions/setup-python@v5
24
+ with:
25
+ python-version: "3.13"
26
+
27
+ - name: Configure Git
28
+ run: |
29
+ git config --global user.email "${{ github.actor }}@users.noreply.github.com"
30
+ git config --global user.name "${{ github.actor }}"
31
+
32
+ - name: Install pipx
33
+ run: pip install -U pipx
34
+
35
+ - name: Clone workshop repository
36
+ uses: actions/checkout@v4
37
+ with:
38
+ repository: 'DKISTDC/DKIST-Workshop'
39
+ fetch-depth: 0
40
+ path: 'workshop'
41
+
42
+ - name: Run pipx
43
+ run: pipx run ./tools/build_workshop_materials.py docs/tutorial workshop
44
+
45
+ - name: Commit and Push
46
+ run: |
47
+ cd workshop
48
+ git add .
49
+ git commit -m "Update notebooks from user tools repo"
50
+ git push
@@ -125,7 +125,7 @@ jobs:
125
125
 
126
126
  A draft release has been made with the changelog, release it after merge to trigger the release.
127
127
  labels: |
128
- no changelog
128
+ No Changelog Entry Needed
129
129
 
130
130
  - name: Create draft GitHub Release
131
131
  uses: actions/github-script@v7
@@ -21,14 +21,6 @@ jobs:
21
21
  runs-on: ubuntu-latest
22
22
  strategy:
23
23
  fail-fast: true
24
- matrix:
25
- include:
26
- - add-paths: .
27
- body: apply the changes to this repo.
28
- branch: cruft/update
29
- commit-message: "Automatic package template update"
30
- title: Updates from the package template
31
-
32
24
  steps:
33
25
  - uses: actions/checkout@v4
34
26
 
@@ -55,25 +47,49 @@ jobs:
55
47
  echo "has_changes=$CHANGES" >> "$GITHUB_OUTPUT"
56
48
 
57
49
  - name: Run update if available
50
+ id: cruft_update
58
51
  if: steps.check.outputs.has_changes == '1'
59
52
  run: |
60
53
  git config --global user.email "${{ github.actor }}@users.noreply.github.com"
61
54
  git config --global user.name "${{ github.actor }}"
62
55
 
63
- cruft update --skip-apply-ask --refresh-private-variables
56
+ cruft_output=$(cruft update --skip-apply-ask --refresh-private-variables)
57
+ echo $cruft_output
64
58
  git restore --staged .
65
59
 
66
- - name: Create pull request
60
+ if [[ "$cruft_output" == *"Failed to cleanly apply the update, there may be merge conflicts."* ]]; then
61
+ echo merge_conflicts=1 >> $GITHUB_OUTPUT
62
+ else
63
+ echo merge_conflicts=0 >> $GITHUB_OUTPUT
64
+ fi
65
+
66
+ - name: Check if only .cruft.json is modified
67
+ id: cruft_json
67
68
  if: steps.check.outputs.has_changes == '1'
69
+ run: |
70
+ git status --porcelain=1
71
+ if [[ "$(git status --porcelain=1)" == " M .cruft.json" ]]; then
72
+ echo "Only .cruft.json is modified. Exiting workflow early."
73
+ echo "has_changes=0" >> "$GITHUB_OUTPUT"
74
+ else
75
+ echo "has_changes=1" >> "$GITHUB_OUTPUT"
76
+ fi
77
+
78
+ - name: Create pull request
79
+ if: steps.cruft_json.outputs.has_changes == '1'
68
80
  uses: peter-evans/create-pull-request@v7
69
81
  with:
70
82
  token: ${{ secrets.GITHUB_TOKEN }}
71
- add-paths: ${{ matrix.add-paths }}
72
- commit-message: ${{ matrix.commit-message }}
73
- branch: ${{ matrix.branch }}
83
+ add-paths: "."
84
+ commit-message: "Automatic package template update"
85
+ branch: "cruft/update"
74
86
  delete-branch: true
75
- branch-suffix: timestamp
76
- title: ${{ matrix.title }}
87
+ draft: ${{ steps.cruft_update.outputs.merge_conflicts == '1' }}
88
+ title: "Updates from the package template"
89
+ labels: |
90
+ No Changelog Entry Needed
77
91
  body: |
78
- This is an autogenerated PR, which will ${{ matrix.body }}.
79
- [Cruft](https://cruft.github.io/cruft/) has detected updates from the Package Template
92
+ This is an autogenerated PR, which will applies the latest changes from the [SunPy Package Template](https://github.com/sunpy/package-template).
93
+ If this pull request has been opened as a draft there are conflicts which need fixing.
94
+
95
+ **To run the CI on this pull request you will need to close it and reopen it.**
@@ -1,7 +1,7 @@
1
1
  repos:
2
2
  # This should be before any formatting hooks like isort
3
3
  - repo: https://github.com/astral-sh/ruff-pre-commit
4
- rev: "v0.6.9"
4
+ rev: "v0.8.6"
5
5
  hooks:
6
6
  - id: ruff
7
7
  args: ["--fix"]
dkist-1.9.2/.ruff.toml ADDED
@@ -0,0 +1,122 @@
1
+ target-version = "py310"
2
+ line-length = 120
3
+ exclude = [
4
+ ".git,",
5
+ "__pycache__",
6
+ "build",
7
+ "dkist/version.py",
8
+ "dkist/_dev/",
9
+ ]
10
+
11
+ [lint]
12
+ select = [
13
+ "E",
14
+ "F",
15
+ "W",
16
+ "UP",
17
+ "PT",
18
+ "BLE",
19
+ # "A",
20
+ "C4",
21
+ "ICN",
22
+ "G",
23
+ "INP",
24
+ "Q",
25
+ "RSE",
26
+ "PIE",
27
+ "T20",
28
+ "RET",
29
+ "TID",
30
+ "PTH",
31
+ "PD",
32
+ "PLC",
33
+ "PLE",
34
+ "FLY",
35
+ "NPY",
36
+ # "PERF",
37
+ "RUF",
38
+ ]
39
+
40
+ extend-ignore = [
41
+ # pycodestyle (E, W)
42
+ "E501", # ignore line length will use a formatter instead
43
+ "E702",
44
+ "E711",
45
+ "E741",
46
+ "F405",
47
+ "F403",
48
+ "F821",
49
+ "F841",
50
+ # pyupgrade (UP)
51
+ "UP038", # Use | in isinstance - not compatible with models and is slower
52
+ # pytest (PT)
53
+ "PT001", # Always use pytest.fixture()
54
+ "PT023", # Always use () on pytest decorators
55
+ # Returns (RET)
56
+ "RET502", # Do not implicitly return None in function able to return non-None value
57
+ "RET503", # Missing explicit return at the end of function able to return non-None value
58
+ # flake8-pie (PIE)
59
+ "PIE808", # Disallow passing 0 as the first argument to range
60
+ # flake8-use-pathlib (PTH)
61
+ "PTH123", # open() should be replaced by Path.open()
62
+ # Ruff (RUF)
63
+ "RUF003", # Ignore ambiguous quote marks, doesn't allow ' in comments
64
+ "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar`
65
+ "RUF013", # PEP 484 prohibits implicit `Optional`
66
+ "RUF015", # Prefer `next(iter(...))` over single element slice
67
+ ]
68
+
69
+ [lint.per-file-ignores]
70
+ "setup.py" = [
71
+ "INP001", # File is part of an implicit namespace package.
72
+ ]
73
+ "conftest.py" = [
74
+ "INP001", # File is part of an implicit namespace package.
75
+ ]
76
+ "docs/conf.py" = [
77
+ "E402", # Module imports not at top of file
78
+ "A001",
79
+ "BLE001",
80
+ "T201",
81
+ ]
82
+ "docs/*.py" = [
83
+ "INP001", # File is part of an implicit namespace package.
84
+ ]
85
+ "examples/**.py" = [
86
+ "T201", # allow use of print in examples
87
+ "INP001", # File is part of an implicit namespace package.
88
+ ]
89
+ "__init__.py" = [
90
+ "E402", # Module level import not at top of cell
91
+ "F401", # Unused import
92
+ "F403", # from {name} import * used; unable to detect undefined names
93
+ "F405", # {name} may be undefined, or defined from star imports
94
+ ]
95
+ "test_*.py" = [
96
+ "E402", # Module level import not at top of cell
97
+ "B011",
98
+ "D",
99
+ "E402",
100
+ "PGH001",
101
+ "S101",
102
+ ]
103
+ "dkist/logger.py" = [
104
+ "PTH",
105
+ "BLE001",
106
+ ]
107
+ "dkist/tests/generate_*" = [
108
+ "T20",
109
+ ]
110
+ "dkist/utils/sysinfo.py" = [
111
+ "T20",
112
+ ]
113
+ "dkist/net/globus/auth.py" = [
114
+ "T201",
115
+ ]
116
+
117
+ [lint.flake8-import-conventions.extend-aliases]
118
+ "astropy.units" = "u"
119
+ "sunpy.net.attrs" = "a"
120
+
121
+ [lint.pydocstyle]
122
+ convention = "numpy"
@@ -1,3 +1,35 @@
1
+ 1.9.2 (2025-01-29)
2
+ ==================
3
+
4
+ Bug Fixes
5
+ ---------
6
+
7
+ - Improve the ASDF detection code so out of date ASDF filenames generated by the DKIST data center are skipped if a newer filename is present. (`#503 <https://github.com/DKISTDC/dkist/pull/503>`__)
8
+
9
+
10
+ 1.9.1 (2025-01-15)
11
+ ==================
12
+
13
+ Bug Fixes
14
+ ---------
15
+
16
+ - Fix some small issues with `Dataset.__repr__`. (`#479 <https://github.com/DKISTDC/dkist/pull/479>`__)
17
+ - Fix path errors with Globus transfers on windows. (`#489 <https://github.com/DKISTDC/dkist/pull/489>`__)
18
+
19
+
20
+ Trivial/Internal Changes
21
+ ------------------------
22
+
23
+ - Add tests for cropping datasets by world coords (`#310 <https://github.com/DKISTDC/dkist/pull/310>`__)
24
+ - Fix small bug which caused `ds.flat` to break if not indexed. (`#475 <https://github.com/DKISTDC/dkist/pull/475>`__)
25
+
26
+
27
+ Performance Improvements
28
+ ------------------------
29
+
30
+ - Improve the performance of the ``TiledDataset`` ``repr`` and ``str``. (`#467 <https://github.com/DKISTDC/dkist/pull/467>`__)
31
+
32
+
1
33
  1.9.0 (2024-11-04)
2
34
  ==================
3
35
 
@@ -1,9 +1,14 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: dkist
3
- Version: 1.9.0
3
+ Version: 1.9.2
4
4
  Summary: DKIST User Tools
5
5
  Author-email: NSO / AURA <stuart@cadair.com>
6
- Project-URL: repository, https://github.com/DKISTDC/dkist
6
+ Project-URL: Homepage, https://github.com/DKISTDC/dkist
7
+ Project-URL: Source Code, https://github.com/DKISTDC/dkist
8
+ Project-URL: Download, https://pypi.org/project/dkist
9
+ Project-URL: Documentation, https://docs.dkist.nso.edu/projects/python-tools/en/stable/
10
+ Project-URL: Changelog, https://docs.dkist.nso.edu/projects/python-tools/en/stable/whatsnew/changelog.html
11
+ Project-URL: Issue Tracker, https://github.com/DKISTDC/dkist/issues
7
12
  Requires-Python: >=3.10
8
13
  Description-Content-Type: text/x-rst
9
14
  License-File: LICENSE.rst
@@ -34,7 +39,7 @@ Requires-Dist: pytest-mock; extra == "tests"
34
39
  Requires-Dist: pytest-mpl; extra == "tests"
35
40
  Requires-Dist: pytest-httpserver; extra == "tests"
36
41
  Requires-Dist: pytest-filter-subpackage; extra == "tests"
37
- Requires-Dist: pytest-benchmark<5; extra == "tests"
42
+ Requires-Dist: pytest-benchmark; extra == "tests"
38
43
  Requires-Dist: pytest-xdist; extra == "tests"
39
44
  Requires-Dist: hypothesis; extra == "tests"
40
45
  Requires-Dist: tox; extra == "tests"
@@ -42,10 +47,11 @@ Requires-Dist: pydot; extra == "tests"
42
47
  Provides-Extra: docs
43
48
  Requires-Dist: sphinx; extra == "docs"
44
49
  Requires-Dist: sphinx-automodapi; extra == "docs"
50
+ Requires-Dist: sphinx-changelog; extra == "docs"
51
+ Requires-Dist: sunpy-sphinx-theme; extra == "docs"
45
52
  Requires-Dist: packaging; extra == "docs"
46
53
  Requires-Dist: sphinx-astropy; extra == "docs"
47
54
  Requires-Dist: sphinx-gallery; extra == "docs"
48
- Requires-Dist: sphinx-changelog; extra == "docs"
49
55
  Requires-Dist: pytest; extra == "docs"
50
56
  Requires-Dist: sphinx_autodoc_typehints; extra == "docs"
51
57
  Requires-Dist: dkist-sphinx-theme>=1.1.2; extra == "docs"
@@ -21,6 +21,7 @@ Each file should be named like ``<PULL REQUEST>.<TYPE>.rst``, where ``<PULL REQU
21
21
  * ``breaking``: A change which requires users to change code and is not backwards compatible. (Not to be used for removal of deprecated features.)
22
22
  * ``feature``: New user facing features and any new behavior.
23
23
  * ``bugfix``: Fixes a reported bug.
24
+ * ``performance``: A performance improvement which does not change behaviour.
24
25
  * ``doc``: Documentation addition or improvement, like rewording an entire session or adding missing docs.
25
26
  * ``removal``: Feature deprecation and/or feature removal.
26
27
  * ``trivial``: A change which has no user facing effect or is tiny change.
@@ -17,7 +17,7 @@ except PackageNotFoundError:
17
17
  __version__ = "unknown"
18
18
 
19
19
 
20
- __all__ = ["TiledDataset", "Dataset", "load_dataset", "system_info", "conf"]
20
+ __all__ = ["Dataset", "TiledDataset", "conf", "load_dataset", "system_info"]
21
21
 
22
22
 
23
23
  def write_default_config(overwrite=False):
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '1.9.0'
16
- __version_tuple__ = version_tuple = (1, 9, 0)
15
+ __version__ = version = '1.9.2'
16
+ __version_tuple__ = version_tuple = (1, 9, 2)
@@ -407,3 +407,21 @@ def pytest_runtest_call(item):
407
407
  # TODO raise a warning here
408
408
  warnings.warn("--ds and --tiled-ds were not found. Any supplied datasets will not be used.")
409
409
  yield item
410
+
411
+
412
+ @pytest.fixture(scope="session")
413
+ def croppable_visp_dataset(tmp_path_factory):
414
+ vispdir = tmp_path_factory.mktemp("data")
415
+ # This asdf file is for dataset ID BKEWK
416
+ with gzip.open(Path(rootdir) / "croppable_visp.asdf.gz", mode="rb") as gfo:
417
+ with open(vispdir / "croppable_visp.asdf", mode="wb") as afo:
418
+ afo.write(gfo.read())
419
+ return load_dataset(vispdir / "croppable_visp.asdf")
420
+
421
+
422
+ @pytest.fixture(scope="session")
423
+ def croppable_cryo_dataset():
424
+ with gzip.open(Path(rootdir) / "croppable_cryo.asdf.gz", mode="rb") as gfo:
425
+ with open(rootdir / "croppable_cryo.asdf", mode="wb") as afo:
426
+ afo.write(gfo.read())
427
+ return load_dataset(Path(rootdir) / "croppable_cryo.asdf")
@@ -0,0 +1 @@
1
+ {"parameterValues":[{"parameterName":"createDateMin","values":{"minValue":"2022-12-08T19:07:55.038280","maxValue":"2025-01-28T07:25:53.776348"}},{"parameterName":"createDateMax","values":{"minValue":"2022-12-08T19:07:55.038280","maxValue":"2025-01-28T07:25:53.776348"}},{"parameterName":"endTimeMin","values":{"minValue":"2022-02-23T20:48:55.393500","maxValue":"2024-11-08T22:02:14.064417"}},{"parameterName":"endTimeMax","values":{"minValue":"2022-02-23T20:48:55.393500","maxValue":"2024-11-08T22:02:14.064417"}},{"parameterName":"exposureTimeMin","values":{"minValue":0.037,"maxValue":1380.2332394366197}},{"parameterName":"exposureTimeMax","values":{"minValue":0.037,"maxValue":1380.2332394366197}},{"parameterName":"instrumentNames","values":{"categoricalValues":["VBI","CRYO-NIRSP","VISP"]}},{"parameterName":"qualityAverageFriedParameterMin","values":{"minValue":0.01695005847191685,"maxValue":2.6520787500175156e+30}},{"parameterName":"qualityAverageFriedParameterMax","values":{"minValue":0.01695005847191685,"maxValue":2.6520787500175156e+30}},{"parameterName":"qualityAveragePolarimetricAccuracyMin","values":{"minValue":0.14787299538416715,"maxValue":263.313656131021}},{"parameterName":"qualityAveragePolarimetricAccuracyMax","values":{"minValue":0.14787299538416715,"maxValue":263.313656131021}},{"parameterName":"startTimeMin","values":{"minValue":"2022-02-23T19:05:32.338002","maxValue":"2024-11-08T21:40:00.522500"}},{"parameterName":"startTimeMax","values":{"minValue":"2022-02-23T19:05:32.338002","maxValue":"2024-11-08T21:40:00.522500"}},{"parameterName":"targetTypes","values":{"categoricalValues":["coronalhole","activecorona","quietcorona","prominence","sunspot","spicules","quietsun","plages","unknown","filament"]}},{"parameterName":"averageDatasetSpectralSamplingMin","values":{"minValue":0.000540156130946172,"maxValue":0.004605031614270178}},{"parameterName":"averageDatasetSpectralSamplingMax","values":{"minValue":0.000540156130946172,"maxValue":0.004605031614270178}},{"parameterName":"averageDatasetSpatialSamplingMin","values":{"minValue":0.0,"maxValue":12388.04306084}},{"parameterName":"averageDatasetSpatialSamplingMax","values":{"minValue":0.0,"maxValue":12388.04306084}},{"parameterName":"averageDatasetTemporalSamplingMin","values":{"minValue":2.66666599999823,"maxValue":5263.145059399398}},{"parameterName":"averageDatasetTemporalSamplingMax","values":{"minValue":2.66666599999823,"maxValue":5263.145059399398}},{"parameterName":"highLevelSoftwareVersion","values":{"categoricalValues":["Alakai_10-0","Pono_6.1.5","Pono_2.1.0","Alakai_5-1","Pono_3.1.0","Pono_8.0.0","Alakai_11.1.0","Alakai_6-0","Alakai_8-0","Alakai_7-0","Pono_7.0.0","Pono_1.0.0","Alakai_3-0","Alakai_4-0","Pono_9.1.0"]}},{"parameterName":"workflowName","values":{"categoricalValues":["l0_to_l1_visp","l0_to_l1_cryonirsp_sp","l0_to_l1_cryonirsp_ci","l0_to_l1_vbi_summit-calibrated"]}},{"parameterName":"workflowVersion","values":{"categoricalValues":["1.18.6","2.16.7","1.18.0","2.0.2","1.11.1","2.20.9","2.19.5","1.2.1","2.7.5","2.19.4","2.3.1","2.19.3","1.15.0","1.0.0","1.15.1","1.3.5","1.18.4","2.16.0","1.2.0","2.10.2","2.7.4","1.18.8","2.10.3","2.20.8","2.16.4","1.1.7","2.17.0","0.16.0","1.3.2","1.17.5","1.1.10","2.15.0","2.20.7","2.7.2","2.10.15","1.4.9","1.1.2","2.7.0","2.19.1","2.20.5","2.20.10","2.10.1","2.7.3","1.12.1","2.10.12","1.1.5","1.3.3","2.6.1","2.10.13","2.19.2","2.0.1","1.18.5","1.4.8","1.8.2","2.9.0","2.10.7","2.3.0","2.10.0","1.17.1","1.13.0","2.20.6","1.14.7","1.4.11","2.20.3","2.13.1","1.4.1"]}},{"parameterName":"headerDataUnitCreationDateMin","values":{"minValue":"2022-12-08T17:30:30.462000","maxValue":"2025-01-28T00:07:38.944000"}},{"parameterName":"headerDataUnitCreationDateMax","values":{"minValue":"2022-12-08T17:30:30.462000","maxValue":"2025-01-28T00:07:38.944000"}},{"parameterName":"headerVersion","values":{"categoricalValues":["4.3.0","4.6.0","4.0.0","4.1.1","3.4.0","3.9.0","4.7.0","4.10.0","3.5.0","4.2.0","3.6.0","3.3.0","3.0.0","3.7.1","3.8.1","4.5.0"]}},{"parameterName":"spectralLines","values":{"categoricalValues":["Na I D2 (589.0 nm)","Sr I (460.73 nm)","Ca II (854.21 nm)","Fe I (630.15 nm)","Ca II K (393.37 nm)","Ca II H (396.85 nm)","Na I D1 (589.59 nm)","Mg I b1 (517.27 nm)","Fe I (630.25 nm)","Fe XIII (1079.8 nm)","Fe XIII (1074.7 nm)","H epsilon (397.0 nm)","Fe I (525.04 nm)","H beta (486.13 nm)","He I (1083.0 nm)","H alpha (656.28 nm)"]}}]}
@@ -4,7 +4,7 @@ This module provides some (partial) sample datasets.
4
4
 
5
5
  from ._sample import _SAMPLE_DATASETS, VISP_HEADER, _get_sample_datasets
6
6
 
7
- __all__ = ["download_all_sample_data", *sorted(_SAMPLE_DATASETS.keys()), "VISP_HEADER"]
7
+ __all__ = ["download_all_sample_data", *sorted(_SAMPLE_DATASETS.keys()), "VISP_HEADER"] # noqa: PLE0604
8
8
 
9
9
 
10
10
  # See PEP 562 (https://peps.python.org/pep-0562/) for module-level __dir__()
@@ -1,11 +1,16 @@
1
+ import re
2
+ import warnings
1
3
  import importlib.resources as importlib_resources
2
4
  from pathlib import Path
3
5
  from functools import singledispatch
6
+ from collections import defaultdict
4
7
 
5
8
  from parfive import Results
6
9
 
7
10
  import asdf
8
11
 
12
+ from dkist.utils.exceptions import DKISTUserWarning
13
+
9
14
  try:
10
15
  # first try to import from asdf.exceptions for asdf 2.15+
11
16
  from asdf.exceptions import ValidationError
@@ -14,6 +19,9 @@ except ImportError:
14
19
  from asdf import ValidationError
15
20
 
16
21
 
22
+ ASDF_FILENAME_PATTERN = r"^(?P<instrument>[A-Z-]+)_L1_(?P<timestamp>\d{8}T\d{6})_(?P<datasetid>[A-Z]{5,})(?P<suffix>_user_tools|_metadata)?.asdf$"
23
+
24
+
17
25
  def asdf_open_memory_mapping_kwarg(memmap: bool) -> dict:
18
26
  if asdf.__version__ > "3.1.0":
19
27
  return {"memmap": memmap}
@@ -138,8 +146,30 @@ def _load_from_path(path: Path):
138
146
 
139
147
  def _load_from_directory(directory):
140
148
  """
141
- Construct a `~dkist.dataset.Dataset` from a directory containing one
142
- asdf file and a collection of FITS files.
149
+ Construct a `~dkist.dataset.Dataset` from a directory containing one (or
150
+ more) ASDF files and a collection of FITS files.
151
+
152
+ ASDF files have the generic pattern:
153
+
154
+ ``{instrument}_L1_{start_time:%Y%m%dT%H%M%S}_{dataset_id}[_{suffix}].asdf``
155
+
156
+ where the ``_{suffix}`` on the end may be absent or one of a few different
157
+ suffixes which have been used at different times. When searching a
158
+ directory for one or more ASDF file to load we should attempt to only load
159
+ one per dataset ID by selecting files in suffix order.
160
+
161
+ The order of suffixes are (from newest used to oldest):
162
+
163
+ - ``_metadata``
164
+ - ``_user_tools``
165
+ - None
166
+
167
+ The algorithm used to find ASDF files to load in a directory is therefore:
168
+
169
+ - Glob the directory for all ASDF files
170
+ - Group all results by the filename up to and including the dataset id in the filename
171
+ - Ignore any ASDF files with an old suffix if a new suffix is present
172
+ - Throw a warning to the user if any ASDF files with older suffixes are found
143
173
  """
144
174
  base_path = Path(directory).expanduser()
145
175
  asdf_files = tuple(base_path.glob("*.asdf"))
@@ -147,12 +177,60 @@ def _load_from_directory(directory):
147
177
  if not asdf_files:
148
178
  raise ValueError(f"No asdf file found in directory {base_path}.")
149
179
 
150
- if len(asdf_files) > 1:
151
- return _load_from_iterable(asdf_files)
152
-
153
- asdf_file = asdf_files[0]
180
+ if len(asdf_files) == 1:
181
+ return _load_from_asdf(asdf_files[0])
182
+
183
+ pattern = re.compile(ASDF_FILENAME_PATTERN)
184
+ candidates = []
185
+ asdfs_to_load = []
186
+ for filepath in asdf_files:
187
+ filename = filepath.name
188
+
189
+ # If the asdf file doesn't match the data center pattern then we load it
190
+ # as it's probably a custom user file
191
+ if pattern.match(filename) is None:
192
+ asdfs_to_load.append(filepath)
193
+ continue
194
+
195
+ # All the matches have to be checked
196
+ candidates.append(filepath)
197
+
198
+ # If we only have one match load it
199
+ if len(candidates) == 1:
200
+ asdfs_to_load += candidates
201
+ else:
202
+ # Now we group by prefix
203
+ matches = [pattern.match(fp.name) for fp in candidates]
204
+ grouped = defaultdict(list)
205
+ for m in matches:
206
+ prefix = m.string.removesuffix(".asdf").removesuffix(m.group("suffix") or "")
207
+ grouped[prefix].append(m.group("suffix"))
208
+
209
+ # Now we select the best suffix for each prefix
210
+ for prefix, suffixes in grouped.items():
211
+ if "_metadata" in suffixes:
212
+ asdfs_to_load.append(base_path / f"{prefix}_metadata.asdf")
213
+ elif "_user_tools" in suffixes:
214
+ asdfs_to_load.append(base_path / f"{prefix}_user_tools.asdf")
215
+ elif None in suffixes:
216
+ asdfs_to_load.append(base_path / f"{prefix}.asdf")
217
+ else:
218
+ # This branch should never be hit because the regex enumerates the suffixes
219
+ raise ValueError("Unknown suffix encountered.") # pragma: no cover
220
+
221
+ # Throw a warning if we have skipped any files
222
+ if ignored_files := set(asdf_files).difference(asdfs_to_load):
223
+ warnings.warn(
224
+ f"ASDF files with old names ({', '.join([a.name for a in ignored_files])}) "
225
+ "were found in this directory and ignored. You may want to delete these files.",
226
+ DKISTUserWarning
227
+ )
228
+
229
+ if len(asdfs_to_load) == 1:
230
+ return _load_from_asdf(asdfs_to_load[0])
231
+
232
+ return _load_from_iterable(asdfs_to_load)
154
233
 
155
- return _load_from_asdf(asdf_file)
156
234
 
157
235
 
158
236
  def _load_from_asdf(filepath):