scitex 2.10.3__py3-none-any.whl → 2.11.0__py3-none-any.whl

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 (363) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__version__.py +1 -1
  3. scitex/_install_guide.py +14 -2
  4. scitex/bridge/_figrecipe.py +1 -1
  5. scitex/bridge/_helpers.py +1 -1
  6. scitex/bridge/_plt_vis.py +1 -1
  7. scitex/bridge/_stats_plt.py +1 -1
  8. scitex/bridge/_stats_vis.py +2 -2
  9. scitex/{fig → canvas}/__init__.py +84 -96
  10. scitex/{fig → canvas}/backend/_parser.py +1 -1
  11. scitex/{fig → canvas}/canvas.py +13 -14
  12. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  13. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  14. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  15. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  16. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  17. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  18. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  19. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  20. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  21. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  22. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  23. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  24. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  25. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  26. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  27. scitex/{fig → canvas}/io/__init__.py +32 -38
  28. scitex/{fig → canvas}/io/_bundle.py +217 -154
  29. scitex/{fig → canvas}/io/_canvas.py +1 -1
  30. scitex/{fig → canvas}/io/_data.py +1 -1
  31. scitex/{fig → canvas}/io/_export.py +1 -1
  32. scitex/{fig → canvas}/io/_load.py +1 -1
  33. scitex/{fig → canvas}/io/_panel.py +1 -1
  34. scitex/{fig → canvas}/io/_save.py +1 -1
  35. scitex/{fig → canvas}/model/__init__.py +1 -1
  36. scitex/{fig → canvas}/model/_annotations.py +1 -1
  37. scitex/{fig → canvas}/model/_axes.py +1 -1
  38. scitex/{fig → canvas}/model/_figure.py +1 -1
  39. scitex/{fig → canvas}/model/_guides.py +1 -1
  40. scitex/{fig → canvas}/model/_plot.py +1 -1
  41. scitex/{fig → canvas}/model/_styles.py +1 -1
  42. scitex/{fig → canvas}/utils/__init__.py +1 -1
  43. scitex/cli/convert.py +10 -6
  44. scitex/diagram/README.md +7 -7
  45. scitex/io/__init__.py +7 -19
  46. scitex/io/_load.py +15 -19
  47. scitex/io/_load_modules/_canvas.py +2 -2
  48. scitex/io/_load_modules/_con.py +5 -5
  49. scitex/io/_load_modules/_eeg.py +16 -12
  50. scitex/io/_save.py +11 -16
  51. scitex/io/_save_modules/__init__.py +6 -10
  52. scitex/io/_save_modules/_canvas.py +3 -3
  53. scitex/io/_save_modules/_plot_bundle.py +112 -0
  54. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  55. scitex/io/_save_modules/_stx_bundle.py +16 -16
  56. scitex/io/bundle/README.md +89 -80
  57. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  58. scitex/io/bundle/__init__.py +67 -35
  59. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  60. scitex/io/bundle/_core.py +184 -97
  61. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  62. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  63. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  64. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  65. scitex/io/bundle/_manifest.py +99 -0
  66. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  67. scitex/io/bundle/_nested.py +113 -100
  68. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  69. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  70. scitex/io/bundle/_types.py +41 -16
  71. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  72. scitex/io/bundle/_zip.py +21 -31
  73. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  74. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  75. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  76. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  77. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  78. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  79. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  80. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  81. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  82. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  83. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  84. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  85. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  86. scitex/io/bundle/schemas/__init__.py +30 -0
  87. scitex/parallel/_run.py +5 -4
  88. scitex/path/_find.py +60 -83
  89. scitex/path/_get_module_path.py +23 -21
  90. scitex/path/_get_spath.py +6 -27
  91. scitex/path/_getsize.py +23 -9
  92. scitex/path/_increment_version.py +31 -38
  93. scitex/path/_mk_spath.py +26 -29
  94. scitex/path/_path.py +5 -12
  95. scitex/path/_split.py +27 -15
  96. scitex/path/_this_path.py +23 -9
  97. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  98. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  99. scitex/plt/gallery/_generate.py +76 -50
  100. scitex/plt/io/__init__.py +17 -19
  101. scitex/plt/io/_bundle.py +99 -52
  102. scitex/plt/io/_layered_bundle.py +303 -168
  103. scitex/plt/utils/_csv_column_naming.py +250 -118
  104. scitex/schema/__init__.py +69 -73
  105. scitex/schema/_canvas.py +1 -1
  106. scitex/schema/_stats.py +2 -2
  107. scitex/stats/__init__.py +30 -33
  108. scitex/stats/_schema.py +1 -1
  109. scitex/stats/io/__init__.py +10 -11
  110. scitex/stats/io/_bundle.py +16 -16
  111. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/METADATA +190 -73
  112. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
  113. scitex/fig/editor/_defaults.py +0 -300
  114. scitex/fig/editor/edit/panel_loader.py +0 -232
  115. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  116. scitex/fig/editor/flask_editor/_core.py +0 -1429
  117. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  118. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  119. scitex/fts/README.md +0 -262
  120. scitex/fts/TODO.md +0 -66
  121. scitex/fts/__init__.py +0 -90
  122. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  123. scitex/fts/_bundle/__init__.py +0 -38
  124. scitex/fts/_bundle/_utils/__init__.py +0 -55
  125. scitex/fts/_bundle/_utils/_const.py +0 -26
  126. scitex/fts/_bundle/_utils/_errors.py +0 -73
  127. scitex/fts/_bundle/_utils/_generate.py +0 -21
  128. scitex/fts/_bundle/_utils/_types.py +0 -76
  129. scitex/fts/_bundle/_zipbundle.py +0 -165
  130. scitex/fts/_fig/__init__.py +0 -22
  131. scitex/fts/_fig/_backend/_parser.py +0 -188
  132. scitex/fts/_fig/_editor/__init__.py +0 -14
  133. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  134. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  135. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  136. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  137. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  138. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  139. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  140. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  141. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  142. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  143. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  144. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  145. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  146. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  147. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  148. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  149. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  150. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  151. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  152. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  153. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  154. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  155. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  156. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  157. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  158. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  159. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  160. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  161. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  162. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  163. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  164. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  165. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  166. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  167. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  168. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  169. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  170. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  171. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  172. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  173. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  174. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  175. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  176. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  177. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  178. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  179. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  180. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  181. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  182. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  183. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  184. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  185. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  186. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  187. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  188. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  189. scitex/fts/_fig/_models/_Annotations.py +0 -115
  190. scitex/fts/_fig/_models/_Axes.py +0 -152
  191. scitex/fts/_fig/_models/_Figure.py +0 -138
  192. scitex/fts/_fig/_models/_Plot.py +0 -123
  193. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  194. scitex/fts/_kinds/_figure/_composite.py +0 -345
  195. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  196. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  197. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  198. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  199. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  200. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  201. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  202. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  203. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  204. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  205. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  206. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  207. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  208. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  209. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  210. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  211. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  212. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  213. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  214. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  215. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  216. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  217. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  218. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  219. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  220. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  221. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  222. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  223. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  224. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  225. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  226. scitex/fts/_stats/__init__.py +0 -48
  227. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  228. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  229. scitex/fts/_tables/__init__.py +0 -65
  230. scitex/fts/_tables/_latex/__init__.py +0 -93
  231. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  232. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  233. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  234. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  235. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  236. scitex/fts/_tables/_latex/_utils.py +0 -369
  237. scitex/fts/_tables/_latex/_validator.py +0 -445
  238. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  239. /scitex/{fig → canvas}/README.md +0 -0
  240. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  241. /scitex/{fig → canvas}/backend/_export.py +0 -0
  242. /scitex/{fig → canvas}/backend/_render.py +0 -0
  243. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  244. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  245. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  246. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  247. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  248. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  249. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  250. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  251. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  252. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  253. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  254. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  255. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  256. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  257. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  258. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  259. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  260. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  261. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  262. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  263. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  264. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  265. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  266. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  267. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  268. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  269. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  270. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  271. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  272. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  273. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  274. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  275. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  276. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  277. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  278. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  279. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  280. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  281. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  282. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  283. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  284. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  285. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  286. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  287. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  288. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  289. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  290. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  291. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  292. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  293. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  294. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  295. /scitex/{fig → canvas}/io/_directory.py +0 -0
  296. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  297. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  298. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  299. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  300. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  301. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  302. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  303. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  304. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  305. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  306. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  307. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  308. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  309. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  310. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  311. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  312. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  313. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  314. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  315. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  316. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  317. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  318. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  319. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  320. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  321. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  322. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  323. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  324. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  325. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  326. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  327. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  328. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  329. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  330. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  331. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  332. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  333. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  334. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  335. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  336. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  337. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  338. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  339. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  340. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  341. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  342. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  343. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  344. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  345. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  346. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  347. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  348. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  349. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  350. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  351. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  352. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  353. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  354. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  355. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  356. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  357. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  358. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  359. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  360. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  361. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
  362. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
  363. {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,112 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2025-12-19
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_plot_bundle.py
4
+
5
+ """Save matplotlib figures as .plot bundles."""
6
+
7
+ import tempfile
8
+ from pathlib import Path
9
+
10
+ from scitex import logging
11
+
12
+ from ._figure_utils import get_figure_with_data
13
+
14
+ logger = logging.getLogger()
15
+
16
+
17
+ def save_plot_bundle(obj, spath, as_zip=False, data=None, layered=True, **kwargs):
18
+ """Save a matplotlib figure as a .plot bundle.
19
+
20
+ Bundle structure v2.0 (layered - default):
21
+ plot.plot/
22
+ spec.json # Semantic: WHAT to plot (canonical)
23
+ style.json # Appearance: HOW it looks (canonical)
24
+ data.csv # Raw data (immutable)
25
+ exports/ # PNG, SVG, hitmap
26
+ cache/ # geometry_px.json, render_manifest.json
27
+
28
+ Parameters
29
+ ----------
30
+ obj : matplotlib.figure.Figure
31
+ The figure to save.
32
+ spath : str or Path
33
+ Output path (e.g., "plot.plot" or "plot.plot.zip").
34
+ as_zip : bool
35
+ If True, save as ZIP archive.
36
+ data : pandas.DataFrame, optional
37
+ Data to embed in the bundle as plot.csv.
38
+ layered : bool
39
+ If True (default), use new layered format (spec/style/geometry).
40
+ **kwargs
41
+ Additional arguments passed to savefig.
42
+ """
43
+ import shutil
44
+
45
+ import matplotlib.figure
46
+
47
+ p = Path(spath)
48
+
49
+ # Extract basename from path
50
+ basename = p.stem
51
+ if basename.endswith(".plot"):
52
+ basename = basename[:-5]
53
+ elif basename.endswith(".zip"):
54
+ basename = Path(basename).stem
55
+ if basename.endswith(".plot"):
56
+ basename = basename[:-5]
57
+
58
+ # Extract figure from various matplotlib object types
59
+ fig = obj
60
+ if hasattr(obj, "figure"):
61
+ fig = obj.figure
62
+ elif hasattr(obj, "fig"):
63
+ fig = obj.fig
64
+
65
+ if not isinstance(fig, matplotlib.figure.Figure):
66
+ raise TypeError(f"Expected matplotlib Figure, got {type(obj).__name__}")
67
+
68
+ dpi = kwargs.pop("dpi", 300)
69
+
70
+ # === Always use layered format ===
71
+ # Determine bundle directory path
72
+ if as_zip:
73
+ temp_dir = Path(tempfile.mkdtemp())
74
+ bundle_dir = temp_dir / f"{basename}.plot"
75
+ zip_path = p if not str(p).endswith(".zip") else p
76
+ else:
77
+ bundle_dir = p if str(p).endswith(".plot") else Path(str(p) + ".plot")
78
+ temp_dir = None
79
+
80
+ # Get CSV data from figure if not provided
81
+ csv_df = data
82
+ if csv_df is None:
83
+ csv_source = get_figure_with_data(obj)
84
+ if csv_source is not None and hasattr(csv_source, "export_as_csv"):
85
+ try:
86
+ csv_df = csv_source.export_as_csv()
87
+ except Exception:
88
+ pass
89
+
90
+ from scitex.plt.io import save_layered_plot_bundle
91
+
92
+ save_layered_plot_bundle(
93
+ fig=fig,
94
+ bundle_dir=bundle_dir,
95
+ basename=basename,
96
+ dpi=dpi,
97
+ csv_df=csv_df,
98
+ )
99
+
100
+ # Compress to ZIP if requested
101
+ if as_zip:
102
+ import zipfile
103
+
104
+ with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
105
+ for file_path in bundle_dir.rglob("*"):
106
+ if file_path.is_file():
107
+ arcname = file_path.relative_to(bundle_dir.parent)
108
+ zf.write(file_path, arcname)
109
+ shutil.rmtree(temp_dir)
110
+
111
+
112
+ # EOF
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
  # Timestamp: 2025-12-19
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_pltz_stx.py
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_plot_scitex.py
4
4
 
5
- """Save matplotlib figures as FTS bundles (ZIP or directory) with plot content type."""
5
+ """Save matplotlib figures as SciTeX bundles (ZIP or directory) with plot content type."""
6
6
 
7
7
  import json
8
8
  import tempfile
@@ -199,8 +199,8 @@ def _build_theme_from_figure(fig):
199
199
  }
