scitex 2.10.3__py3-none-any.whl → 2.13.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scitex/__init__.py +1 -4
- scitex/__main__.py +24 -5
- scitex/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- scitex/_optional_deps.py +33 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +1 -1
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +2 -2
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +2 -2
- scitex/ai/classification/timeseries/_normalize_timestamp.py +1 -1
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +1 -1
- scitex/ai/plt/_plot_feature_importance.py +1 -1
- scitex/ai/plt/_plot_learning_curve.py +1 -1
- scitex/ai/plt/_plot_optuna_study.py +1 -1
- scitex/ai/plt/_plot_pre_rec_curve.py +1 -1
- scitex/ai/plt/_plot_roc_curve.py +1 -1
- scitex/ai/plt/_stx_conf_mat.py +1 -1
- scitex/ai/training/_LearningCurveLogger.py +1 -1
- scitex/audio/mcp_server.py +38 -8
- scitex/bridge/_figrecipe.py +1 -1
- scitex/bridge/_helpers.py +1 -1
- scitex/bridge/_plt_vis.py +1 -1
- scitex/bridge/_stats_plt.py +1 -1
- scitex/bridge/_stats_vis.py +2 -2
- scitex/browser/automation/CookieHandler.py +1 -1
- scitex/browser/core/BrowserMixin.py +1 -1
- scitex/browser/core/ChromeProfileManager.py +1 -1
- scitex/browser/debugging/_browser_logger.py +1 -1
- scitex/browser/debugging/_highlight_element.py +1 -1
- scitex/browser/debugging/_show_grid.py +1 -1
- scitex/browser/interaction/click_center.py +1 -1
- scitex/browser/interaction/click_with_fallbacks.py +1 -1
- scitex/browser/interaction/close_popups.py +1 -1
- scitex/browser/interaction/fill_with_fallbacks.py +1 -1
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +1 -1
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +1 -1
- scitex/browser/stealth/HumanBehavior.py +1 -1
- scitex/browser/stealth/StealthManager.py +1 -1
- scitex/{fig → canvas}/__init__.py +84 -96
- scitex/canvas/_mcp_handlers.py +372 -0
- scitex/canvas/_mcp_tool_schemas.py +219 -0
- scitex/{fig → canvas}/backend/_parser.py +1 -1
- scitex/{fig → canvas}/canvas.py +13 -14
- scitex/{fts/_fig/_editor → canvas/editor}/_defaults.py +2 -2
- scitex/{fig → canvas}/editor/edit/__init__.py +11 -14
- scitex/{fig → canvas}/editor/edit/bundle_resolver.py +56 -48
- scitex/{fig → canvas}/editor/edit/editor_launcher.py +79 -26
- scitex/{fts/_fig/_editor/_cui/_panel_loader.py → canvas/editor/edit/panel_loader.py} +8 -8
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_bbox.py +2 -1
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_core.py +84 -84
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/_renderer.py +7 -6
- scitex/{fts/_fig/_editor/_gui/_flask_editor → canvas/editor/flask_editor}/static/css/features/canvas.css +2 -2
- scitex/{fig → canvas}/editor/flask_editor/static/css/features/panel-grid.css +1 -1
- scitex/{fig → canvas}/editor/flask_editor/static/js/core/api.js +3 -4
- scitex/{fig → canvas}/editor/flask_editor/static/js/editor/preview.js +5 -5
- scitex/{fig → canvas}/editor/flask_editor/templates/_html.py +3 -3
- scitex/{fig → canvas}/editor/flask_editor/templates/_scripts.py +10 -10
- scitex/{fig → canvas}/editor/flask_editor/templates/_styles.py +3 -3
- scitex/{fig → canvas}/io/__init__.py +32 -38
- scitex/{fig → canvas}/io/_bundle.py +217 -154
- scitex/{fig → canvas}/io/_canvas.py +1 -1
- scitex/{fig → canvas}/io/_data.py +1 -1
- scitex/{fig → canvas}/io/_export.py +1 -1
- scitex/{fig → canvas}/io/_load.py +1 -1
- scitex/{fig → canvas}/io/_panel.py +1 -1
- scitex/{fig → canvas}/io/_save.py +1 -1
- scitex/canvas/mcp_server.py +151 -0
- scitex/{fig → canvas}/model/__init__.py +1 -1
- scitex/{fig → canvas}/model/_annotations.py +1 -1
- scitex/{fig → canvas}/model/_axes.py +1 -1
- scitex/{fig → canvas}/model/_figure.py +1 -1
- scitex/{fig → canvas}/model/_guides.py +1 -1
- scitex/{fig → canvas}/model/_plot.py +1 -1
- scitex/{fig → canvas}/model/_styles.py +1 -1
- scitex/{fig → canvas}/utils/__init__.py +1 -1
- scitex/capture/mcp_server.py +41 -12
- scitex/cli/audio.py +233 -0
- scitex/cli/capture.py +307 -0
- scitex/cli/convert.py +10 -6
- scitex/cli/main.py +27 -4
- scitex/cli/repro.py +233 -0
- scitex/cli/resource.py +240 -0
- scitex/cli/stats.py +325 -0
- scitex/cli/template.py +236 -0
- scitex/cli/tex.py +286 -0
- scitex/cli/web.py +11 -12
- scitex/dev/__init__.py +3 -0
- scitex/dev/_pyproject.py +405 -0
- scitex/dev/plt/__init__.py +2 -2
- scitex/dev/plt/mpl/get_dir_ax.py +1 -1
- scitex/dev/plt/mpl/get_signatures.py +1 -1
- scitex/dev/plt/mpl/get_signatures_details.py +1 -1
- scitex/diagram/README.md +7 -7
- scitex/diagram/_mcp_handlers.py +400 -0
- scitex/diagram/_mcp_tool_schemas.py +157 -0
- scitex/diagram/mcp_server.py +151 -0
- scitex/dsp/_demo_sig.py +51 -5
- scitex/dsp/_mne.py +13 -2
- scitex/dsp/_modulation_index.py +15 -3
- scitex/dsp/_pac.py +23 -5
- scitex/dsp/_psd.py +16 -4
- scitex/dsp/_resample.py +24 -4
- scitex/dsp/_transform.py +16 -3
- scitex/dsp/add_noise.py +15 -1
- scitex/dsp/norm.py +17 -2
- scitex/dsp/reference.py +17 -1
- scitex/dsp/utils/_differential_bandpass_filters.py +20 -2
- scitex/dsp/utils/_zero_pad.py +18 -4
- scitex/dt/_normalize_timestamp.py +1 -1
- scitex/git/_session.py +1 -1
- scitex/io/__init__.py +7 -19
- scitex/io/_load.py +15 -19
- scitex/io/_load_modules/_canvas.py +2 -2
- scitex/io/_load_modules/_con.py +17 -6
- scitex/io/_load_modules/_eeg.py +28 -13
- scitex/io/_load_modules/_optuna.py +21 -63
- scitex/io/_load_modules/_torch.py +11 -3
- scitex/io/_save.py +11 -16
- scitex/io/_save_modules/__init__.py +6 -10
- scitex/io/_save_modules/_canvas.py +3 -3
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +13 -2
- scitex/io/_save_modules/_plot_bundle.py +112 -0
- scitex/io/_save_modules/{_pltz_stx.py → _plot_scitex.py} +7 -7
- scitex/io/_save_modules/_stx_bundle.py +16 -16
- scitex/io/_save_modules/_torch.py +11 -3
- scitex/io/bundle/README.md +89 -80
- scitex/{fts/_bundle/_FTS.py → io/bundle/_Bundle.py} +197 -95
- scitex/io/bundle/__init__.py +67 -35
- scitex/{fts/_bundle → io/bundle}/_children.py +32 -40
- scitex/io/bundle/_core.py +184 -97
- scitex/{fts/_bundle/_dataclasses/_Node.py → io/bundle/_dataclasses/_Spec.py} +29 -23
- scitex/{fts/_bundle/_dataclasses/_NodeRefs.py → io/bundle/_dataclasses/_SpecRefs.py} +6 -6
- scitex/{fts/_bundle → io/bundle}/_dataclasses/__init__.py +4 -4
- scitex/{fts/_bundle → io/bundle}/_loader.py +19 -19
- scitex/io/bundle/_manifest.py +99 -0
- scitex/{fts/_bundle → io/bundle}/_mpl_helpers.py +119 -28
- scitex/io/bundle/_nested.py +113 -100
- scitex/{fts/_bundle → io/bundle}/_saver.py +13 -14
- scitex/{fts/_bundle → io/bundle}/_storage.py +3 -3
- scitex/io/bundle/_types.py +41 -16
- scitex/{fts/_bundle → io/bundle}/_validation.py +20 -18
- scitex/io/bundle/_zip.py +21 -31
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_backend/_parser.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Annotations.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Axes.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Figure.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Guides.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_models/_Plot.py +1 -1
- scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_Styles.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_plot/_utils/_plot_layout.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/__init__.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/_app.py +1 -1
- scitex/{fts/_tables → io/bundle/kinds/_table}/_latex/_export.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_figure_exporter.py +1 -1
- scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_table_exporter.py +1 -1
- scitex/io/bundle/schemas/__init__.py +30 -0
- scitex/mcp_server.py +159 -0
- scitex/parallel/_run.py +5 -4
- scitex/path/_find.py +60 -83
- scitex/path/_get_module_path.py +23 -21
- scitex/path/_get_spath.py +6 -27
- scitex/path/_getsize.py +23 -9
- scitex/path/_increment_version.py +31 -38
- scitex/path/_mk_spath.py +26 -29
- scitex/path/_path.py +5 -12
- scitex/path/_split.py +27 -15
- scitex/path/_this_path.py +23 -9
- scitex/plt/_mcp_handlers.py +361 -0
- scitex/plt/_mcp_tool_schemas.py +169 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin/__init__.py +2 -1
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +2 -2
- scitex/plt/gallery/_generate.py +76 -50
- scitex/plt/io/__init__.py +17 -19
- scitex/plt/io/_bundle.py +99 -52
- scitex/plt/io/_layered_bundle.py +303 -168
- scitex/plt/mcp_server.py +205 -0
- scitex/plt/utils/_csv_column_naming.py +250 -118
- scitex/repro/README_RandomStateManager.md +3 -3
- scitex/repro/_RandomStateManager.py +14 -14
- scitex/repro/_gen_ID.py +1 -1
- scitex/repro/_gen_timestamp.py +1 -1
- scitex/repro/_hash_array.py +4 -4
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/scholar/__main__.py +24 -2
- scitex/scholar/_mcp_handlers.py +685 -0
- scitex/scholar/_mcp_tool_schemas.py +339 -0
- scitex/scholar/docs/template.py +1 -1
- scitex/scholar/examples/07_storage_integration.py +1 -1
- scitex/scholar/impact_factor/jcr/ImpactFactorJCREngine.py +1 -1
- scitex/scholar/impact_factor/jcr/build_database.py +1 -1
- scitex/scholar/mcp_server.py +315 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineParallel.py +1 -1
- scitex/scholar/pipelines/ScholarPipelineSingle.py +1 -1
- scitex/scholar/storage/PaperIO.py +1 -1
- scitex/session/README.md +4 -4
- scitex/session/__init__.py +1 -1
- scitex/session/_decorator.py +9 -9
- scitex/session/_lifecycle.py +5 -5
- scitex/session/template.py +1 -1
- scitex/stats/__init__.py +30 -33
- scitex/stats/__main__.py +281 -0
- scitex/stats/_mcp_handlers.py +1191 -0
- scitex/stats/_mcp_tool_schemas.py +384 -0
- scitex/stats/_schema.py +1 -1
- scitex/stats/correct/_correct_bonferroni.py +1 -1
- scitex/stats/correct/_correct_fdr.py +1 -1
- scitex/stats/correct/_correct_fdr_.py +1 -1
- scitex/stats/correct/_correct_holm.py +1 -1
- scitex/stats/correct/_correct_sidak.py +1 -1
- scitex/stats/effect_sizes/_cliffs_delta.py +1 -1
- scitex/stats/effect_sizes/_cohens_d.py +1 -1
- scitex/stats/effect_sizes/_epsilon_squared.py +1 -1
- scitex/stats/effect_sizes/_eta_squared.py +1 -1
- scitex/stats/effect_sizes/_prob_superiority.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- scitex/stats/mcp_server.py +405 -0
- scitex/stats/posthoc/_dunnett.py +1 -1
- scitex/stats/posthoc/_games_howell.py +1 -1
- scitex/stats/posthoc/_tukey_hsd.py +1 -1
- scitex/stats/power/_power.py +1 -1
- scitex/stats/utils/_effect_size.py +1 -1
- scitex/stats/utils/_formatters.py +1 -1
- scitex/stats/utils/_power.py +1 -1
- scitex/template/_mcp_handlers.py +259 -0
- scitex/template/_mcp_tool_schemas.py +112 -0
- scitex/template/mcp_server.py +186 -0
- scitex/utils/_verify_scitex_format.py +2 -2
- scitex/utils/template.py +1 -1
- scitex/web/__init__.py +12 -11
- scitex/web/_scraping.py +26 -265
- scitex/web/download_images.py +316 -0
- scitex/writer/Writer.py +1 -1
- scitex/writer/_clone_writer_project.py +1 -1
- scitex/writer/_validate_tree_structures.py +1 -1
- scitex/writer/dataclasses/config/_WriterConfig.py +1 -1
- scitex/writer/dataclasses/contents/_ManuscriptContents.py +1 -1
- scitex/writer/dataclasses/core/_Document.py +1 -1
- scitex/writer/dataclasses/core/_DocumentSection.py +1 -1
- scitex/writer/dataclasses/results/_CompilationResult.py +1 -1
- scitex/writer/dataclasses/results/_LaTeXIssue.py +1 -1
- scitex/writer/utils/.legacy_git_retry.py +7 -5
- scitex/writer/utils/_parse_latex_logs.py +1 -1
- scitex-2.13.0.dist-info/METADATA +1231 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/RECORD +376 -470
- scitex-2.13.0.dist-info/entry_points.txt +11 -0
- scitex/fig/editor/_defaults.py +0 -300
- scitex/fig/editor/edit/panel_loader.py +0 -232
- scitex/fig/editor/flask_editor/_bbox.py +0 -1299
- scitex/fig/editor/flask_editor/_core.py +0 -1429
- scitex/fig/editor/flask_editor/_renderer.py +0 -813
- scitex/fig/editor/flask_editor/static/css/features/canvas.css +0 -176
- scitex/fts/README.md +0 -262
- scitex/fts/TODO.md +0 -66
- scitex/fts/__init__.py +0 -90
- scitex/fts/_bundle/README_IN_BUNDLE.md +0 -102
- scitex/fts/_bundle/__init__.py +0 -38
- scitex/fts/_bundle/_utils/__init__.py +0 -55
- scitex/fts/_bundle/_utils/_const.py +0 -26
- scitex/fts/_bundle/_utils/_errors.py +0 -73
- scitex/fts/_bundle/_utils/_generate.py +0 -21
- scitex/fts/_bundle/_utils/_types.py +0 -76
- scitex/fts/_bundle/_zipbundle.py +0 -165
- scitex/fts/_fig/__init__.py +0 -22
- scitex/fts/_fig/_backend/_parser.py +0 -188
- scitex/fts/_fig/_editor/__init__.py +0 -14
- scitex/fts/_fig/_editor/_cui/__init__.py +0 -33
- scitex/fts/_fig/_editor/_cui/_backend_detector.py +0 -39
- scitex/fts/_fig/_editor/_cui/_bundle_resolver.py +0 -366
- scitex/fts/_fig/_editor/_cui/_editor_launcher.py +0 -175
- scitex/fts/_fig/_editor/_cui/_manual_handler.py +0 -52
- scitex/fts/_fig/_editor/_cui/_path_resolver.py +0 -66
- scitex/fts/_fig/_editor/_gui/__init__.py +0 -11
- scitex/fts/_fig/_editor/_gui/_flask_editor/__init__.py +0 -20
- scitex/fts/_fig/_editor/_gui/_flask_editor/_plotter.py +0 -664
- scitex/fts/_fig/_editor/_gui/_flask_editor/_utils.py +0 -79
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/reset.css +0 -41
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/typography.css +0 -16
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/base/variables.css +0 -85
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/buttons.css +0 -217
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/context-menu.css +0 -93
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/dropdown.css +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/forms.css +0 -112
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/modal.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/components/sections.css +0 -212
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/element-inspector.css +0 -190
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/loading.css +0 -59
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/overlay.css +0 -45
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/panel-grid.css +0 -95
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/selection.css +0 -101
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/features/statistics.css +0 -138
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/index.css +0 -31
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/container.css +0 -7
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/controls.css +0 -56
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/css/layout/preview.css +0 -78
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/axis.js +0 -314
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/basic.js +0 -107
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/alignment/distribute.js +0 -54
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/canvas.js +0 -172
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/dragging.js +0 -258
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/resize.js +0 -48
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/canvas/selection.js +0 -71
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/api.js +0 -288
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/state.js +0 -143
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/core/utils.js +0 -245
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/dev/element-inspector.js +0 -992
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/bbox.js +0 -339
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/element-drag.js +0 -286
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/overlay.js +0 -371
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/editor/preview.js +0 -293
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/main.js +0 -426
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/context-menu.js +0 -152
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/shortcuts/keyboard.js +0 -265
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/controls.js +0 -184
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/download.js +0 -57
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/help.js +0 -100
- scitex/fts/_fig/_editor/_gui/_flask_editor/static/js/ui/theme.js +0 -34
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/__init__.py +0 -124
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_html.py +0 -851
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_scripts.py +0 -4932
- scitex/fts/_fig/_editor/_gui/_flask_editor/templates/_styles.py +0 -1657
- scitex/fts/_fig/_editor/_gui/_flask_editor.py +0 -36
- scitex/fts/_fig/_models/_Annotations.py +0 -115
- scitex/fts/_fig/_models/_Axes.py +0 -152
- scitex/fts/_fig/_models/_Figure.py +0 -138
- scitex/fts/_fig/_models/_Plot.py +0 -123
- scitex/fts/_fig/_utils/_plot_layout.py +0 -397
- scitex/fts/_kinds/_figure/_composite.py +0 -345
- scitex/fts/_kinds/_plot/_backend/__init__.py +0 -53
- scitex/fts/_kinds/_plot/_backend/_export.py +0 -165
- scitex/fts/_kinds/_plot/_backend/_render.py +0 -538
- scitex/fts/_kinds/_plot/_dataclasses/_ChannelEncoding.py +0 -46
- scitex/fts/_kinds/_plot/_dataclasses/_Encoding.py +0 -82
- scitex/fts/_kinds/_plot/_dataclasses/_Theme.py +0 -441
- scitex/fts/_kinds/_plot/_dataclasses/_TraceEncoding.py +0 -52
- scitex/fts/_kinds/_plot/_dataclasses/__init__.py +0 -47
- scitex/fts/_kinds/_plot/_models/_Guides.py +0 -104
- scitex/fts/_kinds/_plot/_models/_Styles.py +0 -245
- scitex/fts/_kinds/_plot/_models/__init__.py +0 -80
- scitex/fts/_kinds/_plot/_models/_plot_types/__init__.py +0 -156
- scitex/fts/_kinds/_plot/_models/_plot_types/_bar.py +0 -43
- scitex/fts/_kinds/_plot/_models/_plot_types/_box.py +0 -38
- scitex/fts/_kinds/_plot/_models/_plot_types/_distribution.py +0 -36
- scitex/fts/_kinds/_plot/_models/_plot_types/_errorbar.py +0 -60
- scitex/fts/_kinds/_plot/_models/_plot_types/_histogram.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_image.py +0 -61
- scitex/fts/_kinds/_plot/_models/_plot_types/_line.py +0 -57
- scitex/fts/_kinds/_plot/_models/_plot_types/_scatter.py +0 -30
- scitex/fts/_kinds/_plot/_models/_plot_types/_seaborn.py +0 -121
- scitex/fts/_kinds/_plot/_models/_plot_types/_violin.py +0 -36
- scitex/fts/_kinds/_plot/_utils/__init__.py +0 -129
- scitex/fts/_kinds/_plot/_utils/_auto_layout.py +0 -127
- scitex/fts/_kinds/_plot/_utils/_calc_bounds.py +0 -111
- scitex/fts/_kinds/_plot/_utils/_const_sizes.py +0 -48
- scitex/fts/_kinds/_plot/_utils/_convert_coords.py +0 -77
- scitex/fts/_kinds/_plot/_utils/_get_template.py +0 -178
- scitex/fts/_kinds/_plot/_utils/_normalize.py +0 -73
- scitex/fts/_kinds/_plot/_utils/_validate.py +0 -197
- scitex/fts/_kinds/_table/_latex/_export.py +0 -279
- scitex/fts/_stats/__init__.py +0 -48
- scitex/fts/_stats/_dataclasses/_Stats.py +0 -423
- scitex/fts/_stats/_dataclasses/__init__.py +0 -48
- scitex/fts/_tables/__init__.py +0 -65
- scitex/fts/_tables/_latex/__init__.py +0 -93
- scitex/fts/_tables/_latex/_editor/__init__.py +0 -11
- scitex/fts/_tables/_latex/_editor/_app.py +0 -725
- scitex/fts/_tables/_latex/_figure_exporter.py +0 -153
- scitex/fts/_tables/_latex/_stats_formatter.py +0 -274
- scitex/fts/_tables/_latex/_table_exporter.py +0 -362
- scitex/fts/_tables/_latex/_utils.py +0 -369
- scitex/fts/_tables/_latex/_validator.py +0 -445
- scitex/io/_save_modules/_pltz_bundle.py +0 -356
- scitex-2.10.3.dist-info/METADATA +0 -952
- scitex-2.10.3.dist-info/entry_points.txt +0 -2
- /scitex/{fig → canvas}/README.md +0 -0
- /scitex/{fig → canvas}/backend/__init__.py +0 -0
- /scitex/{fig → canvas}/backend/_export.py +0 -0
- /scitex/{fig → canvas}/backend/_render.py +0 -0
- /scitex/{fig → canvas}/docs/CANVAS_ARCHITECTURE.md +0 -0
- /scitex/{fig → canvas}/editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/_dearpygui_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_flask_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_mpl_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_qt_editor.py +0 -0
- /scitex/{fig → canvas}/editor/_tkinter_editor.py +0 -0
- /scitex/{fig → canvas}/editor/edit/backend_detector.py +0 -0
- /scitex/{fig → canvas}/editor/edit/manual_handler.py +0 -0
- /scitex/{fig → canvas}/editor/edit/path_resolver.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/__init__.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_plotter.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/_utils.py +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/reset.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/typography.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/base/variables.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/buttons.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/context-menu.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/dropdown.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/forms.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/modal.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/components/sections.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/element-inspector.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/loading.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/overlay.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/selection.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/features/statistics.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/index.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/container.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/controls.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/css/layout/preview.css +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/axis.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/basic.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/alignment/distribute.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/canvas.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/dragging.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/resize.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/canvas/selection.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/state.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/core/utils.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/dev/element-inspector.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/bbox.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/element-drag.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/editor/overlay.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/main.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/context-menu.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/shortcuts/keyboard.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/controls.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/download.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/help.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/static/js/ui/theme.js +0 -0
- /scitex/{fig → canvas}/editor/flask_editor/templates/__init__.py +0 -0
- /scitex/{fig → canvas}/io/_directory.py +0 -0
- /scitex/{fig → canvas}/model/_plot_types.py +0 -0
- /scitex/{fig → canvas}/utils/_defaults.py +0 -0
- /scitex/{fig → canvas}/utils/_validate.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_bundle2dict.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_conversion/_dict2bundle.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_Axes.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_BBox.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_ColumnDef.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataFormat.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataInfo.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_DataSource.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_dataclasses/_SizeMM.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/__init__.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_bar.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_line.py +0 -0
- /scitex/{fts/_bundle → io/bundle}/_extractors/_extract_scatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_figure/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_figure}/_composite.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_plot/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_export.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_backend/_render.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_ChannelEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Encoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_Theme.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/_TraceEncoding.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_bar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_box.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_distribution.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_errorbar.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_histogram.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_image.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_line.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_scatter.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_seaborn.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_models/_plot_types/_violin.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/__init__.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_auto_layout.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_calc_bounds.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_const_sizes.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_convert_coords.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_get_template.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_normalize.py +0 -0
- /scitex/{fts/_fig → io/bundle/kinds/_plot}/_utils/_validate.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_shape/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/_Stats.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_stats/_dataclasses/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_editor/__init__.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_stats_formatter.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_utils.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_table/_latex/_validator.py +0 -0
- /scitex/{fts/_kinds → io/bundle/kinds}/_text/__init__.py +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/data_info.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/encoding.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/node.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/render_manifest.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/stats.schema.json +0 -0
- /scitex/{fts/_schemas → io/bundle/schemas}/theme.schema.json +0 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.3.dist-info → scitex-2.13.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/fsb/_bundle/_validation.py
|
|
4
4
|
|
|
5
5
|
"""
|
|
6
|
-
|
|
6
|
+
SciTeX Multi-Level Validation System.
|
|
7
7
|
|
|
8
8
|
Three validation levels:
|
|
9
9
|
1. schema - Always ON (init/load/save) - Fast, structural checks
|
|
@@ -11,12 +11,12 @@ Three validation levels:
|
|
|
11
11
|
3. strict - Explicit (CI/publication) - Full scientific rigor
|
|
12
12
|
|
|
13
13
|
Usage:
|
|
14
|
-
result =
|
|
15
|
-
result =
|
|
16
|
-
result =
|
|
14
|
+
result = bundle.validate(level="schema") # Fast, default at init
|
|
15
|
+
result = bundle.validate(level="semantic") # Cross-ref checks
|
|
16
|
+
result = bundle.validate(level="strict") # Full validation
|
|
17
17
|
|
|
18
18
|
if result.has_errors:
|
|
19
|
-
raise
|
|
19
|
+
raise BundleValidationError(result)
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
22
|
import json
|
|
@@ -39,7 +39,7 @@ ValidationLevel = Literal["schema", "semantic", "strict"]
|
|
|
39
39
|
|
|
40
40
|
@dataclass
|
|
41
41
|
class ValidationResult:
|
|
42
|
-
"""Result of
|
|
42
|
+
"""Result of bundle validation.
|
|
43
43
|
|
|
44
44
|
Attributes
|
|
45
45
|
----------
|
|
@@ -170,8 +170,8 @@ def validate_schema(data: Dict[str, Any], schema_name: str) -> List[str]:
|
|
|
170
170
|
return errors
|
|
171
171
|
|
|
172
172
|
|
|
173
|
-
def
|
|
174
|
-
"""Validate
|
|
173
|
+
def validate_spec(data: Dict[str, Any]) -> List[str]:
|
|
174
|
+
"""Validate spec.json data."""
|
|
175
175
|
return validate_schema(data, "node")
|
|
176
176
|
|
|
177
177
|
|
|
@@ -201,7 +201,7 @@ def validate_data_info(data: Dict[str, Any]) -> List[str]:
|
|
|
201
201
|
|
|
202
202
|
|
|
203
203
|
def validate_semantic(
|
|
204
|
-
|
|
204
|
+
spec: Optional[Dict] = None,
|
|
205
205
|
encoding: Optional[Dict] = None,
|
|
206
206
|
theme: Optional[Dict] = None,
|
|
207
207
|
stats: Optional[Dict] = None,
|
|
@@ -256,7 +256,7 @@ def validate_semantic(
|
|
|
256
256
|
|
|
257
257
|
|
|
258
258
|
def validate_strict(
|
|
259
|
-
|
|
259
|
+
spec: Optional[Dict] = None,
|
|
260
260
|
encoding: Optional[Dict] = None,
|
|
261
261
|
theme: Optional[Dict] = None,
|
|
262
262
|
stats: Optional[Dict] = None,
|
|
@@ -274,7 +274,7 @@ def validate_strict(
|
|
|
274
274
|
# Include all semantic errors
|
|
275
275
|
errors.extend(
|
|
276
276
|
validate_semantic(
|
|
277
|
-
|
|
277
|
+
spec=spec,
|
|
278
278
|
encoding=encoding,
|
|
279
279
|
theme=theme,
|
|
280
280
|
stats=stats,
|
|
@@ -288,18 +288,20 @@ def validate_strict(
|
|
|
288
288
|
for col in columns:
|
|
289
289
|
if col.get("dtype") in ["float64", "int64", "number"]:
|
|
290
290
|
if not col.get("unit"):
|
|
291
|
-
errors.append(
|
|
291
|
+
errors.append(
|
|
292
|
+
f"Column '{col.get('name')}' missing unit specification"
|
|
293
|
+
)
|
|
292
294
|
|
|
293
295
|
# Provenance must be present
|
|
294
296
|
if data_info and not data_info.get("source"):
|
|
295
297
|
errors.append("data_info.source (provenance) is required for publication")
|
|
296
298
|
|
|
297
|
-
#
|
|
298
|
-
if
|
|
299
|
-
if not
|
|
300
|
-
errors.append("
|
|
301
|
-
if not
|
|
302
|
-
errors.append("
|
|
299
|
+
# Spec must have all metadata
|
|
300
|
+
if spec:
|
|
301
|
+
if not spec.get("name"):
|
|
302
|
+
errors.append("spec.name is required for publication")
|
|
303
|
+
if not spec.get("created_at"):
|
|
304
|
+
errors.append("spec.created_at is required for publication")
|
|
303
305
|
|
|
304
306
|
return errors
|
|
305
307
|
|
scitex/io/bundle/_zip.py
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Timestamp: "2025-12-16 (ywatanabe)"
|
|
4
3
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/bundle/_zip.py
|
|
5
4
|
|
|
6
5
|
"""
|
|
7
6
|
SciTeX ZipBundle - In-memory zip archive handler with atomic writes.
|
|
8
7
|
|
|
9
|
-
Provides efficient access to .
|
|
10
|
-
to disk. Supports:
|
|
8
|
+
Provides efficient access to .figure.zip, .plot.zip, .stats.zip bundles without
|
|
9
|
+
extracting to disk. Supports:
|
|
11
10
|
- In-memory file reading
|
|
12
11
|
- Atomic writes using temp files
|
|
13
12
|
- Context manager protocol
|
|
@@ -41,19 +40,19 @@ class ZipBundle:
|
|
|
41
40
|
|
|
42
41
|
Usage:
|
|
43
42
|
# Reading
|
|
44
|
-
with ZipBundle("figure.
|
|
43
|
+
with ZipBundle("figure.figure.zip") as bundle:
|
|
45
44
|
spec = bundle.read_json("spec.json")
|
|
46
45
|
csv_data = bundle.read_csv("data.csv")
|
|
47
46
|
png_bytes = bundle.read_bytes("exports/figure.png")
|
|
48
47
|
|
|
49
48
|
# Writing
|
|
50
|
-
with ZipBundle("output.
|
|
49
|
+
with ZipBundle("output.plot.zip", mode="w") as bundle:
|
|
51
50
|
bundle.write_json("spec.json", spec_dict)
|
|
52
51
|
bundle.write_csv("data.csv", dataframe)
|
|
53
52
|
bundle.write_bytes("exports/plot.png", png_bytes)
|
|
54
53
|
|
|
55
54
|
# Modifying (read then write atomically)
|
|
56
|
-
with ZipBundle("figure.
|
|
55
|
+
with ZipBundle("figure.figure.zip", mode="a") as bundle:
|
|
57
56
|
spec = bundle.read_json("spec.json")
|
|
58
57
|
spec["title"] = "Updated"
|
|
59
58
|
bundle.write_json("spec.json", spec)
|
|
@@ -68,7 +67,7 @@ class ZipBundle:
|
|
|
68
67
|
"""Initialize ZipBundle.
|
|
69
68
|
|
|
70
69
|
Args:
|
|
71
|
-
path: Path to zip file (.
|
|
70
|
+
path: Path to zip file (.figure.zip, .plot.zip, .stats.zip)
|
|
72
71
|
mode: 'r' for read, 'w' for write, 'a' for append/modify
|
|
73
72
|
compression: ZIP compression method (default: ZIP_DEFLATED)
|
|
74
73
|
"""
|
|
@@ -100,18 +99,14 @@ class ZipBundle:
|
|
|
100
99
|
self._zipfile = zipfile.ZipFile(self.path, "r")
|
|
101
100
|
elif self.mode == "w":
|
|
102
101
|
self._temp_path = Path(tempfile.mktemp(suffix=self.path.suffix))
|
|
103
|
-
self._zipfile = zipfile.ZipFile(
|
|
104
|
-
self._temp_path, "w", self.compression
|
|
105
|
-
)
|
|
102
|
+
self._zipfile = zipfile.ZipFile(self._temp_path, "w", self.compression)
|
|
106
103
|
elif self.mode == "a":
|
|
107
104
|
if self.path.exists():
|
|
108
105
|
with zipfile.ZipFile(self.path, "r") as zf:
|
|
109
106
|
for name in zf.namelist():
|
|
110
107
|
self._cache[name] = zf.read(name)
|
|
111
108
|
self._temp_path = Path(tempfile.mktemp(suffix=self.path.suffix))
|
|
112
|
-
self._zipfile = zipfile.ZipFile(
|
|
113
|
-
self._temp_path, "w", self.compression
|
|
114
|
-
)
|
|
109
|
+
self._zipfile = zipfile.ZipFile(self._temp_path, "w", self.compression)
|
|
115
110
|
else:
|
|
116
111
|
raise ValueError(f"Invalid mode: {self.mode}")
|
|
117
112
|
|
|
@@ -282,9 +277,7 @@ class ZipBundle:
|
|
|
282
277
|
"""
|
|
283
278
|
self.write_bytes(name, text.encode(encoding))
|
|
284
279
|
|
|
285
|
-
def write_json(
|
|
286
|
-
self, name: str, data: Dict[str, Any], indent: int = 2
|
|
287
|
-
) -> None:
|
|
280
|
+
def write_json(self, name: str, data: Dict[str, Any], indent: int = 2) -> None:
|
|
288
281
|
"""Write dictionary as JSON file.
|
|
289
282
|
|
|
290
283
|
Args:
|
|
@@ -359,7 +352,7 @@ def open(path: Union[str, Path], mode: str = "r") -> ZipBundle:
|
|
|
359
352
|
ZipBundle instance (use as context manager).
|
|
360
353
|
|
|
361
354
|
Example:
|
|
362
|
-
with open("figure.
|
|
355
|
+
with open("figure.figure.zip") as bundle:
|
|
363
356
|
spec = bundle.spec
|
|
364
357
|
data = bundle.data
|
|
365
358
|
"""
|
|
@@ -376,7 +369,7 @@ def create(
|
|
|
376
369
|
"""Create a new bundle with atomic write.
|
|
377
370
|
|
|
378
371
|
Args:
|
|
379
|
-
path: Output path (.
|
|
372
|
+
path: Output path (.figure.zip, .plot.zip, or .stats.zip).
|
|
380
373
|
spec: Bundle specification dictionary.
|
|
381
374
|
data: Optional CSV data as DataFrame.
|
|
382
375
|
style: Optional style dictionary.
|
|
@@ -387,7 +380,7 @@ def create(
|
|
|
387
380
|
|
|
388
381
|
Example:
|
|
389
382
|
create(
|
|
390
|
-
"plot.
|
|
383
|
+
"plot.plot.zip",
|
|
391
384
|
spec={"schema": {"name": "scitex.plt", "version": "1.0"}},
|
|
392
385
|
data=df,
|
|
393
386
|
exports={"exports/plot.png": png_bytes},
|
|
@@ -415,15 +408,15 @@ def zip_directory(
|
|
|
415
408
|
source_dir: Union[str, Path],
|
|
416
409
|
output_path: Optional[Union[str, Path]] = None,
|
|
417
410
|
) -> Path:
|
|
418
|
-
"""Convert a directory bundle (.
|
|
411
|
+
"""Convert a directory bundle (.plot, .figure) to a ZIP bundle (.plot.zip, .figure.zip).
|
|
419
412
|
|
|
420
413
|
Creates a ZIP archive from an existing directory bundle, preserving
|
|
421
414
|
the internal structure. The ZIP file is created atomically using a temp file.
|
|
422
415
|
|
|
423
416
|
Args:
|
|
424
|
-
source_dir: Path to directory bundle (e.g., "panel_A.
|
|
417
|
+
source_dir: Path to directory bundle (e.g., "panel_A.plot", "figure.figure")
|
|
425
418
|
output_path: Optional output ZIP path. If not provided, derives from source_dir
|
|
426
|
-
by
|
|
419
|
+
by appending .zip (e.g., .plot -> .plot.zip)
|
|
427
420
|
|
|
428
421
|
Returns:
|
|
429
422
|
Path to created ZIP bundle.
|
|
@@ -433,11 +426,11 @@ def zip_directory(
|
|
|
433
426
|
ValueError: If source is not a valid bundle directory.
|
|
434
427
|
|
|
435
428
|
Example:
|
|
436
|
-
# Convert panel_A.
|
|
437
|
-
zip_path = zip_directory("panel_A.
|
|
429
|
+
# Convert panel_A.plot to panel_A.plot.zip
|
|
430
|
+
zip_path = zip_directory("panel_A.plot")
|
|
438
431
|
|
|
439
432
|
# Convert with custom output path
|
|
440
|
-
zip_path = zip_directory("A.
|
|
433
|
+
zip_path = zip_directory("A.plot", "output/A.plot.zip")
|
|
441
434
|
"""
|
|
442
435
|
source_dir = Path(source_dir)
|
|
443
436
|
|
|
@@ -449,12 +442,9 @@ def zip_directory(
|
|
|
449
442
|
|
|
450
443
|
if output_path is None:
|
|
451
444
|
dir_name = source_dir.name
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
zip_name = dir_name.replace(".figz.d", ".figz")
|
|
456
|
-
elif dir_name.endswith(".statsz.d"):
|
|
457
|
-
zip_name = dir_name.replace(".statsz.d", ".statsz")
|
|
445
|
+
# New format: .plot -> .plot.zip, .figure -> .figure.zip, .stats -> .stats.zip
|
|
446
|
+
if dir_name.endswith((".plot", ".figure", ".stats")):
|
|
447
|
+
zip_name = dir_name + ".zip"
|
|
458
448
|
else:
|
|
459
449
|
zip_name = dir_name + ".zip"
|
|
460
450
|
output_path = source_dir.parent / zip_name
|
|
@@ -161,7 +161,7 @@ def validate_figure_json(fig_json: Dict[str, Any]) -> bool:
|
|
|
161
161
|
|
|
162
162
|
Examples
|
|
163
163
|
--------
|
|
164
|
-
>>> from scitex.
|
|
164
|
+
>>> from scitex.canvas.backend import validate_figure_json
|
|
165
165
|
>>> fig_json = {"width_mm": 180, "height_mm": 120, "axes": []}
|
|
166
166
|
>>> validate_figure_json(fig_json)
|
|
167
167
|
True
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# File: ./src/scitex/vis/model/guides.py
|
|
3
|
-
"""Guide elements (lines, spans) JSON model for scitex.
|
|
3
|
+
"""Guide elements (lines, spans) JSON model for scitex.canvas."""
|
|
4
4
|
|
|
5
5
|
from dataclasses import asdict, dataclass, field
|
|
6
6
|
from typing import Any, Dict, Optional
|
|
@@ -12,7 +12,7 @@ Provides architectural drawing style visualizations with:
|
|
|
12
12
|
- Before/after comparison for auto-crop
|
|
13
13
|
|
|
14
14
|
Usage:
|
|
15
|
-
from scitex.
|
|
15
|
+
from scitex.io.bundle._fig._utils import plot_layout, plot_auto_crop_comparison
|
|
16
16
|
|
|
17
17
|
# Single layout visualization
|
|
18
18
|
fig, ax = plot_layout(elements, canvas_size, title="My Figure")
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
This module provides LaTeX export capabilities for FTS figure and table bundles.
|
|
8
8
|
|
|
9
9
|
Usage:
|
|
10
|
-
from scitex.
|
|
10
|
+
from scitex.io.bundle._tables._latex import export_to_latex, launch_editor
|
|
11
11
|
|
|
12
12
|
# Export a bundle to LaTeX
|
|
13
13
|
result = export_to_latex(bundle)
|
|
@@ -17,7 +17,7 @@ from flask import Flask, jsonify, render_template_string, request
|
|
|
17
17
|
from .._validator import ValidationResult, validate_latex
|
|
18
18
|
|
|
19
19
|
if TYPE_CHECKING:
|
|
20
|
-
from scitex.
|
|
20
|
+
from scitex.io.bundle import FTS
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
# HTML template with CodeMirror editor
|
|
@@ -14,7 +14,7 @@ from ._table_exporter import TableExportOptions, export_table_to_latex, generate
|
|
|
14
14
|
from ._validator import LaTeXError, ValidationResult, validate_latex
|
|
15
15
|
|
|
16
16
|
if TYPE_CHECKING:
|
|
17
|
-
from scitex.
|
|
17
|
+
from scitex.io.bundle import FTS
|
|
18
18
|
|
|
19
19
|
|
|
20
20
|
@dataclass
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-07
|
|
3
|
+
# File: src/scitex/io/bundle/schemas/__init__.py
|
|
4
|
+
"""SciTeX Bundle Schemas.
|
|
5
|
+
|
|
6
|
+
This module contains JSON schemas for bundle validation.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"SCHEMAS_DIR",
|
|
13
|
+
"NODE_SCHEMA",
|
|
14
|
+
"ENCODING_SCHEMA",
|
|
15
|
+
"THEME_SCHEMA",
|
|
16
|
+
"STATS_SCHEMA",
|
|
17
|
+
"DATA_INFO_SCHEMA",
|
|
18
|
+
"RENDER_MANIFEST_SCHEMA",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
SCHEMAS_DIR = Path(__file__).parent
|
|
22
|
+
|
|
23
|
+
NODE_SCHEMA = SCHEMAS_DIR / "node.schema.json"
|
|
24
|
+
ENCODING_SCHEMA = SCHEMAS_DIR / "encoding.schema.json"
|
|
25
|
+
THEME_SCHEMA = SCHEMAS_DIR / "theme.schema.json"
|
|
26
|
+
STATS_SCHEMA = SCHEMAS_DIR / "stats.schema.json"
|
|
27
|
+
DATA_INFO_SCHEMA = SCHEMAS_DIR / "data_info.schema.json"
|
|
28
|
+
RENDER_MANIFEST_SCHEMA = SCHEMAS_DIR / "render_manifest.schema.json"
|
|
29
|
+
|
|
30
|
+
# EOF
|
scitex/mcp_server.py
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-08
|
|
3
|
+
# File: src/scitex/mcp_server.py
|
|
4
|
+
# ----------------------------------------
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Unified MCP Server for SciTeX - All modules in one server.
|
|
8
|
+
|
|
9
|
+
Aggregates tools from all SciTeX MCP modules with prefixed names:
|
|
10
|
+
- audio_*: Text-to-speech
|
|
11
|
+
- capture_*: Screenshot capture
|
|
12
|
+
- scholar_*: Literature management
|
|
13
|
+
- stats_*: Statistical analysis
|
|
14
|
+
- template_*: Project scaffolding
|
|
15
|
+
- plt_*: Publication plotting
|
|
16
|
+
- canvas_*: Multi-panel figures
|
|
17
|
+
- diagram_*: Diagram generation
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import annotations
|
|
21
|
+
|
|
22
|
+
import asyncio
|
|
23
|
+
import json
|
|
24
|
+
from typing import Callable
|
|
25
|
+
|
|
26
|
+
import mcp.types as types
|
|
27
|
+
from mcp.server import NotificationOptions, Server
|
|
28
|
+
from mcp.server.models import InitializationOptions
|
|
29
|
+
from mcp.server.stdio import stdio_server
|
|
30
|
+
|
|
31
|
+
__all__ = ["UnifiedServer", "main"]
|
|
32
|
+
|
|
33
|
+
# Module registry: (prefix, schema_getter, handler_module)
|
|
34
|
+
MODULES = [
|
|
35
|
+
("audio", "scitex.audio._mcp_tool_schemas", "scitex.audio._mcp_handlers"),
|
|
36
|
+
("capture", "scitex.capture._mcp_tool_schemas", "scitex.capture._mcp_handlers"),
|
|
37
|
+
("scholar", "scitex.scholar._mcp_tool_schemas", "scitex.scholar._mcp_handlers"),
|
|
38
|
+
("stats", "scitex.stats._mcp_tool_schemas", "scitex.stats._mcp_handlers"),
|
|
39
|
+
("template", "scitex.template._mcp_tool_schemas", "scitex.template._mcp_handlers"),
|
|
40
|
+
("plt", "scitex.plt._mcp_tool_schemas", "scitex.plt._mcp_handlers"),
|
|
41
|
+
("canvas", "scitex.canvas._mcp_tool_schemas", "scitex.canvas._mcp_handlers"),
|
|
42
|
+
("diagram", "scitex.diagram._mcp_tool_schemas", "scitex.diagram._mcp_handlers"),
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class UnifiedServer:
|
|
47
|
+
"""Unified MCP Server aggregating all SciTeX modules."""
|
|
48
|
+
|
|
49
|
+
def __init__(self):
|
|
50
|
+
self.server = Server("scitex-mcp-server")
|
|
51
|
+
self.tools: list[types.Tool] = []
|
|
52
|
+
self.handlers: dict[str, Callable] = {}
|
|
53
|
+
self._load_modules()
|
|
54
|
+
self._setup_handlers()
|
|
55
|
+
|
|
56
|
+
def _load_modules(self):
|
|
57
|
+
"""Load tool schemas and handlers from all modules."""
|
|
58
|
+
import importlib
|
|
59
|
+
|
|
60
|
+
for prefix, schema_module, handler_module in MODULES:
|
|
61
|
+
try:
|
|
62
|
+
# Load tool schemas
|
|
63
|
+
schema_mod = importlib.import_module(schema_module)
|
|
64
|
+
tools = schema_mod.get_tool_schemas()
|
|
65
|
+
|
|
66
|
+
# Load handlers
|
|
67
|
+
handler_mod = importlib.import_module(handler_module)
|
|
68
|
+
|
|
69
|
+
for tool in tools:
|
|
70
|
+
# Create prefixed tool name
|
|
71
|
+
prefixed_name = f"{prefix}_{tool.name}"
|
|
72
|
+
|
|
73
|
+
# Create new tool with prefixed name
|
|
74
|
+
prefixed_tool = types.Tool(
|
|
75
|
+
name=prefixed_name,
|
|
76
|
+
description=f"[{prefix}] {tool.description}",
|
|
77
|
+
inputSchema=tool.inputSchema,
|
|
78
|
+
)
|
|
79
|
+
self.tools.append(prefixed_tool)
|
|
80
|
+
|
|
81
|
+
# Map handler
|
|
82
|
+
handler_name = f"{tool.name}_handler"
|
|
83
|
+
if hasattr(handler_mod, handler_name):
|
|
84
|
+
self.handlers[prefixed_name] = getattr(
|
|
85
|
+
handler_mod, handler_name
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
except ImportError as e:
|
|
89
|
+
# Module not available, skip it
|
|
90
|
+
print(f"Skipping {prefix} module: {e}")
|
|
91
|
+
except Exception as e:
|
|
92
|
+
print(f"Error loading {prefix} module: {e}")
|
|
93
|
+
|
|
94
|
+
def _setup_handlers(self):
|
|
95
|
+
"""Set up MCP server handlers."""
|
|
96
|
+
|
|
97
|
+
@self.server.list_tools()
|
|
98
|
+
async def handle_list_tools():
|
|
99
|
+
return self.tools
|
|
100
|
+
|
|
101
|
+
@self.server.call_tool()
|
|
102
|
+
async def handle_call_tool(name: str, arguments: dict):
|
|
103
|
+
if name not in self.handlers:
|
|
104
|
+
return [
|
|
105
|
+
types.TextContent(
|
|
106
|
+
type="text",
|
|
107
|
+
text=json.dumps(
|
|
108
|
+
{"success": False, "error": f"Unknown tool: {name}"},
|
|
109
|
+
indent=2,
|
|
110
|
+
),
|
|
111
|
+
)
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
return await self._wrap_result(self.handlers[name](**arguments))
|
|
115
|
+
|
|
116
|
+
async def _wrap_result(self, coro):
|
|
117
|
+
"""Wrap handler result as MCP TextContent."""
|
|
118
|
+
try:
|
|
119
|
+
result = await coro
|
|
120
|
+
return [
|
|
121
|
+
types.TextContent(
|
|
122
|
+
type="text",
|
|
123
|
+
text=json.dumps(result, indent=2, default=str),
|
|
124
|
+
)
|
|
125
|
+
]
|
|
126
|
+
except Exception as e:
|
|
127
|
+
return [
|
|
128
|
+
types.TextContent(
|
|
129
|
+
type="text",
|
|
130
|
+
text=json.dumps({"success": False, "error": str(e)}, indent=2),
|
|
131
|
+
)
|
|
132
|
+
]
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
async def main():
|
|
136
|
+
"""Run the unified MCP server."""
|
|
137
|
+
server = UnifiedServer()
|
|
138
|
+
print(f"Loaded {len(server.tools)} tools from {len(MODULES)} modules")
|
|
139
|
+
|
|
140
|
+
async with stdio_server() as (read_stream, write_stream):
|
|
141
|
+
await server.server.run(
|
|
142
|
+
read_stream,
|
|
143
|
+
write_stream,
|
|
144
|
+
InitializationOptions(
|
|
145
|
+
server_name="scitex-mcp-server",
|
|
146
|
+
server_version="0.1.0",
|
|
147
|
+
capabilities=server.server.get_capabilities(
|
|
148
|
+
notification_options=NotificationOptions(),
|
|
149
|
+
experimental_capabilities={},
|
|
150
|
+
),
|
|
151
|
+
),
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
if __name__ == "__main__":
|
|
156
|
+
asyncio.run(main())
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# EOF
|
scitex/parallel/_run.py
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
2
|
# Time-stamp: "2024-11-14 23:12:20 (ywatanabe)"
|
|
4
3
|
# File: ./scitex_repo/src/scitex/parallel/_run.py
|
|
5
4
|
|
|
@@ -65,13 +64,15 @@ def run(
|
|
|
65
64
|
if not callable(func):
|
|
66
65
|
raise ValueError("Func must be callable")
|
|
67
66
|
|
|
67
|
+
# Validate n_jobs before conversion: must be -1 or >= 1
|
|
68
|
+
if n_jobs < -1 or n_jobs == 0:
|
|
69
|
+
raise ValueError("n_jobs must be >= 1 or -1")
|
|
70
|
+
|
|
68
71
|
cpu_count = multiprocessing.cpu_count()
|
|
69
|
-
n_jobs = cpu_count if n_jobs
|
|
72
|
+
n_jobs = cpu_count if n_jobs == -1 else n_jobs
|
|
70
73
|
|
|
71
74
|
if n_jobs > cpu_count:
|
|
72
75
|
warnings.warn(f"n_jobs ({n_jobs}) is greater than CPU count ({cpu_count})")
|
|
73
|
-
if n_jobs < 1:
|
|
74
|
-
raise ValueError("n_jobs must be >= 1 or -1")
|
|
75
76
|
|
|
76
77
|
results = [None] * len(args_list) # Pre-allocate list
|
|
77
78
|
|