syncmoss 0.4.1__tar.gz → 0.4.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. syncmoss-0.4.2/.gitattributes +3 -0
  2. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_MacOS.yml +103 -6
  3. {syncmoss-0.4.1 → syncmoss-0.4.2}/COPYING.txt +7 -1
  4. syncmoss-0.4.2/NOTICE.txt +120 -0
  5. {syncmoss-0.4.1/syncmoss.egg-info → syncmoss-0.4.2}/PKG-INFO +39 -3
  6. {syncmoss-0.4.1 → syncmoss-0.4.2}/README.md +38 -2
  7. {syncmoss-0.4.1 → syncmoss-0.4.2}/bundle/MacOS.spec +8 -1
  8. syncmoss-0.4.2/bundle/SYNCmoss.png +0 -0
  9. {syncmoss-0.4.1 → syncmoss-0.4.2}/bundle/Windows.spec +6 -0
  10. {syncmoss-0.4.1 → syncmoss-0.4.2}/bundle/bundle.py +5 -0
  11. syncmoss-0.4.2/bundle/dmg_background.pdf +0 -0
  12. syncmoss-0.4.2/bundle/licenses/GPL-3.0.txt +674 -0
  13. syncmoss-0.4.2/bundle/licenses/LGPL-3.0.txt +165 -0
  14. {syncmoss-0.4.1 → syncmoss-0.4.2}/bundle/macos_bundle.py +6 -0
  15. syncmoss-0.4.2/bundle/third_party_licenses.py +82 -0
  16. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Calibration.py +3 -3
  17. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/alpha-Fe (metallic iron, bcc).mdl +1 -1
  18. syncmoss-0.4.2/syncmoss/bliss_channel.py +82 -0
  19. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/constants.py +5 -0
  20. syncmoss-0.4.2/syncmoss/error_reporter.py +431 -0
  21. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/fitting_io.py +55 -8
  22. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/instrumental_io.py +6 -7
  23. syncmoss-0.4.2/syncmoss/license_window.py +201 -0
  24. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/main.py +17 -3
  25. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/model_io.py +244 -87
  26. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/models.py +41 -5
  27. syncmoss-0.4.2/syncmoss/parameters/Be.txt +1 -0
  28. syncmoss-0.4.2/syncmoss/parameters/Calibration.dat +513 -0
  29. syncmoss-0.4.2/syncmoss/parameters/INSth.txt +1 -0
  30. syncmoss-0.4.2/syncmoss/parameters/KB.txt +1 -0
  31. syncmoss-0.4.2/syncmoss/parameters/calibr.png +0 -0
  32. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/help.md +98 -4
  33. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/models_description.md +14 -12
  34. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters_table.py +160 -12
  35. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/results_table.py +60 -30
  36. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/sms_theory.py +1 -1
  37. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/spectrum_io.py +11 -3
  38. syncmoss-0.4.2/syncmoss/spectrum_parameters.py +402 -0
  39. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/spectrum_plotter.py +22 -6
  40. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/supp_menu.py +275 -8
  41. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/syncmoss_main.py +561 -117
  42. {syncmoss-0.4.1 → syncmoss-0.4.2/syncmoss.egg-info}/PKG-INFO +39 -3
  43. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss.egg-info/SOURCES.txt +23 -0
  44. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss.egg-info/scm_file_list.json +23 -0
  45. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/syncmoss_test.py +51 -3
  46. syncmoss-0.4.2/tests/test_bliss_channel.py +200 -0
  47. syncmoss-0.4.2/tests/test_chi2_spread.py +54 -0
  48. syncmoss-0.4.2/tests/test_contact_author.py +88 -0
  49. syncmoss-0.4.2/tests/test_error_reporter.py +254 -0
  50. syncmoss-0.4.2/tests/test_expression_fit_start.py +89 -0
  51. syncmoss-0.4.2/tests/test_impurity_presets.py +173 -0
  52. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_instrumental_metadata.py +4 -0
  53. syncmoss-0.4.2/tests/test_interrupt.py +310 -0
  54. syncmoss-0.4.2/tests/test_license_window.py +131 -0
  55. syncmoss-0.4.2/tests/test_results_table_image.py +76 -0
  56. syncmoss-0.4.2/tests/test_save_result_model.py +386 -0
  57. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_search_guards.py +3 -9
  58. syncmoss-0.4.2/tests/test_spectrum_parameters.py +390 -0
  59. syncmoss-0.4.2/tests/test_table_marks.py +201 -0
  60. syncmoss-0.4.2/tests/test_take_result.py +148 -0
  61. syncmoss-0.4.1/NOTICE.txt +0 -50
  62. syncmoss-0.4.1/syncmoss/parameters/Be.txt +0 -1
  63. syncmoss-0.4.1/syncmoss/parameters/Calibration.dat +0 -513
  64. syncmoss-0.4.1/syncmoss/parameters/INSth.txt +0 -1
  65. syncmoss-0.4.1/syncmoss/parameters/KB.txt +0 -1
  66. syncmoss-0.4.1/syncmoss/parameters/calibr.png +0 -0
  67. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/Tests.yml +0 -0
  68. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_PyPI.yml +0 -0
  69. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_TagRelease.yml +0 -0
  70. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_Tests.yml +0 -0
  71. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_UploadRelease.yml +0 -0
  72. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_Version.yml +0 -0
  73. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_Wheels.yml +0 -0
  74. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/_WindowsExe.yml +0 -0
  75. {syncmoss-0.4.1 → syncmoss-0.4.2}/.github/workflows/release.yml +0 -0
  76. {syncmoss-0.4.1 → syncmoss-0.4.2}/.gitignore +0 -0
  77. {syncmoss-0.4.1 → syncmoss-0.4.2}/.vscode/settings.json +0 -0
  78. {syncmoss-0.4.1 → syncmoss-0.4.2}/LICENSE +0 -0
  79. {syncmoss-0.4.1 → syncmoss-0.4.2}/Lib_test/test.mdl +0 -0
  80. {syncmoss-0.4.1 → syncmoss-0.4.2}/docs/thick_models.md +0 -0
  81. {syncmoss-0.4.1 → syncmoss-0.4.2}/docs/thick_vs_thin.md +0 -0
  82. {syncmoss-0.4.1 → syncmoss-0.4.2}/pyproject.toml +0 -0
  83. {syncmoss-0.4.1 → syncmoss-0.4.2}/requirements.txt +0 -0
  84. {syncmoss-0.4.1 → syncmoss-0.4.2}/setup.cfg +0 -0
  85. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Hamiltonian_helper.py +0 -0
  86. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Aegirine.mdl +0 -0
  87. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Akaganeite.mdl +0 -0
  88. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Almandine.mdl +0 -0
  89. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Antitaenite.mdl +0 -0
  90. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Arsenopyrite.mdl +0 -0
  91. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Bornite.mdl +0 -0
  92. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Bridgmanite (Fe,Al-bearing) @100 GPa.mdl +0 -0
  93. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Bridgmanite (Fe,Al-bearing).mdl +0 -0
  94. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Celadonite.mdl +0 -0
  95. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Cementite.mdl +0 -0
  96. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Chalcopyrite.mdl +0 -0
  97. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Clinopyroxene (augite).mdl +0 -0
  98. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Copiapite.mdl +0 -0
  99. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Cubanite.mdl +0 -0
  100. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Epidote.mdl +0 -0
  101. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Fayalite (Fe-olivine).mdl +0 -0
  102. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Ferrihydrite (2-line).mdl +0 -0
  103. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Ferropericlase.mdl +0 -0
  104. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Goethite.mdl +0 -0
  105. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Green rust (fougerite, carbonate).mdl +0 -0
  106. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Haegg carbide.mdl +0 -0
  107. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Hedenbergite.mdl +0 -0
  108. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Hematite.mdl +0 -0
  109. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Heterosite (FePO4).mdl +0 -0
  110. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Ilmenite.mdl +0 -0
  111. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Iron phosphide.mdl +0 -0
  112. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Isocubanite.mdl +0 -0
  113. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Jarosite.mdl +0 -0
  114. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Kamacite.mdl +0 -0
  115. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Lepidocrocite.mdl +0 -0
  116. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Maghemite.mdl +0 -0
  117. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Magnetite.mdl +0 -0
  118. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Marcasite.mdl +0 -0
  119. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Melanterite.mdl +0 -0
  120. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Orthopyroxene (enstatite-ferrosilite).mdl +0 -0
  121. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Prussian blue (ferric ferrocyanide).mdl +0 -0
  122. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Pyrite.mdl +0 -0
  123. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Pyrrhotite.mdl +0 -0
  124. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Rhomboclase.mdl +0 -0
  125. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Roemerite.mdl +0 -0
  126. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Siderite.mdl +0 -0
  127. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Szomolnokite.mdl +0 -0
  128. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Taenite.mdl +0 -0
  129. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Talnakhite.mdl +0 -0
  130. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Tetrataenite.mdl +0 -0
  131. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Triphylite (LiFePO4).mdl +0 -0
  132. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Troilite.mdl +0 -0
  133. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Vivianite.mdl +0 -0
  134. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library/Voltaite.mdl +0 -0
  135. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library_io.py +0 -0
  136. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/Library_window.py +0 -0
  137. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/CheckBox.png +0 -0
  138. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/CheckBox_.png +0 -0
  139. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/CheckBox_L.png +0 -0
  140. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/CheckBox_L2.png +0 -0
  141. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/DU.png +0 -0
  142. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/Switch.png +0 -0
  143. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/UD.png +0 -0
  144. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/icons/icon_r.ico +0 -0
  145. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/instrumental_window.py +0 -0
  146. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/legacy.py +0 -0
  147. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/minimi_lib.py +0 -0
  148. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/models_description_window.py +0 -0
  149. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/models_positions.py +0 -0
  150. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/ABSorber3.txt +0 -0
  151. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/GCMS.txt +0 -0
  152. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/INS_APS.txt +0 -0
  153. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/INSexp.txt +0 -0
  154. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/INSint.txt +0 -0
  155. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/parameters/NFS.txt +0 -0
  156. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/support_math.py +0 -0
  157. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/test_graf.txt +0 -0
  158. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/test_param.txt +0 -0
  159. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/theme_dark.json +0 -0
  160. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss/theme_light.json +0 -0
  161. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss.egg-info/dependency_links.txt +0 -0
  162. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss.egg-info/entry_points.txt +0 -0
  163. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss.egg-info/requires.txt +0 -0
  164. {syncmoss-0.4.1 → syncmoss-0.4.2}/syncmoss.egg-info/top_level.txt +0 -0
  165. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/conftest.py +0 -0
  166. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/data/Distr_corr.mdl +0 -0
  167. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/data/Distr_distr.mdl +0 -0
  168. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/data/alpha_fe_sms_000.mca +0 -0
  169. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/data/calibration_000_golden.json +0 -0
  170. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/data/generate_cal_fixtures.py +0 -0
  171. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/data/synthetic_alpha_fe_cms_linear.mca +0 -0
  172. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/golden_models.json +0 -0
  173. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_calibration.py +0 -0
  174. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_calibration_helpers.py +0 -0
  175. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_calibration_path.py +0 -0
  176. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_distr_composition.py +0 -0
  177. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_distr_expansion.py +0 -0
  178. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_distr_mdl.py +0 -0
  179. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_distr_targets.py +0 -0
  180. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_expression_validation.py +0 -0
  181. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_golden_models.py +0 -0
  182. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_gui_smoke.py +0 -0
  183. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_hamiltonian_texture.py +0 -0
  184. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_instrumental_method_choice.py +0 -0
  185. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_instrumental_recentre.py +0 -0
  186. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_instrumental_window.py +0 -0
  187. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_integral_points.py +0 -0
  188. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_legacy.py +0 -0
  189. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_library_dir.py +0 -0
  190. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_library_io.py +0 -0
  191. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_model_append.py +0 -0
  192. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_model_io.py +0 -0
  193. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_model_only_mode.py +0 -0
  194. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_nbaseline_results.py +0 -0
  195. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_parameter_links.py +0 -0
  196. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_polarization.py +0 -0
  197. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_recon_composition.py +0 -0
  198. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_recon_mdl.py +0 -0
  199. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_recon_results.py +0 -0
  200. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_reference_shift.py +0 -0
  201. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_sdw_grid.py +0 -0
  202. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_sms_theory.py +0 -0
  203. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_support_math.py +0 -0
  204. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_texture_s1.py +0 -0
  205. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_theory_search.py +0 -0
  206. {syncmoss-0.4.1 → syncmoss-0.4.2}/tests/test_thick_gui.py +0 -0
