samplekit 1.0.0rc1__tar.gz → 1.0.0rc2__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 (270) hide show
  1. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/CHANGELOG.md +301 -4
  2. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/Cargo.lock +27 -3
  3. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/Cargo.toml +7 -2
  4. samplekit-1.0.0rc2/PKG-INFO +196 -0
  5. samplekit-1.0.0rc2/README.md +170 -0
  6. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/THIRD-PARTY-LICENSES.md +5 -2
  7. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/build.rs +4 -4
  8. samplekit-1.0.0rc2/examples/tensile/01-measured/.samplekitrc +1 -0
  9. samplekit-1.0.0rc2/examples/tensile/01-measured/README.md +14 -0
  10. samplekit-1.0.0rc2/examples/tensile/01-measured/samples/aluminium-01.md +12 -0
  11. samplekit-1.0.0rc2/examples/tensile/01-measured/samples/copper-01.md +12 -0
  12. samplekit-1.0.0rc2/examples/tensile/01-measured/samples/steel-01.md +12 -0
  13. samplekit-1.0.0rc2/examples/tensile/02-readings/.samplekitrc +6 -0
  14. samplekit-1.0.0rc2/examples/tensile/02-readings/README.md +13 -0
  15. samplekit-1.0.0rc2/examples/tensile/02-readings/model/specimen.py +21 -0
  16. samplekit-1.0.0rc2/examples/tensile/02-readings/samples/aluminium-01.md +26 -0
  17. samplekit-1.0.0rc2/examples/tensile/02-readings/samples/copper-01.md +26 -0
  18. samplekit-1.0.0rc2/examples/tensile/02-readings/samples/steel-01.md +26 -0
  19. samplekit-1.0.0rc2/examples/tensile/03-curve/.samplekitrc +9 -0
  20. samplekit-1.0.0rc2/examples/tensile/03-curve/README.md +13 -0
  21. samplekit-1.0.0rc2/examples/tensile/03-curve/model/specimen.py +62 -0
  22. samplekit-1.0.0rc2/examples/tensile/03-curve/samples/aluminium-01.md +76 -0
  23. samplekit-1.0.0rc2/examples/tensile/03-curve/samples/copper-01.md +85 -0
  24. samplekit-1.0.0rc2/examples/tensile/03-curve/samples/steel-01.md +79 -0
  25. samplekit-1.0.0rc2/examples/tensile/04-results/.samplekitrc +72 -0
  26. samplekit-1.0.0rc2/examples/tensile/04-results/README.md +18 -0
  27. samplekit-1.0.0rc2/examples/tensile/04-results/machine/aluminium-01/curve.csv +13 -0
  28. samplekit-1.0.0rc2/examples/tensile/04-results/machine/aluminium-01/settings.txt +3 -0
  29. samplekit-1.0.0rc2/examples/tensile/04-results/machine/copper-01/curve.csv +16 -0
  30. samplekit-1.0.0rc2/examples/tensile/04-results/machine/copper-01/settings.txt +3 -0
  31. samplekit-1.0.0rc2/examples/tensile/04-results/machine/steel-01/curve.csv +14 -0
  32. samplekit-1.0.0rc2/examples/tensile/04-results/machine/steel-01/settings.txt +3 -0
  33. samplekit-1.0.0rc2/examples/tensile/04-results/model/specimen.py +169 -0
  34. samplekit-1.0.0rc2/examples/tensile/04-results/photos/steel-01-fracture.jpg +0 -0
  35. samplekit-1.0.0rc2/examples/tensile/04-results/samples/aluminium-01.md +98 -0
  36. samplekit-1.0.0rc2/examples/tensile/04-results/samples/copper-01.md +107 -0
  37. samplekit-1.0.0rc2/examples/tensile/04-results/samples/steel-01.md +100 -0
  38. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/edit.py +16 -0
  39. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/links.py +9 -0
  40. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/model_scripts.py +9 -0
  41. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/paper.py +9 -0
  42. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/read.py +17 -0
  43. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/remeasure.py +8 -0
  44. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/report.py +8 -0
  45. samplekit-1.0.0rc2/examples/tensile/04-results/scripts/selecting.py +9 -0
  46. samplekit-1.0.0rc2/examples/tensile/05-projects/.samplekitrc +30 -0
  47. samplekit-1.0.0rc2/examples/tensile/05-projects/README.md +13 -0
  48. samplekit-1.0.0rc2/examples/tensile/05-projects/cast/.samplekitrc +6 -0
  49. samplekit-1.0.0rc2/examples/tensile/05-projects/cast/samples/aluminium-c1.md +94 -0
  50. samplekit-1.0.0rc2/examples/tensile/05-projects/cast/samples/iron-c1.md +97 -0
  51. samplekit-1.0.0rc2/examples/tensile/05-projects/model/specimen.py +169 -0
  52. samplekit-1.0.0rc2/examples/tensile/05-projects/rolled/.samplekitrc +6 -0
  53. samplekit-1.0.0rc2/examples/tensile/05-projects/rolled/samples/aluminium-01.md +97 -0
  54. samplekit-1.0.0rc2/examples/tensile/05-projects/rolled/samples/copper-01.md +106 -0
  55. samplekit-1.0.0rc2/examples/tensile/05-projects/rolled/samples/steel-01.md +100 -0
  56. samplekit-1.0.0rc2/examples/tensile/05-projects/scripts/projects.py +7 -0
  57. samplekit-1.0.0rc2/examples/tensile/README.md +36 -0
  58. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/python/samplekit/__init__.py +81 -26
  59. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/python/samplekit/__init__.pyi +558 -253
  60. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/python/samplekit/_figure.py +29 -2
  61. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/python/samplekit/_figures.py +310 -57
  62. samplekit-1.0.0rc2/python/samplekit/_script.py +231 -0
  63. samplekit-1.0.0rc2/python/samplekit/_scripts.py +212 -0
  64. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/python/samplekit/_worker.py +435 -79
  65. samplekit-1.0.0rc2/src/collection/computation.rs +841 -0
  66. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/editing.rs +944 -276
  67. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/explanation.rs +255 -6
  68. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/exports.rs +700 -79
  69. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/mod.rs +1 -0
  70. samplekit-1.0.0rc2/src/collection/renaming.rs +470 -0
  71. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/sample_list.rs +438 -56
  72. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/tagging.rs +45 -5
  73. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/validation.rs +1385 -384
  74. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/configuration_edit.rs +138 -6
  75. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/discovery.rs +477 -22
  76. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/model_runtime/description.rs +284 -35
  77. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/model_runtime.rs +561 -271
  78. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/profiles.rs +45 -10
  79. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_config.rs +1533 -239
  80. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_setup.rs +90 -26
  81. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_template/empty/model.py +20 -17
  82. samplekit-1.0.0rc2/src/config/project_template/empty/samplekitrc_existing_model +14 -0
  83. samplekit-1.0.0rc2/src/config/project_template/empty/samplekitrc_model +13 -0
  84. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_template/empty/samplekitrc_no_model +1 -0
  85. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_template/empty/samplekitrc_rest +7 -9
  86. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_template/helpers__init__.py +3 -3
  87. samplekit-1.0.0rc1/src/config/project_template/helpers_hydrometer.py → samplekit-1.0.0rc2/src/config/project_template/helpers_measuring.py +4 -14
  88. samplekit-1.0.0rc2/src/config/project_template/sample.md +42 -0
  89. samplekit-1.0.0rc2/src/config/project_template/samplekitrc +194 -0
  90. samplekit-1.0.0rc2/src/config/project_template/specimen.py +164 -0
  91. samplekit-1.0.0rc2/src/config/version_control.rs +4065 -0
  92. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/dependency_graph.rs +3 -3
  93. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/formatting.rs +382 -44
  94. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/identifier.rs +11 -9
  95. samplekit-1.0.0rc2/src/core/link.rs +189 -0
  96. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/mod.rs +1 -0
  97. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/property.rs +291 -34
  98. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/sample.rs +98 -11
  99. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/statistics.rs +24 -2
  100. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/table.rs +383 -40
  101. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/value.rs +6 -6
  102. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/format/canonicalization.rs +28 -9
  103. samplekit-1.0.0rc2/src/format/document.rs +1752 -0
  104. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/format/fingerprint.rs +172 -19
  105. samplekit-1.0.0rc2/src/format/lock.rs +269 -0
  106. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/format/mod.rs +1 -1
  107. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/format/schema.rs +160 -198
  108. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/completion.rs +214 -8
  109. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/compute.rs +421 -167
  110. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/edit.rs +1164 -269
  111. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/history.rs +1072 -128
  112. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/init.rs +85 -68
  113. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/inspect.rs +1189 -192
  114. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/plot.rs +494 -81
  115. samplekit-1.0.0rc2/src/interfaces/cli/run.rs +425 -0
  116. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli/tables.rs +1156 -157
  117. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/interfaces/cli.rs +3143 -552
  118. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/lib.rs +1 -1
  119. samplekit-1.0.0rc2/src/presentation/changes.rs +1108 -0
  120. samplekit-1.0.0rc2/src/presentation/export_formats.rs +901 -0
  121. samplekit-1.0.0rc2/src/presentation/links.rs +139 -0
  122. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/presentation/mod.rs +2 -0
  123. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/presentation/opening.rs +129 -5
  124. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/presentation/plotting.rs +12 -0
  125. samplekit-1.0.0rc2/src/presentation/scripting.rs +473 -0
  126. samplekit-1.0.0rc2/src/presentation/summaries.rs +525 -0
  127. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/presentation/terminal_rendering.rs +1282 -119
  128. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/python/pyo3_bridge.rs +312 -37
  129. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/python/python_api.rs +3471 -829
  130. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/query/field_addressing.rs +96 -50
  131. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/query/filter_language.rs +1114 -28
  132. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/query/ordering.rs +15 -15
  133. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/model.rs +5871 -966
  134. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/run.rs +63 -3
  135. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/start.rs +255 -63
  136. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/theme.rs +43 -5
  137. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/typing.rs +189 -2
  138. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/view.rs +1169 -162
  139. samplekit-1.0.0rc1/PKG-INFO +0 -116
  140. samplekit-1.0.0rc1/README.md +0 -90
  141. samplekit-1.0.0rc1/examples/brewing/01-first-brews/.samplekitrc +0 -10
  142. samplekit-1.0.0rc1/examples/brewing/01-first-brews/README.md +0 -139
  143. samplekit-1.0.0rc1/examples/brewing/01-first-brews/brews/citra-ipa.md +0 -14
  144. samplekit-1.0.0rc1/examples/brewing/01-first-brews/brews/farmhouse-saison.md +0 -14
  145. samplekit-1.0.0rc1/examples/brewing/01-first-brews/brews/oatmeal-stout.md +0 -14
  146. samplekit-1.0.0rc1/examples/brewing/02-measuring/.samplekitrc +0 -44
  147. samplekit-1.0.0rc1/examples/brewing/02-measuring/README.md +0 -160
  148. samplekit-1.0.0rc1/examples/brewing/02-measuring/brews/citra-ipa.md +0 -20
  149. samplekit-1.0.0rc1/examples/brewing/02-measuring/brews/farmhouse-saison.md +0 -19
  150. samplekit-1.0.0rc1/examples/brewing/02-measuring/brews/oatmeal-stout.md +0 -20
  151. samplekit-1.0.0rc1/examples/brewing/03-selecting/.samplekitrc +0 -98
  152. samplekit-1.0.0rc1/examples/brewing/03-selecting/README.md +0 -133
  153. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/blonde-saison.md +0 -19
  154. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/citra-ipa.md +0 -20
  155. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/double-ipa.md +0 -20
  156. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/dry-stout.md +0 -20
  157. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/english-pale.md +0 -19
  158. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/farmhouse-saison.md +0 -19
  159. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/hazy-pale.md +0 -20
  160. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/hefeweizen.md +0 -19
  161. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/oatmeal-stout.md +0 -20
  162. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/robust-porter.md +0 -20
  163. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/session-ipa.md +0 -20
  164. samplekit-1.0.0rc1/examples/brewing/03-selecting/brews/smoked-porter.md +0 -18
  165. samplekit-1.0.0rc1/examples/brewing/04-computing/.samplekitrc +0 -147
  166. samplekit-1.0.0rc1/examples/brewing/04-computing/README.md +0 -183
  167. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/blonde-saison.md +0 -19
  168. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/citra-ipa.md +0 -53
  169. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/double-ipa.md +0 -53
  170. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/dry-stout.md +0 -53
  171. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/english-pale.md +0 -52
  172. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/farmhouse-saison.md +0 -52
  173. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/hazy-pale.md +0 -53
  174. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/hefeweizen.md +0 -52
  175. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/oatmeal-stout.md +0 -53
  176. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/robust-porter.md +0 -53
  177. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/session-ipa.md +0 -53
  178. samplekit-1.0.0rc1/examples/brewing/04-computing/brews/smoked-porter.md +0 -37
  179. samplekit-1.0.0rc1/examples/brewing/04-computing/model/brew.py +0 -65
  180. samplekit-1.0.0rc1/examples/brewing/04-computing/model/hydrometer.py +0 -18
  181. samplekit-1.0.0rc1/examples/brewing/05-fermentation/.samplekitrc +0 -215
  182. samplekit-1.0.0rc1/examples/brewing/05-fermentation/README.md +0 -130
  183. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/blonde-saison.md +0 -134
  184. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/citra-ipa.md +0 -132
  185. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/double-ipa.md +0 -132
  186. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/dry-stout.md +0 -132
  187. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/english-pale.md +0 -131
  188. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/farmhouse-saison.md +0 -131
  189. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/hazy-pale.md +0 -135
  190. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/hefeweizen.md +0 -134
  191. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/oatmeal-stout.md +0 -135
  192. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/robust-porter.md +0 -132
  193. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/session-ipa.md +0 -135
  194. samplekit-1.0.0rc1/examples/brewing/05-fermentation/brews/smoked-porter.md +0 -74
  195. samplekit-1.0.0rc1/examples/brewing/05-fermentation/model/brew.py +0 -130
  196. samplekit-1.0.0rc1/examples/brewing/05-fermentation/model/hydrometer.py +0 -33
  197. samplekit-1.0.0rc1/examples/brewing/06-figures/.samplekitrc +0 -307
  198. samplekit-1.0.0rc1/examples/brewing/06-figures/README.md +0 -128
  199. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/blonde-saison.md +0 -134
  200. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/citra-ipa.md +0 -132
  201. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/double-ipa.md +0 -132
  202. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/dry-stout.md +0 -132
  203. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/english-pale.md +0 -131
  204. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/farmhouse-saison.md +0 -131
  205. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/hazy-pale.md +0 -135
  206. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/hefeweizen.md +0 -134
  207. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/oatmeal-stout.md +0 -135
  208. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/robust-porter.md +0 -132
  209. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/session-ipa.md +0 -135
  210. samplekit-1.0.0rc1/examples/brewing/06-figures/brews/smoked-porter.md +0 -74
  211. samplekit-1.0.0rc1/examples/brewing/06-figures/model/brew.py +0 -142
  212. samplekit-1.0.0rc1/examples/brewing/06-figures/model/hydrometer.py +0 -33
  213. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/README.md +0 -113
  214. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/.samplekitrc +0 -307
  215. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/brews/blonde-saison.md +0 -134
  216. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/brews/dry-stout.md +0 -132
  217. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/brews/farmhouse-saison.md +0 -131
  218. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/brews/hazy-pale.md +0 -135
  219. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/brews/oatmeal-stout.md +0 -135
  220. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/ana/brews/smoked-porter.md +0 -74
  221. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/shared/brew.py +0 -142
  222. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/shared/hydrometer.py +0 -33
  223. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/.samplekitrc +0 -307
  224. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/brews/citra-ipa.md +0 -132
  225. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/brews/double-ipa.md +0 -132
  226. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/brews/english-pale.md +0 -47
  227. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/brews/hefeweizen.md +0 -134
  228. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/brews/robust-porter.md +0 -132
  229. samplekit-1.0.0rc1/examples/brewing/07-two-brewers/tom/brews/session-ipa.md +0 -135
  230. samplekit-1.0.0rc1/examples/brewing/08-python/.samplekitrc +0 -307
  231. samplekit-1.0.0rc1/examples/brewing/08-python/README.md +0 -90
  232. samplekit-1.0.0rc1/examples/brewing/08-python/brews/blonde-saison.md +0 -134
  233. samplekit-1.0.0rc1/examples/brewing/08-python/brews/citra-ipa.md +0 -132
  234. samplekit-1.0.0rc1/examples/brewing/08-python/brews/double-ipa.md +0 -132
  235. samplekit-1.0.0rc1/examples/brewing/08-python/brews/dry-stout.md +0 -132
  236. samplekit-1.0.0rc1/examples/brewing/08-python/brews/english-pale.md +0 -131
  237. samplekit-1.0.0rc1/examples/brewing/08-python/brews/farmhouse-saison.md +0 -131
  238. samplekit-1.0.0rc1/examples/brewing/08-python/brews/hazy-pale.md +0 -135
  239. samplekit-1.0.0rc1/examples/brewing/08-python/brews/hefeweizen.md +0 -134
  240. samplekit-1.0.0rc1/examples/brewing/08-python/brews/oatmeal-stout.md +0 -135
  241. samplekit-1.0.0rc1/examples/brewing/08-python/brews/robust-porter.md +0 -132
  242. samplekit-1.0.0rc1/examples/brewing/08-python/brews/session-ipa.md +0 -135
  243. samplekit-1.0.0rc1/examples/brewing/08-python/brews/smoked-porter.md +0 -74
  244. samplekit-1.0.0rc1/examples/brewing/08-python/model/brew.py +0 -142
  245. samplekit-1.0.0rc1/examples/brewing/08-python/model/hydrometer.py +0 -33
  246. samplekit-1.0.0rc1/examples/brewing/08-python/scripts/brew_report.py +0 -27
  247. samplekit-1.0.0rc1/examples/brewing/08-python/scripts/yeast_comparison.py +0 -27
  248. samplekit-1.0.0rc1/examples/brewing/README.md +0 -39
  249. samplekit-1.0.0rc1/src/collection/computation.rs +0 -216
  250. samplekit-1.0.0rc1/src/config/project_template/brew.py +0 -156
  251. samplekit-1.0.0rc1/src/config/project_template/empty/samplekitrc_existing_model +0 -12
  252. samplekit-1.0.0rc1/src/config/project_template/empty/samplekitrc_model +0 -11
  253. samplekit-1.0.0rc1/src/config/project_template/sample.md +0 -38
  254. samplekit-1.0.0rc1/src/config/project_template/samplekitrc +0 -186
  255. samplekit-1.0.0rc1/src/config/version_control.rs +0 -1785
  256. samplekit-1.0.0rc1/src/format/document.rs +0 -802
  257. samplekit-1.0.0rc1/src/format/migration.rs +0 -365
  258. samplekit-1.0.0rc1/src/presentation/changes.rs +0 -482
  259. samplekit-1.0.0rc1/src/presentation/export_formats.rs +0 -393
  260. samplekit-1.0.0rc1/src/presentation/summaries.rs +0 -353
  261. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/LICENSE +0 -0
  262. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/pyproject.toml +0 -0
  263. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/python/samplekit/py.typed +0 -0
  264. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/collection/named_queries.rs +0 -0
  265. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/mod.rs +0 -0
  266. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/config/project_template/empty/samplekitrc_head +0 -0
  267. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/core/uncertainty.rs +0 -0
  268. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/python/mod.rs +0 -0
  269. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/query/mod.rs +0 -0
  270. {samplekit-1.0.0rc1 → samplekit-1.0.0rc2}/src/tui/mod.rs +0 -0
