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.
Files changed (232) hide show
  1. easyscience-2.4.0/.codecov.yml +26 -0
  2. {easyscience-2.3.1 → easyscience-2.4.0}/.copier-answers.yml +2 -2
  3. {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/download-artifact/action.yml +2 -2
  4. {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/github-script/action.yml +1 -1
  5. {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/setup-easyscience-bot/action.yml +2 -2
  6. {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/setup-pixi/action.yml +2 -2
  7. {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/upload-artifact/action.yml +2 -2
  8. {easyscience-2.3.1 → easyscience-2.4.0}/.github/actions/upload-codecov/action.yml +2 -2
  9. easyscience-2.4.0/.github/scripts/publish-dashboard.sh +77 -0
  10. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/backmerge.yml +2 -2
  11. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/cleanup.yml +2 -2
  12. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/coverage.yml +9 -33
  13. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/dashboard.yml +26 -15
  14. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/docs.yml +16 -9
  15. easyscience-2.4.0/.github/workflows/issues-labels.yml +40 -0
  16. easyscience-2.4.0/.github/workflows/lint-format.yml +124 -0
  17. easyscience-2.4.0/.github/workflows/pr-labels.yml +45 -0
  18. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/pypi-publish.yml +1 -1
  19. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/pypi-test.yml +18 -14
  20. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/release-notes.yml +2 -2
  21. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/release-pr.yml +2 -2
  22. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/security.yml +2 -2
  23. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/test-trigger.yml +1 -1
  24. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/test.yml +50 -18
  25. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/tutorial-tests-trigger.yml +1 -1
  26. {easyscience-2.3.1 → easyscience-2.4.0}/.github/workflows/tutorial-tests.yml +1 -5
  27. {easyscience-2.3.1 → easyscience-2.4.0}/.gitignore +1 -0
  28. {easyscience-2.3.1 → easyscience-2.4.0}/.pre-commit-config.yaml +12 -12
  29. {easyscience-2.3.1 → easyscience-2.4.0}/.prettierignore +19 -1
  30. {easyscience-2.3.1 → easyscience-2.4.0}/CONTRIBUTING.md +115 -72
  31. {easyscience-2.3.1 → easyscience-2.4.0}/PKG-INFO +12 -11
  32. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/javascripts/extra.js +6 -8
  33. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/javascripts/mathjax.js +12 -6
  34. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/stylesheets/extra.css +8 -1
  35. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/installation-and-setup/index.md +18 -21
  36. easyscience-2.4.0/docs/docs/tutorials/fitting-bayesian.ipynb +518 -0
  37. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/index.md +3 -0
  38. easyscience-2.4.0/docs/docs/user-guide/controlling-log-output.md +203 -0
  39. easyscience-2.4.0/docs/docs/user-guide/index.md +10 -0
  40. {easyscience-2.3.1 → easyscience-2.4.0}/docs/mkdocs.yml +25 -4
  41. easyscience-2.4.0/pixi.lock +10306 -0
  42. {easyscience-2.3.1 → easyscience-2.4.0}/pixi.toml +87 -83
  43. {easyscience-2.3.1 → easyscience-2.4.0}/pyproject.toml +120 -57
  44. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/__init__.py +2 -0
  45. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/__init__.py +2 -2
  46. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/based_base.py +81 -32
  47. easyscience-2.4.0/src/easyscience/base_classes/collection_base.py +18 -0
  48. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/easy_list.py +181 -48
  49. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/model_base.py +56 -18
  50. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/base_classes/new_base.py +73 -24
  51. easyscience-2.4.0/src/easyscience/base_classes/obj_base.py +18 -0
  52. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/available_minimizers.py +8 -16
  53. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/calculators/interface_factory.py +94 -54
  54. easyscience-2.4.0/src/easyscience/fitting/fitter.py +529 -0
  55. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/bumps_utils/eval_counter.py +2 -1
  56. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/bumps_utils/progress_monitor.py +3 -2
  57. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_base.py +128 -62
  58. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_bumps.py +335 -94
  59. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_dfo.py +142 -66
  60. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/minimizer_lmfit.py +127 -62
  61. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/utils.py +3 -2
  62. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/multi_fitter.py +68 -28
  63. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/global_object.py +19 -10
  64. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/hugger/hugger.py +5 -3
  65. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/hugger/property.py +46 -17
  66. easyscience-2.4.0/src/easyscience/global_object/logger.py +204 -0
  67. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/map.py +26 -13
  68. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/undo_redo.py +37 -33
  69. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/io/serializer_base.py +128 -50
  70. easyscience-2.4.0/src/easyscience/io/serializer_component.py +123 -0
  71. easyscience-2.4.0/src/easyscience/io/serializer_dict.py +78 -0
  72. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/analysis.py +3 -2
  73. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/experiment.py +3 -2
  74. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/job.py +4 -3
  75. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/theoreticalmodel.py +3 -2
  76. easyscience-2.4.0/src/easyscience/legacy/__init__.py +7 -0
  77. {easyscience-2.3.1/src/easyscience/base_classes → easyscience-2.4.0/src/easyscience/legacy}/collection_base.py +139 -52
  78. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/dict.py +82 -35
  79. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/json.py +50 -29
  80. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/legacy_core.py +103 -40
  81. {easyscience-2.3.1/src/easyscience/base_classes → easyscience-2.4.0/src/easyscience/legacy}/obj_base.py +40 -25
  82. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/legacy/xml.py +49 -23
  83. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/models/polynomial.py +16 -4
  84. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/classUtils.py +34 -20
  85. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/decorators.py +25 -13
  86. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/string.py +29 -8
  87. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_any_type.py +26 -16
  88. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_array.py +356 -127
  89. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_base.py +130 -44
  90. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_bool.py +23 -6
  91. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_number.py +162 -57
  92. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/descriptor_str.py +23 -6
  93. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/parameter.py +366 -119
  94. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/parameter_dependency_resolver.py +49 -18
  95. easyscience-2.4.0/tests/functional/test_smoke.py +20 -0
  96. {easyscience-2.3.1 → easyscience-2.4.0}/tests/integration/fitting/test_fitter.py +13 -13
  97. {easyscience-2.3.1 → easyscience-2.4.0}/tests/integration/fitting/test_multi_fitter.py +212 -0
  98. easyscience-2.4.0/tests/unit/base_classes/test_deprecated_wrappers.py +87 -0
  99. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_easy_list.py +180 -29
  100. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_obj_base.py +1 -1
  101. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/calculators/test_interface_factory.py +13 -10
  102. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_bumps.py +399 -4
  103. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_dfo.py +14 -14
  104. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_lmfit.py +12 -7
  105. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/test_fitter.py +153 -0
  106. easyscience-2.4.0/tests/unit/fitting/test_multi_fitter.py +167 -0
  107. easyscience-2.4.0/tests/unit/global_object/test_logger.py +370 -0
  108. easyscience-2.4.0/tests/unit/legacy/test_collection_base.py +155 -0
  109. easyscience-2.4.0/tests/unit/legacy/test_obj_base.py +119 -0
  110. easyscience-2.4.0/tools/license_headers.py +321 -0
  111. {easyscience-2.3.1 → easyscience-2.4.0}/tools/update_github_labels.py +3 -1
  112. easyscience-2.3.1/.codecov.yml +0 -8
  113. easyscience-2.3.1/.github/workflows/issues-labels.yml +0 -42
  114. easyscience-2.3.1/.github/workflows/lint-format.yml +0 -130
  115. easyscience-2.3.1/.github/workflows/pr-labels.yml +0 -56
  116. easyscience-2.3.1/codecov.yml +0 -13
  117. easyscience-2.3.1/docs/docs/user-guide/index.md +0 -8
  118. easyscience-2.3.1/pixi.lock +0 -10296
  119. easyscience-2.3.1/src/easyscience/fitting/fitter.py +0 -317
  120. easyscience-2.3.1/src/easyscience/global_object/logger.py +0 -31
  121. easyscience-2.3.1/src/easyscience/io/serializer_component.py +0 -83
  122. easyscience-2.3.1/src/easyscience/io/serializer_dict.py +0 -57
  123. easyscience-2.3.1/tests/unit/fitting/test_multi_fitter.py +0 -63
  124. easyscience-2.3.1/tools/add_spdx.py +0 -149
  125. easyscience-2.3.1/tools/check_spdx.py +0 -43
  126. easyscience-2.3.1/tools/remove_spdx.py +0 -39
  127. easyscience-2.3.1/tools/test_scripts.py +0 -55
  128. {easyscience-2.3.1 → easyscience-2.4.0}/.badgery.yaml +0 -0
  129. {easyscience-2.3.1 → easyscience-2.4.0}/.coveragerc +0 -0
  130. {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/pages-deployment.json +0 -0
  131. {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/rulesets-develop.json +0 -0
  132. {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/rulesets-gh-pages.json +0 -0
  133. {easyscience-2.3.1 → easyscience-2.4.0}/.github/configs/rulesets-master.json +0 -0
  134. {easyscience-2.3.1 → easyscience-2.4.0}/.github/scripts/backmerge-conflict-issue.js +0 -0
  135. {easyscience-2.3.1 → easyscience-2.4.0}/LICENSE +0 -0
  136. {easyscience-2.3.1 → easyscience-2.4.0}/README.md +0 -0
  137. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/base_classes.md +0 -0
  138. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/fitting.md +0 -0
  139. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/global_object.md +0 -0
  140. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/index.md +0 -0
  141. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/io.md +0 -0
  142. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/job.md +0 -0
  143. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/models.md +0 -0
  144. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/utils.md +0 -0
  145. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/api-reference/variable.md +0 -0
  146. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/images/favicon.png +0 -0
  147. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/images/logo_dark.svg +0 -0
  148. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/assets/images/logo_light.svg +0 -0
  149. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/index.md +0 -0
  150. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/introduction/index.md +0 -0
  151. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/fitting-qens.ipynb +0 -0
  152. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/fitting-sans.ipynb +0 -0
  153. {easyscience-2.3.1 → easyscience-2.4.0}/docs/docs/tutorials/progress-callback.ipynb +0 -0
  154. {easyscience-2.3.1 → easyscience-2.4.0}/docs/includes/abbreviations.md +0 -0
  155. {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/.icons/app.svg +0 -0
  156. {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/.icons/easyscience.svg +0 -0
  157. {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/.icons/google-colab.svg +0 -0
  158. {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/main.html +0 -0
  159. {easyscience-2.3.1 → easyscience-2.4.0}/docs/overrides/partials/logo.html +0 -0
  160. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/README.rst +0 -0
  161. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/base/README.rst +0 -0
  162. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/base/plot_baseclass1.py +0 -0
  163. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/Examples/fitting/README.rst +0 -0
  164. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/PARAMETER_DEPENDENCY_SERIALIZATION.md +0 -0
  165. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/dataset_examples.ipynb +0 -0
  166. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/dimer_example.ipynb +0 -0
  167. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example1.py +0 -0
  168. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example1_dream.py +0 -0
  169. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example2.py +0 -0
  170. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example3.py +0 -0
  171. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example4.py +0 -0
  172. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example5_broken.py +0 -0
  173. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example6_broken.py +0 -0
  174. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset.py +0 -0
  175. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset2.py +0 -0
  176. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset2pt2.py +0 -0
  177. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset2pt2_broken.py +0 -0
  178. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset3.py +0 -0
  179. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset3pt2.py +0 -0
  180. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset4.py +0 -0
  181. {easyscience-2.3.1 → easyscience-2.4.0}/legacy/examples_old/example_dataset4_2.py +0 -0
  182. {easyscience-2.3.1 → easyscience-2.4.0}/prettierrc.toml +0 -0
  183. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/__init__.py +0 -0
  184. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/calculators/__init__.py +0 -0
  185. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/__init__.py +0 -0
  186. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/bumps_utils/__init__.py +0 -0
  187. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/fitting/minimizers/factory.py +0 -0
  188. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/__init__.py +0 -0
  189. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/global_object/hugger/__init__.py +0 -0
  190. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/io/__init__.py +0 -0
  191. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/job/__init__.py +0 -0
  192. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/models/__init__.py +0 -0
  193. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/__init__.py +0 -0
  194. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/utils/classTools.py +0 -0
  195. {easyscience-2.3.1 → easyscience-2.4.0}/src/easyscience/variable/__init__.py +0 -0
  196. {easyscience-2.3.1 → easyscience-2.4.0}/tests/conftest.py +0 -0
  197. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/__init__.py +0 -0
  198. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_collection_base.py +0 -0
  199. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_model_base.py +0 -0
  200. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/base_classes/test_new_base.py +0 -0
  201. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/__init__.py +0 -0
  202. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/calculators/__init__.py +0 -0
  203. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/__init__.py +0 -0
  204. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_factory.py +0 -0
  205. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_minimizer_base.py +0 -0
  206. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/fitting/minimizers/test_utils.py +0 -0
  207. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/__init__.py +0 -0
  208. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_entry_list_comprehensive.py +0 -0
  209. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_global_object.py +0 -0
  210. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_integration_comprehensive.py +0 -0
  211. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_map.py +0 -0
  212. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_undo_redo.py +0 -0
  213. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/global_object/test_undo_redo_comprehensive.py +0 -0
  214. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/io/test_serializer_base.py +0 -0
  215. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/io/test_serializer_component.py +0 -0
  216. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/io/test_serializer_dict.py +0 -0
  217. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/__init__.py +0 -0
  218. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/test_dict.py +0 -0
  219. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/test_json.py +0 -0
  220. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/legacy/test_xml.py +0 -0
  221. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/models/__init__.py +0 -0
  222. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/models/test_polynomial.py +0 -0
  223. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/__init__.py +0 -0
  224. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_any_type.py +0 -0
  225. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_array.py +0 -0
  226. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_base.py +0 -0
  227. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_bool.py +0 -0
  228. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_number.py +0 -0
  229. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_descriptor_str.py +0 -0
  230. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_parameter.py +0 -0
  231. {easyscience-2.3.1 → easyscience-2.4.0}/tests/unit/variable/test_parameter_dependency_serialization.py +0 -0
  232. {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.10.0
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.13'
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: 'Generic wrapper for actions/download-artifact'
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@v4
42
+ uses: actions/download-artifact@v8
43
43
  with:
44
44
  name: ${{ inputs.name }}
45
45
  path: ${{ inputs.path }}
@@ -13,7 +13,7 @@ inputs:
13
13
  runs:
14
14
  using: 'composite'
15
15
  steps:
16
- - uses: actions/github-script@v8
16
+ - uses: actions/github-script@v9
17
17
  with:
18
18
  script: ${{ inputs.script }}
19
19
  github-token: ${{ inputs.github-token }}
@@ -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@v2
25
+ uses: actions/create-github-app-token@v3
26
26
  with:
27
- app-id: ${{ inputs.app-id }}
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: 'Sets up pixi with common configuration'
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.4
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: 'Generic wrapper for actions/upload-artifact'
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@v4
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: 'Generic wrapper for codecov/codecov-action@v5'
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@v5
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@v5
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@v5
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
- # Do not run on version tags (those are handled by other workflows)
7
- tags-ignore: ['v*']
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, skipping runs queued between the run
19
- # in-progress and latest queued. And cancel in-progress runs.
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: true
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@v5
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@v5
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, integration-tests-coverage] # depend on the previous jobs
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@v5
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 add --pypi --git https://github.com/enhantica/badgery badgery
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
- # Publish to external dashboard repository with retry logic.
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: Publish to main branch of ${{ github.repository }}
89
- uses: Wandalen/wretry.action@v3.8.0
90
- with:
91
- attempt_limit: 3
92
- attempt_delay: 15000 # 15 seconds between retries
93
- action: peaceiris/actions-gh-pages@v4
94
- with: |
95
- publish_dir: ./_dashboard_publish
96
- keep_files: true
97
- external_repository: ${{ env.REPO_OWNER }}/dashboard
98
- publish_branch: master
99
- personal_token: ${{ steps.bot.outputs.token }}
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
- # Allow only one concurrent deployment to gh-pages at a time.
31
- # All docs workflows share the same concurrency group to prevent race conditions
32
- # when multiple branches/tags trigger simultaneous deployments.
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: docs-gh-pages-deploy
35
- cancel-in-progress: false
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@v5
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: pixi run docs-build-local
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
@@ -20,7 +20,7 @@ jobs:
20
20
 
21
21
  steps:
22
22
  - name: Check-out repository
23
- uses: actions/checkout@v5
23
+ uses: actions/checkout@v6
24
24
  with:
25
25
  fetch-depth: 0 # full history with tags to get the version number by versioningit
26
26