easydiffraction 0.9.1__tar.gz → 0.10.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 (351) hide show
  1. easydiffraction-0.10.0/.github/workflows/backmerge.yaml +66 -0
  2. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/dashboard.yaml +14 -1
  3. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/docs.yaml +60 -37
  4. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/pypi-test.yaml +2 -4
  5. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/release-pr.yaml +18 -4
  6. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/PKG-INFO +1 -1
  7. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/analysis.py +38 -1
  8. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/fitting.py +10 -4
  9. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/utils/logging.py +3 -3
  10. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/test_analysis.py +53 -0
  11. easydiffraction-0.10.0/tests/unit/easydiffraction/analysis/test_fitting.py +92 -0
  12. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/utils/test_utils.py +1 -0
  13. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-1.py +4 -0
  14. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-10.py +1 -0
  15. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-11.py +1 -0
  16. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-12.py +1 -0
  17. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-13.py +5 -0
  18. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-2.py +1 -0
  19. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-3.py +5 -0
  20. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-4.py +1 -0
  21. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-5.py +1 -0
  22. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-6.py +12 -0
  23. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-7.py +4 -0
  24. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-8.py +1 -0
  25. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/ed-9.py +1 -0
  26. easydiffraction-0.9.1/.github/workflows/backmerge-pr.yaml +0 -81
  27. easydiffraction-0.9.1/tests/unit/easydiffraction/analysis/test_fitting.py +0 -36
  28. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.badgery.yaml +0 -0
  29. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/cleanup.yaml +0 -0
  30. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/coverage.yaml +0 -0
  31. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/labels.yaml +0 -0
  32. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/pypi-publish.yaml +0 -0
  33. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/quality.yaml +0 -0
  34. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/release-notes.yaml +0 -0
  35. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/security.yaml +0 -0
  36. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/test-trigger.yaml +0 -0
  37. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/test.yaml +0 -0
  38. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/tutorial-tests-colab.yaml +0 -0
  39. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/tutorial-tests-trigger.yaml +0 -0
  40. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.github/workflows/tutorial-tests.yaml +0 -0
  41. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.gitignore +0 -0
  42. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.pre-commit-config.yaml +0 -0
  43. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/.prettierignore +0 -0
  44. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/CONTRIBUTING.md +0 -0
  45. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/DEVELOPMENT.md +0 -0
  46. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/LICENSE +0 -0
  47. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/README.md +0 -0
  48. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/deps/pycrysfml-0.1.6-py312-none-macosx_14_0_arm64.whl +0 -0
  49. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/deps/pycrysfml-0.1.6-py312-none-win_amd64.whl +0 -0
  50. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/analysis.md +0 -0
  51. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/core.md +0 -0
  52. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/crystallography.md +0 -0
  53. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/display.md +0 -0
  54. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/experiments.md +0 -0
  55. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/index.md +0 -0
  56. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/io.md +0 -0
  57. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/project.md +0 -0
  58. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/sample_models.md +0 -0
  59. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/summary.md +0 -0
  60. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/api-reference/utils.md +0 -0
  61. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/architecture/package-structure-full.md +0 -0
  62. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/architecture/package-structure-short.md +0 -0
  63. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/assets/images/user-guide/data-acquisition_2d-raw-data.jpg +0 -0
  64. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/assets/images/user-guide/data-acquisition_instrument.png +0 -0
  65. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/assets/images/user-guide/data-analysis_model.png +0 -0
  66. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/assets/images/user-guide/data-analysis_refinement.png +0 -0
  67. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/assets/images/user-guide/data-reduction_1d-pattern.png +0 -0
  68. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/index.md +0 -0
  69. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/installation-and-setup/index.md +0 -0
  70. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/introduction/index.md +0 -0
  71. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/mkdocs.yml +0 -0
  72. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/tutorials/index.md +0 -0
  73. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/analysis-workflow/analysis.md +0 -0
  74. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/analysis-workflow/experiment.md +0 -0
  75. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/analysis-workflow/index.md +0 -0
  76. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/analysis-workflow/model.md +0 -0
  77. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/analysis-workflow/project.md +0 -0
  78. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/analysis-workflow/summary.md +0 -0
  79. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/concept.md +0 -0
  80. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/data-format.md +0 -0
  81. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/first-steps.md +0 -0
  82. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/glossary.md +0 -0
  83. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/index.md +0 -0
  84. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/_diffrn_radiation.md +0 -0
  85. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/_diffrn_radiation_wavelength.md +0 -0
  86. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/_exptl_crystal.md +0 -0
  87. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/_extinction.md +0 -0
  88. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/_pd_calib.md +0 -0
  89. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/atom_site.md +0 -0
  90. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/background.md +0 -0
  91. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/cell.md +0 -0
  92. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/expt_type.md +0 -0
  93. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/instrument.md +0 -0
  94. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/linked_phases.md +0 -0
  95. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/pd_meas.md +0 -0
  96. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/peak.md +0 -0
  97. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters/space_group.md +0 -0
  98. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/docs/user-guide/parameters.md +0 -0
  99. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/pixi.lock +0 -0
  100. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/pixi.toml +0 -0
  101. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/prettierrc.toml +0 -0
  102. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/pycrysfml.md +0 -0
  103. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/pyproject.toml +0 -0
  104. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/pytest.ini +0 -0
  105. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/__init__.py +0 -0
  106. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/__main__.py +0 -0
  107. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/__init__.py +0 -0
  108. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/calculators/__init__.py +0 -0
  109. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/calculators/base.py +0 -0
  110. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/calculators/crysfml.py +0 -0
  111. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/calculators/cryspy.py +0 -0
  112. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/calculators/factory.py +0 -0
  113. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/calculators/pdffit.py +0 -0
  114. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/categories/__init__.py +0 -0
  115. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/categories/aliases.py +0 -0
  116. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/categories/constraints.py +0 -0
  117. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/categories/joint_fit_experiments.py +0 -0
  118. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/fit_helpers/__init__.py +0 -0
  119. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/fit_helpers/metrics.py +0 -0
  120. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/fit_helpers/reporting.py +0 -0
  121. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/fit_helpers/tracking.py +0 -0
  122. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/minimizers/__init__.py +0 -0
  123. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/minimizers/base.py +0 -0
  124. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/minimizers/dfols.py +0 -0
  125. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/minimizers/factory.py +0 -0
  126. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/analysis/minimizers/lmfit.py +0 -0
  127. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/__init__.py +0 -0
  128. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/category.py +0 -0
  129. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/collection.py +0 -0
  130. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/datablock.py +0 -0
  131. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/diagnostic.py +0 -0
  132. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/factory.py +0 -0
  133. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/guard.py +0 -0
  134. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/identity.py +0 -0
  135. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/parameters.py +0 -0
  136. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/singletons.py +0 -0
  137. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/core/validation.py +0 -0
  138. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/crystallography/__init__.py +0 -0
  139. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/crystallography/crystallography.py +0 -0
  140. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/crystallography/space_groups.pkl.gz +0 -0
  141. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/crystallography/space_groups.py +0 -0
  142. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/__init__.py +0 -0
  143. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/base.py +0 -0
  144. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/plotters/__init__.py +0 -0
  145. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/plotters/ascii.py +0 -0
  146. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/plotters/base.py +0 -0
  147. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/plotters/plotly.py +0 -0
  148. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/plotting.py +0 -0
  149. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/tablers/__init__.py +0 -0
  150. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/tablers/base.py +0 -0
  151. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/tablers/pandas.py +0 -0
  152. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/tablers/rich.py +0 -0
  153. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/tables.py +0 -0
  154. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/display/utils.py +0 -0
  155. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/__init__.py +0 -0
  156. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/__init__.py +0 -0
  157. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/background/__init__.py +0 -0
  158. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/background/base.py +0 -0
  159. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/background/chebyshev.py +0 -0
  160. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/background/enums.py +0 -0
  161. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/background/factory.py +0 -0
  162. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/background/line_segment.py +0 -0
  163. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/data/bragg_pd.py +0 -0
  164. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/data/bragg_sc.py +0 -0
  165. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/data/factory.py +0 -0
  166. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/data/total.py +0 -0
  167. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/excluded_regions.py +0 -0
  168. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/experiment_type.py +0 -0
  169. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/instrument/__init__.py +0 -0
  170. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/instrument/base.py +0 -0
  171. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/instrument/cwl.py +0 -0
  172. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/instrument/factory.py +0 -0
  173. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/instrument/tof.py +0 -0
  174. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/linked_phases.py +0 -0
  175. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/__init__.py +0 -0
  176. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/base.py +0 -0
  177. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/cwl.py +0 -0
  178. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/cwl_mixins.py +0 -0
  179. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/factory.py +0 -0
  180. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/tof.py +0 -0
  181. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/tof_mixins.py +0 -0
  182. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/total.py +0 -0
  183. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/categories/peak/total_mixins.py +0 -0
  184. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/__init__.py +0 -0
  185. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/base.py +0 -0
  186. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/bragg_pd.py +0 -0
  187. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/bragg_sc.py +0 -0
  188. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/enums.py +0 -0
  189. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/factory.py +0 -0
  190. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/instrument_mixin.py +0 -0
  191. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiment/total_pd.py +0 -0
  192. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/experiments/experiments.py +0 -0
  193. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/io/__init__.py +0 -0
  194. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/io/cif/__init__.py +0 -0
  195. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/io/cif/handler.py +0 -0
  196. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/io/cif/parse.py +0 -0
  197. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/io/cif/serialize.py +0 -0
  198. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/project/__init__.py +0 -0
  199. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/project/project.py +0 -0
  200. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/project/project_info.py +0 -0
  201. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/__init__.py +0 -0
  202. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/categories/__init__.py +0 -0
  203. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/categories/atom_sites.py +0 -0
  204. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/categories/cell.py +0 -0
  205. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/categories/space_group.py +0 -0
  206. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/sample_model/__init__.py +0 -0
  207. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/sample_model/base.py +0 -0
  208. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/sample_model/factory.py +0 -0
  209. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/sample_models/sample_models.py +0 -0
  210. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/summary/__init__.py +0 -0
  211. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/summary/summary.py +0 -0
  212. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/utils/__init__.py +0 -0
  213. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/utils/environment.py +0 -0
  214. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/src/easydiffraction/utils/utils.py +0 -0
  215. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/integration/fitting/test_pair-distribution-function.py +0 -0
  216. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/integration/fitting/test_powder-diffraction_constant-wavelength.py +0 -0
  217. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/integration/fitting/test_powder-diffraction_joint-fit.py +0 -0
  218. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/integration/fitting/test_powder-diffraction_multiphase.py +0 -0
  219. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/integration/fitting/test_powder-diffraction_time-of-flight.py +0 -0
  220. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/integration/scipp-analysis/dream/test_scipp-cif.py +0 -0
  221. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/calculators/test_base.py +0 -0
  222. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/calculators/test_crysfml.py +0 -0
  223. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/calculators/test_cryspy.py +0 -0
  224. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/calculators/test_factory.py +0 -0
  225. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/calculators/test_pdffit.py +0 -0
  226. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/categories/test_aliases.py +0 -0
  227. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/categories/test_constraints.py +0 -0
  228. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/categories/test_joint_fit_experiments.py +0 -0
  229. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/fit_helpers/test_metrics.py +0 -0
  230. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/fit_helpers/test_reporting.py +0 -0
  231. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/fit_helpers/test_tracking.py +0 -0
  232. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/minimizers/test_base.py +0 -0
  233. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/minimizers/test_dfols.py +0 -0
  234. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/minimizers/test_factory.py +0 -0
  235. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/minimizers/test_lmfit.py +0 -0
  236. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/test_analysis_access_params.py +0 -0
  237. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/analysis/test_analysis_show_empty.py +0 -0
  238. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_category.py +0 -0
  239. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_collection.py +0 -0
  240. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_datablock.py +0 -0
  241. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_diagnostic.py +0 -0
  242. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_factory.py +0 -0
  243. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_guard.py +0 -0
  244. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_identity.py +0 -0
  245. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_parameters.py +0 -0
  246. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_singletons.py +0 -0
  247. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/core/test_validation.py +0 -0
  248. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/crystallography/test_crystallography.py +0 -0
  249. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/crystallography/test_space_groups.py +0 -0
  250. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/display/plotters/test_ascii.py +0 -0
  251. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/display/plotters/test_base.py +0 -0
  252. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/display/plotters/test_plotly.py +0 -0
  253. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/display/test_plotting.py +0 -0
  254. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/background/test_base.py +0 -0
  255. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/background/test_chebyshev.py +0 -0
  256. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/background/test_enums.py +0 -0
  257. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/background/test_factory.py +0 -0
  258. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/background/test_line_segment.py +0 -0
  259. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/instrument/test_base.py +0 -0
  260. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/instrument/test_cwl.py +0 -0
  261. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/instrument/test_factory.py +0 -0
  262. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/instrument/test_tof.py +0 -0
  263. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_base.py +0 -0
  264. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_cwl.py +0 -0
  265. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_cwl_mixins.py +0 -0
  266. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_factory.py +0 -0
  267. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_tof.py +0 -0
  268. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_tof_mixins.py +0 -0
  269. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_total.py +0 -0
  270. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/peak/test_total_mixins.py +0 -0
  271. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/test_excluded_regions.py +0 -0
  272. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/test_experiment_type.py +0 -0
  273. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/categories/test_linked_phases.py +0 -0
  274. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_base.py +0 -0
  275. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_bragg_pd.py +0 -0
  276. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_bragg_sc.py +0 -0
  277. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_enums.py +0 -0
  278. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_factory.py +0 -0
  279. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_instrument_mixin.py +0 -0
  280. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/experiment/test_total_pd.py +0 -0
  281. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/experiments/test_experiments.py +0 -0
  282. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/io/cif/test_handler.py +0 -0
  283. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/io/cif/test_serialize.py +0 -0
  284. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/io/cif/test_serialize_more.py +0 -0
  285. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/project/test_project.py +0 -0
  286. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/project/test_project_info.py +0 -0
  287. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/project/test_project_load_and_summary_wrap.py +0 -0
  288. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/project/test_project_save.py +0 -0
  289. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/sample_models/categories/test_atom_sites.py +0 -0
  290. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/sample_models/categories/test_cell.py +0 -0
  291. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/sample_models/categories/test_space_group.py +0 -0
  292. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/sample_models/sample_model/test_base.py +0 -0
  293. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/sample_models/sample_model/test_factory.py +0 -0
  294. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/sample_models/test_sample_models.py +0 -0
  295. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/summary/test_summary.py +0 -0
  296. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/summary/test_summary_details.py +0 -0
  297. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/test___init__.py +0 -0
  298. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/test___main__.py +0 -0
  299. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tests/unit/easydiffraction/utils/test_logging.py +0 -0
  300. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/Untitled.ipynb +0 -0
  301. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/Untitled0.ipynb +0 -0
  302. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/Untitled1.ipynb +0 -0
  303. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/Untitled2.ipynb +0 -0
  304. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/_gemmi.py +0 -0
  305. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/_read_cif.py +0 -0
  306. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/_smart.py +0 -0
  307. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/basic_single-fit_pd-neut-cwl_LBCO-HRPT.py +0 -0
  308. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/cryst-struct_pd-neut-tof_multiphase-BSFTO-HRPT.py +0 -0
  309. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/DREAM_mantle_bc240_nist_cif.xye +0 -0
  310. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/DREAM_mantle_bc240_nist_cif_2.xye +0 -0
  311. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/DREAM_mantle_bc240_nist_nc.xye +0 -0
  312. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/DREAM_mantle_bc240_nist_nc_2.xye +0 -0
  313. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/Si_mp-149_symmetrized_mcstas.cif +0 -0
  314. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/hrpt.cif +0 -0
  315. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/hrpt_lbco.xye +0 -0
  316. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/large_structure.cif +0 -0
  317. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data/lbco.cif +0 -0
  318. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/mcstas_lbco-si.xys +0 -0
  319. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/mcstas_lbco-si_up-to-108k.xys +0 -0
  320. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/powder_reduced_Si_2large_bank.xye +0 -0
  321. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/reduced_LBCO.xye +0 -0
  322. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/reduced_Si.xye +0 -0
  323. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/wish_ncaf.xye +0 -0
  324. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/wish_ncaf_2_9.xye +0 -0
  325. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/wish_ncaf_4_7.xye +0 -0
  326. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/wish_ncaf_4_7.xys +0 -0
  327. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/wish_ncaf_5_6.xye +0 -0
  328. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/data_old/wish_ybcfo_5_6.xye +0 -0
  329. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/display.py +0 -0
  330. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/display2.py +0 -0
  331. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/display3-Copy1.py +0 -0
  332. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/display3.py +0 -0
  333. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/generate_overview_mermaid.py +0 -0
  334. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/hrpt_n_Bi0p88Sm0p12Fe0p94Ti0p06O3_DW_V_9x8x52_1p49_HI.xye +0 -0
  335. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/short.py +0 -0
  336. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/short2.py +0 -0
  337. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/short3.py +0 -0
  338. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/short5.py +0 -0
  339. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/short6.py +0 -0
  340. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/short7.py +0 -0
  341. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tmp/test_single-fit_pd-neut-tof_Si-DREAM_nc.py +0 -0
  342. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/add_assets_to_docs.sh +0 -0
  343. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/cleanup_docs.sh +0 -0
  344. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/create_mkdocs_yml.py +0 -0
  345. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/gen_tests_scaffold.py +0 -0
  346. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/generate_package_docs.py +0 -0
  347. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/naming_check.py +0 -0
  348. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/test_scripts.py +0 -0
  349. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/tweak_notebooks.py +0 -0
  350. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tools/update_spdx.py +0 -0
  351. {easydiffraction-0.9.1 → easydiffraction-0.10.0}/tutorials/index.json +0 -0
