scitex 2.8.1__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/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/edit/panel_loader.py +1 -1
- scitex/fig/io/_bundle.py +7 -7
- 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 -32
- 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} +168 -97
- scitex/io/bundle/_nested.py +713 -0
- scitex/io/bundle/_types.py +74 -0
- scitex/io/{_zip_bundle.py → bundle/_zip.py} +93 -45
- 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/_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/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/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/_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.8.1.dist-info → scitex-2.10.0.dist-info}/METADATA +364 -181
- {scitex-2.8.1.dist-info → scitex-2.10.0.dist-info}/RECORD +412 -97
- 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.8.1.dist-info → scitex-2.10.0.dist-info}/WHEEL +0 -0
- {scitex-2.8.1.dist-info → scitex-2.10.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.8.1.dist-info → scitex-2.10.0.dist-info}/licenses/LICENSE +0 -0
scitex/io/__init__.py
CHANGED
|
@@ -1,32 +1,57 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
# File: /ssh:sp:/home/ywatanabe/proj/scitex_repo/src/scitex/io/__init__.py
|
|
2
|
+
# Timestamp: "2025-12-16 (ywatanabe)"
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/__init__.py
|
|
5
4
|
# ----------------------------------------
|
|
6
5
|
import os
|
|
7
6
|
|
|
8
7
|
__FILE__ = __file__
|
|
9
8
|
__DIR__ = os.path.dirname(__FILE__)
|
|
10
9
|
# ----------------------------------------
|
|
11
|
-
"""Scitex IO module with lazy imports to avoid circular dependencies.
|
|
10
|
+
"""Scitex IO module with lazy imports to avoid circular dependencies.
|
|
11
|
+
|
|
12
|
+
Bundle I/O is handled via scitex.fts:
|
|
13
|
+
from scitex.fts import FTS
|
|
14
|
+
bundle = FTS("Figure1.stx")
|
|
15
|
+
bundle.save()
|
|
16
|
+
"""
|
|
12
17
|
|
|
13
18
|
# Import commonly used functions directly
|
|
14
|
-
from .
|
|
19
|
+
from ._cache import cache
|
|
20
|
+
from ._flush import flush
|
|
21
|
+
from ._glob import glob, parse_glob
|
|
15
22
|
from ._load import load
|
|
16
23
|
|
|
17
|
-
# Bundle I/O
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
# - scitex.fig.save_figz() / load_figz()
|
|
21
|
-
# - scitex.stats.save_statsz() / load_statsz()
|
|
22
|
-
# Internal bundle functions available via scitex.io._bundle for module implementations
|
|
24
|
+
# Bundle I/O - import the bundle submodule
|
|
25
|
+
from . import bundle
|
|
26
|
+
|
|
23
27
|
from ._load_configs import load_configs
|
|
24
|
-
from ._glob import glob, parse_glob
|
|
25
28
|
from ._reload import reload
|
|
26
|
-
from .
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
29
|
+
from ._save import save
|
|
30
|
+
|
|
31
|
+
# Optional: HDF5 explorer (requires h5py)
|
|
32
|
+
try:
|
|
33
|
+
from ._load_modules._H5Explorer import H5Explorer, explore_h5, has_h5_key
|
|
34
|
+
except ImportError:
|
|
35
|
+
H5Explorer = None
|
|
36
|
+
explore_h5 = None
|
|
37
|
+
has_h5_key = None
|
|
38
|
+
|
|
39
|
+
# Optional: Zarr explorer (requires zarr)
|
|
40
|
+
try:
|
|
41
|
+
from ._load_modules._ZarrExplorer import ZarrExplorer, explore_zarr, has_zarr_key
|
|
42
|
+
except ImportError:
|
|
43
|
+
ZarrExplorer = None
|
|
44
|
+
explore_zarr = None
|
|
45
|
+
has_zarr_key = None
|
|
46
|
+
|
|
47
|
+
# Import load cache control functions
|
|
48
|
+
from ._load_cache import (
|
|
49
|
+
clear_cache as clear_load_cache,
|
|
50
|
+
)
|
|
51
|
+
from ._load_cache import (
|
|
52
|
+
configure_cache,
|
|
53
|
+
get_cache_info,
|
|
54
|
+
)
|
|
30
55
|
|
|
31
56
|
# Import load cache control functions
|
|
32
57
|
from ._load_cache import (
|
|
@@ -39,13 +64,13 @@ from ._load_cache import (
|
|
|
39
64
|
try:
|
|
40
65
|
from ._save_modules import (
|
|
41
66
|
save_image,
|
|
42
|
-
save_text,
|
|
43
|
-
save_mp4,
|
|
44
67
|
save_listed_dfs_as_csv,
|
|
45
68
|
save_listed_scalars_as_csv,
|
|
69
|
+
save_mp4,
|
|
46
70
|
save_optuna_study_as_csv_and_pngs,
|
|
71
|
+
save_text,
|
|
47
72
|
)
|
|
48
|
-
except ImportError
|
|
73
|
+
except ImportError:
|
|
49
74
|
# Fallback for missing functions
|
|
50
75
|
save_image = None
|
|
51
76
|
save_text = None
|
|
@@ -79,24 +104,18 @@ except ImportError:
|
|
|
79
104
|
|
|
80
105
|
# Import metadata functions
|
|
81
106
|
try:
|
|
82
|
-
from ._metadata import
|
|
107
|
+
from ._metadata import embed_metadata, has_metadata, read_metadata
|
|
83
108
|
except ImportError:
|
|
84
109
|
read_metadata = None
|
|
85
110
|
embed_metadata = None
|
|
86
111
|
has_metadata = None
|
|
87
112
|
|
|
88
|
-
# Import ZipBundle for in-memory zip access
|
|
89
|
-
try:
|
|
90
|
-
from ._zip_bundle import ZipBundle, open_bundle, create_bundle
|
|
91
|
-
except ImportError:
|
|
92
|
-
ZipBundle = None
|
|
93
|
-
open_bundle = None
|
|
94
|
-
create_bundle = None
|
|
95
|
-
|
|
96
113
|
__all__ = [
|
|
97
114
|
# Primary I/O
|
|
98
115
|
"save",
|
|
99
116
|
"load",
|
|
117
|
+
# Bundle submodule
|
|
118
|
+
"bundle",
|
|
100
119
|
# Config loading
|
|
101
120
|
"load_configs",
|
|
102
121
|
# File utilities
|
|
@@ -104,10 +123,6 @@ __all__ = [
|
|
|
104
123
|
"reload",
|
|
105
124
|
"flush",
|
|
106
125
|
"cache",
|
|
107
|
-
# Zip bundle access
|
|
108
|
-
"ZipBundle",
|
|
109
|
-
"open_bundle",
|
|
110
|
-
"create_bundle",
|
|
111
126
|
]
|
|
112
127
|
|
|
113
128
|
# EOF
|
scitex/io/_load.py
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: "2025-08-11 05:54:51 (ywatanabe)"
|
|
4
3
|
# File: /home/ywatanabe/proj/SciTeX-Code/src/scitex/io/_load.py
|
|
5
4
|
# ----------------------------------------
|
|
6
5
|
from __future__ import annotations
|
|
6
|
+
|
|
7
7
|
import os
|
|
8
8
|
|
|
9
9
|
__FILE__ = __file__
|
|
@@ -15,37 +15,89 @@ from pathlib import Path
|
|
|
15
15
|
from typing import Any, Union
|
|
16
16
|
|
|
17
17
|
from scitex.decorators import preserve_doc
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
from ._load_cache import (
|
|
20
20
|
cache_data,
|
|
21
|
-
configure_cache,
|
|
22
|
-
get_cache_info,
|
|
23
21
|
get_cached_data,
|
|
24
22
|
load_npy_cached,
|
|
25
23
|
)
|
|
26
|
-
from ._load_modules._bibtex import _load_bibtex
|
|
27
24
|
|
|
28
|
-
#
|
|
29
|
-
from ._load_modules.
|
|
30
|
-
from ._load_modules._docx import _load_docx
|
|
31
|
-
from ._load_modules._eeg import _load_eeg_data
|
|
32
|
-
from ._load_modules._hdf5 import _load_hdf5
|
|
33
|
-
from ._load_modules._image import _load_image
|
|
34
|
-
from ._load_modules._joblib import _load_joblib
|
|
25
|
+
# Core loaders (no special dependencies)
|
|
26
|
+
from ._load_modules._bibtex import _load_bibtex
|
|
35
27
|
from ._load_modules._json import _load_json
|
|
36
28
|
from ._load_modules._markdown import _load_markdown
|
|
37
|
-
from ._load_modules._matlab import _load_matlab
|
|
38
29
|
from ._load_modules._numpy import _load_npy
|
|
39
30
|
from ._load_modules._pandas import _load_csv, _load_excel, _load_tsv
|
|
40
|
-
from ._load_modules._pdf import _load_pdf
|
|
41
31
|
from ._load_modules._pickle import _load_pickle
|
|
42
|
-
from ._load_modules._sqlite3 import _load_db_sqlite3
|
|
43
|
-
from ._load_modules._torch import _load_torch
|
|
44
32
|
from ._load_modules._txt import _load_txt
|
|
45
33
|
from ._load_modules._xml import _load_xml
|
|
46
34
|
from ._load_modules._yaml import _load_yaml
|
|
47
|
-
|
|
48
|
-
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
# Optional loaders - wrapped for missing dependencies
|
|
38
|
+
def _unavailable_loader(name):
|
|
39
|
+
def _loader(*args, **kwargs):
|
|
40
|
+
raise ImportError(
|
|
41
|
+
f"Loader for {name} not available. Install required dependencies."
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
return _loader
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
from ._load_modules._con import _load_con
|
|
49
|
+
except ImportError:
|
|
50
|
+
_load_con = _unavailable_loader("con")
|
|
51
|
+
|
|
52
|
+
try:
|
|
53
|
+
from ._load_modules._docx import _load_docx
|
|
54
|
+
except ImportError:
|
|
55
|
+
_load_docx = _unavailable_loader("docx")
|
|
56
|
+
|
|
57
|
+
try:
|
|
58
|
+
from ._load_modules._eeg import _load_eeg_data
|
|
59
|
+
except ImportError:
|
|
60
|
+
_load_eeg_data = _unavailable_loader("eeg")
|
|
61
|
+
|
|
62
|
+
try:
|
|
63
|
+
from ._load_modules._hdf5 import _load_hdf5
|
|
64
|
+
except ImportError:
|
|
65
|
+
_load_hdf5 = _unavailable_loader("hdf5")
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
from ._load_modules._image import _load_image
|
|
69
|
+
except ImportError:
|
|
70
|
+
_load_image = _unavailable_loader("image")
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
from ._load_modules._joblib import _load_joblib
|
|
74
|
+
except ImportError:
|
|
75
|
+
_load_joblib = _unavailable_loader("joblib")
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
from ._load_modules._matlab import _load_matlab
|
|
79
|
+
except ImportError:
|
|
80
|
+
_load_matlab = _unavailable_loader("matlab")
|
|
81
|
+
|
|
82
|
+
try:
|
|
83
|
+
from ._load_modules._pdf import _load_pdf
|
|
84
|
+
except ImportError:
|
|
85
|
+
_load_pdf = _unavailable_loader("pdf")
|
|
86
|
+
|
|
87
|
+
try:
|
|
88
|
+
from ._load_modules._sqlite3 import _load_db_sqlite3
|
|
89
|
+
except ImportError:
|
|
90
|
+
_load_db_sqlite3 = _unavailable_loader("sqlite3")
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
from ._load_modules._torch import _load_torch
|
|
94
|
+
except ImportError:
|
|
95
|
+
_load_torch = _unavailable_loader("torch")
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
from ._load_modules._zarr import _load_zarr
|
|
99
|
+
except ImportError:
|
|
100
|
+
_load_zarr = _unavailable_loader("zarr")
|
|
49
101
|
|
|
50
102
|
|
|
51
103
|
def _load_bundle(lpath, verbose=False, **kwargs):
|
|
@@ -70,18 +122,20 @@ def _load_bundle(lpath, verbose=False, **kwargs):
|
|
|
70
122
|
For .statsz bundles:
|
|
71
123
|
dict: Stats data with 'spec' and 'comparisons'.
|
|
72
124
|
"""
|
|
73
|
-
from .
|
|
125
|
+
from .bundle import BundleType
|
|
126
|
+
from .bundle import load as load_bundle
|
|
74
127
|
|
|
75
128
|
bundle = load_bundle(lpath)
|
|
76
|
-
bundle_type = bundle.get(
|
|
129
|
+
bundle_type = bundle.get("type")
|
|
77
130
|
|
|
78
131
|
if bundle_type == BundleType.PLTZ:
|
|
79
132
|
# Return (fig, ax, data) tuple for .pltz bundles
|
|
80
133
|
# Note: We return the spec and data, not a reconstructed figure
|
|
81
134
|
# as matplotlib figures cannot be perfectly serialized/deserialized
|
|
82
|
-
import matplotlib.pyplot as plt
|
|
83
135
|
from pathlib import Path
|
|
84
136
|
|
|
137
|
+
import matplotlib.pyplot as plt
|
|
138
|
+
|
|
85
139
|
p = Path(lpath)
|
|
86
140
|
bundle_dir = p
|
|
87
141
|
|
|
@@ -89,13 +143,14 @@ def _load_bundle(lpath, verbose=False, **kwargs):
|
|
|
89
143
|
if not p.is_dir():
|
|
90
144
|
import tempfile
|
|
91
145
|
import zipfile
|
|
146
|
+
|
|
92
147
|
temp_dir = Path(tempfile.mkdtemp())
|
|
93
|
-
with zipfile.ZipFile(p,
|
|
148
|
+
with zipfile.ZipFile(p, "r") as zf:
|
|
94
149
|
zf.extractall(temp_dir)
|
|
95
150
|
bundle_dir = temp_dir
|
|
96
151
|
|
|
97
152
|
# Find PNG file - layered format stores in exports/
|
|
98
|
-
basename = bundle.get(
|
|
153
|
+
basename = bundle.get("basename", "plot")
|
|
99
154
|
png_path = bundle_dir / "exports" / f"{basename}.png"
|
|
100
155
|
if not png_path.exists():
|
|
101
156
|
# Fallback to root level (legacy format)
|
|
@@ -106,28 +161,28 @@ def _load_bundle(lpath, verbose=False, **kwargs):
|
|
|
106
161
|
img = plt.imread(str(png_path))
|
|
107
162
|
fig, ax = plt.subplots()
|
|
108
163
|
ax.imshow(img)
|
|
109
|
-
ax.axis(
|
|
164
|
+
ax.axis("off")
|
|
110
165
|
|
|
111
166
|
# Attach metadata from spec
|
|
112
|
-
spec = bundle.get(
|
|
167
|
+
spec = bundle.get("spec", {})
|
|
113
168
|
if spec:
|
|
114
169
|
# Handle both layered and legacy spec formats
|
|
115
|
-
axes_list = spec.get(
|
|
170
|
+
axes_list = spec.get("axes", [])
|
|
116
171
|
if axes_list and isinstance(axes_list, list):
|
|
117
172
|
for key, val in axes_list[0].items():
|
|
118
|
-
setattr(ax, f
|
|
173
|
+
setattr(ax, f"_scitex_{key}", val)
|
|
119
174
|
# Theme from style (layered) or spec (legacy)
|
|
120
|
-
style = bundle.get(
|
|
121
|
-
theme = style.get(
|
|
175
|
+
style = bundle.get("style", {})
|
|
176
|
+
theme = style.get("theme", {}) if style else spec.get("theme", {})
|
|
122
177
|
if theme:
|
|
123
|
-
fig._scitex_theme = theme.get(
|
|
178
|
+
fig._scitex_theme = theme.get("mode")
|
|
124
179
|
|
|
125
180
|
# Data from bundle (merged in load_layered_pltz_bundle)
|
|
126
|
-
data = bundle.get(
|
|
181
|
+
data = bundle.get("data")
|
|
127
182
|
return fig, ax, data
|
|
128
183
|
else:
|
|
129
184
|
# No PNG, return spec and data
|
|
130
|
-
return bundle.get(
|
|
185
|
+
return bundle.get("spec"), None, bundle.get("data")
|
|
131
186
|
|
|
132
187
|
elif bundle_type == BundleType.FIGZ:
|
|
133
188
|
# Return figure dict for .figz bundles
|
|
@@ -245,10 +300,6 @@ def load(
|
|
|
245
300
|
if verbose:
|
|
246
301
|
print(f"[DEBUG] After Path conversion: {lpath}")
|
|
247
302
|
|
|
248
|
-
# Handle .canvas directories (special case - directory not file)
|
|
249
|
-
if lpath.endswith(".canvas"):
|
|
250
|
-
return _load_canvas(lpath, verbose=verbose, **kwargs)
|
|
251
|
-
|
|
252
303
|
# Handle bundle formats (.pltz, .figz, .statsz and their .d variants)
|
|
253
304
|
bundle_extensions = (".figz", ".pltz", ".statsz")
|
|
254
305
|
for bext in bundle_extensions:
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Time-stamp: "2024-11-14 07:41:25 (ywatanabe)"
|
|
4
3
|
# File: ./scitex_repo/src/scitex/io/_load_modules/__init__.py
|
|
5
4
|
|
|
@@ -14,13 +13,17 @@ current_dir = __os.path.dirname(__file__)
|
|
|
14
13
|
for filename in __os.listdir(current_dir):
|
|
15
14
|
if filename.endswith(".py") and not filename.startswith("__"):
|
|
16
15
|
module_name = filename[:-3] # Remove .py extension
|
|
17
|
-
|
|
16
|
+
try:
|
|
17
|
+
module = __importlib.import_module(f".{module_name}", package=__name__)
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
19
|
+
# Import only functions and classes from the module
|
|
20
|
+
for name, obj in __inspect.getmembers(module):
|
|
21
|
+
if __inspect.isfunction(obj) or __inspect.isclass(obj):
|
|
22
|
+
if not name.startswith("_"):
|
|
23
|
+
globals()[name] = obj
|
|
24
|
+
except ImportError:
|
|
25
|
+
# Skip modules with missing optional dependencies
|
|
26
|
+
pass
|
|
24
27
|
|
|
25
28
|
# Clean up temporary variables
|
|
26
29
|
del (
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Time-stamp: "2024-11-14 07:41:31 (ywatanabe)"
|
|
4
3
|
# File: ./scitex_repo/src/scitex/io/_load_modules/_pandas.py
|
|
5
4
|
|
|
@@ -35,6 +34,8 @@ def _load_csv(lpath, **kwargs):
|
|
|
35
34
|
|
|
36
35
|
def _load_tsv(lpath, **kwargs):
|
|
37
36
|
"""Load TSV files."""
|
|
37
|
+
import pandas as pd
|
|
38
|
+
|
|
38
39
|
if not lpath.endswith(".tsv"):
|
|
39
40
|
raise ValueError("File must have .tsv extension")
|
|
40
41
|
return pd.read_csv(lpath, sep="\t", **kwargs)
|
|
@@ -42,6 +43,8 @@ def _load_tsv(lpath, **kwargs):
|
|
|
42
43
|
|
|
43
44
|
def _load_excel(lpath, **kwargs):
|
|
44
45
|
"""Load Excel files."""
|
|
46
|
+
import pandas as pd
|
|
47
|
+
|
|
45
48
|
if not lpath.endswith((".xls", ".xlsx", ".xlsm", ".xlsb")):
|
|
46
49
|
raise ValueError("File must have Excel extension")
|
|
47
50
|
return pd.read_excel(lpath, **kwargs)
|
|
@@ -49,6 +52,8 @@ def _load_excel(lpath, **kwargs):
|
|
|
49
52
|
|
|
50
53
|
def _load_parquet(lpath, **kwargs):
|
|
51
54
|
"""Load Parquet files."""
|
|
55
|
+
import pandas as pd
|
|
56
|
+
|
|
52
57
|
if not lpath.endswith(".parquet"):
|
|
53
58
|
raise ValueError("File must have .parquet extension")
|
|
54
59
|
return pd.read_parquet(lpath, **kwargs)
|