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
@@ -3,7 +3,7 @@
3
3
  # File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_validation.py
4
4
 
5
5
  """
6
- FTS Multi-Level Validation System.
6
+ SciTeX Multi-Level Validation System.
7
7
 
8
8
  Three validation levels:
9
9
  1. schema - Always ON (init/load/save) - Fast, structural checks
@@ -11,12 +11,12 @@ Three validation levels:
11
11
  3. strict - Explicit (CI/publication) - Full scientific rigor
12
12
 
13
13
  Usage:
14
- result = fts.validate(level="schema") # Fast, default at init
15
- result = fts.validate(level="semantic") # Cross-ref checks
16
- result = fts.validate(level="strict") # Full validation
14
+ result = bundle.validate(level="schema") # Fast, default at init
15
+ result = bundle.validate(level="semantic") # Cross-ref checks
16
+ result = bundle.validate(level="strict") # Full validation
17
17
 
18
18
  if result.has_errors:
19
- raise FTSValidationError(result)
19
+ raise BundleValidationError(result)
20
20
  """
21
21
 
22
22
  import json
@@ -39,7 +39,7 @@ ValidationLevel = Literal["schema", "semantic", "strict"]
39
39
 
40
40
  @dataclass
41
41
  class ValidationResult:
42
- """Result of FTS validation.
42
+ """Result of bundle validation.
43
43
 
44
44
  Attributes
45
45
  ----------
@@ -170,8 +170,8 @@ def validate_schema(data: Dict[str, Any], schema_name: str) -> List[str]:
170
170
  return errors
171
171
 
172
172
 
173
- def validate_node(data: Dict[str, Any]) -> List[str]:
174
- """Validate node.json data."""
173
+ def validate_spec(data: Dict[str, Any]) -> List[str]:
174
+ """Validate spec.json data."""
175
175
  return validate_schema(data, "node")
176
176
 
177
177
 
@@ -201,7 +201,7 @@ def validate_data_info(data: Dict[str, Any]) -> List[str]:
201
201
 
202
202
 