@@ -0,0 +1,66 @@
1
+ # This workflow automatically merges `master` into `develop` whenever a new version tag is pushed (v*).
2
+ #
3
+ # Key points:
4
+ # - Directly merges master into develop without creating a PR.
5
+ # - Skips CI on the merge commit using [skip ci] in the commit message.
6
+ # - The code being merged has already been tested as part of the release process.
7
+ # - This ensures develop stays up-to-date with release changes (version bumps, etc.).
8
+ #
9
+ # Required repo config:
10
+ # https://github.com/organizations/easyscience/settings/secrets/actions
11
+ # https://github.com/organizations/easyscience/settings/variables/actions
12
+ # - Actions secret: EASYSCIENCE_APP_KEY (GitHub App private key PEM)
13
+ # - Actions variable: EASYSCIENCE_APP_ID (GitHub App ID)
14
+ # The GitHub App must be added to the develop branch ruleset bypass list.
15
+
16
+ name: Backmerge (master -> develop)
17
+
18
+ on:
19
+ push:
20
+ tags: ['v*']
21
+
22
+ permissions:
23
+ contents: write
24
+
25
+ jobs:
26
+ backmerge:
27
+ runs-on: ubuntu-latest
28
+
29
+ steps:
30
+ - name: Create GitHub App installation token
31
+ id: app-token
32
+ uses: actions/create-github-app-token@v2
33
+ with:
34
+ app-id: ${{ vars.EASYSCIENCE_APP_ID }}
35
+ private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
36
+
37
+ - name: Checkout repository
38
+ uses: actions/checkout@v5
39
+ with:
40
+ fetch-depth: 0
41
+ token: ${{ steps.app-token.outputs.token }}
42
+
43
+ - name: Configure git for pushing
44
+ run: |
45
+ git config user.name "easyscience[bot]"
46
+ git config user.email "${{ vars.EASYSCIENCE_APP_ID }}+easyscience[bot]@users.noreply.github.com"
47
+
48
+ - name: Merge master into develop
49
+ run: |
50
+ set -euo pipefail
51
+
52
+ TAG='${{ github.ref_name }}'
53
+
54
+ # Ensure local develop branch exists and is up-to-date with origin
55
+ git fetch origin develop:develop
56
+ # Switch to develop branch
57
+ git checkout develop
58
+
59
+ # Merge master into develop (no fast-forward to preserve history)
60
+ # Use [skip ci] to avoid triggering CI - the code was already tested on master
61
+ git merge origin/master --no-ff -m "Backmerge: ${TAG} from master into develop [skip ci]"
62
+
63
+ # Push the merge commit to develop
64
+ git push origin develop
65
+
66
+ echo "✅ Successfully merged master (${TAG}) into develop"
@@ -24,6 +24,19 @@ jobs:
24
24
  runs-on: ubuntu-latest