@@ -7,6 +7,303 @@ SampleKit rather than works on it.
7
7
  A version ending in `-rc.N` is a release candidate: tried before the version
8
8
  of that number is published, and replaced by it.
9
9
 
10
+ ## [1.0.0-rc.2] — 2026-11-04
11
+
12
+ The second release candidate of SampleKit 1.0 (`1.0.0rc2` for Python).
13
+
14
+ ### Upgrading from 1.0.0-rc.1
15
+
16
+ Sample files are unchanged. **`samplekit-migrate.pyz`**, attached to this
17
+ release, makes the renames below in a copy of a project, its samples copied as
18
+ they are. It reads projects of 0.1.0 to 0.2.0 too: their samples, and their
19
+ model's declarations written again, its formulas copied to check by hand. It
20
+ works on a copy and guarantees nothing: back your project up first. [Upgrade from an older
21
+ SampleKit](https://zelyph.github.io/SampleKit/latest/guides/upgrade.html) says
22
+ how to run it, and each step to do by hand; in short:
23
+
24
+ - **Before upgrading, bring every value up to date with rc.1**: `samplekit
25
+ DIR status`, then `samplekit DIR compute --write`. This version does not
26
+ read rc.1's record of which formula computed each value: at its first write
27
+ in a project, it takes the values the files hold as computed by the model
28
+ as it is then, and says how many.
29
+ - **Install the command line and the Python package together**, at the same
30
+ version, on every computer that shares a project.
31
+ - **Add `python = ".venv"` under `[model]`** in `.samplekitrc`, or the path of
32
+ another environment or interpreter: the model runs only in the Python named
33
+ there.
34
+ - **Rename what changed name**: `[workbench.colors]` is `[colors]`, the
35
+ colour role `stale` is `outdated`, a style's `separator` is written as its
36
+ `property`, `{collection}` in a path is `{project}`; in Python, `stale()` and `is_stale` are `outdated()` and
37
+ `is_outdated`. Each old name is refused, naming the new one.
38
+ - `new --like SAMPLE` is `new NAME --keep SAMPLE FIELDS`.
39
+ - **Rename a property's formulas, in this order**: `compute=` becomes
40
+ `compute_value=`, then `compute_quantity=` becomes `compute=`. No value is
41
+ outdated by it. A value formula left as `compute=` still runs, but then owns
42
+ the whole property: an uncertainty typed beside it is no longer kept.
43
+
44
+ ### Cleaning up after rc.1
45
+
46
+ Nothing breaks if you leave these, but they are no longer used:
47
+
48
+ - **In the state folder** (`~/.local/state/samplekit` on Linux,
49
+ `~/Library/Application Support/samplekit` on macOS,
50
+ `%LOCALAPPDATA%\samplekit` on Windows): `computed.json`, `computed`, `consent`, `accepted/`, and the run logs named `logs/compute-YYYY-MM-DDT…Z-PID.log` can be deleted.
51
+ `samplekit-migrate.pyz --clean-state` lists them, and removes them with
52
+ `--write`.
53
+ - **A history shared through git under rc.1** committed files that each
54
+ computer keeps for itself. Remove them from the repository once, then add
55
+ `[history] shared = true` (below): `git rm -r --cached
56
+ .samplekit/history/HEAD .samplekit/history/config
57
+ .samplekit/history/description .samplekit/history/hooks
58
+ .samplekit/model.json`, then `git add -A`.
59
+ - **A value restored from a snapshot rc.1 took** has no record of the formula
60
+ that computed it, and is taken as current: if that formula changed since,
61
+ compute it again, `samplekit DIR compute -p NAME --rerun --write`.
62
+
63
+ ### Added
64
+
65
+ - **A migration tool**, `samplekit-migrate.pyz`, attached to each release: a
66
+ project of 0.1.0, 0.1.1, 0.1.2, 0.2.0 or 1.0.0-rc.1, carried into a new
67
+ folder this version reads, and a report of what was carried, left and to
68
+ check by hand. Run with the Python of an environment where this version's
69
+ package is installed; it installs nothing and never writes in the folder it
70
+ reads.
71
+ - **An export writes a figure**: `[export.curves]` with `figure = "curves"`
72
+ and `output = "paper/curves.pdf"`, where a table's names its `profile`.
73
+ `samplekit export curves --write` then draws it to its file, as a table for
74
+ a paper is written again; Python's `export("curves")` and the TUI's `p`
75
+ menu do the same.
76
+ - **A project's look decides more of its figures**: what `[matplotlib]`
77
+ declares wins over SampleKit's own choices, so `"lines.marker" = "None"`
78
+ draws a `line` figure without markers, and `errorbar.capsize` sets the
79
+ error bars' caps. `style` applies matplotlib's style sheets, by name or as
80
+ `.mplstyle` files, and `fonts` makes font files kept in the project known
81
+ to matplotlib. A figure takes settings of its own: `matplotlib = { … }` in
82
+ `[figure.NAME]`, `@sk.figure(matplotlib={…})` in a model.
83
+ - **`import` takes a file, and a list**: `import = ["..",
84
+ "figures.samplekitrc"]` merges the folder above's `.samplekitrc` and a file
85
+ of any name, a later one over an earlier one, so that a project's settings
86
+ can be kept in files of their own. [Organise a project's
87
+ settings](https://zelyph.github.io/SampleKit/latest/guides/organise-settings.html)
88
+ shows how.
89
+ - **An environment made by uv works**: `samplekit init` installs the package
90
+ into a `.venv/` without pip with `uv pip install`, when uv is on the
91
+ `PATH`, and otherwise says the command to type.
92
+ - **Write a command in any order**: `samplekit samples status`, `samplekit
93
+ status samples` and `samplekit -f 'mass > 10' status samples` are the same,
94
+ and a list of files piped in works, `… | xargs samplekit status`. Where a
95
+ folder has a command's name, the command wins; write the folder `status/`.
96
+ - **Select samples on every command**: `-f` (a filter) and `--query` (a
97
+ filter saved in `.samplekitrc`) now work with `set`, `log`, `diff`,
98
+ `restore`, `validate`, `list`, `explain` and `open` too. `samplekit samples
99
+ set -f 'material == steel' supplier=acme` previews each sample it changes,
100
+ asks once, and writes them together.
101
+ - **Every change is previewed, then asked**: `set`, `new`, `tag`, `export`,
102
+ `restore` and `compute` show what they would change and end on `apply these
103
+ changes? [y/N]`. `--write` answers yes beforehand, for scripts.
104
+ - **Documents in LaTeX, Markdown or HTML**: a style, `[style.NAME]` in
105
+ `.samplekitrc`, says how values, units and tables are written for a kind of
106
+ document. `latex`, `markdown` and `html` are given: `samplekit samples --style
107
+ latex -c name,density -o table.tex` writes a LaTeX table ready to include.
108
+ - **Filters reach into tables**: `results has 42`, a sample with 42 in any cell
109
+ of its `results` table; `results.status has failed`, in one column; and
110
+ `results where (temperature > 100 && status == failed)`, one row meeting
111
+ both. A filter also compares two fields of a sample: `measured >
112
+ expected`.
113
+ - **Scripts in the model**: a method of the model marked `@sk.script` is an
114
+ action on a sample or on a selection, with options; `samplekit run NAME`
115
+ runs it, or `p` in the TUI, and what it changes is previewed before it is
116
+ written.
117
+ - **Share the history through git with one line**: `[history] shared = true`
118
+ in `.samplekitrc`, and `git add -A` takes the history with the samples;
119
+ SampleKit keeps out what each computer makes for itself.
120
+ - **A folder made a project keeps its history**: when a subfolder gets its own
121
+ `.samplekitrc`, the snapshots the project above it took of its files are
122
+ copied into its own history, and this is said.
123
+ - **In the TUI**: a value, a table or a list opens in a window where each cell
124
+ is edited, readings and list items included; `A` adds an attribute to a
125
+ sample, its name then its value; `p` runs a script, draws a figure or writes
126
+ an export from one menu, for the basket, the sample open or the samples
127
+ shown.
128
+ - **Save what a table shows**: `--save query=NAME`, `profile=NAME` or
129
+ `export=NAME` on a table declares its filter, its columns, sort and groups,
130
+ or both and an export, in `.samplekitrc`, previewed first; the TUI's `W`
131
+ does the same.
132
+ - **Remove a sample**: `samplekit FILE remove` deletes sample files, previewed
133
+ first; the history keeps them, and `restore` gives them back. A folder alone
134
+ is refused. In Python, `sample.remove()`.
135
+ - **The note from the command line**: `set note=…` replaces the text below
136
+ the frontmatter, and `note=` empties it.
137
+ - **Links**: an attribute written `"[[steel-02]]"`, as Obsidian writes a
138
+ link, names another sample of the project; one written as Markdown does,
139
+ `"[certificate](../certificates/c.pdf)"`, a file by its path, a sample of
140
+ any project or any other file; one written `https://…` a web page. A list
141
+ of links names several. The TUI opens each with `Enter` or `o`, a sample
142
+ even where the filter leaves it out, its title bar saying the way taken
143
+ and `Esc` going back along it; Python reads the samples with
144
+ `sample.linked("reference")`, a file that is no sample as its path; and
145
+ `validate` reports a link that leads nowhere. A link is shown as Markdown
146
+ shows it, its text alone, underlined in the colour role `link`, `↗` after a
147
+ web page and `✗` after one leading nowhere, in the TUI, and in a table and
148
+ `view` drawn in a terminal; typed, written to a file or a pipe, it is the
149
+ text written. Unquoted, a link is refused at its line, saying to quote it.
150
+ A sample's screen lists the samples linking to it, and the filter `links to
151
+ NAME` selects the samples whose links name it; `set parents=[[a]],[[b]]` writes a list of links, and
152
+ Tab after `[[` completes a sample's name, on `set` and in the TUI.
153
+ - **Rename a sample**: `samplekit FILE rename NEW` renames its file, its own
154
+ files and its `name`, and writes every link of the project leading to it
155
+ again, a link to one of its own files too, previewed first; in the TUI, `R`;
156
+ in Python, `sample.rename(new)`. `remove` lists the links it leaves leading
157
+ nowhere.
158
+ - **A sample's own table written to a file**: `samplekit FILE view curve`
159
+ shows the table `curve` alone, and `--csv`, `--tsv`, `--json` or `-o
160
+ curve.csv` write its rows, previewed and kept in the history as a table of
161
+ samples is; over several samples, a column `name` first. In Python,
162
+ `sample.curve.to_csv()`.
163
+ - **A script may ask with `input()`**: on the command line in the terminal,
164
+ in the TUI in the script's window, which shows what it prints as it prints
165
+ it. The preview lists the answers, and the history keeps them with the
166
+ command.
167
+ - **The TUI does what the command line does**: `C` previews what it would
168
+ compute, as `compute` does; in `H`, `r` puts files back as a change left
169
+ them, `d` shows what a change changed and, on another, compares the two; `t` renames a tag, `old=new`; `N` takes a
170
+ new sample's values, `field=value`, and fields kept from another,
171
+ `keep:FIELD,…`; `D` removes a sample.
172
+ - **An editor of its own window leaves the TUI drawn**: with Notepad or
173
+ `code --wait`, `E` and `M` say what they wait for over the TUI; an editor
174
+ in the terminal takes it as before.
175
+ - **Windows**: tab completion in PowerShell completes the word after the
176
+ cursor, where each Tab wrote the word before it again; `E` and `M` open
177
+ the file in Notepad where no editor is named, rather than in the
178
+ application Windows gives it (Python, for a model); a sample's folder is
179
+ shown in Explorer, its file selected; a lock or a journal a killed command
180
+ left is taken back; paths are said with `\`, never with both separators in
181
+ one message.
182
+ - `new NAME --keep SAMPLE FIELDS` copies the fields named from another
183
+ sample, and nothing else; `[property.NAME] range = [MIN, MAX]` makes a value
184
+ outside the range a defect for `validate`; `compute --timeout SECONDS`
185
+ stops a formula that runs too long and computes the others.
186
+
187
+ ### Changed
188
+
189
+ - **The demo is a tensile test**: three metal specimens in five steps, from
190
+ their sizes written by hand to their curves, results, a paper's tables and
191
+ figures, and two projects read together; in its results, two specimens
192
+ link to the one they are compared with. The start page writes it, and
193
+ *Reset the demo* writes it again as it came.
194
+ - **The documentation is in three parts**: guides, a task each; concepts, how
195
+ SampleKit works and why; and the reference. The home page walks through the
196
+ demo, and a page at an address of rc.1 sends its reader on. New guides
197
+ install SampleKit, start a project, edit, find and link samples, work in
198
+ the terminal interface and from Python, organise settings, read several
199
+ projects together, and say what to do when something goes wrong.
200
+ - **`note` is a reserved name**: a file holding an attribute `note:` is
201
+ refused, saying to rename it `remarks:` or `comment:`; `set note=` and
202
+ `sample.note` are the text below the frontmatter.
203
+ - **A number typed is previewed as the table shows it**: `set area=25.0`
204
+ beside an uncertainty of `0.028` previews `25.000`, and `25.0123` keeps
205
+ every digit typed.
206
+ - **A new row makes what reads its column outdated**: after `set --add-row`,
207
+ a value reading a computed column is *outdated*, as are the values reading
208
+ it, where it was said to wait for the new cell.
209
+ - **`compute` counts unchanged values by cells**, as it counts what it
210
+ computed: `computed 61 values in 3 samples, all unchanged`.
211
+
212
+ - **An uncertainty is rounded up, never understated**: at `.3f`, an
213
+ uncertainty of 0.00006 is written `0.001`, and 0.121 at `.2f` is `0.13`,
214
+ where rc.1 wrote `0.000` and `0.12`. A value is still rounded to the
215
+ nearest. The screen, Python and every file write the same digits, and a
216
+ standard error in a summary is rounded up too. An uncertainty is never
217
+ written as zero, so `validate` and an export no longer warn of one.
218
+ - **A property's formulas are `compute`, `compute_value` and
219
+ `compute_uncertainty`**: `compute=f` gives the whole property, `f()`
220
+ returning a number or `(value, uncertainty)`; `compute_value=` the value
221
+ alone, beside an uncertainty given apart. They were `compute_quantity`,
222
+ `compute` and `compute_uncertainty`.
223
+ - **A table's columns are declared with `sk.Property`**, its formula with
224
+ them: `sk.Property(unit="MPa", compute=self._stress,
225
+ depends_on=["row.force", "area"])`, the function given each row and
226
+ returning its cell, or `compute_column=f`, given the columns it reads and
227
+ returning one cell per row; `compute_value` and `compute_uncertainty` give
228
+ one number of each cell, the other entered. `sk.Column` is gone. A formula filling several
229
+ columns at once is a `sk.ComputedColumns`, in the table's `computed=`;
230
+ `compute_rows` and `compute_columns` are gone. A cell a formula gives is a
231
+ number or `(value, uncertainty)`, as a property's is, where the pair was
232
+ refused.
233
+ - **A project reads its subfolders by default**: `[collection] recursive` is
234
+ `true` unless `.samplekitrc` says `false`, so that `samplekit .` at a
235
+ project's root reads `samples/`. A folder outside any project is read alone,
236
+ as before. A folder reading no sample says so, naming the folders below that
237
+ hold some.
238
+ - **A table names its index**: `sk.Table(columns, index="day")`, or
239
+ `index=["day", "hour"]`; the index given by position is refused.
240
+ - **The command line is in colour on a terminal**, with the TUI's colours: a
241
+ value bold, an attribute and a unit each in its colour, a header bold, a
242
+ state as the TUI shows it, `✓` and `written:` in green. One palette,
243
+ `[colors]`, sets both; a file and a pipe get none.
244
+ - **Numbers in a column line up**: a column of numbers is written to the
245
+ decimals of its most precise, `2.00` beside `1.99`; a column of values with
246
+ uncertainties to one number of decimals where every uncertainty can keep one
247
+ or two significant digits (two when the first is a 1), `12.503 ± 0.004`
248
+ above `12.513 ± 0.010`. A summary's median, minimum and maximum follow
249
+ their column, and `set` says the mean of new readings to the place of their
250
+ uncertainty. A declared precision still wins.
251
+ - **The record of which formula computed each value travels with the
252
+ project**, in its history, no longer on your computer: a formula edited on
253
+ one computer is seen changed on every other, and a colleague's
254
+ recomputed values are current on yours.
255
+ - **Reading computes nothing, in Python too**: a value computed from readings,
256
+ the mean of several measurements, say, has no value until it is
257
+ computed, and says *never computed*, rather than computing behind your back.
258
+ - **A file written from values that are not current says so and exits 2**: an
259
+ export or a table written with `-o` names the values that are outdated,
260
+ failed or never computed. In a CSV, a column `NAME_state` beside the
261
+ quantity says which.
262
+ - **Exports write units as the sample files spell them**, `degC` rather than
263
+ the screen's `°C`; `--style plain` gives the screen's forms.
264
+ - **`restore` without `--at` takes back your last change only**, value by
265
+ value, and keeps what was edited by hand or pulled from a colleague since.
266
+ - **A sample file must declare `schema_version: 1`**; a file without it is not
267
+ a sample, as a README is not. A key written twice in a sample is refused
268
+ rather than silently taking the last.
269
+ - **In the TUI**: a value opens selected, so that what you type replaces it
270
+ (an arrow or `End` keeps it to edit); the basket is kept from one session
271
+ to the next; a file changed in another editor is read again by itself.
272
+
273
+ - **Values not current are counted by cells**, on every surface: a table's
274
+ column outdated in its 13 rows counts 13, and a value and its uncertainty
275
+ given by two formulas count two.
276
+ - **What reads a waiting value waits too**, said *waits for area, which
277
+ waits*, rather than outdated or failed. A value the model no longer
278
+ computes is listed apart, to keep or remove.
279
+ - **One wording for nothing done**: a command with nothing to change says
280
+ `nothing to change — WHY`, and a question answered no says `nothing
281
+ written`.
282
+ - **`validate` reads each sample with the model**, and says where the model
283
+ cannot read one.
284
+ - **A file written from values not current says so on the standard output**,
285
+ so that `-q` or a redirected error stream does not hide it; `--accept
286
+ waiting` is refused, since a waiting value fails nothing.
287
+ - **Over several projects, a snapshot's number is one project's**: `log
288
+ --at`, `diff --from` and `--to` from a folder above several projects are
289
+ refused, naming the project to choose.
290
+ - **The migration tool keeps every sample's note**, 0.x's included.
291
+
292
+ ### Removed
293
+
294
+ - **Reading what earlier versions wrote**: sample files, configuration keys,
295
+ command-line words and Python names of SampleKit 0.2 and rc.1 are refused
296
+ like any unknown one, naming the nearest valid name. The upgrade guide says
297
+ how to carry each over.
298
+ - `new --like`, `compute --try`, and the folder after `explain FILE`: a file
299
+ SampleKit wrote is now found in the projects around it.
300
+
301
+ ### Fixed
302
+
303
+ Many defects found by testing rc.1, among them values reported as current
304
+ that were not, edits lost when two changes met, and a colleague's work pulled
305
+ through git that the history took for your own.
306
+
10
307
  ## [1.0.0-rc.1] — 2026-09-28
11
308
 
12
309
  The first release candidate of SampleKit 1.0, and a new SampleKit. Version
@@ -334,9 +631,9 @@ model's description is current.
334
631
  `'value' is written 'v' since schema 1: rename it`.
335
632
  - **`template()` and the `report` module**: the note is no longer generated.
336
633
  Tables for a paper are profiles and exports; figures are drawn with `plot`.
337
- - **pandas**: `to_dataframe()`, `stats()` on a list and the `converters`
338
- module. `to_csv()` or `to_dict()` give data pandas reads, and `--summary`,
339
- `Summary` and `sk.stats` summarise.
634
+ - **pandas**: `to_dataframe()` and the `converters` module; `stats()` on a
635
+ list gives a `Summary` rather than a DataFrame. `to_csv()` or `to_dict()`
636
+ give data pandas reads, and `--summary`, `Summary` and `sk.stats` summarise.
340
637
  - **Computing on read**, and the cache a changed input cleared.
341
638
  - **The automatic mean and standard deviation of a list**: a statistic is
342
639
  declared.
@@ -345,7 +642,7 @@ model's description is current.
345
642
 
346
643
  No command converts a 0.2.0 sample: the model has to be rewritten by hand
347
644
  anyway, and a tool that did half the work would take all the risk of writing
348
- to your files. [Upgrade from an older SampleKit](docs/how-to/upgrade.md)
645
+ to your files. [Upgrade from an older SampleKit](docs/guides/upgrade.md)
349
646
  shows how to carry each sample across — its values, uncertainties, readings,
350
647
  tables and text — with both versions installed side by side, into a new
351
648
  folder, and how to check the result.
@@ -1462,6 +1462,12 @@ version = "0.5.0"
1462
1462
  source = "registry+https://github.com/rust-lang/crates.io-index"
1463
1463
  checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
1464
1464
 
1465
+ [[package]]
1466
+ name = "html-escape"
1467
+ version = "0.2.15"
1468
+ source = "registry+https://github.com/rust-lang/crates.io-index"
1469
+ checksum = "c9356095b4b41197bba32173600e1582792cda618f65d12f68e2e77d273413c5"
1470
+
1465
1471
  [[package]]
1466
1472
  name = "iana-time-zone"
1467
1473
  version = "0.1.65"
@@ -2473,7 +2479,7 @@ dependencies = [
2473
2479
 
2474
2480
  [[package]]
2475
2481
  name = "samplekit"
2476
- version = "1.0.0-rc.1"
2482
+ version = "1.0.0-rc.2"
2477
2483
  dependencies = [
2478
2484
  "anstream",
2479
2485
  "anstyle",
@@ -2489,6 +2495,7 @@ dependencies = [
2489
2495
  "gethostname",
2490
2496
  "gix",
2491
2497
  "globset",
2498
+ "html-escape",
2492
2499
  "indexmap",
2493
2500
  "nucleo-matcher",
2494
2501
  "opener",
@@ -2508,8 +2515,10 @@ dependencies = [
2508
2515
  "toml_edit",
2509
2516
  "tui-markdown",
2510
2517
  "unicode-ident",
2518
+ "unicode-normalization",
2511
2519
  "unicode-segmentation",
2512
2520
  "unicode-width",
2521
+ "v_latexescape",
2513
2522
  "walkdir",
2514
2523
  ]
2515
2524
 
@@ -3035,6 +3044,21 @@ version = "0.2.2"
3035
3044
  source = "registry+https://github.com/rust-lang/crates.io-index"
3036
3045
  checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
3037
3046
 
3047
+ [[package]]
3048
+ name = "v_escape-base"
3049
+ version = "0.1.0"
3050
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3051
+ checksum = "f1212fce830b75af194b578e55b3db9049f2c8c45f58d397fb25602fdb50fb3d"
3052
+
3053
+ [[package]]
3054
+ name = "v_latexescape"
3055
+ version = "0.16.0"
3056
+ source = "registry+https://github.com/rust-lang/crates.io-index"
3057
+ checksum = "67ee1d1c03d7a41c6540f932756c9eb9bab23f02877c6337c5629a29aad942f1"
3058
+ dependencies = [
3059
+ "v_escape-base",
3060
+ ]
3061
+
3038
3062
  [[package]]
3039
3063
  name = "version_check"
3040
3064
  version = "0.9.5"
@@ -3241,9 +3265,9 @@ dependencies = [
3241
3265
 
3242
3266
  [[package]]
3243
3267
  name = "yoke-derive"
3244
- version = "0.8.3"
3268
+ version = "0.8.4"
3245
3269
  source = "registry+https://github.com/rust-lang/crates.io-index"
3246
- checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78"
3270
+ checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71"
3247
3271
  dependencies = [
3248
3272
  "proc-macro2",
3249
3273
  "quote",
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "samplekit"
3
- version = "1.0.0-rc.1"
3
+ version = "1.0.0-rc.2"
4
4
  edition = "2024"
5
5
  description = "Sample data in plain Markdown: computed, current, tracked"
6
6
  repository = "https://github.com/zelyph/SampleKit"
@@ -17,7 +17,7 @@ include = [
17
17
  "/Cargo.lock",
18
18
  "/build.rs",
19
19
  "/src/",
20
- "/examples/brewing/",
20
+ "/examples/tensile/",
21
21
  "/README.md",
22
22
  "/CHANGELOG.md",
23
23
  "/LICENSE",
@@ -45,6 +45,7 @@ serde_json = { version = "1", features = ["raw_value"] }
45
45
  toml = { version = "0.9", features = ["preserve_order"] }
46
46
  unicode-width = "0.2"
47
47
  unicode-segmentation = "1"
48
+ unicode-normalization = "0.1.25"
48
49
  anstyle = "1.0"
49
50
  anstream = "1.0"
50
51
  anstyle-parse = "1.0"
@@ -57,6 +58,8 @@ ctrlc = { version = "3.5.2", features = ["termination"] }
57
58
  toml_edit = "0.25"
58
59
  ratatui = { version = "0.30", default-features = false, features = ["crossterm"] }
59
60
  gix = { version = "0.88", default-features = false, features = ["sha1"] }
61
+ # Writes the history's pack when it is compacted: the versions gix uses, with
62
+ # the features that write a pack and its index.
60
63
  crossterm = "0.29"
61
64
  tui-markdown = { version = "0.3.9", default-features = false }
62
65
  nucleo-matcher = "0.3.1"
@@ -73,6 +76,8 @@ shell-words = "1.1.1"
73
76
  gethostname = "1.1.0"
74
77
  rat-text = "3.1.0"
75
78
  rat-markdown = "0.7.3"
79
+ v_latexescape = "0.16"
80
+ html-escape = "0.2"
76
81
 
77
82
  [lints.clippy]
78
83
  all = { level = "deny", priority = -1 }
@@ -0,0 +1,196 @@
1
+ Metadata-Version: 2.4
2
+ Name: samplekit
3
+ Version: 1.0.0rc2
4
+ Classifier: Development Status :: 4 - Beta
5
+ Classifier: Intended Audience :: Science/Research
6
+ Classifier: Operating System :: OS Independent
7
+ Classifier: Programming Language :: Python :: 3
8
+ Classifier: Programming Language :: Python :: 3 :: Only
9
+ Classifier: Programming Language :: Rust
10
+ Classifier: Topic :: Scientific/Engineering
11
+ Requires-Dist: matplotlib>=3.8
12
+ License-File: LICENSE
13
+ License-File: THIRD-PARTY-LICENSES.md
14
+ Summary: Sample data in plain Markdown: computed, current, tracked
15
+ Keywords: samples,notebook,markdown,uncertainty
16
+ Home-Page: https://zelyph.github.io/SampleKit/
17
+ Author: zelyph
18
+ License-Expression: MIT
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
21
+ Project-URL: Changelog, https://github.com/zelyph/SampleKit/blob/main/CHANGELOG.md
22
+ Project-URL: Documentation, https://zelyph.github.io/SampleKit/latest/
23
+ Project-URL: Homepage, https://github.com/zelyph/SampleKit
24
+ Project-URL: Issues, https://github.com/zelyph/SampleKit/issues
25
+
26
+ # SampleKit
27
+
28
+ **Sample data in plain Markdown: computed, current, tracked.**
29
+
30
+ Which value was computed from which measurement? Was this table made before or
31
+ after the thickness was measured again? Is the figure in the draft still
32
+ right? SampleKit answers these questions for a folder of plain text files:
33
+ one sample, one Markdown file, readable in any editor, in Obsidian, and in
34
+ git.
35
+
36
+ ```yaml
37
+ ---
38
+ schema_version: 1
39
+ name: copper-01
40
+ material: copper
41
+ compared_with: "[[steel-01]]"
42
+ properties:
43
+ width: {readings: [12.509, 12.498, 12.506], unit: mm}
44
+ thickness: {readings: [1.995, 1.988, 2.007], unit: mm}
45
+ ---
46
+ Tested at 2 mm/min, across the rolling direction.
47
+ ```
48
+
49
+ Above the second `---` are the sample's data: attributes, values with their
50
+ uncertainties and units, readings, tables of measurements. Below is a note
51
+ that is yours, kept as you write it. A folder of such files is a project,
52
+ with no database and nothing to set up.
53
+
54
+ ## What it does
55
+
56
+ - **Computed**: the values that derive from your measurements, an area, a
57
+ modulus, a whole column of stress, come from formulas you write in Python,
58
+ uncertainties included.
59
+ - **Current**: SampleKit knows which results still rest on the measurements
60
+ they were computed from, and says which do not, and why.
61
+ - **Tracked**: every change it writes is kept in a history of the project's
62
+ own, with the command that made it, and no git to install. `--at` reads the
63
+ project as it was, and makes a table or a figure again exactly as it was.
64
+ - **Tables and figures**: select, sort and group samples, then write a CSV, a
65
+ LaTeX or Markdown table, or a matplotlib figure, in one style for the whole
66
+ project, by one command you run again at each draft.
67
+ - **Linked**: a sample names another, a file or a web page, as Obsidian and
68
+ Markdown write a link; SampleKit follows it both ways, checks it, and keeps
69
+ it when a sample is renamed.
70
+ - **Three ways in**: a command line, a full-screen terminal interface, and a
71
+ Python package reading the same files with the same names.
72
+
73
+ ## A taste
74
+
75
+ From the last step of the demo, three tensile specimens:
76
+
77
+ ```console
78
+ $ samplekit -c name,material,tensile_strength -s -tensile_strength # a table, sorted
79
+ $ samplekit -f 'elongation > 20' # the specimens a filter selects
80
+ $ samplekit status # what is not current, and why
81
+ $ samplekit compute --write # run the project's Python model
82
+ $ samplekit export paper --write # a LaTeX table for a paper
83
+ $ samplekit samples/steel-01.md view curve --csv # a sample's curve, as CSV
84
+ $ samplekit samples/steel-01.md log # every change kept, and what made it
85
+ $ samplekit # the terminal interface, full screen
86
+ ```
87
+
88
+ ```python
89
+ import samplekit as sk
90
+
91
+ for specimen in sk.load("samples").filter("elongation > 20"):
92
+ print(specimen.name, specimen.young_modulus.value, specimen.young_modulus.uncertainty)
93
+ ```
94
+
95
+ ## Install
96
+
97
+ The command line is one file: download it for Linux, macOS or Windows from
98
+ [the releases](https://github.com/zelyph/SampleKit/releases), or build it with
99
+ Rust:
100
+
101
+ ```console
102
+ $ cargo install samplekit --locked --version VERSION
103
+ ```
104
+
105
+ The Python package goes into each project's `.venv/`, at the version of the
106
+ command line, `VERSION` being what `samplekit --version` says; `samplekit
107
+ init` makes that environment and installs it for you:
108
+
109
+ ```console
110
+ $ pip install samplekit==VERSION
111
+ ```
112
+
113
+ > **Until 1.0, name the version.** `pip install samplekit` alone gives 0.2.0,
114
+ > the previous version, whose API is not this one; likewise the *Latest*
115
+ > release on GitHub is 0.2.0, and this version's archives are under its own
116
+ > release, marked *pre-release*.
117
+
118
+ [Install SampleKit](https://zelyph.github.io/SampleKit/latest/guides/install.html)
119
+ says more, system by system. **From an earlier version**, 0.x or 1.0.0-rc.1,
120
+ `samplekit-migrate.pyz`, in each release, carries a project into a new
121
+ folder this version reads, and says what to check by hand
122
+ ([upgrade](https://zelyph.github.io/SampleKit/latest/guides/upgrade.html)).
123
+ It never writes in the folder it reads; back your project up all the same.
124
+
125
+ ## Try the demo
126
+
127
+ `samplekit` alone opens its start page; `g`, then *The demo*, writes a
128
+ tensile test in five steps, from three specimens measured by hand to their
129
+ curves, results, a paper's tables and figures, and opens the first.
130
+ [The documentation](https://zelyph.github.io/SampleKit/latest/) walks
131
+ through it, then goes further: guides a task each, the concepts, and the
132
+ reference.
133
+
134
+ ## Where things are
135
+
136
+ | | |
137
+ | ----------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
138
+ | [`docs/`](https://zelyph.github.io/SampleKit/latest/index.html) | The documentation: the home page's walkthrough of the demo, [guides](https://zelyph.github.io/SampleKit/latest/guides/index.html), [concepts](https://zelyph.github.io/SampleKit/latest/concepts/index.html) and the [reference](https://zelyph.github.io/SampleKit/latest/reference/index.html) |
139
+ | `src/`, `tests/` | The Rust crate: the core, the command line, the terminal interface and the Rust half of the Python package; a test file per source file |
140
+ | `python/samplekit/` | The Python half of the Python package |
141
+ | [`examples/tensile/`](https://github.com/zelyph/SampleKit/blob/main/examples/tensile/README.md) | The demo, in five steps, generated from `fixtures/tensile/`; the start page writes it for you |
142
+ | `fixtures/tensile/` | What the demo is generated from: its model, scripts and READMEs, and the generator |
143
+ | [`migrate/`](https://github.com/zelyph/SampleKit/blob/main/migrate/README.md) | The migration tool, `samplekit-migrate.pyz` in each release |
144
+
145
+ ## Building
146
+
147
+ ```console
148
+ $ cargo build --release # the command line: target/release/samplekit
149
+ $ python -m venv .venv && source .venv/bin/activate
150
+ $ pip install maturin
151
+ $ maturin develop --release # the Python package, into .venv
152
+ $ tools/check.sh # everything a commit must pass
153
+ ```
154
+
155
+ The documentation is a Sphinx site, built from `docs/` into `target/site`,
156
+ after `maturin develop`, since the Python reference reads the package:
157
+
158
+ ```console
159
+ $ .venv/bin/pip install -r docs/requirements.txt
160
+ $ .venv/bin/sphinx-build docs target/site
161
+ ```
162
+
163
+ The command line needs no Python to read, select, render, check or export;
164
+ Python runs a project's model, and matplotlib draws its figures.
165
+
166
+ ## Status
167
+
168
+ Version `1.0.0-rc.2` (`1.0.0rc2` as Python spells it), the second release
169
+ candidate of `1.0.0`. It follows `0.2.0`, the previous implementation, in
170
+ Python alone, published under the same name. What changed is in
171
+ [CHANGELOG.md](https://github.com/zelyph/SampleKit/blob/main/CHANGELOG.md).
172
+
173
+ ## Roadmap
174
+
175
+ In order of priority:
176
+
177
+ - [ ] **1.0**: this release candidate, tried, then published as `1.0.0`;
178
+ from then on, `pip install samplekit` gives it without naming a version.
179
+ - [ ] **Designs of experiments**: full and
180
+ fractional factorials, central composite, Box-Behnken, definitive
181
+ screening and mixture designs, with centre points, replicates, blocks and
182
+ a randomised order. SampleKit lays out a plan's runs, makes a sample of
183
+ each, takes in the samples already made, says which runs are still to
184
+ make, and analyses what they measured: a model per response, reduced and
185
+ tested term by term, its residuals examined, then used to predict,
186
+ optimise and draw; in the terminal interface and from Python too.
187
+ - [ ] **An Obsidian plugin**, so that a project opened as a vault shows its
188
+ properties and tables as SampleKit does, hides what only SampleKit reads,
189
+ such as `schema_version`, and edits them.
190
+
191
+ ## Licence
192
+
193
+ MIT: see [LICENSE](https://github.com/zelyph/SampleKit/blob/main/LICENSE).
194
+ Keep the notice with any copy; everything else is permitted, including
195
+ commercial use.
196
+