scitex 2.10.3__py3-none-any.whl → 2.13.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 (504) hide show
  1. scitex/__init__.py +1 -4
  2. scitex/__main__.py +24 -5
  3. scitex/__version__.py +1 -1
  4. scitex/_install_guide.py +14 -2
  5. scitex/_optional_deps.py +33 -0
  6. scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
  7. scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
  8. scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
  9. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
  10. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
  11. scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
  12. scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
  13. scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
  14. scitex/ai/plt/_plot_feature_importance.py +1 -1
  15. scitex/ai/plt/_plot_learning_curve.py +1 -1
  16. scitex/ai/plt/_plot_optuna_study.py +1 -1
  17. scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
  18. scitex/ai/plt/_plot_roc_curve.py +1 -1
  19. scitex/ai/plt/_stx_conf_mat.py +1 -1
  20. scitex/ai/training/_LearningCurveLogger.py +1 -1
  21. scitex/audio/mcp_server.py +38 -8
  22. scitex/bridge/_figrecipe.py +1 -1
  23. scitex/bridge/_helpers.py +1 -1
  24. scitex/bridge/_plt_vis.py +1 -1
  25. scitex/bridge/_stats_plt.py +1 -1
  26. scitex/bridge/_stats_vis.py +2 -2
  27. scitex/browser/automation/CookieHandler.py +1 -1
  28. scitex/browser/core/BrowserMixin.py +1 -1
  29. scitex/browser/core/ChromeProfileManager.py +1 -1
  30. scitex/browser/debugging/_browser_logger.py +1 -1
  31. scitex/browser/debugging/_highlight_element.py +1 -1
  32. scitex/browser/debugging/_show_grid.py +1 -1
  33. scitex/browser/interaction/click_center.py +1 -1
  34. scitex/browser/interaction/click_with_fallbacks.py +1 -1
  35. scitex/browser/interaction/close_popups.py +1 -1
  36. scitex/browser/interaction/fill_with_fallbacks.py +1 -1
  37. scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
  38. scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
  39. scitex/browser/stealth/HumanBehavior.py +1 -1
  40. scitex/browser/stealth/StealthManager.py +1 -1
  41. scitex/{fig → canvas}/__init__.py +84 -96
  42. scitex/canvas/_mcp_handlers.py +372 -0
  43. scitex/canvas/_mcp_tool_schemas.py +219 -0
  44. scitex/{fig → canvas}/backend/_parser.py +1 -1
  45. scitex/{fig → canvas}/canvas.py +13 -14
  46. scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
  47. scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
  48. scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
  49. scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
  50. scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
  51. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
  52. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
  53. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
  54. scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
  55. scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
  56. scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
  57. scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
  58. scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
  59. scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
  60. scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
  61. scitex/{fig → canvas}/io/__init__.py +32 -38
  62. scitex/{fig → canvas}/io/_bundle.py +217 -154
  63. scitex/{fig → canvas}/io/_canvas.py +1 -1
  64. scitex/{fig → canvas}/io/_data.py +1 -1
  65. scitex/{fig → canvas}/io/_export.py +1 -1
  66. scitex/{fig → canvas}/io/_load.py +1 -1
  67. scitex/{fig → canvas}/io/_panel.py +1 -1
  68. scitex/{fig → canvas}/io/_save.py +1 -1
  69. scitex/canvas/mcp_server.py +151 -0
  70. scitex/{fig → canvas}/model/__init__.py +1 -1
  71. scitex/{fig → canvas}/model/_annotations.py +1 -1
  72. scitex/{fig → canvas}/model/_axes.py +1 -1
  73. scitex/{fig → canvas}/model/_figure.py +1 -1
  74. scitex/{fig → canvas}/model/_guides.py +1 -1
  75. scitex/{fig → canvas}/model/_plot.py +1 -1
  76. scitex/{fig → canvas}/model/_styles.py +1 -1
  77. scitex/{fig → canvas}/utils/__init__.py +1 -1
  78. scitex/capture/mcp_server.py +41 -12
  79. scitex/cli/audio.py +233 -0
  80. scitex/cli/capture.py +307 -0
  81. scitex/cli/convert.py +10 -6
  82. scitex/cli/main.py +27 -4
  83. scitex/cli/repro.py +233 -0
  84. scitex/cli/resource.py +240 -0
  85. scitex/cli/stats.py +325 -0
  86. scitex/cli/template.py +236 -0
  87. scitex/cli/tex.py +286 -0
  88. scitex/cli/web.py +11 -12
  89. scitex/dev/__init__.py +3 -0
  90. scitex/dev/_pyproject.py +405 -0
  91. scitex/dev/plt/__init__.py +2 -2
  92. scitex/dev/plt/mpl/get_dir_ax.py +1 -1
  93. scitex/dev/plt/mpl/get_signatures.py +1 -1
  94. scitex/dev/plt/mpl/get_signatures_details.py +1 -1
  95. scitex/diagram/README.md +7 -7
  96. scitex/diagram/_mcp_handlers.py +400 -0
  97. scitex/diagram/_mcp_tool_schemas.py +157 -0
  98. scitex/diagram/mcp_server.py +151 -0
  99. scitex/dsp/_demo_sig.py +51 -5
  100. scitex/dsp/_mne.py +13 -2
  101. scitex/dsp/_modulation_index.py +15 -3
  102. scitex/dsp/_pac.py +23 -5
  103. scitex/dsp/_psd.py +16 -4
  104. scitex/dsp/_resample.py +24 -4
  105. scitex/dsp/_transform.py +16 -3
  106. scitex/dsp/add_noise.py +15 -1
  107. scitex/dsp/norm.py +17 -2
  108. scitex/dsp/reference.py +17 -1
  109. scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
  110. scitex/dsp/utils/_zero_pad.py +18 -4
  111. scitex/dt/_normalize_timestamp.py +1 -1
  112. scitex/git/_session.py +1 -1
  113. scitex/io/__init__.py +7 -19
  114. scitex/io/_load.py +15 -19
  115. scitex/io/_load_modules/_canvas.py +2 -2
  116. scitex/io/_load_modules/_con.py +17 -6
  117. scitex/io/_load_modules/_eeg.py +28 -13
  118. scitex/io/_load_modules/_optuna.py +21 -63
  119. scitex/io/_load_modules/_torch.py +11 -3
  120. scitex/io/_save.py +11 -16
  121. scitex/io/_save_modules/__init__.py +6 -10
  122. scitex/io/_save_modules/_canvas.py +3 -3
  123. scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
  124. scitex/io/_save_modules/_plot_bundle.py +112 -0
  125. scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
  126. scitex/io/_save_modules/_stx_bundle.py +16 -16
  127. scitex/io/_save_modules/_torch.py +11 -3
  128. scitex/io/bundle/README.md +89 -80
  129. scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
  130. scitex/io/bundle/__init__.py +67 -35
  131. scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
  132. scitex/io/bundle/_core.py +184 -97
  133. scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
  134. scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
  135. scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
  136. scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
  137. scitex/io/bundle/_manifest.py +99 -0
  138. scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
  139. scitex/io/bundle/_nested.py +113 -100
  140. scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
  141. scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
  142. scitex/io/bundle/_types.py +41 -16
  143. scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
  144. scitex/io/bundle/_zip.py +21 -31
  145. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
  146. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
  147. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
  148. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
  149. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
  150. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
  151. scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
  152. scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
  153. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
  154. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
  155. scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
  156. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
  157. scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
  158. scitex/io/bundle/schemas/__init__.py +30 -0
  159. scitex/mcp_server.py +159 -0
  160. scitex/parallel/_run.py +5 -4
  161. scitex/path/_find.py +60 -83
  162. scitex/path/_get_module_path.py +23 -21
  163. scitex/path/_get_spath.py +6 -27
  164. scitex/path/_getsize.py +23 -9
  165. scitex/path/_increment_version.py +31 -38
  166. scitex/path/_mk_spath.py +26 -29
  167. scitex/path/_path.py +5 -12
  168. scitex/path/_split.py +27 -15
  169. scitex/path/_this_path.py +23 -9
  170. scitex/plt/_mcp_handlers.py +361 -0
  171. scitex/plt/_mcp_tool_schemas.py +169 -0
  172. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
  173. scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
  174. scitex/plt/gallery/_generate.py +76 -50
  175. scitex/plt/io/__init__.py +17 -19
  176. scitex/plt/io/_bundle.py +99 -52
  177. scitex/plt/io/_layered_bundle.py +303 -168
  178. scitex/plt/mcp_server.py +205 -0
  179. scitex/plt/utils/_csv_column_naming.py +250 -118
  180. scitex/repro/README_RandomStateManager.md +3 -3
  181. scitex/repro/_RandomStateManager.py +14 -14
  182. scitex/repro/_gen_ID.py +1 -1
  183. scitex/repro/_gen_timestamp.py +1 -1
  184. scitex/repro/_hash_array.py +4 -4
  185. scitex/schema/__init__.py +69 -73
  186. scitex/schema/_canvas.py +1 -1
  187. scitex/schema/_stats.py +2 -2
  188. scitex/scholar/__main__.py +24 -2
  189. scitex/scholar/_mcp_handlers.py +685 -0
  190. scitex/scholar/_mcp_tool_schemas.py +339 -0
  191. scitex/scholar/docs/template.py +1 -1
  192. scitex/scholar/examples/07_storage_integration.py +1 -1
  193. scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
  194. scitex/scholar/impact_factor/jcr/build_database.py +1 -1
  195. scitex/scholar/mcp_server.py +315 -0
  196. scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
  197. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
  198. scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
  199. scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
  200. scitex/scholar/storage/PaperIO.py +1 -1
  201. scitex/session/README.md +4 -4
  202. scitex/session/__init__.py +1 -1
  203. scitex/session/_decorator.py +9 -9
  204. scitex/session/_lifecycle.py +5 -5
  205. scitex/session/template.py +1 -1
  206. scitex/stats/__init__.py +30 -33
  207. scitex/stats/__main__.py +281 -0
  208. scitex/stats/_mcp_handlers.py +1191 -0
  209. scitex/stats/_mcp_tool_schemas.py +384 -0
  210. scitex/stats/_schema.py +1 -1
  211. scitex/stats/correct/_correct_bonferroni.py +1 -1
  212. scitex/stats/correct/_correct_fdr.py +1 -1
  213. scitex/stats/correct/_correct_fdr_.py +1 -1
  214. scitex/stats/correct/_correct_holm.py +1 -1
  215. scitex/stats/correct/_correct_sidak.py +1 -1
  216. scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
  217. scitex/stats/effect_sizes/_cohens_d.py +1 -1
  218. scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
  219. scitex/stats/effect_sizes/_eta_squared.py +1 -1
  220. scitex/stats/effect_sizes/_prob_superiority.py +1 -1
  221. scitex/stats/io/__init__.py +10 -11
  222. scitex/stats/io/_bundle.py +16 -16
  223. scitex/stats/mcp_server.py +405 -0
  224. scitex/stats/posthoc/_dunnett.py +1 -1
  225. scitex/stats/posthoc/_games_howell.py +1 -1
  226. scitex/stats/posthoc/_tukey_hsd.py +1 -1
  227. scitex/stats/power/_power.py +1 -1
  228. scitex/stats/utils/_effect_size.py +1 -1
  229. scitex/stats/utils/_formatters.py +1 -1
  230. scitex/stats/utils/_power.py +1 -1
  231. scitex/template/_mcp_handlers.py +259 -0
  232. scitex/template/_mcp_tool_schemas.py +112 -0
  233. scitex/template/mcp_server.py +186 -0
  234. scitex/utils/_verify_scitex_format.py +2 -2
  235. scitex/utils/template.py +1 -1
  236. scitex/web/__init__.py +12 -11
  237. scitex/web/_scraping.py +26 -265
  238. scitex/web/download_images.py +316 -0
  239. scitex/writer/Writer.py +1 -1
  240. scitex/writer/_clone_writer_project.py +1 -1
  241. scitex/writer/_validate_tree_structures.py +1 -1
  242. scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
  243. scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
  244. scitex/writer/dataclasses/core/_Document.py +1 -1
  245. scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
  246. scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
  247. scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
  248. scitex/writer/utils/.legacy_git_retry.py +7 -5
  249. scitex/writer/utils/_parse_latex_logs.py +1 -1
  250. scitex-2.13.0.dist-info/METADATA +1231 -0
  251. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
  252. scitex-2.13.0.dist-info/entry_points.txt +11 -0
  253. scitex/fig/editor/_defaults.py +0 -300
  254. scitex/fig/editor/edit/panel_loader.py +0 -232
  255. scitex/fig/editor/flask_editor/_bbox.py +0 -1299
  256. scitex/fig/editor/flask_editor/_core.py +0 -1429
  257. scitex/fig/editor/flask_editor/_renderer.py +0 -813
  258. scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
  259. scitex/fts/README.md +0 -262
  260. scitex/fts/TODO.md +0 -66
  261. scitex/fts/__init__.py +0 -90
  262. scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
  263. scitex/fts/_bundle/__init__.py +0 -38
  264. scitex/fts/_bundle/_utils/__init__.py +0 -55
  265. scitex/fts/_bundle/_utils/_const.py +0 -26
  266. scitex/fts/_bundle/_utils/_errors.py +0 -73
  267. scitex/fts/_bundle/_utils/_generate.py +0 -21
  268. scitex/fts/_bundle/_utils/_types.py +0 -76
  269. scitex/fts/_bundle/_zipbundle.py +0 -165
  270. scitex/fts/_fig/__init__.py +0 -22
  271. scitex/fts/_fig/_backend/_parser.py +0 -188
  272. scitex/fts/_fig/_editor/__init__.py +0 -14
  273. scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
  274. scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
  275. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
  276. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
  277. scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
  278. scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
  279. scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
  280. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
  281. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
  282. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
  283. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
  284. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
  285. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
  286. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
  287. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
  288. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
  289. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
  290. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
  291. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
  292. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
  293. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
  294. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
  295. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
  296. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
  297. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
  298. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
  299. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
  300. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
  328. scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
  329. scitex/fts/_fig/_models/_Annotations.py +0 -115
  330. scitex/fts/_fig/_models/_Axes.py +0 -152
  331. scitex/fts/_fig/_models/_Figure.py +0 -138
  332. scitex/fts/_fig/_models/_Plot.py +0 -123
  333. scitex/fts/_fig/_utils/_plot_layout.py +0 -397
  334. scitex/fts/_kinds/_figure/_composite.py +0 -345
  335. scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
  336. scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
  337. scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
  338. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
  339. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
  340. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
  341. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
  342. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
  343. scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
  344. scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
  345. scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
  346. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
  347. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
  348. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
  349. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
  350. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
  351. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
  352. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
  353. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
  354. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
  355. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
  356. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
  357. scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
  358. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
  359. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
  360. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
  361. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
  362. scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
  363. scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
  364. scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
  365. scitex/fts/_kinds/_table/_latex/_export.py +0 -279
  366. scitex/fts/_stats/__init__.py +0 -48
  367. scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
  368. scitex/fts/_stats/_dataclasses/__init__.py +0 -48
  369. scitex/fts/_tables/__init__.py +0 -65
  370. scitex/fts/_tables/_latex/__init__.py +0 -93
  371. scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
  372. scitex/fts/_tables/_latex/_editor/_app.py +0 -725
  373. scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
  374. scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
  375. scitex/fts/_tables/_latex/_table_exporter.py +0 -362
  376. scitex/fts/_tables/_latex/_utils.py +0 -369
  377. scitex/fts/_tables/_latex/_validator.py +0 -445
  378. scitex/io/_save_modules/_pltz_bundle.py +0 -356
  379. scitex-2.10.3.dist-info/METADATA +0 -952
  380. scitex-2.10.3.dist-info/entry_points.txt +0 -2
  381. /scitex/{fig → canvas}/README.md +0 -0
  382. /scitex/{fig → canvas}/backend/__init__.py +0 -0
  383. /scitex/{fig → canvas}/backend/_export.py +0 -0
  384. /scitex/{fig → canvas}/backend/_render.py +0 -0
  385. /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
  386. /scitex/{fig → canvas}/editor/__init__.py +0 -0
  387. /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
  388. /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
  389. /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
  390. /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
  391. /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
  392. /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
  393. /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
  394. /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
  395. /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
  396. /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
  397. /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
  398. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
  399. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
  400. /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
  401. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
  402. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
  403. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
  404. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
  405. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
  406. /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
  407. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
  408. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
  409. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
  410. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
  411. /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
  412. /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
  413. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
  414. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
  415. /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
  416. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
  417. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
  418. /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
  419. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
  420. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
  421. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
  422. /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
  423. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
  424. /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
  425. /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
  426. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
  427. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
  428. /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
  429. /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
  430. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
  431. /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
  432. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
  433. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
  434. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
  435. /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
  436. /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
  437. /scitex/{fig → canvas}/io/_directory.py +0 -0
  438. /scitex/{fig → canvas}/model/_plot_types.py +0 -0
  439. /scitex/{fig → canvas}/utils/_defaults.py +0 -0
  440. /scitex/{fig → canvas}/utils/_validate.py +0 -0
  441. /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
  442. /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
  443. /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
  444. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
  445. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
  446. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
  447. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
  448. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
  449. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
  450. /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
  451. /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
  452. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
  453. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
  454. /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
  455. /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
  456. /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
  457. /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
  458. /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
  459. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
  460. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
  461. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
  462. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
  463. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
  464. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
  465. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
  466. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
  467. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
  468. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
  469. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
  470. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
  471. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
  472. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
  473. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
  474. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
  475. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
  476. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
  477. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
  478. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
  479. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
  480. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
  481. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
  482. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
  483. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
  484. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
  485. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
  486. /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
  487. /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
  488. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
  489. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
  490. /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
  491. /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
  492. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
  493. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
  494. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
  495. /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
  496. /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
  497. /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
  498. /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
  499. /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
  500. /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
  501. /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
  502. /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
  503. {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
  504. {scitex-2.10.3.dist-info → scitex-2.13.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