200
200
 
201
201
 
202
- def save_pltz_as_stx(obj, spath, as_zip=True, basename=None, **kwargs):
203
- """Save a matplotlib figure as an FTS bundle (ZIP or directory).
202
+ def save_plot_as_scitex(obj, spath, as_zip=True, basename=None, **kwargs):
203
+ """Save a matplotlib figure as a SciTeX bundle (ZIP or directory).
204
204
 
205
205
  Bundle structure:
206
206
  plot_name/ # or plot_name.zip (with plot_name/ inside)
@@ -463,7 +463,7 @@ def _generate_readme(bundle_dir, basename, spec, csv_df):
463
463
  from datetime import datetime
464
464
 
465
465
  readme_lines = [
466
- f"# {basename} FTS Bundle",
466
+ f"# {basename} SciTeX Bundle",
467
467
  "",
468
468
  "## Overview",
469
469
  "",
@@ -517,9 +517,9 @@ def _generate_readme(bundle_dir, basename, spec, csv_df):
517
517
  "## Usage",
518
518
  "",
519
519
  "```python",
520
- "from scitex.fts import FTS",
520
+ "from scitex.io.bundle import Bundle",
521
521
  "",
522
- f'bundle = FTS("{basename}.zip") # or "{basename}/" directory',
522
+ f'bundle = Bundle("{basename}.zip") # or "{basename}/" directory',
523
523
  "bundle.show() # Display",
524
524
  'bundle.export("output.png") # Export',
525
525
  "```",
@@ -2,28 +2,28 @@
2
2
  # Timestamp: 2025-12-19
3
3
  # File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_stx_bundle.py
4
4
 
5
- """Save functions for FTS bundle format (.zip or directory)."""
5
+ """Save functions for SciTeX bundle format (.zip or directory)."""
6
6
 
7
7
  from pathlib import Path
8
8
 
9
9
 
10
10
  def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **kwargs):
