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/cli/template.py ADDED
@@ -0,0 +1,236 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SciTeX CLI - Template Commands (Project Scaffolding)
4
+
5
+ Provides project template cloning and management.
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ import click
12
+
13
+
14
+ @click.group(context_settings={"help_option_names": ["-h", "--help"]})
15
+ def template():
16
+ """
17
+ Project template scaffolding
18
+
19
+ \b
20
+ Available templates:
21
+ research - Full scientific workflow structure
22
+ pip-project - Pip-installable Python package
23
+ singularity - Container-based project
24
+ paper - Academic paper writing template
25
+
26
+ \b
27
+ Examples:
28
+ scitex template list # Show available templates
29
+ scitex template clone research ./my-project # Clone research template
30
+ scitex template clone pip-project ./my-pkg # Clone package template
31
+ """
32
+ pass
33
+
34
+
35
+ @template.command(name="list")
36
+ @click.option("--json", "as_json", is_flag=True, help="Output as JSON")
37
+ def list_templates(as_json):
38
+ """
39
+ List available project templates
40
+
41
+ \b
42
+ Example:
43
+ scitex template list
44
+ scitex template list --json
45
+ """
46
+ try:
47
+ from scitex.template import get_available_templates_info
48
+
49
+ templates = get_available_templates_info()
50
+
51
+ if as_json:
52
+ import json
53
+
54
+ click.echo(json.dumps(templates, indent=2))
55
+ else:
56
+ click.secho("Available SciTeX Templates", fg="cyan", bold=True)
57
+ click.echo("=" * 60)
58
+
59
+ for tmpl in templates:
60
+ click.echo()
61
+ click.secho(f"{tmpl['name']} ({tmpl['id']})", fg="green", bold=True)
62
+ click.echo(f" {tmpl['description']}")
63
+ click.echo(f" Use case: {tmpl['use_case']}")
64
+ click.echo(f" GitHub: {tmpl['github_url']}")
65
+ if tmpl.get("features"):
66
+ click.echo(" Features:")
67
+ for feature in tmpl["features"][:3]: # Show first 3
68
+ click.echo(f" - {feature}")
69
+
70
+ except Exception as e:
71
+ click.secho(f"Error: {e}", fg="red", err=True)
72
+ sys.exit(1)
73
+
74
+
75
+ @template.command()
76
+ @click.argument(
77
+ "template_type",
78
+ type=click.Choice(["research", "pip-project", "singularity", "paper"]),
79
+ )
80
+ @click.argument("destination", type=click.Path())
81
+ @click.option(
82
+ "--git-strategy",
83
+ "-g",
84
+ type=click.Choice(["child", "parent", "origin", "none"]),
85
+ default="child",
86
+ help="Git initialization strategy (default: child)",
87
+ )
88
+ @click.option("--branch", "-b", help="Specific branch to clone")
89
+ @click.option("--tag", "-t", help="Specific tag/release to clone")
90
+ def clone(template_type, destination, git_strategy, branch, tag):
91
+ """
92
+ Clone a project template
93
+
94
+ \b
95
+ Template Types:
96
+ research - Full scientific workflow (scripts, data, docs, results)
97
+ pip-project - Python package (src, tests, docs, CI/CD)
98
+ singularity - Container-based (definition files, build scripts)
99
+ paper - Academic paper (LaTeX, BibTeX, figures)
100
+
101
+ \b
102
+ Git Strategies:
103
+ child - Create isolated git in project directory (default)
104
+ parent - Use parent git repository
105
+ origin - Preserve template's original git history
106
+ none - Disable git initialization
107
+
108
+ \b
109
+ Examples:
110
+ scitex template clone research ./my-research
111
+ scitex template clone pip-project ./my-package --git-strategy parent
112
+ scitex template clone paper ./manuscript --branch develop
113
+ """
114
+ try:
115
+ # Validate mutual exclusivity
116
+ if branch and tag:
117
+ click.echo("Error: Cannot specify both --branch and --tag", err=True)
118
+ sys.exit(1)
119
+
120
+ # Convert git_strategy 'none' to None
121
+ if git_strategy == "none":
122
+ git_strategy = None
123
+
124
+ # Map template types to clone functions
125
+ clone_funcs = {
126
+ "research": "clone_research",
127
+ "pip-project": "clone_pip_project",
128
+ "singularity": "clone_singularity",
129
+ "paper": "clone_writer_directory",
130
+ }
131
+
132
+ func_name = clone_funcs[template_type]
133
+
134
+ # Import the appropriate function
135
+ from scitex import template as tmpl_module
136
+
137
+ clone_func = getattr(tmpl_module, func_name)
138
+
139
+ click.echo(f"Cloning {template_type} template to {destination}...")
140
+
141
+ # Call clone function
142
+ kwargs = {"path": destination}
143
+ if git_strategy is not None:
144
+ kwargs["git_strategy"] = git_strategy
145
+ if branch:
146
+ kwargs["branch"] = branch
147
+ if tag:
148
+ kwargs["tag"] = tag
149
+
150
+ result = clone_func(**kwargs)
151
+
152
+ if result:
153
+ dest_path = Path(destination).absolute()
154
+ click.secho("Successfully cloned template!", fg="green")
155
+ click.echo()
156
+ click.echo(f"Location: {dest_path}")
157
+ click.echo()
158
+ click.echo("Next steps:")
159
+ click.echo(f" cd {destination}")
160
+
161
+ if template_type == "research":
162
+ click.echo(" # Start your research project")
163
+ click.echo(" # Edit scripts/, data/, docs/")
164
+ elif template_type == "pip-project":
165
+ click.echo(" # Develop your package")
166
+ click.echo(" pip install -e .")
167
+ click.echo(" pytest")
168
+ elif template_type == "singularity":
169
+ click.echo(" # Build your container")
170
+ click.echo(" singularity build container.sif Singularity.def")
171
+ elif template_type == "paper":
172
+ click.echo(" # Write your paper")
173
+ click.echo(" scitex writer compile manuscript")
174
+ else:
175
+ click.secho("Failed to clone template", fg="red", err=True)
176
+ sys.exit(1)
177
+
178
+ except Exception as e:
179
+ click.secho(f"Error: {e}", fg="red", err=True)
180
+ sys.exit(1)
181
+
182
+
183
+ @template.command()
184
+ @click.argument("template_id")
185
+ def info(template_id):
186
+ """
187
+ Show detailed information about a template
188
+
189
+ \b
190
+ Example:
191
+ scitex template info research
192
+ scitex template info pip-project
193
+ """
194
+ try:
195
+ from scitex.template import get_available_templates_info
196
+
197
+ templates = get_available_templates_info()
198
+
199
+ # Find matching template
200
+ template_info = None
201
+ for tmpl in templates:
202
+ if tmpl["id"] == template_id or tmpl["name"].lower() == template_id.lower():
203
+ template_info = tmpl
204
+ break
205
+
206
+ if not template_info:
207
+ click.secho(f"Template '{template_id}' not found", fg="red", err=True)
208
+ click.echo("Available templates:")
209
+ for tmpl in templates:
210
+ click.echo(f" - {tmpl['id']}")
211
+ sys.exit(1)
212
+
213
+ click.secho(f"Template: {template_info['name']}", fg="cyan", bold=True)
214
+ click.echo("=" * 50)
215
+ click.echo()
216
+ click.echo(f"ID: {template_info['id']}")
217
+ click.echo(f"Description: {template_info['description']}")
218
+ click.echo(f"Use case: {template_info['use_case']}")
219
+ click.echo(f"GitHub: {template_info['github_url']}")
220
+ click.echo()
221
+ click.secho("Features:", fg="yellow")
222
+ for feature in template_info.get("features", []):
223
+ click.echo(f" - {feature}")
224
+ click.echo()
225
+ click.echo("Clone with:")
226
+ click.secho(
227
+ f" scitex template clone {template_info['id']} ./my-project", fg="green"
228
+ )
229
+
230
+ except Exception as e:
231
+ click.secho(f"Error: {e}", fg="red", err=True)
232
+ sys.exit(1)
233
+
234
+
235
+ if __name__ == "__main__":
236
+ template()
scitex/cli/tex.py ADDED
@@ -0,0 +1,286 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ SciTeX CLI - TeX Commands (LaTeX Operations)
4
+
5
+ Provides LaTeX compilation and preview utilities.
6
+ """
7
+
8
+ import sys
9
+ from pathlib import Path
10
+
11
+ import click
12
+
13
+
14
+ @click.group(context_settings={"help_option_names": ["-h", "--help"]})
15
+ def tex():
16
+ """
17
+ LaTeX compilation and utilities
18
+
19
+ \b
20
+ Commands:
21
+ compile Compile LaTeX document to PDF
22
+ preview Preview LaTeX document
23
+ to-vec Convert to vector format (SVG/PDF)
24
+
25
+ \b
26
+ Examples:
27
+ scitex tex compile paper.tex
28
+ scitex tex preview paper.tex
29
+ scitex tex to-vec figure.tex --format svg
30
+ """
31
+ pass
32
+
33
+
34
+ @tex.command()
35
+ @click.argument("tex_file", type=click.Path(exists=True))
36
+ @click.option("--output", "-o", type=click.Path(), help="Output PDF path")
37
+ @click.option(
38
+ "--engine",
39
+ "-e",
40
+ type=click.Choice(["pdflatex", "xelatex", "lualatex"]),
41
+ default="pdflatex",
42
+ help="LaTeX engine (default: pdflatex)",
43
+ )
44
+ @click.option(
45
+ "--clean", "-c", is_flag=True, help="Clean auxiliary files after compilation"
46
+ )
47
+ @click.option(
48
+ "--timeout",
49
+ type=int,
50
+ default=300,
51
+ help="Compilation timeout in seconds (default: 300)",
52
+ )
53
+ @click.option("--verbose", "-v", is_flag=True, help="Show detailed compilation output")
54
+ def compile(tex_file, output, engine, clean, timeout, verbose):
55
+ """
56
+ Compile LaTeX document to PDF
57
+
58
+ \b
59
+ Examples:
60
+ scitex tex compile paper.tex
61
+ scitex tex compile paper.tex --output ./output/paper.pdf
62
+ scitex tex compile paper.tex --engine xelatex
63
+ scitex tex compile paper.tex --clean --verbose
64
+ """
65
+ try:
66
+ from scitex.tex import compile_tex
67
+
68
+ path = Path(tex_file)
69
+ click.echo(f"Compiling: {path.name}")
70
+
71
+ result = compile_tex(
72
+ tex_path=path,
73
+ output_path=output,
74
+ engine=engine,
75
+ timeout=timeout,
76
+ )
77
+
78
+ if result.success:
79
+ click.secho("Compilation successful!", fg="green")
80
+ click.echo(f"PDF: {result.output_pdf}")
81
+
82
+ if clean:
83
+ # Clean auxiliary files
84
+ aux_extensions = [
85
+ ".aux",
86
+ ".log",
87
+ ".out",
88
+ ".toc",
89
+ ".bbl",
90
+ ".blg",
91
+ ".fls",
92
+ ".fdb_latexmk",
93
+ ]
94
+ for ext in aux_extensions:
95
+ aux_file = path.with_suffix(ext)
96
+ if aux_file.exists():
97
+ aux_file.unlink()
98
+ click.echo("Auxiliary files cleaned")
99
+ else:
100
+ click.secho(
101
+ f"Compilation failed (exit code {result.exit_code})", fg="red", err=True
102
+ )
103
+ if result.errors and verbose:
104
+ click.echo("\nErrors:")
105
+ for error in result.errors[:10]:
106
+ click.echo(f" {error}")
107
+ sys.exit(result.exit_code)
108
+
109
+ except Exception as e:
110
+ click.secho(f"Error: {e}", fg="red", err=True)
111
+ sys.exit(1)
112
+
113
+
114
+ @tex.command()
115
+ @click.argument("tex_file", type=click.Path(exists=True))
116
+ @click.option("--viewer", "-v", help="PDF viewer to use (default: system default)")
117
+ def preview(tex_file, viewer):
118
+ """
119
+ Preview LaTeX document (compile and open)
120
+
121
+ \b
122
+ Examples:
123
+ scitex tex preview paper.tex
124
+ scitex tex preview paper.tex --viewer evince
125
+ """
126
+ try:
127
+ from scitex.tex import preview as tex_preview
128
+
129
+ path = Path(tex_file)
130
+ click.echo(f"Previewing: {path.name}")
131
+
132
+ tex_preview(path, viewer=viewer)
133
+
134
+ except Exception as e:
135
+ click.secho(f"Error: {e}", fg="red", err=True)
136
+ sys.exit(1)
137
+
138
+
139
+ @tex.command("to-vec")
140
+ @click.argument("tex_file", type=click.Path(exists=True))
141
+ @click.option(
142
+ "--format",
143
+ "-f",
144
+ "fmt",
145
+ type=click.Choice(["svg", "pdf", "eps"]),
146
+ default="svg",
147
+ help="Output format (default: svg)",
148
+ )
149
+ @click.option("--output", "-o", type=click.Path(), help="Output file path")
150
+ def to_vec(tex_file, fmt, output):
151
+ """
152
+ Convert LaTeX to vector format
153
+
154
+ \b
155
+ Useful for embedding equations and figures in other documents.
156
+
157
+ \b
158
+ Examples:
159
+ scitex tex to-vec equation.tex
160
+ scitex tex to-vec equation.tex --format pdf
161
+ scitex tex to-vec figure.tex --output ./vectors/fig.svg
162
+ """
163
+ try:
164
+ from scitex.tex import to_vec as convert_to_vec
165
+
166
+ path = Path(tex_file)
167
+ click.echo(f"Converting: {path.name} -> {fmt.upper()}")
168
+
169
+ if output:
170
+ output_path = Path(output)
171
+ else:
172
+ output_path = path.with_suffix(f".{fmt}")
173
+
174
+ result = convert_to_vec(path, output_path, format=fmt)
175
+
176
+ if result:
177
+ click.secho("Conversion successful!", fg="green")
178
+ click.echo(f"Output: {result}")
179
+ else:
180
+ click.secho("Conversion failed", fg="red", err=True)
181
+ sys.exit(1)
182
+
183
+ except Exception as e:
184
+ click.secho(f"Error: {e}", fg="red", err=True)
185
+ sys.exit(1)
186
+
187
+
188
+ @tex.command()
189
+ @click.argument("tex_file", type=click.Path(exists=True))
190
+ def check(tex_file):
191
+ """
192
+ Check LaTeX document for common issues
193
+
194
+ \b
195
+ Checks:
196
+ - Missing packages
197
+ - Undefined references
198
+ - Overfull/underfull boxes
199
+ - Citation warnings
200
+
201
+ \b
202
+ Example:
203
+ scitex tex check paper.tex
204
+ """
205
+ try:
206
+ import subprocess
207
+ from pathlib import Path
208
+
209
+ path = Path(tex_file)
210
+ click.echo(f"Checking: {path.name}")
211
+
212
+ # Run LaTeX in draft mode to check
213
+ result = subprocess.run(
214
+ ["pdflatex", "-draftmode", "-interaction=nonstopmode", str(path)],
215
+ capture_output=True,
216
+ text=True,
217
+ cwd=path.parent,
218
+ timeout=60,
219
+ )
220
+
221
+ # Parse log for issues
222
+ log_file = path.with_suffix(".log")
223
+ issues = {
224
+ "warnings": [],
225
+ "errors": [],
226
+ "overfull": [],
227
+ "undefined": [],
228
+ }
229
+
230
+ if log_file.exists():
231
+ with open(log_file) as f:
232
+ for line in f:
233
+ if "Warning:" in line:
234
+ issues["warnings"].append(line.strip())
235
+ elif "Error:" in line or "!" in line[:2]:
236
+ issues["errors"].append(line.strip())
237
+ elif "Overfull" in line or "Underfull" in line:
238
+ issues["overfull"].append(line.strip())
239
+ elif "undefined" in line.lower():
240
+ issues["undefined"].append(line.strip())
241
+
242
+ # Report
243
+ total_issues = sum(len(v) for v in issues.values())
244
+
245
+ if total_issues == 0:
246
+ click.secho("No issues found!", fg="green")
247
+ else:
248
+ click.secho(f"Found {total_issues} issue(s):", fg="yellow")
249
+
250
+ if issues["errors"]:
251
+ click.secho(f"\nErrors ({len(issues['errors'])}):", fg="red")
252
+ for err in issues["errors"][:5]:
253
+ click.echo(f" {err}")
254
+
255
+ if issues["undefined"]:
256
+ click.secho(
257
+ f"\nUndefined References ({len(issues['undefined'])}):", fg="yellow"
258
+ )
259
+ for ref in issues["undefined"][:5]:
260
+ click.echo(f" {ref}")
261
+
262
+ if issues["overfull"]:
263
+ click.secho(
264
+ f"\nOverfull/Underfull Boxes ({len(issues['overfull'])}):",
265
+ fg="yellow",
266
+ )
267
+ for box in issues["overfull"][:5]:
268
+ click.echo(f" {box}")
269
+
270
+ if issues["warnings"]:
271
+ click.secho(f"\nWarnings ({len(issues['warnings'])}):", fg="yellow")
272
+ for warn in issues["warnings"][:5]:
273
+ click.echo(f" {warn}")
274
+
275
+ except subprocess.TimeoutExpired:
276
+ click.secho("Check timed out", fg="yellow")
277
+ except FileNotFoundError:
278
+ click.secho("Error: pdflatex not found. Install TeX Live.", fg="red", err=True)
279
+ sys.exit(1)
280
+ except Exception as e:
281
+ click.secho(f"Error: {e}", fg="red", err=True)
282
+ sys.exit(1)
283
+
284
+
285
+ if __name__ == "__main__":
286
+ tex()
scitex/cli/web.py CHANGED
@@ -1,20 +1,18 @@
1
1
  #!/usr/bin/env python3
2
- # -*- coding: utf-8 -*-
3
2
  """
