scitex 2.10.2__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.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
  112. {scitex-2.10.2.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.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
  362. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
  363. {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,38 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fts/_bundle/__init__.py
4
-
5
- """FTS Bundle - Core bundle functionality."""
6
-
7
- # FTS class
8
- from ._FTS import FTS, create_bundle, from_matplotlib, load_bundle
9
-
10
- # Core dataclasses users need
11
- from ._dataclasses import BBox, DataInfo, Node, SizeMM
12
-
13
- # Type enumeration
14
- from ._utils import NodeType
15
-
16
- # Error classes
17
- from ._utils import BundleError, BundleNotFoundError, BundleValidationError
18
-
19
- __all__ = [
20
- # FTS
21
- "FTS",
22
- "load_bundle",
23
- "create_bundle",
24
- "from_matplotlib",
25
- # Core dataclasses
26
- "Node",
27
- "BBox",
28
- "SizeMM",
29
- "DataInfo",
30
- # Types
31
- "NodeType",
32
- # Errors
33
- "BundleError",
34
- "BundleNotFoundError",
35
- "BundleValidationError",
36
- ]
37
-
38
- # EOF
@@ -1,55 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_utils/__init__.py
4
-
5
- """FTS Bundle utilities - types, constants, errors, and helpers."""
6
-
7
- # Constants
8
- from ._const import EXTENSIONS, SCHEMA_NAME, SCHEMA_VERSION, ZIP_EXTENSION
9
-
10
- # Types
11
- from ._types import (
12
- TYPE_DEFAULTS,
13
- BundleType,
14
- NodeType,
15
- get_default_constraints,
16
- )
17
-
18
- # Errors
19
- from ._errors import (
20
- BundleError,
21
- BundleNotFoundError,
22
- BundleValidationError,
23
- CircularReferenceError,
24
- ConstraintError,
25
- DepthLimitError,
26
- NestedBundleNotFoundError,
27
- )
28
-
29
- # Generation
30
- from ._generate import generate_bundle_id
31
-
32
- __all__ = [
33
- # Constants
34
- "ZIP_EXTENSION",
35
- "EXTENSIONS",
36
- "SCHEMA_NAME",
37
- "SCHEMA_VERSION",
38
- # Types
39
- "NodeType",
40
- "BundleType",
41
- "TYPE_DEFAULTS",
42
- "get_default_constraints",
43
- # Errors
44
- "BundleError",
45
- "BundleValidationError",
46
- "BundleNotFoundError",
47
- "NestedBundleNotFoundError",
48
- "CircularReferenceError",
49
- "DepthLimitError",
50
- "ConstraintError",
51
- # Generation
52
- "generate_bundle_id",
53
- ]
54
-
55
- # EOF
@@ -1,26 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_utils/_const.py
4
-
5
- """FTS Bundle constants."""
6
-
7
- from typing import Tuple
8
-
9
- # Bundle extension (ZIP for portability, or directory)
10
- ZIP_EXTENSION: str = ".zip"
11
-
12
- # Supported formats: .zip files or directories (no extension)
13
- EXTENSIONS: Tuple[str, ...] = (".zip",)
14
-
15
- # Schema constants
16
- SCHEMA_NAME = "scitex.fts"
17
- SCHEMA_VERSION = "1.0.0"
18
-
19
- __all__ = [
20
- "ZIP_EXTENSION",
21
- "EXTENSIONS",
22
- "SCHEMA_NAME",
23
- "SCHEMA_VERSION",
24
- ]
25
-
26
- # EOF
@@ -1,73 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_utils/_errors.py
4
-
5
- """FTS Bundle error classes."""
6
-
7
-
8
- class BundleError(Exception):
9
- """Base exception for bundle operations."""
10
-
11
- pass
12
-
13
-
14
- class BundleValidationError(BundleError, ValueError):
15
- """Error raised when bundle validation fails."""
16
-
17
- pass
18
-
19
-
20
- class BundleNotFoundError(BundleError, FileNotFoundError):
21
- """Error raised when a bundle is not found."""
22
-
23
- pass
24
-
25
-
26
- class NestedBundleNotFoundError(BundleNotFoundError):
27
- """Error raised when a nested bundle or file within it is not found."""
28
-
29
- pass
30
-
31
-
32
- class CircularReferenceError(BundleValidationError):
33
- """Error raised when circular reference is detected in bundle hierarchy.
34
-
35
- This occurs when a bundle references itself directly or indirectly
36
- through its children, detected via bundle_id tracking.
37
- """
38
-
39
- pass
40
-
41
-
42
- class DepthLimitError(BundleValidationError):
43
- """Error raised when bundle nesting exceeds max_depth constraint.
44
-
45
- The max_depth is defined per bundle type in TYPE_DEFAULTS.
46
- Default is 3 for figures, 1 for leaf types.
47
- """
48
-
49
- pass
50
-
51
-
52
- class ConstraintError(BundleValidationError):
53
- """Error raised when bundle violates its type constraints.
54
-
55
- Examples:
56
- - Leaf type (plot, stats) has children
57
- - Unknown type specified
58
- """
59
-
60
- pass
61
-
62
-
63
- __all__ = [
64
- "BundleError",
65
- "BundleValidationError",
66
- "BundleNotFoundError",
67
- "NestedBundleNotFoundError",
68
- "CircularReferenceError",
69
- "DepthLimitError",
70
- "ConstraintError",
71
- ]
72
-
73
- # EOF
@@ -1,21 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_utils/_generate.py
4
-
5
- """FTS Bundle ID generation utilities."""
6
-
7
- import uuid
8
-
9
-
10
- def generate_bundle_id() -> str:
11
- """Generate a unique bundle ID (UUID4).
12
-
13
- Returns:
14
- A new UUID4 string.
15
- """
16
- return str(uuid.uuid4())
17
-
18
-
19
- __all__ = ["generate_bundle_id"]
20
-
21
- # EOF
@@ -1,76 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_utils/_types.py
4
-
5
- """FTS Node type constants and constraints."""
6
-
7
- from typing import Any, Dict
8
-
9
-
10
- class NodeType:
11
- """Node type constants for FTS bundles.
12
-
13
- The type is stored in node.json["type"].
14
-
15
- Usage:
16
- from scitex.fts import NodeType
17
-
18
- if bundle.node.type == NodeType.FIGURE:
19
- ...
20
-
21
- Note:
22
- Tables are treated as structured figures in academic contexts.
23
- FTS handles figures, tables, and statistics in a unified way.
24
- """
25
-
26
- FIGURE = "figure"
27
- PLOT = "plot"
28
- TABLE = "table" # Structured data presentation (demographics, results, etc.)
29
- STATS = "stats"
30
- IMAGE = "image"
31
- TEXT = "text"
32
- SHAPE = "shape"
33
- SYMBOL = "symbol"
34
- COMMENT = "comment"
35
- EQUATION = "equation"
36
-
37
-
38
- # Legacy alias (deprecated)
39
- BundleType = NodeType
40
-
41
-
42
- # Type-specific default constraints
43
- TYPE_DEFAULTS: Dict[str, Dict[str, Any]] = {
44
- "figure": {"allow_children": True, "max_depth": 3},
45
- "plot": {"allow_children": False, "max_depth": 1},
46
- "table": {"allow_children": False, "max_depth": 1}, # Tables are leaf nodes
47
- "stats": {"allow_children": False, "max_depth": 1},
48
- "image": {"allow_children": False, "max_depth": 1},
49
- "text": {"allow_children": False, "max_depth": 1},
50
- "shape": {"allow_children": False, "max_depth": 1},
51
- "symbol": {"allow_children": False, "max_depth": 1},
52
- "comment": {"allow_children": False, "max_depth": 1},
53
- "equation": {"allow_children": False, "max_depth": 1},
54
- }
55
-
56
-
57
- def get_default_constraints(node_type: str) -> Dict[str, Any]:
58
- """Get default constraints for a node type.
59
-
60
- Args:
61
- node_type: Type string (figure, plot, stats, etc.)
62
-
63
- Returns:
64
- Dict with allow_children and max_depth.
65
- """
66
- return TYPE_DEFAULTS.get(node_type, {"allow_children": False, "max_depth": 1})
67
-
68
-
69
- __all__ = [
70
- "NodeType",
71
- "BundleType",
72
- "TYPE_DEFAULTS",
73
- "get_default_constraints",
74
- ]
75
-
76
- # EOF
@@ -1,165 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_zipbundle.py
4
-
5
- """ZipBundle - Simple ZIP file wrapper for FTS bundles."""
6
-
7
- import json
8
- import zipfile
9
- from pathlib import Path
10
- from typing import Any, Dict, Optional, Union
11
-
12
- __all__ = ["ZipBundle"]
13
-
14
-
15
- class ZipBundle:
16
- """Simple ZIP file wrapper for reading/writing bundle data.
17
-
18
- Provides a context manager interface for working with ZIP files.
19
-
20
- Usage:
21
- # Read mode
22
- with ZipBundle("bundle.zip", mode="r") as bundle:
23
- spec = bundle.read_json("spec.json")
24
- data = bundle.read_bytes("data.csv")
25
-
26
- # Write/append mode
27
- with ZipBundle("bundle.zip", mode="a") as bundle:
28
- bundle.write_json("spec.json", {"type": "plot"})
29
- bundle.write_bytes("data.csv", csv_bytes)
30
- """
31
-
32
- def __init__(self, path: Union[str, Path], mode: str = "r"):
33
- """Initialize ZipBundle.
34
-
35
- Args:
36
- path: Path to ZIP file.
37
- mode: File mode ('r' for read, 'w' for write, 'a' for append).
38
- """
39
- self.path = Path(path)
40
- self.mode = mode
41
- self._zf: Optional[zipfile.ZipFile] = None
42
-
43
- def __enter__(self) -> "ZipBundle":
44
- """Enter context manager."""
45
- self._zf = zipfile.ZipFile(self.path, self.mode)
46
- return self
47
-
48
- def __exit__(self, exc_type, exc_val, exc_tb):
49
- """Exit context manager."""
50
- if self._zf:
51
- self._zf.close()
52
- self._zf = None
53
-
54
- def read_json(self, name: str) -> Dict[str, Any]:
55
- """Read JSON file from ZIP.
56
-
57
- Args:
58
- name: File name within ZIP.
59
-
60
- Returns:
61
- Parsed JSON data.
62
- """
63
- if not self._zf:
64
- raise RuntimeError("ZipBundle not open")
65
-
66
- # Try direct path first
67
- try:
68
- data = self._zf.read(name)
69
- return json.loads(data.decode("utf-8"))
70
- except KeyError:
71
- pass
72
-
73
- # Try with .d/ directory prefix
74
- for item in self._zf.namelist():
75
- if item.endswith(f"/{name}") or item == name:
76
- data = self._zf.read(item)
77
- return json.loads(data.decode("utf-8"))
78
-
79
- raise FileNotFoundError(f"File not found in ZIP: {name}")
80
-
81
- def read_bytes(self, name: str) -> bytes:
82
- """Read raw bytes from ZIP.
83
-
84
- Args:
85
- name: File name within ZIP.
86
-
87
- Returns:
88
- Raw file bytes.
89
- """
90
- if not self._zf:
91
- raise RuntimeError("ZipBundle not open")
92
-
93
- # Try direct path first
94
- try:
95
- return self._zf.read(name)
96
- except KeyError:
97
- pass
98
-
99
- # Try with .d/ directory prefix
100
- for item in self._zf.namelist():
101
- if item.endswith(f"/{name}") or item == name:
102
- return self._zf.read(item)
103
-
104
- raise FileNotFoundError(f"File not found in ZIP: {name}")
105
-
106
- def write_json(self, name: str, data: Dict[str, Any], indent: int = 2) -> None:
107
- """Write JSON file to ZIP.
108
-
109
- Args:
110
- name: File name within ZIP.
111
- data: Data to write.
112
- indent: JSON indentation level.
113
- """
114
- if not self._zf:
115
- raise RuntimeError("ZipBundle not open")
116
-
117
- json_str = json.dumps(data, indent=indent)
118
- self._zf.writestr(name, json_str.encode("utf-8"))
119
-
120
- def write_bytes(self, name: str, data: bytes) -> None:
121
- """Write raw bytes to ZIP.
122
-
123
- Args:
124
- name: File name within ZIP.
125
- data: Data to write.
126
- """
127
- if not self._zf:
128
- raise RuntimeError("ZipBundle not open")
129
-
130
- self._zf.writestr(name, data)
131
-
132
- def namelist(self) -> list:
133
- """List files in ZIP.
134
-
135
- Returns:
136
- List of file names.
137
- """
138
- if not self._zf:
139
- raise RuntimeError("ZipBundle not open")
140
- return self._zf.namelist()
141
-
142
- def exists(self, name: str) -> bool:
143
- """Check if file exists in ZIP.
144
-
145
- Args:
146
- name: File name to check.
147
-
148
- Returns:
149
- True if file exists.
150
- """
151
- if not self._zf:
152
- raise RuntimeError("ZipBundle not open")
153
-
154
- if name in self._zf.namelist():
155
- return True
156
-
157
- # Check with .d/ directory prefix
158
- for item in self._zf.namelist():
159
- if item.endswith(f"/{name}"):
160
- return True
161
-
162
- return False
163
-
164
-
165
- # EOF
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_fig/__init__.py
4
-
5
- """FTS Figure - Encoding and Theme dataclasses."""
6
-
7
- # Public dataclasses
8
- from ._dataclasses import (
9
- ENCODING_VERSION,
10
- THEME_VERSION,
11
- Encoding,
12
- Theme,
13
- )
14
-
15
- __all__ = [
16
- "ENCODING_VERSION",
17
- "THEME_VERSION",
18
- "Encoding",
19
- "Theme",
20
- ]
21
-
22
- # EOF
@@ -1,188 +0,0 @@
1
- #!/usr/bin/env python3
2
- # File: ./src/scitex/vis/backend/parser.py
3
- """Parse figure JSON to Python object models."""
4
-
5
- from typing import Any, Dict
6
-
7
- from .._models import (
8
- AnnotationModel,
9
- AxesModel,
10
- FigureModel,
11
- GuideModel,
12
- PlotModel,
13
- )
14
-
15
-
16
- def parse_figure_json(fig_json: Dict[str, Any]) -> FigureModel:
17
- """
18
- Parse figure JSON into FigureModel.
19
-
20
- Parameters
21
- ----------
22
- fig_json : Dict[str, Any]
23
- Figure JSON specification
24
-
25
- Returns
26
- -------
27
- FigureModel
28
- Parsed figure model
29
-
30
- Examples
31
- --------
32
- >>> fig_json = {
33
- ... "width_mm": 180,
34
- ... "height_mm": 120,
35
- ... "nrows": 1,
36
- ... "ncols": 2,
37
- ... "axes": [...]
38
- ... }
39
- >>> fig_model = parse_figure_json(fig_json)
40
- """
41
- # Parse nested axes
42
- axes_data = fig_json.get("axes", [])
43
- parsed_axes = [parse_axes_json(ax) for ax in axes_data]
44
-
45
- # Create FigureModel with parsed axes
46
- fig_data = fig_json.copy()
47
- fig_data["axes"] = [ax.to_dict() for ax in parsed_axes]
48
-
49
- return FigureModel.from_dict(fig_data)
50
-
51
-
52
- def parse_axes_json(axes_json: Dict[str, Any]) -> AxesModel:
53
- """
54
- Parse axes JSON into AxesModel.
55
-
56
- Parameters
57
- ----------
58
- axes_json : Dict[str, Any]
59
- Axes JSON specification
60
-
61
- Returns
62
- -------
63
- AxesModel
64
- Parsed axes model
65
- """
66
- # Parse nested plots
67
- plots_data = axes_json.get("plots", [])
68
- parsed_plots = [parse_plot_json(plot) for plot in plots_data]
69
-
70
- # Parse nested annotations
71
- annotations_data = axes_json.get("annotations", [])
72
- parsed_annotations = [parse_annotation_json(ann) for ann in annotations_data]
73
-
74
- # Parse nested guides
75
- guides_data = axes_json.get("guides", [])
76
- parsed_guides = [parse_guide_json(guide) for guide in guides_data]
77
-
78
- # Create AxesModel with parsed children
79
- ax_data = axes_json.copy()
80
- ax_data["plots"] = [p.to_dict() for p in parsed_plots]
81
- ax_data["annotations"] = [a.to_dict() for a in parsed_annotations]
82
- ax_data["guides"] = [g.to_dict() for g in parsed_guides]
83
-
84
- return AxesModel.from_dict(ax_data)
85
-
86
-
87
- def parse_plot_json(plot_json: Dict[str, Any]) -> PlotModel:
88
- """
89
- Parse plot JSON into PlotModel.
90
-
91
- Parameters
92
- ----------
93
- plot_json : Dict[str, Any]
94
- Plot JSON specification
95
-
96
- Returns
97
- -------
98
- PlotModel
99
- Parsed plot model
100
- """
101
- return PlotModel.from_dict(plot_json)
102
-
103
-
104
- def parse_guide_json(guide_json: Dict[str, Any]) -> GuideModel:
105
- """
106
- Parse guide JSON into GuideModel.
107
-
108
- Parameters
109
- ----------
110
- guide_json : Dict[str, Any]
111
- Guide JSON specification
112
-
113
- Returns
114
- -------
115
- GuideModel
116
- Parsed guide model
117
- """
118
- return GuideModel.from_dict(guide_json)
119
-
120
-
121
- def parse_annotation_json(annotation_json: Dict[str, Any]) -> AnnotationModel:
122
- """
123
- Parse annotation JSON into AnnotationModel.
124
-
125
- Parameters
126
- ----------
127
- annotation_json : Dict[str, Any]
128
- Annotation JSON specification
129
-
130
- Returns
131
- -------
132
- AnnotationModel
133
- Parsed annotation model
134
- """
135
- return AnnotationModel.from_dict(annotation_json)
136
-
137
-
138
- def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
139
- """
140
- Validate figure JSON structure (single entry point for validation).
141
-
142
- This is the recommended validation function that performs:
143
- 1. Basic JSON structure validation (utils.validate_json_structure)
144
- 2. Model parsing and validation (FigureModel.validate)
145
- 3. Axes layout validation (utils.validate_axes_layout)
146
-
147
- Parameters
148
- ----------
149
- fig_json : Dict[str, Any]
150
- Figure JSON to validate
151
-
152
- Returns
153
- -------
154
- bool
155
- True if valid, raises ValueError otherwise
156
-
157
- Raises
158
- ------
159
- ValueError
160
- If JSON structure is invalid
161
-
162
- Examples
163
- --------
164
- >>> from scitex.fig.backend import validate_figure_json
165
- >>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
166
- >>> validate_figure_json(fig_json)
167
- True
168
- """
169
- from ..utils import validate_axes_layout, validate_json_structure
170
-
171
- # Step 1: Validate basic JSON structure
172
- validate_json_structure(fig_json)
173
-
174
- # Step 2: Parse to models and validate
175
- fig_model = parse_figure_json(fig_json)
176
- fig_model.validate()
177
-
178
- # Step 3: Validate axes layout consistency
179
- validate_axes_layout(
180
- nrows=fig_model.nrows,
181
- ncols=fig_model.ncols,
182
- num_axes=len(fig_model.axes),
183
- )
184
-
185
- return True
186
-
187
-
188
- # EOF
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env python3
2
- # Timestamp: 2025-12-20
3
- # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_fig/editor/__init__.py
4
-
5
- """FTS Figure Editor - Interactive GUI for editing figure styles."""
6
-
7
- from ._cui import edit, save_manual_overrides
8
-
9
- __all__ = [
10
- "edit",
11
- "save_manual_overrides",
12
- ]
13
-
14
- # EOF