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.
- {dkist-1.9.0 → dkist-1.9.2}/.cruft.json +11 -3
- dkist-1.9.2/.github/workflows/build_workshop.yml +50 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/prepare-release.yml +1 -1
- {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/sub_package_update.yml +33 -17
- {dkist-1.9.0 → dkist-1.9.2}/.pre-commit-config.yaml +1 -1
- dkist-1.9.2/.ruff.toml +122 -0
- {dkist-1.9.0 → dkist-1.9.2}/CHANGELOG.rst +32 -0
- {dkist-1.9.0/dkist.egg-info → dkist-1.9.2}/PKG-INFO +11 -5
- {dkist-1.9.0 → dkist-1.9.2}/changelog/README.rst +1 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/__init__.py +1 -1
- {dkist-1.9.0 → dkist-1.9.2}/dkist/_version.py +2 -2
- {dkist-1.9.0 → dkist-1.9.2}/dkist/conftest.py +18 -0
- dkist-1.9.2/dkist/data/api_search_values.json +1 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/sample.py +1 -1
- dkist-1.9.2/dkist/data/test/croppable_cryo.asdf.gz +0 -0
- dkist-1.9.2/dkist/data/test/croppable_visp.asdf.gz +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/loader.py +85 -7
- dkist-1.9.2/dkist/dataset/tests/test_crop_dataset.py +185 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/test_dataset.py +14 -0
- dkist-1.9.2/dkist/dataset/tests/test_load_dataset.py +203 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/test_tiled_dataset.py +8 -4
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/utils.py +18 -7
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/loaders.py +1 -1
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/attrs.py +27 -7
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/client.py +1 -1
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/endpoints.py +1 -1
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/test_transfer.py +7 -7
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/transfer.py +2 -2
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/test_benchmarks.py +10 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/inventory.py +1 -1
- {dkist-1.9.0 → dkist-1.9.2/dkist.egg-info}/PKG-INFO +11 -5
- {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/SOURCES.txt +6 -4
- {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/requires.txt +3 -2
- {dkist-1.9.0 → dkist-1.9.2}/docs/index.rst +0 -1
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/index.md +2 -2
- {dkist-1.9.0 → dkist-1.9.2}/pyproject.toml +58 -41
- {dkist-1.9.0 → dkist-1.9.2}/pytest.ini +1 -0
- dkist-1.9.2/tools/build_workshop_materials.py +123 -0
- {dkist-1.9.0 → dkist-1.9.2}/tox.ini +1 -0
- dkist-1.9.0/.ruff.toml +0 -78
- dkist-1.9.0/dkist/data/api_search_values.json +0 -1
- dkist-1.9.0/dkist/dataset/tests/test_load_dataset.py +0 -116
- dkist-1.9.0/docs/tutorial/1_astropy_and_sunpy_NOTES.md +0 -239
- dkist-1.9.0/docs/tutorial/2_search_and_asdf_download_NOTES.md +0 -67
- dkist-1.9.0/docs/tutorial/3_the_dataset_NOTES.md +0 -178
- {dkist-1.9.0 → dkist-1.9.2}/.circleci/codecov_upload.sh +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.circleci/config.yml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.circleci/early_exit.sh +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.codecov.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.codespell-dict.txt +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.codespellrc +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.coveragerc +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.flake8 +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/ISSUE_TEMPLATE/BUG_REPORT.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/dependabot.yml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/codspeed.yml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.github/workflows/main.yml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.gitignore +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.gitmodules +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.isort.cfg +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.readthedocs.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/.rtd-environment.yml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/CODE_OF_CONDUCT.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/CONTRIBUTING.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/LICENSE.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/MANIFEST.in +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/README.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/conftest.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/config/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/README.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/VISP_HEADER.hdr +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/_sample.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/5d_gwcs.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/AGLKO-inv.ecsv +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.000010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.020010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.030011_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.040010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.050010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.060010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.080010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.090010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.100010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.110010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/efz20040301.120010_s.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/EIT/eit_test_dataset.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-0.1.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-0.2.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-0.3.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-1.0.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-1.1.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/eit_dataset-1.2.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/globus_operation_ls_response.json +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/globus_search_response.json +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/large_vbi.asdf.gz +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/large_visp.asdf.gz +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/0.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/1.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/2.fits +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/small_visp/test_visp.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_old_wcs_BRMQY.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.0.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.1.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/test_tiled_dataset-1.0.0_dataset-1.2.0.asdf +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/test/visp_no_headers.asdf.gz +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/data/tests/test_sample.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tests/test_plotting.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dataset/tiled_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/dkist.cfg +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/extern/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/file_manager.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/models.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/converters/tiled_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/entry_points.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-0.9.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-1.2.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.2.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/manifests/dkist-wcs-1.3.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/asymmetric_mapping_model-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/asymmetric_mapping_model-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/coupled_compound_model-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/coupled_compound_model-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-0.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-0.2.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-0.3.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/dataset-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/file_manager-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/ravel_model-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/ravel_model-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/tiled_dataset-0.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/tiled_dataset-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/varying_celestial_transform-1.0.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/resources/schemas/varying_celestial_transform-1.1.0.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/conftest.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/test_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/test_models.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/asdf/tests/test_tiled_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/dask_utils.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/file_manager.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/level_1_dataset_schema.yaml +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/tests/test_file_manager.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/io/tests/test_fits.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/logger.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/attr_walker.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/attrs_values.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/auth.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/conftest.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/test_auth.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/globus/tests/test_endpoints.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/helpers.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/conftest.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/strategies.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_attr_walker.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_attrs.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_attrs_values.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_client.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/net/tests/test_helpers.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/__init__.py +0 -0
- {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
- {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
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/generate_aia_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/generate_eit_test_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/generate_eit_tiled_dataset.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/helpers.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/tests/test_logger.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/_model_to_graphviz.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/decorators.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/exceptions.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/sysinfo.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/tests/test_inventory.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/utils/tests/test_sysinfo.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/version.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/models.py +4 -4
- {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/tests/__init__.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/tests/test_coupled_compound_model.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist/wcs/tests/test_models.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/dependency_links.txt +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/entry_points.txt +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/not-zip-safe +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/dkist.egg-info/top_level.txt +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/Makefile +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/conf.py +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/developer.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/howto_guides/index.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/howto_guides/reproject_vbi_mosaic.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/installation.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/logo/icon_square.jpg +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/make.bat +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/reference.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/index.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/level1data.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/loading.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/net.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/topic_guides/usertools.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/1_astropy_and_sunpy.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/2_search_and_asdf_download.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/3_the_dataset.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/4_more_dataset.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/5_downloading_data.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/tutorial/6_visualization.md +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/1.0.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/1.1.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/changelog.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/docs/whatsnew/index.rst +0 -0
- {dkist-1.9.0 → dkist-1.9.2}/setup.cfg +0 -0
- {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": "
|
|
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
|
-
"
|
|
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
|
|
@@ -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
|
-
|
|
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:
|
|
72
|
-
commit-message:
|
|
73
|
-
branch:
|
|
83
|
+
add-paths: "."
|
|
84
|
+
commit-message: "Automatic package template update"
|
|
85
|
+
branch: "cruft/update"
|
|
74
86
|
delete-branch: true
|
|
75
|
-
|
|
76
|
-
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
|
|
79
|
-
|
|
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.**
|
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
|
+
Metadata-Version: 2.2
|
|
2
2
|
Name: dkist
|
|
3
|
-
Version: 1.9.
|
|
3
|
+
Version: 1.9.2
|
|
4
4
|
Summary: DKIST User Tools
|
|
5
5
|
Author-email: NSO / AURA <stuart@cadair.com>
|
|
6
|
-
Project-URL:
|
|
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
|
|
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__ = ["
|
|
20
|
+
__all__ = ["Dataset", "TiledDataset", "conf", "load_dataset", "system_info"]
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
def write_default_config(overwrite=False):
|
|
@@ -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__()
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
-
|
|
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)
|
|
151
|
-
return
|
|
152
|
-
|
|
153
|
-
|
|
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):
|