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