scitex 2.7.3__py3-none-any.whl → 2.10.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 (563) hide show
  1. scitex/__init__.py +15 -7
  2. scitex/__version__.py +1 -2
  3. scitex/_install_guide.py +250 -0
  4. scitex/_optional_deps.py +206 -39
  5. scitex/ai/_gen_ai/_Groq.py +2 -4
  6. scitex/ai/_gen_ai/_OpenAI.py +5 -2
  7. scitex/ai/_gen_ai/_Perplexity.py +20 -6
  8. scitex/audio/__init__.py +24 -15
  9. scitex/audio/_cross_process_lock.py +139 -0
  10. scitex/audio/_mcp_handlers.py +256 -0
  11. scitex/audio/_mcp_tool_schemas.py +203 -0
  12. scitex/audio/engines/elevenlabs_engine.py +5 -2
  13. scitex/audio/mcp_server.py +98 -457
  14. scitex/bridge/__init__.py +30 -19
  15. scitex/bridge/_figrecipe.py +245 -0
  16. scitex/bridge/_helpers.py +2 -1
  17. scitex/bridge/_plt_vis.py +23 -10
  18. scitex/bridge/_stats_plt.py +18 -5
  19. scitex/bridge/_stats_vis.py +16 -2
  20. scitex/browser/__init__.py +84 -44
  21. scitex/browser/automation/__init__.py +5 -1
  22. scitex/browser/core/BrowserMixin.py +17 -4
  23. scitex/browser/core/__init__.py +11 -2
  24. scitex/browser/remote/CaptchaHandler.py +1 -1
  25. scitex/browser/remote/ZenRowsAPIClient.py +1 -1
  26. scitex/capture/grid.py +487 -0
  27. scitex/capture/mcp_handlers.py +401 -0
  28. scitex/capture/mcp_tool_defs.py +192 -0
  29. scitex/capture/mcp_tools.py +241 -0
  30. scitex/capture/mcp_utils.py +30 -0
  31. scitex/cli/convert.py +421 -0
  32. scitex/cli/main.py +6 -4
  33. scitex/datetime/__init__.py +46 -0
  34. scitex/datetime/_linspace.py +100 -0
  35. scitex/datetime/_normalize_timestamp.py +306 -0
  36. scitex/db/_delete_duplicates.py +4 -4
  37. scitex/db/_sqlite3/_delete_duplicates.py +11 -2
  38. scitex/dev/plt/__init__.py +61 -62
  39. scitex/dev/plt/demo_plotters/__init__.py +0 -0
  40. scitex/dev/plt/demo_plotters/plot_mpl_axhline.py +28 -0
  41. scitex/dev/plt/demo_plotters/plot_mpl_axhspan.py +28 -0
  42. scitex/dev/plt/demo_plotters/plot_mpl_axvline.py +28 -0
  43. scitex/dev/plt/demo_plotters/plot_mpl_axvspan.py +28 -0
  44. scitex/dev/plt/demo_plotters/plot_mpl_bar.py +29 -0
  45. scitex/dev/plt/demo_plotters/plot_mpl_barh.py +29 -0
  46. scitex/dev/plt/demo_plotters/plot_mpl_boxplot.py +28 -0
  47. scitex/dev/plt/demo_plotters/plot_mpl_contour.py +31 -0
  48. scitex/dev/plt/demo_plotters/plot_mpl_contourf.py +31 -0
  49. scitex/dev/plt/demo_plotters/plot_mpl_errorbar.py +30 -0
  50. scitex/dev/plt/demo_plotters/plot_mpl_eventplot.py +28 -0
  51. scitex/dev/plt/demo_plotters/plot_mpl_fill.py +30 -0
  52. scitex/dev/plt/demo_plotters/plot_mpl_fill_between.py +31 -0
  53. scitex/dev/plt/demo_plotters/plot_mpl_hexbin.py +28 -0
  54. scitex/dev/plt/demo_plotters/plot_mpl_hist.py +28 -0
  55. scitex/dev/plt/demo_plotters/plot_mpl_hist2d.py +28 -0
  56. scitex/dev/plt/demo_plotters/plot_mpl_imshow.py +29 -0
  57. scitex/dev/plt/demo_plotters/plot_mpl_pcolormesh.py +31 -0
  58. scitex/dev/plt/demo_plotters/plot_mpl_pie.py +29 -0
  59. scitex/dev/plt/demo_plotters/plot_mpl_plot.py +29 -0
  60. scitex/dev/plt/demo_plotters/plot_mpl_quiver.py +31 -0
  61. scitex/dev/plt/demo_plotters/plot_mpl_scatter.py +28 -0
  62. scitex/dev/plt/demo_plotters/plot_mpl_stackplot.py +31 -0
  63. scitex/dev/plt/demo_plotters/plot_mpl_stem.py +29 -0
  64. scitex/dev/plt/demo_plotters/plot_mpl_step.py +29 -0
  65. scitex/dev/plt/demo_plotters/plot_mpl_violinplot.py +28 -0
  66. scitex/dev/plt/demo_plotters/plot_sns_barplot.py +29 -0
  67. scitex/dev/plt/demo_plotters/plot_sns_boxplot.py +29 -0
  68. scitex/dev/plt/demo_plotters/plot_sns_heatmap.py +28 -0
  69. scitex/dev/plt/demo_plotters/plot_sns_histplot.py +29 -0
  70. scitex/dev/plt/demo_plotters/plot_sns_kdeplot.py +29 -0
  71. scitex/dev/plt/demo_plotters/plot_sns_lineplot.py +31 -0
  72. scitex/dev/plt/demo_plotters/plot_sns_scatterplot.py +29 -0
  73. scitex/dev/plt/demo_plotters/plot_sns_stripplot.py +29 -0
  74. scitex/dev/plt/demo_plotters/plot_sns_swarmplot.py +29 -0
  75. scitex/dev/plt/demo_plotters/plot_sns_violinplot.py +29 -0
  76. scitex/dev/plt/demo_plotters/plot_stx_bar.py +29 -0
  77. scitex/dev/plt/demo_plotters/plot_stx_barh.py +29 -0
  78. scitex/dev/plt/demo_plotters/plot_stx_box.py +28 -0
  79. scitex/dev/plt/demo_plotters/plot_stx_boxplot.py +28 -0
  80. scitex/dev/plt/demo_plotters/plot_stx_conf_mat.py +28 -0
  81. scitex/dev/plt/demo_plotters/plot_stx_contour.py +31 -0
  82. scitex/dev/plt/demo_plotters/plot_stx_ecdf.py +28 -0
  83. scitex/dev/plt/demo_plotters/plot_stx_errorbar.py +30 -0
  84. scitex/dev/plt/demo_plotters/plot_stx_fill_between.py +31 -0
  85. scitex/dev/plt/demo_plotters/plot_stx_fillv.py +28 -0
  86. scitex/dev/plt/demo_plotters/plot_stx_heatmap.py +28 -0
  87. scitex/dev/plt/demo_plotters/plot_stx_image.py +28 -0
  88. scitex/dev/plt/demo_plotters/plot_stx_imshow.py +28 -0
  89. scitex/dev/plt/demo_plotters/plot_stx_joyplot.py +28 -0
  90. scitex/dev/plt/demo_plotters/plot_stx_kde.py +28 -0
  91. scitex/dev/plt/demo_plotters/plot_stx_line.py +28 -0
  92. scitex/dev/plt/demo_plotters/plot_stx_mean_ci.py +28 -0
  93. scitex/dev/plt/demo_plotters/plot_stx_mean_std.py +28 -0
  94. scitex/dev/plt/demo_plotters/plot_stx_median_iqr.py +28 -0
  95. scitex/dev/plt/demo_plotters/plot_stx_raster.py +28 -0
  96. scitex/dev/plt/demo_plotters/plot_stx_rectangle.py +28 -0
  97. scitex/dev/plt/demo_plotters/plot_stx_scatter.py +29 -0
  98. scitex/dev/plt/demo_plotters/plot_stx_shaded_line.py +29 -0
  99. scitex/dev/plt/demo_plotters/plot_stx_violin.py +28 -0
  100. scitex/dev/plt/demo_plotters/plot_stx_violinplot.py +28 -0
  101. scitex/dev/plt/mpl/get_dir_ax.py +46 -0
  102. scitex/dev/plt/mpl/get_signatures.py +176 -0
  103. scitex/dev/plt/mpl/get_signatures_details.py +522 -0
  104. scitex/dev/plt/plot_mpl_axhline.py +0 -0
  105. scitex/dev/plt/plot_mpl_axhspan.py +0 -0
  106. scitex/dev/plt/plot_mpl_axvline.py +0 -0
  107. scitex/dev/plt/plot_mpl_axvspan.py +0 -0
  108. scitex/dev/plt/plot_mpl_bar.py +0 -0
  109. scitex/dev/plt/plot_mpl_barh.py +0 -0
  110. scitex/dev/plt/plot_mpl_boxplot.py +0 -0
  111. scitex/dev/plt/plot_mpl_contour.py +0 -0
  112. scitex/dev/plt/plot_mpl_contourf.py +0 -0
  113. scitex/dev/plt/plot_mpl_errorbar.py +0 -0
  114. scitex/dev/plt/plot_mpl_eventplot.py +0 -0
  115. scitex/dev/plt/plot_mpl_fill.py +0 -0
  116. scitex/dev/plt/plot_mpl_fill_between.py +0 -0
  117. scitex/dev/plt/plot_mpl_hexbin.py +0 -0
  118. scitex/dev/plt/plot_mpl_hist.py +0 -0
  119. scitex/dev/plt/plot_mpl_hist2d.py +0 -0
  120. scitex/dev/plt/plot_mpl_imshow.py +0 -0
  121. scitex/dev/plt/plot_mpl_pcolormesh.py +0 -0
  122. scitex/dev/plt/plot_mpl_pie.py +0 -0
  123. scitex/dev/plt/plot_mpl_plot.py +0 -0
  124. scitex/dev/plt/plot_mpl_quiver.py +0 -0
  125. scitex/dev/plt/plot_mpl_scatter.py +0 -0
  126. scitex/dev/plt/plot_mpl_stackplot.py +0 -0
  127. scitex/dev/plt/plot_mpl_stem.py +0 -0
  128. scitex/dev/plt/plot_mpl_step.py +0 -0
  129. scitex/dev/plt/plot_mpl_violinplot.py +0 -0
  130. scitex/dev/plt/plot_sns_barplot.py +0 -0
  131. scitex/dev/plt/plot_sns_boxplot.py +0 -0
  132. scitex/dev/plt/plot_sns_heatmap.py +0 -0
  133. scitex/dev/plt/plot_sns_histplot.py +0 -0
  134. scitex/dev/plt/plot_sns_kdeplot.py +0 -0
  135. scitex/dev/plt/plot_sns_lineplot.py +0 -0
  136. scitex/dev/plt/plot_sns_scatterplot.py +0 -0
  137. scitex/dev/plt/plot_sns_stripplot.py +0 -0
  138. scitex/dev/plt/plot_sns_swarmplot.py +0 -0
  139. scitex/dev/plt/plot_sns_violinplot.py +0 -0
  140. scitex/dev/plt/plot_stx_bar.py +0 -0
  141. scitex/dev/plt/plot_stx_barh.py +0 -0
  142. scitex/dev/plt/plot_stx_box.py +0 -0
  143. scitex/dev/plt/plot_stx_boxplot.py +0 -0
  144. scitex/dev/plt/plot_stx_conf_mat.py +0 -0
  145. scitex/dev/plt/plot_stx_contour.py +0 -0
  146. scitex/dev/plt/plot_stx_ecdf.py +0 -0
  147. scitex/dev/plt/plot_stx_errorbar.py +0 -0
  148. scitex/dev/plt/plot_stx_fill_between.py +0 -0
  149. scitex/dev/plt/plot_stx_fillv.py +0 -0
  150. scitex/dev/plt/plot_stx_heatmap.py +0 -0
  151. scitex/dev/plt/plot_stx_image.py +0 -0
  152. scitex/dev/plt/plot_stx_imshow.py +0 -0
  153. scitex/dev/plt/plot_stx_joyplot.py +0 -0
  154. scitex/dev/plt/plot_stx_kde.py +0 -0
  155. scitex/dev/plt/plot_stx_line.py +0 -0
  156. scitex/dev/plt/plot_stx_mean_ci.py +0 -0
  157. scitex/dev/plt/plot_stx_mean_std.py +0 -0
  158. scitex/dev/plt/plot_stx_median_iqr.py +0 -0
  159. scitex/dev/plt/plot_stx_raster.py +0 -0
  160. scitex/dev/plt/plot_stx_rectangle.py +0 -0
  161. scitex/dev/plt/plot_stx_scatter.py +0 -0
  162. scitex/dev/plt/plot_stx_shaded_line.py +0 -0
  163. scitex/dev/plt/plot_stx_violin.py +0 -0
  164. scitex/dev/plt/plot_stx_violinplot.py +0 -0
  165. scitex/diagram/README.md +197 -0
  166. scitex/diagram/__init__.py +48 -0
  167. scitex/diagram/_compile.py +312 -0
  168. scitex/diagram/_diagram.py +355 -0
  169. scitex/diagram/_presets.py +173 -0
  170. scitex/diagram/_schema.py +182 -0
  171. scitex/diagram/_split.py +278 -0
  172. scitex/dict/_pop_keys.py +1 -7
  173. scitex/dsp/__init__.py +15 -10
  174. scitex/dsp/add_noise.py +5 -2
  175. scitex/dsp/example.py +35 -22
  176. scitex/dsp/filt.py +8 -3
  177. scitex/dsp/reference.py +3 -2
  178. scitex/dsp/utils/__init__.py +2 -1
  179. scitex/dsp/utils/_differential_bandpass_filters.py +14 -4
  180. scitex/dt/__init__.py +39 -2
  181. scitex/errors.py +82 -521
  182. scitex/fig/__init__.py +4 -4
  183. scitex/fig/editor/__init__.py +5 -2
  184. scitex/fig/editor/_dearpygui_editor.py +1 -1
  185. scitex/fig/editor/_mpl_editor.py +1 -1
  186. scitex/fig/editor/_qt_editor.py +1 -1
  187. scitex/fig/editor/_tkinter_editor.py +1 -1
  188. scitex/fig/editor/edit/__init__.py +50 -0
  189. scitex/fig/editor/edit/backend_detector.py +109 -0
  190. scitex/fig/editor/edit/bundle_resolver.py +240 -0
  191. scitex/fig/editor/edit/editor_launcher.py +239 -0
  192. scitex/fig/editor/edit/manual_handler.py +53 -0
  193. scitex/fig/editor/edit/panel_loader.py +232 -0
  194. scitex/fig/editor/edit/path_resolver.py +67 -0
  195. scitex/fig/editor/flask_editor/_bbox.py +23 -0
  196. scitex/fig/editor/flask_editor/_core.py +908 -103
  197. scitex/fig/editor/flask_editor/_renderer.py +74 -0
  198. scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
  199. scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
  200. scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
  201. scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
  202. scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
  203. scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
  204. scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
  205. scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
  206. scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
  207. scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
  208. scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
  209. scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
  210. scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
  211. scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
  212. scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
  213. scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
  214. scitex/fig/editor/flask_editor/static/css/index.css +31 -0
  215. scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
  216. scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
  217. scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
  218. scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
  219. scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
  220. scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
  221. scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
  222. scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
  223. scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
  224. scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
  225. scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
  226. scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
  227. scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
  228. scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
  229. scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
  230. scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
  231. scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
  232. scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
  233. scitex/fig/editor/flask_editor/static/js/main.js +426 -0
  234. scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
  235. scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
  236. scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
  237. scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
  238. scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
  239. scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
  240. scitex/fig/editor/flask_editor/templates/__init__.py +95 -5
  241. scitex/fig/editor/flask_editor/templates/_html.py +27 -9
  242. scitex/fig/editor/flask_editor/templates/_scripts.py +1928 -131
  243. scitex/fig/editor/flask_editor/templates/_styles.py +363 -51
  244. scitex/fig/io/_bundle.py +104 -19
  245. scitex/fts/README.md +262 -0
  246. scitex/fts/TODO.md +66 -0
  247. scitex/fts/__init__.py +90 -0
  248. scitex/fts/_bundle/README_IN_BUNDLE.md +102 -0
  249. scitex/fts/_bundle/_FTS.py +657 -0
  250. scitex/fts/_bundle/__init__.py +38 -0
  251. scitex/fts/_bundle/_children.py +216 -0
  252. scitex/fts/_bundle/_conversion/__init__.py +15 -0
  253. scitex/fts/_bundle/_conversion/_bundle2dict.py +44 -0
  254. scitex/fts/_bundle/_conversion/_dict2bundle.py +50 -0
  255. scitex/fts/_bundle/_dataclasses/_Axes.py +57 -0
  256. scitex/fts/_bundle/_dataclasses/_BBox.py +54 -0
  257. scitex/fts/_bundle/_dataclasses/_ColumnDef.py +72 -0
  258. scitex/fts/_bundle/_dataclasses/_DataFormat.py +40 -0
  259. scitex/fts/_bundle/_dataclasses/_DataInfo.py +135 -0
  260. scitex/fts/_bundle/_dataclasses/_DataSource.py +44 -0
  261. scitex/fts/_bundle/_dataclasses/_Node.py +319 -0
  262. scitex/fts/_bundle/_dataclasses/_NodeRefs.py +45 -0
  263. scitex/fts/_bundle/_dataclasses/_SizeMM.py +38 -0
  264. scitex/fts/_bundle/_dataclasses/__init__.py +35 -0
  265. scitex/fts/_bundle/_extractors/__init__.py +32 -0
  266. scitex/fts/_bundle/_extractors/_extract_bar.py +131 -0
  267. scitex/fts/_bundle/_extractors/_extract_line.py +71 -0
  268. scitex/fts/_bundle/_extractors/_extract_scatter.py +79 -0
  269. scitex/fts/_bundle/_loader.py +134 -0
  270. scitex/fts/_bundle/_mpl_helpers.py +389 -0
  271. scitex/fts/_bundle/_saver.py +269 -0
  272. scitex/fts/_bundle/_storage.py +200 -0
  273. scitex/fts/_bundle/_utils/__init__.py +55 -0
  274. scitex/fts/_bundle/_utils/_const.py +26 -0
  275. scitex/fts/_bundle/_utils/_errors.py +73 -0
  276. scitex/fts/_bundle/_utils/_generate.py +21 -0
  277. scitex/fts/_bundle/_utils/_types.py +76 -0
  278. scitex/fts/_bundle/_validation.py +434 -0
  279. scitex/fts/_bundle/_zipbundle.py +165 -0
  280. scitex/fts/_fig/__init__.py +22 -0
  281. scitex/fts/_fig/_backend/__init__.py +53 -0
  282. scitex/fts/_fig/_backend/_export.py +165 -0
  283. scitex/fts/_fig/_backend/_parser.py +188 -0
  284. scitex/fts/_fig/_backend/_render.py +538 -0
  285. scitex/fts/_fig/_composite.py +345 -0
  286. scitex/fts/_fig/_dataclasses/_ChannelEncoding.py +46 -0
  287. scitex/fts/_fig/_dataclasses/_Encoding.py +82 -0
  288. scitex/fts/_fig/_dataclasses/_Theme.py +441 -0
  289. scitex/fts/_fig/_dataclasses/_TraceEncoding.py +52 -0
  290. scitex/fts/_fig/_dataclasses/__init__.py +47 -0
  291. scitex/fts/_fig/_editor/__init__.py +14 -0
  292. scitex/fts/_fig/_editor/_cui/__init__.py +33 -0
  293. scitex/fts/_fig/_editor/_cui/_backend_detector.py +39 -0
  294. scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +366 -0
  295. scitex/fts/_fig/_editor/_cui/_editor_launcher.py +175 -0
  296. scitex/fts/_fig/_editor/_cui/_manual_handler.py +52 -0
  297. scitex/fts/_fig/_editor/_cui/_panel_loader.py +246 -0
  298. scitex/fts/_fig/_editor/_cui/_path_resolver.py +66 -0
  299. scitex/fts/_fig/_editor/_defaults.py +300 -0
  300. scitex/fts/_fig/_editor/_gui/__init__.py +11 -0
  301. scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +20 -0
  302. scitex/fts/_fig/_editor/_gui/_flask_editor/_bbox.py +1339 -0
  303. scitex/fts/_fig/_editor/_gui/_flask_editor/_core.py +1688 -0
  304. scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +664 -0
  305. scitex/fts/_fig/_editor/_gui/_flask_editor/_renderer.py +853 -0
  306. scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +79 -0
  307. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +41 -0
  308. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +16 -0
  309. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +85 -0
  310. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +217 -0
  311. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +93 -0
  312. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +57 -0
  313. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +112 -0
  314. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +59 -0
  315. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +212 -0
  316. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/canvas.css +176 -0
  317. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +190 -0
  318. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +59 -0
  319. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +45 -0
  320. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +95 -0
  321. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +101 -0
  322. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +138 -0
  323. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +31 -0
  324. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +7 -0
  325. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +56 -0
  326. scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +78 -0
  327. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +314 -0
  328. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +107 -0
  329. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +54 -0
  330. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +172 -0
  331. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +258 -0
  332. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +48 -0
  333. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +71 -0
  334. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +288 -0
  335. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +143 -0
  336. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +245 -0
  337. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +992 -0
  338. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +339 -0
  339. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +286 -0
  340. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +371 -0
  341. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +293 -0
  342. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +426 -0
  343. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +152 -0
  344. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +265 -0
  345. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +184 -0
  346. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +57 -0
  347. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +100 -0
  348. scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +34 -0
  349. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +124 -0
  350. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +851 -0
  351. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +4932 -0
  352. scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +1657 -0
  353. scitex/fts/_fig/_editor/_gui/_flask_editor.py +36 -0
  354. scitex/fts/_fig/_models/_Annotations.py +115 -0
  355. scitex/fts/_fig/_models/_Axes.py +152 -0
  356. scitex/fts/_fig/_models/_Figure.py +138 -0
  357. scitex/fts/_fig/_models/_Guides.py +104 -0
  358. scitex/fts/_fig/_models/_Plot.py +123 -0
  359. scitex/fts/_fig/_models/_Styles.py +245 -0
  360. scitex/fts/_fig/_models/__init__.py +80 -0
  361. scitex/fts/_fig/_models/_plot_types/__init__.py +156 -0
  362. scitex/fts/_fig/_models/_plot_types/_bar.py +43 -0
  363. scitex/fts/_fig/_models/_plot_types/_box.py +38 -0
  364. scitex/fts/_fig/_models/_plot_types/_distribution.py +36 -0
  365. scitex/fts/_fig/_models/_plot_types/_errorbar.py +60 -0
  366. scitex/fts/_fig/_models/_plot_types/_histogram.py +30 -0
  367. scitex/fts/_fig/_models/_plot_types/_image.py +61 -0
  368. scitex/fts/_fig/_models/_plot_types/_line.py +57 -0
  369. scitex/fts/_fig/_models/_plot_types/_scatter.py +30 -0
  370. scitex/fts/_fig/_models/_plot_types/_seaborn.py +121 -0
  371. scitex/fts/_fig/_models/_plot_types/_violin.py +36 -0
  372. scitex/fts/_fig/_utils/__init__.py +129 -0
  373. scitex/fts/_fig/_utils/_auto_layout.py +127 -0
  374. scitex/fts/_fig/_utils/_calc_bounds.py +111 -0
  375. scitex/fts/_fig/_utils/_const_sizes.py +48 -0
  376. scitex/fts/_fig/_utils/_convert_coords.py +77 -0
  377. scitex/fts/_fig/_utils/_get_template.py +178 -0
  378. scitex/fts/_fig/_utils/_normalize.py +73 -0
  379. scitex/fts/_fig/_utils/_plot_layout.py +397 -0
  380. scitex/fts/_fig/_utils/_validate.py +197 -0
  381. scitex/fts/_kinds/__init__.py +45 -0
  382. scitex/fts/_kinds/_figure/__init__.py +19 -0
  383. scitex/fts/_kinds/_figure/_composite.py +345 -0
  384. scitex/fts/_kinds/_plot/__init__.py +25 -0
  385. scitex/fts/_kinds/_plot/_backend/__init__.py +53 -0
  386. scitex/fts/_kinds/_plot/_backend/_export.py +165 -0
  387. scitex/fts/_kinds/_plot/_backend/_parser.py +188 -0
  388. scitex/fts/_kinds/_plot/_backend/_render.py +538 -0
  389. scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +46 -0
  390. scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +82 -0
  391. scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +441 -0
  392. scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +52 -0
  393. scitex/fts/_kinds/_plot/_dataclasses/__init__.py +47 -0
  394. scitex/fts/_kinds/_plot/_models/_Annotations.py +115 -0
  395. scitex/fts/_kinds/_plot/_models/_Axes.py +152 -0
  396. scitex/fts/_kinds/_plot/_models/_Figure.py +138 -0
  397. scitex/fts/_kinds/_plot/_models/_Guides.py +104 -0
  398. scitex/fts/_kinds/_plot/_models/_Plot.py +123 -0
  399. scitex/fts/_kinds/_plot/_models/_Styles.py +245 -0
  400. scitex/fts/_kinds/_plot/_models/__init__.py +80 -0
  401. scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +156 -0
  402. scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +43 -0
  403. scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +38 -0
  404. scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +36 -0
  405. scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +60 -0
  406. scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +30 -0
  407. scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +61 -0
  408. scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +57 -0
  409. scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +30 -0
  410. scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +121 -0
  411. scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +36 -0
  412. scitex/fts/_kinds/_plot/_utils/__init__.py +129 -0
  413. scitex/fts/_kinds/_plot/_utils/_auto_layout.py +127 -0
  414. scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +111 -0
  415. scitex/fts/_kinds/_plot/_utils/_const_sizes.py +48 -0
  416. scitex/fts/_kinds/_plot/_utils/_convert_coords.py +77 -0
  417. scitex/fts/_kinds/_plot/_utils/_get_template.py +178 -0
  418. scitex/fts/_kinds/_plot/_utils/_normalize.py +73 -0
  419. scitex/fts/_kinds/_plot/_utils/_plot_layout.py +397 -0
  420. scitex/fts/_kinds/_plot/_utils/_validate.py +197 -0
  421. scitex/fts/_kinds/_shape/__init__.py +141 -0
  422. scitex/fts/_kinds/_stats/__init__.py +56 -0
  423. scitex/fts/_kinds/_stats/_dataclasses/_Stats.py +423 -0
  424. scitex/fts/_kinds/_stats/_dataclasses/__init__.py +48 -0
  425. scitex/fts/_kinds/_table/__init__.py +72 -0
  426. scitex/fts/_kinds/_table/_latex/__init__.py +93 -0
  427. scitex/fts/_kinds/_table/_latex/_editor/__init__.py +11 -0
  428. scitex/fts/_kinds/_table/_latex/_editor/_app.py +725 -0
  429. scitex/fts/_kinds/_table/_latex/_export.py +279 -0
  430. scitex/fts/_kinds/_table/_latex/_figure_exporter.py +153 -0
  431. scitex/fts/_kinds/_table/_latex/_stats_formatter.py +274 -0
  432. scitex/fts/_kinds/_table/_latex/_table_exporter.py +362 -0
  433. scitex/fts/_kinds/_table/_latex/_utils.py +369 -0
  434. scitex/fts/_kinds/_table/_latex/_validator.py +445 -0
  435. scitex/fts/_kinds/_text/__init__.py +77 -0
  436. scitex/fts/_schemas/data_info.schema.json +75 -0
  437. scitex/fts/_schemas/encoding.schema.json +90 -0
  438. scitex/fts/_schemas/node.schema.json +145 -0
  439. scitex/fts/_schemas/render_manifest.schema.json +62 -0
  440. scitex/fts/_schemas/stats.schema.json +132 -0
  441. scitex/fts/_schemas/theme.schema.json +141 -0
  442. scitex/fts/_stats/__init__.py +48 -0
  443. scitex/fts/_stats/_dataclasses/_Stats.py +423 -0
  444. scitex/fts/_stats/_dataclasses/__init__.py +48 -0
  445. scitex/fts/_tables/__init__.py +65 -0
  446. scitex/fts/_tables/_latex/__init__.py +93 -0
  447. scitex/fts/_tables/_latex/_editor/__init__.py +11 -0
  448. scitex/fts/_tables/_latex/_editor/_app.py +725 -0
  449. scitex/fts/_tables/_latex/_export.py +279 -0
  450. scitex/fts/_tables/_latex/_figure_exporter.py +153 -0
  451. scitex/fts/_tables/_latex/_stats_formatter.py +274 -0
  452. scitex/fts/_tables/_latex/_table_exporter.py +362 -0
  453. scitex/fts/_tables/_latex/_utils.py +369 -0
  454. scitex/fts/_tables/_latex/_validator.py +445 -0
  455. scitex/gen/__init__.py +66 -25
  456. scitex/gen/misc.py +28 -0
  457. scitex/io/__init__.py +47 -20
  458. scitex/io/_load.py +87 -36
  459. scitex/io/_load_modules/__init__.py +10 -7
  460. scitex/io/_load_modules/_pandas.py +6 -1
  461. scitex/io/_save.py +299 -1556
  462. scitex/io/_save_modules/__init__.py +76 -19
  463. scitex/io/_save_modules/_figure_utils.py +90 -0
  464. scitex/io/_save_modules/_image_csv.py +497 -0
  465. scitex/io/_save_modules/_legends.py +91 -0
  466. scitex/io/_save_modules/_pltz_bundle.py +356 -0
  467. scitex/io/_save_modules/_pltz_stx.py +536 -0
  468. scitex/io/_save_modules/_stx_bundle.py +104 -0
  469. scitex/io/_save_modules/_symlink.py +96 -0
  470. scitex/io/_save_modules/_yaml.py +1 -1
  471. scitex/io/_save_modules/_zarr.py +64 -18
  472. scitex/io/bundle/README.md +212 -0
  473. scitex/io/bundle/__init__.py +110 -0
  474. scitex/io/{_bundle.py → bundle/_core.py} +219 -89
  475. scitex/io/bundle/_nested.py +713 -0
  476. scitex/io/bundle/_types.py +74 -0
  477. scitex/io/bundle/_zip.py +487 -0
  478. scitex/io/utils/h5_to_zarr.py +1 -1
  479. scitex/logging/__init__.py +108 -13
  480. scitex/logging/_errors.py +508 -0
  481. scitex/logging/_formatters.py +30 -6
  482. scitex/logging/_warnings.py +261 -0
  483. scitex/plt/__init__.py +4 -1
  484. scitex/plt/_figrecipe.py +236 -0
  485. scitex/plt/_subplots/_AxisWrapper.py +6 -0
  486. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +0 -0
  487. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +0 -0
  488. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +0 -0
  489. scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +0 -0
  490. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +0 -0
  491. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +0 -0
  492. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +0 -0
  493. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +0 -0
  494. scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +0 -0
  495. scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +0 -0
  496. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +0 -0
  497. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +0 -0
  498. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +0 -0
  499. scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +112 -1
  500. scitex/plt/_subplots/_FigWrapper.py +15 -0
  501. scitex/plt/_subplots/_SubplotsWrapper.py +125 -489
  502. scitex/plt/_subplots/_export_as_csv.py +11 -0
  503. scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +2 -0
  504. scitex/plt/_subplots/_export_as_csv_formatters/_format_pcolormesh.py +66 -0
  505. scitex/plt/_subplots/_export_as_csv_formatters/_format_stackplot.py +62 -0
  506. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +0 -0
  507. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +0 -0
  508. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +0 -0
  509. scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +0 -0
  510. scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +208 -0
  511. scitex/plt/_subplots/_fonts.py +71 -0
  512. scitex/plt/_subplots/_mm_layout.py +282 -0
  513. scitex/plt/gallery/__init__.py +99 -2
  514. scitex/plt/io/_layered_bundle.py +0 -0
  515. scitex/plt/styles/_plot_postprocess.py +3 -1
  516. scitex/plt/utils/_configure_mpl.py +16 -19
  517. scitex/repro/_RandomStateManager.py +13 -8
  518. scitex/resource/__init__.py +19 -1
  519. scitex/resource/_utils/_get_env_info.py +13 -25
  520. scitex/schema/__init__.py +149 -160
  521. scitex/schema/_encoding.py +273 -0
  522. scitex/schema/_figure_elements.py +406 -0
  523. scitex/schema/_plot.py +0 -0
  524. scitex/schema/_theme.py +360 -0
  525. scitex/schema/_validation.py +0 -98
  526. scitex/scholar/__init__.py +56 -14
  527. scitex/scholar/auth/ScholarAuthManager.py +1 -1
  528. scitex/scholar/auth/__init__.py +11 -2
  529. scitex/scholar/auth/providers/BaseAuthenticator.py +1 -1
  530. scitex/scholar/auth/providers/EZProxyAuthenticator.py +1 -1
  531. scitex/scholar/auth/providers/OpenAthensAuthenticator.py +1 -1
  532. scitex/scholar/auth/providers/ShibbolethAuthenticator.py +1 -1
  533. scitex/scholar/config/ScholarConfig.py +1 -1
  534. scitex/scholar/core/Scholar.py +1 -1
  535. scitex/session/_decorator.py +18 -16
  536. scitex/session/_lifecycle.py +9 -11
  537. scitex/session/template.py +9 -8
  538. scitex/sh/test_sh.py +72 -0
  539. scitex/sh/test_sh_simple.py +61 -0
  540. scitex/stats/__init__.py +221 -97
  541. scitex/stats/_schema.py +21 -22
  542. scitex/stats/descriptive/_circular.py +212 -351
  543. scitex/stats/descriptive/_describe.py +81 -132
  544. scitex/stats/descriptive/_nan.py +205 -433
  545. scitex/stats/descriptive/_real.py +127 -141
  546. scitex/str/_format_plot_text.py +5 -5
  547. scitex/str/_latex.py +26 -84
  548. scitex/str/_latex_fallback.py +53 -47
  549. scitex/web/_search_pubmed.py +5 -4
  550. scitex/writer/tests/test_diff_between.py +451 -0
  551. scitex/writer/tests/test_document_section.py +311 -0
  552. scitex/writer/tests/test_document_workflow.py +393 -0
  553. scitex/writer/tests/test_writer.py +361 -0
  554. scitex/writer/tests/test_writer_integration.py +303 -0
  555. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/METADATA +364 -181
  556. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/RECORD +479 -108
  557. scitex/fig/editor/_edit.py +0 -751
  558. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/ARCHITECTURE_EXAMPLE.md +0 -905
  559. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/BULLETIN_BOARD_EXAMPLE.md +0 -99
  560. scitex/scholar/docs/to_claude/guidelines/examples/mgmt/PROJECT_DESCRIPTION_EXAMPLE.md +0 -96
  561. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/WHEEL +0 -0
  562. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/entry_points.txt +0 -0
  563. {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/licenses/LICENSE +0 -0
@@ -37,16 +37,6 @@ Usage:
37
37
  log_file = logging.get_log_path()
38
38
  """
39
39
 
40
- import warnings
41
-
42
- # Issue deprecation warning when module is imported
43
- warnings.warn(
44
- "scitex.logging is deprecated. Use scitex.logging instead. "
45
- "The scitex.logging module will be removed in a future version.",
46
- DeprecationWarning,
47
- stacklevel=2,
48
- )
49
-
50
40
  import logging as _logging
51
41
 
52
42
  from ._Tee import Tee, tee
@@ -72,6 +62,61 @@ from ._print_capture import (
72
62
  )
73
63
  from ._context import log_to_file
74
64
 
65
+ # Warnings (like Python's warnings module)
66
+ from ._warnings import (
67
+ SciTeXWarning,
68
+ UnitWarning,
69
+ StyleWarning,
70
+ SciTeXDeprecationWarning,
71
+ PerformanceWarning,
72
+ DataLossWarning,
73
+ warn,
74
+ filterwarnings,
75
+ resetwarnings,
76
+ warn_deprecated,
77
+ warn_performance,
78
+ warn_data_loss,
79
+ )
80
+
81
+ # Errors (exceptions)
82
+ from ._errors import (
83
+ SciTeXError,
84
+ ConfigurationError,
85
+ ConfigFileNotFoundError,
86
+ ConfigKeyError,
87
+ IOError,
88
+ FileFormatError,
89
+ SaveError,
90
+ LoadError,
91
+ ScholarError,
92
+ SearchError,
93
+ EnrichmentError,
94
+ PDFDownloadError,
95
+ DOIResolutionError,
96
+ PDFExtractionError,
97
+ BibTeXEnrichmentError,
98
+ TranslatorError,
99
+ AuthenticationError,
100
+ PlottingError,
101
+ FigureNotFoundError,
102
+ AxisError,
103
+ DataError,
104
+ ShapeError,
105
+ DTypeError,
106
+ PathError,
107
+ InvalidPathError,
108
+ PathNotFoundError,
109
+ TemplateError,
110
+ TemplateViolationError,
111
+ NNError,
112
+ ModelError,
113
+ StatsError,
114
+ TestError,
115
+ check_path,
116
+ check_file_exists,
117
+ check_shape_compatibility,
118
+ )
119
+
75
120
  # Re-export standard logging functions for compatibility
76
121
  getLogger = _logging.getLogger
77
122
  basicConfig = _logging.basicConfig
@@ -97,9 +142,9 @@ level = level_map.get(level_by_env, INFO)
97
142
  # Auto-configure logging on import with file logging enabled, print capture disabled by default
98
143
  configure(level=level, enable_file=True, enable_console=True, capture_prints=False)
99
144
 
100
- # Export only essential public functions - minimal API
145
+ # Export public API
101
146
  __all__ = [
102
- # Core logging functions (most commonly used)
147
+ # Core logging functions
103
148
  "getLogger",
104
149
  # Log levels
105
150
  "DEBUG",
@@ -109,13 +154,63 @@ __all__ = [
109
154
  "CRITICAL",
110
155
  "SUCCESS",
111
156
  "FAIL",
112
- # Configuration (minimal set)
157
+ # Configuration
113
158
  "configure",
114
159
  "get_log_path",
115
160
  "Tee",
116
161
  "tee",
117
162
  # Context managers
118
163
  "log_to_file",
164
+ # Warnings (like Python's warnings module)
165
+ "SciTeXWarning",
166
+ "UnitWarning",
167
+ "StyleWarning",
168
+ "SciTeXDeprecationWarning",
169
+ "PerformanceWarning",
170
+ "DataLossWarning",
171
+ "warn",
172
+ "filterwarnings",
173
+ "resetwarnings",
174
+ "warn_deprecated",
175
+ "warn_performance",
176
+ "warn_data_loss",
177
+ # Errors (exceptions)
178
+ "SciTeXError",
179
+ "ConfigurationError",
180
+ "ConfigFileNotFoundError",
181
+ "ConfigKeyError",
182
+ "IOError",
183
+ "FileFormatError",
184
+ "SaveError",
185
+ "LoadError",
186
+ "ScholarError",
187
+ "SearchError",
188
+ "EnrichmentError",
189
+ "PDFDownloadError",
190
+ "DOIResolutionError",
191
+ "PDFExtractionError",
192
+ "BibTeXEnrichmentError",
193
+ "TranslatorError",
194
+ "AuthenticationError",
195
+ "PlottingError",
196
+ "FigureNotFoundError",
197
+ "AxisError",
198
+ "DataError",
199
+ "ShapeError",
200
+ "DTypeError",
201
+ "PathError",
202
+ "InvalidPathError",
203
+ "PathNotFoundError",
204
+ "TemplateError",
205
+ "TemplateViolationError",
206
+ "NNError",
207
+ "ModelError",
208
+ "StatsError",
209
+ "TestError",
210
+ # Validation helpers
211
+ "check_path",
212
+ "check_file_exists",
213
+ "check_shape_compatibility",
119
214
  ]
120
215
 
121
216
  # EOF
@@ -0,0 +1,508 @@
1
+ #!/usr/bin/env python3
2
+ # -*- coding: utf-8 -*-
3
+ # Timestamp: "2025-12-21"
4
+ # File: /home/ywatanabe/proj/scitex-code/src/scitex/logging/_errors.py
5
+
6
+ """Error classes for SciTeX.
7
+
8
+ All SciTeX exceptions are defined here for unified error handling.
9
+ Re-exported from scitex.logging for backwards compatibility.
10
+
11
+ Usage:
12
+ from scitex.logging import SciTeXError, SaveError, LoadError
13
+ # or (backwards compatible)
14
+ from scitex.logging import SciTeXError, SaveError, LoadError
15
+ """
16
+
17
+ from typing import Optional, Union
18
+
19
+
20
+ # =============================================================================
21
+ # Base Errors
22
+ # =============================================================================
23
+
24
+
25
+ class SciTeXError(Exception):
26
+ """Base Exception class for all SciTeX errors."""
27
+
28
+ def __init__(
29
+ self,
30
+ message: str,
31
+ context: Optional[dict] = None,
32
+ suggestion: Optional[str] = None,
33
+ ):
34
+ """Initialize SciTeX error with detailed information.
35
+
36
+ Parameters
37
+ ----------
38
+ message : str
39
+ The error message
40
+ context : dict, optional
41
+ Additional context information (e.g., file paths, variable values)
42
+ suggestion : str, optional
43
+ Suggested fix or action
44
+ """
45
+ self.message = message
46
+ self.context = context or {}
47
+ self.suggestion = suggestion
48
+
49
+ # Build the full error message
50
+ error_parts = [f"SciTeX Error: {message}"]
51
+
52
+ if context:
53
+ error_parts.append("\nContext:")
54
+ for key, value in context.items():
55
+ error_parts.append(f" {key}: {value}")
56
+
57
+ if suggestion:
58
+ error_parts.append(f"\nSuggestion: {suggestion}")
59
+
60
+ super().__init__("\n".join(error_parts))
61
+
62
+
63
+ # =============================================================================
64
+ # Configuration Errors
65
+ # =============================================================================
66
+
67
+
68
+ class ConfigurationError(SciTeXError):
69
+ """Raised when there are issues with SciTeX configuration."""
70
+
71
+ pass
72
+
73
+
74
+ class ConfigFileNotFoundError(ConfigurationError):
75
+ """Raised when a required configuration file is not found."""
76
+
77
+ def __init__(self, filepath: str):
78
+ super().__init__(
79
+ f"Configuration file not found: {filepath}",
80
+ context={"filepath": filepath},
81
+ suggestion="Ensure the configuration file exists in ./config/ directory",
82
+ )
83
+
84
+
85
+ class ConfigKeyError(ConfigurationError):
86
+ """Raised when a required configuration key is missing."""
87
+
88
+ def __init__(self, key: str, available_keys: Optional[list] = None):
89
+ context = {"missing_key": key}
90
+ if available_keys:
91
+ context["available_keys"] = available_keys
92
+
93
+ super().__init__(
94
+ f"Configuration key '{key}' not found",
95
+ context=context,
96
+ suggestion=f"Add '{key}' to your configuration file or check for typos",
97
+ )
98
+
99
+
100
+ # =============================================================================
101
+ # IO Errors
102
+ # =============================================================================
103
+
104
+
105
+ class IOError(SciTeXError):
106
+ """Base class for input/output related errors."""
107
+
108
+ pass
109
+
110
+
111
+ class FileFormatError(IOError):
112
+ """Raised when file format is not supported or incorrect."""
113
+
114
+ def __init__(
115
+ self,
116
+ filepath: str,
117
+ expected_format: Optional[str] = None,
118
+ actual_format: Optional[str] = None,
119
+ ):
120
+ context = {"filepath": filepath}
121
+ if expected_format:
122
+ context["expected_format"] = expected_format
123
+ if actual_format:
124
+ context["actual_format"] = actual_format
125
+
126
+ message = f"File format error for: {filepath}"
127
+ if expected_format and actual_format:
128
+ message += f" (expected: {expected_format}, got: {actual_format})"
129
+
130
+ super().__init__(
131
+ message,
132
+ context=context,
133
+ suggestion="Check the file extension and content format",
134
+ )
135
+
136
+
137
+ class SaveError(IOError):
138
+ """Raised when saving data fails."""
139
+
140
+ def __init__(self, filepath: str, reason: str):
141
+ super().__init__(
142
+ f"Failed to save to {filepath}: {reason}",
143
+ context={"filepath": filepath, "reason": reason},
144
+ suggestion="Check file permissions and disk space",
145
+ )
146
+
147
+
148
+ class LoadError(IOError):
149
+ """Raised when loading data fails."""
150
+
151
+ def __init__(self, filepath: str, reason: str):
152
+ super().__init__(
153
+ f"Failed to load from {filepath}: {reason}",
154
+ context={"filepath": filepath, "reason": reason},
155
+ suggestion="Verify the file exists and is not corrupted",
156
+ )
157
+
158
+
159
+ # =============================================================================
160
+ # Scholar Module Errors
161
+ # =============================================================================
162
+
163
+
164
+ class ScholarError(SciTeXError):
165
+ """Base class for scholar module errors."""
166
+
167
+ pass
168
+
169
+
170
+ class SearchError(ScholarError):
171
+ """Raised when paper search fails."""
172
+
173
+ def __init__(self, query: str, source: str, reason: str):
174
+ super().__init__(
175
+ f"Search failed for query '{query}' on {source}",
176
+ context={"query": query, "source": source, "reason": reason},
177
+ suggestion="Check your internet connection and API keys",
178
+ )
179
+
180
+
181
+ class EnrichmentError(ScholarError):
182
+ """Raised when paper enrichment fails."""
183
+
184
+ def __init__(self, paper_title: str, reason: str):
185
+ super().__init__(
186
+ f"Failed to enrich paper: {paper_title}",
187
+ context={"paper_title": paper_title, "reason": reason},
188
+ suggestion="Verify journal information is available",
189
+ )
190
+
191
+
192
+ class PDFDownloadError(ScholarError):
193
+ """Raised when PDF download fails."""
194
+
195
+ def __init__(self, url: str, reason: str):
196
+ super().__init__(
197
+ f"Failed to download PDF from {url}",
198
+ context={"url": url, "reason": reason},
199
+ suggestion="Check if the paper is open access",
200
+ )
201
+
202
+
203
+ class DOIResolutionError(ScholarError):
204
+ """Raised when DOI resolution fails."""
205
+
206
+ def __init__(self, doi: str, reason: str):
207
+ super().__init__(
208
+ f"Failed to resolve DOI: {doi}",
209
+ context={"doi": doi, "reason": reason},
210
+ suggestion="Verify the DOI is correct and try again",
211
+ )
212
+
213
+
214
+ class PDFExtractionError(ScholarError):
215
+ """Raised when PDF text extraction fails."""
216
+
217
+ def __init__(self, filepath: str, reason: str):
218
+ super().__init__(
219
+ f"Failed to extract text from PDF: {filepath}",
220
+ context={"filepath": filepath, "reason": reason},
221
+ suggestion="Ensure the PDF is not corrupted or encrypted",
222
+ )
223
+
224
+
225
+ class BibTeXEnrichmentError(ScholarError):
226
+ """Raised when BibTeX enrichment fails."""
227
+
228
+ def __init__(self, bibtex_file: str, reason: str):
229
+ super().__init__(
230
+ f"Failed to enrich BibTeX file: {bibtex_file}",
231
+ context={"bibtex_file": bibtex_file, "reason": reason},
232
+ suggestion="Check the BibTeX format and ensure all entries are valid",
233
+ )
234
+
235
+
236
+ class TranslatorError(ScholarError):
237
+ """Raised when Zotero translator operations fail."""
238
+
239
+ def __init__(self, translator_name: str, reason: str):
240
+ super().__init__(
241
+ f"Translator error in {translator_name}: {reason}",
242
+ context={"translator": translator_name, "reason": reason},
243
+ suggestion="Check translator compatibility and JavaScript environment",
244
+ )
245
+
246
+
247
+ class AuthenticationError(ScholarError):
248
+ """Raised when authentication fails."""
249
+
250
+ def __init__(self, provider: str, reason: str = ""):
251
+ super().__init__(
252
+ f"Authentication failed for {provider}: {reason}",
253
+ context={"provider": provider, "reason": reason},
254
+ suggestion="Check your credentials and authentication settings",
255
+ )
256
+
257
+
258
+ # =============================================================================
259
+ # Plotting Errors
260
+ # =============================================================================
261
+
262
+
263
+ class PlottingError(SciTeXError):
264
+ """Base class for plotting-related errors."""
265
+
266
+ pass
267
+
268
+
269
+ class FigureNotFoundError(PlottingError):
270
+ """Raised when attempting to operate on a non-existent figure."""
271
+
272
+ def __init__(self, fig_id: Union[int, str]):
273
+ super().__init__(
274
+ f"Figure {fig_id} not found",
275
+ context={"figure_id": fig_id},
276
+ suggestion="Ensure the figure was created before attempting to save/modify it",
277
+ )
278
+
279
+
280
+ class AxisError(PlottingError):
281
+ """Raised when there are issues with plot axes."""
282
+
283
+ def __init__(self, message: str, axis_info: Optional[dict] = None):
284
+ super().__init__(
285
+ message,
286
+ context={"axis_info": axis_info} if axis_info else None,
287
+ suggestion="Check axis indices and subplot configuration",
288
+ )
289
+
290
+
291
+ # =============================================================================
292
+ # Data Processing Errors
293
+ # =============================================================================
294
+
295
+
296
+ class DataError(SciTeXError):
297
+ """Base class for data processing errors."""
298
+
299
+ pass
300
+
301
+
302
+ class ShapeError(DataError):
303
+ """Raised when data shapes are incompatible."""
304
+
305
+ def __init__(self, expected_shape: tuple, actual_shape: tuple, operation: str):
306
+ super().__init__(
307
+ f"Shape mismatch in {operation}",
308
+ context={
309
+ "expected_shape": expected_shape,
310
+ "actual_shape": actual_shape,
311
+ "operation": operation,
312
+ },
313
+ suggestion="Reshape or transpose your data to match expected dimensions",
314
+ )
315
+
316
+
317
+ class DTypeError(DataError):
318
+ """Raised when data types are incompatible."""
319
+
320
+ def __init__(self, expected_dtype: str, actual_dtype: str, operation: str):
321
+ super().__init__(
322
+ f"Data type mismatch in {operation}",
323
+ context={
324
+ "expected_dtype": expected_dtype,
325
+ "actual_dtype": actual_dtype,
326
+ "operation": operation,
327
+ },
328
+ suggestion=f"Convert data to {expected_dtype} using appropriate casting",
329
+ )
330
+
331
+
332
+ # =============================================================================
333
+ # Path Errors
334
+ # =============================================================================
335
+
336
+
337
+ class PathError(SciTeXError):
338
+ """Base class for path-related errors."""
339
+
340
+ pass
341
+
342
+
343
+ class InvalidPathError(PathError):
344
+ """Raised when a path is invalid or doesn't follow SciTeX conventions."""
345
+
346
+ def __init__(self, path: str, reason: str):
347
+ super().__init__(
348
+ f"Invalid path: {path}",
349
+ context={"path": path, "reason": reason},
350
+ suggestion="Use relative paths starting with './' or '../'",
351
+ )
352
+
353
+
354
+ class PathNotFoundError(PathError):
355
+ """Raised when a required path doesn't exist."""
356
+
357
+ def __init__(self, path: str):
358
+ super().__init__(
359
+ f"Path not found: {path}",
360
+ context={"path": path},
361
+ suggestion="Check if the path exists and is accessible",
362
+ )
363
+
364
+
365
+ # =============================================================================
366
+ # Template Errors
367
+ # =============================================================================
368
+
369
+
370
+ class TemplateError(SciTeXError):
371
+ """Base class for template-related errors."""
372
+
373
+ pass
374
+
375
+
376
+ class TemplateViolationError(TemplateError):
377
+ """Raised when SciTeX template is not followed."""
378
+
379
+ def __init__(self, filepath: str, violation: str):
380
+ super().__init__(
381
+ f"Template violation in {filepath}: {violation}",
382
+ context={"filepath": filepath, "violation": violation},
383
+ suggestion="Follow the SciTeX template structure as defined in IMPORTANT-SCITEX-02-file-template.md",
384
+ )
385
+
386
+
387
+ # =============================================================================
388
+ # Neural Network Errors
389
+ # =============================================================================
390
+
391
+
392
+ class NNError(SciTeXError):
393
+ """Base class for neural network module errors."""
394
+
395
+ pass
396
+
397
+
398
+ class ModelError(NNError):
399
+ """Raised when there are issues with neural network models."""
400
+
401
+ def __init__(self, model_name: str, reason: str):
402
+ super().__init__(
403
+ f"Model error in {model_name}: {reason}",
404
+ context={"model_name": model_name, "reason": reason},
405
+ )
406
+
407
+
408
+ # =============================================================================
409
+ # Statistics Errors
410
+ # =============================================================================
411
+
412
+
413
+ class StatsError(SciTeXError):
414
+ """Base class for statistics module errors."""
415
+
416
+ pass
417
+
418
+
419
+ class TestError(StatsError):
420
+ """Raised when statistical tests fail."""
421
+
422
+ def __init__(self, test_name: str, reason: str):
423
+ super().__init__(
424
+ f"Statistical test '{test_name}' failed: {reason}",
425
+ context={"test_name": test_name, "reason": reason},
426
+ )
427
+
428
+
429
+ # =============================================================================
430
+ # Validation Helpers
431
+ # =============================================================================
432
+
433
+
434
+ def check_path(path: str) -> None:
435
+ """Validate a path according to SciTeX conventions."""
436
+ if not isinstance(path, str):
437
+ raise InvalidPathError(str(path), "Path must be a string")
438
+
439
+ if not (path.startswith("./") or path.startswith("../")):
440
+ raise InvalidPathError(
441
+ path, "Path must be relative and start with './' or '../'"
442
+ )
443
+
444
+
445
+ def check_file_exists(filepath: str) -> None:
446
+ """Check if a file exists."""
447
+ import os
448
+
449
+ if not os.path.exists(filepath):
450
+ raise PathNotFoundError(filepath)
451
+
452
+
453
+ def check_shape_compatibility(shape1: tuple, shape2: tuple, operation: str) -> None:
454
+ """Check if two shapes are compatible for an operation."""
455
+ if shape1 != shape2:
456
+ raise ShapeError(shape1, shape2, operation)
457
+
458
+
459
+ __all__ = [
460
+ # Base errors
461
+ "SciTeXError",
462
+ # Configuration
463
+ "ConfigurationError",
464
+ "ConfigFileNotFoundError",
465
+ "ConfigKeyError",
466
+ # IO
467
+ "IOError",
468
+ "FileFormatError",
469
+ "SaveError",
470
+ "LoadError",
471
+ # Scholar
472
+ "ScholarError",
473
+ "SearchError",
474
+ "EnrichmentError",
475
+ "PDFDownloadError",
476
+ "DOIResolutionError",
477
+ "PDFExtractionError",
478
+ "BibTeXEnrichmentError",
479
+ "TranslatorError",
480
+ "AuthenticationError",
481
+ # Plotting
482
+ "PlottingError",
483
+ "FigureNotFoundError",
484
+ "AxisError",
485
+ # Data
486
+ "DataError",
487
+ "ShapeError",
488
+ "DTypeError",
489
+ # Path
490
+ "PathError",
491
+ "InvalidPathError",
492
+ "PathNotFoundError",
493
+ # Template
494
+ "TemplateError",
495
+ "TemplateViolationError",
496
+ # Neural Network
497
+ "NNError",
498
+ "ModelError",
499
+ # Statistics
500
+ "StatsError",
501
+ "TestError",
502
+ # Validation helpers
503
+ "check_path",
504
+ "check_file_exists",
505
+ "check_shape_compatibility",
506
+ ]
507
+
508
+ # EOF