4
3
  SciTeX CLI - Web Scraping Commands
5
4
  """
6
5
 
7
- import os
6
+ import subprocess
8
7
  import sys
9
- import click
8
+ from datetime import datetime
10
9
  from pathlib import Path
11
10
 
12
- from scitex.web import get_urls, download_images, get_image_urls
13
- from scitex.web._scraping import _get_default_download_dir
11
+ import click
12
+
14
13
  from scitex.logging import getLogger
15
- import subprocess
16
- import json
17
- from datetime import datetime
14
+ from scitex.web import download_images, get_image_urls, get_urls
15
+ from scitex.web.download_images import _get_default_download_dir
18
16
 
19
17
  logger = getLogger(__name__)
20
18
 
@@ -34,7 +32,7 @@ def web():
34
32
  \b
35
33
  Examples:
36
34
  scitex web get-urls https://example.com
37
- scitex web get-urls https://example.com --pattern "\.pdf$"
35
+ scitex web get-urls https://example.com --pattern "\\.pdf$"
38
36
  scitex web get-image-urls https://example.com
39
37
  scitex web download-images https://example.com --output ./downloads
40
38
  scitex web download-images https://example.com --min-size 100x100
@@ -195,7 +193,7 @@ def download_images_cmd(url, output, pattern, min_size, same_domain, max_workers
195
193
  min_size_tuple = (width, height)
196
194
  except ValueError:
197
195
  click.secho(
198
- f"ERROR: Invalid min-size format. Use WIDTHxHEIGHT (e.g., '100x100')",
196
+ "ERROR: Invalid min-size format. Use WIDTHxHEIGHT (e.g., '100x100')",
199
197
  fg="red",
200
198
  err=True,
201
199
  )
@@ -301,6 +299,7 @@ def take_screenshot_cmd(url, output, message, quality, full_page):
301
299
  try:
302
300
  # For now, we'll use a simpler approach with playwright directly
303
301
  import asyncio
302
+
304
303
  from playwright.async_api import async_playwright
305
304
 
306
305
  async def capture():
@@ -322,7 +321,7 @@ def take_screenshot_cmd(url, output, message, quality, full_page):
322
321
  asyncio.run(capture())
323
322
 
324
323
  if output_file.exists():
325
- click.secho(f"Screenshot saved successfully", fg="green")
324
+ click.secho("Screenshot saved successfully", fg="green")
326
325
  click.echo(f"Location: {output_file}")
327
326
  sys.exit(0)
328
327
  else:
@@ -340,7 +339,7 @@ def take_screenshot_cmd(url, output, message, quality, full_page):
340
339
  )
341
340
 
342
341
  if result.returncode == 0 and output_file.exists():
343
- click.secho(f"Screenshot saved successfully", fg="green")
342
+ click.secho("Screenshot saved successfully", fg="green")
344
343
  click.echo(f"Location: {output_file}")
345
344
  sys.exit(0)
346
345
  else:
scitex/dev/__init__.py CHANGED
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env python3
2
2
  """Scitex dev module."""
3
3
 
4
+ # Pyproject utilities (lazy import to avoid tomlkit dependency)
5
+ from . import _pyproject as pyproject
4
6
  from ._analyze_code_flow import CodeFlowAnalyzer, analyze_code_flow, main, parse_args
5
7
  from ._reload import reload, reload_auto, reload_stop
6
8
 
@@ -12,4 +14,5 @@ __all__ = [
12
14
  "reload",
13
15
  "reload_auto",
14
16
  "reload_stop",
17
+ "pyproject",
15
18
  ]