scitex 2.10.3__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.3.dist-info → scitex-2.11.0.dist-info}/METADATA +190 -73
- {scitex-2.10.3.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.3.dist-info → scitex-2.11.0.dist-info}/WHEEL +0 -0
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/entry_points.txt +0 -0
- {scitex-2.10.3.dist-info → scitex-2.11.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2025-12-19
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_plot_bundle.py
|
|
4
|
+
|
|
5
|
+
"""Save matplotlib figures as .plot bundles."""
|
|
6
|
+
|
|
7
|
+
import tempfile
|
|
8
|
+
from pathlib import Path
|
|
9
|
+
|
|
10
|
+
from scitex import logging
|
|
11
|
+
|
|
12
|
+
from ._figure_utils import get_figure_with_data
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger()
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def save_plot_bundle(obj, spath, as_zip=False, data=None, layered=True, **kwargs):
|
|
18
|
+
"""Save a matplotlib figure as a .plot bundle.
|
|
19
|
+
|
|
20
|
+
Bundle structure v2.0 (layered - default):
|
|
21
|
+
plot.plot/
|
|
22
|
+
spec.json # Semantic: WHAT to plot (canonical)
|
|
23
|
+
style.json # Appearance: HOW it looks (canonical)
|
|
24
|
+
data.csv # Raw data (immutable)
|
|
25
|
+
exports/ # PNG, SVG, hitmap
|
|
26
|
+
cache/ # geometry_px.json, render_manifest.json
|
|
27
|
+
|
|
28
|
+
Parameters
|
|
29
|
+
----------
|
|
30
|
+
obj : matplotlib.figure.Figure
|
|
31
|
+
The figure to save.
|
|
32
|
+
spath : str or Path
|
|
33
|
+
Output path (e.g., "plot.plot" or "plot.plot.zip").
|
|
34
|
+
as_zip : bool
|
|
35
|
+
If True, save as ZIP archive.
|
|
36
|
+
data : pandas.DataFrame, optional
|
|
37
|
+
Data to embed in the bundle as plot.csv.
|
|
38
|
+
layered : bool
|
|
39
|
+
If True (default), use new layered format (spec/style/geometry).
|
|
40
|
+
**kwargs
|
|
41
|
+
Additional arguments passed to savefig.
|
|
42
|
+
"""
|
|
43
|
+
import shutil
|
|
44
|
+
|
|
45
|
+
import matplotlib.figure
|
|
46
|
+
|
|
47
|
+
p = Path(spath)
|
|
48
|
+
|
|
49
|
+
# Extract basename from path
|
|
50
|
+
basename = p.stem
|
|
51
|
+
if basename.endswith(".plot"):
|
|
52
|
+
basename = basename[:-5]
|
|
53
|
+
elif basename.endswith(".zip"):
|
|
54
|
+
basename = Path(basename).stem
|
|
55
|
+
if basename.endswith(".plot"):
|
|
56
|
+
basename = basename[:-5]
|
|
57
|
+
|
|
58
|
+
# Extract figure from various matplotlib object types
|
|
59
|
+
fig = obj
|
|
60
|
+
if hasattr(obj, "figure"):
|
|
61
|
+
fig = obj.figure
|
|
62
|
+
elif hasattr(obj, "fig"):
|
|
63
|
+
fig = obj.fig
|
|
64
|
+
|
|
65
|
+
if not isinstance(fig, matplotlib.figure.Figure):
|
|
66
|
+
raise TypeError(f"Expected matplotlib Figure, got {type(obj).__name__}")
|
|
67
|
+
|
|
68
|
+
dpi = kwargs.pop("dpi", 300)
|
|
69
|
+
|
|
70
|
+
# === Always use layered format ===
|
|
71
|
+
# Determine bundle directory path
|
|
72
|
+
if as_zip:
|
|
73
|
+
temp_dir = Path(tempfile.mkdtemp())
|
|
74
|
+
bundle_dir = temp_dir / f"{basename}.plot"
|
|
75
|
+
zip_path = p if not str(p).endswith(".zip") else p
|
|
76
|
+
else:
|
|
77
|
+
bundle_dir = p if str(p).endswith(".plot") else Path(str(p) + ".plot")
|
|
78
|
+
temp_dir = None
|
|
79
|
+
|
|
80
|
+
# Get CSV data from figure if not provided
|
|
81
|
+
csv_df = data
|
|
82
|
+
if csv_df is None:
|
|
83
|
+
csv_source = get_figure_with_data(obj)
|
|
84
|
+
if csv_source is not None and hasattr(csv_source, "export_as_csv"):
|
|
85
|
+
try:
|
|
86
|
+
csv_df = csv_source.export_as_csv()
|
|
87
|
+
except Exception:
|
|
88
|
+
pass
|
|
89
|
+
|
|
90
|
+
from scitex.plt.io import save_layered_plot_bundle
|
|
91
|
+
|
|
92
|
+
save_layered_plot_bundle(
|
|
93
|
+
fig=fig,
|
|
94
|
+
bundle_dir=bundle_dir,
|
|
95
|
+
basename=basename,
|
|
96
|
+
dpi=dpi,
|
|
97
|
+
csv_df=csv_df,
|
|
98
|
+
)
|
|
99
|
+
|
|
100
|
+
# Compress to ZIP if requested
|
|
101
|
+
if as_zip:
|
|
102
|
+
import zipfile
|
|
103
|
+
|
|
104
|
+
with zipfile.ZipFile(zip_path, "w", zipfile.ZIP_DEFLATED) as zf:
|
|
105
|
+
for file_path in bundle_dir.rglob("*"):
|
|
106
|
+
if file_path.is_file():
|
|
107
|
+
arcname = file_path.relative_to(bundle_dir.parent)
|
|
108
|
+
zf.write(file_path, arcname)
|
|
109
|
+
shutil.rmtree(temp_dir)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# EOF
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# Timestamp: 2025-12-19
|
|
3
|
-
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_plot_scitex.py
|
|
4
4
|
|
|
5
|
-
"""Save matplotlib figures as
|
|
5
|
+
"""Save matplotlib figures as SciTeX bundles (ZIP or directory) with plot content type."""
|
|
6
6
|
|
|
7
7
|
import json
|
|
8
8
|
import tempfile
|
|
@@ -199,8 +199,8 @@ def _build_theme_from_figure(fig):
|
|
|
199
199
|
}
|
|
200
200
|
|
|
201
201
|
|
|
202
|
-
def
|
|
203
|
-
"""Save a matplotlib figure as
|
|
202
|
+
def save_plot_as_scitex(obj, spath, as_zip=True, basename=None, **kwargs):
|
|
203
|
+
"""Save a matplotlib figure as a SciTeX bundle (ZIP or directory).
|
|
204
204
|
|
|
205
205
|
Bundle structure:
|
|
206
206
|
plot_name/ # or plot_name.zip (with plot_name/ inside)
|
|
@@ -463,7 +463,7 @@ def _generate_readme(bundle_dir, basename, spec, csv_df):
|
|
|
463
463
|
from datetime import datetime
|
|
464
464
|
|
|
465
465
|
readme_lines = [
|
|
466
|
-
f"# {basename}
|
|
466
|
+
f"# {basename} SciTeX Bundle",
|
|
467
467
|
"",
|
|
468
468
|
"## Overview",
|
|
469
469
|
"",
|
|
@@ -517,9 +517,9 @@ def _generate_readme(bundle_dir, basename, spec, csv_df):
|
|
|
517
517
|
"## Usage",
|
|
518
518
|
"",
|
|
519
519
|
"```python",
|
|
520
|
-
"from scitex.
|
|
520
|
+
"from scitex.io.bundle import Bundle",
|
|
521
521
|
"",
|
|
522
|
-
f'bundle =
|
|
522
|
+
f'bundle = Bundle("{basename}.zip") # or "{basename}/" directory',
|
|
523
523
|
"bundle.show() # Display",
|
|
524
524
|
'bundle.export("output.png") # Export',
|
|
525
525
|
"```",
|
|
@@ -2,28 +2,28 @@
|
|
|
2
2
|
# Timestamp: 2025-12-19
|
|
3
3
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/io/_save_modules/_stx_bundle.py
|
|
4
4
|
|
|
5
|
-
"""Save functions for
|
|
5
|
+
"""Save functions for SciTeX bundle format (.zip or directory)."""
|
|
6
6
|
|
|
7
7
|
from pathlib import Path
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **kwargs):
|
|
11
|
-
"""Save an object as
|
|
11
|
+
"""Save an object as a SciTeX bundle (.zip or directory).
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
SciTeX bundles support three types:
|
|
14
14
|
- figure: Publication figures with multiple panels
|
|
15
15
|
- plot: Single matplotlib plots
|
|
16
16
|
- stats: Statistical results
|
|
17
17
|
|
|
18
18
|
The content type is auto-detected from the object:
|
|
19
|
-
-
|
|
19
|
+
- Bundle instance -> delegates to Bundle.save()
|
|
20
20
|
- matplotlib.figure.Figure -> plot
|
|
21
21
|
- dict with 'panels' or 'elements' -> figure
|
|
22
22
|
- dict with 'comparisons' -> stats
|
|
23
23
|
|
|
24
24
|
Bundle structure:
|
|
25
25
|
output/ # or output.zip
|
|
26
|
-
|
|
26
|
+
spec.json # Bundle metadata
|
|
27
27
|
encoding.json # Data-to-visual mappings
|
|
28
28
|
theme.json # Visual styling
|
|
29
29
|
data/ # Raw data files
|
|
@@ -32,7 +32,7 @@ def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **
|
|
|
32
32
|
Parameters
|
|
33
33
|
----------
|
|
34
34
|
obj : Any
|
|
35
|
-
Object to save (
|
|
35
|
+
Object to save (Bundle, Figure, dict, etc.)
|
|
36
36
|
spath : str or Path
|
|
37
37
|
Output path (e.g., "output.zip" or "output/")
|
|
38
38
|
as_zip : bool
|
|
@@ -42,10 +42,10 @@ def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **
|
|
|
42
42
|
**kwargs
|
|
43
43
|
Additional arguments passed to format-specific savers.
|
|
44
44
|
"""
|
|
45
|
-
from scitex.
|
|
45
|
+
from scitex.io.bundle import Bundle
|
|
46
46
|
|
|
47
|
-
if isinstance(obj,
|
|
48
|
-
# Delegate to
|
|
47
|
+
if isinstance(obj, Bundle):
|
|
48
|
+
# Delegate to Bundle.save()
|
|
49
49
|
obj.save()
|
|
50
50
|
return
|
|
51
51
|
|
|
@@ -80,23 +80,23 @@ def save_stx_bundle(obj, spath, as_zip=True, bundle_type=None, basename=None, **
|
|
|
80
80
|
|
|
81
81
|
# Route to appropriate handler based on content type
|
|
82
82
|
if content_type == "plot":
|
|
83
|
-
from .
|
|
83
|
+
from ._plot_scitex import save_plot_as_scitex
|
|
84
84
|
|
|
85
|
-
|
|
85
|
+
save_plot_as_scitex(obj, spath, as_zip=as_zip, basename=basename, **kwargs)
|
|
86
86
|
elif content_type == "figure":
|
|
87
|
-
from scitex.
|
|
87
|
+
from scitex.io.bundle import Bundle
|
|
88
88
|
|
|
89
|
-
bundle =
|
|
89
|
+
bundle = Bundle(spath, create=True, bundle_type="figure")
|
|
90
90
|
if isinstance(obj, dict):
|
|
91
91
|
if "title" in obj:
|
|
92
|
-
bundle.
|
|
92
|
+
bundle.spec.title = obj["title"]
|
|
93
93
|
if "description" in obj:
|
|
94
|
-
bundle.
|
|
94
|
+
bundle.spec.description = obj["description"]
|
|
95
95
|
bundle.save()
|
|
96
96
|
elif content_type == "stats":
|
|
97
97
|
import scitex.stats as sstats
|
|
98
98
|
|
|
99
|
-
sstats.
|
|
99
|
+
sstats.save_stats(obj, spath, as_zip=as_zip, **kwargs)
|
|
100
100
|
else:
|
|
101
101
|
raise ValueError(f"Unknown bundle type: {content_type}")
|
|
102
102
|
|
scitex/io/bundle/README.md
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
<!-- ---
|
|
2
|
-
!-- Timestamp:
|
|
2
|
+
!-- Timestamp: 2026-01-07
|
|
3
3
|
!-- Author: ywatanabe
|
|
4
4
|
!-- File: /home/ywatanabe/proj/scitex-code/src/scitex/io/bundle/README.md
|
|
5
5
|
!-- --- -->
|
|
@@ -10,20 +10,20 @@
|
|
|
10
10
|
|
|
11
11
|
SciTeX uses bundle formats for reproducible scientific figures:
|
|
12
12
|
|
|
13
|
-
| Format
|
|
14
|
-
|
|
15
|
-
| `.
|
|
16
|
-
| `.
|
|
17
|
-
| `.
|
|
13
|
+
| Format | Purpose | Contents |
|
|
14
|
+
|----------------|---------------------|------------------------------------------------|
|
|
15
|
+
| `.plot.zip` | Single plot bundle | spec.json, encoding.json, data.csv, exports/ |
|
|
16
|
+
| `.figure.zip` | Multi-panel figure | spec.json, encoding.json, nested plot bundles |
|
|
17
|
+
| `.stats.zip` | Statistical results | spec.json, stats data, comparison metadata |
|
|
18
18
|
|
|
19
19
|
## Format Variants
|
|
20
20
|
|
|
21
21
|
Each bundle can exist in two forms:
|
|
22
22
|
|
|
23
|
-
| Suffix
|
|
24
|
-
|
|
25
|
-
| `.
|
|
26
|
-
| `.
|
|
23
|
+
| Suffix | Type | Use Case |
|
|
24
|
+
|----------------------------------------------|-------------|-----------------------------|
|
|
25
|
+
| `.plot.zip` / `.figure.zip` / `.stats.zip` | ZIP archive | Storage, transfer, download |
|
|
26
|
+
| `.plot` / `.figure` / `.stats` | Directory | Editing, development |
|
|
27
27
|
|
|
28
28
|
## Quick Start
|
|
29
29
|
|
|
@@ -31,19 +31,19 @@ Each bundle can exist in two forms:
|
|
|
31
31
|
import scitex.io.bundle as bundle
|
|
32
32
|
|
|
33
33
|
# Load a bundle (works with both ZIP and directory)
|
|
34
|
-
data = bundle.load("Figure1.
|
|
34
|
+
data = bundle.load("Figure1.figure.zip")
|
|
35
35
|
print(data['spec'])
|
|
36
|
-
print(data['type']) # '
|
|
36
|
+
print(data['type']) # 'figure'
|
|
37
37
|
|
|
38
38
|
# Save a bundle
|
|
39
|
-
bundle.save(data, "output.
|
|
39
|
+
bundle.save(data, "output.plot.zip", as_zip=True)
|
|
40
40
|
|
|
41
41
|
# Copy a bundle
|
|
42
|
-
bundle.copy("template.
|
|
42
|
+
bundle.copy("template.plot.zip", "my_plot.plot")
|
|
43
43
|
|
|
44
44
|
# Pack/unpack between formats
|
|
45
|
-
bundle.pack("plot.
|
|
46
|
-
bundle.unpack("plot.
|
|
45
|
+
bundle.pack("plot.plot") # -> plot.plot.zip
|
|
46
|
+
bundle.unpack("plot.plot.zip") # -> plot.plot/
|
|
47
47
|
```
|
|
48
48
|
|
|
49
49
|
## ZipBundle Class
|
|
@@ -54,19 +54,19 @@ In-memory access to ZIP bundles without extraction:
|
|
|
54
54
|
from scitex.io.bundle import ZipBundle
|
|
55
55
|
|
|
56
56
|
# Reading
|
|
57
|
-
with ZipBundle("figure.
|
|
57
|
+
with ZipBundle("figure.figure.zip") as zb:
|
|
58
58
|
spec = zb.read_json("spec.json")
|
|
59
59
|
data = zb.read_csv("data.csv")
|
|
60
60
|
png = zb.read_bytes("exports/figure.png")
|
|
61
61
|
|
|
62
62
|
# Writing (atomic)
|
|
63
|
-
with ZipBundle("output.
|
|
63
|
+
with ZipBundle("output.plot.zip", mode="w") as zb:
|
|
64
64
|
zb.write_json("spec.json", spec_dict)
|
|
65
65
|
zb.write_csv("data.csv", dataframe)
|
|
66
66
|
zb.write_bytes("exports/plot.png", png_bytes)
|
|
67
67
|
|
|
68
68
|
# Modifying (read + write atomically)
|
|
69
|
-
with ZipBundle("figure.
|
|
69
|
+
with ZipBundle("figure.figure.zip", mode="a") as zb:
|
|
70
70
|
spec = zb.read_json("spec.json")
|
|
71
71
|
spec["title"] = "Updated"
|
|
72
72
|
zb.write_json("spec.json", spec)
|
|
@@ -74,57 +74,66 @@ with ZipBundle("figure.figz", mode="a") as zb:
|
|
|
74
74
|
|
|
75
75
|
## Nested Bundle Access
|
|
76
76
|
|
|
77
|
-
Access
|
|
77
|
+
Access plot bundles nested inside figure bundles:
|
|
78
78
|
|
|
79
79
|
```python
|
|
80
80
|
from scitex.io.bundle import nested
|
|
81
81
|
|
|
82
82
|
# Get preview image
|
|
83
|
-
preview = nested.get_preview("Figure1.
|
|
83
|
+
preview = nested.get_preview("Figure1.figure/A.plot")
|
|
84
84
|
|
|
85
85
|
# Get JSON
|
|
86
|
-
spec = nested.get_json("Figure1.
|
|
86
|
+
spec = nested.get_json("Figure1.figure/A.plot/spec.json")
|
|
87
87
|
|
|
88
88
|
# Get any file
|
|
89
|
-
png = nested.get_file("Figure1.
|
|
89
|
+
png = nested.get_file("Figure1.figure/A.plot/exports/plot.png")
|
|
90
90
|
|
|
91
91
|
# Write to nested bundle
|
|
92
|
-
nested.put_json("Figure1.
|
|
92
|
+
nested.put_json("Figure1.figure/A.plot/spec.json", updated_spec)
|
|
93
93
|
|
|
94
94
|
# List files
|
|
95
|
-
files = nested.list_files("Figure1.
|
|
95
|
+
files = nested.list_files("Figure1.figure/A.plot")
|
|
96
96
|
|
|
97
97
|
# Resolve full bundle data
|
|
98
|
-
data = nested.resolve("Figure1.
|
|
98
|
+
data = nested.resolve("Figure1.figure/A.plot")
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
## Bundle Structure
|
|
102
102
|
|
|
103
|
-
### .
|
|
103
|
+
### .plot Bundle
|
|
104
104
|
|
|
105
105
|
```
|
|
106
|
-
plot.
|
|
107
|
-
├──
|
|
108
|
-
├──
|
|
109
|
-
├──
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
│
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
106
|
+
plot.plot/
|
|
107
|
+
├── canonical/
|
|
108
|
+
│ ├── spec.json # Plot specification (kind, id, size, etc.)
|
|
109
|
+
│ ├── encoding.json # Encoding specification (traces, axes)
|
|
110
|
+
│ └── theme.json # Visual styling (colors, fonts, sizes)
|
|
111
|
+
├── payload/
|
|
112
|
+
│ └── data.csv # Source data
|
|
113
|
+
├── artifacts/
|
|
114
|
+
│ ├── exports/
|
|
115
|
+
│ │ ├── plot.png # Rendered preview
|
|
116
|
+
│ │ └── plot.svg
|
|
117
|
+
│ └── cache/
|
|
118
|
+
│ └── geometry_px.json
|
|
119
|
+
└── children/ # Empty for leaf bundles
|
|
116
120
|
```
|
|
117
121
|
|
|
118
|
-
### .
|
|
122
|
+
### .figure Bundle
|
|
119
123
|
|
|
120
124
|
```
|
|
121
|
-
Figure1.
|
|
122
|
-
├──
|
|
123
|
-
├──
|
|
124
|
-
├──
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
Figure1.figure/
|
|
126
|
+
├── canonical/
|
|
127
|
+
│ ├── spec.json # Figure layout, panel positions, children list
|
|
128
|
+
│ ├── encoding.json # Figure-level encoding
|
|
129
|
+
│ └── theme.json # Figure-level styling
|
|
130
|
+
├── payload/ # Empty for composite bundles
|
|
131
|
+
├── artifacts/
|
|
132
|
+
│ └── exports/
|
|
133
|
+
│ └── Figure1.png
|
|
134
|
+
└── children/
|
|
135
|
+
├── panel-a.zip # Panel A (nested plot bundle)
|
|
136
|
+
└── panel-b.zip # Panel B (nested plot bundle)
|
|
128
137
|
```
|
|
129
138
|
|
|
130
139
|
## API Reference
|
|
@@ -140,7 +149,7 @@ Figure1.figz.d/
|
|
|
140
149
|
| `unpack(zip_path)` | Convert ZIP to directory |
|
|
141
150
|
| `validate(path)` | Validate bundle structure |
|
|
142
151
|
| `is_bundle(path)` | Check if path is a bundle |
|
|
143
|
-
| `get_type(path)` | Get bundle type ('
|
|
152
|
+
| `get_type(path)` | Get bundle type ('figure', 'plot', 'stats') |
|
|
144
153
|
|
|
145
154
|
### ZipBundle Methods
|
|
146
155
|
|
|
@@ -169,44 +178,44 @@ Figure1.figz.d/
|
|
|
169
178
|
| `nested.resolve(path)` | Load full nested bundle data |
|
|
170
179
|
| `nested.parse_path(path)` | Parse nested path components |
|
|
171
180
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
| `from scitex.io._nested_bundle import put_nested_json` | `from scitex.io.bundle import nested; nested.put_json` |
|
|
196
|
-
| `from scitex.io._nested_bundle import list_nested_files` | `from scitex.io.bundle import nested; nested.list_files` |
|
|
197
|
-
| `from scitex.io._nested_bundle import parse_nested_path` | `from scitex.io.bundle import nested; nested.parse_path` |
|
|
198
|
-
| `from scitex.io._nested_bundle import NestedBundleNotFoundError` | `from scitex.io.bundle import NestedBundleNotFoundError` |
|
|
181
|
+
### Bundle and Spec Classes
|
|
182
|
+
|
|
183
|
+
```python
|
|
184
|
+
from scitex.io.bundle import Bundle, Spec, SpecRefs
|
|
185
|
+
|
|
186
|
+
# Create a new bundle
|
|
187
|
+
bundle = Bundle("my_plot.plot", create=True, kind="plot")
|
|
188
|
+
bundle.spec.name = "My Plot"
|
|
189
|
+
bundle.save()
|
|
190
|
+
|
|
191
|
+
# Load existing bundle
|
|
192
|
+
bundle = Bundle("existing.plot.zip")
|
|
193
|
+
print(bundle.spec.kind) # 'plot'
|
|
194
|
+
print(bundle.spec.id)
|
|
195
|
+
|
|
196
|
+
# Create from matplotlib
|
|
197
|
+
from scitex.io.bundle import from_matplotlib
|
|
198
|
+
import matplotlib.pyplot as plt
|
|
199
|
+
|
|
200
|
+
fig, ax = plt.subplots()
|
|
201
|
+
ax.plot([1, 2, 3], [1, 4, 9])
|
|
202
|
+
bundle = from_matplotlib(fig, "output.plot")
|
|
203
|
+
```
|
|
199
204
|
|
|
200
205
|
## Module Structure
|
|
201
206
|
|
|
202
207
|
```
|
|
203
208
|
scitex/io/bundle/
|
|
204
|
-
├── __init__.py
|
|
205
|
-
├── _types.py
|
|
206
|
-
├── _core.py
|
|
207
|
-
├── _zip.py
|
|
208
|
-
├── _nested.py
|
|
209
|
-
|
|
209
|
+
├── __init__.py # Public API exports
|
|
210
|
+
├── _types.py # BundleType, errors, constants
|
|
211
|
+
├── _core.py # load, save, copy, pack, unpack, validate
|
|
212
|
+
├── _zip.py # ZipBundle class and functions
|
|
213
|
+
├── _nested.py # Nested bundle access
|
|
214
|
+
├── _Bundle.py # Bundle class
|
|
215
|
+
├── _dataclasses/ # Spec, SpecRefs, BBox, SizeMM, etc.
|
|
216
|
+
├── _loader.py # Bundle component loading
|
|
217
|
+
├── _saver.py # Bundle component saving
|
|
218
|
+
└── README.md # This documentation
|
|
210
219
|
```
|
|
211
220
|
|
|
212
|
-
<!-- EOF -->
|
|
221
|
+
<!-- EOF -->
|