203
203
  def validate_semantic(
204
- node: Optional[Dict] = None,
204
+ spec: Optional[Dict] = None,
205
205
  encoding: Optional[Dict] = None,
206
206
  theme: Optional[Dict] = None,
207
207
  stats: Optional[Dict] = None,
@@ -256,7 +256,7 @@ def validate_semantic(
256
256
 
257
257
 
258
258
  def validate_strict(
259
- node: Optional[Dict] = None,
259
+ spec: Optional[Dict] = None,
260
260
  encoding: Optional[Dict] = None,
261
261
  theme: Optional[Dict] = None,
262
262
  stats: Optional[Dict] = None,
@@ -274,7 +274,7 @@ def validate_strict(
274
274
  # Include all semantic errors
275
275
  errors.extend(
276
276
  validate_semantic(
277
- node=node,
277
+ spec=spec,
278
278
  encoding=encoding,
279
279
  theme=theme,
280
280
  stats=stats,
@@ -288,18 +288,20 @@ def validate_strict(
288
288
  for col in columns:
289
289
  if col.get("dtype") in ["float64", "int64", "number"]:
290
290
  if not col.get("unit"):
291
- errors.append(f"Column '{col.get('name')}' missing unit specification")
291
+ errors.append(
292
+ f"Column '{col.get('name')}' missing unit specification"
293
+ )
292
294
 
293
295
  # Provenance must be present
294
296
  if data_info and not data_info.get("source"):
295
297
  errors.append("data_info.source (provenance) is required for publication")
296
298
 
297
- # Node must have all metadata
298
- if node:
299
- if not node.get("name"):
300
- errors.append("node.name is required for publication")
301
- if not node.get("created_at"):
302
- errors.append("node.created_at is required for publication")
299
+ # Spec must have all metadata
300
+ if spec:
301
+ if not spec.get("name"):
302
+ errors.append("spec.name is required for publication")
303
+ if not spec.get("created_at"):
304
+ errors.append("spec.created_at is required for publication")
303
305
 
304
306
  return errors
305
307
 
scitex/io/bundle/_zip.py CHANGED
@@ -1,13 +1,12 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Timestamp: "2025-12-16 (ywatanabe)"
4
3
  # File: /home/ywatanabe/proj/scitex-code/src/scitex/io/bundle/_zip.py
5
4
 
6
5
  """
7
6
  SciTeX ZipBundle - In-memory zip archive handler with atomic writes.
8
7
 
9
- Provides efficient access to .figz, .pltz, .statsz bundles without extracting
10
- to disk. Supports:
8
+ Provides efficient access to .figure.zip, .plot.zip, .stats.zip bundles without
9
+ extracting to disk. Supports:
11
10
  - In-memory file reading
12
11
  - Atomic writes using temp files
13
12
  - Context manager protocol
@@ -41,19 +40,19 @@ class ZipBundle:
41
40
 
42
41
  Usage:
43
42
  # Reading
44
- with ZipBundle("figure.figz") as bundle:
43
+ with ZipBundle("figure.figure.zip") as bundle:
45
44
  spec = bundle.read_json("spec.json")
46
45
  csv_data = bundle.read_csv("data.csv")
47
46
  png_bytes = bundle.read_bytes("exports/figure.png")
48
47
 
49
48
  # Writing
50
- with ZipBundle("output.pltz", mode="w") as bundle:
49
+ with ZipBundle("output.plot.zip", mode="w") as bundle:
51
50
  bundle.write_json("spec.json", spec_dict)
52
51
  bundle.write_csv("data.csv", dataframe)
53
52
  bundle.write_bytes("exports/plot.png", png_bytes)
54
53
 
55
54
  # Modifying (read then write atomically)
56
- with ZipBundle("figure.figz", mode="a") as bundle:
55
+ with ZipBundle("figure.figure.zip", mode="a") as bundle:
57
56
  spec = bundle.read_json("spec.json")
58
57
  spec["title"] = "Updated"
59
58
  bundle.write_json("spec.json", spec)
@@ -68,7 +67,7 @@ class ZipBundle:
68
67
  """Initialize ZipBundle.
69
68
 
70
69
  Args:
71
- path: Path to zip file (.figz, .pltz, .statsz)
70
+ path: Path to zip file (.figure.zip, .plot.zip, .stats.zip)
72
71
  mode: 'r' for read, 'w' for write, 'a' for append/modify
73
72
  compression: ZIP compression method (default: ZIP_DEFLATED)
74
73
  """
@@ -100,18 +99,14 @@ class ZipBundle:
100
99
  self._zipfile = zipfile.ZipFile(self.path, "r")
101
100
  elif self.mode == "w":
102
101
  self._temp_path = Path(tempfile.mktemp(suffix=self.path.suffix))
103
- self._zipfile = zipfile.ZipFile(
104
- self._temp_path, "w", self.compression
105
- )
102
+ self._zipfile = zipfile.ZipFile(self._temp_path, "w", self.compression)
106
103
  elif self.mode == "a":
107
104
  if self.path.exists():
108
105
  with zipfile.ZipFile(self.path, "r") as zf:
109
106
  for name in zf.namelist():
110
107
  self._cache[name] = zf.read(name)
111
108
  self._temp_path = Path(tempfile.mktemp(suffix=self.path.suffix))
112
- self._zipfile = zipfile.ZipFile(
113
- self._temp_path, "w", self.compression
114
- )
109
+ self._zipfile = zipfile.ZipFile(self._temp_path, "w", self.compression)
115
110
  else:
116
111
  raise ValueError(f"Invalid mode: {self.mode}")
117
112
 
@@ -282,9 +277,7 @@ class ZipBundle:
282
277
  """
283
278
  self.write_bytes(name, text.encode(encoding))
284
279
 
285
- def write_json(
286
- self, name: str, data: Dict[str, Any], indent: int = 2
287
- ) -> None:
280
+ def write_json(self, name: str, data: Dict[str, Any], indent: int = 2) -> None:
288
281
  """Write dictionary as JSON file.
289
282
 
290
283
  Args:
@@ -359,7 +352,7 @@ def open(path: Union[str, Path], mode: str = "r") -> ZipBundle:
359
352
  ZipBundle instance (use as context manager).
360
353
 
361
354
  Example:
362
- with open("figure.figz") as bundle:
355
+ with open("figure.figure.zip") as bundle:
363
356
  spec = bundle.spec
364
357
  data = bundle.data
365
358
  """
@@ -376,7 +369,7 @@ def create(
376
369
  """Create a new bundle with atomic write.
377
370
 
378
371
  Args:
379
- path: Output path (.figz, .pltz, or .statsz).
372
+ path: Output path (.figure.zip, .plot.zip, or .stats.zip).
380
373
  spec: Bundle specification dictionary.
381
374
  data: Optional CSV data as DataFrame.
382
375
  style: Optional style dictionary.
@@ -387,7 +380,7 @@ def create(
387
380
 
388
381
  Example:
389
382
  create(
390
- "plot.pltz",
383
+ "plot.plot.zip",
391
384
  spec={"schema": {"name": "scitex.plt", "version": "1.0"}},
392
385
  data=df,
393
386
  exports={"exports/plot.png": png_bytes},
@@ -415,15 +408,15 @@ def zip_directory(
415
408
  source_dir: Union[str, Path],
416
409
  output_path: Optional[Union[str, Path]] = None,
417
410
  ) -> Path:
418
- """Convert a directory bundle (.pltz.d, .figz.d) to a ZIP bundle (.pltz, .figz).
411
+ """Convert a directory bundle (.plot, .figure) to a ZIP bundle (.plot.zip, .figure.zip).
419
412
 
420
413
  Creates a ZIP archive from an existing directory bundle, preserving
421
414
  the internal structure. The ZIP file is created atomically using a temp file.
422
415
 
423
416
  Args:
424
- source_dir: Path to directory bundle (e.g., "panel_A.pltz.d", "figure.figz.d")
417
+ source_dir: Path to directory bundle (e.g., "panel_A.plot", "figure.figure")
425
418
  output_path: Optional output ZIP path. If not provided, derives from source_dir
426
- by replacing .pltz.d -> .pltz or .figz.d -> .figz
419
+ by appending .zip (e.g., .plot -> .plot.zip)
427
420
 
428
421
  Returns:
429
422
  Path to created ZIP bundle.
@@ -433,11 +426,11 @@ def zip_directory(
433
426
  ValueError: If source is not a valid bundle directory.
434
427
 
435
428
  Example:
436
- # Convert panel_A.pltz.d to panel_A.pltz
437
- zip_path = zip_directory("panel_A.pltz.d")
429
+ # Convert panel_A.plot to panel_A.plot.zip
430
+ zip_path = zip_directory("panel_A.plot")
438
431
 
439
432
  # Convert with custom output path
440
- zip_path = zip_directory("A.pltz.d", "output/A.pltz")
433
+ zip_path = zip_directory("A.plot", "output/A.plot.zip")
441
434
  """
442
435
  source_dir = Path(source_dir)
443
436
 
@@ -449,12 +442,9 @@ def zip_directory(
449
442
 
450
443
  if output_path is None:
451
444
  dir_name = source_dir.name
452
- if dir_name.endswith(".pltz.d"):
453
- zip_name = dir_name.replace(".pltz.d", ".pltz")
454
- elif dir_name.endswith(".figz.d"):
455
- zip_name = dir_name.replace(".figz.d", ".figz")
456
- elif dir_name.endswith(".statsz.d"):
457
- zip_name = dir_name.replace(".statsz.d", ".statsz")
445
+ # New format: .plot -> .plot.zip, .figure -> .figure.zip, .stats -> .stats.zip
446
+ if dir_name.endswith((".plot", ".figure", ".stats")):
447
+ zip_name = dir_name + ".zip"
458
448
  else:
459
449
  zip_name = dir_name + ".zip"
460
450
  output_path = source_dir.parent / zip_name
@@ -161,7 +161,7 @@ def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
161
161
 
162
162
  Examples
163
163
  --------
164
- >>> from scitex.fig.backend import validate_figure_json
164
+ >>> from scitex.canvas.backend import validate_figure_json
165
165
  >>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
166
166
  >>> validate_figure_json(fig_json)
167
167
  True
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # File: ./src/scitex/vis/model/annotations.py
3
- """Annotation JSON model for scitex.fig."""
3
+ """Annotation JSON model for scitex.canvas."""
4
4
 
5
5
  from dataclasses import asdict, dataclass, field
6
6
  from typing import Any, Dict, Optional, Tuple
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # File: ./src/scitex/vis/model/axes.py
3
- """Axes JSON model for scitex.fig."""
3
+ """Axes JSON model for scitex.canvas."""
4
4
 
5
5
  from dataclasses import asdict, dataclass, field
6
6
  from typing import Any, Dict, List, Optional
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # File: ./src/scitex/vis/model/figure.py
3
- """Figure JSON model for scitex.fig."""
3
+ """Figure JSON model for scitex.canvas."""
4
4
 
5
5
  from dataclasses import asdict, dataclass, field
6
6
  from typing import Any, Dict, List, Optional
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # File: ./src/scitex/vis/model/guides.py
3
- """Guide elements (lines, spans) JSON model for scitex.fig."""
3
+ """Guide elements (lines, spans) JSON model for scitex.canvas."""
4
4
 
5
5
  from dataclasses import asdict, dataclass, field
6
6
  from typing import Any, Dict, Optional
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env python3
2
2
  # File: ./src/scitex/vis/model/plot.py
3
- """Plot JSON model for scitex.fig."""
3
+ """Plot JSON model for scitex.canvas."""
4
4
 
5
5
  from dataclasses import asdict, dataclass, field
6
6
  from typing import Any, Dict, List, Optional
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
  # File: ./src/scitex/vis/model/styles.py
3
3
  """
4
- Style dataclasses for scitex.fig objects.
4
+ Style dataclasses for scitex.canvas objects.
5
5
 
6
6
  Separating style properties from data makes:
7
7
  - UI property panels easy to auto-generate
@@ -12,7 +12,7 @@ Provides architectural drawing style visualizations with:
12
12
  - Before/after comparison for auto-crop
13
13
 
14
14
  Usage:
15
- from scitex.fts._fig._utils import plot_layout, plot_auto_crop_comparison
15
+ from scitex.io.bundle._fig._utils import plot_layout, plot_auto_crop_comparison
16
16
 
17
17
  # Single layout visualization
18
18
  fig, ax = plot_layout(elements, canvas_size, title="My Figure")
@@ -7,7 +7,7 @@
7
7
  This module provides LaTeX export capabilities for FTS figure and table bundles.
8
8
 
9
9
  Usage:
10
- from scitex.fts._tables._latex import export_to_latex, launch_editor
10
+ from scitex.io.bundle._tables._latex import export_to_latex, launch_editor
11
11
 
12
12
  # Export a bundle to LaTeX
13
13
  result = export_to_latex(bundle)
@@ -17,7 +17,7 @@ from flask import Flask, jsonify, render_template_string, request
17
17
  from .._validator import ValidationResult, validate_latex
18
18
 
19
19
  if TYPE_CHECKING:
20
- from scitex.fts import FTS
20
+ from scitex.io.bundle import FTS
21
21
 
22
22
 
23
23
  # HTML template with CodeMirror editor
@@ -14,7 +14,7 @@ from ._table_exporter import TableExportOptions, export_table_to_latex, generate
14
14
  from ._validator import LaTeXError, ValidationResult, validate_latex
15
15
 
16
16
  if TYPE_CHECKING:
17
- from scitex.fts import FTS
17
+ from scitex.io.bundle import FTS
18
18
 
19
19
 
20
20
  @dataclass
@@ -11,7 +11,7 @@ from typing import TYPE_CHECKING, Optional
11
11
  from ._utils import escape_latex_minimal, sanitize_label
12
12
 
13
13
  if TYPE_CHECKING:
14
- from scitex.fts import FTS
14
+ from scitex.io.bundle import FTS
15
15
 
16
16
 
17
17
  @dataclass
@@ -21,7 +21,7 @@ from ._utils import (
21
21
  )
22
22
 
23
23
  if TYPE_CHECKING:
24
- from scitex.fts import FTS
24
+ from scitex.io.bundle import FTS
25
25
 
26
26
 
27
27
  # Column role to header mapping
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-07
3
+ # File: src/scitex/io/bundle/schemas/__init__.py
4
+ """SciTeX Bundle Schemas.
5
+
6
+ This module contains JSON schemas for bundle validation.
7
+ """
8
+
9
+ from pathlib import Path
10
+
11
+ __all__ = [
12
+ "SCHEMAS_DIR",
13
+ "NODE_SCHEMA",
14
+ "ENCODING_SCHEMA",
15
+ "THEME_SCHEMA",
16
+ "STATS_SCHEMA",
17
+ "DATA_INFO_SCHEMA",
18
+ "RENDER_MANIFEST_SCHEMA",
19
+ ]
20
+
21
+ SCHEMAS_DIR = Path(__file__).parent
22
+
23
+ NODE_SCHEMA = SCHEMAS_DIR / "node.schema.json"
24
+ ENCODING_SCHEMA = SCHEMAS_DIR / "encoding.schema.json"
25
+ THEME_SCHEMA = SCHEMAS_DIR / "theme.schema.json"
26
+ STATS_SCHEMA = SCHEMAS_DIR / "stats.schema.json"
27
+ DATA_INFO_SCHEMA = SCHEMAS_DIR / "data_info.schema.json"
28
+ RENDER_MANIFEST_SCHEMA = SCHEMAS_DIR / "render_manifest.schema.json"
29
+
30
+ # EOF
scitex/parallel/_run.py CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  # Time-stamp: "2024-11-14 23:12:20 (ywatanabe)"
4
3
  # File: ./scitex_repo/src/scitex/parallel/_run.py
5
4
 
@@ -65,13 +64,15 @@ def run(
65
64
  if not callable(func):
66
65
  raise ValueError("Func must be callable")
67
66
 
67
+ # Validate n_jobs before conversion: must be -1 or >= 1
68
+ if n_jobs < -1 or n_jobs == 0:
69
+ raise ValueError("n_jobs must be >= 1 or -1")
70
+
68
71
  cpu_count = multiprocessing.cpu_count()
69
- n_jobs = cpu_count if n_jobs < 0 else n_jobs
72
+ n_jobs = cpu_count if n_jobs == -1 else n_jobs
70
73
 
71
74
  if n_jobs > cpu_count:
72
75
  warnings.warn(f"n_jobs ({n_jobs}) is greater than CPU count ({cpu_count})")
73
- if n_jobs < 1:
74
- raise ValueError("n_jobs must be >= 1 or -1")
75
76
 
76
77
  results = [None] * len(args_list) # Pre-allocate list
77
78
 
scitex/path/_find.py CHANGED
@@ -1,113 +1,90 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
- # Time-stamp: "2024-11-02 19:53:58 (ywatanabe)"
4
- # File: ./scitex_repo/src/scitex/path/_find.py
5
- #!./env/bin/python3
6
- # -*- coding: utf-8 -*-
7
- # Time-stamp: "2024-04-17 09:34:43"
8
- # Author: Yusuke Watanabe (ywatanabe@scitex.ai)
9
-
10
- """
11
- This script does XYZ.
12
- """
2
+ # Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
3
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_find.py
4
+
5
+ """File and directory finding utilities."""
13
6
 
14
7
  import fnmatch
15
- import os
16
- import sys
8
+ from pathlib import Path
9
+ from typing import List, Optional, Union
17
10
 
18
- import scitex
19
11
 
12
+ def find_git_root() -> Path:
13
+ """Find the root directory of the current git repository.
20
14
 
21
- # Functions
22
- def find_git_root():
15
+ Returns
16
+ -------
17
+ Path
18
+ Path to the git repository root.
19
+ """
23
20
  import git
24
21
 
25
22
  repo = git.Repo(".", search_parent_directories=True)
26
- return repo.working_tree_dir
23
+ return Path(repo.working_tree_dir)
27
24
 
28
25
 
29
- def find_dir(root_dir, exp):
26
+ def find_dir(root_dir: Union[str, Path], exp: Union[str, List[str]]) -> List[Path]:
27
+ """Find directories matching pattern."""
30
28
  return _find(root_dir, type="d", exp=exp)
31
29
 
32
30
 
33
- def find_file(root_dir, exp):
31
+ def find_file(root_dir: Union[str, Path], exp: Union[str, List[str]]) -> List[Path]:
32
+ """Find files matching pattern."""
34
33
  return _find(root_dir, type="f", exp=exp)
35
34
 
36
35
 
37
- def _find(rootdir, type="f", exp=["*"]):
38
- """
39
- Mimicks the Unix find command.
40
-
41
- Example:
42
- # rootdir =
43
- # type = 'f' # 'f' for files, 'd' for directories, None for both
44
- # exp = '*.txt' # Pattern to match, or None to match all
45
- find('/path/to/search', "f", "*.txt")
36
+ def _find(
37
+ rootdir: Union[str, Path],
38
+ type: Optional[str] = "f",
39
+ exp: Union[str, List[str]] = "*",
40
+ ) -> List[Path]:
41
+ """Mimics the Unix find command.
42
+
43
+ Parameters
44
+ ----------
45
+ rootdir : str or Path
46
+ Root directory to search in.
47
+ type : str, optional
48
+ 'f' for files, 'd' for directories, None for both.
49
+ exp : str or list of str
50
+ Pattern(s) to match.
51
+
52
+ Returns
53
+ -------
54
+ list of Path
55
+ Matching paths.
56
+
57
+ Example
58
+ -------
59
+ >>> _find('/path/to/search', "f", "*.txt")
46
60
  """
61
+ rootdir = Path(rootdir)
47
62
  if isinstance(exp, str):
48
63
  exp = [exp]
49
64
 
65
+ exclude_keys = ["/lib/", "/env/", "/build/"]
50
66
  matches = []
51
- for _exp in exp:
52
- for root, dirs, files in os.walk(rootdir):
53
- # Depending on the type, choose the list to iterate over
54
- if type == "f": # Files only
55
- names = files
56
- elif type == "d": # Directories only
57
- names = dirs
58
- else: # All entries
59
- names = files + dirs
60
-
61
- for name in names:
62
- # Construct the full path
63
- path = os.path.join(root, name)
64
-
65
- # If an _exp is provided, use fnmatch to filter names
66
- if _exp and not fnmatch.fnmatch(name, _exp):
67
- continue
68
-
69
- # If type is set, ensure the type matches
70
- if type == "f" and not os.path.isfile(path):
71
- continue
72
- if type == "d" and not os.path.isdir(path):
73
- continue
74
-
75
- exclude_keys = ["/lib/", "/env/", "/build/"]
76
- if not any(ek in path for ek in exclude_keys):
77
- matches.append(path)
78
-
79
- # for ek in exclude_keys:
80
- # if ek in path:
81
- # path = None
82
- # break
83
-
84
- # if path is not None:
85
- # # Add the matching path to the results
86
- # matches.append(path)
87
-
88
- return matches
89
-
90
-
91
- if __name__ == "__main__":
92
- # Import matplotlib only when running as script
93
- try:
94
- import matplotlib.pyplot as plt
95
- except ImportError:
96
- plt = None
97
67
 
98
- # Start
99
- CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.session.start(sys, plt)
68
+ for _exp in exp:
69
+ for path in rootdir.rglob("*"):
70
+ # Check type
71
+ if type == "f" and not path.is_file():
72
+ continue
73
+ if type == "d" and not path.is_dir():
74
+ continue
100
75
 
101
- # (YOUR AWESOME CODE)
76
+ # Check pattern match
77
+ if _exp and not fnmatch.fnmatch(path.name, _exp):
78
+ continue
102
79
 
103
- # Close
104
- scitex.session.close(CONFIG)
80
+ # Check exclusions
81
+ path_str = str(path)
82
+ if any(ek in path_str for ek in exclude_keys):
83
+ continue
105
84
 
106
- # EOF
85
+ matches.append(path)
107
86
 
108
- """
109
- /ssh:ywatanabe@444:/home/ywatanabe/proj/entrance/scitex/path/_find.py
110
- """
87
+ return matches
111
88
 
112
89
 
113
90
  # EOF