scitex 2.10.2__py3-none-any.whl → 2.11.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/__version__.py +1 -1
- scitex/_install_guide.py +14 -2
- 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/{fig → canvas}/__init__.py +84 -96
- 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/{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/cli/convert.py +10 -6
- scitex/diagram/README.md +7 -7
- 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 +5 -5
- scitex/io/_load_modules/_eeg.py +16 -12
- 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/_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/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/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/_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/utils/_csv_column_naming.py +250 -118
- scitex/schema/__init__.py +69 -73
- scitex/schema/_canvas.py +1 -1
- scitex/schema/_stats.py +2 -2
- scitex/stats/__init__.py +30 -33
- scitex/stats/_schema.py +1 -1
- scitex/stats/io/__init__.py +10 -11
- scitex/stats/io/_bundle.py +16 -16
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/METADATA +191 -72
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/RECORD +237 -360
- 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/{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.2.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.10.2.dist-info → scitex-2.11.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/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
|
|
scitex/path/_find.py
CHANGED
|
@@ -1,113 +1,90 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
#
|
|
3
|
-
#
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
# -*- coding: utf-8 -*-
|
|
7
|
-
# Time-stamp: "2024-04-17 09:34:43"
|
|
8
|
-
# Author: Yusuke Watanabe (ywatanabe@scitex.ai)
|
|
9
|
-
|
|
10
|
-
"""
|
|
11
|
-
This script does XYZ.
|
|
12
|
-
"""
|
|
2
|
+
# Timestamp: "2026-01-08 02:00:00 (ywatanabe)"
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/path/_find.py
|
|
4
|
+
|
|
5
|
+
"""File and directory finding utilities."""
|
|
13
6
|
|
|
14
7
|
import fnmatch
|
|
15
|
-
import
|
|
16
|
-
import
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
from typing import List, Optional, Union
|
|
17
10
|
|
|
18
|
-
import scitex
|
|
19
11
|
|
|
12
|
+
def find_git_root() -> Path:
|
|
13
|
+
"""Find the root directory of the current git repository.
|
|
20
14
|
|
|
21
|
-
|
|
22
|
-
|
|
15
|
+
Returns
|
|
16
|
+
-------
|
|
17
|
+
Path
|
|
18
|
+
Path to the git repository root.
|
|
19
|
+
"""
|
|
23
20
|
import git
|
|
24
21
|
|
|
25
22
|
repo = git.Repo(".", search_parent_directories=True)
|
|
26
|
-
return repo.working_tree_dir
|
|
23
|
+
return Path(repo.working_tree_dir)
|
|
27
24
|
|
|
28
25
|
|
|
29
|
-
def find_dir(root_dir, exp):
|
|
26
|
+
def find_dir(root_dir: Union[str, Path], exp: Union[str, List[str]]) -> List[Path]:
|
|
27
|
+
"""Find directories matching pattern."""
|
|
30
28
|
return _find(root_dir, type="d", exp=exp)
|
|
31
29
|
|
|
32
30
|
|
|
33
|
-
def find_file(root_dir, exp):
|
|
31
|
+
def find_file(root_dir: Union[str, Path], exp: Union[str, List[str]]) -> List[Path]:
|
|
32
|
+
"""Find files matching pattern."""
|
|
34
33
|
return _find(root_dir, type="f", exp=exp)
|
|
35
34
|
|
|
36
35
|
|
|
37
|
-
def _find(
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
36
|
+
def _find(
|
|
37
|
+
rootdir: Union[str, Path],
|
|
38
|
+
type: Optional[str] = "f",
|
|
39
|
+
exp: Union[str, List[str]] = "*",
|
|
40
|
+
) -> List[Path]:
|
|
41
|
+
"""Mimics the Unix find command.
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
rootdir : str or Path
|
|
46
|
+
Root directory to search in.
|
|
47
|
+
type : str, optional
|
|
48
|
+
'f' for files, 'd' for directories, None for both.
|
|
49
|
+
exp : str or list of str
|
|
50
|
+
Pattern(s) to match.
|
|
51
|
+
|
|
52
|
+
Returns
|
|
53
|
+
-------
|
|
54
|
+
list of Path
|
|
55
|
+
Matching paths.
|
|
56
|
+
|
|
57
|
+
Example
|
|
58
|
+
-------
|
|
59
|
+
>>> _find('/path/to/search', "f", "*.txt")
|
|
46
60
|
"""
|
|
61
|
+
rootdir = Path(rootdir)
|
|
47
62
|
if isinstance(exp, str):
|
|
48
63
|
exp = [exp]
|
|
49
64
|
|
|
65
|
+
exclude_keys = ["/lib/", "/env/", "/build/"]
|
|
50
66
|
matches = []
|
|
51
|
-
for _exp in exp:
|
|
52
|
-
for root, dirs, files in os.walk(rootdir):
|
|
53
|
-
# Depending on the type, choose the list to iterate over
|
|
54
|
-
if type == "f": # Files only
|
|
55
|
-
names = files
|
|
56
|
-
elif type == "d": # Directories only
|
|
57
|
-
names = dirs
|
|
58
|
-
else: # All entries
|
|
59
|
-
names = files + dirs
|
|
60
|
-
|
|
61
|
-
for name in names:
|
|
62
|
-
# Construct the full path
|
|
63
|
-
path = os.path.join(root, name)
|
|
64
|
-
|
|
65
|
-
# If an _exp is provided, use fnmatch to filter names
|
|
66
|
-
if _exp and not fnmatch.fnmatch(name, _exp):
|
|
67
|
-
continue
|
|
68
|
-
|
|
69
|
-
# If type is set, ensure the type matches
|
|
70
|
-
if type == "f" and not os.path.isfile(path):
|
|
71
|
-
continue
|
|
72
|
-
if type == "d" and not os.path.isdir(path):
|
|
73
|
-
continue
|
|
74
|
-
|
|
75
|
-
exclude_keys = ["/lib/", "/env/", "/build/"]
|
|
76
|
-
if not any(ek in path for ek in exclude_keys):
|
|
77
|
-
matches.append(path)
|
|
78
|
-
|
|
79
|
-
# for ek in exclude_keys:
|
|
80
|
-
# if ek in path:
|
|
81
|
-
# path = None
|
|
82
|
-
# break
|
|
83
|
-
|
|
84
|
-
# if path is not None:
|
|
85
|
-
# # Add the matching path to the results
|
|
86
|
-
# matches.append(path)
|
|
87
|
-
|
|
88
|
-
return matches
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
if __name__ == "__main__":
|
|
92
|
-
# Import matplotlib only when running as script
|
|
93
|
-
try:
|
|
94
|
-
import matplotlib.pyplot as plt
|
|
95
|
-
except ImportError:
|
|
96
|
-
plt = None
|
|
97
67
|
|
|
98
|
-
|
|
99
|
-
|
|
68
|
+
for _exp in exp:
|
|
69
|
+
for path in rootdir.rglob("*"):
|
|
70
|
+
# Check type
|
|
71
|
+
if type == "f" and not path.is_file():
|
|
72
|
+
continue
|
|
73
|
+
if type == "d" and not path.is_dir():
|
|
74
|
+
continue
|
|
100
75
|
|
|
101
|
-
|
|
76
|
+
# Check pattern match
|
|
77
|
+
if _exp and not fnmatch.fnmatch(path.name, _exp):
|
|
78
|
+
continue
|
|
102
79
|
|
|
103
|
-
|
|
104
|
-
|
|
80
|
+
# Check exclusions
|
|
81
|
+
path_str = str(path)
|
|
82
|
+
if any(ek in path_str for ek in exclude_keys):
|
|
83
|
+
continue
|
|
105
84
|
|
|
106
|
-
|
|
85
|
+
matches.append(path)
|
|
107
86
|
|
|
108
|
-
|
|
109
|
-
/ssh:ywatanabe@444:/home/ywatanabe/proj/entrance/scitex/path/_find.py
|
|
110
|
-
"""
|
|
87
|
+
return matches
|
|
111
88
|
|
|
112
89
|
|
|
113
90
|
# EOF
|