25
25
 
26
26
  steps:
27
+ # Create GitHub App token for pushing to external dashboard repo.
28
+ # The 'repositories' parameter is required to grant access to repos
29
+ # other than the one where the workflow is running.
30
+ - name: Create GitHub App installation token
31
+ id: app-token
32
+ uses: actions/create-github-app-token@v2
33
+ with:
34
+ app-id: ${{ vars.EASYSCIENCE_APP_ID }}
35
+ private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
36
+ repositories: |
37
+ ${{ github.event.repository.name }}
38
+ dashboard
39
+
27
40
  - name: Checkout repository
28
41
  uses: actions/checkout@v5
29
42
  with:
@@ -80,7 +93,7 @@ jobs:
80
93
  with:
81
94
  external_repository: ${{ env.REPO_OWNER }}/dashboard
82
95
  publish_branch: ${{ env.DEFAULT_BRANCH }}
83
- personal_token: ${{ secrets.GH_API_PERSONAL_ACCESS_TOKEN }}
96
+ personal_token: ${{ steps.app-token.outputs.token }}
84
97
  publish_dir: ./_dashboard_publish
85
98
  keep_files: true
86
99
 
@@ -1,18 +1,15 @@
1
1
  # This workflow builds and deploys documentation for the project.
2
2
  #
