cellpy 2.1.4__tar.gz → 2.1.5__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 (595) hide show
  1. cellpy-2.1.5/.issueflows/01-current-issues/issue1015_original.md +7 -0
  2. cellpy-2.1.5/.issueflows/01-current-issues/issue1015_plan.md +21 -0
  3. cellpy-2.1.5/.issueflows/01-current-issues/issue1015_status.md +15 -0
  4. cellpy-2.1.5/.issueflows/02-partly-solved-issues/issue_fix_cellpycore026_original.md +14 -0
  5. cellpy-2.1.5/.issueflows/02-partly-solved-issues/issue_fix_cellpycore026_status.md +17 -0
  6. cellpy-2.1.5/.issueflows/03-solved-issues/issue1008_original.md +7 -0
  7. cellpy-2.1.5/.issueflows/03-solved-issues/issue1008_plan.md +82 -0
  8. cellpy-2.1.5/.issueflows/03-solved-issues/issue1008_status.md +28 -0
  9. cellpy-2.1.5/.issueflows/03-solved-issues/issue1009_original.md +7 -0
  10. cellpy-2.1.5/.issueflows/03-solved-issues/issue1009_plan.md +91 -0
  11. cellpy-2.1.5/.issueflows/03-solved-issues/issue1009_status.md +56 -0
  12. cellpy-2.1.5/.issueflows/03-solved-issues/issue1017_original.md +17 -0
  13. cellpy-2.1.5/.issueflows/03-solved-issues/issue1017_plan.md +77 -0
  14. cellpy-2.1.5/.issueflows/03-solved-issues/issue1017_status.md +31 -0
  15. cellpy-2.1.5/.issueflows/03-solved-issues/issue778_original.md +9 -0
  16. cellpy-2.1.5/.issueflows/03-solved-issues/issue778_plan.md +129 -0
  17. cellpy-2.1.5/.issueflows/03-solved-issues/issue778_status.md +38 -0
  18. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/test-registry.md +21 -0
  19. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/v2-cellpycore-pin-gate.md +5 -4
  20. {cellpy-2.1.4 → cellpy-2.1.5}/AGENTS.md +7 -0
  21. {cellpy-2.1.4 → cellpy-2.1.5}/HISTORY.md +115 -0
  22. {cellpy-2.1.4 → cellpy-2.1.5}/PKG-INFO +4 -4
  23. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/_dbengine.py +13 -2
  24. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/db.py +4 -1
  25. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/facade.py +10 -0
  26. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/options.py +5 -1
  27. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/summary.py +4 -2
  28. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/collected.py +303 -107
  29. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/registry.py +13 -14
  30. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/dbreader.py +24 -1
  31. {cellpy-2.1.4 → cellpy-2.1.5}/pyproject.toml +3 -3
  32. {cellpy-2.1.4 → cellpy-2.1.5}/uv.lock +111 -114
  33. {cellpy-2.1.4 → cellpy-2.1.5}/zensical.toml +12 -1
  34. {cellpy-2.1.4 → cellpy-2.1.5}/.aliases +0 -0
  35. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/commands/build.md +0 -0
  36. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/commands/create-original-issue-file.md +0 -0
  37. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/rules/cellpy-core-migration.mdc +0 -0
  38. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/rules/cellpy-workspace.mdc +0 -0
  39. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/rules/graphify.mdc +0 -0
  40. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/rules/issueflow-rules.mdc +0 -0
  41. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/rules/kiss.mdc +0 -0
  42. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/rules/this-project.mdc +0 -0
  43. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/caveman/SKILL.md +0 -0
  44. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/gh-ci/SKILL.md +0 -0
  45. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/grill-me/SKILL.md +0 -0
  46. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow/SKILL.md +0 -0
  47. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-archive/SKILL.md +0 -0
  48. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-auto/SKILL.md +0 -0
  49. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-build/SKILL.md +0 -0
  50. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-cleanup/SKILL.md +0 -0
  51. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-close/SKILL.md +0 -0
  52. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-comments/SKILL.md +0 -0
  53. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-cycle/SKILL.md +0 -0
  54. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-doctor/SKILL.md +0 -0
  55. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-epic/SKILL.md +0 -0
  56. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-fix/SKILL.md +0 -0
  57. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-graphify/SKILL.md +0 -0
  58. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-history-update/SKILL.md +0 -0
  59. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-init/SKILL.md +0 -0
  60. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-issue/SKILL.md +0 -0
  61. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-pause/SKILL.md +0 -0
  62. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-pick/SKILL.md +0 -0
  63. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-plan/SKILL.md +0 -0
  64. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-review/SKILL.md +0 -0
  65. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-status/SKILL.md +0 -0
  66. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-version-bump/SKILL.md +0 -0
  67. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/iflow-yolo/SKILL.md +0 -0
  68. {cellpy-2.1.4 → cellpy-2.1.5}/.cursor/skills/issueflow-build/SKILL.md +0 -0
  69. {cellpy-2.1.4 → cellpy-2.1.5}/.dockerignore +0 -0
  70. {cellpy-2.1.4 → cellpy-2.1.5}/.editorconfig +0 -0
  71. {cellpy-2.1.4 → cellpy-2.1.5}/.env_example +0 -0
  72. {cellpy-2.1.4 → cellpy-2.1.5}/.gitattributes +0 -0
  73. {cellpy-2.1.4 → cellpy-2.1.5}/.gitignore +0 -0
  74. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/00-tools/.gitkeep +0 -0
  75. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/00-tools/README.md +0 -0
  76. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/00-tools/migrate_prms_calls.py +0 -0
  77. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/00-tools/scan_hardcoded_headers.py +0 -0
  78. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/00-tools/scan_member_usage.py +0 -0
  79. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/01-current-issues/.gitkeep +0 -0
  80. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/02-partly-solved-issues/.gitkeep +0 -0
  81. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/02-partly-solved-issues/issue985_original.md +0 -0
  82. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/02-partly-solved-issues/issue985_status.md +0 -0
  83. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/.gitkeep +0 -0
  84. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/2026-07-09_archived_issues.md +0 -0
  85. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/2026-07-31_archived_issues.md +0 -0
  86. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status.md +0 -0
  87. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-07-31.md +0 -0
  88. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-08-08.md +0 -0
  89. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-08-09.md +0 -0
  90. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-08-25.md +0 -0
  91. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-09-05.md +0 -0
  92. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-09-07.md +0 -0
  93. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/cycle_status_2026-09-08.md +0 -0
  94. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue1000_original.md +0 -0
  95. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue1000_plan.md +0 -0
  96. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue1000_status.md +0 -0
  97. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue459_original.md +0 -0
  98. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue786_original.md +0 -0
  99. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue786_plan.md +0 -0
  100. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue786_status.md +0 -0
  101. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue799_original.md +0 -0
  102. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue799_plan.md +0 -0
  103. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue799_status.md +0 -0
  104. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue800_original.md +0 -0
  105. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue800_plan.md +0 -0
  106. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue800_status.md +0 -0
  107. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue801_original.md +0 -0
  108. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue801_plan.md +0 -0
  109. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue801_status.md +0 -0
  110. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue802_original.md +0 -0
  111. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue802_plan.md +0 -0
  112. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue802_status.md +0 -0
  113. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue804_original.md +0 -0
  114. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue804_plan.md +0 -0
  115. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue804_status.md +0 -0
  116. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue809_original.md +0 -0
  117. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue809_plan.md +0 -0
  118. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue809_status.md +0 -0
  119. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue816_original.md +0 -0
  120. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue816_plan.md +0 -0
  121. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue816_status.md +0 -0
  122. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue817_original.md +0 -0
  123. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue817_plan.md +0 -0
  124. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue817_status.md +0 -0
  125. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue818_original.md +0 -0
  126. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue818_plan.md +0 -0
  127. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue818_status.md +0 -0
  128. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue819_original.md +0 -0
  129. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue819_plan.md +0 -0
  130. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue819_status.md +0 -0
  131. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue820_original.md +0 -0
  132. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue820_plan.md +0 -0
  133. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue820_status.md +0 -0
  134. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue821_original.md +0 -0
  135. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue821_plan.md +0 -0
  136. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue821_status.md +0 -0
  137. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue822_original.md +0 -0
  138. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue822_plan.md +0 -0
  139. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue822_status.md +0 -0
  140. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue825_original.md +0 -0
  141. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue825_plan.md +0 -0
  142. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue825_status.md +0 -0
  143. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue837_original.md +0 -0
  144. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue837_plan.md +0 -0
  145. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue837_status.md +0 -0
  146. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue839_original.md +0 -0
  147. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue839_plan.md +0 -0
  148. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue839_status.md +0 -0
  149. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue845_original.md +0 -0
  150. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue845_plan.md +0 -0
  151. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue845_status.md +0 -0
  152. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue846_original.md +0 -0
  153. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue846_plan.md +0 -0
  154. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue846_status.md +0 -0
  155. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue849_original.md +0 -0
  156. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue849_plan.md +0 -0
  157. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue849_status.md +0 -0
  158. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue850_original.md +0 -0
  159. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue850_plan.md +0 -0
  160. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue850_status.md +0 -0
  161. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue851_original.md +0 -0
  162. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue851_plan.md +0 -0
  163. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue851_status.md +0 -0
  164. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue853_original.md +0 -0
  165. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue853_plan.md +0 -0
  166. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue853_status.md +0 -0
  167. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue855_original.md +0 -0
  168. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue855_plan.md +0 -0
  169. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue855_status.md +0 -0
  170. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue862_original.md +0 -0
  171. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue862_plan.md +0 -0
  172. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue862_status.md +0 -0
  173. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue863_original.md +0 -0
  174. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue863_plan.md +0 -0
  175. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue863_status.md +0 -0
  176. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue866_original.md +0 -0
  177. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue866_status.md +0 -0
  178. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue867_original.md +0 -0
  179. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue867_plan.md +0 -0
  180. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue867_status.md +0 -0
  181. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue868_original.md +0 -0
  182. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue868_plan.md +0 -0
  183. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue868_status.md +0 -0
  184. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue869_original.md +0 -0
  185. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue869_plan.md +0 -0
  186. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue869_status.md +0 -0
  187. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue874_original.md +0 -0
  188. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue874_plan.md +0 -0
  189. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue874_status.md +0 -0
  190. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue875_original.md +0 -0
  191. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue875_plan.md +0 -0
  192. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue875_status.md +0 -0
  193. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue876_original.md +0 -0
  194. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue876_plan.md +0 -0
  195. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue876_status.md +0 -0
  196. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue878_original.md +0 -0
  197. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue878_plan.md +0 -0
  198. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue878_status.md +0 -0
  199. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue885_original.md +0 -0
  200. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue885_status.md +0 -0
  201. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue891_original.md +0 -0
  202. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue891_plan.md +0 -0
  203. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue891_status.md +0 -0
  204. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue892_original.md +0 -0
  205. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue892_status.md +0 -0
  206. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue912_original.md +0 -0
  207. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue912_plan.md +0 -0
  208. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue912_status.md +0 -0
  209. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue916_original.md +0 -0
  210. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue916_status.md +0 -0
  211. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue937_original.md +0 -0
  212. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue937_plan.md +0 -0
  213. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue937_status.md +0 -0
  214. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue938_original.md +0 -0
  215. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue938_plan.md +0 -0
  216. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue938_status.md +0 -0
  217. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue939_original.md +0 -0
  218. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue939_plan.md +0 -0
  219. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue939_status.md +0 -0
  220. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue940_original.md +0 -0
  221. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue940_plan.md +0 -0
  222. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue940_status.md +0 -0
  223. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue947_original.md +0 -0
  224. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue947_plan.md +0 -0
  225. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue947_status.md +0 -0
  226. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue948_original.md +0 -0
  227. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue948_plan.md +0 -0
  228. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue948_status.md +0 -0
  229. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue949_original.md +0 -0
  230. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue949_plan.md +0 -0
  231. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue949_status.md +0 -0
  232. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue950_original.md +0 -0
  233. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue950_plan.md +0 -0
  234. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue950_status.md +0 -0
  235. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue952_original.md +0 -0
  236. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue952_plan.md +0 -0
  237. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue952_status.md +0 -0
  238. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue960_original.md +0 -0
  239. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue960_plan.md +0 -0
  240. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue960_status.md +0 -0
  241. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue961_original.md +0 -0
  242. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue961_plan.md +0 -0
  243. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue961_status.md +0 -0
  244. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue962_original.md +0 -0
  245. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue962_plan.md +0 -0
  246. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue962_status.md +0 -0
  247. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue963_original.md +0 -0
  248. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue963_plan.md +0 -0
  249. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue963_status.md +0 -0
  250. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue967_original.md +0 -0
  251. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue967_plan.md +0 -0
  252. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue967_status.md +0 -0
  253. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue971_original.md +0 -0
  254. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue971_plan.md +0 -0
  255. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue971_status.md +0 -0
  256. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue982_original.md +0 -0
  257. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue982_plan.md +0 -0
  258. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue982_status.md +0 -0
  259. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue983_original.md +0 -0
  260. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue983_plan.md +0 -0
  261. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue983_status.md +0 -0
  262. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue989_original.md +0 -0
  263. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue989_status.md +0 -0
  264. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue990_original.md +0 -0
  265. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue990_plan.md +0 -0
  266. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue990_status.md +0 -0
  267. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue991_original.md +0 -0
  268. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue991_plan.md +0 -0
  269. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue991_status.md +0 -0
  270. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue993_original.md +0 -0
  271. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue993_plan.md +0 -0
  272. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/03-solved-issues/issue993_status.md +0 -0
  273. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/.gitkeep +0 -0
  274. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/atomic-file-writes.md +0 -0
  275. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/batch-load-orchestrator.md +0 -0
  276. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/bdf-export.md +0 -0
  277. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/build-and-versioning.md +0 -0
  278. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cellpy-v2-architecture.excalidraw +0 -0
  279. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cellpy-v2-branching.md +0 -0
  280. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cellpy-v2-epic.md +0 -0
  281. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cellpy-workspace-repos.md +0 -0
  282. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cellpycell-di-restructuring.md +0 -0
  283. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/ci-tiers.md +0 -0
  284. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cli-api-echo-binder.md +0 -0
  285. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/cli-light-startup.md +0 -0
  286. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/docs-on-master.md +0 -0
  287. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/essential-tests.md +0 -0
  288. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/filters-and-plot-filtering.md +0 -0
  289. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/harmonized-raw-default.md +0 -0
  290. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/instrument-availability.md +0 -0
  291. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/marimo-docs.md +0 -0
  292. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/optional-plotting-notebook.md +0 -0
  293. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/otherpath-upath.md +0 -0
  294. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/plotting-backends.md +0 -0
  295. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/plotting-batch-summary.md +0 -0
  296. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/plotting-collected.md +0 -0
  297. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/plotting-cycle-legend.md +0 -0
  298. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/plotting-prepare.md +0 -0
  299. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/plotting-registry.md +0 -0
  300. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/release-procedure.md +0 -0
  301. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/testing-and-coverage.md +0 -0
  302. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/04-designs-and-guides/this-project.md +0 -0
  303. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/05-epics/.gitkeep +0 -0
  304. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/05-epics/epic567_plan.md +0 -0
  305. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/05-epics/epic896_plan.md +0 -0
  306. {cellpy-2.1.4 → cellpy-2.1.5}/.issueflows/config.toml +0 -0
  307. {cellpy-2.1.4 → cellpy-2.1.5}/.readthedocs.yaml +0 -0
  308. {cellpy-2.1.4 → cellpy-2.1.5}/AUTHORS.md +0 -0
  309. {cellpy-2.1.4 → cellpy-2.1.5}/CODE_OF_CONDUCT.md +0 -0
  310. {cellpy-2.1.4 → cellpy-2.1.5}/CONTRIBUTING.md +0 -0
  311. {cellpy-2.1.4 → cellpy-2.1.5}/DEPRECATIONS.md +0 -0
  312. {cellpy-2.1.4 → cellpy-2.1.5}/LICENSE.md +0 -0
  313. {cellpy-2.1.4 → cellpy-2.1.5}/README.md +0 -0
  314. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_cellpy_data_structure.md +0 -0
  315. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_cellpy_folder_structure.md +0 -0
  316. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_cellpy_packaging_pypi.md +0 -0
  317. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_cellpy_setup.md +0 -0
  318. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_conda_package.md +0 -0
  319. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_docs.md +0 -0
  320. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_loaders_and_instruments.md +0 -0
  321. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/dev_various.md +0 -0
  322. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_developers_guide/index.md +0 -0
  323. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/01_getting_started_tutorial.md +0 -0
  324. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/02_read_cell_data.md +0 -0
  325. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/03_more_about_get.md +0 -0
  326. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/04_other_interactions.md +0 -0
  327. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/05_configuring.md +0 -0
  328. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/06_pandas.md +0 -0
  329. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/07_data_mining.md +0 -0
  330. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basic_interactions/08_the_cellpy_cmd.md +0 -0
  331. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/basics.md +0 -0
  332. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/examples.md +0 -0
  333. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/index.md +0 -0
  334. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders/01_arbin.md +0 -0
  335. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders/02_maccor.md +0 -0
  336. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders/03_PEC.md +0 -0
  337. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders/04_Neware.md +0 -0
  338. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders/05_biologics.md +0 -0
  339. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders/06_custom.md +0 -0
  340. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/loaders.md +0 -0
  341. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks/images/templates_jupyterlab_001.png +0 -0
  342. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks/images/templates_jupyterlab_002.png +0 -0
  343. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks/tutorial_get_cap.ipynb +0 -0
  344. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks/tutorial_simple_plot.ipynb +0 -0
  345. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks/tutorial_templates.ipynb +0 -0
  346. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks/tutorial_xxx-checkpoint.ipynb +0 -0
  347. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/notebooks.md +0 -0
  348. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/tips_and_tricks.md +0 -0
  349. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/batch.md +0 -0
  350. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/collectors.md +0 -0
  351. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/custom_file_loaders.md +0 -0
  352. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/easyplot.md +0 -0
  353. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/figures/tutorials_utils_plotting_fig1.png +0 -0
  354. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/figures/tutorials_utils_plotting_fig2.png +0 -0
  355. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/ica.md +0 -0
  356. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/plotting.md +0 -0
  357. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/templates.md +0 -0
  358. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils/tut_ocv_rlx.md +0 -0
  359. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_examples_and_tutorials/utils.md +0 -0
  360. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_main_description/formats.md +0 -0
  361. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_main_description/index.md +0 -0
  362. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_main_description/installation.md +0 -0
  363. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/_main_description/usage.md +0 -0
  364. {cellpy-2.1.4 → cellpy-2.1.5}/_old_docs/index.md +0 -0
  365. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/README.md +0 -0
  366. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/__init__.py +0 -0
  367. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/baselines/v1x_ubuntu_py313.json +0 -0
  368. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/check_baseline.py +0 -0
  369. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/conftest.py +0 -0
  370. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/paths.py +0 -0
  371. {cellpy-2.1.4 → cellpy-2.1.5}/benchmarks/test_performance.py +0 -0
  372. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/__init__.py +0 -0
  373. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/_deprecation.py +0 -0
  374. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/_version.py +0 -0
  375. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/__init__.py +0 -0
  376. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/aggregate.py +0 -0
  377. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/journal.py +0 -0
  378. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/layout.py +0 -0
  379. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/outputs.py +0 -0
  380. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/policy.py +0 -0
  381. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/progress.py +0 -0
  382. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/qc.py +0 -0
  383. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/result.py +0 -0
  384. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/runner.py +0 -0
  385. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/batch/store.py +0 -0
  386. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/cli.py +0 -0
  387. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/cli_api.py +0 -0
  388. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/cli_ui.py +0 -0
  389. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/__init__.py +0 -0
  390. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/_summary_ops.py +0 -0
  391. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/cells.py +0 -0
  392. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/collection.py +0 -0
  393. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/collector.py +0 -0
  394. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/curves.py +0 -0
  395. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/dva.py +0 -0
  396. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/collect/ica.py +0 -0
  397. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/__init__.py +0 -0
  398. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/credentials.py +0 -0
  399. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/legacy.py +0 -0
  400. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/loader.py +0 -0
  401. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/migrate.py +0 -0
  402. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/models.py +0 -0
  403. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/reference.py +0 -0
  404. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/session.py +0 -0
  405. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/sources.py +0 -0
  406. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/config/types.py +0 -0
  407. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/exceptions.py +0 -0
  408. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/exporters/__init__.py +0 -0
  409. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/exporters/bdf.py +0 -0
  410. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/exporters/tabular.py +0 -0
  411. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/filters/__init__.py +0 -0
  412. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/filters/cycles.py +0 -0
  413. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/filters/summary.py +0 -0
  414. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/ica.py +0 -0
  415. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/internals/__init__.py +0 -0
  416. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/internals/connections.py +0 -0
  417. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/internals/otherpath.py +0 -0
  418. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/internals/progress.py +0 -0
  419. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/__init__.py +0 -0
  420. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/__init__.py +0 -0
  421. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/_alias_module.py +0 -0
  422. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/_importing.py +0 -0
  423. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/_module.py +0 -0
  424. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/_syncronized.py +0 -0
  425. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/_version.py +0 -0
  426. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/apipkg/py.typed +0 -0
  427. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/LICENSE +0 -0
  428. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/__init__.py +0 -0
  429. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/btsda.py +0 -0
  430. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/cli.py +0 -0
  431. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/dicts.py +0 -0
  432. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/formats.py +0 -0
  433. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/main.py +0 -0
  434. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/nda.py +0 -0
  435. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/ndax.py +0 -0
  436. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/utils.py +0 -0
  437. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/libs/local_fastnda/version.py +0 -0
  438. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/log.py +0 -0
  439. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/logging.json +0 -0
  440. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/.cellpy_prms_default.conf +0 -0
  441. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/__init__.py +0 -0
  442. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/cell_schema.py +0 -0
  443. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/internal_settings.py +0 -0
  444. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/legacy/__init__.py +0 -0
  445. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/legacy/update_headers.py +0 -0
  446. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/prmreader.py +0 -0
  447. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/parameters/prms.py +0 -0
  448. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/__init__.py +0 -0
  449. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/backends/__init__.py +0 -0
  450. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/backends/base.py +0 -0
  451. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/backends/mpl.py +0 -0
  452. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/backends/plotly.py +0 -0
  453. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/batch_summary.py +0 -0
  454. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/context.py +0 -0
  455. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/cycle_legend.py +0 -0
  456. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/figures.py +0 -0
  457. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/headers.py +0 -0
  458. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/labels.py +0 -0
  459. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/prepare/__init__.py +0 -0
  460. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/prepare/curves.py +0 -0
  461. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/prepare/ica.py +0 -0
  462. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/prepare/raw.py +0 -0
  463. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/prepare/steps.py +0 -0
  464. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/prepare/summary.py +0 -0
  465. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/spec.py +0 -0
  466. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/plotting/theme.py +0 -0
  467. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/__init__.py +0 -0
  468. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/capacity_curves.py +0 -0
  469. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/__init__.py +0 -0
  470. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/atomic.py +0 -0
  471. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/dtype.py +0 -0
  472. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/fids.py +0 -0
  473. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/format.py +0 -0
  474. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/keys.py +0 -0
  475. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/legacy_read.py +0 -0
  476. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/meta.py +0 -0
  477. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/meta_archive.py +0 -0
  478. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/read.py +0 -0
  479. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/selectors.py +0 -0
  480. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/translate.py +0 -0
  481. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/v9.py +0 -0
  482. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellpy_file/write.py +0 -0
  483. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/cellreader.py +0 -0
  484. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/data_structures.py +0 -0
  485. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/do.py +0 -0
  486. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/filefinder.py +0 -0
  487. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/SQL Table IDs.txt +0 -0
  488. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/__init__.py +0 -0
  489. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/_aux_map.py +0 -0
  490. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_res.py +0 -0
  491. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_sql.py +0 -0
  492. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_sql_7.py +0 -0
  493. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_sql_config.py +0 -0
  494. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_sql_csv.py +0 -0
  495. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_sql_h5.py +0 -0
  496. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/arbin_sql_xlsx.py +0 -0
  497. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/base.py +0 -0
  498. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/batmo_bdf.py +0 -0
  499. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/biologics_mpr.py +0 -0
  500. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/config_declarations.py +0 -0
  501. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/__init__.py +0 -0
  502. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/batmo_bdf_bdf.py +0 -0
  503. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/maccor_txt_one.py +0 -0
  504. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/maccor_txt_three.py +0 -0
  505. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/maccor_txt_two.py +0 -0
  506. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/maccor_txt_zero.py +0 -0
  507. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/neware_txt_one.py +0 -0
  508. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/neware_txt_two.py +0 -0
  509. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/configurations/neware_txt_zero.py +0 -0
  510. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/contract.py +0 -0
  511. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/custom.py +0 -0
  512. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/declarations.py +0 -0
  513. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/ext_nda_reader.py +0 -0
  514. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/harmonize.py +0 -0
  515. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/hooks.py +0 -0
  516. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/loader_specific_modules/__init__.py +0 -0
  517. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/loader_specific_modules/biologic_file_format.py +0 -0
  518. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/local_instrument.py +0 -0
  519. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/maccor_txt.py +0 -0
  520. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/maccor_txt_native.py +0 -0
  521. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/neware_nda.py +0 -0
  522. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/neware_txt.py +0 -0
  523. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/neware_xlsx.py +0 -0
  524. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/pec_csv.py +0 -0
  525. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/processors/__init__.py +0 -0
  526. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/processors/post_processors.py +0 -0
  527. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/processors/pre_processors.py +0 -0
  528. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/registry.py +0 -0
  529. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/instruments/testing.py +0 -0
  530. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/journal_layer.py +0 -0
  531. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/json_dbreader.py +0 -0
  532. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/merger.py +0 -0
  533. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/meta_resolver.py +0 -0
  534. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/native_core.py +0 -0
  535. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/provenance.py +0 -0
  536. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/slicing.py +0 -0
  537. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/sql_dbreader.py +0 -0
  538. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/readers/test_meta.py +0 -0
  539. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/units.py +0 -0
  540. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/__init__.py +0 -0
  541. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/batch.py +0 -0
  542. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/collectors.py +0 -0
  543. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/diagnostics.py +0 -0
  544. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/example_data.py +0 -0
  545. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/helpers.py +0 -0
  546. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/ica.py +0 -0
  547. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/live.py +0 -0
  548. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/ocv_rlx.py +0 -0
  549. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/plotutils.py +0 -0
  550. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/processor.py +0 -0
  551. {cellpy-2.1.4 → cellpy-2.1.5}/cellpy/utils/template_registry.py +0 -0
  552. {cellpy-2.1.4 → cellpy-2.1.5}/dev/backfill_notebook_plotly_pngs.py +0 -0
  553. {cellpy-2.1.4 → cellpy-2.1.5}/dev/conda-recipes/README.md +0 -0
  554. {cellpy-2.1.4 → cellpy-2.1.5}/dev/conda-recipes/cellpy/meta.yaml +0 -0
  555. {cellpy-2.1.4 → cellpy-2.1.5}/dev/conda-recipes/cellpycore/meta.yaml +0 -0
  556. {cellpy-2.1.4 → cellpy-2.1.5}/dev/make_bad_fixtures.py +0 -0
  557. {cellpy-2.1.4 → cellpy-2.1.5}/dev/plot_preview_common.py +0 -0
  558. {cellpy-2.1.4 → cellpy-2.1.5}/dev/preview_curve_plots.py +0 -0
  559. {cellpy-2.1.4 → cellpy-2.1.5}/dev/preview_ica_plots.py +0 -0
  560. {cellpy-2.1.4 → cellpy-2.1.5}/dev/preview_plots.py +0 -0
  561. {cellpy-2.1.4 → cellpy-2.1.5}/dev/preview_summary_plots.py +0 -0
  562. {cellpy-2.1.4 → cellpy-2.1.5}/dev/regenerate_goldens.py +0 -0
  563. {cellpy-2.1.4 → cellpy-2.1.5}/dev/render_example_notebooks.py +0 -0
  564. {cellpy-2.1.4 → cellpy-2.1.5}/dev/snapshot_cli_surface.py +0 -0
  565. {cellpy-2.1.4 → cellpy-2.1.5}/dev/snapshot_figure_specs.py +0 -0
  566. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/.gitignore +0 -0
  567. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/NOTES.md +0 -0
  568. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/README.md +0 -0
  569. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/_common.py +0 -0
  570. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/summarize_importtime.py +0 -0
  571. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_arbin_h5.py +0 -0
  572. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_cellpy_io.py +0 -0
  573. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_executors.py +0 -0
  574. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_filefinder.py +0 -0
  575. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_imports.py +0 -0
  576. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_one_cell.py +0 -0
  577. {cellpy-2.1.4 → cellpy-2.1.5}/dev/speed-test-01/time_otherpath.py +0 -0
  578. {cellpy-2.1.4 → cellpy-2.1.5}/docker/Dockerfile.build-test +0 -0
  579. {cellpy-2.1.4 → cellpy-2.1.5}/docker/sftp-test/README.md +0 -0
  580. {cellpy-2.1.4 → cellpy-2.1.5}/docker/sftp-test/compose.yml +0 -0
  581. {cellpy-2.1.4 → cellpy-2.1.5}/docker/sftp-test/data/hello.txt +0 -0
  582. {cellpy-2.1.4 → cellpy-2.1.5}/docker/sftp-test/data/nested/sample.txt +0 -0
  583. {cellpy-2.1.4 → cellpy-2.1.5}/environment.yml +0 -0
  584. {cellpy-2.1.4 → cellpy-2.1.5}/environment_dev.yml +0 -0
  585. {cellpy-2.1.4 → cellpy-2.1.5}/github_actions_environment.yml +0 -0
  586. {cellpy-2.1.4 → cellpy-2.1.5}/noxfile.py +0 -0
  587. {cellpy-2.1.4 → cellpy-2.1.5}/paper/.github/workflows/draft-pdf.yml +0 -0
  588. {cellpy-2.1.4 → cellpy-2.1.5}/paper/.gitignore +0 -0
  589. {cellpy-2.1.4 → cellpy-2.1.5}/paper/Figures/Cellpy-Utils.jpg +0 -0
  590. {cellpy-2.1.4 → cellpy-2.1.5}/paper/Figures/CellpyCell.jpg +0 -0
  591. {cellpy-2.1.4 → cellpy-2.1.5}/paper/Figures/CellpyData.jpg +0 -0
  592. {cellpy-2.1.4 → cellpy-2.1.5}/paper/paper.bib +0 -0
  593. {cellpy-2.1.4 → cellpy-2.1.5}/paper/paper.md +0 -0
  594. {cellpy-2.1.4 → cellpy-2.1.5}/scripts/build_test.sh +0 -0
  595. {cellpy-2.1.4 → cellpy-2.1.5}/scripts/dev_sync.sh +0 -0
