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
scitex/__init__.py CHANGED
@@ -164,10 +164,7 @@ cloud = _LazyModule("cloud")
164
164
  config = _LazyModule("config")
165
165
  audio = _LazyModule("audio")
166
166
  msword = _LazyModule("msword")
167
- fts = _LazyModule(
168
- "fts"
169
- ) # Figure-Table-Statistics - single source of truth for bundle schemas
170
- fsb = fts # Legacy alias (FSB -> FTS)
167
+ fts = _LazyModule("fts") # Bundle schemas module
171
168
 
172
169
  # Centralized path configuration - eager loaded for convenience
173
170
  # Usage: scitex.PATHS.logs, scitex.PATHS.cache, etc.
scitex/__main__.py CHANGED
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  """
4
3
  SciTeX Package Entry Point
5
4
 
@@ -9,16 +8,36 @@ Allows running: python -m scitex [command]
9
8
  import sys
10
9
 
11
10
 
11
+ def _check_cli_dependencies():
12
+ """Check CLI dependencies and return missing ones."""
13
+ missing = []
14
+ try:
15
+ import click
16
+ except ImportError:
17
+ missing.append(("click", "pip install click"))
18
+ return missing
19
+
20
+
12
21
  def main():
13
22
  """Main entry point for scitex CLI"""
23
+ # Check dependencies first
24
+ missing = _check_cli_dependencies()
25
+ if missing:
26
+ print("SciTeX CLI missing dependencies:")
27
+ for pkg, install in missing:
28
+ print(f" - {pkg}: {install}")
29
+ print("\nOr install all CLI deps: pip install scitex[cli]")
30
+ sys.exit(1)
31
+
14
32
  try:
15
33
  from scitex.cli.main import cli
16
34
 
17
35
  cli()
18
- except ImportError:
19
- # CLI not available (click not installed)
20
- print("SciTeX CLI requires 'click' package")
21
- print("Install: pip install click")
36
+ except ImportError as e:
37
+ print(f"SciTeX CLI import error: {e}")
38
+ import traceback
39
+
40
+ traceback.print_exc()
22
41
  sys.exit(1)
23
42
 
24
43
 
scitex/__version__.py CHANGED
@@ -8,6 +8,6 @@ __FILE__ = "./src/scitex/__version__.py"
8
8
  __DIR__ = os.path.dirname(__FILE__)
9
9
  # ----------------------------------------
10
10
 
11
- __version__ = "2.10.3"
11
+ __version__ = "2.12.0"
12
12
 
13
13
  # EOF
scitex/_install_guide.py CHANGED
@@ -16,33 +16,45 @@ from ._optional_deps import PACKAGE_TO_EXTRA, check_optional_deps
16
16
  F = TypeVar("F", bound=Callable[..., Any])
17
17
 
18
18
  # Module name -> (required_packages, extra_name, description)
19
+ # Synced with pyproject.toml [project.optional-dependencies]
19
20
  MODULE_REQUIREMENTS: Dict[str, Tuple[List[str], str, str]] = {
20
21
  "ai": (["openai", "anthropic"], "ai", "LLM APIs"),
21
22
  "audio": (["pyttsx3", "gtts"], "audio", "Text-to-Speech"),
22
23
  "benchmark": (["psutil"], "benchmark", "Performance Monitoring"),
24
+ "bridge": (["matplotlib", "scipy"], "bridge", "External System Integration"),
23
25
  "browser": (["playwright"], "browser", "Web Automation"),
24
26
  "capture": (["mss", "PIL"], "capture", "Screenshot Capture"),
25
27
  "cli": (["click"], "cli", "Command Line Interface"),
28
+ "cloud": (["matplotlib"], "cloud", "Cloud Service Integration"),
29
+ "config": (["pyyaml"], "config", "Configuration Management"),
26
30
  "db": (["sqlalchemy"], "db", "Database"),
27
31
  "decorators": (["joblib"], "decorators", "Caching Utilities"),
32
+ "devtools": (["joblib", "ruamel.yaml"], "devtools", "Development Tools"),
33
+ "diagram": (["pyyaml"], "diagram", "Diagram Generation"),
28
34
  "dsp": (["scipy", "sounddevice"], "dsp", "Signal Processing"),
29
- "fts": (["matplotlib", "PIL", "flask"], "fts", "Figures/Tables/Stats"),
35
+ "dt": (["matplotlib"], "dt", "Date/Time Utilities"),
30
36
  "gen": (["IPython", "h5py"], "gen", "General Utilities"),
31
37
  "git": (["git"], "git", "Git Operations"),
32
38
  "io": (["h5py", "openpyxl"], "io", "File I/O"),
33
39
  "linalg": (["scipy", "sympy"], "linalg", "Linear Algebra"),
40
+ "logging": (["matplotlib"], "logging", "Enhanced Logging"),
34
41
  "msword": (["docx"], "msword", "MS Word"),
35
- "neuro": (["mne"], "neuro", "Neuroscience"),
36
42
  "nn": (["torch"], "nn", "Neural Networks"),
43
+ "parallel": (["tqdm"], "parallel", "Parallel Processing"),
37
44
  "path": (["git"], "path", "Path Utilities"),
45
+ "pd": (["xarray"], "pd", "Pandas Utilities"),
38
46
  "plt": (["matplotlib", "seaborn"], "plt", "Plotting"),
39
47
  "repro": (["torch"], "repro", "Reproducibility"),
40
48
  "resource": (["psutil"], "resource", "Resource Monitoring"),
41
49
  "scholar": (["selenium", "bs4", "playwright"], "scholar", "Paper Management"),
50
+ "session": (["matplotlib", "pyyaml"], "session", "Session Management"),
51
+ "sh": (["matplotlib"], "sh", "Shell Utilities"),
42
52
  "stats": (["scipy", "statsmodels"], "stats", "Statistical Analysis"),
43
53
  "str": (["natsort"], "str", "String Utilities"),
54
+ "tex": (["matplotlib"], "tex", "LaTeX Utilities"),
44
55
  "torch": (["torch"], "torch", "PyTorch Support"),
45
56
  "types": (["xarray"], "types", "Type Utilities"),
57
+ "utils": (["h5py", "natsort"], "utils", "General Utilities"),
46
58
  "web": (["aiohttp", "bs4"], "web", "Web Utilities"),
47
59
  "writer": (["yq"], "writer", "Academic Writing"),
48
60
  }
scitex/_optional_deps.py CHANGED
@@ -38,6 +38,8 @@ PACKAGE_TO_EXTRA: Dict[str, tuple] = {
38
38
  "mss": ("mss", "capture"),
39
39
  # CLI Module
40
40
  "click": ("click", "cli"),
41
+ # MCP Module (Model Context Protocol)
42
+ "mcp": ("mcp", "mcp"),
41
43
  # DB Module
42
44
  "sqlalchemy": ("sqlalchemy", "db"),
43
45
  "psycopg2": ("psycopg2-binary", "db"),
@@ -297,4 +299,35 @@ def has_plotting() -> bool:
297
299
  return check_optional_deps("matplotlib")["matplotlib"]
298
300
 
299
301
 
302
+ def has_mcp() -> bool:
303
+ """Check if MCP (Model Context Protocol) dependencies are available."""
304
+ return check_optional_deps("mcp")["mcp"]
305
+
306
+
307
+ def check_mcp_deps(server_name: str = "scitex") -> None:
308
+ """
309
+ Check MCP dependencies and exit with helpful message if missing.
310
+
311
+ Use at the start of MCP server main() functions for graceful handling.
312
+
313
+ Args:
314
+ server_name: Name of the MCP server for error messages
315
+ """
316
+ import sys
317
+
318
+ try:
319
+ import mcp # noqa: F401
320
+ except ImportError:
321
+ print(f"{'=' * 60}")
322
+ print(f"MCP Server '{server_name}' requires the 'mcp' package.")
323
+ print()
324
+ print("Install with:")
325
+ print(" pip install mcp")
326
+ print()
327
+ print("Or install scitex with MCP support:")
328
+ print(" pip install scitex[mcp]")
329
+ print(f"{'=' * 60}")
330
+ sys.exit(1)
331
+
332
+
300
333
  # EOF
@@ -731,7 +731,7 @@ def run_main():
731
731
 
732
732
  args = parse_args()
733
733
 
734
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
734
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
735
735
  sys,
736
736
  plt,
737
737
  args=args,
@@ -101,7 +101,7 @@ class TimeSeriesBlockingSplit(BaseCrossValidator):
101
101
  self.test_ratio = test_ratio
102
102
  self.val_ratio = val_ratio
103
103
  self.random_state = random_state
104
- self.rng_manager = np.random.default_rng(random_state)
104
+ self.rng = np.random.default_rng(random_state)
105
105
 
106
106
  def split(
107
107
  self,
@@ -616,7 +616,7 @@ def run_main() -> None:
616
616
 
617
617
  args = parse_args()
618
618
 
619
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
619
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
620
620
  sys,
621
621
  plt,
622
622
  args=args,
@@ -110,7 +110,7 @@ class TimeSeriesCalendarSplit(BaseCrossValidator):
110
110
  self.gap_intervals = gap_intervals
111
111
  self.step_intervals = step_intervals
112
112
  self.random_state = random_state
113
- self.rng_manager = np.random.default_rng(random_state)
113
+ self.rng = np.random.default_rng(random_state)
114
114
 
115
115
  def split(
116
116
  self,
@@ -705,7 +705,7 @@ def run_main() -> None:
705
705
 
706
706
  args = parse_args()
707
707
 
708
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
708
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
709
709
  sys,
710
710
  plt,
711
711
  args=args,
@@ -151,7 +151,7 @@ class TimeSeriesSlidingWindowSplit(BaseCrossValidator):
151
151
  self.gap = gap
152
152
  self.val_ratio = val_ratio
153
153
  self.random_state = random_state
154
- self.rng_manager = np.random.default_rng(random_state)
154
+ self.rng = np.random.default_rng(random_state)
155
155
  self.overlapping_tests = overlapping_tests
156
156
  self.expanding_window = expanding_window
157
157
  self.undersample = undersample
@@ -1613,7 +1613,7 @@ def run_main() -> None:
1613
1613
 
1614
1614
  args = parse_args()
1615
1615
 
1616
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
1616
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
1617
1617
  sys,
1618
1618
  plt,
1619
1619
  args=args,
@@ -121,7 +121,7 @@ class TimeSeriesSlidingWindowSplit(BaseCrossValidator):
121
121
  self.gap = gap
122
122
  self.val_ratio = val_ratio
123
123
  self.random_state = random_state
124
- self.rng_manager = np.random.default_rng(random_state)
124
+ self.rng = np.random.default_rng(random_state)
125
125
  self.overlapping_tests = overlapping_tests
126
126
  self.expanding_window = expanding_window
127
127
  self.undersample = undersample
@@ -1582,7 +1582,7 @@ def run_main() -> None:
1582
1582
 
1583
1583
  args = parse_args()
1584
1584
 
1585
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
1585
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
1586
1586
  sys,
1587
1587
  plt,
1588
1588
  args=args,
@@ -97,7 +97,7 @@ class TimeSeriesStratifiedSplit(BaseCrossValidator):
97
97
  self.gap = gap
98
98
  self.stratify = stratify
99
99
  self.random_state = random_state
100
- self.rng_manager = np.random.default_rng(random_state)
100
+ self.rng = np.random.default_rng(random_state)
101
101
 
102
102
  def split(
103
103
  self,
@@ -670,7 +670,7 @@ def run_main() -> None:
670
670
 
671
671
  args = parse_args()
672
672
 
673
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
673
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
674
674
  sys,
675
675
  plt,
676
676
  args=args,
@@ -412,7 +412,7 @@ def run_main() -> None:
412
412
 
413
413
  args = parse_args()
414
414
 
415
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
415
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
416
416
  sys,
417
417
  plt,
418
418
  args=args,
@@ -478,7 +478,7 @@ def run_main():
478
478
 
479
479
  args = parse_args()
480
480
 
481
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
481
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
482
482
  sys,
483
483
  plt,
484
484
  args=args,
@@ -294,7 +294,7 @@ def run_main():
294
294
 
295
295
  args = parse_args()
296
296
 
297
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
297
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
298
298
  sys,
299
299
  plt,
300
300
  args=args,
@@ -303,7 +303,7 @@ def run_main() -> None:
303
303
 
304
304
  args = parse_args()
305
305
 
306
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
306
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
307
307
  sys,
308
308
  plt,
309
309
  args=args,
@@ -195,7 +195,7 @@ def run_main() -> None:
195
195
 
196
196
  args = parse_args()
197
197
 
198
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
198
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
199
199
  sys,
200
200
  plt,
201
201
  args=args,
@@ -257,7 +257,7 @@ def run_main() -> None:
257
257
 
258
258
  args = parse_args()
259
259
 
260
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
260
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
261
261
  sys,
262
262
  plt,
263
263
  args=args,
@@ -222,7 +222,7 @@ def run_main() -> None:
222
222
 
223
223
  args = parse_args()
224
224
 
225
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
225
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
226
226
  sys,
227
227
  plt,
228
228
  args=args,
@@ -336,7 +336,7 @@ def run_main() -> None:
336
336
 
337
337
  args = parse_args()
338
338
 
339
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
339
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
340
340
  sys,
341
341
  plt,
342
342
  args=args,
@@ -525,7 +525,7 @@ def run_main() -> None:
525
525
 
526
526
  args = parse_args()
527
527
 
528
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
528
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
529
529
  sys,
530
530
  plt,
531
531
  args=args,
@@ -20,12 +20,23 @@ from dataclasses import dataclass, field
20
20
  from datetime import datetime
21
21
  from pathlib import Path
22
22
 
23
- import mcp.types as types
24
- from mcp.server import NotificationOptions, Server
25
- from mcp.server.models import InitializationOptions
26
- from mcp.server.stdio import stdio_server
23
+ # Graceful MCP dependency handling
24
+ try:
25
+ import mcp.types as types
26
+ from mcp.server import NotificationOptions, Server
27
+ from mcp.server.models import InitializationOptions
28
+ from mcp.server.stdio import stdio_server
27
29
 
28
- __all__ = ["AudioServer", "main"]
30
+ MCP_AVAILABLE = True
31
+ except ImportError:
32
+ MCP_AVAILABLE = False
33
+ types = None # type: ignore
34
+ Server = None # type: ignore
35
+ NotificationOptions = None # type: ignore
36
+ InitializationOptions = None # type: ignore
37
+ stdio_server = None # type: ignore
38
+
39
+ __all__ = ["AudioServer", "main", "MCP_AVAILABLE"]
29
40
 
30
41
 
31
42
  @dataclass
@@ -373,8 +384,8 @@ class AudioServer:
373
384
  return {"success": False, "error": str(e)}
374
385
 
375
386
 
376
- async def main():
377
- """Main entry point for the MCP server."""
387
+ async def _run_server():
388
+ """Run the MCP server (internal)."""
378
389
  server = AudioServer()
379
390
  async with stdio_server() as (read_stream, write_stream):
380
391
  await server.server.run(
@@ -391,8 +402,27 @@ async def main():
391
402
  )
392
403
 
393
404
 
405
+ def main():
406
+ """Main entry point for the MCP server."""
407
+ if not MCP_AVAILABLE:
408
+ import sys
409
+
410
+ print("=" * 60)
411
+ print("MCP Server 'scitex-audio' requires the 'mcp' package.")
412
+ print()
413
+ print("Install with:")
414
+ print(" pip install mcp")
415
+ print()
416
+ print("Or install scitex with MCP support:")
417
+ print(" pip install scitex[mcp]")
418
+ print("=" * 60)
419
+ sys.exit(1)
420
+
421
+ asyncio.run(_run_server())
422
+
423
+
394
424
  if __name__ == "__main__":
395
- asyncio.run(main())
425
+ main()
396
426
 
397
427
 
398
428
  # EOF
@@ -63,7 +63,7 @@ def save_with_recipe(
63
63
  dict
64
64
  Paths to saved files: {'image': Path, 'csv': Path, 'recipe': Path}
65
65
  """
