easyscience 2.3.1__tar.gz → 2.4.0__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.
- easyscience-2.4.0/.codecov.yml +26 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.copier-answers.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/download-artifact/action.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/github-script/action.yml +1 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/setup-easyscience-bot/action.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/setup-pixi/action.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/upload-artifact/action.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/upload-codecov/action.yml +2 -2
- easyscience-2.4.0/.github/scripts/publish-dashboard.sh +77 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/backmerge.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/cleanup.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/coverage.yml +9 -33
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/dashboard.yml +26 -15
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/docs.yml +16 -9
- easyscience-2.4.0/.github/workflows/issues-labels.yml +40 -0
- easyscience-2.4.0/.github/workflows/lint-format.yml +124 -0
- easyscience-2.4.0/.github/workflows/pr-labels.yml +45 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/pypi-publish.yml +1 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/pypi-test.yml +18 -14
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/release-notes.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/release-pr.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/security.yml +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/test-trigger.yml +1 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/test.yml +50 -18
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/tutorial-tests-trigger.yml +1 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/tutorial-tests.yml +1 -5
- {easyscience-2.3.1 → easyscience-2.4.0}/.gitignore +1 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.pre-commit-config.yaml +12 -12
- {easyscience-2.3.1 → easyscience-2.4.0}/.prettierignore +19 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/CONTRIBUTING.md +115 -72
- {easyscience-2.3.1 → easyscience-2.4.0}/PKG-INFO +12 -11
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/javascripts/extra.js +6 -8
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/javascripts/mathjax.js +12 -6
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/stylesheets/extra.css +8 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/installation-and-setup/index.md +18 -21
- easyscience-2.4.0/docs/docs/tutorials/fitting-bayesian.ipynb +518 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/index.md +3 -0
- easyscience-2.4.0/docs/docs/user-guide/controlling-log-output.md +203 -0
- easyscience-2.4.0/docs/docs/user-guide/index.md +10 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/mkdocs.yml +25 -4
- easyscience-2.4.0/pixi.lock +10306 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/pixi.toml +87 -83
- {easyscience-2.3.1 → easyscience-2.4.0}/pyproject.toml +120 -57
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/__init__.py +2 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/__init__.py +2 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/based_base.py +81 -32
- easyscience-2.4.0/src/easyscience/base_classes/collection_base.py +18 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/easy_list.py +181 -48
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/model_base.py +56 -18
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/new_base.py +73 -24
- easyscience-2.4.0/src/easyscience/base_classes/obj_base.py +18 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/available_minimizers.py +8 -16
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/calculators/interface_factory.py +94 -54
- easyscience-2.4.0/src/easyscience/fitting/fitter.py +529 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/bumps_utils/eval_counter.py +2 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/bumps_utils/progress_monitor.py +3 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_base.py +128 -62
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_bumps.py +335 -94
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_dfo.py +142 -66
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_lmfit.py +127 -62
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/utils.py +3 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/multi_fitter.py +68 -28
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/global_object.py +19 -10
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/hugger/hugger.py +5 -3
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/hugger/property.py +46 -17
- easyscience-2.4.0/src/easyscience/global_object/logger.py +204 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/map.py +26 -13
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/undo_redo.py +37 -33
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/io/serializer_base.py +128 -50
- easyscience-2.4.0/src/easyscience/io/serializer_component.py +123 -0
- easyscience-2.4.0/src/easyscience/io/serializer_dict.py +78 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/analysis.py +3 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/experiment.py +3 -2
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/job.py +4 -3
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/theoreticalmodel.py +3 -2
- easyscience-2.4.0/src/easyscience/legacy/__init__.py +7 -0
- {easyscience-2.3.1/src/easyscience/base_classes → easyscience-2.4.0/src/easyscience/legacy}/collection_base.py +139 -52
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/dict.py +82 -35
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/json.py +50 -29
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/legacy_core.py +103 -40
- {easyscience-2.3.1/src/easyscience/base_classes → easyscience-2.4.0/src/easyscience/legacy}/obj_base.py +40 -25
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/xml.py +49 -23
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/models/polynomial.py +16 -4
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/classUtils.py +34 -20
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/decorators.py +25 -13
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/string.py +29 -8
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_any_type.py +26 -16
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_array.py +356 -127
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_base.py +130 -44
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_bool.py +23 -6
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_number.py +162 -57
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_str.py +23 -6
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/parameter.py +366 -119
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/parameter_dependency_resolver.py +49 -18
- easyscience-2.4.0/tests/functional/test_smoke.py +20 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/integration/fitting/test_fitter.py +13 -13
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/integration/fitting/test_multi_fitter.py +212 -0
- easyscience-2.4.0/tests/unit/base_classes/test_deprecated_wrappers.py +87 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_easy_list.py +180 -29
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_obj_base.py +1 -1
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/calculators/test_interface_factory.py +13 -10
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_bumps.py +399 -4
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_dfo.py +14 -14
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_lmfit.py +12 -7
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/test_fitter.py +153 -0
- easyscience-2.4.0/tests/unit/fitting/test_multi_fitter.py +167 -0
- easyscience-2.4.0/tests/unit/global_object/test_logger.py +370 -0
- easyscience-2.4.0/tests/unit/legacy/test_collection_base.py +155 -0
- easyscience-2.4.0/tests/unit/legacy/test_obj_base.py +119 -0
- easyscience-2.4.0/tools/license_headers.py +321 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tools/update_github_labels.py +3 -1
- easyscience-2.3.1/.codecov.yml +0 -8
- easyscience-2.3.1/.github/workflows/issues-labels.yml +0 -42
- easyscience-2.3.1/.github/workflows/lint-format.yml +0 -130
- easyscience-2.3.1/.github/workflows/pr-labels.yml +0 -56
- easyscience-2.3.1/codecov.yml +0 -13
- easyscience-2.3.1/docs/docs/user-guide/index.md +0 -8
- easyscience-2.3.1/pixi.lock +0 -10296
- easyscience-2.3.1/src/easyscience/fitting/fitter.py +0 -317
- easyscience-2.3.1/src/easyscience/global_object/logger.py +0 -31
- easyscience-2.3.1/src/easyscience/io/serializer_component.py +0 -83
- easyscience-2.3.1/src/easyscience/io/serializer_dict.py +0 -57
- easyscience-2.3.1/tests/unit/fitting/test_multi_fitter.py +0 -63
- easyscience-2.3.1/tools/add_spdx.py +0 -149
- easyscience-2.3.1/tools/check_spdx.py +0 -43
- easyscience-2.3.1/tools/remove_spdx.py +0 -39
- easyscience-2.3.1/tools/test_scripts.py +0 -55
- {easyscience-2.3.1 → easyscience-2.4.0}/.badgery.yaml +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.coveragerc +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/pages-deployment.json +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/rulesets-develop.json +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/rulesets-gh-pages.json +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/rulesets-master.json +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/.github/scripts/backmerge-conflict-issue.js +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/LICENSE +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/README.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/base_classes.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/fitting.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/global_object.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/index.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/io.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/job.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/models.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/utils.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/variable.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/images/favicon.png +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/images/logo_dark.svg +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/images/logo_light.svg +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/index.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/introduction/index.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/fitting-qens.ipynb +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/fitting-sans.ipynb +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/progress-callback.ipynb +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/includes/abbreviations.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/.icons/app.svg +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/.icons/easyscience.svg +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/.icons/google-colab.svg +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/main.html +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/partials/logo.html +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/README.rst +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/base/README.rst +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/base/plot_baseclass1.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/fitting/README.rst +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/PARAMETER_DEPENDENCY_SERIALIZATION.md +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/dataset_examples.ipynb +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/dimer_example.ipynb +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example1.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example1_dream.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example2.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example3.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example4.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example5_broken.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example6_broken.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset2.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset2pt2.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset2pt2_broken.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset3.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset3pt2.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset4.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset4_2.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/prettierrc.toml +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/calculators/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/bumps_utils/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/factory.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/hugger/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/io/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/models/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/classTools.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/conftest.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_collection_base.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_model_base.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_new_base.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/calculators/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_factory.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_base.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_utils.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_entry_list_comprehensive.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_global_object.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_integration_comprehensive.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_map.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_undo_redo.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_undo_redo_comprehensive.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/io/test_serializer_base.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/io/test_serializer_component.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/io/test_serializer_dict.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/test_dict.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/test_json.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/test_xml.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/models/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/models/test_polynomial.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/__init__.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_any_type.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_array.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_base.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_bool.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_number.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_str.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_parameter.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_parameter_dependency_serialization.py +0 -0
- {easyscience-2.3.1 → easyscience-2.4.0}/tools/update_docs_assets.py +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Codecov configuration
|
|
2
|
+
# https://docs.codecov.com/docs/codecov-yaml
|
|
3
|
+
|
|
4
|
+
github_checks:
|
|
5
|
+
annotations: true
|
|
6
|
+
|
|
7
|
+
comment:
|
|
8
|
+
layout: 'reach, diff, flags, files'
|
|
9
|
+
behavior: default
|
|
10
|
+
require_changes: false
|
|
11
|
+
require_base: false
|
|
12
|
+
require_head: true
|
|
13
|
+
|
|
14
|
+
coverage:
|
|
15
|
+
status:
|
|
16
|
+
project:
|
|
17
|
+
default:
|
|
18
|
+
target: auto
|
|
19
|
+
threshold: 1%
|
|
20
|
+
# Make project coverage informational (won't block PR)
|
|
21
|
+
informational: true
|
|
22
|
+
patch:
|
|
23
|
+
default:
|
|
24
|
+
target: auto
|
|
25
|
+
# Require patch coverage but with threshold
|
|
26
|
+
threshold: 1%
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
# WARNING: Do not edit this file manually.
|
|
2
2
|
# Any changes will be overwritten by Copier.
|
|
3
|
-
_commit: v0.
|
|
3
|
+
_commit: v0.13.1
|
|
4
4
|
_src_path: gh:easyscience/templates
|
|
5
5
|
lib_docs_url: https://easyscience.github.io/core
|
|
6
6
|
lib_doi: 10.5281/zenodo.18163581
|
|
7
7
|
lib_package_name: easyscience
|
|
8
|
-
lib_python_max: '3.
|
|
8
|
+
lib_python_max: '3.14'
|
|
9
9
|
lib_python_min: '3.11'
|
|
10
10
|
lib_repo_name: core
|
|
11
11
|
project_contact_email: support@easyscience.org
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: 'Download artifact'
|
|
2
|
-
description: '
|
|
2
|
+
description: 'Wrapper for actions/download-artifact'
|
|
3
3
|
inputs:
|
|
4
4
|
name:
|
|
5
5
|
description: 'Name of the artifact to download'
|
|
@@ -39,7 +39,7 @@ runs:
|
|
|
39
39
|
using: 'composite'
|
|
40
40
|
steps:
|
|
41
41
|
- name: Download artifact
|
|
42
|
-
uses: actions/download-artifact@
|
|
42
|
+
uses: actions/download-artifact@v8
|
|
43
43
|
with:
|
|
44
44
|
name: ${{ inputs.name }}
|
|
45
45
|
path: ${{ inputs.path }}
|
|
@@ -22,9 +22,9 @@ runs:
|
|
|
22
22
|
steps:
|
|
23
23
|
- name: Create GitHub App installation token
|
|
24
24
|
id: app-token
|
|
25
|
-
uses: actions/create-github-app-token@
|
|
25
|
+
uses: actions/create-github-app-token@v3
|
|
26
26
|
with:
|
|
27
|
-
|
|
27
|
+
client-id: ${{ inputs.app-id }}
|
|
28
28
|
private-key: ${{ inputs.private-key }}
|
|
29
29
|
repositories: ${{ inputs.repositories }}
|
|
30
30
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: 'Setup Pixi Environment'
|
|
2
|
-
description: '
|
|
2
|
+
description: 'Wrapper for prefix-dev/setup-pixi'
|
|
3
3
|
inputs:
|
|
4
4
|
environments:
|
|
5
5
|
description: 'Pixi environments to setup'
|
|
@@ -33,7 +33,7 @@ inputs:
|
|
|
33
33
|
runs:
|
|
34
34
|
using: 'composite'
|
|
35
35
|
steps:
|
|
36
|
-
- uses: prefix-dev/setup-pixi@v0.9.
|
|
36
|
+
- uses: prefix-dev/setup-pixi@v0.9.5
|
|
37
37
|
with:
|
|
38
38
|
environments: ${{ inputs.environments }}
|
|
39
39
|
activate-environment: ${{ inputs.activate-environment }}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: 'Upload artifact'
|
|
2
|
-
description: '
|
|
2
|
+
description: 'Wrapper for actions/upload-artifact'
|
|
3
3
|
inputs:
|
|
4
4
|
name:
|
|
5
5
|
description: 'Artifact name'
|
|
@@ -38,7 +38,7 @@ runs:
|
|
|
38
38
|
using: 'composite'
|
|
39
39
|
steps:
|
|
40
40
|
- name: Upload artifact
|
|
41
|
-
uses: actions/upload-artifact@
|
|
41
|
+
uses: actions/upload-artifact@v7
|
|
42
42
|
with:
|
|
43
43
|
name: ${{ inputs.name }}
|
|
44
44
|
path: ${{ inputs.path }}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
name: 'Upload coverage to Codecov'
|
|
2
|
-
description: '
|
|
2
|
+
description: 'Wrapper for codecov/codecov-action'
|
|
3
3
|
|
|
4
4
|
inputs:
|
|
5
5
|
name:
|
|
@@ -32,7 +32,7 @@ inputs:
|
|
|
32
32
|
runs:
|
|
33
33
|
using: composite
|
|
34
34
|
steps:
|
|
35
|
-
- uses: codecov/codecov-action@
|
|
35
|
+
- uses: codecov/codecov-action@v6
|
|
36
36
|
with:
|
|
37
37
|
name: ${{ inputs.name }}
|
|
38
38
|
flags: ${{ inputs.flags }}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
remote_repository="${DASHBOARD_REMOTE_REPOSITORY:?}"
|
|
6
|
+
publish_branch="${DASHBOARD_PUBLISH_BRANCH:-master}"
|
|
7
|
+
source_dir="${DASHBOARD_SOURCE_DIR:?}"
|
|
8
|
+
token="${DASHBOARD_TOKEN:?}"
|
|
9
|
+
git_user_name="${DASHBOARD_GIT_USER_NAME:-easyscience[bot]}"
|
|
10
|
+
git_user_email="${DASHBOARD_GIT_USER_EMAIL:?}"
|
|
11
|
+
commit_message="${DASHBOARD_COMMIT_MESSAGE:?}"
|
|
12
|
+
max_attempts="${DASHBOARD_PUSH_ATTEMPTS:-3}"
|
|
13
|
+
delay_seconds="${DASHBOARD_PUSH_DELAY_SECONDS:-15}"
|
|
14
|
+
|
|
15
|
+
workspace_dir="$(mktemp -d)"
|
|
16
|
+
repo_dir="${workspace_dir}/dashboard"
|
|
17
|
+
remote_url="https://x-access-token:${token}@github.com/${remote_repository}.git"
|
|
18
|
+
|
|
19
|
+
cleanup() {
|
|
20
|
+
rm -rf "${workspace_dir}"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
prepare_worktree() {
|
|
24
|
+
if [[ ! -d "${repo_dir}/.git" ]]; then
|
|
25
|
+
git clone --branch "${publish_branch}" --depth 1 "${remote_url}" "${repo_dir}"
|
|
26
|
+
else
|
|
27
|
+
git -C "${repo_dir}" fetch origin "${publish_branch}"
|
|
28
|
+
git -C "${repo_dir}" checkout "${publish_branch}"
|
|
29
|
+
git -C "${repo_dir}" reset --hard "origin/${publish_branch}"
|
|
30
|
+
git -C "${repo_dir}" clean -fd
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
git -C "${repo_dir}" config user.name "${git_user_name}"
|
|
34
|
+
git -C "${repo_dir}" config user.email "${git_user_email}"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
sync_publish_dir() {
|
|
38
|
+
cp -R "${source_dir}/." "${repo_dir}/"
|
|
39
|
+
git -C "${repo_dir}" add .
|
|
40
|
+
|
|
41
|
+
if git -C "${repo_dir}" diff --cached --quiet; then
|
|
42
|
+
return 1
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
git -C "${repo_dir}" commit -m "${commit_message}"
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
trap cleanup EXIT
|
|
49
|
+
|
|
50
|
+
prepare_worktree
|
|
51
|
+
|
|
52
|
+
if ! sync_publish_dir; then
|
|
53
|
+
echo "No dashboard changes to publish."
|
|
54
|
+
exit 0
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
for ((attempt = 1; attempt <= max_attempts; attempt += 1)); do
|
|
58
|
+
if git -C "${repo_dir}" push origin "HEAD:${publish_branch}"; then
|
|
59
|
+
echo "Dashboard published on attempt ${attempt}."
|
|
60
|
+
exit 0
|
|
61
|
+
fi
|
|
62
|
+
|
|
63
|
+
if ((attempt == max_attempts)); then
|
|
64
|
+
echo "Dashboard publish failed after ${max_attempts} attempts." >&2
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
|
|
68
|
+
echo "Dashboard push attempt ${attempt} failed. Retrying in ${delay_seconds}s." >&2
|
|
69
|
+
sleep "${delay_seconds}"
|
|
70
|
+
|
|
71
|
+
prepare_worktree
|
|
72
|
+
|
|
73
|
+
if ! sync_publish_dir; then
|
|
74
|
+
echo "Dashboard changes already exist in the target repository."
|
|
75
|
+
exit 0
|
|
76
|
+
fi
|
|
77
|
+
done
|
|
@@ -27,7 +27,7 @@ jobs:
|
|
|
27
27
|
|
|
28
28
|
steps:
|
|
29
29
|
- name: Checkout repository (for local actions)
|
|
30
|
-
uses: actions/checkout@
|
|
30
|
+
uses: actions/checkout@v6
|
|
31
31
|
|
|
32
32
|
- name: Setup easyscience[bot]
|
|
33
33
|
id: bot
|
|
@@ -38,7 +38,7 @@ jobs:
|
|
|
38
38
|
repositories: ${{ github.event.repository.name }}
|
|
39
39
|
|
|
40
40
|
- name: Checkout repository (with bot token)
|
|
41
|
-
uses: actions/checkout@
|
|
41
|
+
uses: actions/checkout@v6
|
|
42
42
|
with:
|
|
43
43
|
fetch-depth: 0
|
|
44
44
|
token: ${{ steps.bot.outputs.token }}
|
|
@@ -15,11 +15,11 @@ on:
|
|
|
15
15
|
days:
|
|
16
16
|
description: 'Number of days.'
|
|
17
17
|
required: true
|
|
18
|
-
default: 30
|
|
18
|
+
default: '30'
|
|
19
19
|
minimum_runs:
|
|
20
20
|
description: 'The minimum runs to keep for each workflow.'
|
|
21
21
|
required: true
|
|
22
|
-
default: 6
|
|
22
|
+
default: '6'
|
|
23
23
|
delete_workflow_pattern:
|
|
24
24
|
description:
|
|
25
25
|
'The name or filename of the workflow. if not set then it will target all
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
name: Coverage checks
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
|
-
# Trigger the workflow on push
|
|
4
|
+
# Trigger the workflow on push to develop
|
|
5
5
|
push:
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
branches:
|
|
7
|
+
- develop
|
|
8
8
|
# Trigger the workflow on pull request
|
|
9
9
|
pull_request:
|
|
10
10
|
# Allows you to run this workflow manually from the Actions tab
|
|
@@ -15,11 +15,11 @@ permissions:
|
|
|
15
15
|
actions: write
|
|
16
16
|
contents: read
|
|
17
17
|
|
|
18
|
-
# Allow only one concurrent workflow
|
|
19
|
-
# in-progress
|
|
18
|
+
# Allow only one concurrent workflow per PR or branch ref.
|
|
19
|
+
# Cancel in-progress runs only for pull requests, but let branch push runs finish.
|
|
20
20
|
concurrency:
|
|
21
21
|
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
22
|
-
cancel-in-progress:
|
|
22
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
23
23
|
|
|
24
24
|
# Set the environment variables to be used in all jobs defined in this workflow
|
|
25
25
|
env:
|
|
@@ -32,7 +32,7 @@ jobs:
|
|
|
32
32
|
|
|
33
33
|
steps:
|
|
34
34
|
- name: Check-out repository
|
|
35
|
-
uses: actions/checkout@
|
|
35
|
+
uses: actions/checkout@v6
|
|
36
36
|
|
|
37
37
|
- name: Set up pixi
|
|
38
38
|
uses: ./.github/actions/setup-pixi
|
|
@@ -46,7 +46,7 @@ jobs:
|
|
|
46
46
|
|
|
47
47
|
steps:
|
|
48
48
|
- name: Check-out repository
|
|
49
|
-
uses: actions/checkout@
|
|
49
|
+
uses: actions/checkout@v6
|
|
50
50
|
|
|
51
51
|
- name: Set up pixi
|
|
52
52
|
uses: ./.github/actions/setup-pixi
|
|
@@ -63,32 +63,8 @@ jobs:
|
|
|
63
63
|
files: ./coverage-unit.xml
|
|
64
64
|
token: ${{ secrets.CODECOV_TOKEN }}
|
|
65
65
|
|
|
66
|
-
# Job 2: Run integration tests with coverage and upload to Codecov
|
|
67
|
-
integration-tests-coverage:
|
|
68
|
-
runs-on: ubuntu-latest
|
|
69
|
-
|
|
70
|
-
steps:
|
|
71
|
-
- name: Check-out repository
|
|
72
|
-
uses: actions/checkout@v5
|
|
73
|
-
|
|
74
|
-
- name: Set up pixi
|
|
75
|
-
uses: ./.github/actions/setup-pixi
|
|
76
|
-
|
|
77
|
-
- name: Run integration tests with coverage
|
|
78
|
-
run:
|
|
79
|
-
pixi run integration-tests-coverage --cov-report=xml:coverage-integration.xml
|
|
80
|
-
|
|
81
|
-
- name: Upload integration tests coverage to Codecov
|
|
82
|
-
if: ${{ !cancelled() }}
|
|
83
|
-
uses: ./.github/actions/upload-codecov
|
|
84
|
-
with:
|
|
85
|
-
name: integration-tests-job
|
|
86
|
-
flags: integration
|
|
87
|
-
files: ./coverage-integration.xml
|
|
88
|
-
token: ${{ secrets.CODECOV_TOKEN }}
|
|
89
|
-
|
|
90
66
|
# Job 4: Build and publish dashboard (reusable workflow)
|
|
91
67
|
run-reusable-workflows:
|
|
92
|
-
needs: [docstring-coverage, unit-tests-coverage
|
|
68
|
+
needs: [docstring-coverage, unit-tests-coverage] # depend on the previous jobs
|
|
93
69
|
uses: ./.github/workflows/dashboard.yml
|
|
94
70
|
secrets: inherit
|
|
@@ -7,6 +7,10 @@ on:
|
|
|
7
7
|
permissions:
|
|
8
8
|
contents: read
|
|
9
9
|
|
|
10
|
+
concurrency:
|
|
11
|
+
group: dashboard-publish-${{ github.repository }}
|
|
12
|
+
cancel-in-progress: false
|
|
13
|
+
|
|
10
14
|
# Set the environment variables to be used in all jobs defined in this workflow
|
|
11
15
|
env:
|
|
12
16
|
CI_BRANCH: ${{ github.head_ref || github.ref_name }}
|
|
@@ -21,16 +25,20 @@ jobs:
|
|
|
21
25
|
|
|
22
26
|
steps:
|
|
23
27
|
- name: Checkout repository
|
|
24
|
-
uses: actions/checkout@
|
|
28
|
+
uses: actions/checkout@v6
|
|
25
29
|
with:
|
|
26
30
|
fetch-depth: 0
|
|
27
31
|
|
|
28
32
|
- name: Set up pixi
|
|
29
33
|
uses: ./.github/actions/setup-pixi
|
|
30
34
|
|
|
35
|
+
# Install badgery into the active Pixi environment without modifying
|
|
36
|
+
# pixi.toml/pixi.lock. Using `pixi add` here re-solves the whole project
|
|
37
|
+
# and rebuilds the local editable package, which can cause intermittent
|
|
38
|
+
# Linux CI failures (`Text file busy`, os error 26).
|
|
31
39
|
- name: Install badgery
|
|
32
40
|
shell: bash
|
|
33
|
-
run: pixi
|
|
41
|
+
run: pixi run python -m pip install git+https://github.com/enhantica/badgery
|
|
34
42
|
|
|
35
43
|
- name: Run docstring coverage and code complexity/maintainability checks
|
|
36
44
|
run: |
|
|
@@ -81,22 +89,25 @@ jobs:
|
|
|
81
89
|
${{ github.event.repository.name }}
|
|
82
90
|
dashboard
|
|
83
91
|
|
|
84
|
-
#
|
|
92
|
+
# Push to external dashboard repository with retry logic.
|
|
85
93
|
# Retry is needed to handle transient GitHub API/authentication issues
|
|
86
94
|
# that occasionally cause 403 errors when multiple workflows push concurrently.
|
|
87
95
|
# Uses personal_token (not github_token) as GITHUB_TOKEN cannot access external repos.
|
|
88
|
-
- name:
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
- name:
|
|
97
|
+
Push to ${{ env.REPO_OWNER }}/dashboard/${{ env.REPO_NAME }}/${{ env.CI_BRANCH
|
|
98
|
+
}}
|
|
99
|
+
shell: bash
|
|
100
|
+
env:
|
|
101
|
+
DASHBOARD_COMMIT_MESSAGE: ${{ env.CI_BRANCH }}
|
|
102
|
+
DASHBOARD_GIT_USER_EMAIL:
|
|
103
|
+
${{ vars.EASYSCIENCE_APP_ID }}+easyscience[bot]@users.noreply.github.com
|
|
104
|
+
DASHBOARD_PUSH_ATTEMPTS: '3'
|
|
105
|
+
DASHBOARD_PUSH_DELAY_SECONDS: '15'
|
|
106
|
+
DASHBOARD_PUBLISH_BRANCH: master
|
|
107
|
+
DASHBOARD_REMOTE_REPOSITORY: ${{ env.REPO_OWNER }}/dashboard
|
|
108
|
+
DASHBOARD_SOURCE_DIR: ./_dashboard_publish
|
|
109
|
+
DASHBOARD_TOKEN: ${{ steps.bot.outputs.token }}
|
|
110
|
+
run: bash ./.github/scripts/publish-dashboard.sh
|
|
100
111
|
|
|
101
112
|
- name: Add dashboard link to summary
|
|
102
113
|
run: |
|
|
@@ -27,12 +27,16 @@ on:
|
|
|
27
27
|
# Allows you to run this workflow manually from the Actions tab
|
|
28
28
|
workflow_dispatch:
|
|
29
29
|
|
|
30
|
-
#
|
|
31
|
-
#
|
|
32
|
-
#
|
|
30
|
+
# - Non-tagged pushes and pull requests all use `docs-dev` group, so
|
|
31
|
+
# they cancel each other.
|
|
32
|
+
# - Tagged pushes use their own group like docs-v1.2.3, so they do not
|
|
33
|
+
# cancel non-tagged runs, and non-tagged runs do not cancel them.
|
|
33
34
|
concurrency:
|
|
34
|
-
group:
|
|
35
|
-
|
|
35
|
+
group: >-
|
|
36
|
+
${{ startsWith(github.ref, 'refs/tags/v')
|
|
37
|
+
&& format('docs-{0}', github.ref_name)
|
|
38
|
+
|| 'docs-dev' }}
|
|
39
|
+
cancel-in-progress: true
|
|
36
40
|
|
|
37
41
|
# Set the environment variables to be used in all jobs defined in this workflow
|
|
38
42
|
env:
|
|
@@ -83,7 +87,7 @@ jobs:
|
|
|
83
87
|
# Check out the repository source code.
|
|
84
88
|
# Note: The gh-pages branch is fetched separately later for mike deployment.
|
|
85
89
|
- name: Checkout repository
|
|
86
|
-
uses: actions/checkout@
|
|
90
|
+
uses: actions/checkout@v6
|
|
87
91
|
|
|
88
92
|
# Activate dark mode to create documentation with Plotly charts in dark mode
|
|
89
93
|
# Need a better solution to automatically switch the chart colour theme based on the mkdocs material switcher
|
|
@@ -119,11 +123,14 @@ jobs:
|
|
|
119
123
|
|
|
120
124
|
# Build the static files for the documentation site for local inspection
|
|
121
125
|
# Input: docs/ directory containing the Markdown files
|
|
122
|
-
# Output: site/ directory containing the generated HTML files
|
|
126
|
+
# Output: docs/site/ directory containing the generated HTML files
|
|
127
|
+
# Also verifies that mkdocstrings generated docs/site/objects.inv.
|
|
123
128
|
- name: Build site for local check
|
|
124
|
-
run:
|
|
129
|
+
run: |
|
|
130
|
+
pixi run docs-build-local
|
|
131
|
+
pixi run docs-inventory-check
|
|
125
132
|
|
|
126
|
-
# Upload the static files from the site/ directory to be used for
|
|
133
|
+
# Upload the static files from the docs/site/ directory to be used for
|
|
127
134
|
# local check
|
|
128
135
|
- name: Upload built site as artifact
|
|
129
136
|
uses: ./.github/actions/upload-artifact
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Verifies if the current issue has at least one `[scope]` label and one
|
|
2
|
+
# `[priority]` label. If either is missing, the workflow adds a reminder label.
|
|
3
|
+
|
|
4
|
+
name: Issue labels check
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
issues:
|
|
8
|
+
types: [opened, labeled, unlabeled]
|
|
9
|
+
|
|
10
|
+
permissions:
|
|
11
|
+
issues: write
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
check-labels:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
|
|
17
|
+
concurrency:
|
|
18
|
+
group: issue-labels-${{ github.event.issue.number }}
|
|
19
|
+
cancel-in-progress: true
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Ensure [scope] label
|
|
23
|
+
uses: Rindrics/expect-label-prefix@v1.2.1
|
|
24
|
+
with:
|
|
25
|
+
repository_full_name: ${{ github.repository }}
|
|
26
|
+
token: ${{ github.token }}
|
|
27
|
+
label_prefix: '[scope]'
|
|
28
|
+
label_separator: ' '
|
|
29
|
+
add_label: 'true'
|
|
30
|
+
default_label: '[scope] ⚠️ label needed'
|
|
31
|
+
|
|
32
|
+
- name: Ensure [priority] label
|
|
33
|
+
uses: Rindrics/expect-label-prefix@v1.2.1
|
|
34
|
+
with:
|
|
35
|
+
repository_full_name: ${{ github.repository }}
|
|
36
|
+
token: ${{ github.token }}
|
|
37
|
+
label_prefix: '[priority]'
|
|
38
|
+
label_separator: ' '
|
|
39
|
+
add_label: 'true'
|
|
40
|
+
default_label: '[priority] ⚠️ label needed'
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# The workflow checks
|
|
2
|
+
# - the validity of pyproject.toml,
|
|
3
|
+
# - the presence and correctness of SPDX license headers,
|
|
4
|
+
# - linting and formatting of Python code,
|
|
5
|
+
# - linting and formatting of docstrings in Python code,
|
|
6
|
+
# - formatting of non-Python files (like markdown and toml).
|
|
7
|
+
# - linting of Python code in Jupyter notebooks (for library template).
|
|
8
|
+
#
|
|
9
|
+
# A summary of the checks is added to the GitHub Actions summary.
|
|
10
|
+
|
|
11
|
+
name: Lint and format checks
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
# Trigger the workflow on push
|
|
15
|
+
push:
|
|
16
|
+
branches-ignore: [master, main] # Already verified in PR
|
|
17
|
+
# Do not run this workflow on creating a new tag starting with
|
|
18
|
+
# 'v', e.g. 'v1.0.3' (see publish-pypi.yml)
|
|
19
|
+
tags-ignore: ['v*']
|
|
20
|
+
# Trigger the workflow on pull request
|
|
21
|
+
pull_request:
|
|
22
|
+
# Allows you to run this workflow manually from the Actions tab
|
|
23
|
+
workflow_dispatch:
|
|
24
|
+
|
|
25
|
+
# Allow only one concurrent workflow, skipping runs queued between the run
|
|
26
|
+
# in-progress and latest queued. And cancel in-progress runs.
|
|
27
|
+
concurrency:
|
|
28
|
+
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
|
|
29
|
+
cancel-in-progress: true
|
|
30
|
+
|
|
31
|
+
permissions:
|
|
32
|
+
contents: read
|
|
33
|
+
|
|
34
|
+
# Set the environment variables to be used in all jobs defined in this workflow
|
|
35
|
+
env:
|
|
36
|
+
CI_BRANCH: ${{ github.head_ref || github.ref_name }}
|
|
37
|
+
|
|
38
|
+
jobs:
|
|
39
|
+
lint-format:
|
|
40
|
+
runs-on: ubuntu-latest
|
|
41
|
+
|
|
42
|
+
steps:
|
|
43
|
+
- name: Checkout repository
|
|
44
|
+
uses: actions/checkout@v6
|
|
45
|
+
|
|
46
|
+
- name: Set up pixi
|
|
47
|
+
uses: ./.github/actions/setup-pixi
|
|
48
|
+
|
|
49
|
+
- name: Run post-install developer steps
|
|
50
|
+
run: pixi run post-install
|
|
51
|
+
|
|
52
|
+
- name: Check validity of pyproject.toml
|
|
53
|
+
id: pyproject
|
|
54
|
+
continue-on-error: true
|
|
55
|
+
shell: bash
|
|
56
|
+
run: pixi run pyproject-check
|
|
57
|
+
|
|
58
|
+
- name: Check SPDX license headers
|
|
59
|
+
id: license_headers
|
|
60
|
+
continue-on-error: true
|
|
61
|
+
shell: bash
|
|
62
|
+
run: pixi run license-check
|
|
63
|
+
|
|
64
|
+
- name: Check linting of Python code
|
|
65
|
+
id: py_lint
|
|
66
|
+
continue-on-error: true
|
|
67
|
+
shell: bash
|
|
68
|
+
run: pixi run py-lint-check
|
|
69
|
+
|
|
70
|
+
- name: Check formatting of Python code
|
|
71
|
+
id: py_format
|
|
72
|
+
continue-on-error: true
|
|
73
|
+
shell: bash
|
|
74
|
+
run: pixi run py-format-check
|
|
75
|
+
|
|
76
|
+
- name: Check linting of docstrings in Python code
|
|
77
|
+
id: docstring_lint
|
|
78
|
+
continue-on-error: true
|
|
79
|
+
shell: bash
|
|
80
|
+
run: pixi run docstring-lint-check
|
|
81
|
+
|
|
82
|
+
- name: Check formatting of non-Python files (md, toml, etc.)
|
|
83
|
+
id: nonpy_format
|
|
84
|
+
continue-on-error: true
|
|
85
|
+
shell: bash
|
|
86
|
+
run: pixi run nonpy-format-check
|
|
87
|
+
|
|
88
|
+
- name: Check linting of Python code in Jupyter notebooks (ipynb)
|
|
89
|
+
id: notebook_lint
|
|
90
|
+
continue-on-error: true
|
|
91
|
+
shell: bash
|
|
92
|
+
run: pixi run notebook-lint-check
|
|
93
|
+
|
|
94
|
+
# Add summary
|
|
95
|
+
- name: Add quality checks summary
|
|
96
|
+
if: always()
|
|
97
|
+
shell: bash
|
|
98
|
+
run: |
|
|
99
|
+
{
|
|
100
|
+
echo "## 🧪 Checks Summary"
|
|
101
|
+
echo ""
|
|
102
|
+
echo "| Check | Status |"
|
|
103
|
+
echo "|-------|--------|"
|
|
104
|
+
echo "| pyproject.toml | ${{ steps.pyproject.outcome == 'success' && '✅' || '❌' }} |"
|
|
105
|
+
echo "| license headers | ${{ steps.license_headers.outcome == 'success' && '✅' || '❌' }} |"
|
|
106
|
+
echo "| py lint | ${{ steps.py_lint.outcome == 'success' && '✅' || '❌' }} |"
|
|
107
|
+
echo "| py format | ${{ steps.py_format.outcome == 'success' && '✅' || '❌' }} |"
|
|
108
|
+
echo "| docstring lint | ${{ steps.docstring_lint.outcome == 'success' && '✅' || '❌' }} |"
|
|
109
|
+
echo "| nonpy format | ${{ steps.nonpy_format.outcome == 'success' && '✅' || '❌' }} |"
|
|
110
|
+
echo "| notebooks lint | ${{ steps.notebook_lint.outcome == 'success' && '✅' || '❌' }} |"
|
|
111
|
+
} >> "$GITHUB_STEP_SUMMARY"
|
|
112
|
+
|
|
113
|
+
# Fail job if any check failed
|
|
114
|
+
- name: Fail job if any check failed
|
|
115
|
+
if: |
|
|
116
|
+
steps.pyproject.outcome == 'failure'
|
|
117
|
+
|| steps.license_headers.outcome == 'failure'
|
|
118
|
+
|| steps.py_lint.outcome == 'failure'
|
|
119
|
+
|| steps.py_format.outcome == 'failure'
|
|
120
|
+
|| steps.docstring_lint.outcome == 'failure'
|
|
121
|
+
|| steps.nonpy_format.outcome == 'failure'
|
|
122
|
+
|| steps.notebook_lint.outcome == 'failure'
|
|
123
|
+
shell: bash
|
|
124
|
+
run: exit 1
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Verifies if a pull request has at least one label from a set of valid
|
|
2
|
+
# labels before it can be merged.
|
|
3
|
+
#
|
|
4
|
+
# The label validation is delegated to `mheap/github-action-required-labels`,
|
|
5
|
+
# which checks the current PR labels via the GitHub API and can add or update a
|
|
6
|
+
# PR comment when the required label set is missing.
|
|
7
|
+
|
|
8
|
+
name: PR labels check
|
|
9
|
+
|
|
10
|
+
on:
|
|
11
|
+
pull_request_target:
|
|
12
|
+
types: [opened, labeled, unlabeled, synchronize]
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
issues: write
|
|
16
|
+
pull-requests: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
check-labels:
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
|
|
22
|
+
steps:
|
|
23
|
+
- name: Checkout repository
|
|
24
|
+
uses: actions/checkout@v6
|
|
25
|
+
|
|
26
|
+
- name: Setup easyscience[bot]
|
|
27
|
+
id: bot
|
|
28
|
+
uses: ./.github/actions/setup-easyscience-bot
|
|
29
|
+
with:
|
|
30
|
+
app-id: ${{ vars.EASYSCIENCE_APP_ID }}
|
|
31
|
+
private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
|
|
32
|
+
|
|
33
|
+
- uses: mheap/github-action-required-labels@v5
|
|
34
|
+
with:
|
|
35
|
+
token: ${{ steps.bot.outputs.token }}
|
|
36
|
+
add_comment: true
|
|
37
|
+
mode: minimum
|
|
38
|
+
count: 1
|
|
39
|
+
labels: |
|
|
40
|
+
[bot] release
|
|
41
|
+
[scope] bug
|
|
42
|
+
[scope] documentation
|
|
43
|
+
[scope] enhancement
|
|
44
|
+
[scope] maintenance
|
|
45
|
+
[scope] significant
|