3
- # Steps overview:
4
- # Job 1: build-docs
5
- # - Builds documentation (including running Jupyter notebooks to generate output cells).
6
- # - Uploads the built site as a Pages artifact.
7
- # Job 2: deploy-dev
8
- # - Deploys the built site to GitHub Pages for development (pushes to develop/master).
9
- # Job 3: deploy-prod
10
- # - Deploys the built site to gh-pages branch for production (release tags starting with v*).
11
- # - This triggers deployment to a custom domain via webhook.
3
+ # Overview:
4
+ # - Converts tutorial Python scripts to Jupyter notebooks and executes them.
5
+ # - Builds the documentation site using MkDocs with the Material theme.
6
+ # - Uploads the built site as an artifact for local inspection.
7
+ # - Deploys versioned documentation to the gh-pages branch using Mike:
8
+ # - For release tags (v*): deploys to a versioned folder (e.g., /0.9.1/) and updates /latest/.
9
+ # - For branches: deploys to /dev/.
12
10
  #
13
- # The action summary page will contain links to the built artifact for downloading
14
- # and inspecting, as well as links to both the development and production versions of
15
- # the deployed documentation site.
11
+ # The action summary page will contain a link to the built artifact for downloading
12
+ # and inspecting, as well as a link to the deployed documentation site.
16
13
 
17
14
  name: Docs build and deployment
18
15
 