66
- from scitex.fts._bundle._storage import get_storage
66
+ from scitex.io.bundle._bundle._storage import get_storage
67
67
 
68
68
  path = Path(path)
69
69
  result = {}
scitex/bridge/_helpers.py CHANGED
@@ -118,7 +118,7 @@ def _detect_backend(target) -> Literal["plt", "vis"]:
118
118
  """
119
119
  # Check for vis FigureModel
120
120
  try:
121
- from scitex.fig.model import FigureModel
121
+ from scitex.canvas.model import FigureModel
122
122
  if isinstance(target, FigureModel):
123
123
  return "vis"
124
124
  except ImportError:
scitex/bridge/_plt_vis.py CHANGED
@@ -16,7 +16,7 @@ import warnings
16
16
 
17
17
  # Legacy model imports - may not be available (deleted module)
18
18
  try:
19
- from scitex.fig.model import (
19
+ from scitex.canvas.model import (
20
20
  FigureModel,
21
21
  AxesModel,
22
22
  PlotModel,
@@ -29,7 +29,7 @@ from typing import Optional, Dict, Any, Union, List
29
29
  import warnings
30
30
 
31
31
  # Import GUI classes from FTS (single source of truth)
32
- from scitex.fts._stats import Position
32
+ from scitex.io.bundle._stats import Position
33
33
 
34
34
  # StatResult is now a dict - the GUI-specific StatResult is deprecated
35
35
  StatResult = dict
@@ -27,11 +27,11 @@ When bridging between plt and vis, coordinate transformation may be needed.
27
27
  from typing import Optional, Dict, Any, List, Tuple
28
28
 
29
29
  # Import GUI classes from FTS (single source of truth)
30
- from scitex.fts._stats import Position, StatPositioning
30
+ from scitex.io.bundle._stats import Position, StatPositioning
31
31
 
32
32
  # Legacy model imports - may not be available
33
33
  try:
34
- from scitex.fig.model import AnnotationModel, FigureModel, AxesModel, TextStyle
34
+ from scitex.canvas.model import AnnotationModel, FigureModel, AxesModel, TextStyle
35
35
  VIS_MODEL_AVAILABLE = True
36
36
  except ImportError:
37
37
  AnnotationModel = None
@@ -186,7 +186,7 @@ def run_main() -> None:
186
186
 
187
187
  args = parse_args()
188
188
 
189
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
189
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
190
190
  sys,
191
191
  plt,
192
192
  args=args,
@@ -292,7 +292,7 @@ def run_main() -> None:
292
292
 
293
293
  args = parse_args()
294
294
 
295
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
295
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
296
296
  sys,
297
297
  plt,
298
298
  args=args,
@@ -402,7 +402,7 @@ def run_main() -> None:
402
402
 
403
403
  args = parse_args()
404
404
 
405
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
405
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
406
406
  sys,
407
407
  plt,
408
408
  args=args,
@@ -620,7 +620,7 @@ def run_main() -> None:
620
620
 
621
621
  args = parse_args()
622
622
 
623
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
623
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
624
624
  sys,
625
625
  plt,
626
626
  args=args,
@@ -125,7 +125,7 @@ def run_main() -> None:
125
125
 
126
126
  args = parse_args()
127
127
 
128
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
128
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
129
129
  sys,
130
130
  plt,
131
131
  args=args,
@@ -126,7 +126,7 @@ def run_main() -> None:
126
126
 
127
127
  args = parse_args()
128
128
 
129
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
129
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
130
130
  sys,
131
131
  plt,
132
132
  args=args,
@@ -121,7 +121,7 @@ def run_main() -> None:
121
121
 
122
122
  args = parse_args()
123
123
 
124
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
124
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
125
125
  sys,
126
126
  plt,
127
127
  args=args,
@@ -174,7 +174,7 @@ def run_main() -> None:
174
174
 
175
175
  args = parse_args()
176
176
 
177
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
177
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
178
178
  sys,
179
179
  plt,
180
180
  args=args,
@@ -482,7 +482,7 @@ def run_main() -> None:
482
482
 
483
483
  args = parse_args()
484
484
 
485
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
485
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
486
486
  sys,
487
487
  plt,
488
488
  args=args,
@@ -180,7 +180,7 @@ def run_main() -> None:
180
180
 
181
181
  args = parse_args()
182
182
 
183
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
183
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
184
184
  sys,
185
185
  plt,
186
186
  args=args,
@@ -174,7 +174,7 @@ def run_main() -> None:
174
174
 
175
175
  args = parse_args()
176
176
 
177
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
177
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
178
178
  sys,
179
179
  plt,
180
180
  args=args,
@@ -166,7 +166,7 @@ def run_main() -> None:
166
166
 
167
167
  args = parse_args()
168
168
 
169
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
169
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
170
170
  sys,
171
171
  plt,
172
172
  args=args,
@@ -310,7 +310,7 @@ def run_main() -> None:
310
310
 
311
311
  args = parse_args()
312
312
 
313
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
313
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
314
314
  sys,
315
315
  plt,
316
316
  args=args,
@@ -964,7 +964,7 @@ def run_main() -> None:
964
964
 
965
965
  args = parse_args()
966
966
 
967
- CONFIG, sys.stdout, sys.stderr, plt, CC, rng_manager = stx.session.start(
967
+ CONFIG, sys.stdout, sys.stderr, plt, CC, rng = stx.session.start(
968
968
  sys,
969
969
  plt,
970
970
  args=args,