11
- """Save an object as an FTS bundle (.zip or directory).
11
+ """Save an object as a SciTeX bundle (.zip or directory).
12
12
 
13
- FTS (Figure-Table-Statistics) is the unified bundle format that supports:
13
+ SciTeX bundles support three types:
14
14
  - figure: Publication figures with multiple panels
15
15
  - plot: Single matplotlib plots
16
16
  - stats: Statistical results
17
17
 
18
18
  The content type is auto-detected from the object:
19
- - FTS instance -> delegates to FTS.save()
19
+ - Bundle instance -> delegates to Bundle.save()
20
20
  - matplotlib.figure.Figure -> plot
21
21
  - dict with 'panels' or 'elements' -> figure
22
22
  - dict with 'comparisons' -> stats
23
23
 
24
24
  Bundle structure:
25
25
  output/ # or output.zip
26
- node.json # Bundle metadata
26
+ spec.json # Bundle metadata
27
27
  encoding.json # Data-to-visual mappings
28
28
  theme.json # Visual styling
29
29
  data/ # Raw data files
@@ -32,7 +32,7 @@ def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **
32
32
  Parameters
33
33
  ----------
34
34
  obj : Any
35
- Object to save (FTS, Figure, dict, etc.)
35
+ Object to save (Bundle, Figure, dict, etc.)
36
36
  spath : str or Path