@@ -0,0 +1,3 @@
1
+ # Verbatim license texts: keep LF on every OS, so Windows checkouts (and the
2
+ # Windows bundle) carry the files byte-for-byte as published by gnu.org.
3
+ bundle/licenses/*.txt text eol=lf
@@ -3,7 +3,8 @@ name: _macOS (PyInstaller universal2 app)
3
3
  # Modelled on crispy's release workflow (github.com/mretegan/crispy):
4
4
  # 1. build the app natively on an Apple Silicon AND an Intel runner,
5
5
  # 2. fuse the two bundles into one universal2 SYNCmoss.app,
6
- # 3. sign it (Developer ID + hardened runtime), pack the DMG, notarize, staple.
6
+ # 3. sign it (Developer ID + hardened runtime), pack the drag-and-drop DMG
7
+ # (window laid out as crispy's create-dmg.sh does), notarize, staple.
7
8
  #
8
9
  # Signing and notarization run only when the Apple secrets are set (repository
9
10
  # Settings -> Secrets and variables -> Actions; release.yml forwards them).
@@ -136,6 +137,8 @@ jobs:
136
137
  runs-on: macos-15
137
138
  timeout-minutes: 90
138
139
  steps:
140
+ - uses: actions/checkout@v6
141
+
139
142
  - uses: actions/setup-python@v6
140
143
  with:
141
144
  python-version: "3.13"
@@ -377,25 +380,119 @@ jobs:
377
380
  ditto dist/universal2/SYNCmoss.app "${RUNNER_TEMP}/smoke/SYNCmoss.app"
378
381
  "${RUNNER_TEMP}/smoke/SYNCmoss.app/Contents/MacOS/SYNCmoss" --test
379
382
 
383
+ # The drag-and-drop installer window, built as crispy's
384
+ # package/create-dmg.sh does: a writable image holding the app, a link to
385
+ # /Applications, the background picture (bundle/dmg_background.pdf) and
386
+ # the volume icon; Finder lays the window out (positions match the
387
+ # picture); then it is converted to the compressed read-only DMG.
380
388
  - name: Create the DMG
381
389
  run: |
382
390
  set -euo pipefail
391
+ APP="dist/universal2/SYNCmoss.app"
383
392
  STAGING="${RUNNER_TEMP}/dmg"
384
- mkdir -p "${STAGING}"
385
- ditto dist/universal2/SYNCmoss.app "${STAGING}/SYNCmoss.app"
393
+ RW_DMG="${RUNNER_TEMP}/SYNCmoss-rw.dmg"
394
+ rm -rf "${STAGING}" "${RW_DMG}"
395
+
396
+ mkdir -p "${STAGING}/.background" "${STAGING}/.fseventsd"
397
+ ditto "${APP}" "${STAGING}/SYNCmoss.app"
386
398
  ln -s /Applications "${STAGING}/Applications"
387
- # hdiutil is occasionally "Resource busy" on hosted runners: retry.
399
+ cp bundle/dmg_background.pdf "${STAGING}/.background/background.pdf"
400
+ # The volume shows the app's own icon.
401
+ ICON_FILE="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIconFile' "${APP}/Contents/Info.plist")"
402
+ case "${ICON_FILE}" in *.icns) ;; *) ICON_FILE="${ICON_FILE}.icns" ;; esac
403
+ cp "${APP}/Contents/Resources/${ICON_FILE}" "${STAGING}/.VolumeIcon.icns"
404
+ touch "${STAGING}/.fseventsd/no_log"
405
+
406
+ # Room for the .DS_Store Finder writes. hdiutil is occasionally
407
+ # "Resource busy" on hosted runners: retry.
408
+ SIZE_MB=$(( $(du -sm "${STAGING}" | cut -f1) + 50 ))
388
409
  for attempt in 1 2 3; do
389
- if hdiutil create -volname SYNCmoss -srcfolder "${STAGING}" -ov -format UDZO -imagekey zlib-level=9 dist/SYNCmoss.dmg; then
410
+ if hdiutil create -format UDRW -fs APFS -volname SYNCmoss -size "${SIZE_MB}m" \
411
+ -srcfolder "${STAGING}" -ov "${RW_DMG}"; then
390
412
  break
391
413
  fi
392
414
  if [ "${attempt}" -eq 3 ]; then
393
415
  exit 1
394
416
  fi
395
- echo "hdiutil failed, retrying in 10 s"
417
+ echo "hdiutil create failed, retrying in 10 s"
396
418
  sleep 10
397
419
  done
398
420
 
421
+ ATTACH="$(hdiutil attach -readwrite -noverify -noautoopen "${RW_DMG}" | grep '^/dev/')"
422
+ DEVICE="$(echo "${ATTACH}" | head -n 1 | awk '{print $1}')"
423
+ MOUNT_POINT="$(echo "${ATTACH}" | awk -F'\t' '$3 != "" {print $3}' | tail -n 1 | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')"
424
+ echo "Attached ${DEVICE} at ${MOUNT_POINT}"
425
+ if [ ! -d "${MOUNT_POINT}" ]; then
426
+ echo "::error::could not find where the image was mounted"
427
+ echo "${ATTACH}"
428
+ exit 1
429
+ fi
430
+ SetFile -a C "${MOUNT_POINT}"
431
+ SetFile -a V "${MOUNT_POINT}/.background"
432
+
433
+ LAYOUT="${RUNNER_TEMP}/dmg-layout.applescript"
434
+ cat > "${LAYOUT}" <<'EOF'
435
+ on run argv
436
+ tell application "Finder"
437
+ tell disk (item 1 of argv)
438
+ open
439
+ set current view of container window to icon view
440
+ set toolbar visible of container window to false
441
+ set statusbar visible of container window to false
442
+ set bounds of container window to {200, 120, 700, 420}
443
+ set viewOptions to the icon view options of container window
444
+ set arrangement of viewOptions to not arranged
445
+ set icon size of viewOptions to 96
446
+ set background picture of viewOptions to file ".background:background.pdf"
447
+ set position of item "SYNCmoss.app" to {114, 124}
448
+ set position of item "Applications" to {386, 124}
449
+ close
450
+ open
451
+ delay 1
452
+ update without registering applications
453
+ delay 2
454
+ close
455
+ end tell
456
+ end tell
457
+ end run
458
+ EOF
459
+ # Finder scripting can time out on a busy runner: retry.
460
+ for attempt in 1 2 3; do
461
+ if osascript "${LAYOUT}" "$(basename "${MOUNT_POINT}")"; then
462
+ break
463
+ fi
464
+ if [ "${attempt}" -eq 3 ]; then
465
+ echo "::error::Finder could not lay out the DMG window"
466
+ exit 1
467
+ fi
468
+ echo "Finder layout failed, retrying in 5 s"
469
+ sleep 5
470
+ done
471
+ # Finder saves the layout in .DS_Store when the window closes.
472
+ for _ in $(seq 1 30); do
473
+ [ -f "${MOUNT_POINT}/.DS_Store" ] && break
474
+ sleep 1
475
+ done
476
+ if [ ! -f "${MOUNT_POINT}/.DS_Store" ]; then
477
+ echo "::error::Finder did not save the DMG window layout (.DS_Store)"
478
+ exit 1
479
+ fi
480
+
481
+ sync
482
+ for attempt in 1 2 3 4 5; do
483
+ if hdiutil detach "${DEVICE}"; then
484
+ break
485
+ fi
486
+ if [ "${attempt}" -eq 5 ]; then
487
+ hdiutil detach "${DEVICE}" -force
488
+ break
489
+ fi
490
+ echo "volume still busy, retrying in 5 s"
491
+ sleep 5
492
+ done
493
+ hdiutil convert "${RW_DMG}" -format UDZO -imagekey zlib-level=9 -ov -o dist/SYNCmoss.dmg
494
+ rm -f "${RW_DMG}"
495
+
399
496
  - name: Notarize and staple the DMG
400
497
  id: notarize
401
498
  if: steps.sign.outputs.developer_id == 'true'
@@ -10,5 +10,11 @@ Third-party components are used under their respective licenses:
10
10
  - NumPy: BSD 3-Clause
11
11
  - SciPy: BSD 3-Clause
12
12
  - Matplotlib: BSD-compatible
13
+ - Numba: BSD 2-Clause
14
+ - llvmlite: BSD 2-Clause (contains LLVM: Apache 2.0 with LLVM Exceptions)
15
+ - Bliss (optional, not included; used only if installed separately):
16
+ LGPL v3.0
13
17
 
14
- For complete third-party license details, see NOTICE.txt.
18
+ For complete third-party license details, see NOTICE.txt. The Windows and
19
+ macOS bundles also carry the full license text of every third-party package
20
+ they contain, in a "licenses" folder.
@@ -0,0 +1,120 @@
1
+ SYNCmoss - Third-Party Software Notices and Information
2
+ =========================================================
3
+
4
+ This project is licensed under the MIT License. See LICENSE for details.
5
+ It uses the following third-party libraries, each distributed under
6
+ their own license terms.
7
+
8
+ The Windows and macOS bundles contain the full license text of every
9
+ third-party package they include -- the libraries below, their own
10
+ dependencies and the Python runtime -- in a "licenses" folder:
11
+ - Windows: _internal/licenses/
12
+ - macOS: SYNCmoss.app/Contents/Resources/licenses/
13
+ In the program, Supp -> License shows this notice and all of those texts.
14
+
15
+ PySide6 (Qt for Python)
16
+ -----------------------
17
+ Licensed under the GNU Lesser General Public License (LGPL) v3.0
18
+ Copyright (C) The Qt Company Ltd.
19
+ https://www.qt.io/licensing/
20
+
21
+ LGPL v3.0 COMPLIANCE NOTICE:
22
+ This software dynamically links to PySide6. Under the terms of the
23
+ LGPL v3.0, you may:
24
+ - Use this MIT-licensed software without your own code becoming LGPL.
25
+ - Replace the PySide6 library with any compatible version.
26
+ - Obtain PySide6 source code at:
27
+ https://code.qt.io/cgit/pyside/pyside-setup.git/
28
+ - Read the full LGPL v3.0 license, and the GNU GPL v3.0 it builds on,
29
+ in the bundles' licenses/LGPL-3.0.txt and licenses/GPL-3.0.txt, or at:
30
+ https://www.gnu.org/licenses/lgpl-3.0.html
31
+ (The PySide6 wheels themselves carry only a Qt commercial-license notice,
32
+ which is why the two texts are shipped separately.) Qt itself contains
33
+ third-party components (FreeType, HarfBuzz, libpng, zlib, ...) under their
34
+ own licenses; The Qt Company lists them at
35
+ https://doc.qt.io/qt-6/licenses-used-in-qt.html
36
+
37
+ NumPy
38
+ -----
39
+ Licensed under the BSD 3-Clause License
40
+ Copyright (c) 2005-2025, NumPy Developers
41
+ https://numpy.org/doc/stable/license.html
42
+
43
+ SciPy
44
+ -----
45
+ Licensed under the BSD 3-Clause License
46
+ Copyright (c) 2001-2002 Enthought, Inc. 2003, SciPy Developers
47
+ https://scipy.org/scipylib/license.html
48
+
49
+ Matplotlib
50
+ ----------
51
+ Licensed under the Matplotlib License (BSD-compatible)
52
+ Copyright (c) 2012- Matplotlib Development Team
53
+ Copyright (c) 2002-2011 John D. Hunter
54
+ https://matplotlib.org/stable/users/project/license.html
55
+
56
+ Numba
57
+ -----
58
+ Licensed under the BSD 2-Clause License
59
+ Copyright (c) 2012, Anaconda, Inc.
60
+ https://github.com/numba/numba/blob/main/LICENSE
61
+
62
+ llvmlite
63
+ --------
64
+ Licensed under the BSD 2-Clause License
65
+ Copyright (c) 2014, Anaconda, Inc.
66
+ https://github.com/numba/llvmlite/blob/main/LICENSE
67
+ It contains LLVM, licensed under the Apache License v2.0 with LLVM
68
+ Exceptions (https://llvm.org/LICENSE.txt).
69
+
70
+ Python
71
+ ------
72
+ Licensed under the Python Software Foundation License
73
+ Copyright (c) Python Software Foundation; All Rights Reserved
74
+ https://docs.python.org/3/license.html
75
+ The bundles contain the Python runtime; its LICENSE.txt is included as
76
+ licenses/Python/LICENSE.txt. The C libraries built into the runtime
77
+ (OpenSSL, expat, libffi, zlib, libmpdec, ...) and their licenses are
78
+ listed at the address above.
79
+
80
+ Microsoft Visual C++ Runtime (Windows bundle only)
81
+ --------------------------------------------------
82
+ Copyright (c) Microsoft Corporation
83
+ The Windows bundle contains Microsoft's C and C++ run-time libraries
84
+ (VCRUNTIME140*.dll, MSVCP140*.dll, VCOMP140.dll and, where present,
85
+ ucrtbase.dll with the api-ms-win-*.dll forwarders). They are "Microsoft
86
+ Distributable Code", which Microsoft allows to be redistributed unmodified
87
+ with the programs that use them, provided that whoever uses or passes on
88
+ the Windows bundle does not:
89
+ - alter any copyright, trademark or patent notice in Microsoft's
90
+ Distributable Code;
91
+ - use Microsoft's trademarks in their programs' names or in a way that
92
+ suggests the programs come from or are endorsed by Microsoft;
93
+ - distribute Microsoft's Distributable Code to run on a platform other
94
+ than Microsoft operating systems, run-time technologies or application
95
+ platforms; or
96
+ - include Microsoft Distributable Code in malicious, deceptive or
97
+ unlawful programs.
98
+ These conditions apply only to Microsoft's files, not to SYNCmoss or to
99
+ the other components. The full terms are in Microsoft's documentation
100
+ (included in its developer tools and on microsoft.com).
101
+
102
+ Bliss (optional -- NOT included)
103
+ --------------------------------
104
+ Licensed under the GNU Lesser General Public License (LGPL) v3.0
105
+ Copyright (c) Beamline Control Unit, ESRF
106
+ https://gitlab.esrf.fr/bliss/bliss
107
+ SYNCmoss neither contains nor distributes Bliss, and the Windows and macOS
108
+ bundles never include it. Only when Bliss has been installed separately
109
+ (Linux beamline installations) does SYNCmoss import it at run time, to read
110
+ spectra online from a Bliss channel.
111
+
112
+ PyInstaller (bundling only)
113
+ ---------------------------
114
+ Licensed under the GPL 2.0 with a special bootloader exception that
115
+ permits distributing non-GPL applications bundled with PyInstaller.
116
+ Copyright (c) 2010-2023, PyInstaller Development Team
117
+ https://pyinstaller.org/en/stable/license.html
118
+ The Windows and macOS bundles are created with PyInstaller. The
119
+ bootloader exception explicitly allows this use without requiring
120
+ the application itself to be GPL-licensed.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: syncmoss
3
- Version: 0.4.1
3
+ Version: 0.4.2
4
4
  Summary: SYNCmoss — Mössbauer spectroscopy analysis application
5
5
  Author: Sergey Yaroslavtsev
6
6
  License: MIT
@@ -103,6 +103,34 @@ syncmoss
103
103
  magnetic polar order `Am` on the Faraday-active ones - a random powder,
104
104
  a textured foil and a single crystal are the same model at different values
105
105
 
106
+ ## Bug report and Feature request
107
+
108
+ Both are very welcome — SYNCmoss gets better mainly from user feedback.
109
+
110
+ * write to **sergey.yaroslavtsev@esrf.fr** or open an issue: https://github.com/sergey-yaroslavtsev/syncmoss/issues
111
+
112
+ When something goes wrong the program opens a *report a bug* window containing
113
+ the error message.
114
+
115
+ ### Reporting a bug
116
+
117
+ Please describe the problem and provide all related material:
118
+
119
+ * **what you did** — which button or action created the problem, and what you
120
+ expected to happen instead;
121
+ * **the error message** — copy it from the *report a bug* window (or from the
122
+ terminal);
123
+ * **the spectrum file(s)** and **the model** (`.mdl`) you were working with —
124
+ without them most problems cannot be reproduced;
125
+ * the SYNCmoss version and your operating system;
126
+ * a screenshot, if the problem is about what is drawn or displayed.
127
+
128
+ ### Requesting a feature
129
+
130
+ Please describe what exactly is needed: the physics or the workflow behind it,
131
+ where in the program it should appear, and — if it exists elsewhere — a
132
+ reference, an article or an example file showing the expected result.
133
+
106
134
  ## Author
107
135
 
108
136
  Yaroslavtsev Sergey (ESRF | ADA and ID14)
@@ -121,5 +149,13 @@ This software uses third-party libraries that are distributed under their own li
121
149
  - **NumPy**: BSD 3-Clause License
122
150
  - **SciPy**: BSD 3-Clause License
123
151
  - **Matplotlib**: Matplotlib License (BSD-compatible)
124
-
125
- For complete third-party license information, see [NOTICE.txt](NOTICE.txt).
152
+ - **Numba**: BSD 2-Clause License
153
+ - **llvmlite**: BSD 2-Clause License (contains LLVM: Apache License 2.0 with LLVM Exceptions)
154
+ - **Bliss** (optional, not included): LGPL v3.0 — imported only if installed
155
+ separately (Linux beamline installations), to read spectra online from a Bliss
156
+ channel; never part of the bundles
157
+
158
+ For complete third-party license information, see [NOTICE.txt](NOTICE.txt). The
159
+ Windows and macOS bundles also carry the full license text of every third-party
160
+ package they contain, in a `licenses` folder; in the program, **Supp → License**
161
+ shows all of it.
@@ -70,6 +70,34 @@ syncmoss
70
70
  magnetic polar order `Am` on the Faraday-active ones - a random powder,
71
71
  a textured foil and a single crystal are the same model at different values
72
72
 
73
+ ## Bug report and Feature request
74
+
75
+ Both are very welcome — SYNCmoss gets better mainly from user feedback.
76
+
77
+ * write to **sergey.yaroslavtsev@esrf.fr** or open an issue: https://github.com/sergey-yaroslavtsev/syncmoss/issues
78
+
79
+ When something goes wrong the program opens a *report a bug* window containing
80
+ the error message.
81
+
82
+ ### Reporting a bug
83
+
84
+ Please describe the problem and provide all related material:
85
+
86
+ * **what you did** — which button or action created the problem, and what you
87
+ expected to happen instead;
88
+ * **the error message** — copy it from the *report a bug* window (or from the
89
+ terminal);
90
+ * **the spectrum file(s)** and **the model** (`.mdl`) you were working with —
91
+ without them most problems cannot be reproduced;
92
+ * the SYNCmoss version and your operating system;
93
+ * a screenshot, if the problem is about what is drawn or displayed.
94
+
95
+ ### Requesting a feature
96
+
97
+ Please describe what exactly is needed: the physics or the workflow behind it,
98
+ where in the program it should appear, and — if it exists elsewhere — a
99
+ reference, an article or an example file showing the expected result.
100
+
73
101
  ## Author
74
102
 
75
103
  Yaroslavtsev Sergey (ESRF | ADA and ID14)
@@ -88,5 +116,13 @@ This software uses third-party libraries that are distributed under their own li
88
116
  - **NumPy**: BSD 3-Clause License
89
117
  - **SciPy**: BSD 3-Clause License
90
118
  - **Matplotlib**: Matplotlib License (BSD-compatible)
91
-
92
- For complete third-party license information, see [NOTICE.txt](NOTICE.txt).
119
+ - **Numba**: BSD 2-Clause License
120
+ - **llvmlite**: BSD 2-Clause License (contains LLVM: Apache License 2.0 with LLVM Exceptions)
121
+ - **Bliss** (optional, not included): LGPL v3.0 — imported only if installed
122
+ separately (Linux beamline installations), to read spectra online from a Bliss
123
+ channel; never part of the bundles
124
+
125
+ For complete third-party license information, see [NOTICE.txt](NOTICE.txt). The
126
+ Windows and macOS bundles also carry the full license text of every third-party
127
+ package they contain, in a `licenses` folder; in the program, **Supp → License**
128
+ shows all of it.
@@ -1,6 +1,10 @@
1
1
  # -*- mode: python ; coding: utf-8 -*-
2
2
  from PyInstaller.utils.hooks import collect_data_files, collect_submodules
3
3
  import os
4
+ import sys
5
+
6
+ sys.path.insert(0, SPECPATH) # third_party_licenses.py lives next to this spec
7
+ from third_party_licenses import license_datas
4
8
 
5
9
  # ── Hidden imports ──────────────────────────────────────────────
6
10
  # numba/llvmlite/scipy do a lot of dynamic importing, so collect their submodules
@@ -95,6 +99,8 @@ a = Analysis(
95
99
  cipher=block_cipher,
96
100
  noarchive=False,
97
101
  )
102
+ # The license texts of every bundled third-party package, under licenses/
103
+ a.datas += license_datas(a)
98
104
 
99
105
  pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
100
106
 
@@ -125,6 +131,7 @@ coll = COLLECT(
125
131
  app = BUNDLE(
126
132
  coll,
127
133
  name='SYNCmoss.app',
128
- icon=None,
134
+ # Next to this spec; PyInstaller converts the PNG to .icns (with Pillow).
135
+ icon='SYNCmoss.png',
129
136
  bundle_identifier=None,
130
137
  )
Binary file
@@ -1,6 +1,10 @@
1
1
  # -*- mode: python ; coding: utf-8 -*-
2
2
  from PyInstaller.utils.hooks import collect_data_files, collect_submodules
3
3
  import os
4
+ import sys
5
+
6
+ sys.path.insert(0, SPECPATH) # third_party_licenses.py lives next to this spec
7
+ from third_party_licenses import license_datas
4
8
 
5
9
  # ── Hidden imports ──────────────────────────────────────────────
6
10
  # numba/llvmlite/scipy do a lot of dynamic importing, so collect their submodules
@@ -87,6 +91,8 @@ a = Analysis(
87
91
  cipher=block_cipher,
88
92
  noarchive=False,
89
93
  )
94
+ # The license texts of every bundled third-party package, under licenses/
95
+ a.datas += license_datas(a)
90
96
 
91
97
  pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
92
98
 
@@ -122,6 +122,11 @@ def verify():
122
122
  "COPYING.txt",
123
123
  "NOTICE.txt",
124
124
  "LICENSE",
125
+ # third-party license texts (Windows.spec -> third_party_licenses.py)
126
+ "_internal/licenses/LGPL-3.0.txt",
127
+ "_internal/licenses/GPL-3.0.txt",
128
+ "_internal/licenses/numba",
129
+ "_internal/licenses/llvmlite",
125
130
  ]
126
131
  ok = True
127
132
  for rel in required:
Binary file