@@ -0,0 +1,7 @@
1
+ # Issue #1015 — improve documentation
2
+
3
+ Source: https://github.com/jepegit/cellpy/issues/1015
4
+
5
+ I was looking at the summary_collector API docs and noticed that it is not any
6
+ links that takes you to the code (on github). I have seen other docs where that
7
+ is possible, and it is very helpful.
@@ -0,0 +1,21 @@
1
+ # Issue #1015 — plan
2
+
3
+ ## Goal
4
+
5
+ API reference pages let the reader see the code behind each documented
6
+ object. Beyond the ask: iterate on the docs from a user's point of view
7
+ (battery scientist with limited Python), one PR per iteration.
8
+
9
+ ## Iteration 1 (this PR): inline source
10
+
11
+ Set mkdocstrings-python `show_source = true` in `zensical.toml`. Every class
12
+ and function gets a collapsible "Source code in `<file>`" block with line
13
+ numbers. A GitHub-link variant (template overrides) was prototyped and
14
+ dropped: inline source answers the need without custom templates.
15
+
16
+ ## Later iterations (not started)
17
+
18
+ Candidate topics, each its own branch/PR: troubleshooting page (common
19
+ errors), "which loader for my tester" table, units/mass/nominal-capacity
20
+ FAQ, glossary of columns (`c.schema`), batch quick-start for non-programmers,
21
+ plotting cookbook, saving/exporting to Excel/CSV, configuration walkthrough.
@@ -0,0 +1,15 @@
1
+ # Issue #1015 — status
2
+
3
+ - [ ] Done
4
+
5
+ ## What's done (iteration 1)
6
+
7
+ - `zensical.toml`: `show_source = true` — collapsible source block under
8
+ every class and function in the API reference.
9
+ - HISTORY entry.
10
+ - Local build: `No issues found`.
11
+
12
+ ## Remaining work
13
+
14
+ - Iterations 2–10 (user-perspective docs improvements) per plan file.
15
+ - The issue's own ask is met after iteration 1 is merged.
@@ -0,0 +1,14 @@
1
+ # Iterative fixes: New cellpy-core release
2
+
3
+ Source: local `/iflow-fix` session (GitHub issue create blocked in this Cloud
4
+ Agent environment — `gh` is read-only). Session name: New cellpy-core release.
5
+
6
+ ## Original issue text
7
+
8
+ Interactive `/iflow-fix` session whose individual fixes are recorded in the
9
+ status markdown and landed together via `/iflow-close`.
10
+
11
+ **First fix (from the invoking message):** Cellpy next: bump the `cellpycore`
12
+ pin to the new PyPI release `0.2.6`, and drop the strict xfails on
13
+ `test_empty_tail_is_noop` (core#147) and
14
+ `test_gap_append_mid_step_equals_full_load` (core#148).
@@ -0,0 +1,17 @@
1
+ # Status — Iterative fixes: New cellpy-core release
2
+
3
+ Interactive `/iflow-fix` session. GitHub issue was not created (`gh` write is
4
+ blocked in this environment). Work lands on `cursor/cellpycore-pin-0-2-6-4828`.
5
+
6
+ - [ ] Done
7
+
8
+ ## Iterative fixes log
9
+
10
+ - **2026-09-08** — Pin `cellpycore` `0.2.5`→`0.2.6` in `pyproject.toml` /
11
+ `uv.lock`. Drop strict xfails on `test_empty_tail_is_noop` (core#147) and
12
+ `test_gap_append_mid_step_equals_full_load` (core#148). Update
13
+ `tests/README.md`, pin-gate doc, and `HISTORY.md`. Leave conda env YAMLs on
14
+ `0.2.4` (conda-forge latest).
15
+ - `uv sync --no-sources` → `cellpycore 0.2.6`
16
+ - `tests/test_incremental_update.py`: 7 passed (both former xfails now pass)
17
+ - `pytest -m essential`: 845 passed, 64 skipped, 0 xfailed
@@ -0,0 +1,7 @@
1
+ # Issue #1008: nom cap specific lost
2
+
3
+ Source: https://github.com/jepegit/cellpy/issues/1008
4
+
5
+ ## Original issue text
6
+
7
+ When loading from xlsx database (batch), it did not pick up the nom cap specific value (gravimetric)
@@ -0,0 +1,82 @@
1
+ # Plan — issue #1008: nom cap specific lost (batch, xlsx db)
2
+
3
+ Branch: `1008-batch-nom-cap-specifics`. Milestone `v2.1.4.post`.
4
+
5
+ ## Diagnosis (2026-09-08)
6
+
7
+ Traced db → journal → spec → `cellpy.get` on master with the reporter's own
8
+ config (`cellpy.toml`: `db_cols.nom_cap_specifics = "nom_cap_specifics"`) and db
9
+ (`2025_Cell_Analysis_db_001.xlsx`, 976 gravimetric / 28 areal rows):
10
+
11
+ - `Reader.get_nom_cap_specifics(id)` returns the sheet value.
12
+ - `_dbengine._create_pages_dict` → `Journal.pages["nom_cap_specifics"]` →
13
+ `policy.resolve_specs` → `runner._get_kwargs` → `cellpy.get(nom_cap_specifics=…)`
14
+ keeps the value; journal JSON round-trip keeps it.
15
+ - `batch.load()` end-to-end on the test db with an `areal` column: cells get
16
+ `nom_cap_specifics="areal"`, `cellpy_units.nominal_capacity="mAh/cm**2"` on
17
+ raw load, `.cellpy` AUTO reload and journal autoload.
18
+
19
+ So the value is not lost by the pipeline itself. Two ways it shows up as `null`
20
+ in `b.pages`, both silent today:
21
+
22
+ 1. **Journal autoload shadows the db.** `batch.load(name, project, …)` with
23
+ `allow_from_journal=True` (default) reuses `cwd/cellpy_batch_<name>.json`
24
+ when present and never opens the xlsx — logged at INFO only. A journal
25
+ written before the db column was filled (or by an older cellpy that did not
26
+ emit the column, e.g. `cellpy_batch_celf_mar.json` from July has no
27
+ `nom_cap_specifics` key) reads back as a `null` column. Even when the user
28
+ passes `db_reader=` / `batch_col=`, the stale journal still wins.
29
+ 2. **Configured column name ≠ sheet header.** `Reader._pick_info` swallows the
30
+ `KeyError` at `logging.debug` and returns `None` for every cell → `null`
31
+ column → default `gravimetric` at load. No warning.
32
+
33
+ Side finding (out of scope, file follow-up): `journal_from_db(…, skip_file_search=True)`
34
+ with the Excel reader crashes in `simple_db_engine` (`pd.DataFrame(pages_dict)`:
35
+ `All arrays must be of the same length` — `raw_file_names` / `cellpy_file_name`
36
+ stay `[]`).
37
+
38
+ ## Approach (KISS, no behaviour change on the happy path)
39
+
40
+ 1. `cellpy/readers/dbreader.py` — `_pick_info`: on missing column emit
41
+ `warnings.warn(...)` **once per column per reader instance** (keep the
42
+ `None` return so batches still build). Message names the configured key
43
+ (`config.db_cols.<field>`) and the sheet header it expected.
44
+ 2. `cellpy/batch/facade.py` — `_load_after_progress`: when the journal is
45
+ autoloaded **and** the caller signalled a db read (`db`, `db_reader`,
46
+ `reader`, `batch_col` or `reader_path` given), `warnings.warn` that the
47
+ database was not consulted and that `allow_from_journal=False` re-reads it.
48
+ Plain `batch.load(name, project)` keeps the INFO log (fast-path reopen).
49
+ 3. Tests (essential):
50
+ - `tests/test_batch_v3_facade.py`: autoload + `db_reader=` → `UserWarning`;
51
+ autoload without db args → no warning.
52
+ - `tests/test_dbreader.py` (or nearest existing dbreader test module):
53
+ `Reader(db_frame=…)` missing the configured column → one `UserWarning`,
54
+ second pick of same column silent; and a regression check that a present
55
+ `nominal_capacity_specifics` column flows into `_create_pages_dict`.
56
+ 4. Docs: `HISTORY.md` bullet (close step); one line in
57
+ `docs/getting_started/agents.md` batch bullet + `AGENTS.md` mirror:
58
+ "`batch.load` reuses `cellpy_batch_<name>.json` in cwd when present;
59
+ `allow_from_journal=False` forces a db read."
60
+ 5. Follow-up GitHub issue for the `skip_file_search=True` Excel crash.
61
+
62
+ ## Files
63
+
64
+ - `cellpy/readers/dbreader.py`, `cellpy/batch/facade.py`
65
+ - `tests/test_batch_v3_facade.py`, `tests/test_dbreader*.py`
66
+ - `docs/getting_started/agents.md`, `AGENTS.md`, `HISTORY.md`
67
+
68
+ ## Constraints
69
+
70
+ - No change to journal schema or defaults; `null` stays `null` (honest).
71
+ - Warnings, not exceptions — batches must still build with a partial db.
72
+
73
+ ### Prior art
74
+
75
+ - `_dbengine.find_files` filefinder-miss `UserWarning` (#964) — same style.
76
+ - `#1000` journal `version` warning path in `journal.read_journal`.
77
+
78
+ ## Open questions
79
+
80
+ - Should `db_reader=`/`batch_col=` given explicitly make the db **win** over the
81
+ autoloaded journal instead of just warning? Plan says warn only (smaller,
82
+ no surprise reload); flip to "db wins" if preferred.
@@ -0,0 +1,28 @@
1
+ # Issue #1008 status — nom cap specific lost (batch, xlsx db)
2
+
3
+ - [x] Done
4
+
5
+ Branch: `1008-batch-nom-cap-specifics`. Plan accepted 2026-09-08 (warn-only variant).
6
+
7
+ ## What's done
8
+
9
+ - Diagnosis: pipeline keeps the value (verified db → journal → spec →
10
+ `cellpy.get` → cell, incl. `.cellpy` reload and journal autoload). `null`
11
+ in `b.pages` comes from a cached `cellpy_batch_<name>.json` shadowing the
12
+ db (INFO-only before), or from a configured-vs-sheet column-name mismatch
13
+ swallowed in `Reader._pick_info`.
14
+ - `cellpy/readers/dbreader.py`: `_warn_missing_column` — one `UserWarning`
15
+ per missing sheet header per reader, naming the `config.db_cols.<key>`.
16
+ - `cellpy/batch/facade.py`: `_load_after_progress` warns when the journal is
17
+ autoloaded but `db` / `db_reader` / `batch_col` / `reader_path` / other db
18
+ kwargs were given.
19
+ - Tests (essential): `test_dbreader.py::test_missing_column_warns_once`,
20
+ `::test_nom_cap_specifics_column_reaches_pages`;
21
+ `test_batch_v3_facade.py::test_load_warns_when_journal_autoload_shadows_db`,
22
+ `::test_load_autoload_without_db_args_is_quiet`.
23
+ - Docs: `docs/getting_started/agents.md` batch recipe + `AGENTS.md` mirror.
24
+ - Follow-up filed: #1017 (`skip_file_search=True` crashes with Excel reader).
25
+
26
+ ## Remaining work
27
+
28
+ - None.
@@ -0,0 +1,7 @@
1
+ # Issue #1009: summary collector plot family bug
2
+
3
+ Source: https://github.com/jepegit/cellpy/issues/1009
4
+
5
+ ## Original issue text
6
+
7
+ for the summary_collector family "fullcell_standard_gravimetric" we get too many sub-windows.
@@ -0,0 +1,91 @@
1
+ # Issue #1009 — plan (rev 2)
2
+
3
+ ## Diagnosis
4
+
5
+ `summary_collector(b, family="fullcell_standard_gravimetric").plot()` draws 10
6
+ facets instead of the 4 the family declares, and even the declared layout is
7
+ one facet *per variable* where the user wants charge and discharge of the same
8
+ quantity in **one** panel.
9
+
10
+ Root causes:
11
+
12
+ 1. `PlotFamily.summary_options` (`cellpy/plotting/registry.py`) strips the
13
+ `_cv` / `_non_cv` suffix off declared columns and requests the *base*
14
+ column with `partition_by_cv=True` — "only the CV part" is lost.
15
+ 2. `collect_summaries` (`cellpy/collect/summary.py`) then keeps
16
+ `col`, `col_non_cv`, `col_cv` for **every** requested column, including
17
+ `coulombic_efficiency`.
18
+ 3. `summary_plotter` (`cellpy/plotting/collected.py`) facets on `variable`,
19
+ so `charge_x` and `discharge_x` always land in separate rows.
20
+
21
+ Audit over all 20 `summary_plot` families (two `.res` cells, in-memory
22
+ batch): the 13 `capacities*` / `voltages` families collect exactly their
23
+ declared columns; all 7 `fullcell_standard*` families collect 10–12.
24
+ Single-cell `summary_plot(y=...)` is unaffected by 1–2 (selects `y_cols`
25
+ explicitly) and is out of scope for 3.
26
+
27
+ ## Approach
28
+
29
+ ### A. Collect exactly the declared columns
30
+
31
+ 1. `summary_options`: keep declared names literally in `columns` (no suffix
32
+ stripping); still set `partition_by_cv` when a `_cv` / `_non_cv` name (or
33
+ `supports_cv_split`) is present. `mod_01_*` handling unchanged.
34
+ 2. `collect_summaries`: expand `col → (col, col_non_cv, col_cv)` only when the
35
+ requested list names no CV variant itself; a list that spells out
36
+ `*_cv` / `*_non_cv` is taken literally. Existing
37
+ `columns=("charge_capacity",), partition_by_cv=True` still expands.
38
+
39
+ ### B. Combine charge/discharge into one panel (`summary_plotter`, Plotly)
40
+
41
+ 3. Panel key: split `variable` on `_`, drop the first token equal to
42
+ `charge` / `discharge` → panel; that token is the `direction`. Works for
43
+ prefix (`charge_capacity_gravimetric_cv`), suffix
44
+ (`potential_end_charge`) and mid-name
45
+ (`test_cumulated_discharge_capacity_loss_gravimetric`,
46
+ `mod_01_discharge_capacity_gravimetric`). No token → panel = variable,
47
+ direction none.
48
+ 4. Before the backend call, rewrite `variable` to the panel key and add a
49
+ `direction` column. Everything keyed on `variable` (facets, `y_ranges`,
50
+ `order_variables`, label mapper, `spread_plot`) keeps working on panel
51
+ keys; `y_ranges` / `order_variables` given as original variable names are
52
+ translated the same way.
53
+ 5. `px.line(..., line_dash="direction", line_dash_map={charge: solid,
54
+ discharge: dash})` when any direction is present. Trace names reduced to
55
+ the series (cell / group) with one legend entry per series; a second
56
+ Plotly legend (`legend2`, title "Direction") carries two style-only
57
+ entries: Charge (solid) / Discharge (dashed). `spread_plot` (grouped
58
+ mean/std) gets the same dash per direction.
59
+ 6. Panel labels: `_pretty_variable_label` must recognise `capacity_gravimetric`
60
+ (no direction prefix) so units still appear → "Capacity (mAh/g)".
61
+ 7. Opt-out: `combine_directions=False` on `summary_plotter` /
62
+ `Collection.plot` restores one facet per variable. Default **on** (this is
63
+ the requested layout; noted in HISTORY).
64
+ 8. Seaborn backend: facets follow the panel rewrite; `style="direction"` only
65
+ when style is free (not `group_cells`). Matplotlib/bokeh summary paths
66
+ untouched.
67
+
68
+ Resulting facet counts: `fullcell_standard_*` 4 (CE, capacity, retention,
69
+ CV part); `capacities_*` 1; `*_coulombic_efficiency` 2; `*_with_rate` 2;
70
+ `*_split_constant_voltage` 3; `voltages` 1.
71
+
72
+ ### C. Tests (essential)
73
+
74
+ - Registry/collect: tighten the family oracle in `tests/test_collect.py` to
75
+ reject *extra* columns; literal-list case for `collect_summaries`.
76
+ - Plot: unit tests for the panel/direction split; Plotly facet count and
77
+ dash mapping on a synthetic frame; `legend2` present with two entries;
78
+ `combine_directions=False` gives per-variable facets; `y_ranges` keyed by
79
+ original variable still applies.
80
+ - Update `tests/test_collected_summary_groups.py` fixtures that used
81
+ `cap_charge` / `cap_discharge` as separate facets (they now merge).
82
+
83
+ ### D. Docs
84
+
85
+ `HISTORY.md` `[Unreleased]`, `AGENTS.md` / `docs/getting_started/agents.md`
86
+ batch bullet (combined panels + `combine_directions`), `test-registry.md`.
87
+
88
+ ## Constraints
89
+
90
+ - No new `SummaryOptions` fields; family declarations unchanged.
91
+ - Legacy `plot_cycle_life_summary_plotly` (Batch `b.plot()`) untouched.
@@ -0,0 +1,56 @@
1
+ # Issue #1009 — status
2
+
3
+ - [x] Done
4
+
5
+ ## Diagnosis
6
+
7
+ `summary_collector(b, family="fullcell_standard_gravimetric").plot()` drew 10
8
+ facets instead of 4: `summary_options` stripped the `_cv` suffix and asked for
9
+ the base column with `partition_by_cv=True`; `collect_summaries` then kept
10
+ `col`, `col_non_cv`, `col_cv` for every requested column (CE included).
11
+ All 7 `fullcell_standard*` families were affected (10–12 columns vs 4); the 13
12
+ other summary families were exact. On top of that the plot faceted one row per
13
+ variable, so charge and discharge of the same quantity never shared a panel.
14
+
15
+ ## Done
16
+
17
+ - `cellpy/plotting/registry.py` — `summary_options` requests declared columns
18
+ literally (still turns `partition_by_cv` on for `*_cv` / `*_non_cv`).
19
+ - `cellpy/collect/summary.py` — the `(col, col_non_cv, col_cv)` expansion only
20
+ applies when the requested list names no CV variant itself.
21
+ `SummaryOptions` docstring updated.
22
+ - `cellpy/plotting/collected.py` (`summary_plotter`, Plotly):
23
+ - `split_direction()` / `_panel_mapping()`: variables differing only by a
24
+ `charge` / `discharge` token (prefix, suffix or mid-name) share a panel
25
+ named by the token-free key; a variable alone on its key keeps its name.
26
+ - `line_dash="direction"` (charge solid, discharge dashed); trace names
27
+ reduced to the series with one legend entry each; second legend
28
+ `legend2` ("Direction"). `spread_plot` gets the same dashes.
29
+ - `order_variables`, `y_ranges`, `y_label_mapper` accept original variable
30
+ names or panel keys; `_yaxis_key_for_variable` falls back to the panel key.
31
+ - `combine_directions=False` opt-out.
32
+ - Labels: `capacity_gravimetric` (direction-less panel key) gets units;
33
+ `*_non_cv` → "… non-CV" with correct mode/unit; `mod_01_*` →
34
+ "Normalized … (%)".
35
+ - Tests: oracle in `tests/test_collect.py` now rejects extra columns; literal
36
+ CV list test; `summary_options` tuple test; new
37
+ `tests/test_collected_summary_directions.py` (8 essential tests);
38
+ `tests/test_collected_summary_groups.py` synthetic names neutralised and the
39
+ #947/#948 snippets updated for the merged capacity panel;
40
+ `test_collected_summary_axes.py` spread hover test skips `legend2` entries.
41
+ - Docs: `HISTORY.md`, `AGENTS.md`, `docs/getting_started/agents.md`,
42
+ `.issueflows/04-designs-and-guides/test-registry.md`.
43
+
44
+ ## Resulting facet counts
45
+
46
+ `fullcell_standard_*` 4 (CV part / capacity / CE / normalized); `capacities_*`
47
+ 1; `*_coulombic_efficiency` 2; `*_with_rate` 2; `*_split_constant_voltage` 3;
48
+ `voltages` 1. Verified with an in-memory batch of the two Arbin `.res` test
49
+ cells and rendered PNGs.
50
+
51
+ ## Out of scope / notes
52
+
53
+ - Seaborn / matplotlib summary backends: facets follow the panel rewrite, no
54
+ dash styling.
55
+ - Legacy `b.plot()` (`plot_cycle_life_summary_plotly`) and single-cell
56
+ `summary_plot(y=...)` untouched.
@@ -0,0 +1,17 @@
1
+ # Issue #1017: journal_from_db(skip_file_search=True) crashes with the Excel reader
2
+
3
+ Source: https://github.com/jepegit/cellpy/issues/1017
4
+
5
+ ## Original issue text
6
+
7
+ Found while diagnosing #1008.
8
+
9
+ `cellpy.batch.db.journal_from_db(name, project, db_reader="simple_excel_reader", skip_file_search=True)` raises
10
+
11
+ ```
12
+ ValueError: All arrays must be of the same length
13
+ ```
14
+
15
+ from `_dbengine.simple_db_engine` at `pd.DataFrame(pages_dict)`: `_create_pages_dict` seeds `raw_file_names` / `cellpy_file_name` as `[]` and only `find_files` fills them, so skipping the search leaves two zero-length columns next to the per-cell ones.
16
+
17
+ `skip_file_search` is documented for JSON readers that already carry the file columns, but the Excel path should either fill those columns with `None` per cell or reject the flag with a clear message.
@@ -0,0 +1,77 @@
1
+ # Issue #1017 — plan
2
+
3
+ ## Goal
4
+
5
+ `journal_from_db(..., skip_file_search=True)` must return a journal for every
6
+ reader instead of raising `ValueError: All arrays must be of the same length`.
7
+ Cells whose files were not searched get `None` in `raw_file_names` /
8
+ `cellpy_file_name` (same shape as a filefinder miss).
9
+
10
+ ## Constraints
11
+
12
+ - Toolchain: `uv run pytest` (see `this-project.md`); merge gate is `-m essential`.
13
+ - No behaviour change for the default `skip_file_search=False` path.
14
+ - Do not change the JSON readers' public `pages_dict` contract (they seed the
15
+ two file columns as `[]` too — `BatBaseJSONReader` and `CustomJSONReader`,
16
+ `cellpy/readers/json_dbreader.py`); fix once, at the seam both paths share.
17
+ - Keep `_create_pages_dict` seeding as is (tests in `tests/test_dbreader.py`
18
+ and `tests/test_batch.py` read it directly); `find_files` is the only place
19
+ that knows whether the columns will be filled.
20
+ - `HISTORY.md` `[Unreleased]` bullet at close (`v2.1.4.post` milestone).
21
+
22
+ ### Prior art
23
+
24
+ - `find_files` (`cellpy/batch/_dbengine.py`) already seeds `[]` when the
25
+ columns are absent and appends per cell; the `skip_file_search` early return
26
+ is the only branch that returns without normalising lengths → mirror the
27
+ seeding there, padded to the cell count.
28
+ - Filefinder miss convention: `raw_files = None`, `cellpyfile = None` per cell
29
+ (`find_files` loop) → reuse `None` as the "not searched" value so
30
+ `policy.py` / `facade.py` (`row.get(...)`, `_clean`, FAILED marking) keep
31
+ working unchanged.
32
+ - `tests/test_batch.py::test_find_files_skip_file_search` — existing unit test
33
+ for the skip branch with pre-filled columns; extend alongside it.
34
+ - Toolbox (`.issueflows/00-tools/`): nothing applicable. `graphify-out/` absent.
35
+
36
+ ## Approach
37
+
38
+ 1. In `find_files`, replace the bare `if skip_file_search: return info_dict`
39
+ with: compute `n = len(file_name_indicators)` (fallback `filename`), then for
40
+ each of `hdr_journal["raw_file_names"]` / `hdr_journal["cellpy_file_name"]`:
41
+ if the key is missing or its list is empty while `n > 0`, set it to
42
+ `[None] * n`. Pre-filled columns (JSON carrying paths) stay untouched.
43
+ 2. Docstrings: `find_files` (skip now pads instead of "returned unchanged") and
44
+ `journal_from_db` in `cellpy/batch/db.py` (`skip_file_search=True` also
45
+ valid for the Excel reader; file columns come back `None`, so `b.update()`
46
+ marks those cells `FAILED` until paths are filled or a search is run).
47
+ 3. No change to `_create_pages_dict` or the JSON readers.
48
+
49
+ Alternative rejected: raising on `skip_file_search=True` for the Excel reader —
50
+ users legitimately want a journal without a (slow/remote) file search and fill
51
+ paths afterwards; `None` per cell is the existing "not found" shape.
52
+
53
+ ## Files to touch
54
+
55
+ - `cellpy/batch/_dbengine.py` — `find_files` skip branch pads the two columns;
56
+ docstring.
57
+ - `cellpy/batch/db.py` — `journal_from_db` docstring wording.
58
+ - `tests/test_batch.py` — new `test_find_files_skip_file_search_pads_missing_columns`
59
+ (missing + empty columns → `[None] * n`; `n == 0` → `[]`).
60
+ - `tests/test_dbreader.py` — `@pytest.mark.essential`
61
+ `test_simple_db_engine_skip_file_search_excel_reader`: `simple_db_engine(reader,
62
+ ids, skip_file_search=True)` on the Excel fixture returns one row per id with
63
+ `None` file columns (reproduces #1017 before the fix).
64
+ - `HISTORY.md` — `[Unreleased]` bullet (at `/iflow-close`).
65
+
66
+ ## Test strategy
67
+
68
+ - `uv run pytest tests/test_dbreader.py tests/test_batch.py -q`
69
+ - `uv run pytest -m essential` (merge gate)
70
+ - Repro before fix: the new engine test fails with `ValueError: All arrays
71
+ must be of the same length`.
72
+
73
+ ## Open questions
74
+
75
+ - None. (Optional: also make `journal_from_db` log at INFO that file columns
76
+ are unset when `skip_file_search=True` and the reader is the Excel one —
77
+ skipped for KISS unless wanted.)
@@ -0,0 +1,31 @@
1
+ # Issue #1017 status
2
+
3
+ `journal_from_db(skip_file_search=True)` crashes with the Excel reader.
4
+
5
+ - [x] Done
6
+
7
+ PR: https://github.com/jepegit/cellpy/pull/1020 (#1020, draft)
8
+ Branch: `cursor/1017-journal-from-db-skip-file-search-3975`
9
+
10
+ ## What's done
11
+
12
+ - Issue captured, plan confirmed (`issue1017_plan.md`).
13
+ - `_dbengine.find_files`: the `skip_file_search=True` branch pads missing or
14
+ empty `raw_file_names` / `cellpy_file_name` with `[None] * n_cells`
15
+ (pre-filled JSON paths untouched). Docstring updated.
16
+ - `batch.db.journal_from_db` docstring: flag valid for any reader; unset file
17
+ columns are `None`, `update()` marks those cells `FAILED`.
18
+ - Tests: `tests/test_dbreader.py::test_simple_db_engine_skip_file_search_excel_reader`
19
+ (essential; reproduced `ValueError: All arrays must be of the same length`
20
+ before the fix) and
21
+ `tests/test_batch.py::test_find_files_skip_file_search_pads_missing_columns`.
22
+ - `uv run pytest tests/test_dbreader.py tests/test_batch.py`: 71 passed.
23
+ - `uv run pytest -m essential`: 829 passed, 64 skipped
24
+ (`tests/test_arbin_variants_two_stage.py` ignored locally — `pyodbc` needs
25
+ `libodbc.so.2`, missing on this VM; unrelated to the change).
26
+
27
+ - `HISTORY.md` `[Unreleased]` bullet; `test-registry.md` rows.
28
+
29
+ ## Remaining work
30
+
31
+ - None. Merge PR #1020 when CI is green (no version bump requested).
@@ -0,0 +1,9 @@
1
+ # Issue #778: L6: golden equality test — incremental update() == full load
2
+
3
+ Source: https://github.com/jepegit/cellpy/issues/778
4
+
5
+ ## Original issue text
6
+
7
+ Epic L of **cellpy 2.2 (Stage 5)**. Design: [live-incremental](https://github.com/cellpy/architecture-plan/blob/main/cellpy2-live-incremental-design.md) §7 item 6. **Author first** — this is the correctness anchor for the whole epic.
8
+
9
+ Load a truncated file, append the tail, and assert `update()` == a full load of the whole file (summary equality). *Incremental refresh of a split file must equal a full load of the whole file.*
@@ -0,0 +1,129 @@
1
+ # Issue #778 plan — L6: golden equality test (incremental update == full load)
2
+
3
+ ## Goal
4
+
5
+ Add the Stage 5 Epic L correctness anchor: a test proving that loading a
6
+ **truncated** tester file and then feeding the **tail rows** through the
7
+ incremental-update path yields the same `raw` / `steps` / `summary` as one
8
+ **full load** of the whole file. Written first, against the shipped core
9
+ primitive (`update_core_data`), so L1–L5 (#779/#780/#164/#781/#782) have an
10
+ oracle to land against.
11
+
12
+ ## Constraints
13
+
14
+ - Test-only issue: **no library code changes**. `CellpyCell.update()` and
15
+ `load_since()` do not exist yet (L3/L2); the test drives the seam that does
16
+ exist — `c.core.update_core_data(data, new_raw, …)` (cellpycore 0.2.5
17
+ `merge.update_data`). The helper that produces the "tail" is written so L3
18
+ can swap it for `c.update()` in one place.
19
+ - Must run on the merge gate (`@pytest.mark.essential`) → fast, no mdbtools:
20
+ use a **text** fixture. `testdata/data/neware_uio.csv` (`instrument="neware_txt"`,
21
+ `model="UIO"`): 1 header line + 9064 rows, 4 cycles / 32 steps, `datapoint_num`
22
+ 1…9065, loads in ~0.4 s. (`maccor_001.txt` is 5 s and has 1 cycle — not the
23
+ anchor; `custom_data_001.csv` has non-integer `datapoint_num` — unsuitable.)
24
+ - Truncated files are written to `tmp_path`, never into `testdata/` (input data
25
+ read-only).
26
+ - `update_data` contract (core): `new_raw` may **overlap** the tail; overlap is
27
+ trimmed on `source_datapoint_num` → falls back to `datapoint_num` (cellpy
28
+ loaders set no `source_datapoint_num`). Rejects `new_raw` starting at/before
29
+ the existing range. Both branches (`gap_append` vs overlap) exercised.
30
+ - Per-cell frames are **pandas** in cellpy; `update_core_data` converts.
31
+ Comparisons use `pandas.testing` with a small float tolerance, columns
32
+ aligned by name, `test_id` normalised.
33
+ - Summary scope **now**: `update_core_data(refresh_derived=True)` produces the
34
+ *core* summary (cycle-end columns + C-rates + IR). cellpy's `make_summary`
35
+ additionally runs `add_scaled_summary_columns` (gravimetric/areal, equivalent
36
+ cycles). Until L3 defines what `c.update()` does after the core step, the
37
+ summary assertion compares the **intersection of columns**; the test records
38
+ the missing columns so L3 flips it to full-column equality. `raw` and `steps`
39
+ are compared on the **full** column set.
40
+
41
+ ### Prior art
42
+
43
+ - `cellpycore.merge.update_data` / `CellpyCellCore.update_core_data`
44
+ (`../cellpy-core/src/cellpycore/merge.py:173`, `cell_core.py:528`) — the
45
+ engine under test; core has its own unit tests on synthetic frames, none
46
+ through a real loader.
47
+ - `CellpyCell.merge(cells, mode="campaign")` (`cellpy/readers/cellreader.py:1852`)
48
+ — the *campaign* merge (renumber cycles); not the incremental path. Coexist.
49
+ - `tests/parity.py::assert_value_parity` — legacy↔native comparator with
50
+ named exceptions; heavier than needed here (same-schema frames). Mirror its
51
+ spirit (explicit tolerance, no silent widening) with `pandas.testing`.
52
+ - `tests/loader_golden_support.py` / `tests/golden_support.py` — committed
53
+ golden snapshots. **Not** used: this oracle is *self-referential* (full load
54
+ is the reference), so no new golden files and no `regenerate_goldens.py`
55
+ suite.
56
+ - `tests/test_cellpy_splitting.py` (`cell.split`, `drop_to`) — cycle-level
57
+ splitting of a loaded cell; different axis (cycles, not file rows). Coexist.
58
+ - `.issueflows/00-tools/` — nothing applicable (AST scanners, prms migrator).
59
+
60
+ ## Approach
61
+
62
+ 1. **`tests/incremental_support.py`** (small, reused by L2/L3/L5 tests later):
63
+ - `truncate_text_file(src, dst, *, n_data_rows, header_lines=1)` → writes
64
+ header + first `n_data_rows` data lines. Returns `dst`.
65
+ - `tail_rows(full_raw, *, since, overlap, datapoint_col)` → pandas slice
66
+ `datapoint_num > since - overlap` — this is what a future `load_since`
67
+ returns for marker `since`; the only place L3 has to replace.
68
+ - `incremental_update(head_cell, new_raw)` → today:
69
+ `head_cell.core.update_core_data(head_cell.data, new_raw, nom_cap_abs=…,
70
+ current_conversion_factor=…)` with the same factors cellpy's
71
+ `make_summary` computes (`core_units.calculate_current_conversion_factor`,
72
+ nominal capacity from `head_cell.data.meta`). Returns the new `Data`.
73
+ - `assert_frames_equal(left, right, *, columns=None, rtol)` thin wrapper
74
+ over `pandas.testing.assert_frame_equal` (reset index, sort by
75
+ `datapoint_num` / `cycle_num`, `check_dtype=False`).
76
+ 2. **`tests/test_incremental_update.py`**:
77
+ - Fixtures: `full_cell` (module-scoped load of `neware_uio.csv`);
78
+ `head_cell(tmp_path, n)` via `truncate_text_file` + `cellpy.get`.
79
+ - `test_head_matches_full_prefix` — sanity: head `raw` == first `n` rows of
80
+ full `raw` (proves the truncation + `datapoint_num` assignment are
81
+ deterministic; without this the oracle proves nothing).
82
+ - `test_incremental_update_equals_full_load[cut]` — parametrised over cut
83
+ points: **mid-step** inside cycle 2, **on a step boundary**, **on a cycle
84
+ boundary**; `overlap=0` (gap-append branch). Assert `raw` full equality,
85
+ `steps` full equality, `summary` equality on shared columns.
86
+ - `test_incremental_update_with_overlap` — same cut, `overlap=50` rows
87
+ (trim branch).
88
+ - `test_incremental_update_noop_on_empty_tail` — empty `new_raw` returns an
89
+ equal copy (poll tick with nothing new).
90
+ - `test_summary_column_gap_is_documented` — asserts the set of full-summary
91
+ columns missing after the core-only update equals a **named** list
92
+ (`add_scaled_summary_columns` outputs). When L3 lands and closes the gap,
93
+ this test is deleted and the main test flips to full-column equality.
94
+ - Marker `@pytest.mark.essential` on the equality tests (golden-oracle rule
95
+ in `this-project.md`); whole file well under 5 s.
96
+ 3. **`tests/README.md`** — one short subsection "Incremental-update oracle
97
+ (Stage 5 L6)" stating the invariant, the fixture, and the L3 flip rule.
98
+ 4. **Status file** `issue778_status.md`; HISTORY entry at close (test-only —
99
+ a one-liner under Unreleased is enough).
100
+
101
+ ## Files to touch
102
+
103
+ | Path | Change |
104
+ |---|---|
105
+ | `tests/incremental_support.py` | new — truncate / tail / update / compare helpers |
106
+ | `tests/test_incremental_update.py` | new — the L6 oracle tests (essential) |
107
+ | `tests/README.md` | add "Incremental-update oracle" subsection |
108
+ | `.issueflows/01-current-issues/issue778_status.md` | new |
109
+
110
+ No changes under `cellpy/`.
111
+
112
+ ## Test strategy
113
+
114
+ - `uv run pytest tests/test_incremental_update.py -q` during build.
115
+ - `uv run pytest -m essential` before close (merge gate).
116
+ - If a cut point exposes a real `update_data` defect (e.g. step-table rows at
117
+ the cut not refreshed identically), **do not** widen tolerance or drop the
118
+ case: record it in the status file and open a `cellpy-core` issue — that is
119
+ precisely what the oracle is for.
120
+
121
+ ## Open questions
122
+
123
+ 1. Summary scope: OK to compare **shared columns only** now (with the
124
+ documented gap test) and defer full-column equality to L3 (#164)? The
125
+ alternative — calling cellpy `make_summary()` after the core update — would
126
+ make the summary assertion trivially true and is rejected.
127
+ 2. Second fixture: add `maccor_001.txt` as a non-essential parametrisation
128
+ (5 s, single cycle) for loader diversity, or keep neware-only? Proposal:
129
+ neware-only now; L2 (#780) adds per-loader cases when `load_since` exists.