37
37
  Output path (e.g., "output.zip" or "output/")
38
38
  as_zip : bool
@@ -42,10 +42,10 @@ def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **
42
42
  **kwargs
43
43
  Additional arguments passed to format-specific savers.
44
44
  """
45
- from scitex.fts import FTS
45
+ from scitex.io.bundle import Bundle
46
46
 
47
- if isinstance(obj, FTS):
48
- # Delegate to FTS.save()
47
+ if isinstance(obj, Bundle):
48
+ # Delegate to Bundle.save()
49
49
  obj.save()
50
50
  return
51
51
 
@@ -80,23 +80,23 @@ def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **
80
80
 
81
81
  # Route to appropriate handler based on content type
82
82
  if content_type == "plot":
83
- from ._pltz_stx import save_pltz_as_stx
83
+ from ._plot_scitex import save_plot_as_scitex
84
84
 
85
- save_pltz_as_stx(obj, spath, as_zip=as_zip, basename=basename, **kwargs)
85
+ save_plot_as_scitex(obj, spath, as_zip=as_zip, basename=basename, **kwargs)
86
86
  elif content_type == "figure":
87
- from scitex.fts import FTS
87
+ from scitex.io.bundle import Bundle
88
88
 
89
- bundle = FTS(spath, create=True, node_type="figure")
89
+ bundle = Bundle(spath, create=True, bundle_type="figure")
90
90
  if isinstance(obj, dict):
91
91
  if "title" in obj:
92
- bundle.node.title = obj["title"]
92
+ bundle.spec.title = obj["title"]
93
93
  if "description" in obj:
94
- bundle.node.description = obj["description"]
94
+ bundle.spec.description = obj["description"]
95
95
  bundle.save()
96
96
  elif content_type == "stats":
97
97
  import scitex.stats as sstats
98
98
 
99
- sstats.save_statsz(obj, spath, as_zip=as_zip, **kwargs)
99
+ sstats.save_stats(obj, spath, as_zip=as_zip, **kwargs)
100
100
  else:
101
101
  raise ValueError(f"Unknown bundle type: {content_type}")
102
102
 
@@ -1,5 +1,5 @@
1
1
  <!-- ---
2
- !-- Timestamp: 2025-12-16 20:36:14
2
+ !-- Timestamp: 2026-01-07
3
3
  !-- Author: ywatanabe
4
4
  !-- File: /home/ywatanabe/proj/scitex-code/src/scitex/io/bundle/README.md
5
5
  !-- --- -->
@@ -10,20 +10,20 @@
10
10
 
11
11
  SciTeX uses bundle formats for reproducible scientific figures:
12
12
 
13
- | Format | Purpose | Contents |
14
- |-----------|---------------------|---------------------------------------------|
15
- | `.pltz` | Single plot bundle | spec.json, style.json, data.csv, exports/ |
16
- | `.figz` | Multi-panel figure | spec.json, style.json, nested .pltz bundles |
17
- | `.statsz` | Statistical results | spec.json, stats data, comparison metadata |
13
+ | Format | Purpose | Contents |
14
+ |----------------|---------------------|------------------------------------------------|
15
+ | `.plot.zip` | Single plot bundle | spec.json, encoding.json, data.csv, exports/ |
16
+ | `.figure.zip` | Multi-panel figure | spec.json, encoding.json, nested plot bundles |
17
+ | `.stats.zip` | Statistical results | spec.json, stats data, comparison metadata |
18
18
 
19
19
  ## Format Variants
20
20
 
21
21
  Each bundle can exist in two forms:
22
22
 
23
- | Suffix | Type | Use Case |
24
- |-------------------------------------|-------------|-----------------------------|
25
- | `.pltz` / `.figz` / `.statsz` | ZIP archive | Storage, transfer, download |
26
- | `.pltz.d` / `.figz.d` / `.statsz.d` | Directory | Editing, development |
23
+ | Suffix | Type | Use Case |
24
+ |----------------------------------------------|-------------|-----------------------------|
25
+ | `.plot.zip` / `.figure.zip` / `.stats.zip` | ZIP archive | Storage, transfer, download |
26
+ | `.plot` / `.figure` / `.stats` | Directory | Editing, development |
27
27
 
28
28
  ## Quick Start
29
29
 
@@ -31,19 +31,19 @@ Each bundle can exist in two forms:
31
31
  import scitex.io.bundle as bundle
32
32
 
33
33
  # Load a bundle (works with both ZIP and directory)
34
- data = bundle.load("Figure1.figz")
34
+ data = bundle.load("Figure1.figure.zip")
35
35
  print(data['spec'])
36
- print(data['type']) # 'figz'
36
+ print(data['type']) # 'figure'
37
37
 
38
38
  # Save a bundle
39
- bundle.save(data, "output.pltz", as_zip=True)
39
+ bundle.save(data, "output.plot.zip", as_zip=True)
40
40
 
41
41
  # Copy a bundle
42
- bundle.copy("template.pltz", "my_plot.pltz.d")
42
+ bundle.copy("template.plot.zip", "my_plot.plot")
43
43
 
44
44
  # Pack/unpack between formats
45
- bundle.pack("plot.pltz.d") # -> plot.pltz
46
- bundle.unpack("plot.pltz") # -> plot.pltz.d/
45
+ bundle.pack("plot.plot") # -> plot.plot.zip
46
+ bundle.unpack("plot.plot.zip") # -> plot.plot/
47
47
  ```
48
48
 
49
49
  ## ZipBundle Class
@@ -54,19 +54,19 @@ In-memory access to ZIP bundles without extraction:
54
54
  from scitex.io.bundle import ZipBundle
55
55
 
56
56
  # Reading
57
- with ZipBundle("figure.figz") as zb:
57
+ with ZipBundle("figure.figure.zip") as zb:
58
58
  spec = zb.read_json("spec.json")
59
59
  data = zb.read_csv("data.csv")
60
60
  png = zb.read_bytes("exports/figure.png")
61
61
 
62
62
  # Writing (atomic)
63
- with ZipBundle("output.pltz", mode="w") as zb:
63
+ with ZipBundle("output.plot.zip", mode="w") as zb:
64
64
  zb.write_json("spec.json", spec_dict)
65
65
  zb.write_csv("data.csv", dataframe)
66
66
  zb.write_bytes("exports/plot.png", png_bytes)
67
67
 
68
68
  # Modifying (read + write atomically)
69
- with ZipBundle("figure.figz", mode="a") as zb:
69
+ with ZipBundle("figure.figure.zip", mode="a") as zb:
70
70
  spec = zb.read_json("spec.json")
71
71
  spec["title"] = "Updated"
72
72
  zb.write_json("spec.json", spec)
@@ -74,57 +74,66 @@ with ZipBundle("figure.figz", mode="a") as zb:
74
74
 
75
75
  ## Nested Bundle Access
76
76
 
77
- Access pltz bundles nested inside figz:
77
+ Access plot bundles nested inside figure bundles:
78
78
 
79
79
  ```python
80
80
  from scitex.io.bundle import nested
81
81
 
82
82
  # Get preview image
83
- preview = nested.get_preview("Figure1.figz/A.pltz.d")
83
+ preview = nested.get_preview("Figure1.figure/A.plot")
84
84
 
85
85
  # Get JSON
86
- spec = nested.get_json("Figure1.figz/A.pltz.d/spec.json")
86
+ spec = nested.get_json("Figure1.figure/A.plot/spec.json")
87
87
 
88
88
  # Get any file
89
- png = nested.get_file("Figure1.figz/A.pltz.d/exports/plot.png")
89
+ png = nested.get_file("Figure1.figure/A.plot/exports/plot.png")
90
90
 
91
91
  # Write to nested bundle
92
- nested.put_json("Figure1.figz/A.pltz.d/spec.json", updated_spec)
92
+ nested.put_json("Figure1.figure/A.plot/spec.json", updated_spec)
93
93
 
94
94
  # List files
95
- files = nested.list_files("Figure1.figz/A.pltz.d")
95
+ files = nested.list_files("Figure1.figure/A.plot")
96
96
 
97
97
  # Resolve full bundle data
98
- data = nested.resolve("Figure1.figz/A.pltz.d")
98
+ data = nested.resolve("Figure1.figure/A.plot")
99
99
  ```
100
100
 
101
101
  ## Bundle Structure
102
102
 
103
- ### .pltz Bundle
103
+ ### .plot Bundle
104
104
 
105
105
  ```
106
- plot.pltz.d/
107
- ├── spec.json # Plot specification (traces, axes, data refs)
108
- ├── style.json # Visual styling (colors, fonts, sizes)
109
- ├── data.csv # Source data
110
- ├── exports/
111
- ├── plot.png # Rendered preview
112
- ├── plot_hitmap.png
113
- │ └── plot.svg
114
- └── cache/
115
- └── geometry_px.json
106
+ plot.plot/
107
+ ├── canonical/
108
+ ├── spec.json # Plot specification (kind, id, size, etc.)
109
+ ├── encoding.json # Encoding specification (traces, axes)
110
+ │ └── theme.json # Visual styling (colors, fonts, sizes)
111
+ ├── payload/
112
+ └── data.csv # Source data
113
+ ├── artifacts/
114
+ │ ├── exports/
115
+ │ │ ├── plot.png # Rendered preview
116
+ │ │ └── plot.svg
117
+ │ └── cache/
118
+ │ └── geometry_px.json
119
+ └── children/ # Empty for leaf bundles
116
120
  ```
117
121
 
118
- ### .figz Bundle
122
+ ### .figure Bundle
119
123
 
120
124
  ```
121
- Figure1.figz.d/
122
- ├── spec.json # Figure layout, panel positions
123
- ├── style.json # Figure-level styling
124
- ├── A.pltz.d/ # Panel A (nested pltz)
125
- ├── B.pltz.d/ # Panel B (nested pltz)
126
- └── exports/
127
- └── Figure1.png # Composed figure
125
+ Figure1.figure/
126
+ ├── canonical/
127
+ ├── spec.json # Figure layout, panel positions, children list
128
+ ├── encoding.json # Figure-level encoding
129
+ │ └── theme.json # Figure-level styling
130
+ ├── payload/ # Empty for composite bundles
131
+ ├── artifacts/
132
+ │ └── exports/
133
+ │ └── Figure1.png
134
+ └── children/
135
+ ├── panel-a.zip # Panel A (nested plot bundle)
136
+ └── panel-b.zip # Panel B (nested plot bundle)
128
137
  ```
129
138
 
130
139
  ## API Reference
@@ -140,7 +149,7 @@ Figure1.figz.d/
140
149
  | `unpack(zip_path)` | Convert ZIP to directory |
141
150
  | `validate(path)` | Validate bundle structure |
142
151
  | `is_bundle(path)` | Check if path is a bundle |
143
- | `get_type(path)` | Get bundle type ('figz', 'pltz', 'statsz') |
152
+ | `get_type(path)` | Get bundle type ('figure', 'plot', 'stats') |
144
153
 
145
154
  ### ZipBundle Methods
146
155
 
@@ -169,44 +178,44 @@ Figure1.figz.d/
169
178
  | `nested.resolve(path)` | Load full nested bundle data |
170
179
  | `nested.parse_path(path)` | Parse nested path components |
171
180
 
172
- ## Migration from Old API
173
-
174
- | Old Import | New Import |
175
- |------------|------------|
176
- | `from scitex.io._bundle import load_bundle` | `from scitex.io.bundle import load` |
177
- | `from scitex.io._bundle import save_bundle` | `from scitex.io.bundle import save` |
178
- | `from scitex.io._bundle import copy_bundle` | `from scitex.io.bundle import copy` |
179
- | `from scitex.io._bundle import pack_bundle` | `from scitex.io.bundle import pack` |
180
- | `from scitex.io._bundle import unpack_bundle` | `from scitex.io.bundle import unpack` |
181
- | `from scitex.io._bundle import validate_bundle` | `from scitex.io.bundle import validate` |
182
- | `from scitex.io._bundle import BundleType` | `from scitex.io.bundle import BundleType` |
183
- | `from scitex.io._bundle import BundleValidationError` | `from scitex.io.bundle import BundleValidationError` |
184
- | `from scitex.io._bundle import BUNDLE_EXTENSIONS` | `from scitex.io.bundle import EXTENSIONS` |
185
- | `from scitex.io._bundle import get_bundle_type` | `from scitex.io.bundle import get_type` |
186
- | `from scitex.io._zip_bundle import ZipBundle` | `from scitex.io.bundle import ZipBundle` |
187
- | `from scitex.io._zip_bundle import open_bundle` | `from scitex.io.bundle import open_zip` |
188
- | `from scitex.io._zip_bundle import create_bundle` | `from scitex.io.bundle import create_zip` |
189
- | `from scitex.io._zip_bundle import zip_directory_bundle` | `from scitex.io.bundle import zip_directory` |
190
- | `from scitex.io._nested_bundle import resolve_nested_bundle` | `from scitex.io.bundle import nested; nested.resolve` |
191
- | `from scitex.io._nested_bundle import get_nested_file` | `from scitex.io.bundle import nested; nested.get_file` |
192
- | `from scitex.io._nested_bundle import get_nested_json` | `from scitex.io.bundle import nested; nested.get_json` |
193
- | `from scitex.io._nested_bundle import get_nested_preview` | `from scitex.io.bundle import nested; nested.get_preview` |
194
- | `from scitex.io._nested_bundle import put_nested_file` | `from scitex.io.bundle import nested; nested.put_file` |
195
- | `from scitex.io._nested_bundle import put_nested_json` | `from scitex.io.bundle import nested; nested.put_json` |
196
- | `from scitex.io._nested_bundle import list_nested_files` | `from scitex.io.bundle import nested; nested.list_files` |
197
- | `from scitex.io._nested_bundle import parse_nested_path` | `from scitex.io.bundle import nested; nested.parse_path` |
198
- | `from scitex.io._nested_bundle import NestedBundleNotFoundError` | `from scitex.io.bundle import NestedBundleNotFoundError` |
181
+ ### Bundle and Spec Classes
182
+
183
+ ```python
184
+ from scitex.io.bundle import Bundle, Spec, SpecRefs
185
+
186
+ # Create a new bundle
187
+ bundle = Bundle("my_plot.plot", create=True, kind="plot")
188
+ bundle.spec.name = "My Plot"
189
+ bundle.save()
190
+
191
+ # Load existing bundle
192
+ bundle = Bundle("existing.plot.zip")
193
+ print(bundle.spec.kind) # 'plot'
194
+ print(bundle.spec.id)
195
+
196
+ # Create from matplotlib
197
+ from scitex.io.bundle import from_matplotlib
198
+ import matplotlib.pyplot as plt
199
+
200
+ fig, ax = plt.subplots()
201
+ ax.plot([1, 2, 3], [1, 4, 9])
202
+ bundle = from_matplotlib(fig, "output.plot")
203
+ ```
199
204
 
200
205
  ## Module Structure
201
206
 
202
207
  ```
203
208
  scitex/io/bundle/
204
- ├── __init__.py # Public API exports
205
- ├── _types.py # BundleType, errors, constants
206
- ├── _core.py # load, save, copy, pack, unpack, validate
207
- ├── _zip.py # ZipBundle class and functions
208
- ├── _nested.py # Nested bundle access
209
- └── README.md # This documentation
209
+ ├── __init__.py # Public API exports
210
+ ├── _types.py # BundleType, errors, constants
211
+ ├── _core.py # load, save, copy, pack, unpack, validate
212
+ ├── _zip.py # ZipBundle class and functions
213
+ ├── _nested.py # Nested bundle access
214
+ ├── _Bundle.py # Bundle class
215
+ ├── _dataclasses/ # Spec, SpecRefs, BBox, SizeMM, etc.
216
+ ├── _loader.py # Bundle component loading
217
+ ├── _saver.py # Bundle component saving
218
+ └── README.md # This documentation
210
219
  ```
211
220
 
212
- <!-- EOF -->
221
+ <!-- EOF -->