@@ -30,12 +27,12 @@ on:
30
27
  # Allows you to run this workflow manually from the Actions tab
31
28
  workflow_dispatch:
32
29
 
33
- # Allow only one concurrent workflow, skipping runs queued between the run
34
- # in-progress and latest queued. And cancel in-progress runs.
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.
35
33
  concurrency:
36
- group:
37
- ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
38
- cancel-in-progress: true
34
+ group: docs-gh-pages-deploy
35
+ cancel-in-progress: false
39
36
 
40
37
  # Set the environment variables to be used in all jobs defined in this workflow
41
38
  env:
@@ -53,16 +50,17 @@ env:
53
50
  NOTEBOOKS_DIR: tutorials
54
51
 
55
52
  jobs:
56
- # Job 1: Build the static files for the documentation site
53
+ # Single job that builds and deploys documentation.
54
+ # Uses macOS runner for consistent Plotly chart rendering.
57
55
  build-deploy-docs:
58
56
  strategy:
59
57
  matrix:
60
- os: [macos-14] # Use macOS to switch to dark mode for Plotly charts
58
+ os: [macos-14]
61
59
 
62
60
  runs-on: ${{ matrix.os }}
63
61
 
64
62
  permissions:
65
- contents: write # required for pushing to gh-pages branch
63
+ contents: write # Required for pushing to the gh-pages branch
66
64
 
67
65
  steps:
68
66
  # Setting DOCS_VERSION to be used in mkdocs.yml, and then in the
@@ -87,10 +85,20 @@ jobs:
87
85
  echo "DOCS_VERSION=${DOCS_VERSION}" >> "$GITHUB_ENV"
88
86
  echo "DEPLOYMENT_URL=https://easyscience.github.io/${{ github.event.repository.name }}/${DOCS_VERSION}" >> "$GITHUB_ENV"
89
87
 
88
+ # Create GitHub App token for pushing to gh-pages as easyscience[bot].
89
+ - name: Create GitHub App installation token
90
+ id: app-token
91
+ uses: actions/create-github-app-token@v2
92
+ with:
93
+ app-id: ${{ vars.EASYSCIENCE_APP_ID }}
94
+ private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
95
+
96
+ # Check out the repository source code.
97
+ # Note: The gh-pages branch is fetched separately later for mike deployment.
90
98
  - name: Check-out repository
91
99
  uses: actions/checkout@v5
92
100
  with:
93
- fetch-depth: 0 # full history with tags; needed for mike to push/deploy docs
101
+ token: ${{ steps.app-token.outputs.token }}
94
102
 
95
103
  # Activate dark mode to create documentation with Plotly charts in dark mode
96
104
  # Need a better solution to automatically switch the chart colour theme based on the mkdocs material switcher
@@ -103,6 +111,8 @@ jobs:
103
111
  # dark-mode on
104
112
  # dark-mode status
105
113
 
114
+ # Set up the pixi package manager and install dependencies from pixi.toml.
115
+ # Uses frozen lockfile to ensure reproducible builds.
106
116
  - name: Set up pixi
107
117
  uses: prefix-dev/setup-pixi@v0.9.0
108
118
  with:
@@ -113,37 +123,43 @@ jobs:
113
123
  cache: false
114
124
  post-cleanup: false
115
125
 
126
+ # Install additional development dependencies (e.g., pre-commit hooks, dev tools).
116
127
  - name: Install and setup development dependencies
117
128
  shell: bash
118
129
  run: pixi run dev
119
130
 
131
+ # Clone shared documentation assets and branding resources from external repositories.
132
+ # These contain common MkDocs configuration, templates, stylesheets, and images.
120
133
  - name: Clone easyscience/assets-docs and easyscience/assets-branding
121
134
  run: |
122
135
  cd ..
123
136
  git clone https://github.com/easyscience/assets-docs.git
124
137
  git clone https://github.com/easyscience/assets-branding.git
125
138
 
139
+ # Copy assets from the cloned repositories into the docs/ directory.
140
+ # This includes stylesheets, images, templates, and other shared resources.
126
141
  - name: Add files from cloned repositories
127
142
  run: pixi run docs-assets
128
143
 
129
- # Convert python scripts in the notebooks directory to Jupyter notebooks
130
- # Strip output from the notebooks
131
- # Prepare the notebooks for documentation (add colab cell, etc.)
132
- # Run the notebooks to generate the output cells using multiple cores
133
- # The notebooks are then used to build the documentation site
144
+ # Convert Python scripts in the tutorials/ directory to Jupyter notebooks.
145
+ # This step also strips any existing output from the notebooks and prepares
146
+ # them for documentation.
134
147
  - name: Convert tutorial scripts to notebooks
135
148
  run: pixi run notebook-prepare
136
149
 
137
- # The following step is needed to avoid the following message during the build:
138
- # "Matplotlib is building the font cache; this may take a moment"
150
+ # Pre-import the main package to trigger Matplotlib font cache building.
151
+ # This avoids "Matplotlib is building the font cache" messages during notebook execution.
139
152
  - name: Pre-build site step
140
153
  run: pixi run python -c "import easydiffraction"
141
154
 
142
- # Run the notebooks to generate the output cells using multiple cores
155
+ # Execute all Jupyter notebooks to generate output cells (plots, tables, etc.).
156
+ # Uses multiple cores for parallel execution to speed up the process.
143
157
  - name: Run notebooks
144
158
  # if: false # Temporarily disabled to speed up the docs build
145
159
  run: pixi run notebook-exec
146
160
 
161
+ # Move the executed notebooks to docs/tutorials/ directory
162
+ # so they can be included in the documentation site.
147
163
  - name: Move notebooks to docs/tutorials
148
164
  run: pixi run docs-notebooks
149
165
 
@@ -170,17 +186,24 @@ jobs:
170
186
  if-no-files-found: 'error'
171
187
  compression-level: 0
172
188
 
