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.
- scitex/__init__.py +15 -7
- scitex/__version__.py +1 -2
- scitex/_install_guide.py +250 -0
- scitex/_optional_deps.py +206 -39
- scitex/ai/_gen_ai/_Groq.py +2 -4
- scitex/ai/_gen_ai/_OpenAI.py +5 -2
- scitex/ai/_gen_ai/_Perplexity.py +20 -6
- scitex/audio/__init__.py +24 -15
- scitex/audio/_cross_process_lock.py +139 -0
- scitex/audio/_mcp_handlers.py +256 -0
- scitex/audio/_mcp_tool_schemas.py +203 -0
- scitex/audio/engines/elevenlabs_engine.py +5 -2
- scitex/audio/mcp_server.py +98 -457
- scitex/bridge/__init__.py +30 -19
- scitex/bridge/_figrecipe.py +245 -0
- scitex/bridge/_helpers.py +2 -1
- scitex/bridge/_plt_vis.py +23 -10
- scitex/bridge/_stats_plt.py +18 -5
- scitex/bridge/_stats_vis.py +16 -2
- scitex/browser/__init__.py +84 -44
- scitex/browser/automation/__init__.py +5 -1
- scitex/browser/core/BrowserMixin.py +17 -4
- scitex/browser/core/__init__.py +11 -2
- scitex/browser/remote/CaptchaHandler.py +1 -1
- scitex/browser/remote/ZenRowsAPIClient.py +1 -1
- scitex/capture/grid.py +487 -0
- scitex/capture/mcp_handlers.py +401 -0
- scitex/capture/mcp_tool_defs.py +192 -0
- scitex/capture/mcp_tools.py +241 -0
- scitex/capture/mcp_utils.py +30 -0
- scitex/cli/convert.py +421 -0
- scitex/cli/main.py +6 -4
- scitex/datetime/__init__.py +46 -0
- scitex/datetime/_linspace.py +100 -0
- scitex/datetime/_normalize_timestamp.py +306 -0
- scitex/db/_delete_duplicates.py +4 -4
- scitex/db/_sqlite3/_delete_duplicates.py +11 -2
- scitex/dev/plt/__init__.py +61 -62
- scitex/dev/plt/demo_plotters/__init__.py +0 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axhline.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axhspan.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axvline.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_axvspan.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_bar.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_barh.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_boxplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_contour.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_contourf.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_errorbar.py +30 -0
- scitex/dev/plt/demo_plotters/plot_mpl_eventplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_fill.py +30 -0
- scitex/dev/plt/demo_plotters/plot_mpl_fill_between.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_hexbin.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_hist.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_hist2d.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_imshow.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_pcolormesh.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_pie.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_plot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_quiver.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_scatter.py +28 -0
- scitex/dev/plt/demo_plotters/plot_mpl_stackplot.py +31 -0
- scitex/dev/plt/demo_plotters/plot_mpl_stem.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_step.py +29 -0
- scitex/dev/plt/demo_plotters/plot_mpl_violinplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_sns_barplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_boxplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_heatmap.py +28 -0
- scitex/dev/plt/demo_plotters/plot_sns_histplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_kdeplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_lineplot.py +31 -0
- scitex/dev/plt/demo_plotters/plot_sns_scatterplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_stripplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_swarmplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_sns_violinplot.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_bar.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_barh.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_box.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_boxplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_conf_mat.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_contour.py +31 -0
- scitex/dev/plt/demo_plotters/plot_stx_ecdf.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_errorbar.py +30 -0
- scitex/dev/plt/demo_plotters/plot_stx_fill_between.py +31 -0
- scitex/dev/plt/demo_plotters/plot_stx_fillv.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_heatmap.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_image.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_imshow.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_joyplot.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_kde.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_line.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_mean_ci.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_mean_std.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_median_iqr.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_raster.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_rectangle.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_scatter.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_shaded_line.py +29 -0
- scitex/dev/plt/demo_plotters/plot_stx_violin.py +28 -0
- scitex/dev/plt/demo_plotters/plot_stx_violinplot.py +28 -0
- scitex/dev/plt/mpl/get_dir_ax.py +46 -0
- scitex/dev/plt/mpl/get_signatures.py +176 -0
- scitex/dev/plt/mpl/get_signatures_details.py +522 -0
- scitex/dev/plt/plot_mpl_axhline.py +0 -0
- scitex/dev/plt/plot_mpl_axhspan.py +0 -0
- scitex/dev/plt/plot_mpl_axvline.py +0 -0
- scitex/dev/plt/plot_mpl_axvspan.py +0 -0
- scitex/dev/plt/plot_mpl_bar.py +0 -0
- scitex/dev/plt/plot_mpl_barh.py +0 -0
- scitex/dev/plt/plot_mpl_boxplot.py +0 -0
- scitex/dev/plt/plot_mpl_contour.py +0 -0
- scitex/dev/plt/plot_mpl_contourf.py +0 -0
- scitex/dev/plt/plot_mpl_errorbar.py +0 -0
- scitex/dev/plt/plot_mpl_eventplot.py +0 -0
- scitex/dev/plt/plot_mpl_fill.py +0 -0
- scitex/dev/plt/plot_mpl_fill_between.py +0 -0
- scitex/dev/plt/plot_mpl_hexbin.py +0 -0
- scitex/dev/plt/plot_mpl_hist.py +0 -0
- scitex/dev/plt/plot_mpl_hist2d.py +0 -0
- scitex/dev/plt/plot_mpl_imshow.py +0 -0
- scitex/dev/plt/plot_mpl_pcolormesh.py +0 -0
- scitex/dev/plt/plot_mpl_pie.py +0 -0
- scitex/dev/plt/plot_mpl_plot.py +0 -0
- scitex/dev/plt/plot_mpl_quiver.py +0 -0
- scitex/dev/plt/plot_mpl_scatter.py +0 -0
- scitex/dev/plt/plot_mpl_stackplot.py +0 -0
- scitex/dev/plt/plot_mpl_stem.py +0 -0
- scitex/dev/plt/plot_mpl_step.py +0 -0
- scitex/dev/plt/plot_mpl_violinplot.py +0 -0
- scitex/dev/plt/plot_sns_barplot.py +0 -0
- scitex/dev/plt/plot_sns_boxplot.py +0 -0
- scitex/dev/plt/plot_sns_heatmap.py +0 -0
- scitex/dev/plt/plot_sns_histplot.py +0 -0
- scitex/dev/plt/plot_sns_kdeplot.py +0 -0
- scitex/dev/plt/plot_sns_lineplot.py +0 -0
- scitex/dev/plt/plot_sns_scatterplot.py +0 -0
- scitex/dev/plt/plot_sns_stripplot.py +0 -0
- scitex/dev/plt/plot_sns_swarmplot.py +0 -0
- scitex/dev/plt/plot_sns_violinplot.py +0 -0
- scitex/dev/plt/plot_stx_bar.py +0 -0
- scitex/dev/plt/plot_stx_barh.py +0 -0
- scitex/dev/plt/plot_stx_box.py +0 -0
- scitex/dev/plt/plot_stx_boxplot.py +0 -0
- scitex/dev/plt/plot_stx_conf_mat.py +0 -0
- scitex/dev/plt/plot_stx_contour.py +0 -0
- scitex/dev/plt/plot_stx_ecdf.py +0 -0
- scitex/dev/plt/plot_stx_errorbar.py +0 -0
- scitex/dev/plt/plot_stx_fill_between.py +0 -0
- scitex/dev/plt/plot_stx_fillv.py +0 -0
- scitex/dev/plt/plot_stx_heatmap.py +0 -0
- scitex/dev/plt/plot_stx_image.py +0 -0
- scitex/dev/plt/plot_stx_imshow.py +0 -0
- scitex/dev/plt/plot_stx_joyplot.py +0 -0
- scitex/dev/plt/plot_stx_kde.py +0 -0
- scitex/dev/plt/plot_stx_line.py +0 -0
- scitex/dev/plt/plot_stx_mean_ci.py +0 -0
- scitex/dev/plt/plot_stx_mean_std.py +0 -0
- scitex/dev/plt/plot_stx_median_iqr.py +0 -0
- scitex/dev/plt/plot_stx_raster.py +0 -0
- scitex/dev/plt/plot_stx_rectangle.py +0 -0
- scitex/dev/plt/plot_stx_scatter.py +0 -0
- scitex/dev/plt/plot_stx_shaded_line.py +0 -0
- scitex/dev/plt/plot_stx_violin.py +0 -0
- scitex/dev/plt/plot_stx_violinplot.py +0 -0
- scitex/diagram/README.md +197 -0
- scitex/diagram/__init__.py +48 -0
- scitex/diagram/_compile.py +312 -0
- scitex/diagram/_diagram.py +355 -0
- scitex/diagram/_presets.py +173 -0
- scitex/diagram/_schema.py +182 -0
- scitex/diagram/_split.py +278 -0
- scitex/dict/_pop_keys.py +1 -7
- scitex/dsp/__init__.py +15 -10
- scitex/dsp/add_noise.py +5 -2
- scitex/dsp/example.py +35 -22
- scitex/dsp/filt.py +8 -3
- scitex/dsp/reference.py +3 -2
- scitex/dsp/utils/__init__.py +2 -1
- scitex/dsp/utils/_differential_bandpass_filters.py +14 -4
- scitex/dt/__init__.py +39 -2
- scitex/errors.py +82 -521
- scitex/fig/__init__.py +4 -4
- scitex/fig/editor/__init__.py +5 -2
- scitex/fig/editor/_dearpygui_editor.py +1 -1
- scitex/fig/editor/_mpl_editor.py +1 -1
- scitex/fig/editor/_qt_editor.py +1 -1
- scitex/fig/editor/_tkinter_editor.py +1 -1
- scitex/fig/editor/edit/__init__.py +50 -0
- scitex/fig/editor/edit/backend_detector.py +109 -0
- scitex/fig/editor/edit/bundle_resolver.py +240 -0
- scitex/fig/editor/edit/editor_launcher.py +239 -0
- scitex/fig/editor/edit/manual_handler.py +53 -0
- scitex/fig/editor/edit/panel_loader.py +232 -0
- scitex/fig/editor/edit/path_resolver.py +67 -0
- scitex/fig/editor/flask_editor/_bbox.py +23 -0
- scitex/fig/editor/flask_editor/_core.py +908 -103
- scitex/fig/editor/flask_editor/_renderer.py +74 -0
- scitex/fig/editor/flask_editor/static/css/base/reset.css +41 -0
- scitex/fig/editor/flask_editor/static/css/base/typography.css +16 -0
- scitex/fig/editor/flask_editor/static/css/base/variables.css +85 -0
- scitex/fig/editor/flask_editor/static/css/components/buttons.css +217 -0
- scitex/fig/editor/flask_editor/static/css/components/context-menu.css +93 -0
- scitex/fig/editor/flask_editor/static/css/components/dropdown.css +57 -0
- scitex/fig/editor/flask_editor/static/css/components/forms.css +112 -0
- scitex/fig/editor/flask_editor/static/css/components/modal.css +59 -0
- scitex/fig/editor/flask_editor/static/css/components/sections.css +212 -0
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +176 -0
- scitex/fig/editor/flask_editor/static/css/features/element-inspector.css +190 -0
- scitex/fig/editor/flask_editor/static/css/features/loading.css +59 -0
- scitex/fig/editor/flask_editor/static/css/features/overlay.css +45 -0
- scitex/fig/editor/flask_editor/static/css/features/panel-grid.css +95 -0
- scitex/fig/editor/flask_editor/static/css/features/selection.css +101 -0
- scitex/fig/editor/flask_editor/static/css/features/statistics.css +138 -0
- scitex/fig/editor/flask_editor/static/css/index.css +31 -0
- scitex/fig/editor/flask_editor/static/css/layout/container.css +7 -0
- scitex/fig/editor/flask_editor/static/css/layout/controls.css +56 -0
- scitex/fig/editor/flask_editor/static/css/layout/preview.css +78 -0
- scitex/fig/editor/flask_editor/static/js/alignment/axis.js +314 -0
- scitex/fig/editor/flask_editor/static/js/alignment/basic.js +107 -0
- scitex/fig/editor/flask_editor/static/js/alignment/distribute.js +54 -0
- scitex/fig/editor/flask_editor/static/js/canvas/canvas.js +172 -0
- scitex/fig/editor/flask_editor/static/js/canvas/dragging.js +258 -0
- scitex/fig/editor/flask_editor/static/js/canvas/resize.js +48 -0
- scitex/fig/editor/flask_editor/static/js/canvas/selection.js +71 -0
- scitex/fig/editor/flask_editor/static/js/core/api.js +288 -0
- scitex/fig/editor/flask_editor/static/js/core/state.js +143 -0
- scitex/fig/editor/flask_editor/static/js/core/utils.js +245 -0
- scitex/fig/editor/flask_editor/static/js/dev/element-inspector.js +992 -0
- scitex/fig/editor/flask_editor/static/js/editor/bbox.js +339 -0
- scitex/fig/editor/flask_editor/static/js/editor/element-drag.js +286 -0
- scitex/fig/editor/flask_editor/static/js/editor/overlay.js +371 -0
- scitex/fig/editor/flask_editor/static/js/editor/preview.js +293 -0
- scitex/fig/editor/flask_editor/static/js/main.js +426 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/context-menu.js +152 -0
- scitex/fig/editor/flask_editor/static/js/shortcuts/keyboard.js +265 -0
- scitex/fig/editor/flask_editor/static/js/ui/controls.js +184 -0
- scitex/fig/editor/flask_editor/static/js/ui/download.js +57 -0
- scitex/fig/editor/flask_editor/static/js/ui/help.js +100 -0
- scitex/fig/editor/flask_editor/static/js/ui/theme.js +34 -0
- scitex/fig/editor/flask_editor/templates/__init__.py +95 -5
- scitex/fig/editor/flask_editor/templates/_html.py +27 -9
- scitex/fig/editor/flask_editor/templates/_scripts.py +1928 -131
- scitex/fig/editor/flask_editor/templates/_styles.py +363 -51
- scitex/fig/io/_bundle.py +104 -19
- scitex/fts/README.md +262 -0
- scitex/fts/TODO.md +66 -0
- scitex/fts/__init__.py +90 -0
- scitex/fts/_bundle/README_IN_BUNDLE.md +102 -0
- scitex/fts/_bundle/_FTS.py +657 -0
- scitex/fts/_bundle/__init__.py +38 -0
- scitex/fts/_bundle/_children.py +216 -0
- scitex/fts/_bundle/_conversion/__init__.py +15 -0
- scitex/fts/_bundle/_conversion/_bundle2dict.py +44 -0
- scitex/fts/_bundle/_conversion/_dict2bundle.py +50 -0
- scitex/fts/_bundle/_dataclasses/_Axes.py +57 -0
- scitex/fts/_bundle/_dataclasses/_BBox.py +54 -0
- scitex/fts/_bundle/_dataclasses/_ColumnDef.py +72 -0
- scitex/fts/_bundle/_dataclasses/_DataFormat.py +40 -0
- scitex/fts/_bundle/_dataclasses/_DataInfo.py +135 -0
- scitex/fts/_bundle/_dataclasses/_DataSource.py +44 -0
- scitex/fts/_bundle/_dataclasses/_Node.py +319 -0
- scitex/fts/_bundle/_dataclasses/_NodeRefs.py +45 -0
- scitex/fts/_bundle/_dataclasses/_SizeMM.py +38 -0
- scitex/fts/_bundle/_dataclasses/__init__.py +35 -0
- scitex/fts/_bundle/_extractors/__init__.py +32 -0
- scitex/fts/_bundle/_extractors/_extract_bar.py +131 -0
- scitex/fts/_bundle/_extractors/_extract_line.py +71 -0
- scitex/fts/_bundle/_extractors/_extract_scatter.py +79 -0
- scitex/fts/_bundle/_loader.py +134 -0
- scitex/fts/_bundle/_mpl_helpers.py +389 -0
- scitex/fts/_bundle/_saver.py +269 -0
- scitex/fts/_bundle/_storage.py +200 -0
- scitex/fts/_bundle/_utils/__init__.py +55 -0
- scitex/fts/_bundle/_utils/_const.py +26 -0
- scitex/fts/_bundle/_utils/_errors.py +73 -0
- scitex/fts/_bundle/_utils/_generate.py +21 -0
- scitex/fts/_bundle/_utils/_types.py +76 -0
- scitex/fts/_bundle/_validation.py +434 -0
- scitex/fts/_bundle/_zipbundle.py +165 -0
- scitex/fts/_fig/__init__.py +22 -0
- scitex/fts/_fig/_backend/__init__.py +53 -0
- scitex/fts/_fig/_backend/_export.py +165 -0
- scitex/fts/_fig/_backend/_parser.py +188 -0
- scitex/fts/_fig/_backend/_render.py +538 -0
- scitex/fts/_fig/_composite.py +345 -0
- scitex/fts/_fig/_dataclasses/_ChannelEncoding.py +46 -0
- scitex/fts/_fig/_dataclasses/_Encoding.py +82 -0
- scitex/fts/_fig/_dataclasses/_Theme.py +441 -0
- scitex/fts/_fig/_dataclasses/_TraceEncoding.py +52 -0
- scitex/fts/_fig/_dataclasses/__init__.py +47 -0
- scitex/fts/_fig/_editor/__init__.py +14 -0
- scitex/fts/_fig/_editor/_cui/__init__.py +33 -0
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +39 -0
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +366 -0
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +175 -0
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +52 -0
- scitex/fts/_fig/_editor/_cui/_panel_loader.py +246 -0
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +66 -0
- scitex/fts/_fig/_editor/_defaults.py +300 -0
- scitex/fts/_fig/_editor/_gui/__init__.py +11 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +20 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_bbox.py +1339 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_core.py +1688 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +664 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_renderer.py +853 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +79 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +41 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +16 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +85 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +217 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +93 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +57 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +112 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +59 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +212 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/canvas.css +176 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +190 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +59 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +45 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +95 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +101 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +138 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +31 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +7 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +56 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +78 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +314 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +107 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +54 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +172 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +258 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +48 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +71 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +288 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +143 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +245 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +992 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +339 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +286 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +371 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +293 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +426 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +152 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +265 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +184 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +57 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +100 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +34 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +124 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +851 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +4932 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +1657 -0
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +36 -0
- scitex/fts/_fig/_models/_Annotations.py +115 -0
- scitex/fts/_fig/_models/_Axes.py +152 -0
- scitex/fts/_fig/_models/_Figure.py +138 -0
- scitex/fts/_fig/_models/_Guides.py +104 -0
- scitex/fts/_fig/_models/_Plot.py +123 -0
- scitex/fts/_fig/_models/_Styles.py +245 -0
- scitex/fts/_fig/_models/__init__.py +80 -0
- scitex/fts/_fig/_models/_plot_types/__init__.py +156 -0
- scitex/fts/_fig/_models/_plot_types/_bar.py +43 -0
- scitex/fts/_fig/_models/_plot_types/_box.py +38 -0
- scitex/fts/_fig/_models/_plot_types/_distribution.py +36 -0
- scitex/fts/_fig/_models/_plot_types/_errorbar.py +60 -0
- scitex/fts/_fig/_models/_plot_types/_histogram.py +30 -0
- scitex/fts/_fig/_models/_plot_types/_image.py +61 -0
- scitex/fts/_fig/_models/_plot_types/_line.py +57 -0
- scitex/fts/_fig/_models/_plot_types/_scatter.py +30 -0
- scitex/fts/_fig/_models/_plot_types/_seaborn.py +121 -0
- scitex/fts/_fig/_models/_plot_types/_violin.py +36 -0
- scitex/fts/_fig/_utils/__init__.py +129 -0
- scitex/fts/_fig/_utils/_auto_layout.py +127 -0
- scitex/fts/_fig/_utils/_calc_bounds.py +111 -0
- scitex/fts/_fig/_utils/_const_sizes.py +48 -0
- scitex/fts/_fig/_utils/_convert_coords.py +77 -0
- scitex/fts/_fig/_utils/_get_template.py +178 -0
- scitex/fts/_fig/_utils/_normalize.py +73 -0
- scitex/fts/_fig/_utils/_plot_layout.py +397 -0
- scitex/fts/_fig/_utils/_validate.py +197 -0
- scitex/fts/_kinds/__init__.py +45 -0
- scitex/fts/_kinds/_figure/__init__.py +19 -0
- scitex/fts/_kinds/_figure/_composite.py +345 -0
- scitex/fts/_kinds/_plot/__init__.py +25 -0
- scitex/fts/_kinds/_plot/_backend/__init__.py +53 -0
- scitex/fts/_kinds/_plot/_backend/_export.py +165 -0
- scitex/fts/_kinds/_plot/_backend/_parser.py +188 -0
- scitex/fts/_kinds/_plot/_backend/_render.py +538 -0
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +46 -0
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +82 -0
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +441 -0
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +52 -0
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +47 -0
- scitex/fts/_kinds/_plot/_models/_Annotations.py +115 -0
- scitex/fts/_kinds/_plot/_models/_Axes.py +152 -0
- scitex/fts/_kinds/_plot/_models/_Figure.py +138 -0
- scitex/fts/_kinds/_plot/_models/_Guides.py +104 -0
- scitex/fts/_kinds/_plot/_models/_Plot.py +123 -0
- scitex/fts/_kinds/_plot/_models/_Styles.py +245 -0
- scitex/fts/_kinds/_plot/_models/__init__.py +80 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +156 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +43 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +38 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +36 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +60 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +30 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +61 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +57 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +30 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +121 -0
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +36 -0
- scitex/fts/_kinds/_plot/_utils/__init__.py +129 -0
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +127 -0
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +111 -0
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +48 -0
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +77 -0
- scitex/fts/_kinds/_plot/_utils/_get_template.py +178 -0
- scitex/fts/_kinds/_plot/_utils/_normalize.py +73 -0
- scitex/fts/_kinds/_plot/_utils/_plot_layout.py +397 -0
- scitex/fts/_kinds/_plot/_utils/_validate.py +197 -0
- scitex/fts/_kinds/_shape/__init__.py +141 -0
- scitex/fts/_kinds/_stats/__init__.py +56 -0
- scitex/fts/_kinds/_stats/_dataclasses/_Stats.py +423 -0
- scitex/fts/_kinds/_stats/_dataclasses/__init__.py +48 -0
- scitex/fts/_kinds/_table/__init__.py +72 -0
- scitex/fts/_kinds/_table/_latex/__init__.py +93 -0
- scitex/fts/_kinds/_table/_latex/_editor/__init__.py +11 -0
- scitex/fts/_kinds/_table/_latex/_editor/_app.py +725 -0
- scitex/fts/_kinds/_table/_latex/_export.py +279 -0
- scitex/fts/_kinds/_table/_latex/_figure_exporter.py +153 -0
- scitex/fts/_kinds/_table/_latex/_stats_formatter.py +274 -0
- scitex/fts/_kinds/_table/_latex/_table_exporter.py +362 -0
- scitex/fts/_kinds/_table/_latex/_utils.py +369 -0
- scitex/fts/_kinds/_table/_latex/_validator.py +445 -0
- scitex/fts/_kinds/_text/__init__.py +77 -0
- scitex/fts/_schemas/data_info.schema.json +75 -0
- scitex/fts/_schemas/encoding.schema.json +90 -0
- scitex/fts/_schemas/node.schema.json +145 -0
- scitex/fts/_schemas/render_manifest.schema.json +62 -0
- scitex/fts/_schemas/stats.schema.json +132 -0
- scitex/fts/_schemas/theme.schema.json +141 -0
- scitex/fts/_stats/__init__.py +48 -0
- scitex/fts/_stats/_dataclasses/_Stats.py +423 -0
- scitex/fts/_stats/_dataclasses/__init__.py +48 -0
- scitex/fts/_tables/__init__.py +65 -0
- scitex/fts/_tables/_latex/__init__.py +93 -0
- scitex/fts/_tables/_latex/_editor/__init__.py +11 -0
- scitex/fts/_tables/_latex/_editor/_app.py +725 -0
- scitex/fts/_tables/_latex/_export.py +279 -0
- scitex/fts/_tables/_latex/_figure_exporter.py +153 -0
- scitex/fts/_tables/_latex/_stats_formatter.py +274 -0
- scitex/fts/_tables/_latex/_table_exporter.py +362 -0
- scitex/fts/_tables/_latex/_utils.py +369 -0
- scitex/fts/_tables/_latex/_validator.py +445 -0
- scitex/gen/__init__.py +66 -25
- scitex/gen/misc.py +28 -0
- scitex/io/__init__.py +47 -20
- scitex/io/_load.py +87 -36
- scitex/io/_load_modules/__init__.py +10 -7
- scitex/io/_load_modules/_pandas.py +6 -1
- scitex/io/_save.py +299 -1556
- scitex/io/_save_modules/__init__.py +76 -19
- scitex/io/_save_modules/_figure_utils.py +90 -0
- scitex/io/_save_modules/_image_csv.py +497 -0
- scitex/io/_save_modules/_legends.py +91 -0
- scitex/io/_save_modules/_pltz_bundle.py +356 -0
- scitex/io/_save_modules/_pltz_stx.py +536 -0
- scitex/io/_save_modules/_stx_bundle.py +104 -0
- scitex/io/_save_modules/_symlink.py +96 -0
- scitex/io/_save_modules/_yaml.py +1 -1
- scitex/io/_save_modules/_zarr.py +64 -18
- scitex/io/bundle/README.md +212 -0
- scitex/io/bundle/__init__.py +110 -0
- scitex/io/{_bundle.py → bundle/_core.py} +219 -89
- scitex/io/bundle/_nested.py +713 -0
- scitex/io/bundle/_types.py +74 -0
- scitex/io/bundle/_zip.py +487 -0
- scitex/io/utils/h5_to_zarr.py +1 -1
- scitex/logging/__init__.py +108 -13
- scitex/logging/_errors.py +508 -0
- scitex/logging/_formatters.py +30 -6
- scitex/logging/_warnings.py +261 -0
- scitex/plt/__init__.py +4 -1
- scitex/plt/_figrecipe.py +236 -0
- scitex/plt/_subplots/_AxisWrapper.py +6 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/__init__.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_labels.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_metadata.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin/_visual.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_base.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_scientific.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_statistical.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/_stx_aliases.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_RawMatplotlibMixin.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/__init__.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_base.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +0 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +112 -1
- scitex/plt/_subplots/_FigWrapper.py +15 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +125 -489
- scitex/plt/_subplots/_export_as_csv.py +11 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +2 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_pcolormesh.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stackplot.py +62 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_bar.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_barh.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_errorbar.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_stx_scatter.py +0 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +208 -0
- scitex/plt/_subplots/_fonts.py +71 -0
- scitex/plt/_subplots/_mm_layout.py +282 -0
- scitex/plt/gallery/__init__.py +99 -2
- scitex/plt/io/_layered_bundle.py +0 -0
- scitex/plt/styles/_plot_postprocess.py +3 -1
- scitex/plt/utils/_configure_mpl.py +16 -19
- scitex/repro/_RandomStateManager.py +13 -8
- scitex/resource/__init__.py +19 -1
- scitex/resource/_utils/_get_env_info.py +13 -25
- scitex/schema/__init__.py +149 -160
- scitex/schema/_encoding.py +273 -0
- scitex/schema/_figure_elements.py +406 -0
- scitex/schema/_plot.py +0 -0
- scitex/schema/_theme.py +360 -0
- scitex/schema/_validation.py +0 -98
- scitex/scholar/__init__.py +56 -14
- scitex/scholar/auth/ScholarAuthManager.py +1 -1
- scitex/scholar/auth/__init__.py +11 -2
- scitex/scholar/auth/providers/BaseAuthenticator.py +1 -1
- scitex/scholar/auth/providers/EZProxyAuthenticator.py +1 -1
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +1 -1
- scitex/scholar/auth/providers/ShibbolethAuthenticator.py +1 -1
- scitex/scholar/config/ScholarConfig.py +1 -1
- scitex/scholar/core/Scholar.py +1 -1
- scitex/session/_decorator.py +18 -16
- scitex/session/_lifecycle.py +9 -11
- scitex/session/template.py +9 -8
- scitex/sh/test_sh.py +72 -0
- scitex/sh/test_sh_simple.py +61 -0
- scitex/stats/__init__.py +221 -97
- scitex/stats/_schema.py +21 -22
- scitex/stats/descriptive/_circular.py +212 -351
- scitex/stats/descriptive/_describe.py +81 -132
- scitex/stats/descriptive/_nan.py +205 -433
- scitex/stats/descriptive/_real.py +127 -141
- scitex/str/_format_plot_text.py +5 -5
- scitex/str/_latex.py +26 -84
- scitex/str/_latex_fallback.py +53 -47
- scitex/web/_search_pubmed.py +5 -4
- scitex/writer/tests/test_diff_between.py +451 -0
- scitex/writer/tests/test_document_section.py +311 -0
- scitex/writer/tests/test_document_workflow.py +393 -0
- scitex/writer/tests/test_writer.py +361 -0
- scitex/writer/tests/test_writer_integration.py +303 -0
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/METADATA +364 -181
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/RECORD +479 -108
- scitex/fig/editor/_edit.py +0 -751
- scitex/scholar/docs/to_claude/guidelines/examples/mgmt/ARCHITECTURE_EXAMPLE.md +0 -905
- scitex/scholar/docs/to_claude/guidelines/examples/mgmt/BULLETIN_BOARD_EXAMPLE.md +0 -99
- scitex/scholar/docs/to_claude/guidelines/examples/mgmt/PROJECT_DESCRIPTION_EXAMPLE.md +0 -96
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/WHEEL +0 -0
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.7.3.dist-info → scitex-2.10.0.dist-info}/licenses/LICENSE +0 -0
scitex/logging/__init__.py
CHANGED
|
@@ -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
|
|
145
|
+
# Export public API
|
|
101
146
|
__all__ = [
|
|
102
|
-
# Core logging functions
|
|
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
|
|
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
|