173
- # Publish versioned docs with Mike (dev on branches, prod on tags)
174
- # Configure git for pushing to gh-pages branch
189
+ # Configure git user for mike to commit and push to gh-pages branch.
175
190
  - name: Configure git for pushing
176
191
  run: |
177
- git config user.name "github-actions[bot]"
178
- git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
192
+ git config user.name "easyscience[bot]"
193
+ git config user.email "${{ vars.EASYSCIENCE_APP_ID }}+easyscience[bot]@users.noreply.github.com"
194
+
195
+ # Fetch the gh-pages branch to ensure mike has the latest remote state.
196
+ # This is required because the checkout step only fetches the source branch,
197
+ # not the gh-pages branch that mike needs to update.
198
+ - name: Fetch gh-pages branch
199
+ run: |
200
+ git fetch origin gh-pages:gh-pages 2>/dev/null || true
179
201
 
180
- # Publish versioned docs with Mike. The tagged release docs go to
181
- # the versioned prefix, e.g. /v1.2.3/, and also to /latest/.
182
- # All other branches go to /dev/.
183
- # "${RELEASE_VERSION#v}" for v0.8.3.post1 -> 0.8.3.post1
202
+ # Deploy versioned documentation using mike (MkDocs plugin for versioning).
203
+ # - For release tags (v*): deploys to versioned folder (e.g., /0.9.1/) and aliases to /latest/.
204
+ # - For branches: deploys to /dev/.
205
+ # The "${RELEASE_VERSION#v}" syntax strips the 'v' prefix (v0.9.1 -> 0.9.1).
206
+ # Also sets 'latest' as the default version for the version selector.
184
207
  - name: Rebuild and deploy docs with mike
185
208
  run: |
186
209
  if [[ "${IS_RELEASE_TAG}" == "true" ]]; then
@@ -50,14 +50,12 @@ jobs:
50
50
  unzip ${DEFAULT_BRANCH}.zip -d .
51
51
  mkdir -p tests
52
52
  cp -r diffraction-lib-${DEFAULT_BRANCH}/tests/* tests/
53
+ cp diffraction-lib-${DEFAULT_BRANCH}/pytest.ini .
53
54
  rm -rf ${DEFAULT_BRANCH}.zip diffraction-lib-${DEFAULT_BRANCH}
54
55
 
55
56
  - name: Create the environment and install dependencies
56
57
  run: pixi install
57
58
 
58
- - name: Install package from PyPI with all extras
59
- run: pixi add --pypi "easydiffraction[all]"
60
-
61
59
  - name: Run unit tests to verify the installation
62
60
  run: pixi run unit-tests
63
61
 
@@ -71,7 +69,7 @@ jobs:
71
69
  run: |
72
70
  pixi run easydiffraction --version
73
71
  pixi run easydiffraction list-tutorials
74
- pixi run easydiffraction fetch-tutorials
72
+ pixi run easydiffraction download-all-tutorials
75
73
 
76
74
  - name: Test tutorials as notebooks
77
75
  run: pixi run notebook-tests
@@ -1,10 +1,16 @@
1
- # This workflow creates an automated release PR from `develop` into `main`.
1
+ # This workflow creates an automated release PR from `develop` into `master`.
2
2
  #
3
3
  # Usage:
4
4
  # - Triggered manually via workflow_dispatch.
5
5
  # - Creates a PR titled "Release: merge develop into master".
6
6
  # - Adds the label "[maintainer] auto-pull-request" so it is excluded from changelogs.
7
7
  # - The PR body makes clear that this is automation only (no review needed).
8
+ #
9
+ # Required repo config:
10
+ # https://github.com/organizations/easyscience/settings/secrets/actions
11
+ # https://github.com/organizations/easyscience/settings/variables/actions
12
+ # - Actions secret: EASYSCIENCE_APP_KEY (GitHub App private key PEM)
13
+ # - Actions variable: EASYSCIENCE_APP_ID (GitHub App ID)
8
14
 
9
15
  name: Release PR (develop -> master)
10
16
 
@@ -13,7 +19,7 @@ on:
13
19
  workflow_dispatch:
14
20
 
15
21
  permissions:
16
- contents: write
22
+ contents: read
17
23
  pull-requests: write
18
24
 
19
25
  # Set the environment variables to be used in all jobs defined in this workflow
@@ -24,10 +30,18 @@ jobs:
24
30
  create-pull-request:
25
31
  runs-on: ubuntu-latest
26
32
  steps:
33
+ - name: Create GitHub App installation token
34
+ id: app-token
35
+ uses: actions/create-github-app-token@v2
36
+ with:
37
+ app-id: ${{ vars.EASYSCIENCE_APP_ID }}
38
+ private-key: ${{ secrets.EASYSCIENCE_APP_KEY }}
39
+
27
40
  - name: Checkout develop branch
28
41
  uses: actions/checkout@v5
29
42
  with:
30
43
  ref: develop
44
+ token: ${{ steps.app-token.outputs.token }}
31
45
 
32
46
  - name: Create PR from develop to ${{ env.DEFAULT_BRANCH }}
33
47
  run: |
@@ -36,8 +50,8 @@ jobs:
36
50
  --head develop \
37
51
  --title "Release: merge develop into ${{ env.DEFAULT_BRANCH }}" \
38
52
  --label "[maintainer] auto-pull-request" \
39
- --body "⚠️ This PR is created automatically to trigger the release pipeline. It merges the accumulated changes from \`develop\` into \`${{ env.DEFAULT_BRANCH }}\`.
53
+ --body "This PR is created automatically to trigger the release pipeline. It merges the accumulated changes from \`develop\` into \`${{ env.DEFAULT_BRANCH }}\`.
40
54
 
41
55
  It is labeled \`[maintainer] auto-pull-request\` and is excluded from release notes and version bump logic."
42
56
  env:
43
- GITHUB_TOKEN: ${{ secrets.GH_API_PERSONAL_ACCESS_TOKEN }}
57
+ GH_TOKEN: ${{ steps.app-token.outputs.token }}
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: easydiffraction
3
- Version: 0.9.1
3
+ Version: 0.10.0
4
4
  Summary: Diffraction data analysis
5
5
  Project-URL: homepage, https://easydiffraction.org
6
6
  Project-URL: documentation, https://docs.easydiffraction.org/lib
@@ -501,10 +501,23 @@ class Analysis:
501
501
  """Execute fitting using the selected mode, calculator and
502
502
  minimizer.
503
503
 
504
+ This method performs the optimization but does not display
505
+ results automatically. Call :meth:`show_fit_results` after
506
+ fitting to see a summary of the fit quality and parameter
507
+ values.
508
+
504
509
  In 'single' mode, fits each experiment independently. In
505
510
  'joint' mode, performs a simultaneous fit across experiments
506
511
  with weights.
507
- Sets :attr:`fit_results` on success.
512
+
513
+ Sets :attr:`fit_results` on success, which can be accessed
514
+ programmatically
515
+ (e.g., ``analysis.fit_results.reduced_chi_square``).
516
+
517
+ Example::
518
+
519
+ project.analysis.fit()
520
+ project.analysis.show_fit_results() # Display results
508
521
  """
509
522
  sample_models = self.project.sample_models
510
523
  if not sample_models:
@@ -554,6 +567,30 @@ class Analysis:
554
567
  # After fitting, get the results
555
568
  self.fit_results = self.fitter.results
556
569
 
570
+ def show_fit_results(self) -> None:
571
+ """Display a summary of the fit results.
572
+
573
+ Renders the fit quality metrics (reduced χ², R-factors) and a
574
+ table of fitted parameters with their starting values, final
575
+ values, and uncertainties.
576
+
577
+ This method should be called after :meth:`fit` completes. If no
578
+ fit has been performed yet, a warning is logged.
579
+
580
+ Example::
581
+
582
+ project.analysis.fit()
583
+ project.analysis.show_fit_results()
584
+ """
585
+ if not hasattr(self, 'fit_results') or self.fit_results is None:
586
+ log.warning('No fit results available. Run fit() first.')
587
+ return
588
+
589
+ sample_models = self.project.sample_models
590
+ experiments = self.project.experiments
591
+
592
+ self.fitter._process_fit_results(sample_models, experiments)
593
+
557
594
  def _update_categories(self, called_by_minimizer=False) -> None:
558
595
  """Update all categories owned by Analysis.
559
596
 
@@ -37,6 +37,10 @@ class Fitter:
37
37
  ) -> None:
38
38
  """Run the fitting process.
39
39
 
40
+ This method performs the optimization but does not display
41
+ results. Use :meth:`show_fit_results` on the Analysis object
42
+ to display the fit results after fitting is complete.
43
+
40
44
  Args:
41
45
  sample_models: Collection of sample models.
42
46
  experiments: Collection of experiments.
@@ -66,15 +70,17 @@ class Fitter:
66
70
  # Perform fitting
67
71
  self.results = self.minimizer.fit(params, objective_function)
68
72
 
69
- # Post-fit processing
70
- self._process_fit_results(sample_models, experiments)
71
-
72
73
  def _process_fit_results(
73
74
  self,
74
75
  sample_models: SampleModels,
75
76
  experiments: Experiments,
76
77
  ) -> None:
77
- """Collect reliability inputs and display results after fitting.
78
+ """Collect reliability inputs and display fit results.
79
+
80
+ This method is typically called by
81
+ :meth:`Analysis.show_fit_results` rather than directly. It
82
+ calculates R-factors and other metrics, then renders them to
83
+ the console.
78
84
 
79
85
  Args:
80
86
  sample_models: Collection of sample models.
@@ -554,8 +554,8 @@ class ConsolePrinter:
554
554
  def section(cls, title: str) -> None:
555
555
  """Formats a section header with bold green text."""
556
556
  full_title = f'{title.upper()}'
557
- line = '' * len(full_title)
558
- formatted = f'[bold green]\n{line}\n{full_title}\n{line}[/bold green]'
557
+ line = '' * len(full_title)
558
+ formatted = f'[bold green]{line}\n{full_title}\n{line}[/bold green]'
559
559
  if not in_jupyter():
560
560
  formatted = f'\n{formatted}'
561
561
  cls._console.print(formatted)
@@ -566,7 +566,7 @@ class ConsolePrinter:
566
566
  and padding.
567
567
  """
568
568
  width = ConsoleManager._detect_width()
569
- symbol = ''
569
+ symbol = ''
570
570
  full_title = f' {title.upper()} '
571
571
  pad_len = (width - len(full_title)) // 2
572
572
  padding = symbol * pad_len
@@ -82,3 +82,56 @@ def test_fit_modes_show_and_switch_to_joint(monkeypatch, capsys):
82
82
  out2 = capsys.readouterr().out
83
83
  assert 'Current fit mode changed to' in out2
84
84
  assert a.fit_mode == 'joint'
85
+
86
+
87
+ def test_show_fit_results_warns_when_no_results(capsys):
88
+ """Test that show_fit_results logs a warning when fit() has not been run."""
89
+ from easydiffraction.analysis.analysis import Analysis
90
+
91
+ a = Analysis(project=_make_project_with_names([]))
92
+
93
+ # Ensure fit_results is not set
94
+ assert not hasattr(a, 'fit_results') or a.fit_results is None
95
+
96
+ a.show_fit_results()
97
+ out = capsys.readouterr().out
98
+ assert 'No fit results available' in out
99
+
100
+
101
+ def test_show_fit_results_calls_process_fit_results(monkeypatch):
102
+ """Test that show_fit_results delegates to fitter._process_fit_results."""
103
+ from easydiffraction.analysis.analysis import Analysis
104
+
105
+ # Track if _process_fit_results was called
106
+ process_called = {'called': False, 'args': None}
107
+
108
+ def mock_process_fit_results(sample_models, experiments):
109
+ process_called['called'] = True
110
+ process_called['args'] = (sample_models, experiments)
111
+
112
+ # Create a mock project with sample_models and experiments
113
+ class MockProject:
114
+ sample_models = object()
115
+ experiments = object()
116
+ _varname = 'proj'
117
+
118
+ class experiments_cls:
119
+ names = []
120
+
121
+ experiments = experiments_cls()
122
+
123
+ project = MockProject()
124
+ project.sample_models = object()
125
+ project.experiments.names = []
126
+
127
+ a = Analysis(project=project)
128
+
129
+ # Set up fit_results so show_fit_results doesn't return early
130
+ a.fit_results = object()
131
+
132
+ # Mock the fitter's _process_fit_results method
133
+ monkeypatch.setattr(a.fitter, '_process_fit_results', mock_process_fit_results)
134
+
135
+ a.show_fit_results()
136
+
137
+ assert process_called['called'], '_process_fit_results should be called'
@@ -0,0 +1,92 @@
1
+ # SPDX-FileCopyrightText: 2021-2025 EasyDiffraction contributors <https://github.com/easyscience/diffraction>
2
+ # SPDX-License-Identifier: BSD-3-Clause
3
+
4
+ def test_module_import():
5
+ import easydiffraction.analysis.fitting as MUT
6
+
7
+ expected_module_name = 'easydiffraction.analysis.fitting'
8
+ actual_module_name = MUT.__name__
9
+ assert expected_module_name == actual_module_name
10
+
11
+
12
+ def test_fitter_early_exit_when_no_params(capsys, monkeypatch):
13
+ from easydiffraction.analysis.fitting import Fitter
14
+
15
+ class DummyCollection:
16
+ free_parameters = []
17
+
18
+ def __init__(self):
19
+ self._names = ['e1']
20
+
21
+ @property
22
+ def names(self):
23
+ return self._names
24
+
25
+ class DummyMin:
26
+ tracker = type('T', (), {'track': staticmethod(lambda a, b: a)})()
27
+
28
+ def fit(self, params, obj):
29
+ return None
30
+
31
+ f = Fitter()
32
+ # Avoid creating a real minimizer
33
+ f.minimizer = DummyMin()
34
+ f.fit(sample_models=DummyCollection(), experiments=DummyCollection())
35
+ out = capsys.readouterr().out
36
+ assert 'No parameters selected for fitting' in out
37
+
38
+
39
+ def test_fitter_fit_does_not_call_process_fit_results(monkeypatch):
40
+ """Test that Fitter.fit() does not automatically call _process_fit_results.
41
+
42
+ The display of results is now the responsibility of Analysis.show_fit_results().
43
+ """
44
+ from easydiffraction.analysis.fitting import Fitter
45
+
46
+ process_called = {'called': False}
47
+
48
+ class DummyParam:
49
+ value = 1.0
50
+ _fit_start_value = None
51
+
52
+ class DummyCollection:
53
+ free_parameters = [DummyParam()]
54
+
55
+ def __init__(self):
56
+ self._names = ['e1']
57
+
58
+ @property
59
+ def names(self):
60
+ return self._names
61
+
62
+ class MockFitResults:
63
+ pass
64
+
65
+ class DummyMin:
66
+ tracker = type('T', (), {'track': staticmethod(lambda a, b: a)})()
67
+
68
+ def fit(self, params, obj):
69
+ return MockFitResults()
70
+
71
+ def _sync_result_to_parameters(self, params, engine_params):
72
+ pass
73
+
74
+ f = Fitter()
75
+ f.minimizer = DummyMin()
76
+
77
+ # Track if _process_fit_results is called
78
+ original_process = f._process_fit_results
79
+
80
+ def mock_process(*args, **kwargs):
81
+ process_called['called'] = True
82
+ return original_process(*args, **kwargs)
83
+
84
+ monkeypatch.setattr(f, '_process_fit_results', mock_process)
85
+
86
+ f.fit(sample_models=DummyCollection(), experiments=DummyCollection())
87
+
88
+ assert not process_called['called'], (
89
+ 'Fitter.fit() should not call _process_fit_results automatically. '
90
+ 'Use Analysis.show_fit_results() instead.'
91
+ )
92
+ assert f.results is not None, 'Fitter.fit() should still set results'
@@ -189,6 +189,7 @@ def test_get_version_for_url_released(monkeypatch):
189
189
  assert MUT._get_version_for_url() == '0.8.0.post1'
190
190
 
191
191
 
192
+ @pytest.mark.filterwarnings('ignore:Failed to fetch tutorials index:UserWarning')
192
193
  def test_fetch_tutorials_index_returns_empty_on_error(monkeypatch):
193
194
  import easydiffraction.utils.utils as MUT
194
195
 
@@ -60,6 +60,10 @@ project.experiments.add(cif_path=expt_path)
60
60
  # in the input CIF files, are refined by default.
61
61
  project.analysis.fit()
62
62
 
63
+ # %%
64
+ # Show fit results summary
65
+ project.analysis.show_fit_results()
66
+
63
67
  # %%
64
68
  project.experiments.show_names()
65
69
 
@@ -83,6 +83,7 @@ project.experiments['pdf'].peak.sharp_delta_2.free = True
83
83
  # %%
84
84
  project.analysis.current_calculator = 'pdffit'
85
85
  project.analysis.fit()
86
+ project.analysis.show_fit_results()
86
87
 
87
88
  # %% [markdown]
88
89
  # ## Plot Measured vs Calculated
@@ -96,6 +96,7 @@ experiment.peak.sharp_delta_2.free = True
96
96
  # %%
97
97
  project.analysis.current_calculator = 'pdffit'
98
98
  project.analysis.fit()
99
+ project.analysis.show_fit_results()
99
100
 
100
101
  # %% [markdown]
101
102
  # ## Plot Measured vs Calculated