From f1302ae31c6e68dc30a234dc1cce8cce38516fec Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 14:19:18 +0000 Subject: [PATCH 1/5] Close both RCE paths; fix Python/Streamlit floors and version drift Audit findings A-01, A-02, A-04, A-05, A-08, A-11a, A-16, A-26. Decisions recorded as TDEC-009..TDEC-013 in the mediator repo. A-01 (Critical) -- session files no longer unpickle. _deserialize_data called pickle.loads on a base64 blob taken from an uploaded .json, so opening a shared session file executed its author's code. Arrays now carry an explicit dtype + shape + raw buffer and are rebuilt with np.frombuffer, with a length check so a truncated file fails loudly instead of producing a wrong array. The generic "pickled" fallback is removed; unrepresentable values become an "unsupported" placeholder. Legacy pickle-encoded entries are refused, not loaded, and load_session_from_file now returns what it skipped so the Export page can tell the user. A dropped dataset can no longer remain the active selection. Regression tests include a canary that fails if the decoder ever executes a payload again. A-02 (Critical) -- the eval() sandbox is replaced. {"__builtins__": {}} is not a sandbox: the type hierarchy reaches an importer. Formulas are now evaluated by an AST whitelist that rejects attribute access, indirect calls, imports, lambdas and comprehensions, and bounds exponents and expression length. Callees resolve against the function whitelist rather than the namespace, so no column can become callable. All 17 documented expression forms verified working; 15 escape attempts verified blocked. SECURITY.md no longer claims a namespace restriction that never held, and now states what is and is not guaranteed. A-16 -- .pkl removed from the uploader and batch-folder extension lists; load_pickle stays in the Python API where the caller has chosen to trust the file. The GUI explains the refusal rather than just omitting it. A-04 (Critical) -- tomllib is 3.11+ but the project supports 3.9, so the Settings page raised ModuleNotFoundError on 3.9/3.10 while every other page worked. Guarded with a tomli fallback plus a conditional dependency. A-05 (Critical) -- streamlit floor 1.25.0 -> 1.49.0 in all three requirement files; the code uses width="stretch" at 64 sites. Also added the !=3.9.7 exclusion streamlit itself carries, and the missing requests/h5py/xarray/netcdf4 to binder so the Binder badge can open the formats the docs advertise. A-11a -- test_cli.py used a bare 'python', so all 27 CLI tests failed in any virtualenv. Now sys.executable with an absolute script path. This took the suite from 877 passed / 27 failed to 954 passed / 0 failed. A-26 -- version had drifted across six files. modules/__init__.py is now the single source; pyproject reads it dynamically and cli.py, Home.py and docs/conf.py import it. test_version asserted '1.0.0' and had gone stale unnoticed because CI never ran test_cli.py -- it now asserts against the package version. A-08 -- launch.command and setup.command set to mode 755; without the execute bit macOS Finder refuses to run them, so the documented double-click setup failed on every fresh clone. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013YLgSnkyRUosy5sxWUb33P --- SECURITY.md | 45 ++++++- __init__.py | 3 +- binder/requirements.txt | 11 +- cli.py | 3 +- docs/conf.py | 10 +- modules/Home.py | 10 +- modules/__init__.py | 8 +- modules/data_tools.py | 212 +++++++++++++++++++++++++++++- modules/pages/14_Settings.py | 9 +- modules/pages/1_Data_Upload.py | 12 +- modules/pages/7_Export_Results.py | 18 ++- modules/utils/session_state.py | 178 +++++++++++++++++++++---- pyproject.toml | 12 +- requirements.txt | 5 +- tests/test_cli.py | 21 ++- tests/test_data_tools.py | 127 +++++++++++++++++- tests/test_utils.py | 149 ++++++++++++++++++++- 17 files changed, 767 insertions(+), 66 deletions(-) diff --git a/SECURITY.md b/SECURITY.md index 5fb246d..bd2a1be 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -39,11 +39,46 @@ A useful report includes: The following behaviors are **intentional** and documented — please do not report them as vulnerabilities unless you have found a bypass of the existing mitigations: -- **`eval()` in Analysis Tools and Data Tools:** User-provided function expressions - (e.g., custom curve-fit formulas) are evaluated with `eval()`. The execution context - is restricted to a minimal namespace. This is acceptable for a local/classroom tool - but should not be exposed to untrusted users on a public server without additional - sandboxing. +- **User-provided expressions in Analysis Tools and Data Tools.** Formula and + curve-fit expressions are supplied as text and evaluated by Plottle. + + `plottle.data_tools.add_formula_column` evaluates them with an **AST whitelist** + (`_safe_eval`): the expression is parsed, and only arithmetic, comparisons, + `and`/`or`/`not`, conditional expressions, subscripting, literals, whitelisted + names, and direct calls to the documented math functions are executed. Attribute + access, imports, lambdas, comprehensions, assignments, and indirect calls are + rejected. Exponents and expression length are bounded to prevent trivially + constructed hangs. + + Row filtering (`filter_rows`) delegates to `pandas.DataFrame.eval`, which uses + pandas' own restricted parser. + + **What this does and does not guarantee.** The whitelist is intended to prevent an + expression from reaching the Python runtime — the filesystem, the process, or the + import system. It is not a resource sandbox: an expression can still allocate large + arrays or run for a long time. Treat it as a robust barrier against code execution, + not as a guarantee of availability. If you find an expression that reaches attribute + access, an import, or any callable outside the documented list, that **is** a + vulnerability — please report it. + + Note that Plottle is designed to run on `localhost` for a single user. Binding the + Streamlit GUI to a public interface exposes every input surface described below to + anyone who can reach the port, and is not a supported configuration. + +- **File uploads execute no code, by design.** Session files + (Export → Load session) are decoded without `pickle`: arrays carry an explicit + dtype, shape, and raw buffer, and anything not safely representable is refused + rather than deserialized. Session files written by Plottle 2.0.1 and earlier used a + pickle-based encoding; those entries are **refused on load**, not unpickled, and the + loader reports what it skipped. + + `plottle.io.load_pickle` / `save_pickle` remain available in the **Python API**, + where the caller has chosen to trust the file. `.pkl` is deliberately *not* accepted + by the GUI's file uploader or batch folder import. + +- **Local filesystem access from the GUI.** The Data Upload page's batch-folder + import reads a user-supplied absolute path from the machine running the server. This + is intended for local single-user use; do not expose it on a shared host. ## Scope diff --git a/__init__.py b/__init__.py index 268dc52..1a918f8 100644 --- a/__init__.py +++ b/__init__.py @@ -29,6 +29,7 @@ >>> fig, ax, info = histogram(data['value'], bins=30) """ -__version__ = "2.0.0" +from modules import __version__ # noqa: F401 (re-exported for convenience) + __author__ = "Jonathan D. Schultz, PhD — North Carolina Central University" __all__ = ["modules"] diff --git a/binder/requirements.txt b/binder/requirements.txt index e2d0647..7aee01f 100644 --- a/binder/requirements.txt +++ b/binder/requirements.txt @@ -4,5 +4,14 @@ pandas>=2.0.0 matplotlib>=3.7.0 seaborn>=0.12.0 plotly>=5.14.0 -streamlit>=1.25.0 +streamlit>=1.49.0 openpyxl>=3.1.0 + +# Optional format support the GUI advertises (HDF5 / NetCDF) and the +# NIST WebBook integration -- omitting these made the Binder badge launch an +# environment that could not open half the documented formats. +requests>=2.28.0 +h5py>=3.0.0 +xarray>=0.20.0 +netcdf4>=1.6.0 +tomli>=2.0.0; python_version < "3.11" diff --git a/cli.py b/cli.py index 1ff3e19..af0956c 100644 --- a/cli.py +++ b/cli.py @@ -44,6 +44,7 @@ import pandas as pd # Import module functions +from modules import __version__ from modules.io import load_data, save_data from modules.math import calculate_statistics, check_normality from modules.plotting import ( @@ -514,7 +515,7 @@ def main(): formatter_class=argparse.RawDescriptionHelpFormatter, ) - parser.add_argument("--version", action="version", version="Plottle 2.0.0") + parser.add_argument("--version", action="version", version=f"Plottle {__version__}") parser.add_argument("--verbose", "-v", action="store_true", help="Enable verbose output") diff --git a/docs/conf.py b/docs/conf.py index a3bd93b..37d6df8 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -11,8 +11,14 @@ project = "Plottle" copyright = "2026, Jonathan D. Schultz, PhD — NCCU Department of Chemistry and Biochemistry" author = "Jonathan D. Schultz, PhD" -release = "2.0.0" -version = "2.0" +# Read the version from the package so it cannot drift from pyproject.toml. +_version_ns: dict = {} +for _line in open(os.path.join("..", "modules", "__init__.py"), encoding="utf-8"): + if _line.startswith("__version__"): + exec(_line, _version_ns) # noqa: S102 -- a single literal assignment + break +release = _version_ns["__version__"] +version = ".".join(release.split(".")[:2]) # -- General configuration ----------------------------------------------------- diff --git a/modules/Home.py b/modules/Home.py index d8cc28c..873e066 100644 --- a/modules/Home.py +++ b/modules/Home.py @@ -42,6 +42,7 @@ _NCCU_HORIZ = _ASSETS_DIR / "nccu-horiz-logo.png" _NCCU_WINGS = _ASSETS_DIR / "nccu-wings.png" +from modules import __version__ # noqa: E402 from modules.utils import initialize_session_state, get_session_summary # noqa: E402 try: @@ -59,7 +60,7 @@ initial_sidebar_state="expanded", menu_items={ "About": ( - "**Plottle** v2.0.0\n\n" + f"**Plottle** v{__version__}\n\n" "Scientific data visualization and analysis toolkit for research " "and teaching in computational science — developed at North Carolina " "Central University.\n\n" @@ -134,7 +135,8 @@ def _home_page() -> None: ) st.markdown( "

" - "Scientific data visualization and analysis  ·  v2.0.0" + "Scientific data visualization and analysis " + f" ·  v{__version__}" "

", unsafe_allow_html=True, ) @@ -211,11 +213,11 @@ def _home_page() -> None: """) st.markdown("## About") - st.markdown(""" + st.markdown(f""" **Plottle** is developed at North Carolina Central University for research and teaching in computational science. Built with Streamlit · NumPy · Pandas · Matplotlib · Seaborn · Plotly · SciPy. - Version 2.0.0 + Version {__version__} """) diff --git a/modules/__init__.py b/modules/__init__.py index 76314b1..098c1a3 100644 --- a/modules/__init__.py +++ b/modules/__init__.py @@ -10,4 +10,10 @@ gui : Interactive GUI components """ -__all__ = ["io", "math", "plotting", "gui"] +# Single source of truth for the version. `pyproject.toml` reads this via +# `[tool.setuptools.dynamic]`, and cli.py / Home.py / docs/conf.py import it, so +# the number cannot drift between the package, the CLI, and the GUI. +# See audit A-26. +__version__ = "2.0.1" + +__all__ = ["io", "math", "plotting", "gui", "__version__"] diff --git a/modules/data_tools.py b/modules/data_tools.py index 222edd7..f1d07d0 100644 --- a/modules/data_tools.py +++ b/modules/data_tools.py @@ -33,8 +33,10 @@ from __future__ import annotations +import ast import math -from typing import List, Optional +import operator +from typing import Any, Dict, List, Optional import numpy as np import pandas as pd @@ -68,6 +70,194 @@ } +# ─── Safe expression evaluation ─────────────────────────────────────────────── +# +# Formula expressions arrive from a text input in the GUI, so they are +# untrusted. `eval(expr, {"__builtins__": {}}, ns)` is NOT a sandbox — the +# empty-builtins trick is bypassed by walking the type hierarchy to reach an +# importer, e.g. +# +# [c for c in ().__class__.__bases__[0].__subclasses__() +# if c.__name__ == "BuiltinImporter"][0]().load_module("os") +# +# Every step of that escape needs attribute access, so the evaluator below +# whitelists AST node types and rejects `ast.Attribute` outright. Anything not +# explicitly allowed raises ValueError rather than being evaluated. + +_BIN_OPS = { + ast.Add: operator.add, + ast.Sub: operator.sub, + ast.Mult: operator.mul, + ast.Div: operator.truediv, + ast.FloorDiv: operator.floordiv, + ast.Mod: operator.mod, + ast.Pow: operator.pow, +} + +_UNARY_OPS = { + ast.UAdd: operator.pos, + ast.USub: operator.neg, + ast.Not: operator.not_, +} + +_COMPARE_OPS = { + ast.Eq: operator.eq, + ast.NotEq: operator.ne, + ast.Lt: operator.lt, + ast.LtE: operator.le, + ast.Gt: operator.gt, + ast.GtE: operator.ge, +} + +# Guards against expressions that are cheap to type and expensive to evaluate, +# e.g. `9**9**9`, which would otherwise hang the app. +_MAX_POW_EXPONENT = 1024 +_MAX_EXPRESSION_LENGTH = 2000 + + +def _safe_eval(expression: str, namespace: Dict[str, Any]) -> Any: + """Evaluate an arithmetic expression without exposing the Python runtime. + + Supports numeric and boolean literals, the names in *namespace*, the binary + and unary arithmetic operators, comparisons, ``and``/``or``/``not``, tuples + and lists, subscripting, and calls to the whitelisted functions in + *namespace*. Attribute access, imports, lambdas, comprehensions, + assignments, and every other construct are rejected. + + Parameters + ---------- + expression : str + Expression source. + namespace : dict + Names visible to the expression — the math helpers in ``_SAFE_MATH`` + plus one entry per DataFrame column. + + Returns + ------- + Any + The value of the expression. + + Raises + ------ + ValueError + If the expression uses a construct that is not whitelisted, references + an unknown name, or exceeds the size/complexity guards. + """ + if len(expression) > _MAX_EXPRESSION_LENGTH: + raise ValueError( + f"expression is too long ({len(expression)} characters; " + f"limit is {_MAX_EXPRESSION_LENGTH})" + ) + + try: + tree = ast.parse(expression, mode="eval") + except SyntaxError as exc: + raise ValueError(f"could not parse expression: {exc.msg}") from exc + + def _describe(node: ast.AST) -> str: + if isinstance(node, ast.Attribute): + return "attribute access (e.g. `x.attr`) is not allowed in formulas" + if isinstance( + node, (ast.Lambda, ast.ListComp, ast.SetComp, ast.DictComp, ast.GeneratorExp) + ): + return f"`{type(node).__name__}` is not allowed in formulas" + if isinstance(node, (ast.Import, ast.ImportFrom)): + return "imports are not allowed in formulas" + return f"`{type(node).__name__}` is not supported in formulas" + + def _eval(node: ast.AST) -> Any: + if isinstance(node, ast.Expression): + return _eval(node.body) + + if isinstance(node, ast.Constant): + if isinstance(node.value, (int, float, complex, bool)) or node.value is None: + return node.value + if isinstance(node.value, str): + return node.value + raise ValueError(f"literal of type {type(node.value).__name__} is not allowed") + + if isinstance(node, ast.Name): + if node.id not in namespace: + raise ValueError( + f"unknown name '{node.id}' — expected a column name or one of: " + + ", ".join(sorted(_SAFE_MATH)) + ) + return namespace[node.id] + + if isinstance(node, ast.BinOp): + op = _BIN_OPS.get(type(node.op)) + if op is None: + raise ValueError(f"operator `{type(node.op).__name__}` is not allowed") + left, right = _eval(node.left), _eval(node.right) + if op is operator.pow and isinstance(right, (int, float)): + if abs(right) > _MAX_POW_EXPONENT: + raise ValueError(f"exponent {right} exceeds the limit of {_MAX_POW_EXPONENT}") + return op(left, right) + + if isinstance(node, ast.UnaryOp): + op = _UNARY_OPS.get(type(node.op)) + if op is None: + raise ValueError(f"operator `{type(node.op).__name__}` is not allowed") + return op(_eval(node.operand)) + + if isinstance(node, ast.BoolOp): + values = [_eval(v) for v in node.values] + result = values[0] + for value in values[1:]: + result = (result & value) if isinstance(node.op, ast.And) else (result | value) + return result + + if isinstance(node, ast.Compare): + result = None + left = _eval(node.left) + for op_node, comparator_node in zip(node.ops, node.comparators): + op = _COMPARE_OPS.get(type(op_node)) + if op is None: + raise ValueError(f"comparison `{type(op_node).__name__}` is not allowed") + right = _eval(comparator_node) + outcome = op(left, right) + result = outcome if result is None else (result & outcome) + left = right + return result + + if isinstance(node, ast.Call): + # Only a bare whitelisted name may be called — never the result of + # another expression, which is how attribute-free escapes are built. + if not isinstance(node.func, ast.Name): + raise ValueError("only direct calls to the built-in formula functions are allowed") + if node.keywords: + raise ValueError("keyword arguments are not supported in formulas") + # Resolve against _SAFE_MATH directly rather than the namespace, so a + # column can never become callable no matter what it is named. + func = _SAFE_MATH.get(node.func.id) + if not callable(func): + raise ValueError( + f"'{node.func.id}' is not a callable formula function — allowed: " + + ", ".join(sorted(k for k, v in _SAFE_MATH.items() if callable(v))) + ) + return func(*[_eval(arg) for arg in node.args]) + + if isinstance(node, (ast.Tuple, ast.List)): + return [_eval(elt) for elt in node.elts] + + if isinstance(node, ast.Subscript): + return _eval(node.value)[_eval(node.slice)] + + if isinstance(node, ast.Slice): + return slice( + _eval(node.lower) if node.lower else None, + _eval(node.upper) if node.upper else None, + _eval(node.step) if node.step else None, + ) + + if isinstance(node, ast.IfExp): + return _eval(node.body) if _eval(node.test) else _eval(node.orelse) + + raise ValueError(_describe(node)) + + return _eval(tree) + + def add_formula_column( df: pd.DataFrame, new_col: str, @@ -85,14 +275,20 @@ def add_formula_column( new_col : str Name for the new column. expression : str - A Python expression using column names and the math functions listed - below. For example: ``"log(A) / B"`` or ``"(A - mean(A)) / std(A)"``. + An arithmetic expression using column names and the math functions + listed below. For example: ``"log(A) / B"`` or + ``"(A - mean(A)) / std(A)"``. Available functions: ``log``, ``log2``, ``log10``, ``exp``, ``sqrt``, ``abs``, ``sin``, ``cos``, ``tan``, ``mean``, ``std``, ``min``, ``max``, ``sum``, ``cumsum``, ``diff`` (all operate on arrays). Constants: ``pi``, ``e``, ``nan``. + The expression is evaluated by :func:`_safe_eval`, which permits + arithmetic, comparisons, ``and``/``or``/``not``, conditional + expressions, subscripting, and calls to the functions above. Attribute + access, imports, lambdas, comprehensions, and assignments are rejected. + Returns ------- pd.DataFrame @@ -101,10 +297,12 @@ def add_formula_column( Raises ------ ValueError - If *expression* is empty or *new_col* is empty. + If *expression* or *new_col* is empty, if *expression* cannot be + parsed, if it references an unknown name, or if it uses a construct + that is not whitelisted. Exception - Re-raised if the expression itself raises (e.g. ZeroDivisionError, - NameError for unknown column names). + Re-raised if evaluating a whitelisted expression itself raises — for + example ``ZeroDivisionError`` for ``"1 / 0"``. """ if not expression.strip(): raise ValueError("expression must not be empty") @@ -116,7 +314,7 @@ def add_formula_column( for col in df.columns: namespace[col] = df[col].to_numpy(dtype=float, na_value=np.nan) - result = eval(expression, {"__builtins__": {}}, namespace) # noqa: S307 + result = _safe_eval(expression, namespace) out = df.copy() out[new_col] = result diff --git a/modules/pages/14_Settings.py b/modules/pages/14_Settings.py index ff4c04a..aa5980e 100644 --- a/modules/pages/14_Settings.py +++ b/modules/pages/14_Settings.py @@ -12,10 +12,17 @@ """ import json -import tomllib from pathlib import Path import sys +# `tomllib` entered the stdlib in Python 3.11, but Plottle supports 3.9+. +# Without this fallback the whole page raises ModuleNotFoundError on 3.9/3.10 +# while every other page works — see G-013 / audit A-04. +try: + import tomllib +except ModuleNotFoundError: # Python 3.9 / 3.10 + import tomli as tomllib + import streamlit as st sys.path.insert(0, str(Path(__file__).parent.parent.parent)) diff --git a/modules/pages/1_Data_Upload.py b/modules/pages/1_Data_Upload.py index 6f88cb1..7ab391a 100644 --- a/modules/pages/1_Data_Upload.py +++ b/modules/pages/1_Data_Upload.py @@ -117,10 +117,13 @@ def _load_example_cached(path: str): tab1, tab2, tab3 = st.tabs(["Upload File", "Example Datasets", "Batch Import"]) with tab1: + # NOTE: `pkl` is deliberately absent. Unpickling an uploaded file executes + # code contained in it, and a user clicking "Browse files" has not consented + # to that. `plottle.io.load_pickle()` remains available in the Python API, + # where the caller has chosen to trust the file. See TDEC-011 / audit A-16. uploaded_file = st.file_uploader( "Choose a data file", type=[ - "pkl", "npy", "npz", "csv", @@ -142,6 +145,11 @@ def _load_example_cached(path: str): ], help="Upload a data file in any supported format", ) + st.caption( + "Pickle (`.pkl`) files are not accepted here — loading one runs any code it " + "contains. Use `plottle.io.load_pickle()` from Python if you trust the file, " + "or re-save your data as CSV or Parquet." + ) if uploaded_file is not None: try: @@ -275,6 +283,7 @@ def _load_example_cached(path: str): key="batch_folder_path", help="Absolute path to the directory containing your data files.", ) + # `pkl` is deliberately absent here too — see the note on the uploader above. _all_exts = [ "csv", "xlsx", @@ -282,7 +291,6 @@ def _load_example_cached(path: str): "tsv", "json", "parquet", - "pkl", "npy", "npz", "jdx", diff --git a/modules/pages/7_Export_Results.py b/modules/pages/7_Export_Results.py index a9913e3..8e45bac 100644 --- a/modules/pages/7_Export_Results.py +++ b/modules/pages/7_Export_Results.py @@ -393,9 +393,21 @@ def _make_serializable(obj): tmp_path = tmp.name try: - load_session_from_file(tmp_path) - st.success("Session restored. Navigate to other pages to use the loaded data.") - st.rerun() + skipped = load_session_from_file(tmp_path) + if skipped: + # Deliberately no st.rerun() here — a rerun would discard this + # warning before the user ever sees it. The data is already in + # session state, so navigating to another page picks it up. + st.warning( + "Session restored, but some entries could not be loaded:\n\n" + + "\n".join(f"- {note}" for note in skipped) + + "\n\nSessions saved by Plottle 2.0.1 or earlier stored arrays in a " + "format that is no longer accepted. Re-upload the original data files " + "and save the session again." + ) + else: + st.success("Session restored. Navigate to other pages to use the loaded data.") + st.rerun() except Exception as exc: st.error(f"Could not load session: {exc}") finally: diff --git a/modules/utils/session_state.py b/modules/utils/session_state.py index 90a2200..eb31ff6 100644 --- a/modules/utils/session_state.py +++ b/modules/utils/session_state.py @@ -41,11 +41,10 @@ import io import streamlit as st import json -import pickle import base64 from datetime import datetime from pathlib import Path -from typing import Any, Dict, Optional +from typing import Any, Dict, List, Optional import numpy as np import pandas as pd @@ -248,9 +247,15 @@ def add_analysis_result(result_data: Dict): st.session_state.analysis_results.append(result_data) -def _serialize_data(data: Any) -> Dict: +def _serialize_data(data: Any) -> Any: """Serialize data for JSON storage. + Only types with a safe, self-describing encoding are serialized: + DataFrames (via ``to_json``), numeric/boolean ndarrays (via an explicit + dtype + shape + raw-buffer triple), JSON scalars, and lists/dicts of the + above. Anything else is replaced by an ``unsupported`` placeholder rather + than being pickled — see Notes. + Parameters ---------- data : Any @@ -258,15 +263,32 @@ def _serialize_data(data: Any) -> Dict: Returns ------- - serialized : dict - Serialized representation + serialized : Any + Serialized representation — a dict for tagged types, otherwise the + value itself. + + Notes + ----- + Session files are written and re-read through the GUI's Export page, which + accepts uploads. Any ``pickle``-based encoding would therefore make + "open a session file" equivalent to "execute arbitrary code", so pickle is + deliberately not used here. Object-dtype arrays are also refused, since + their contents cannot be represented without pickling. """ if isinstance(data, pd.DataFrame): return {"__type__": "DataFrame", "__data__": data.to_json(orient="split")} elif isinstance(data, np.ndarray): + if data.dtype.hasobject: + return { + "__type__": "unsupported", + "__class__": f"numpy.ndarray[{data.dtype}]", + "__reason__": "object-dtype arrays cannot be serialized safely", + } return { "__type__": "ndarray", - "__data__": base64.b64encode(pickle.dumps(data)).decode("utf-8"), + "__dtype__": data.dtype.str, + "__shape__": list(data.shape), + "__data__": base64.b64encode(np.ascontiguousarray(data).tobytes()).decode("utf-8"), } elif isinstance(data, (int, float, str, bool, type(None))): return data @@ -275,38 +297,127 @@ def _serialize_data(data: Any) -> Dict: elif isinstance(data, dict): return {key: _serialize_data(value) for key, value in data.items()} else: - # Fallback: pickle and base64 encode return { - "__type__": "pickled", - "__data__": base64.b64encode(pickle.dumps(data)).decode("utf-8"), + "__type__": "unsupported", + "__class__": type(data).__name__, + "__reason__": "no safe JSON encoding for this type", } -def _deserialize_data(data: Any) -> Any: +def _decode_ndarray(data: Dict) -> np.ndarray: + """Rebuild an ndarray from a serialized dtype/shape/buffer triple. + + Parameters + ---------- + data : dict + Mapping with ``__dtype__``, ``__shape__``, and ``__data__`` keys as + written by :func:`_serialize_data`. + + Returns + ------- + numpy.ndarray + A writable array with the recorded dtype and shape. + + Raises + ------ + ValueError + If the dtype is absent, is an object dtype, or if the decoded buffer + length does not match ``dtype.itemsize * prod(shape)``. + """ + dtype_str = data.get("__dtype__") + if not dtype_str: + raise ValueError("ndarray entry is missing '__dtype__'") + + dtype = np.dtype(dtype_str) + if dtype.hasobject: + raise ValueError(f"refusing to decode object dtype {dtype!r}") + + shape = tuple(int(n) for n in data.get("__shape__", ())) + if any(n < 0 for n in shape): + raise ValueError(f"invalid shape {shape}") + + buf = base64.b64decode(data["__data__"]) + # np.frombuffer validates that the buffer is a whole number of items, but + # not that it matches `shape`; check explicitly so a truncated or padded + # file fails here rather than producing a silently wrong array. + expected = dtype.itemsize * int(np.prod(shape, dtype=np.int64)) if shape else dtype.itemsize + if len(buf) != expected: + raise ValueError( + f"ndarray buffer is {len(buf)} bytes; expected {expected} " + f"for dtype {dtype.str} and shape {shape}" + ) + + # frombuffer returns a read-only view onto `buf`; copy so callers can write. + return np.frombuffer(buf, dtype=dtype).reshape(shape).copy() + + +def _deserialize_data(data: Any, skipped: Optional[List[str]] = None) -> Any: """Deserialize data from JSON storage. Parameters ---------- data : Any Serialized data + skipped : list of str, optional + If given, a human-readable note is appended for every entry that could + not be restored. Callers use this to tell the user what was dropped. Returns ------- deserialized : Any - Deserialized data + Deserialized data, or ``None`` for entries that could not be restored. + + Notes + ----- + Entries written by Plottle 2.0.1 and earlier used a pickle-based encoding + (``__type__`` of ``"pickled"``, and ``"ndarray"`` without a ``__dtype__``). + Those are refused rather than unpickled — see :func:`_serialize_data`. """ if isinstance(data, dict): - if "__type__" in data: - if data["__type__"] == "DataFrame": - return pd.read_json(io.StringIO(data["__data__"]), orient="split") - elif data["__type__"] == "ndarray": - return pickle.loads(base64.b64decode(data["__data__"])) - elif data["__type__"] == "pickled": - return pickle.loads(base64.b64decode(data["__data__"])) - else: - return {key: _deserialize_data(value) for key, value in data.items()} + kind = data.get("__type__") + if kind is None: + return {key: _deserialize_data(value, skipped) for key, value in data.items()} + + if kind == "DataFrame": + return pd.read_json(io.StringIO(data["__data__"]), orient="split") + + if kind == "ndarray": + if "__dtype__" not in data: + if skipped is not None: + skipped.append( + "an array saved by Plottle 2.0.1 or earlier " + "(pickle-encoded; refused for safety)" + ) + return None + try: + return _decode_ndarray(data) + except (ValueError, TypeError) as exc: + if skipped is not None: + skipped.append(f"a corrupt array entry ({exc})") + return None + + if kind == "pickled": + if skipped is not None: + skipped.append( + f"a pickled {data.get('__class__', 'object')} saved by Plottle 2.0.1 " + "or earlier (refused for safety)" + ) + return None + + if kind == "unsupported": + if skipped is not None: + skipped.append( + f"{data.get('__class__', 'an object')} " + f"({data.get('__reason__', 'unsupported type')})" + ) + return None + + if skipped is not None: + skipped.append(f"an entry of unrecognized type {kind!r}") + return None + elif isinstance(data, list): - return [_deserialize_data(item) for item in data] + return [_deserialize_data(item, skipped) for item in data] else: return data @@ -347,22 +458,37 @@ def save_session_to_file(filepath: str): json.dump(session_data, f, indent=2) -def load_session_from_file(filepath: str): +def load_session_from_file(filepath: str) -> List[str]: """Restore session state from JSON file. Parameters ---------- filepath : str Path to session file + + Returns + ------- + skipped : list of str + One human-readable note per dataset that could not be restored — for + example entries saved by Plottle 2.0.1 or earlier, which used a + pickle-based encoding that is refused for safety. Empty when the whole + session was restored. Callers should surface this to the user. """ filepath = Path(filepath) with open(filepath, "r") as f: session_data = json.load(f) # Deserialize datasets + skipped: List[str] = [] st.session_state.datasets = {} for name, data in session_data["datasets"].items(): - st.session_state.datasets[name] = _deserialize_data(data) + notes: List[str] = [] + restored = _deserialize_data(data, notes) + if restored is None and notes: + skipped.extend(f"{name}: {note}" for note in notes) + continue + skipped.extend(f"{name}: {note}" for note in notes) + st.session_state.datasets[name] = restored st.session_state.dataset_metadata = session_data["dataset_metadata"] st.session_state.current_dataset = session_data["current_dataset"] @@ -370,6 +496,12 @@ def load_session_from_file(filepath: str): st.session_state.analysis_results = session_data["analysis_results"] st.session_state.plot_config = session_data["plot_config"] + # A dataset that was dropped must not stay selected. + if st.session_state.current_dataset not in st.session_state.datasets: + st.session_state.current_dataset = next(iter(st.session_state.datasets), None) + + return skipped + def clear_session(): """Reset all session state to defaults.""" diff --git a/pyproject.toml b/pyproject.toml index 6f71b9a..0bcbdd9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "plottle" -version = "2.0.1" +dynamic = ["version"] description = "A general-purpose Python toolkit for scientific data visualization and analysis" readme = "README.md" license = "MIT" @@ -25,7 +25,7 @@ classifiers = [ "Topic :: Scientific/Engineering :: Visualization", "Topic :: Scientific/Engineering :: Chemistry", ] -requires-python = ">=3.9" +requires-python = ">=3.9,!=3.9.7" dependencies = [ "numpy>=1.24.0", "scipy>=1.10.0", @@ -33,9 +33,11 @@ dependencies = [ "matplotlib>=3.7.0", "seaborn>=0.12.0", "plotly>=5.14.0", - "streamlit>=1.25.0", + "streamlit>=1.49.0", "openpyxl>=3.1.0", "PyYAML>=6.0", + # tomllib is stdlib from 3.11; needed by the Settings page on 3.9/3.10. + 'tomli>=2.0.0; python_version < "3.11"', ] [project.optional-dependencies] @@ -67,6 +69,10 @@ Changelog = "https://github.com/The-Schultz-Lab/plottle/blob/main/CHANGELOG.md" [tool.setuptools] py-modules = ["cli"] +# Single source of truth: modules/__init__.py. See audit A-26. +[tool.setuptools.dynamic] +version = {attr = "modules.__version__"} + [tool.setuptools.packages.find] where = ["."] include = ["modules*"] diff --git a/requirements.txt b/requirements.txt index 31f0802..f5ea417 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,7 +12,7 @@ seaborn>=0.12.0 plotly>=5.14.0 # GUI Framework -streamlit>=1.25.0 +streamlit>=1.49.0 # floor set by width="stretch" widgets + st.Page/st.navigation # Development and Testing pytest>=7.4.0 @@ -26,6 +26,9 @@ types-requests>=2.28.0 # Excel support for Pandas openpyxl>=3.1.0 +# TOML reader for the Settings page (stdlib tomllib from Python 3.11) +tomli>=2.0.0; python_version < "3.11" + # HTTP requests (used by NIST WebBook integration) requests>=2.28.0 diff --git a/tests/test_cli.py b/tests/test_cli.py index a199fb5..2aa040c 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -6,6 +6,7 @@ import pytest import subprocess +import sys import json from pathlib import Path import tempfile @@ -47,10 +48,15 @@ def run_cli(*args): result : CompletedProcess subprocess result with returncode, stdout, stderr """ - cmd = ['python', 'cli.py'] + list(args) + # Use sys.executable, not a bare 'python': inside a virtualenv (or a tox / + # CI matrix cell) 'python' resolves via PATH to an interpreter that does not + # have the project's dependencies installed, and every one of these tests + # fails with ModuleNotFoundError. See G-016 / audit A-11a. + repo_root = Path(__file__).resolve().parent.parent + cmd = [sys.executable, str(repo_root / 'cli.py')] + list(args) result = subprocess.run( cmd, - cwd=Path(__file__).parent.parent, + cwd=repo_root, capture_output=True, text=True ) @@ -73,10 +79,17 @@ def test_help_message(self): assert 'stats' in result.stdout def test_version(self): - """Test that --version displays version.""" + """Test that --version reports the packaged version. + + Asserts against ``modules.__version__`` rather than a hardcoded string: + this test previously asserted '1.0.0' and went stale unnoticed because + CI never ran tests/test_cli.py. See audit A-11 / A-26. + """ + from modules import __version__ + result = run_cli('--version') assert result.returncode == 0 - assert '1.0.0' in result.stdout or '1.0.0' in result.stderr + assert __version__ in result.stdout or __version__ in result.stderr def test_examples(self): """Test that --examples displays usage examples.""" diff --git a/tests/test_data_tools.py b/tests/test_data_tools.py index 68bc9ca..e9c710b 100644 --- a/tests/test_data_tools.py +++ b/tests/test_data_tools.py @@ -109,9 +109,134 @@ def test_empty_new_col_raises(self, simple_df): add_formula_column(simple_df, " ", "x + 1") def test_bad_expression_raises(self, simple_df): - with pytest.raises(Exception): + with pytest.raises(ValueError, match="unknown name 'undefined_var'"): add_formula_column(simple_df, "bad", "undefined_var + 1") + def test_syntax_error_raises_valueerror(self, simple_df): + with pytest.raises(ValueError, match="could not parse expression"): + add_formula_column(simple_df, "bad", "x +* 2") + + +class TestFormulaExpressionSandbox: + """Regression tests for audit A-02 — the formula evaluator must not expose + the Python runtime. + + Expressions come from a text input in the GUI, so they are untrusted. The + previous implementation used ``eval(expr, {"__builtins__": {}}, ns)``, which + is escapable by walking the type hierarchy to reach an importer. Every known + escape route requires attribute access or an indirect call, so both are + rejected. See TDEC-010. + """ + + # The exact escape that was reproduced against the old implementation. + _CLASSIC_ESCAPE = ( + '[c for c in ().__class__.__bases__[0].__subclasses__() ' + 'if c.__name__=="BuiltinImporter"][0]().load_module("os").getcwd()' + ) + + @pytest.mark.parametrize( + "expression", + [ + _CLASSIC_ESCAPE, + '().__class__.__bases__[0].__subclasses__()', + 'x.__class__', + 'x.values', + '__import__("os").system("id")', + 'open("/etc/passwd").read()', + 'eval("1+1")', + 'exec("import os")', + 'globals()', + 'locals()', + 'lambda: 1', + '[i for i in range(3)]', + '{i: i for i in range(3)}', + '(i for i in range(3))', + 'x.__class__.__mro__[1]', + ], + ) + def test_escape_attempts_are_refused(self, simple_df, expression): + with pytest.raises(ValueError): + add_formula_column(simple_df, "pwned", expression) + + def test_attribute_access_is_rejected_with_a_clear_message(self, simple_df): + with pytest.raises(ValueError, match="attribute access"): + add_formula_column(simple_df, "bad", "x.mean") + + def test_indirect_calls_are_rejected(self, simple_df): + # Calling the result of an expression is how attribute-free escapes are + # assembled, so only bare whitelisted names may be called. Note that + # `(log)(x)` is *not* indirect — parentheses add no AST node — so this + # uses a construct that genuinely yields a non-Name callee. + with pytest.raises(ValueError, match="only direct calls"): + add_formula_column(simple_df, "bad", "(log if True else exp)(x)") + + def test_a_column_cannot_be_used_as_a_callee(self): + # Callees resolve against the function whitelist, never the namespace, + # so no column name can become callable. + df = pd.DataFrame({"mycol": [1.0, 2.0]}) + with pytest.raises(ValueError, match="not a callable formula function"): + add_formula_column(df, "bad", "mycol(1)") + + def test_column_named_like_a_function_shadows_only_the_value(self): + # A column named `log` is readable as data, while `log(...)` still + # resolves to numpy's log. Documents the precedence rather than + # asserting it is the only reasonable choice. + df = pd.DataFrame({"log": [1.0, np.e]}) + result = add_formula_column(df, "out", "log(log)") + np.testing.assert_allclose(result["out"].values, np.log([1.0, np.e])) + + def test_huge_exponent_is_rejected(self, simple_df): + # `9**9**9` is trivial to type and would otherwise hang the app. + with pytest.raises(ValueError, match="exceeds the limit"): + add_formula_column(simple_df, "bad", "9**9**9") + + def test_overlong_expression_is_rejected(self, simple_df): + with pytest.raises(ValueError, match="too long"): + add_formula_column(simple_df, "bad", "x+" * 2000 + "x") + + def test_non_callable_constant_cannot_be_called(self, simple_df): + with pytest.raises(ValueError, match="not a callable formula function"): + add_formula_column(simple_df, "bad", "pi(x)") + + def test_module_does_not_call_builtin_eval(self): + # Guards against the old implementation being reintroduced. + import inspect + + import modules.data_tools as dt + + source = inspect.getsource(dt.add_formula_column) + assert "eval(" not in source or "_safe_eval(" in source + assert "__builtins__" not in inspect.getsource(dt._safe_eval) + + @pytest.mark.parametrize( + "expression", + [ + "x + 1", + "x * 2 - 1", + "log(x + 10)", + "sqrt(x) * pi", + "exp(x) / e", + "cumsum(x)", + "x / max(x)", + "mean(x) + std(x)", + "abs(-x)", + "x ** 2", + "(x + x) / 2", + "sin(x) + cos(x)", + "-x", + "nan * x", + "x if True else x * 2", + ], + ) + def test_documented_expressions_still_work(self, simple_df, expression): + result = add_formula_column(simple_df, "ok", expression) + assert "ok" in result.columns + assert len(result) == len(simple_df) + + def test_comparison_yields_a_boolean_mask(self, simple_df): + result = add_formula_column(simple_df, "mask", "x > 1") + assert result["mask"].isin([True, False, 0, 1]).all() + def test_constants_available(self, simple_df): result = add_formula_column(simple_df, "pi_col", "x * pi") np.testing.assert_allclose( diff --git a/tests/test_utils.py b/tests/test_utils.py index d27591d..b4c921c 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -618,12 +618,39 @@ def test_serialize_dataframe_roundtrip(self): restored = _deserialize_data(serialized) assert list(restored.columns) == ['x', 'y'] - def test_serialize_unknown_type_pickled_roundtrip(self): - # complex is not handled by any explicit branch → falls to pickle fallback - val = complex(3, 4) - serialized = _serialize_data(val) - assert serialized['__type__'] == 'pickled' - assert _deserialize_data(serialized) == val + def test_serialize_ndarray_preserves_dtype_and_shape(self): + for arr in [ + np.arange(6, dtype=np.int32).reshape(2, 3), + np.array([[1.5, 2.5]], dtype=np.float32), + np.array([True, False, True]), + np.array([1 + 2j, 3 - 4j]), + ]: + restored = _deserialize_data(_serialize_data(arr)) + assert restored.dtype == arr.dtype + assert restored.shape == arr.shape + assert np.array_equal(restored, arr) + + def test_deserialized_ndarray_is_writable(self): + # np.frombuffer returns a read-only view; the decoder must copy. + restored = _deserialize_data(_serialize_data(np.zeros(3))) + restored[0] = 1.0 # must not raise + assert restored[0] == 1.0 + + def test_serialize_unknown_type_is_refused_not_pickled(self): + # Anything without a safe JSON encoding becomes an 'unsupported' + # placeholder. It must NOT be pickled — see TDEC-009 / audit A-01. + serialized = _serialize_data(complex(3, 4)) + assert serialized['__type__'] == 'unsupported' + assert 'complex' in serialized['__class__'] + + notes = [] + assert _deserialize_data(serialized, notes) is None + assert notes and 'complex' in notes[0] + + def test_serialize_object_dtype_array_is_refused(self): + arr = np.array([{'a': 1}, 'text'], dtype=object) + serialized = _serialize_data(arr) + assert serialized['__type__'] == 'unsupported' def test_deserialize_plain_dict(self): assert _deserialize_data({'key': 'value'}) == {'key': 'value'} @@ -635,6 +662,116 @@ def test_deserialize_scalar(self): assert _deserialize_data(42) == 42 +_UNPICKLE_CANARY = [] + + +def _trip_canary(value): + """Module-level so pickle can reference it by name. Records execution.""" + _UNPICKLE_CANARY.append(value) + return value + + +class _CanaryPayload: + """Pickles to a call of :func:`_trip_canary` — stands in for a malicious + ``__reduce__`` returning ``os.system``. ``__reduce__`` runs at dump time, + so the side effect must live in the *returned callable*, not in + ``__reduce__`` itself. + """ + + def __reduce__(self): + return (_trip_canary, ('EXECUTED',)) + + +class TestSessionDeserializationIsSafe: + """Regression tests for audit A-01 — session files must never unpickle. + + ``load_session_from_file`` is reachable from the Export page's file + uploader, so a pickle-based decoder would make opening a shared session + file equivalent to executing its author's code. + """ + + def test_session_state_module_does_not_import_pickle(self): + import modules.utils.session_state as ss + + assert not hasattr(ss, 'pickle'), ( + 'session_state must not import pickle — it is reachable from an upload' + ) + + def test_legacy_pickled_entry_is_refused(self): + import base64 + import pickle + + _UNPICKLE_CANARY.clear() + blob = base64.b64encode(pickle.dumps(_CanaryPayload())).decode() + + # Sanity-check that the payload really would execute if unpickled, + # so a green test cannot mean "the canary was inert". + assert pickle.loads(base64.b64decode(blob)) == 'EXECUTED' + assert _UNPICKLE_CANARY == ['EXECUTED'] + _UNPICKLE_CANARY.clear() + + notes = [] + assert _deserialize_data({'__type__': 'pickled', '__data__': blob}, notes) is None + assert notes and 'refused' in notes[0] + assert _UNPICKLE_CANARY == [], 'the decoder executed a pickle payload' + + def test_legacy_pickle_encoded_ndarray_is_refused(self): + # Pre-2.0.2 ndarray entries carried a pickle blob and no __dtype__. + import base64 + import pickle + + blob = base64.b64encode(pickle.dumps(np.zeros(3))).decode() + notes = [] + assert _deserialize_data({'__type__': 'ndarray', '__data__': blob}, notes) is None + assert notes + + def test_truncated_buffer_is_rejected(self): + serialized = _serialize_data(np.arange(10, dtype=np.float64)) + serialized['__shape__'] = [11] # claim more elements than the buffer holds + notes = [] + assert _deserialize_data(serialized, notes) is None + assert notes and 'corrupt' in notes[0] + + def test_object_dtype_on_decode_is_rejected(self): + notes = [] + payload = {'__type__': 'ndarray', '__dtype__': '|O', '__shape__': [1], '__data__': ''} + assert _deserialize_data(payload, notes) is None + assert notes + + def test_unrecognized_type_tag_is_refused(self): + notes = [] + assert _deserialize_data({'__type__': 'something_new'}, notes) is None + assert notes + + def test_load_reports_skipped_entries_and_clears_selection( + self, mock_session_state, tmp_path + ): + import base64 + import json + import pickle + + blob = base64.b64encode(pickle.dumps(np.zeros(3))).decode() + session = { + 'version': '1.0', + 'datasets': {'legacy.npy': {'__type__': 'pickled', '__data__': blob}}, + 'dataset_metadata': {}, + 'current_dataset': 'legacy.npy', + 'plot_history': [], + 'analysis_results': [], + 'plot_config': {}, + } + path = tmp_path / 'legacy_session.json' + path.write_text(json.dumps(session), encoding='utf-8') + + skipped = load_session_from_file(str(path)) + + assert len(skipped) == 1 + assert 'legacy.npy' in skipped[0] + assert 'legacy.npy' not in mock_session_state.datasets + # A dropped dataset must not remain the active selection. + assert mock_session_state.current_dataset is None + + # ============================================================================ # session_state — Streamlit-dependent functions (mock_session_state fixture) # ============================================================================ From 92f45a40ad9fc4315964adbb89df30d542a28b37 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 14:26:10 +0000 Subject: [PATCH 2/5] Rename modules/ -> plottle/ and move cli into the package Audit finding A-03 (Critical); decision TDEC-014. Closes the last of the hazards TDEC-008 identified back in April but which never landed on main. Before this change the built wheel's top_level.txt was: cli modules so `pip install plottle` claimed both `modules` and `cli` as top-level import names in site-packages. Any project with a local modules.py or cli.py -- or any other distribution claiming those names -- would collide, with import resolution silently depending on sys.path order. Publishing that to PyPI is irreversible. top_level.txt is now just `plottle`, and the console script resolves to plottle.cli:main so `py-modules = ["cli"]` is gone. Mechanical parts: - git mv modules plottle; all `from modules.*` / `import modules.*` rewritten, including quoted mock.patch targets, which a bulk import rewrite misses (the mediator repo's G-008 flags exactly this). - pyproject: include = ["plottle*"], per-file-ignores, coverage omit, and the dynamic version attr all repointed. - CI: ruff/mypy paths and --cov=plottle. - launch.bat / launch.command: streamlit run plottle/Home.py. Removed the repo-root __init__.py. It was not in the wheel and nothing imported it, but with the repo directory itself named `plottle`, a root __init__.py makes the checkout importable as a package named `plottle` that shadows the real one depending on sys.path order. Its version literal was already folded into plottle/__init__.py by the previous commit. CLI invocation follows the move: docs now use the `plottle` console script, with `python -m plottle.cli` for a source checkout. That command only exists if the package is actually installed, which the documented setup never did (A-36) -- so setup.command, setup.bat and the README now run `pip install -e ".[formats,nist]"` rather than `pip install -r requirements.txt`. Those two extras are new, and keep runtime parity with what requirements.txt used to install while leaving the dev toolchain out of a student's environment (A-37, A-41): `formats` = h5py/xarray/netcdf4, `nist` = requests. An `all` extra bundles both. 954 passed, 21 skipped. ruff check and ruff format clean on plottle/. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013YLgSnkyRUosy5sxWUb33P --- .github/workflows/tests.yml | 32 ++++---- README.md | 29 ++++--- __init__.py | 35 -------- docs/cheatsheet.md | 10 +-- docs/conf.py | 4 +- docs/tutorials/cli_guide.md | 30 +++---- examples/CLI_GUIDE.md | 80 +++++++++---------- examples/advanced_plotting_examples.py | 4 +- examples/calibration_workflow.py | 4 +- examples/curve_fitting_examples.py | 4 +- examples/data_pipeline_examples.py | 8 +- examples/io_examples.py | 4 +- examples/linear_algebra_examples.py | 4 +- examples/math_examples.py | 4 +- examples/multi_panel_examples.py | 2 +- examples/optimization_examples.py | 4 +- examples/plotly_interactive_examples.py | 2 +- examples/plotting_examples.py | 6 +- examples/publication_style_examples.py | 4 +- examples/seaborn_examples.py | 2 +- examples/spectroscopy_workflow.py | 4 +- examples/statistics_examples.py | 4 +- generate_gallery.py | 2 +- launch.bat | 2 +- launch.command | 2 +- {modules => plottle}/Home.py | 6 +- {modules => plottle}/__init__.py | 0 {modules => plottle}/annotations.py | 0 {modules => plottle}/batch.py | 6 +- cli.py => plottle/cli.py | 10 +-- {modules => plottle}/data_tools.py | 0 {modules => plottle}/io.py | 2 +- {modules => plottle}/math.py | 2 +- {modules => plottle}/molecular/__init__.py | 0 {modules => plottle}/molecular/atom_data.py | 0 {modules => plottle}/molecular/parsers.py | 0 {modules => plottle}/nist.py | 2 +- {modules => plottle}/pages/10_Spectroscopy.py | 6 +- .../pages/11_Molecular_Viz.py | 6 +- .../pages/12_Batch_Analysis.py | 6 +- {modules => plottle}/pages/13_Help.py | 2 +- {modules => plottle}/pages/14_Settings.py | 6 +- {modules => plottle}/pages/1_Data_Upload.py | 10 +-- {modules => plottle}/pages/2_Quick_Plot.py | 16 ++-- .../pages/3_Analysis_Tools.py | 10 +-- .../pages/4_Multi_Plot_Dashboard.py | 6 +- .../pages/5_Advanced_Plotting.py | 6 +- .../pages/7_Export_Results.py | 6 +- {modules => plottle}/pages/8_Gallery.py | 2 +- {modules => plottle}/pages/9_Data_Tools.py | 4 +- {modules => plottle}/pages/__init__.py | 0 {modules => plottle}/peaks.py | 0 {modules => plottle}/plotting.py | 2 +- {modules => plottle}/plugin_loader.py | 0 {modules => plottle}/report.py | 0 {modules => plottle}/signal.py | 0 {modules => plottle}/spectroscopy.py | 0 {modules => plottle}/utils/__init__.py | 0 {modules => plottle}/utils/data_preview.py | 2 +- {modules => plottle}/utils/plot_config.py | 0 {modules => plottle}/utils/session_state.py | 2 +- {modules => plottle}/utils/user_settings.py | 0 pyproject.toml | 35 +++++--- setup.bat | 2 +- setup.command | 2 +- tests/test_annotations.py | 4 +- tests/test_batch.py | 4 +- tests/test_cli.py | 6 +- tests/test_data_tools.py | 6 +- tests/test_integration.py | 6 +- tests/test_io.py | 2 +- tests/test_math.py | 6 +- tests/test_molecular_parsers.py | 6 +- tests/test_nist.py | 14 ++-- tests/test_peaks.py | 4 +- tests/test_plotting.py | 2 +- tests/test_plotting_advanced.py | 8 +- tests/test_plugin_loader.py | 4 +- tests/test_report.py | 4 +- tests/test_signal.py | 4 +- tests/test_spectroscopy.py | 2 +- tests/test_utils.py | 22 ++--- 82 files changed, 266 insertions(+), 283 deletions(-) delete mode 100644 __init__.py rename {modules => plottle}/Home.py (99%) rename {modules => plottle}/__init__.py (100%) rename {modules => plottle}/annotations.py (100%) rename {modules => plottle}/batch.py (99%) rename cli.py => plottle/cli.py (99%) rename {modules => plottle}/data_tools.py (100%) rename {modules => plottle}/io.py (99%) rename {modules => plottle}/math.py (99%) rename {modules => plottle}/molecular/__init__.py (100%) rename {modules => plottle}/molecular/atom_data.py (100%) rename {modules => plottle}/molecular/parsers.py (100%) rename {modules => plottle}/nist.py (99%) rename {modules => plottle}/pages/10_Spectroscopy.py (99%) rename {modules => plottle}/pages/11_Molecular_Viz.py (98%) rename {modules => plottle}/pages/12_Batch_Analysis.py (99%) rename {modules => plottle}/pages/13_Help.py (99%) rename {modules => plottle}/pages/14_Settings.py (98%) rename {modules => plottle}/pages/1_Data_Upload.py (98%) rename {modules => plottle}/pages/2_Quick_Plot.py (99%) rename {modules => plottle}/pages/3_Analysis_Tools.py (99%) rename {modules => plottle}/pages/4_Multi_Plot_Dashboard.py (99%) rename {modules => plottle}/pages/5_Advanced_Plotting.py (99%) rename {modules => plottle}/pages/7_Export_Results.py (99%) rename {modules => plottle}/pages/8_Gallery.py (99%) rename {modules => plottle}/pages/9_Data_Tools.py (99%) rename {modules => plottle}/pages/__init__.py (100%) rename {modules => plottle}/peaks.py (100%) rename {modules => plottle}/plotting.py (99%) rename {modules => plottle}/plugin_loader.py (100%) rename {modules => plottle}/report.py (100%) rename {modules => plottle}/signal.py (100%) rename {modules => plottle}/spectroscopy.py (100%) rename {modules => plottle}/utils/__init__.py (100%) rename {modules => plottle}/utils/data_preview.py (99%) rename {modules => plottle}/utils/plot_config.py (100%) rename {modules => plottle}/utils/session_state.py (99%) rename {modules => plottle}/utils/user_settings.py (100%) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index ea375df..2ce5441 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -22,27 +22,27 @@ jobs: run: pip install ruff mypy types-PyYAML types-requests - name: ruff check - run: ruff check modules/ cli.py __init__.py + run: ruff check plottle/ - name: ruff format check - run: ruff format --check modules/ cli.py __init__.py + run: ruff format --check plottle/ - name: mypy check run: | mypy \ - modules/io.py \ - modules/math.py \ - modules/plotting.py \ - modules/signal.py \ - modules/peaks.py \ - modules/data_tools.py \ - modules/annotations.py \ - modules/batch.py \ - modules/report.py \ - modules/plugin_loader.py \ - modules/spectroscopy.py \ - modules/nist.py \ - cli.py \ + plottle/io.py \ + plottle/math.py \ + plottle/plotting.py \ + plottle/signal.py \ + plottle/peaks.py \ + plottle/data_tools.py \ + plottle/annotations.py \ + plottle/batch.py \ + plottle/report.py \ + plottle/plugin_loader.py \ + plottle/spectroscopy.py \ + plottle/nist.py \ + plottle/cli.py \ --ignore-missing-imports --no-strict-optional --explicit-package-bases test: @@ -79,7 +79,7 @@ jobs: tests/test_report.py \ tests/test_plugin_loader.py \ tests/test_nist.py \ - --cov=modules \ + --cov=plottle \ --cov-report=xml \ --cov-report=term-missing \ -v diff --git a/README.md b/README.md index e783886..6cfcf26 100644 --- a/README.md +++ b/README.md @@ -48,23 +48,28 @@ python -m venv .venv # Windows .venv\Scripts\activate -pip install -r requirements.txt # macOS / Linux source .venv/bin/activate -pip install -r requirements.txt -streamlit run modules/Home.py +# Install Plottle and its dependencies. The editable install is what puts the +# `plottle` command on your PATH. +pip install -e ".[formats,nist]" + +streamlit run plottle/Home.py ``` #### 3 — Or use the CLI ```bash -python cli.py --help -python cli.py plot data.csv --plot scatter --x-column x --y-column y -python cli.py stats data.csv +plottle --help +plottle plot data.csv --plot scatter --x-column x --y-column y +plottle stats data.csv ``` +The `plottle` command comes from the `pip install` above. From a source checkout +without installing, use `python -m plottle.cli` instead. + ## GUI Pages | Page | Description | @@ -97,11 +102,11 @@ python cli.py stats data.csv Plottle includes a command-line interface with 5 subcommands: ```bash -python cli.py plot --plot --x-column X --y-column Y [--output out.png] -python cli.py stats -python cli.py batch [--verbose] -python cli.py compare --plot line [--output comparison.png] -python cli.py convert +plottle plot --plot --x-column X --y-column Y [--output out.png] +plottle stats +plottle batch [--verbose] +plottle compare --plot line [--output comparison.png] +plottle convert ``` See the [CLI Tutorial](docs/tutorials/cli_guide.md) for full usage and examples. @@ -198,7 +203,7 @@ plottle/ │ ├── molecular/ ← CPK atom data + vibrational parsers │ ├── pages/ ← 13 Streamlit pages (1_*.py – 14_*.py) │ └── utils/ ← session state, plot config, user settings -├── cli.py ← CLI entry point (5 subcommands) +├── plottle/cli.py ← CLI entry point (5 subcommands) ├── tests/ ← 17 test files, 900+ tests ├── plugins/ ← plugin_example.py starter template ├── examples/ ← 15+ standalone scripts + batch_config.json diff --git a/__init__.py b/__init__.py deleted file mode 100644 index 1a918f8..0000000 --- a/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -"""Plottle — Scientific Data Visualization and Analysis Toolkit. - -A unified Python toolkit for scientific data visualization and analysis, -developed at North Carolina Central University for research and teaching -in computational science. - -Modules -------- -modules.io : Data I/O — 18 formats (CSV, Excel, JCAMP, HDF5, NetCDF, mzML, …) -modules.math : Statistics, curve fitting, hypothesis testing, optimization -modules.plotting : 26 plot types across Matplotlib, Seaborn, and Plotly -modules.signal : Smoothing, filtering, FFT, baseline correction, interpolation -modules.peaks : Peak detection, integration, FWHM, single- and multi-peak fitting -modules.data_tools : Non-destructive DataFrame transforms (normalize, pivot, merge, …) -modules.annotations : Overlay annotations on Matplotlib figures -modules.spectroscopy : IR/Raman, UV-Vis, NMR, and mass spectrometry tools -modules.nist : NIST WebBook IR spectrum fetching by CAS number -modules.batch : Directory scanning, batch statistics, curve fit, and peak analysis -modules.report : PDF report generation via matplotlib PdfPages -modules.molecular : 3D molecular structure and vibrational mode visualization -modules.Home : 14-page Streamlit GUI entry point - -Examples --------- ->>> from modules.plotting import histogram ->>> from modules.io import load_data ->>> data = load_data('experiment.csv') ->>> fig, ax, info = histogram(data['value'], bins=30) -""" - -from modules import __version__ # noqa: F401 (re-exported for convenience) - -__author__ = "Jonathan D. Schultz, PhD — North Carolina Central University" -__all__ = ["modules"] diff --git a/docs/cheatsheet.md b/docs/cheatsheet.md index 67e929a..6960af5 100644 --- a/docs/cheatsheet.md +++ b/docs/cheatsheet.md @@ -189,19 +189,19 @@ fig.tight_layout() ```bash # Quick plot from CSV -python cli.py plot data.csv --type line --xcol time --ycol signal --output fig.png +plottle plot data.csv --type line --xcol time --ycol signal --output fig.png # Compute statistics -python cli.py stats data.csv --column signal +plottle stats data.csv --column signal # Batch processing from config -python cli.py batch config.json +plottle batch config.json # Convert file formats -python cli.py convert data.csv output.pkl +plottle convert data.csv output.pkl # Show examples -python cli.py --examples +plottle --examples ``` --- diff --git a/docs/conf.py b/docs/conf.py index 37d6df8..4ca9a77 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -3,7 +3,7 @@ import os import sys -# Point Sphinx to the repo root so autodoc can import modules.* +# Point Sphinx to the repo root so autodoc can import plottle.* sys.path.insert(0, os.path.abspath("..")) # -- Project information ------------------------------------------------------- @@ -13,7 +13,7 @@ author = "Jonathan D. Schultz, PhD" # Read the version from the package so it cannot drift from pyproject.toml. _version_ns: dict = {} -for _line in open(os.path.join("..", "modules", "__init__.py"), encoding="utf-8"): +for _line in open(os.path.join("..", "plottle", "__init__.py"), encoding="utf-8"): if _line.startswith("__version__"): exec(_line, _version_ns) # noqa: S102 -- a single literal assignment break diff --git a/docs/tutorials/cli_guide.md b/docs/tutorials/cli_guide.md index 301acee..372c2bd 100644 --- a/docs/tutorials/cli_guide.md +++ b/docs/tutorials/cli_guide.md @@ -15,7 +15,7 @@ Jupyter required — everything runs from a terminal. source .venv/bin/activate # Verify the CLI is available -python cli.py --help +plottle --help ``` --- @@ -27,7 +27,7 @@ The `plot` command reads a CSV (or any supported format) and produces a figure. ### Quickest example — scatter from CSV ```bash -python cli.py plot examples/data/experimental_data.csv \ +plottle plot examples/data/experimental_data.csv \ --plot scatter \ --x-column x \ --y-column y \ @@ -48,7 +48,7 @@ python cli.py plot examples/data/experimental_data.csv \ ### Publication-quality line plot ```bash -python cli.py plot examples/data/experimental_data.csv \ +plottle plot examples/data/experimental_data.csv \ --plot line \ --x-column wavelength \ --y-column absorbance \ @@ -62,7 +62,7 @@ python cli.py plot examples/data/experimental_data.csv \ ### Histogram of a single column ```bash -python cli.py plot examples/data/experimental_data.csv \ +plottle plot examples/data/experimental_data.csv \ --plot histogram \ --y-column signal \ --title "Signal Distribution" \ @@ -74,7 +74,7 @@ python cli.py plot examples/data/experimental_data.csv \ ## Command 2 — `stats`: Compute Summary Statistics ```bash -python cli.py stats examples/data/experimental_data.csv +plottle stats examples/data/experimental_data.csv ``` Output example: @@ -95,13 +95,13 @@ Statistics for experimental_data.csv ### Stats for a specific column ```bash -python cli.py stats examples/data/experimental_data.csv --column absorbance +plottle stats examples/data/experimental_data.csv --column absorbance ``` ### Normality test ```bash -python cli.py stats examples/data/experimental_data.csv --normality +plottle stats examples/data/experimental_data.csv --normality ``` --- @@ -112,16 +112,16 @@ Convert between any of the eight supported formats: ```bash # CSV → pickle (preserves dtypes) -python cli.py convert examples/data/experimental_data.csv output/data.pkl +plottle convert examples/data/experimental_data.csv output/data.pkl # CSV → NumPy binary -python cli.py convert examples/data/experimental_data.csv output/data.npy +plottle convert examples/data/experimental_data.csv output/data.npy # NumPy → CSV -python cli.py convert examples/data/auto_test.npy output/array.csv +plottle convert examples/data/auto_test.npy output/array.csv # Excel → Parquet (smaller, faster to load) -python cli.py convert examples/data/experimental_data.xlsx output/data.parquet +plottle convert examples/data/experimental_data.xlsx output/data.parquet ``` Supported extensions: `.csv`, `.xlsx`, `.tsv`, `.json`, `.npy`, `.npz`, `.pkl`, `.parquet` @@ -133,7 +133,7 @@ Supported extensions: `.csv`, `.xlsx`, `.tsv`, `.json`, `.npy`, `.npz`, `.pkl`, Compare two or more files on the same axes: ```bash -python cli.py compare \ +plottle compare \ examples/data/experimental_data.csv \ examples/data/md_analysis.csv \ --plot line \ @@ -146,7 +146,7 @@ Each file becomes a separate series. Labels default to the filenames; use `--lab override: ```bash -python cli.py compare file1.csv file2.csv \ +plottle compare file1.csv file2.csv \ --plot scatter \ --labels "Experiment A" "Experiment B" \ --output output/comparison.png @@ -188,9 +188,9 @@ For reproducible multi-plot workflows, define all jobs in a JSON config file. ### Running a batch job ```bash -python cli.py batch examples/batch_config.json +plottle batch examples/batch_config.json # With verbose output: -python cli.py batch examples/batch_config.json --verbose +plottle batch examples/batch_config.json --verbose ``` A full example config is at [examples/batch_config.json](../../examples/batch_config.json). diff --git a/examples/CLI_GUIDE.md b/examples/CLI_GUIDE.md index b9846b4..2e54a87 100644 --- a/examples/CLI_GUIDE.md +++ b/examples/CLI_GUIDE.md @@ -11,7 +11,7 @@ The CLI is included in the Plottle package. No additional installation is requir ## Basic Usage ```bash -python cli.py [OPTIONS] COMMAND [ARGS...] +plottle [OPTIONS] COMMAND [ARGS...] ``` ## Global Options @@ -30,7 +30,7 @@ Create various types of plots from data files. **Syntax:** ```bash -python cli.py plot --input FILE --type TYPE [OPTIONS] +plottle plot --input FILE --type TYPE [OPTIONS] ``` **Required Arguments:** @@ -72,25 +72,25 @@ python cli.py plot --input FILE --type TYPE [OPTIONS] ```bash # Simple histogram -python cli.py plot --input data.npy --type histogram --output hist.png +plottle plot --input data.npy --type histogram --output hist.png # Customized histogram -python cli.py plot --input data.csv --column Temperature --type histogram \ +plottle plot --input data.csv --column Temperature --type histogram \ --bins 50 --title "Temperature Distribution" \ --xlabel "Temperature (K)" --ylabel "Frequency" \ --output temp_dist.png # Line plot with styling -python cli.py plot --input timeseries.csv --type line \ +plottle plot --input timeseries.csv --type line \ --title "Time Series Data" --color blue --style "--" \ --marker o --output timeseries.png # Interactive plot -python cli.py plot --input data.npy --type interactive_histogram \ +plottle plot --input data.npy --type interactive_histogram \ --output interactive.html --bins 40 # Scatter plot with limits -python cli.py plot --input points.csv --type scatter \ +plottle plot --input points.csv --type scatter \ --xlim "0,10" --ylim "0,100" --output scatter.png ``` @@ -100,7 +100,7 @@ Calculate and display statistical summary of data. **Syntax:** ```bash -python cli.py stats --input FILE [OPTIONS] +plottle stats --input FILE [OPTIONS] ``` **Required Arguments:** @@ -121,16 +121,16 @@ python cli.py stats --input FILE [OPTIONS] ```bash # Basic statistics -python cli.py stats --input data.npy +plottle stats --input data.npy # Statistics for specific column -python cli.py stats --input data.csv --column Temperature +plottle stats --input data.csv --column Temperature # Statistics with normality test -python cli.py stats --input data.csv --column Values --normality +plottle stats --input data.csv --column Values --normality # Save statistics to file -python cli.py stats --input data.npy --output stats.json --normality +plottle stats --input data.npy --output stats.json --normality ``` ### 3. batch - Batch Processing @@ -139,7 +139,7 @@ Process multiple files using a configuration file. **Syntax:** ```bash -python cli.py batch --config FILE +plottle batch --config FILE ``` **Required Arguments:** @@ -195,10 +195,10 @@ tasks: ```bash # Run batch processing -python cli.py batch --config batch_config.json +plottle batch --config batch_config.json # Run with verbose output -python cli.py --verbose batch --config analysis_pipeline.yaml +plottle --verbose batch --config analysis_pipeline.yaml ``` ### 4. compare - Compare Datasets @@ -207,7 +207,7 @@ Compare multiple datasets on the same plot. **Syntax:** ```bash -python cli.py compare --inputs FILE1 FILE2 [FILE3...] [OPTIONS] +plottle compare --inputs FILE1 FILE2 [FILE3...] [OPTIONS] ``` **Required Arguments:** @@ -228,16 +228,16 @@ python cli.py compare --inputs FILE1 FILE2 [FILE3...] [OPTIONS] ```bash # Compare with histogram -python cli.py compare --inputs data1.csv data2.csv data3.csv \ +plottle compare --inputs data1.csv data2.csv data3.csv \ --type histogram --output comparison.png # Compare with labels -python cli.py compare --inputs trial1.npy trial2.npy trial3.npy \ +plottle compare --inputs trial1.npy trial2.npy trial3.npy \ --type line --labels "Trial 1" "Trial 2" "Trial 3" \ --title "Trial Comparison" --output trials.png # Compare specific column -python cli.py compare --inputs exp1.csv exp2.csv \ +plottle compare --inputs exp1.csv exp2.csv \ --column Temperature --type histogram --bins 40 \ --output temp_comparison.png ``` @@ -248,7 +248,7 @@ Convert data between different file formats. **Syntax:** ```bash -python cli.py convert --input FILE --output FILE +plottle convert --input FILE --output FILE ``` **Required Arguments:** @@ -269,13 +269,13 @@ python cli.py convert --input FILE --output FILE ```bash # Convert pickle to CSV -python cli.py convert --input data.pkl --output data.csv +plottle convert --input data.pkl --output data.csv # Convert NumPy to Excel -python cli.py convert --input arrays.npy --output data.xlsx +plottle convert --input arrays.npy --output data.xlsx # Convert CSV to Parquet -python cli.py convert --input large_data.csv --output large_data.parquet +plottle convert --input large_data.csv --output large_data.parquet ``` ## Advanced Usage @@ -285,7 +285,7 @@ python cli.py convert --input large_data.csv --output large_data.parquet Use `--verbose` before the command for detailed logging: ```bash -python cli.py --verbose plot --input data.npy --type histogram --output plot.png +plottle --verbose plot --input data.npy --type histogram --output plot.png ``` Output: @@ -300,7 +300,7 @@ Output: Use `--quiet` to suppress all non-error messages: ```bash -python cli.py --quiet batch --config large_pipeline.json +plottle --quiet batch --config large_pipeline.json ``` ### Chaining with Shell Commands @@ -310,12 +310,12 @@ Use CLI in shell pipelines: ```bash # Find all .npy files and create histograms for file in examples/data/*.npy; do - python cli.py plot --input "$file" --type histogram \ + plottle plot --input "$file" --type histogram \ --output "plots/$(basename "$file" .npy)_hist.png" done # Process with logging -python cli.py --verbose stats --input data.csv 2>&1 | tee analysis.log +plottle --verbose stats --input data.csv 2>&1 | tee analysis.log ``` ### Integration with Scripts @@ -329,14 +329,14 @@ Use the CLI from shell scripts: echo "Running analysis pipeline..." # Step 1: Generate plots -python cli.py plot --input raw_data.csv --type line --output plot1.png -python cli.py plot --input raw_data.csv --type histogram --output plot2.png +plottle plot --input raw_data.csv --type line --output plot1.png +plottle plot --input raw_data.csv --type histogram --output plot2.png # Step 2: Calculate statistics -python cli.py stats --input raw_data.csv --output stats.json --normality +plottle stats --input raw_data.csv --output stats.json --normality # Step 3: Compare with reference -python cli.py compare --inputs raw_data.csv reference.csv \ +plottle compare --inputs raw_data.csv reference.csv \ --type line --labels "Current" "Reference" --output comparison.png echo "Analysis complete!" @@ -353,12 +353,12 @@ The CLI provides clear error messages: **Invalid Arguments:** ``` -cli.py: error: argument --type: invalid choice: 'invalid_type' +plottle/cli.py: error: argument --type: invalid choice: 'invalid_type' ``` **Missing Required Arguments:** ``` -cli.py: error: the following arguments are required: --input +plottle/cli.py: error: the following arguments are required: --input ``` **Data Format Errors:** @@ -400,17 +400,17 @@ When running interactively: ```bash # General help -python cli.py --help +plottle --help # Command-specific help -python cli.py plot --help -python cli.py stats --help -python cli.py batch --help -python cli.py compare --help -python cli.py convert --help +plottle plot --help +plottle stats --help +plottle batch --help +plottle compare --help +plottle convert --help # Show examples -python cli.py --examples +plottle --examples ``` ## Troubleshooting diff --git a/examples/advanced_plotting_examples.py b/examples/advanced_plotting_examples.py index e06dc60..69f7715 100644 --- a/examples/advanced_plotting_examples.py +++ b/examples/advanced_plotting_examples.py @@ -12,14 +12,14 @@ import numpy as np import pandas as pd -# Add parent directory to path to import modules +# Add parent directory to path to import plottle sys.path.insert(0, str(Path(__file__).parent.parent)) # Set matplotlib to non-interactive backend import matplotlib matplotlib.use('Agg') -from modules.plotting import ( +from plottle.plotting import ( distribution_plot, box_plot, regression_plot, interactive_histogram, interactive_scatter, interactive_line, interactive_heatmap, interactive_3d_surface, diff --git a/examples/calibration_workflow.py b/examples/calibration_workflow.py index 43dd6f4..6dd8eba 100644 --- a/examples/calibration_workflow.py +++ b/examples/calibration_workflow.py @@ -18,8 +18,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import fit_linear -from modules.plotting import scatter_plot, apply_publication_style, save_figure +from plottle.math import fit_linear +from plottle.plotting import scatter_plot, apply_publication_style, save_figure OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/curve_fitting_examples.py b/examples/curve_fitting_examples.py index 56d7d2e..a35e272 100644 --- a/examples/curve_fitting_examples.py +++ b/examples/curve_fitting_examples.py @@ -16,8 +16,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import fit_linear, fit_polynomial, fit_exponential, fit_custom -from modules.plotting import scatter_plot, save_figure +from plottle.math import fit_linear, fit_polynomial, fit_exponential, fit_custom +from plottle.plotting import scatter_plot, save_figure OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/data_pipeline_examples.py b/examples/data_pipeline_examples.py index f637a1f..6191c18 100644 --- a/examples/data_pipeline_examples.py +++ b/examples/data_pipeline_examples.py @@ -1,7 +1,7 @@ """Examples for data I/O pipeline and format conversion. Demonstrates the full load → process → save pipeline using all 8 formats -supported by modules.io. +supported by plottle.io. Run from the repo root: python examples/data_pipeline_examples.py @@ -18,9 +18,9 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.io import load_data, save_data -from modules.math import calculate_statistics -from modules.plotting import histogram, save_figure +from plottle.io import load_data, save_data +from plottle.math import calculate_statistics +from plottle.plotting import histogram, save_figure OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/io_examples.py b/examples/io_examples.py index 06a6aa6..811f204 100644 --- a/examples/io_examples.py +++ b/examples/io_examples.py @@ -12,10 +12,10 @@ import numpy as np import pandas as pd -# Add parent directory to path to import modules +# Add parent directory to path to import plottle sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.io import ( +from plottle.io import ( load_pickle, save_pickle, load_numpy, save_numpy, load_dataframe, save_dataframe, diff --git a/examples/linear_algebra_examples.py b/examples/linear_algebra_examples.py index 06ce76e..2ecc34e 100644 --- a/examples/linear_algebra_examples.py +++ b/examples/linear_algebra_examples.py @@ -16,8 +16,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import compute_eigenvalues, solve_linear_system, matrix_decomposition -from modules.plotting import heatmap, save_figure +from plottle.math import compute_eigenvalues, solve_linear_system, matrix_decomposition +from plottle.plotting import heatmap, save_figure OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/math_examples.py b/examples/math_examples.py index ca7fc73..e764614 100644 --- a/examples/math_examples.py +++ b/examples/math_examples.py @@ -12,10 +12,10 @@ import numpy as np import pandas as pd -# Add parent directory to path to import modules +# Add parent directory to path to import plottle sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import ( +from plottle.math import ( # Statistics calculate_mean, calculate_median, calculate_std, calculate_statistics, # Distribution analysis diff --git a/examples/multi_panel_examples.py b/examples/multi_panel_examples.py index 6638357..11215ae 100644 --- a/examples/multi_panel_examples.py +++ b/examples/multi_panel_examples.py @@ -18,7 +18,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( save_figure, ) diff --git a/examples/optimization_examples.py b/examples/optimization_examples.py index 979a8d6..0176c86 100644 --- a/examples/optimization_examples.py +++ b/examples/optimization_examples.py @@ -15,8 +15,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import minimize_function, find_roots -from modules.plotting import line_plot, save_figure +from plottle.math import minimize_function, find_roots +from plottle.plotting import line_plot, save_figure OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/plotly_interactive_examples.py b/examples/plotly_interactive_examples.py index 8b78895..cbf566c 100644 --- a/examples/plotly_interactive_examples.py +++ b/examples/plotly_interactive_examples.py @@ -16,7 +16,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( interactive_histogram, interactive_scatter, interactive_line, diff --git a/examples/plotting_examples.py b/examples/plotting_examples.py index 862513d..2f7aa8c 100644 --- a/examples/plotting_examples.py +++ b/examples/plotting_examples.py @@ -14,10 +14,10 @@ matplotlib.use('Agg') # Use non-interactive backend import matplotlib.pyplot as plt -# Add parent directory to path to import modules +# Add parent directory to path to import plottle sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( # Figure management create_figure, configure_axes, save_figure, # Core plots @@ -473,7 +473,7 @@ def example_practical_workflow(): ) # Add linear fit line - from modules.math import fit_linear + from plottle.math import fit_linear fit_result = fit_linear(t_positive, log_C) y_fit = fit_result['slope'] * t_positive + fit_result['intercept'] ax2.plot(t_positive, y_fit, 'r-', linewidth=2, diff --git a/examples/publication_style_examples.py b/examples/publication_style_examples.py index 86b7d7f..43df0d7 100644 --- a/examples/publication_style_examples.py +++ b/examples/publication_style_examples.py @@ -17,7 +17,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( line_plot, scatter_plot, apply_publication_style, @@ -27,7 +27,7 @@ configure_axes, save_figure, ) -from modules.utils.plot_config import COLOR_PALETTE_NAMES +from plottle.utils.plot_config import COLOR_PALETTE_NAMES OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/seaborn_examples.py b/examples/seaborn_examples.py index 0819505..611ff2d 100644 --- a/examples/seaborn_examples.py +++ b/examples/seaborn_examples.py @@ -17,7 +17,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( distribution_plot, box_plot, regression_plot, diff --git a/examples/spectroscopy_workflow.py b/examples/spectroscopy_workflow.py index 9cbf58e..d56210d 100644 --- a/examples/spectroscopy_workflow.py +++ b/examples/spectroscopy_workflow.py @@ -16,8 +16,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import calculate_statistics -from modules.plotting import line_plot, apply_publication_style, save_figure, get_color_palette +from plottle.math import calculate_statistics +from plottle.plotting import line_plot, apply_publication_style, save_figure, get_color_palette OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/examples/statistics_examples.py b/examples/statistics_examples.py index 6289834..7fa1074 100644 --- a/examples/statistics_examples.py +++ b/examples/statistics_examples.py @@ -16,8 +16,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import calculate_statistics, check_normality -from modules.plotting import histogram, save_figure +from plottle.math import calculate_statistics, check_normality +from plottle.plotting import histogram, save_figure OUTPUT_DIR = Path(__file__).parent / "plots" OUTPUT_DIR.mkdir(exist_ok=True) diff --git a/generate_gallery.py b/generate_gallery.py index 09a3749..f1d9ee9 100644 --- a/generate_gallery.py +++ b/generate_gallery.py @@ -39,7 +39,7 @@ sys.path.insert(0, str(_ROOT)) -from modules.plotting import ( # noqa: E402 +from plottle.plotting import ( # noqa: E402 histogram, line_plot, scatter_plot, diff --git a/launch.bat b/launch.bat index 23683cc..c28e658 100644 --- a/launch.bat +++ b/launch.bat @@ -10,5 +10,5 @@ if not exist .venv ( ) call .venv\Scripts\activate.bat -streamlit run modules/Home.py +streamlit run plottle/Home.py pause diff --git a/launch.command b/launch.command index 2b325f2..20d0a14 100644 --- a/launch.command +++ b/launch.command @@ -13,5 +13,5 @@ if [ ! -d ".venv" ]; then fi source .venv/bin/activate -streamlit run modules/Home.py +streamlit run plottle/Home.py read -r -p "Press Enter to close..." diff --git a/modules/Home.py b/plottle/Home.py similarity index 99% rename from modules/Home.py rename to plottle/Home.py index 873e066..ab0b9c3 100644 --- a/modules/Home.py +++ b/plottle/Home.py @@ -25,7 +25,7 @@ Usage ----- - streamlit run modules/Home.py + streamlit run plottle/Home.py """ import base64 @@ -42,8 +42,8 @@ _NCCU_HORIZ = _ASSETS_DIR / "nccu-horiz-logo.png" _NCCU_WINGS = _ASSETS_DIR / "nccu-wings.png" -from modules import __version__ # noqa: E402 -from modules.utils import initialize_session_state, get_session_summary # noqa: E402 +from plottle import __version__ # noqa: E402 +from plottle.utils import initialize_session_state, get_session_summary # noqa: E402 try: from PIL import Image as _PILImage diff --git a/modules/__init__.py b/plottle/__init__.py similarity index 100% rename from modules/__init__.py rename to plottle/__init__.py diff --git a/modules/annotations.py b/plottle/annotations.py similarity index 100% rename from modules/annotations.py rename to plottle/annotations.py diff --git a/modules/batch.py b/plottle/batch.py similarity index 99% rename from modules/batch.py rename to plottle/batch.py index 8839346..eac60ad 100644 --- a/modules/batch.py +++ b/plottle/batch.py @@ -29,14 +29,14 @@ import numpy as np import pandas as pd -from modules.io import load_data -from modules.math import ( +from plottle.io import load_data +from plottle.math import ( calculate_statistics, fit_exponential, fit_linear, fit_polynomial, ) -from modules.peaks import compute_fwhm, find_peaks +from plottle.peaks import compute_fwhm, find_peaks # ── Constants ───────────────────────────────────────────────────────────────── diff --git a/cli.py b/plottle/cli.py similarity index 99% rename from cli.py rename to plottle/cli.py index af0956c..5ae3db3 100644 --- a/cli.py +++ b/plottle/cli.py @@ -44,10 +44,10 @@ import pandas as pd # Import module functions -from modules import __version__ -from modules.io import load_data, save_data -from modules.math import calculate_statistics, check_normality -from modules.plotting import ( +from plottle import __version__ +from plottle.io import load_data, save_data +from plottle.math import calculate_statistics, check_normality +from plottle.plotting import ( histogram, line_plot, scatter_plot, @@ -58,7 +58,7 @@ # Optional imports for advanced plotting try: - from modules.plotting import ( + from plottle.plotting import ( distribution_plot, box_plot, regression_plot, diff --git a/modules/data_tools.py b/plottle/data_tools.py similarity index 100% rename from modules/data_tools.py rename to plottle/data_tools.py diff --git a/modules/io.py b/plottle/io.py similarity index 99% rename from modules/io.py rename to plottle/io.py index 6f4c6ee..596eaff 100644 --- a/modules/io.py +++ b/plottle/io.py @@ -16,7 +16,7 @@ Examples -------- ->>> from modules.io import load_data, save_data +>>> from plottle.io import load_data, save_data >>> data = load_data('experiment.pkl') >>> save_data(processed_data, 'results.pkl') >>> spectrum = load_data('spectrum.jdx') # returns pd.DataFrame diff --git a/modules/math.py b/plottle/math.py similarity index 99% rename from modules/math.py rename to plottle/math.py index ab2788c..31c66db 100644 --- a/modules/math.py +++ b/plottle/math.py @@ -13,7 +13,7 @@ Examples -------- ->>> from modules.math import calculate_mean, fit_polynomial +>>> from plottle.math import calculate_mean, fit_polynomial >>> mean_value = calculate_mean(data) >>> coefficients = fit_polynomial(x, y, degree=2) """ diff --git a/modules/molecular/__init__.py b/plottle/molecular/__init__.py similarity index 100% rename from modules/molecular/__init__.py rename to plottle/molecular/__init__.py diff --git a/modules/molecular/atom_data.py b/plottle/molecular/atom_data.py similarity index 100% rename from modules/molecular/atom_data.py rename to plottle/molecular/atom_data.py diff --git a/modules/molecular/parsers.py b/plottle/molecular/parsers.py similarity index 100% rename from modules/molecular/parsers.py rename to plottle/molecular/parsers.py diff --git a/modules/nist.py b/plottle/nist.py similarity index 99% rename from modules/nist.py rename to plottle/nist.py index fd20e42..a59e047 100644 --- a/modules/nist.py +++ b/plottle/nist.py @@ -160,7 +160,7 @@ def fetch_ir_spectrum(cas_or_id: str, index: int = 0) -> Any: "requests is required for NIST WebBook access. Install it with: pip install requests" ) from exc - from modules.io import load_jcamp + from plottle.io import load_jcamp url = get_ir_jcamp_url(cas_or_id, index) resp = requests.get(url, timeout=15) diff --git a/modules/pages/10_Spectroscopy.py b/plottle/pages/10_Spectroscopy.py similarity index 99% rename from modules/pages/10_Spectroscopy.py rename to plottle/pages/10_Spectroscopy.py index 8272ac1..a4587b5 100644 --- a/modules/pages/10_Spectroscopy.py +++ b/plottle/pages/10_Spectroscopy.py @@ -13,8 +13,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils.session_state import initialize_session_state, add_dataset -from modules.spectroscopy import ( +from plottle.utils.session_state import initialize_session_state, add_dataset +from plottle.spectroscopy import ( absorbance_to_transmittance, apply_line_broadening, assign_bands, @@ -289,7 +289,7 @@ def _save(result_df: pd.DataFrame, suffix: str) -> None: key="nist_idx", help="0 = first available IR spectrum", ) - from modules.nist import fetch_ir_spectrum as _nist_fetch, get_compound_url as _nist_url + from plottle.nist import fetch_ir_spectrum as _nist_fetch, get_compound_url as _nist_url nist_page_url = _nist_url(nist_cas) if nist_cas.strip() else "" if nist_page_url: diff --git a/modules/pages/11_Molecular_Viz.py b/plottle/pages/11_Molecular_Viz.py similarity index 98% rename from modules/pages/11_Molecular_Viz.py rename to plottle/pages/11_Molecular_Viz.py index f0c571d..7d4d78d 100644 --- a/modules/pages/11_Molecular_Viz.py +++ b/plottle/pages/11_Molecular_Viz.py @@ -15,8 +15,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils.session_state import initialize_session_state -from modules.molecular import ( +from plottle.utils.session_state import initialize_session_state +from plottle.molecular import ( VibrationalData, build_molecule_figure, parse_vibrations, @@ -210,7 +210,7 @@ # Atom coordinates table # ───────────────────────────────────────────────────────────────────────────── with st.expander("Atomic Coordinates", expanded=False): - from modules.molecular.atom_data import get_atom_symbol + from plottle.molecular.atom_data import get_atom_symbol coord_df = pd.DataFrame( { diff --git a/modules/pages/12_Batch_Analysis.py b/plottle/pages/12_Batch_Analysis.py similarity index 99% rename from modules/pages/12_Batch_Analysis.py rename to plottle/pages/12_Batch_Analysis.py index dc25355..7280c0a 100644 --- a/modules/pages/12_Batch_Analysis.py +++ b/plottle/pages/12_Batch_Analysis.py @@ -14,13 +14,13 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils.session_state import initialize_session_state -from modules.batch import ( +from plottle.utils.session_state import initialize_session_state +from plottle.batch import ( batch_statistics, batch_curve_fit, batch_peak_analysis, ) -from modules.utils.user_settings import ( +from plottle.utils.user_settings import ( list_workflows, save_workflow, load_workflow, diff --git a/modules/pages/13_Help.py b/plottle/pages/13_Help.py similarity index 99% rename from modules/pages/13_Help.py rename to plottle/pages/13_Help.py index 35bd1ab..4711ada 100644 --- a/modules/pages/13_Help.py +++ b/plottle/pages/13_Help.py @@ -6,7 +6,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils.session_state import initialize_session_state +from plottle.utils.session_state import initialize_session_state initialize_session_state() diff --git a/modules/pages/14_Settings.py b/plottle/pages/14_Settings.py similarity index 98% rename from modules/pages/14_Settings.py rename to plottle/pages/14_Settings.py index aa5980e..4c91db6 100644 --- a/modules/pages/14_Settings.py +++ b/plottle/pages/14_Settings.py @@ -27,8 +27,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils import initialize_session_state -from modules.utils.user_settings import ( +from plottle.utils import initialize_session_state +from plottle.utils.user_settings import ( get_config_path, get_defaults, save_defaults, @@ -37,7 +37,7 @@ load_preset, delete_preset, ) -from modules.utils.plot_config import COLOR_PALETTE_NAMES, _FONT_OPTIONS +from plottle.utils.plot_config import COLOR_PALETTE_NAMES, _FONT_OPTIONS initialize_session_state() diff --git a/modules/pages/1_Data_Upload.py b/plottle/pages/1_Data_Upload.py similarity index 98% rename from modules/pages/1_Data_Upload.py rename to plottle/pages/1_Data_Upload.py index 7ab391a..b32267d 100644 --- a/modules/pages/1_Data_Upload.py +++ b/plottle/pages/1_Data_Upload.py @@ -83,9 +83,9 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.io import load_data # noqa: E402 -from modules.math import calculate_statistics, check_normality # noqa: E402 -from modules.utils import ( # noqa: E402 +from plottle.io import load_data # noqa: E402 +from plottle.math import calculate_statistics, check_normality # noqa: E402 +from plottle.utils import ( # noqa: E402 initialize_session_state, add_dataset, get_dataset, @@ -94,8 +94,8 @@ display_dataset_card, display_data_preview, ) -from modules.batch import scan_directory, batch_load_files # noqa: E402 -from modules.io import downsample_for_preview # noqa: E402 +from plottle.batch import scan_directory, batch_load_files # noqa: E402 +from plottle.io import downsample_for_preview # noqa: E402 _LARGE_FILE_BYTES = 50 * 1024 * 1024 # 50 MB — warn above this _PREVIEW_MAX_ROWS = 10_000 # downsample preview above this diff --git a/modules/pages/2_Quick_Plot.py b/plottle/pages/2_Quick_Plot.py similarity index 99% rename from modules/pages/2_Quick_Plot.py rename to plottle/pages/2_Quick_Plot.py index 9030e80..ddaa013 100644 --- a/modules/pages/2_Quick_Plot.py +++ b/plottle/pages/2_Quick_Plot.py @@ -2,7 +2,7 @@ Select a loaded dataset, choose a plot type, configure parameters, and generate a publication-ready or interactive visualization. -All 13 plot types from modules.plotting are accessible here. +All 13 plot types from plottle.plotting are accessible here. """ import traceback @@ -15,7 +15,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( histogram, line_plot, scatter_plot, @@ -44,7 +44,7 @@ interactive_ternary, inset_plot, ) -from modules.utils import ( +from plottle.utils import ( initialize_session_state, get_dataset, add_plot_to_history, @@ -57,7 +57,7 @@ ) import matplotlib as mpl -from modules.utils.plot_config import ( +from plottle.utils.plot_config import ( PLOT_TYPES, COLOR_PALETTES, get_plot_config_widgets, @@ -956,7 +956,7 @@ def _regen_with_overlays() -> None: _apply_mpl_style(fig, cfg) overlays = st.session_state.get("qp_ann_overlays", []) if overlays and fig.axes: - from modules.annotations import apply_annotations + from plottle.annotations import apply_annotations apply_annotations(fig.axes[0], overlays) st.session_state.qp_mpl_fig = fig @@ -971,7 +971,7 @@ def _annotation_input_widgets(ann_type: str) -> dict | None: All widget keys are prefixed with ``ann_new_`` to avoid collision with other widgets on the page. """ - from modules.annotations import ANNOTATION_COLORS, ANNOTATION_LINESTYLES + from plottle.annotations import ANNOTATION_COLORS, ANNOTATION_LINESTYLES color = st.selectbox( "Color", @@ -1106,7 +1106,7 @@ def _annotation_input_widgets(ann_type: str) -> dict | None: def _render_annotation_panel() -> None: """Render the full annotations expander panel for the current matplotlib figure.""" - from modules.annotations import describe_overlay + from plottle.annotations import describe_overlay overlays: list = st.session_state.qp_ann_overlays @@ -1394,7 +1394,7 @@ def _apply_preset_to_widgets(settings: dict) -> None: # Re-apply any existing overlays to the fresh figure _overlays = st.session_state.get("qp_ann_overlays", []) if _overlays and fig.axes: - from modules.annotations import apply_annotations + from plottle.annotations import apply_annotations apply_annotations(fig.axes[0], _overlays) st.session_state.qp_fig_dict = None diff --git a/modules/pages/3_Analysis_Tools.py b/plottle/pages/3_Analysis_Tools.py similarity index 99% rename from modules/pages/3_Analysis_Tools.py rename to plottle/pages/3_Analysis_Tools.py index fc3a092..2b87449 100644 --- a/modules/pages/3_Analysis_Tools.py +++ b/plottle/pages/3_Analysis_Tools.py @@ -1,7 +1,7 @@ """Analysis Tools Page. Statistical analysis, curve fitting, optimization, and linear algebra -operations on loaded datasets, using functions from modules.math. +operations on loaded datasets, using functions from plottle.math. Tabs ---- @@ -21,13 +21,13 @@ import pandas as pd import matplotlib.pyplot as plt import plotly.graph_objects as go -from modules.peaks import ( +from plottle.peaks import ( find_peaks as pk_find_peaks, integrate_peaks, compute_fwhm, fit_multipeak, ) -from modules.signal import ( +from plottle.signal import ( smooth_moving_average, smooth_savitzky_golay, smooth_gaussian, @@ -45,7 +45,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.math import ( +from plottle.math import ( calculate_statistics, check_normality, fit_distribution, @@ -72,7 +72,7 @@ spearman_correlation, chi_square_independence, ) -from modules.utils import ( +from plottle.utils import ( initialize_session_state, get_dataset, add_analysis_result, diff --git a/modules/pages/4_Multi_Plot_Dashboard.py b/plottle/pages/4_Multi_Plot_Dashboard.py similarity index 99% rename from modules/pages/4_Multi_Plot_Dashboard.py rename to plottle/pages/4_Multi_Plot_Dashboard.py index c7a97a5..cf2f0c9 100644 --- a/modules/pages/4_Multi_Plot_Dashboard.py +++ b/plottle/pages/4_Multi_Plot_Dashboard.py @@ -15,7 +15,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( histogram, line_plot, scatter_plot, @@ -30,12 +30,12 @@ interactive_heatmap, interactive_3d_surface, ) -from modules.utils import ( +from plottle.utils import ( initialize_session_state, get_dataset, get_session_summary, ) -from modules.utils.plot_config import PLOT_TYPES +from plottle.utils.plot_config import PLOT_TYPES initialize_session_state() diff --git a/modules/pages/5_Advanced_Plotting.py b/plottle/pages/5_Advanced_Plotting.py similarity index 99% rename from modules/pages/5_Advanced_Plotting.py rename to plottle/pages/5_Advanced_Plotting.py index 56aed6a..81abbd6 100644 --- a/modules/pages/5_Advanced_Plotting.py +++ b/plottle/pages/5_Advanced_Plotting.py @@ -1,6 +1,6 @@ """Advanced Plotting Page. -Provides visualizations that go beyond the 13 core modules.plotting functions +Provides visualizations that go beyond the 13 core plottle.plotting functions by using seaborn, plotly.graph_objects, and matplotlib directly. Tabs @@ -25,14 +25,14 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( interactive_histogram, interactive_scatter, interactive_line, interactive_heatmap, interactive_3d_surface, ) -from modules.utils import ( +from plottle.utils import ( initialize_session_state, get_dataset, get_session_summary, diff --git a/modules/pages/7_Export_Results.py b/plottle/pages/7_Export_Results.py similarity index 99% rename from modules/pages/7_Export_Results.py rename to plottle/pages/7_Export_Results.py index 8e45bac..98b9590 100644 --- a/modules/pages/7_Export_Results.py +++ b/plottle/pages/7_Export_Results.py @@ -22,8 +22,8 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils import initialize_session_state -from modules.utils.session_state import ( +from plottle.utils import initialize_session_state +from plottle.utils.session_state import ( get_current_dataset, get_session_summary, save_session_to_file, @@ -281,7 +281,7 @@ def _make_serializable(obj): # Import report generator lazily to avoid hard dependency at module load try: - from modules.report import generate_pdf_report as _gen_pdf + from plottle.report import generate_pdf_report as _gen_pdf _report_available = True except ImportError: diff --git a/modules/pages/8_Gallery.py b/plottle/pages/8_Gallery.py similarity index 99% rename from modules/pages/8_Gallery.py rename to plottle/pages/8_Gallery.py index 7c967d9..2ee0bcc 100644 --- a/modules/pages/8_Gallery.py +++ b/plottle/pages/8_Gallery.py @@ -25,7 +25,7 @@ sys.path.insert(0, str(_APP_ROOT)) -from modules.utils import initialize_session_state +from plottle.utils import initialize_session_state initialize_session_state() diff --git a/modules/pages/9_Data_Tools.py b/plottle/pages/9_Data_Tools.py similarity index 99% rename from modules/pages/9_Data_Tools.py rename to plottle/pages/9_Data_Tools.py index 7ed790b..08bf1f9 100644 --- a/modules/pages/9_Data_Tools.py +++ b/plottle/pages/9_Data_Tools.py @@ -16,11 +16,11 @@ sys.path.insert(0, str(Path(__file__).parent.parent.parent)) -from modules.utils.session_state import ( +from plottle.utils.session_state import ( initialize_session_state, add_dataset, ) -from modules.data_tools import ( +from plottle.data_tools import ( add_formula_column, normalize_column, transpose_dataframe, diff --git a/modules/pages/__init__.py b/plottle/pages/__init__.py similarity index 100% rename from modules/pages/__init__.py rename to plottle/pages/__init__.py diff --git a/modules/peaks.py b/plottle/peaks.py similarity index 100% rename from modules/peaks.py rename to plottle/peaks.py diff --git a/modules/plotting.py b/plottle/plotting.py similarity index 99% rename from modules/plotting.py rename to plottle/plotting.py index d0fa51f..9cfb661 100644 --- a/modules/plotting.py +++ b/plottle/plotting.py @@ -6,7 +6,7 @@ Examples -------- ->>> from modules.plotting import line_plot, histogram, save_figure +>>> from plottle.plotting import line_plot, histogram, save_figure >>> fig, ax = line_plot(x, y, xlabel='Time (s)', ylabel='Temperature (K)') >>> save_figure(fig, 'output.png', dpi=300) """ diff --git a/modules/plugin_loader.py b/plottle/plugin_loader.py similarity index 100% rename from modules/plugin_loader.py rename to plottle/plugin_loader.py diff --git a/modules/report.py b/plottle/report.py similarity index 100% rename from modules/report.py rename to plottle/report.py diff --git a/modules/signal.py b/plottle/signal.py similarity index 100% rename from modules/signal.py rename to plottle/signal.py diff --git a/modules/spectroscopy.py b/plottle/spectroscopy.py similarity index 100% rename from modules/spectroscopy.py rename to plottle/spectroscopy.py diff --git a/modules/utils/__init__.py b/plottle/utils/__init__.py similarity index 100% rename from modules/utils/__init__.py rename to plottle/utils/__init__.py diff --git a/modules/utils/data_preview.py b/plottle/utils/data_preview.py similarity index 99% rename from modules/utils/data_preview.py rename to plottle/utils/data_preview.py index 29f5873..6869f38 100644 --- a/modules/utils/data_preview.py +++ b/plottle/utils/data_preview.py @@ -22,7 +22,7 @@ -------- >>> import streamlit as st >>> import pandas as pd ->>> from modules.utils.data_preview import preview_dataframe, get_dataframe_info +>>> from plottle.utils.data_preview import preview_dataframe, get_dataframe_info >>> df = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]}) >>> info = get_dataframe_info(df) >>> st.write(info) diff --git a/modules/utils/plot_config.py b/plottle/utils/plot_config.py similarity index 100% rename from modules/utils/plot_config.py rename to plottle/utils/plot_config.py diff --git a/modules/utils/session_state.py b/plottle/utils/session_state.py similarity index 99% rename from modules/utils/session_state.py rename to plottle/utils/session_state.py index eb31ff6..d3a0ef3 100644 --- a/modules/utils/session_state.py +++ b/plottle/utils/session_state.py @@ -31,7 +31,7 @@ Examples -------- >>> import streamlit as st ->>> from modules.utils.session_state import initialize_session_state, add_dataset +>>> from plottle.utils.session_state import initialize_session_state, add_dataset >>> initialize_session_state() >>> data = np.array([1, 2, 3, 4, 5]) >>> add_dataset('test_data.npy', data) diff --git a/modules/utils/user_settings.py b/plottle/utils/user_settings.py similarity index 100% rename from modules/utils/user_settings.py rename to plottle/utils/user_settings.py diff --git a/pyproject.toml b/pyproject.toml index 0bcbdd9..e8efe8b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,18 @@ dependencies = [ ] [project.optional-dependencies] +# Optional instrument/scientific formats the GUI advertises. Installed by the +# setup scripts so a student gets the documented 18 formats. See audit A-37. +formats = [ + "h5py>=3.0.0", + "xarray>=0.20.0", + "netcdf4>=1.6.0", +] +# NIST WebBook IR fetching (plottle.nist). Imported lazily with a helpful +# message, so it is genuinely optional rather than a hard dependency. +nist = [ + "requests>=2.28.0", +] docs = [ "sphinx>=7.0.0", "furo>=2024.1.29", @@ -55,9 +67,13 @@ dev = [ "build>=1.0.0", "twine>=5.0.0", ] +# Everything a user (not a contributor) might want, in one extra. +all = [ + "plottle[formats,nist]", +] [project.scripts] -plottle = "cli:main" +plottle = "plottle.cli:main" [project.urls] Homepage = "https://github.com/The-Schultz-Lab/plottle" @@ -66,16 +82,13 @@ Documentation = "https://nccu-schultz-lab.github.io/plottle/" "Bug Tracker" = "https://github.com/The-Schultz-Lab/plottle/issues" Changelog = "https://github.com/The-Schultz-Lab/plottle/blob/main/CHANGELOG.md" -[tool.setuptools] -py-modules = ["cli"] - -# Single source of truth: modules/__init__.py. See audit A-26. +# Single source of truth: plottle/__init__.py. See audit A-26. [tool.setuptools.dynamic] -version = {attr = "modules.__version__"} +version = {attr = "plottle.__version__"} [tool.setuptools.packages.find] where = ["."] -include = ["modules*"] +include = ["plottle*"] [tool.ruff] line-length = 100 @@ -86,8 +99,8 @@ select = ["E", "F", "W"] ignore = [] [tool.ruff.lint.per-file-ignores] -"modules/pages/*.py" = ["E402"] -"modules/Home.py" = ["E402"] +"plottle/pages/*.py" = ["E402"] +"plottle/Home.py" = ["E402"] [tool.black] line-length = 100 @@ -101,8 +114,8 @@ explicit_package_bases = true [tool.coverage.run] omit = [ - "modules/Home.py", - "modules/pages/*", + "plottle/Home.py", + "plottle/pages/*", ] [tool.pytest.ini_options] diff --git a/setup.bat b/setup.bat index ed00b5a..171f995 100644 --- a/setup.bat +++ b/setup.bat @@ -36,7 +36,7 @@ echo Installing dependencies (this may take a few minutes on first run)... echo. call .venv\Scripts\activate.bat -pip install -r requirements.txt +pip install -e ".[formats,nist]" if errorlevel 1 ( echo. diff --git a/setup.command b/setup.command index f798dc2..133c028 100644 --- a/setup.command +++ b/setup.command @@ -38,7 +38,7 @@ echo "Installing dependencies (this may take a few minutes on first run)..." echo source .venv/bin/activate -pip install -r requirements.txt +pip install -e ".[formats,nist]" if [ $? -ne 0 ]; then echo diff --git a/tests/test_annotations.py b/tests/test_annotations.py index 56c2c95..2f0e81e 100644 --- a/tests/test_annotations.py +++ b/tests/test_annotations.py @@ -1,4 +1,4 @@ -"""Tests for modules/annotations.py (M16).""" +"""Tests for plottle/annotations.py (M16).""" import pytest import matplotlib @@ -6,7 +6,7 @@ matplotlib.use("Agg") # headless backend for CI -from modules.annotations import apply_annotations, describe_overlay, ANNOTATION_COLORS +from plottle.annotations import apply_annotations, describe_overlay, ANNOTATION_COLORS # ── Fixtures ────────────────────────────────────────────────────────────────── diff --git a/tests/test_batch.py b/tests/test_batch.py index 749f5ce..75fef95 100644 --- a/tests/test_batch.py +++ b/tests/test_batch.py @@ -1,4 +1,4 @@ -"""Tests for modules/batch.py. +"""Tests for plottle/batch.py. Covers scan_directory, batch_load_files, batch_statistics, batch_curve_fit, and batch_peak_analysis. No mocking — all tests operate on real data @@ -14,7 +14,7 @@ import pandas as pd import pytest -from modules.batch import ( +from plottle.batch import ( scan_directory, batch_load_files, batch_statistics, diff --git a/tests/test_cli.py b/tests/test_cli.py index 2aa040c..e418d0a 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -53,7 +53,7 @@ def run_cli(*args): # have the project's dependencies installed, and every one of these tests # fails with ModuleNotFoundError. See G-016 / audit A-11a. repo_root = Path(__file__).resolve().parent.parent - cmd = [sys.executable, str(repo_root / 'cli.py')] + list(args) + cmd = [sys.executable, '-m', 'plottle.cli'] + list(args) result = subprocess.run( cmd, cwd=repo_root, @@ -81,11 +81,11 @@ def test_help_message(self): def test_version(self): """Test that --version reports the packaged version. - Asserts against ``modules.__version__`` rather than a hardcoded string: + Asserts against ``plottle.__version__`` rather than a hardcoded string: this test previously asserted '1.0.0' and went stale unnoticed because CI never ran tests/test_cli.py. See audit A-11 / A-26. """ - from modules import __version__ + from plottle import __version__ result = run_cli('--version') assert result.returncode == 0 diff --git a/tests/test_data_tools.py b/tests/test_data_tools.py index e9c710b..f730b67 100644 --- a/tests/test_data_tools.py +++ b/tests/test_data_tools.py @@ -1,4 +1,4 @@ -"""Tests for modules/data_tools.py. +"""Tests for plottle/data_tools.py. Coverage targets all 12 public functions and their key error paths. """ @@ -9,7 +9,7 @@ import pandas as pd import pytest -from modules.data_tools import ( +from plottle.data_tools import ( add_formula_column, drop_nan, fill_nan, @@ -202,7 +202,7 @@ def test_module_does_not_call_builtin_eval(self): # Guards against the old implementation being reintroduced. import inspect - import modules.data_tools as dt + import plottle.data_tools as dt source = inspect.getsource(dt.add_formula_column) assert "eval(" not in source or "_safe_eval(" in source diff --git a/tests/test_integration.py b/tests/test_integration.py index d0396ba..4cb38d9 100644 --- a/tests/test_integration.py +++ b/tests/test_integration.py @@ -24,18 +24,18 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.io import ( +from plottle.io import ( save_pickle, load_pickle, save_numpy, load_numpy, save_dataframe, load_dataframe, save_data, load_data, ) -from modules.math import ( +from plottle.math import ( calculate_statistics, fit_linear, fit_polynomial, ) -from modules.plotting import ( +from plottle.plotting import ( histogram, line_plot, scatter_plot, diff --git a/tests/test_io.py b/tests/test_io.py index 7053220..aee4dad 100644 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -19,7 +19,7 @@ import sys sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.io import ( +from plottle.io import ( load_pickle, save_pickle, load_numpy, diff --git a/tests/test_math.py b/tests/test_math.py index 04b9536..3e4fe79 100644 --- a/tests/test_math.py +++ b/tests/test_math.py @@ -15,7 +15,7 @@ # Import functions to test sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.math import ( +from plottle.math import ( # Statistics calculate_mean, calculate_median, calculate_std, calculate_statistics, # Distribution analysis @@ -275,7 +275,7 @@ def test_fit_exponential_convergence_failure(self): x = np.linspace(0, 1, 10) y = np.ones(10) - with patch('modules.math.optimize.curve_fit', side_effect=RuntimeError("did not converge")): + with patch('plottle.math.optimize.curve_fit', side_effect=RuntimeError("did not converge")): with pytest.raises(RuntimeError, match="Exponential fit failed"): fit_exponential(x, y) @@ -326,7 +326,7 @@ def linear(x, a, b): x = np.linspace(0, 1, 10) y = x - with patch('modules.math.optimize.curve_fit', side_effect=RuntimeError("did not converge")): + with patch('plottle.math.optimize.curve_fit', side_effect=RuntimeError("did not converge")): with pytest.raises(RuntimeError, match="Custom fit failed"): fit_custom(x, y, linear, p0=[1, 0]) diff --git a/tests/test_molecular_parsers.py b/tests/test_molecular_parsers.py index 7a61d62..6c5edfc 100644 --- a/tests/test_molecular_parsers.py +++ b/tests/test_molecular_parsers.py @@ -1,4 +1,4 @@ -"""Tests for modules/molecular/parsers.py and modules/molecular/atom_data.py.""" +"""Tests for plottle/molecular/parsers.py and plottle/molecular/atom_data.py.""" import os import sys @@ -9,7 +9,7 @@ import pytest sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.molecular.parsers import ( +from plottle.molecular.parsers import ( VibrationalData, VibrationalMode, build_molecule_figure, @@ -19,7 +19,7 @@ parse_orca_vibrations, parse_vibrations, ) -from modules.molecular.atom_data import ( +from plottle.molecular.atom_data import ( BOHR_TO_ANGSTROM, atom_colors, atom_symbols, diff --git a/tests/test_nist.py b/tests/test_nist.py index 795ed6e..329bb2e 100644 --- a/tests/test_nist.py +++ b/tests/test_nist.py @@ -1,4 +1,4 @@ -"""Tests for modules/nist.py — NIST WebBook integration.""" +"""Tests for plottle/nist.py — NIST WebBook integration.""" import pytest import pandas as pd @@ -8,7 +8,7 @@ sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.nist import ( +from plottle.nist import ( get_compound_url, get_ir_jcamp_url, search_url, @@ -97,7 +97,7 @@ def _mock_response(self, text, status=200): mock.text = text return mock - @patch("modules.io.load_jcamp", return_value=_FAKE_DF.copy()) + @patch("plottle.io.load_jcamp", return_value=_FAKE_DF.copy()) @patch("requests.get") def test_basic(self, mock_get, mock_jcamp): mock_get.return_value = self._mock_response(_FAKE_JCAMP) @@ -107,7 +107,7 @@ def test_basic(self, mock_get, mock_jcamp): assert len(df) > 0 assert df.attrs.get("nist_cas") == "64-17-5" - @patch("modules.io.load_jcamp", return_value=_FAKE_DF.copy()) + @patch("plottle.io.load_jcamp", return_value=_FAKE_DF.copy()) @patch("requests.get") def test_attrs_set(self, mock_get, mock_jcamp): mock_get.return_value = self._mock_response(_FAKE_JCAMP) @@ -127,21 +127,21 @@ def test_no_spectrum(self, mock_get): with pytest.raises(RuntimeError, match="No IR spectrum found"): fetch_ir_spectrum("99-99-9") - @patch("modules.io.load_jcamp", return_value=_FAKE_DF.copy()) + @patch("plottle.io.load_jcamp", return_value=_FAKE_DF.copy()) @patch("requests.get") def test_returns_dataframe(self, mock_get, mock_jcamp): mock_get.return_value = self._mock_response(_FAKE_JCAMP) df = fetch_ir_spectrum("64-17-5") assert isinstance(df, pd.DataFrame) - @patch("modules.io.load_jcamp", return_value=_FAKE_DF.copy()) + @patch("plottle.io.load_jcamp", return_value=_FAKE_DF.copy()) @patch("requests.get") def test_nist_url_attr_contains_cas(self, mock_get, mock_jcamp): mock_get.return_value = self._mock_response(_FAKE_JCAMP) df = fetch_ir_spectrum("64-17-5") assert "64-17-5" in df.attrs["nist_url"] - @patch("modules.io.load_jcamp", return_value=_FAKE_DF.copy()) + @patch("plottle.io.load_jcamp", return_value=_FAKE_DF.copy()) @patch("requests.get") def test_index_passed_to_url(self, mock_get, mock_jcamp): mock_get.return_value = self._mock_response(_FAKE_JCAMP) diff --git a/tests/test_peaks.py b/tests/test_peaks.py index 9921ce0..c2932ba 100644 --- a/tests/test_peaks.py +++ b/tests/test_peaks.py @@ -1,11 +1,11 @@ -"""Unit tests for modules/peaks.py — Peak Analysis module.""" +"""Unit tests for plottle/peaks.py — Peak Analysis module.""" from __future__ import annotations import numpy as np import pytest -from modules.peaks import ( +from plottle.peaks import ( compute_fwhm, find_peaks, fit_multipeak, diff --git a/tests/test_plotting.py b/tests/test_plotting.py index 80aef40..33f4230 100644 --- a/tests/test_plotting.py +++ b/tests/test_plotting.py @@ -19,7 +19,7 @@ # Import functions to test sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( # Figure management create_figure, configure_axes, save_figure, # Core plots diff --git a/tests/test_plotting_advanced.py b/tests/test_plotting_advanced.py index 218e026..940a523 100644 --- a/tests/test_plotting_advanced.py +++ b/tests/test_plotting_advanced.py @@ -19,7 +19,7 @@ import sys sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plotting import ( +from plottle.plotting import ( distribution_plot, box_plot, regression_plot, interactive_histogram, interactive_scatter, interactive_line, interactive_heatmap, interactive_3d_surface, @@ -519,7 +519,7 @@ def test_selected_vars(self): def test_no_seaborn_raises(self): """ImportError raised when seaborn unavailable (mock HAS_SEABORN).""" - import modules.plotting as mp + import plottle.plotting as mp orig = mp.HAS_SEABORN mp.HAS_SEABORN = False try: @@ -558,7 +558,7 @@ def test_with_size(self): def test_no_plotly_raises(self): """ImportError raised when plotly unavailable (mock HAS_PLOTLY).""" - import modules.plotting as mp + import plottle.plotting as mp orig = mp.HAS_PLOTLY mp.HAS_PLOTLY = False try: @@ -604,7 +604,7 @@ def test_custom_labels(self): assert info["n_points"] == 1 def test_no_plotly_raises(self): - import modules.plotting as mp + import plottle.plotting as mp orig = mp.HAS_PLOTLY mp.HAS_PLOTLY = False with pytest.raises(ImportError): diff --git a/tests/test_plugin_loader.py b/tests/test_plugin_loader.py index 96e858c..74ae0ec 100644 --- a/tests/test_plugin_loader.py +++ b/tests/test_plugin_loader.py @@ -1,4 +1,4 @@ -"""Tests for modules/plugin_loader.py.""" +"""Tests for plottle/plugin_loader.py.""" import sys import types @@ -9,7 +9,7 @@ # Ensure the project root is on the path sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.plugin_loader import ( +from plottle.plugin_loader import ( discover_plugins, get_plugin_analysis_tools, get_plugin_plot_types, diff --git a/tests/test_report.py b/tests/test_report.py index 47e9249..083798f 100644 --- a/tests/test_report.py +++ b/tests/test_report.py @@ -1,4 +1,4 @@ -"""Tests for modules/report.py — PDF report generator.""" +"""Tests for plottle/report.py — PDF report generator.""" from __future__ import annotations @@ -11,7 +11,7 @@ import pytest from pathlib import Path -from modules.report import ( +from plottle.report import ( _analysis_result_to_figure, _dataframe_to_figure, _make_title_page, diff --git a/tests/test_signal.py b/tests/test_signal.py index 1776697..1ee4f95 100644 --- a/tests/test_signal.py +++ b/tests/test_signal.py @@ -1,11 +1,11 @@ -"""Unit tests for modules/signal.py — Signal Processing module.""" +"""Unit tests for plottle/signal.py — Signal Processing module.""" from __future__ import annotations import numpy as np import pytest -from modules.signal import ( +from plottle.signal import ( baseline_als, baseline_polynomial, baseline_rolling_ball, diff --git a/tests/test_spectroscopy.py b/tests/test_spectroscopy.py index 77421db..38176b0 100644 --- a/tests/test_spectroscopy.py +++ b/tests/test_spectroscopy.py @@ -5,7 +5,7 @@ import pytest sys.path.insert(0, str(Path(__file__).parent.parent)) -from modules.spectroscopy import ( +from plottle.spectroscopy import ( FUNCTIONAL_GROUPS, absorbance_to_transmittance, apply_line_broadening, diff --git a/tests/test_utils.py b/tests/test_utils.py index b4c921c..ff1d7ce 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,10 +1,10 @@ """Unit tests for the utils modules. Covers: -- modules.utils.user_settings — config.json CRUD operations -- modules.utils.plot_config — get_plot_kwargs, COLOR_PALETTES, PLOT_TYPES -- modules.utils.session_state — dataset management, serialization, save/load -- modules.utils.data_preview — pure info helpers and Streamlit display helpers +- plottle.utils.user_settings — config.json CRUD operations +- plottle.utils.plot_config — get_plot_kwargs, COLOR_PALETTES, PLOT_TYPES +- plottle.utils.session_state — dataset management, serialization, save/load +- plottle.utils.data_preview — pure info helpers and Streamlit display helpers """ import json @@ -20,23 +20,23 @@ import sys sys.path.insert(0, str(Path(__file__).parent.parent)) -import modules.utils.user_settings as us -import modules.utils.session_state as _ss -import modules.utils.data_preview as _dp -from modules.utils.plot_config import ( +import plottle.utils.user_settings as us +import plottle.utils.session_state as _ss +import plottle.utils.data_preview as _dp +from plottle.utils.plot_config import ( COLOR_PALETTES, COLOR_PALETTE_NAMES, PLOT_TYPES, get_plot_kwargs, ) -from modules.utils.session_state import ( +from plottle.utils.session_state import ( _serialize_data, _deserialize_data, initialize_session_state, add_dataset, get_current_dataset, get_dataset, delete_dataset, add_plot_to_history, clear_plot_history, add_analysis_result, save_session_to_file, load_session_from_file, clear_session, get_session_summary, ) -from modules.utils.data_preview import ( +from plottle.utils.data_preview import ( preview_dataframe, get_dataframe_info, get_array_info, format_data_size, get_column_suggestions, get_plottable_arrays, display_dataset_card, display_data_preview, @@ -691,7 +691,7 @@ class TestSessionDeserializationIsSafe: """ def test_session_state_module_does_not_import_pickle(self): - import modules.utils.session_state as ss + import plottle.utils.session_state as ss assert not hasattr(ss, 'pickle'), ( 'session_state must not import pickle — it is reachable from an upload' From e9a17aef91764f19d946682e3715649de139b5ce Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 14:32:34 +0000 Subject: [PATCH 3/5] Ship runtime assets inside the package Audit finding A-09; mediator G-012. The built wheel previously contained no data files at all -- its only non-Python entries were dist-info metadata. logo.png, logo.ico, assets/, example-data/ and docs/gallery/ all lived at the repository root, outside the package, so packages.find never saw them. Because Home.py guards every asset with .exists(), nothing crashed; a pip-installed GUI simply came up with no logo, no NCCU branding, a warning on the Data Upload examples tab, and an empty Gallery. Running from a source checkout hid all of it from the developer. Moved into the package and declared via [tool.setuptools.package-data]: logo.png, logo.ico, assets/nccu-*.png -> plottle/assets/ example-data/Artificial/ -> plottle/example-data/Artificial/ docs/gallery/*.png + manifest.json -> plottle/gallery/ Paths in Home.py, 1_Data_Upload.py and 8_Gallery.py now resolve relative to the package directory rather than the repo root, and generate_gallery.py writes to the new location. Moving the gallery PNGs out of docs/ costs the Pages site nothing -- docs/index.html contains no tags and never referenced them. generate_examples.py moves from inside the data directory to the repo root alongside generate_gallery.py, so the package holds only shipped code and data. Its output path and the Data Upload page's hint were updated to match. Verified per G-012 -- built the wheel, installed it into a clean venv, and resolved every asset from /tmp with the repo nowhere on sys.path: 29 data files present, all 13 gallery PNGs match the manifest, and the `plottle` console script reports 2.0.1. Not addressed here: .streamlit/config.toml still only works from a source checkout, because Streamlit reads it from the working directory rather than from the package. That is the same root cause as A-17/A-18 (theme handling) and is fixed there, not by packaging. 954 passed, 21 skipped. ruff check and ruff format clean. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013YLgSnkyRUosy5sxWUb33P --- README.md | 23 +++--- docs/gallery/box_plot.png | Bin 14386 -> 0 bytes docs/gallery/contour_plot.png | Bin 24599 -> 0 bytes docs/gallery/distribution_plot.png | Bin 26079 -> 0 bytes docs/gallery/heatmap.png | Bin 16023 -> 0 bytes docs/gallery/histogram.png | Bin 15626 -> 0 bytes docs/gallery/interactive_3d_surface.png | Bin 6336 -> 0 bytes docs/gallery/interactive_heatmap.png | Bin 6180 -> 0 bytes docs/gallery/interactive_histogram.png | Bin 6221 -> 0 bytes docs/gallery/interactive_line.png | Bin 5726 -> 0 bytes docs/gallery/interactive_scatter.png | Bin 5847 -> 0 bytes docs/gallery/line_plot.png | Bin 45141 -> 0 bytes docs/gallery/regression_plot.png | Bin 54713 -> 0 bytes docs/gallery/scatter_plot.png | Bin 38822 -> 0 bytes ...nerate_examples.py => generate_examples.py | 3 +- generate_gallery.py | 8 +-- plottle/Home.py | 8 ++- logo.ico => plottle/assets/logo.ico | Bin logo.png => plottle/assets/logo.png | Bin .../assets}/nccu-horiz-logo.png | Bin {assets => plottle/assets}/nccu-wings.png | Bin .../Artificial/bimodal_distribution.csv | 0 .../Artificial/correlation_matrix.npy | Bin .../Artificial/gaussian_surface.npy | Bin 28928 -> 28928 bytes .../Artificial/grouped_categorical.csv | 0 .../example-data}/Artificial/ir_spectrum.csv | 0 .../Artificial/molecular_properties.csv | 0 .../Artificial/normal_distribution.csv | 0 .../Artificial/reaction_kinetics.csv | 0 .../Artificial/scatter_correlation.csv | 0 .../Artificial/sine_cosine_waves.csv | 68 +++++++++--------- plottle/gallery/box_plot.png | Bin 0 -> 15941 bytes plottle/gallery/contour_plot.png | Bin 0 -> 27932 bytes plottle/gallery/distribution_plot.png | Bin 0 -> 28556 bytes plottle/gallery/heatmap.png | Bin 0 -> 17607 bytes plottle/gallery/histogram.png | Bin 0 -> 19093 bytes plottle/gallery/interactive_3d_surface.png | Bin 0 -> 7263 bytes plottle/gallery/interactive_heatmap.png | Bin 0 -> 6881 bytes plottle/gallery/interactive_histogram.png | Bin 0 -> 7286 bytes plottle/gallery/interactive_line.png | Bin 0 -> 6403 bytes plottle/gallery/interactive_scatter.png | Bin 0 -> 6656 bytes plottle/gallery/line_plot.png | Bin 0 -> 48283 bytes {docs => plottle}/gallery/manifest.json | 0 plottle/gallery/regression_plot.png | Bin 0 -> 60898 bytes plottle/gallery/scatter_plot.png | Bin 0 -> 43074 bytes plottle/pages/1_Data_Upload.py | 9 +-- plottle/pages/8_Gallery.py | 6 +- pyproject.toml | 13 ++++ 48 files changed, 82 insertions(+), 56 deletions(-) delete mode 100644 docs/gallery/box_plot.png delete mode 100644 docs/gallery/contour_plot.png delete mode 100644 docs/gallery/distribution_plot.png delete mode 100644 docs/gallery/heatmap.png delete mode 100644 docs/gallery/histogram.png delete mode 100644 docs/gallery/interactive_3d_surface.png delete mode 100644 docs/gallery/interactive_heatmap.png delete mode 100644 docs/gallery/interactive_histogram.png delete mode 100644 docs/gallery/interactive_line.png delete mode 100644 docs/gallery/interactive_scatter.png delete mode 100644 docs/gallery/line_plot.png delete mode 100644 docs/gallery/regression_plot.png delete mode 100644 docs/gallery/scatter_plot.png rename example-data/Artificial/generate_examples.py => generate_examples.py (97%) rename logo.ico => plottle/assets/logo.ico (100%) rename logo.png => plottle/assets/logo.png (100%) rename {assets => plottle/assets}/nccu-horiz-logo.png (100%) rename {assets => plottle/assets}/nccu-wings.png (100%) rename {example-data => plottle/example-data}/Artificial/bimodal_distribution.csv (100%) rename {example-data => plottle/example-data}/Artificial/correlation_matrix.npy (100%) rename {example-data => plottle/example-data}/Artificial/gaussian_surface.npy (71%) rename {example-data => plottle/example-data}/Artificial/grouped_categorical.csv (100%) rename {example-data => plottle/example-data}/Artificial/ir_spectrum.csv (100%) rename {example-data => plottle/example-data}/Artificial/molecular_properties.csv (100%) rename {example-data => plottle/example-data}/Artificial/normal_distribution.csv (100%) rename {example-data => plottle/example-data}/Artificial/reaction_kinetics.csv (100%) rename {example-data => plottle/example-data}/Artificial/scatter_correlation.csv (100%) rename {example-data => plottle/example-data}/Artificial/sine_cosine_waves.csv (91%) create mode 100644 plottle/gallery/box_plot.png create mode 100644 plottle/gallery/contour_plot.png create mode 100644 plottle/gallery/distribution_plot.png create mode 100644 plottle/gallery/heatmap.png create mode 100644 plottle/gallery/histogram.png create mode 100644 plottle/gallery/interactive_3d_surface.png create mode 100644 plottle/gallery/interactive_heatmap.png create mode 100644 plottle/gallery/interactive_histogram.png create mode 100644 plottle/gallery/interactive_line.png create mode 100644 plottle/gallery/interactive_scatter.png create mode 100644 plottle/gallery/line_plot.png rename {docs => plottle}/gallery/manifest.json (100%) create mode 100644 plottle/gallery/regression_plot.png create mode 100644 plottle/gallery/scatter_plot.png diff --git a/README.md b/README.md index 6cfcf26..c91699c 100644 --- a/README.md +++ b/README.md @@ -185,12 +185,13 @@ See [`requirements.txt`](requirements.txt) for pinned version ranges. ## Project Structure ```text -plottle/ -├── modules/ +plottle/ ← repository root +├── plottle/ ← the installable package │ ├── Home.py ← Streamlit entry point +│ ├── cli.py ← CLI entry point (5 subcommands) │ ├── io.py ← 18-format data loader/saver │ ├── math.py ← 25 analysis functions -│ ├── plotting.py ← 26 plot types (Matplotlib, Seaborn, Plotly) +│ ├── plotting.py ← 27 plot types (Matplotlib, Seaborn, Plotly) │ ├── signal.py ← 16 signal processing functions │ ├── peaks.py ← 5 peak analysis functions │ ├── data_tools.py ← 12 non-destructive DataFrame operations @@ -202,20 +203,24 @@ plottle/ │ ├── plugin_loader.py ← plugin discovery and loading │ ├── molecular/ ← CPK atom data + vibrational parsers │ ├── pages/ ← 13 Streamlit pages (1_*.py – 14_*.py) -│ └── utils/ ← session state, plot config, user settings -├── plottle/cli.py ← CLI entry point (5 subcommands) -├── tests/ ← 17 test files, 900+ tests +│ ├── utils/ ← session state, plot config, user settings +│ ├── assets/ ← logo + NCCU branding (shipped in the wheel) +│ ├── gallery/ ← pre-rendered gallery PNGs + manifest.json +│ └── example-data/Artificial/ ← built-in sample datasets +├── tests/ ← 17 test files, 950+ tests ├── plugins/ ← plugin_example.py starter template ├── examples/ ← 15+ standalone scripts + batch_config.json -├── notebooks/ ← 4 Jupyter tutorials (Binder-ready) -├── docs/ ← tutorials, gallery, cheatsheet -├── example-data/ ← generated sample datasets +├── docs/ ← tutorials, cheatsheet, Sphinx sources +├── generate_gallery.py ← regenerates plottle/gallery/ ├── requirements.txt ├── pyproject.toml ├── setup.bat / setup.command ← First-run setup (Windows / macOS — double-click) └── launch.bat / launch.command ← App launcher (Windows / macOS — double-click) ``` +Runtime assets (`assets/`, `gallery/`, `example-data/`) live **inside** the package +rather than at the repository root, so they are present after `pip install`. + ## Documentation - [Getting Started](docs/getting_started.md) — installation walkthrough and API examples diff --git a/docs/gallery/box_plot.png b/docs/gallery/box_plot.png deleted file mode 100644 index a8aecd94bc7f419dc92c5f2aae726d5ee4c937b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14386 zcmdUWWmr^wyYC_uG z(nHO;=Xu`!o_+TF?tPt4=eo`ZuV+0l%&ax*|Nq^;T7gOm(&VJHqzD9p{ISd<6$FCd z5dOV6MGQaby&h2u{}FVQ)O1v}F?Mu$Zf}H;f9_~&Y2#>V_JYaT$lk%s#+sXh>n;cX z9VSypM_UI$PEMceTeX=Y#BDqk>d|>rogCI^H|EeGvg^=U;V>~@B#reH zO+g@h->Ki}I}PU}8Rkog@FhI8hd}WA{@)(foxX2BBNG@D6cIwlccmAz?X>SMq99Ry zypJixMKH^4jFq{pjhAxr^Syg=(sPnu*JGuG`i4noauQ}o#A8P$PrKyC)vFTTxFeSi zCyr2hfonFkN2NDdSmgS@s%1V3Jg@TU0g>5g`L|IY+|kB}O)W#O+rf00*z&K>OngF9 zbry^MyJy#5P2YX~gIeFjEcP@ENJ>kOysmXx z8y`C{njR*4`(Xe@yPdZ4%COqx5*fnndH^MTwtAj+bE<^j%Z@~W7$LQhQmaThn`&kA zfm~Kau_H&6)1J>UHha`#twsf@FA^9M5-l5j`|*57(kxs*yAmx0gW!$pQtu0P*|Z8X zZZI=9Z+43LJV`NuSM-$G805UYrS>)IzQw>3YIf}l1)Xsw$*kFl_CYUSzMOGAiZ$>y zOZk&uwc4`jHP@cNLPmY(16zLiHS{y&mhejvAMI*nqsZ>4gH=LuPNfrOxS}_LO04E| z@7D{N6~^*m9PZwSS@H?S^O|xxTZxN*1RWQcT4UH-cj-m`{G@WOu5g&2t2|mR>MUJ4 zUBhAC9?#R0E=|cs-gBSj=FJv=8vR?y>J8afy=3&9g|y;lg*Te6Q&+E6Zz`A#6=t5f zB0OlH&28NF!G5-77OR~%Z!=z9ak$m1Xn(YgmaBhDp7;4+HrAl@*};%Wik5FHlKmC& z-5PAy?m%iDAA-lc@79)y*#xR4iqk;}? zP@&a=p6GnNs^R@YqgLXljXxV2w4B}(&$lP=wf+pGTG{v7U(BZd5GEyORqQTBxRV*H zPg`I$+Y%iS5pm6B!mI4(&!2-OU54g5L?Sk{gWLN{qWhxz$3%}gZAU#3uYcztQ5(^> zlz+s2_%PWkmiOslz}%q8&v)lat>D7rFvR4vGr@s@fATcHU3)fBTzuc4#Jt~=UAwqR zHyhcD#@HRg?S6@=bX@!`1Y2@$e;b27fQ4f;Ld~h4XtNLN+U z(sHN}HC$q0l8=Ke<(VlLyTi=FLP9?cuic2|G#K9v^Etdeu`9Gzy}5kkygItb_Sx%T zhbW_cZQNt6#1J;`?M{d2{_z?Qhuo1$ryNdE(Q%i>%-A`1>%yg>qHIn&>rX{_zJa?+;(RBH4IAJ?Z@U#y^pab9+q9H5}{V^ z)5@9^42`u4IShrw!tx1OTo!iTo}ShHt@F}0v{BL=AQzsWF(4gq~G@pQCM!I`S}Tw8eIPf(^>7 z5lu&$x37irbbHlHdXkWU@zm8k^frmVKN-yxr*83c)*R)NCoFVQx5xJdP`G0cvKPY? z5_DO!^SMPGEtWGHO2f}=1`D1Km?}+ZjGSG-{+Ta4n&%eNDYg9OOqHXaS9qS>%7V-1 z*i$H`)Nh?+{m?Y2dfb*>znXvZt#p-vzBhK3;J{3~WNO?nOynj2c~QcR8i79Nvvq+F z(nXlw-2Y$^j^zE_^J3EQlNy2f_EJCfo1z{jT}^lTycbOf% zl1IZ#%3?r1rn%*awraLE&Hbe0Q^xxiM2F0dP%$#5*9F;$y3?FRkgN&OO-Cjd8HNSD+i%~K5)jPu$J6c=S{rP%A&#DH-FytZLyz4+^1x;JeQ!+(5`}B&jt^A5k7_FSeRwalWuGgd9lGABxRKgwDQxICYZ-CUV z@!Xv6>@33!ydos=+#PdCLAq}*4e%7`*SMohQoIIshb@p7D|N<08H7A*Ja%`~@^y!3 z=;$yOJsFS1X$ueL5^R>8fDvr0Ow`tPO}woSpghQW689T3_${52i>te`GMY`J!{s{> z&7M>!{pGF|`Oe;2+>y=1m+WNolp^EycoeL>kuo^Y?QCs{X7i%acm3pawQpr#u-2$G z2Fp<~a~>o0c@6zljZG(3ho*XTz{qK}Vt#nXW!#Mgy&CT>il6eB@z3Z|@1y;JXj^o? z9+3j4ZFSmK%H*gZ!nPYAIj_HZK%OzrRJ4c3YPe5Iv2Q7CbZPCCtvG|I?{wP33G*?h z=fRuT{RglXwO%Xk(go7|=@g9OpUfDlC`ziV#{?~mkVmT}M3r))*cmE|OW3{XFr9kI z%E7Cn${CcYUB!FaIx80G_pI)JK58qON|19bU`#TVW?Ae0dIl#OxcEF3x>?Y1)Eam4+9^d{Hk(O7H)*Mp$H!J< zmHqd!h~ge3_@>stzh^pA-RlmZ_FkC)&c%bpY+=O<8 z0M7D+C;~yj^w$ahr$g;U!a6P)Ma9@Kv13hY4&7T-&MOgkCIy5m6Zo6T*Qcx486Kq1&eMAFOAEHF_Hl#Yeuj59&yKA9Pu}&~|C$>&9W6^^hYa!B@^I0Ebs<@-@hm zy=W0q`=TMJEfFQUwAr05J+d>9r{kc1PJJPU1mU0RwzTF5G-*6Y9-6EFdsu62lN`CKS`lI@xMpILyg zH-<8>PqN&&Ap@8v5PM3eZwkMH{?iTl>+n>9FRoWntQk1hoe)}{h=m1H0YGDiF`M5% z169hb^;m(_-nSf7nrn-TG-PDxDKx0{<`r|Qu%FG)DYGtg!VFNYv%=a^d``7q3&RV$ zUQan&+^Z0YCrFi@K<;MW(pi51VAaO+TVSA(9D0?5&uFw3cZkTSo5(n;nPAR`!y9SI z4a4?NNmV37h`R=EFj$E%P%SrwUsuT;oY-Xq^eA=9tUXw*^7UHk&taKQa!Ib<9?*%y za8$29_yRnjElCKS%xQoc9cWJxGr$um%>79gX67OCdNmC_waNR7>mLQ#VnP%0BA-8c z{r>%#%Cl}K(Jgf43ghADUe)^e2dX}gtluR$NY|?Mu7QO_DR9DhcXiBaJ(!S$V$h)- ziy;>uu*=<+lE@)F0kLI&Ys=j{xgb$8%Q%jg?y|lkUj{uxabKy zKIozsapXYIQdmCqIg?IPdP?>zKvkcvP?Er=TGkN7b2RIUZ@&AHkQ}};qo{?!c%G5b z#z{2Xk?-@gx3nySdd6?tq zl7whllP>|`OxLG}8z3Pz`DO_kt}X8(@21pq8_^zD9xQLK?^oj`CICa*QL&o$P6tV) z!Op%90--w<=ZhrJBN=sr5kokjn84efmEM<%EUvAYn=6?`rIfDXmU56YATLFx7Ksr| z^l#+Dk5OI+_o~{DHd;9cw7vJY7IzLAaeD#%Mj`Y9DlnytoQ&9YN{gS>+Rw^rRXUo@ z**V@#-dP!un?QNtfrt0nM9uCv8%(iM$CY88mnk5}l}G^$%|R-ZgH!q*Ht_1`^apLX@rMTo9bqIzf*>L} zy1*dlDD&dQi`VXLuwh##zx(;QKS7AEf2enPKQ3-LT+G_nj6ftln^~{dRG#@ra^})A zfx|!3jdFl$e%_t{6xU!P{2QA@$^((O7@>XPev)X4A~6O1Eq!qsZ5KC=$<8=#>D5}C zHx{e{W-cz}{hbwy&Z08@6cLZoQP72jFs;8Rr@tNb+8yi3R!sSjNhdz_+O%cKDMDG0 z<4{rOTj9?7_OGX>T^e>X{RK~-x~fQYc#%!L36wC0i2K$D=__tOU!#b(YmfKkl3jlX zwjIT=>)h0^Z>R6b zt{1+zE*(nGipS*UNS2XJSeQD>@pIz=XD(k;`}*|THVCuS`({0l^j)WjJjM%+38-bXrQzh`h9Uq;iqoXV6!0Gx`^dwe~Bl?gAV$W(bGH!V2!p=M`2WxohhpOa$ zc8YgpE=W%48oX$Y70Jpx8oQMV_6 zrfl>^Vy=|Vj!F9zpY^Eb@9Ak~@WZaX^3fiJyT$DmD!n?YSFQd%8Fl&9Jgr*rr|@;~ z7$SJBh6j1s-O<*rz1fPCuIcfTeI#o|9-52Q@`4P{90bwcws8+pkP>VB^}3rc#$MmTVHNfSBWC=-pIWA~p-3V@!$YexZ$-kRq9 zUzw*H!(vOVMq2P5BOR~h2Ql2CD#aDyTVK9>DTE>7w$&}o%+4;aU1rU0HC!CtpQAy- zl8Hd1E;#Jrzst+q#xgK0?8o#g?2U9f#BiP!*trDu1;vkdzw4vHfizUS3TCezfzS8X zME-)dy1I#H7)1{?drl${uivZh!|x``2~nj3YyCN~H*VgPeemG*)YqWPohuVv^<- z0Q+7XBzbN$Z>(0WQ5(e*JmSx5`9tc%6UTQ?FfduL?38j{SZHWzs`p9>x&<#2TW2xP zglP}A$!eWfv_}-tvA2}3H8r1{JkMD&a_R0fUwT2uCSqnb{c6|Gk%T9a(Z`Qjl3qT< zEHMddM@?irrlK?61rw&w{~7F%MnZ2XskgH;wb(g2v%!K-;f1O z4W8FfuA6paR)xD&oB_D(7F}hIiz;zqKBz>uxj4xL*xRHs*|vX;DZ54nd$gX*P`W63 zn}gN14juRBejVnW`>-G`M#nlF&sNEO4OCPjhz?;IWqj@-Lx{hECD}|H8^$0sAoaHY zQdZc$E*j&kaiKi=7_3qAyv^O^Aw$3A>a89*;QeE|Rj!V!qXL7AClRSi_eqd7ty^|& zAGvrFFd*eEjWzPJ29k{{@k*iOX)>D`5VVnz<;y4 z$B?9@7%)tPV0ud6gLhWX)qp(BjYf&7gP;6BD(nh7%=mDCFd@5Fr1b02&N^MFy~^c@ z+KFFX6X5I~)xzH7wNn7p59TOAATC@p7Wt=i{ zvs_HEH94R}4miA;7q`+RgL8RM9oV$77LTok=K>xYuaE4A0I{pZ{oL*C3-M0U32(rd zNY%@|?3DjRWyyUAsj>_gec+a=2h>`iIV@i0>-{OdDCPuN)guH$o=Wyld3pKh^USh? zb$0tWh>+Cr+h0-m&l{d)2Z>h>d;Sc+d!wlqG&~LBqqMnM`kLRBJKT=AwDc0OZrh$&l-)~2QpX?HCK?$F(N4vwWt zsihWOzhbsXo2dL6*#B0>Vl~R$e+agCIG%(e5PKt|6%JN{y5w_^)HHF4tU`>mjIDOt z%&>ofS=x^@j0d0k(PbHPaT;GGH}9!@KG*?b<{vS9Mf z90J|7VLXd8L+2-DWMsS?|Fmf8D|iS-_&6K*@DboN3}HkMmW!^@2{ENRCT6hMJv{d$ z>LY^x%5iz7T^js8?y@p&tGrTw{vFI#Vgj+8T*KcMcl(Jck*Iz1I?=KT@2Zd=*&)~6 zca|@2*?cA50P5I3jy4!hO}}ZTgs$RgUtz0>#EjQe3GYq%?Nr0~Qa9MFBcvQ;U_>x& zn1y@k`~Ae*Rizkj4*o1_w>8v3euzpGonA`GeWpPNzgRX6j#P6AlZP8&A-TnGBv>{o zmcHhk(9hvR2=?@Vp%-++3T~)w9r|1lYJVw5w`}o@J5ikIuIAS2*vQhV(~B!fwVHla z3h!(on`@G!(R+FDPcghc42)60bv?Cxk_7S2Q!p*LV>^v%c18+7XRMQ`v5yi5)?i5` zr4_*tq*QIqr|z2|$rr3q*tyB_ zE(r_R&%A5j`l>p;pW{^$603phAdOr#B;6af;Sv@{B!82Hr?dsz`7 z^QL)NbW6=MNdhi&|#vuX46si||fJ318bVR*i1 zS}bM^6Q4T;Gj9&D?9ax=d94{LDk_K36mn^?viu8W3@aX)VoDqeTT>Txv)6a}R27>+ zg6Cb(mUG4JO;fhcvK?76KiNPS|1GxMB+CmfX+*#zYN54V}VXMjdb4hmHLX$O=lmy<>mAd{x(8u9xGk(;;n( zc0AI#ar`T0)Teu=spodT)e#sRuu@AYpLvn0w^6M8OuhDSBlu$Hf}|R47iJ*OLgaMe zIK8QXXH7Zn76D@QnfvGi;zR4P%8N^(Ww&U>O%3ZL{D_-@z|2B;RwPssaK*iemfU#d zEg!^ei@=P?&t!P5^9))LhCuv7EFup}_-P$wz^bKo05W7g+2`1ePEg}uhR$Aw<_;8EPl#jCW&w5lqrM2Y=7tk0ugFA$sh(AW9)aa zQ?(DT2sm33izQ>=XzCUcBOme?VIjC5u9;h}uI&W;+G4TMb@}{CrQM$vv69`|b z*n0F^2ih$#v4pU|5AHR7(}1b`Z56<^Zd%}wQtVI((i$VW6j2Wg&-OnyLxs$mi-ZWo zrV)kJhdn{xc2I!qT@zr*44B#gf8-r{&pRjt8FQG3Bm%*-5bCx; zPrjexz5gX6J6orwMuAHcQq0LLAebi`?Al}IQ=;lHMdU;e|9F|Hn71b?v0VS%0qpH_ zBmu&j$djS*7~<^0?@n7dx9+rK(CWc#8}ashqqzpP<6oaSzWB5ryYR(XE5HCdA>2~as9#anv$S>WkL#?}e=_Z+6 z@l6=;xLr^6!x!1GBdG5UxsVa;Ny&uUb$$W?Y5R6Pi>dWV8ut9_Z`1ZU$Zdt|sq{Xg zb_Kmr98@=-eE6!CLv7XKdyO=WH3$7zYO#D>thS+LxE@WX%6vGYjd=Ib7wOP}S#~WO zb4~yOJhA^9Gp3?1c_7Z;^DO0WwQ`0w=ft@|*;=R+@IDXSsbCaz{0u^?IY{50PPPo@ z%J(NMK-t5`HeMJS&b}hKQqVY6A0P)_pu=){#qo0F5)eR2A`ojXn7lIWKi(;#UN6D< zeG)@hHzbuH*DG?mKb-C=duil;B!@ED2sZKmeWL=_5XDEzL*5TZ~PBc;_>@TzCo=%6kyKK^DF((TNy4fTA%zbA#xLR zpRKOMeWPtbx+-UF}OclyWSh4GImuR&oV=>MCKWAoyduByJE z#->SgH0FPc3k;U8mUeDn#cM9AJ#LkN&Gi{%MaIG06*t5a7K+45z`B0$uQ7&NDFJ z1>rZZ`|A_7_2i}Aa2Jk{K_aio4VpUNe~A@_q5{QwvE8yvMBD*VW{A_-_}w;TTyr~KnatEo|9Ug zw>x10!g+b{YD17) zr7z2G2$UrJj{dT8IF98PcP~gf=$F|{B(HhXrd$)9X3;?EApSca%n1pQt$%#|Cfm zoQ1a)l~&MSD^(O+%xK&Ghx;RJjNO>EYF5C#yFN=fG!eoD#tiu4ZUJ-4*n|fK7iah? z@77KypV?bnT)gKn_oQMj-r}BvM2mqKj7Auut-8ogxu{#;O`jo@PTrGkeC)1rZ=P2s z$b7*@QJo+7y4=p{SVB6#LBMVwfy+3UjK15wS@My<^>w;n3rcqDvv(lDf4pxqF5Fle zeqCCdPlUlo_h8bZz@WlD^NwES{TpVW9Ozv+CM~=Ur5U|$_z{yA3U(~JZ!KIs*jb6> zGW<1|CJ8154i!>Pg7D1|rdcm}uJ4_9{$LwpLWTg2%>WVIE&9J)<8|F|l$_&?SP~=C z$1PXEmlznWe(t&}SEn*7<_PL|PI@+)J~O`c1Yt`_Aol*EWT;jELI2f2rzR<>VM2t9 z(qHx~9uY#xBIi%yJcDi!V?P5D)Y+AiZ3J!O(570_FUV~ICGGW_@vn-Db)P>2Ku*gZ z#wa%4%=_fu2UGuVEpEIkjX=`zStr7j5?yHQH{ACWz07a>OesvK%Gv6&u&b?7*lDK2 zbL+3}X1>D0#QLN_?0ZV0jwDo7c{T?2$4mI;BR+g!0<_?a*hNfI{7Y5~>d3d?L1%0l z{1t-#Q|Yvb0UpBs{t^C${A*_VUv2&MmvuhiIm{$Fbc92jPZk;|nTCy_5y{EP6<#~b zLp=r0ACBllYUc(9$b)!&umjs22z+43+mBe4HA4-C9pd^}8Us&dAazEnfnPy1JdWki z%g`z^z6T3#1WI(?_q_JElvo%Lz8?ZNpp^LM9b|LO_}Utz7KOTA*285soZuZt;|}M= z;xHgjSV3u) zCh`1tR5q~9G`IG4M)pBQep_+qM%@V$+0m@q2MB1z_v_%EM8)%1B&Py_`teE~>kXn9D+B~j62>H zd;IuuI3Cz#V>#FXVDSwo1vnq+$8vH-N4M2;FRfRWm-Bn{2~|~t=hjGF3#CS5YC`PD zDc2LYaSm8L; z+f<2!JEpYV2=OY23q`!QG27bO7RNoC5vfqP?~&Jt0~5`%#u_*2N0|Y4__rh=?7c~h zo|dPlr*VOXHch(T7QT*@lcRC$J2&5n#h|eA&4aZ*IA3~i7~Cr&+j8emAG-JrCvmCJ z<~_RoSDg8yidNHSek*GkypovB4x!Ey8OK=`X5aFAS6X8^JKr8}K#zyaW=&BMt_u?e(epLfB2ZWl$;j$J+$InCnQgNM9Ip z?3GuaPm^4ii{&W!b?K|y=G;BQUuWp-6oa>U25UE3*zCbde=CRuZGe|q>N9yx+idE& zXL0-v`=2|VX4L(%GORqj?@e@BMa~d^e)415nnvu zl^J<|nL9VU%=z1Zw3mL?lglHk{Sq$MP%?}N-`8JZCgFR;ykC<;Gm!$Gd9fCL zdZ%}Sd?^v{OlkWfBO|STm&hcrBk$ho`FC{kZ-!Rf)9FXilInOfQ|1$)k}2cUB$e(4 z^{@IrU}Wb7K_!CqMWp#C?p2 zc;UtCMA{%zLDxrjDT%oy`t=)YPXGPF7NO$<>2wi1)%%f8P!a3yTH8 z*a`*};ZCm=m}Do>O@!zcwUdXZzyxH4-e3hg-b$Ch)LrRhfrVZBAnE>v4R^CTMjrDE z1Y%F}JAuYo)>|7m4;gJh2pDirtBDA`v~WqA?*RmpPvUv4;<37oVFOb%1`rm;-F^N* zruXd+JtUxEiYm1+I{R_tO_dsVCpY|T`9a2c#%%cPI}0brnRNyT-N@N)j{~t3K_@nY zW;EF(!u!!MEUJ}Q&Q<6l(fS_p5Uv|ywkoJqsU1fxFC?id2sGq30-~N6U=*NmzZ`xh=`0N-04=ie>9?9_%iU(J^Q`T!6K8ei&T)0HWylr z@Z!6}?fF~a+sJ5Z$K#`fLdKhUjnaF%NJt0=Zem>*J_XD`tviDB;%ymAOUuuZ^VRs+ z17JM^?lHmq1G!EP)ZU9$EDqWn_g*%gB|A3!_1^9{(SM}G{v3hW>&4Q|S0u74+is(Fp?5ezrFbs)sV_aHilLEf()b#23qF^@``P*z z;&XO$fRNW=WTS3fC83}{B@r~H*7c8*d}dcXFt(owDAN8-w9M($(e?vZJ;oJ@PZg3@ zUvS_mYVygt&TB{C(NclP>(V-{RpZQw!m|`TVy}Vnw8FUNMtec}IZ!|}CG8L>d*FRt z*i?KGAYwbMOR8YKqvWf4UVN@jnF6G3bE435KTC6Vo#8%Yv23eL(DrMK=V{fxu)8vX zmdbpv_gGf8uo1+qx_Z7Y1VXHz6wW_-xwk$w!2g8q`wt=XS12D1NUoKRSVuyiY|#FA zxS)sVq$i14II6Tu5n5(!$ZC}5O^d4|(75+3nefT?=^TtO<#~-l4g+Di*tbXrH z$^RsqqULa;H4~!W4aihR27m8P_|yWw(#{7Pmg@X^a0`t5Q+wjnPr}If%~wY&c*9;R z+)1N)x2I>{%nYRk#yD;h1({wFrgAvB(A$@6hy$k&` z%kSC~Mfmoa$R_NT6wJXGXlY)jq7JS6qC~8j?;5D-n)#kgxfOos8^`LpFJ|KDl~##) zG;l`7I6hiIws?hC!$l^FI{36THA$>4(y>$+VLeo8mCzBf2$8PlCw-T__2RJ2(!5@9Iy$g@(^tgwYH97IIwpum(=-77xS^4o7%9jU9jCD{g=wNPv12JSv!MP;@kni@5ZQNnMG_3G~L{wcAY1qk7+L9z&AXws4(Ig2pC3!#%b8P(jBj=`KvSnjW0s(|oY!+mxE5vxt4+tKE$*^D%mDh0o5Jw0*n^L#NoO(nsP%4zZKfq8L=ya^!Y<_YV%A=BUfV zBP!1XJiKZdgq$@yU*+ak%+cyNj=+-$OfI8#0ntoP68XO&Oh9c4c-ARHJRO5)-wWO8 z4rBQh80a&w?Q{+otbxzae8+sZm%yWNewdP;|JirFGVBoyKi)1y3DfBsyp;;&o6~G9 z=xax#rmOlnh~nYrAiv`(O3P#(gQfs_x7b25QxZ()U2)&+%g7X~{7$Md< z(i-tq1KqpDr}U~8u?`2`K>l}V*->IgTfHm%aOaCxJz_XNcH7&dr_iNRok#8xZnm})73 z0@0+9Lx}IS5FX*HZHY{i{Lo}($_4vK2{IhII8iUW2pl3lBCtIKmieOvjH{dQR9fl& z!D*_SC*PNnOb)_dKz9pYe*HHME+Ccv(@$k)4t##cJUuQ$oYDa!74cY7;ZgpBXRrSk D8g8>& diff --git a/docs/gallery/contour_plot.png b/docs/gallery/contour_plot.png deleted file mode 100644 index 36c7946e21dce9b5efca206aea57a8ebf79607e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24599 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 CBkwB! diff --git a/docs/gallery/distribution_plot.png b/docs/gallery/distribution_plot.png deleted file mode 100644 index aa4573331aef9a07142406f695c7f1bdac29eee3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26079 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 diff --git a/docs/gallery/heatmap.png b/docs/gallery/heatmap.png deleted file mode 100644 index 52f5a9e8e6584446152dc33d7c40c81902e3aec9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16023 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 XK4DY@Xx#U3ad7rey_#zN;UMe@Q={|~I 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 CpFwH> diff --git a/docs/gallery/interactive_3d_surface.png b/docs/gallery/interactive_3d_surface.png deleted file mode 100644 index 8a5a5c9aacdb2363b6d2fc62027c0a1dfec27178..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6336 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 LcDHM8JxuvO{;8re diff --git a/docs/gallery/interactive_histogram.png b/docs/gallery/interactive_histogram.png deleted file mode 100644 index 177df62c0349350c2c4bec0b51fd7038f0a48829..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6221 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 diff --git a/docs/gallery/interactive_line.png b/docs/gallery/interactive_line.png deleted file mode 100644 index ac2153658bd9af629f78f0c9e14c16bea1578342..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5726 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 WnXR{LJXM7~SX@{}s6^nC&;JLs%|eI( diff --git a/docs/gallery/scatter_plot.png b/docs/gallery/scatter_plot.png deleted file mode 100644 index 292bc871540fe1d39f687df3a3554597e8ee4683..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38822 zcmbSyWl$Vn^kqnJcXti$Zovue?(R0Y26qVV5Zv88xVsZ1xXa+q4*Au8Yd`FMS*p4y zn&~&)uiv}(oO90&SCErHfW?LV^yw4AcS%vDPoKb!Kt~WXB`?7mu@;hO@H0 znX{Xrlj$c}LuUsYduJO0boS#D1`47D5TFx1zrrNpK28Xs#9@A15lBi(|1k!nn5Y)$^T_ZK|HlAd zkp&+|^8$IPM+#?wS3h|6IRSx8q01lKdZ?E>8`sypxU zo}N6d?Cs@S$jjBMDcjfOBnVv4#Yj;!IdXq#z&&3D{Ny&z_Mpu2JT86NTwhI4 ztZLoI)oOL3czxb{=g36vReGCr>tfxve}CP4msQtw!QjS^iO2s#B>;qJyXblrUw2#5 zb(^8B?hsbj_hF~ktTP!0aM-PJl|tZU2v@AcNf3V5e;idmTrtm~sP~Aa4~*VU>AInC zYSpSC}VFBG)@nM$RMs6UIK$ZQ)fNSEI|DZztVv zk&D&(QyKLu_2$<;HDwUF3SsTqOnjJ;!7<$X*l!oH0#6q6n<1g0j{&e)6yQaQZkevv`jJ;28ei4>^vfG6!}6qwN(WBqW6I1;N1< z*L|PQB;<+{a-gKS@DY`njb>MUh`cYse2$fK^3v0Bt!!*|0S@i!9ZlUYdyJMn0T3N> z(kTpuLqvXjTPNL@y>QOk;Z$|JII+R(?~(d1q?LfjPgNK0*iC9WSR1kAs2p zz@@!qf$TCDsq@wk)^f1!m%0lLr5E2ScEaIWpLPTN8-?3 zzPN3Yz(3PLw*1caz8dka9U8blZ@(xy$o7hP$NO9j3>AFw z?|PiDulptvwLh69ot2g4y%nl4kt3KBd>w*k_c!uhp}F8QP9(+J(ZHt*q#lv4+n^;@ zyrl1!_4Y6%SZ5&Ypzm|5s>cYuSJ}KVdh)UrN;Fs@`=fD?8{hq}zxSGpi^~mY9nB#5 zUVibsUw1otd%lqOfJg3tW9;}j^)b)eCEe>@7o8oNzm0#7F?P!oXF9>2b>45>bYA$x zc5^zR^+9H!D9^wwr%ZBZW7kubJN<2Te>#Edl zmV2Cu_3gi(%I4PwKEKuu`5o|XD%x;l)LAW*DOS&IZdQXRVZQM_Xx9&%xyE`- zfi`@I{&PzAi|J_>0k7*<#88nmUN;6J5xy-4(C+()5Jc*vA3?zPtf{GK+2Nf$t z1AD*cKPAud{I@CtCM?uY_zu5IruNp|HluxFa0v(qBIb@%K6cw1-ObCfdiVBF_rrE1 zb*ztrgFzVzdOL|7e;{lpHAM-wQ zc-I#VG;cpoFE5Gp_dz`Sub7cypb+be+J2Gkb&hkLX0iF0Vc+F3e+|U>>)YxqPuRas zkBz7iUW4rzNO3cl^Oh*bwFU0VX$2G{KYn?f@-vIXNrtGJk6)&GRxH4vS&@$vfyuL{y6j z-+@-(dYtuUH$mRX1I=id*Y)&olorBS9#nG?<>3>aPI(yMc*hTUm@I}XKp!fvnBUdG z;pfxSlTqwkzZf9t08Zx+MP$=F$7k>bVLL#BVePi%C|v$+w*8gFeSmm|*#a-r#BYuW zFTU~ueiMI1FN$7N8ir(nZ=Ug$1yvj=Y z9l(&A_&b2F0kB}tam#5k9qU#FeerD^jiS(Shen2wobux(CW7`4{`);Bn^-nQpx^~z zfGG|_XqL;1rGfUxO@2Xja3tx&Quo_Ht%^=dTx}#dlk5$9&lGxT?tYEd9YEG^`C{l|6_5=}j!DvowX&T4 z2alMSd&5b$!2;!7GysLAOgZkmEOSh2TU$EX4^$Z3^U#H2H(Po12KIs0!fTI0E&G;6 zl+XU3`dGx{laiT=pbWvtF}ETAl7_m0o2mq(Tb}6%H627CKhaRF6TRYy%Uqsf*}`N^IW>FjjB!>8NP4bP6~9T0R*cP@BOD(YMKp#A3B zd)RMchnR(S=V~n+$G;-|sWJRAWN`~hK7NK+R7O>3wQ0kkL_U#0?(G}CeOMEQ0y|tl zPr0_%lFJ8^qv>rylAXqC?&Rv4D*_%ik}pkIx5>WLOz5qSN{~b7jr5b#@%gMdwv7nq z5@;IM+b>RMnM?N#9@B9!=l$j2^jMSy!zikz$YDmj1BXFgr$+HUiUq3$y|GP6r=KKB z(zSQTF<0~ou_FFqmua5leV?;CHp%2jJuEvgFGOPqgdA4X zWd+vQ>;6aMzIb@=AqQV|9Y=^1s5~2_P1Rkkzl}BA7?d!Da*S9(5ApdqZ#Ts-SP**( zptmxb$qg`~5G0J1Xax@9CB5En>N~dTNST^ar0jSDBlT6XK?q23>V1dkz2vlhN zVrdG$s{}w?W`AuIhDlnmQZ16rDAIA?3LdS}ZAYzwl5*buezzJ-(<9X&5H1xu=!H1C zH_3M`V>+5hts@Yc^O4b~__}ncF;=~(yxyURynjmfn@whp>^VQcr_gH`t$7?|scxwToB2dsOzSX5m>v^ z?$eJV@pVe@-TRakof3-jMZc62_5)25M~NBzf8y*!m?cN}oy+NHD4%%d7TpgF9tFV!*zvfZv3BL66yCs*j!YHH-MBMwn>|xH zcmq>s*Gjs{uGwrvy4gHitt}w|g_n@7CrcBzsI!KAh{I~Od*g3_ii)WysHSx!<7b?Ac<{J%MZX)i?#4Cr|i(8Lri00+pGn=A5N-%>MO;po%!UB5O5-i|3|Y3$+<4NOiti*D3o>2b!dAW3Z8Uc-8Zlh0Dyx6#zS?2BYW&>` z`bTaQFuz9h3d8jTUkd*q8PxL&vr&Uvsl;?zrl*^4f8u8rYSJ86IjO7P>omPbPD1;~ zpoBGRS^;6fnA`AM5U1xcqQh2dew-OHCXMNuE&TrcwMSMd(Yl)_t~biuB>xyyBE*T? zUHw;eUfbH|UPWuooDN&|42>3vj-F*72cI1hNfuhFf1E6+?l%^O26R;jMcL$&0&9vk zby4b%FXVAsoQbCY`^*1E!P0@N=Z{(%t8>zsBgBYhB&PldG_1Drzu?c$9)b7D{$mL-1s?v3yt11g^`5 zD!RH8^}nVBo^4j^Or=Yaq(N_!37Rq?JQy3xk$=S4+GosEf6YK$=mx07c1J{{eFqIQ~H%NFGE*;ygc`@@iPFAUXmI=l7oo>S5j z@&|AI!c<=x0ik}v)s#Oqq4@`SzqAo!Ug7N5qq3Do3re3jJTAkzQ~fUlirM>3Kf#G? z{*3dk=ksOZriO;;+95(|`|ekc51h+*OY*T{AyJQM1?q`7DTUVSIg!=IDrI0*x#zK6 zT9Fo+5+$Jmgn0Ps z?PfNVv)wZUon+2Stav5)n-jXjW^5`B2<+SQ$fu2eypARfiF|e*2H5gzN10BNN35}h z3$`YGAGSh|)&Nt5(hRLZ7rcLed^y~Ff8*4oD}|e~Z#$xFyIZv$T0_cpB%D2rEj?)l=!isEvTZ%R@NxI z4-@kPpLlp|S28noHXn6350y2;Z$^`7k2P&a11R5i4>h6Rt%zr1^fH^nQlC?va&mN=-`^oIzKPcE3}!@zHT;8WCb?l;w4nk z42!sKD{8=8X3)K~pbQ9IYt1uRl`c(O+^3{S>VpV&Cixu*%JaBxex%C}9t#T5u^$AL z+{aE<7GZO{hjhQ~=Q91?jteDTon4*Tl`bm>+ScabUt@yeNA-8hr}MY@^j`)q4EL zUABLk6y@cSCem1oO@=5wG#0YA4p2-eHW0E=eCInwxO|mFm8O{gcNwYAj2PC8Th}$g z(_M47Y|i7jITxkR>+KStl8q}8P*aOcTYE#kg?}z7gn9+W`t7D4?Tw|(MPSf!fysdOSZd~HpCRQF3-yM6SfF`jKdcBxTWCi^{gf<2 zdvKZV9rM%@r1dX)ix-1v(ZyC2ykDR-Q%hV^+PwpZi%A%c-+g^J@pfjqk*J;!fb0;117>IP_nrHQ@RiLI{M=6jh#4IV0C+ zk{P>C7oK3BOg-V5F^G1qxP}c)dXE{>^&RbMFukuiM!km`K><#0*JNSJl{2PG>-?7` zo>9xKilYSp!4<*vg5Vr~68H^(2BGAsU8`CO;c+3MFiKOaKH-+4B*m>zQ7~ zP1(|vNv|PK$b8J05E4sec_v2;S}|z?Ds86=qW{Jszi?mnryg{-Rk~d#jpYc$U@~;Y zuz*~qmCF5P${rgQM<-mJy>#i0=>%M{f3jPjzfuV|{Q}z|j03eQX#*-PA469^4N7_= z0iwimz#W9}ZjJWxZRJ2J$z%&~hqOO75-PUZWo5-BCT%hJzkJGsk33Nyn>t0ILhwq6 z>kPHrh;WJ4eQ^v>)(y@=8zgl1f#ZL=Q(K*9PMvRCr~t5i^N;)kOUumwMhAc2nui=^ zp0O|<3wR#Vx?W&d7}ami&w&l^|95vHETG`J)1@VQji?)*L`GBNpxu4hQ`KOV#eU+w z5Zb;1D}k2iP8xx`BQC+(z98IX5GLLsROX~1J&X3=3u2;U%_uvJm^vM@Gu5a>7K6TS zx8>i3dm6E9RsuxRS8AD0@aX^9khkj&6*dg6z(ngw4FN`LICE88UMz!Kh;!6+NiU%3 ztgU~5sa)nX88$yF`V@_E(x(xNJjGI{0Tx7^4M}Ldmz)}- z$UZONstkBkaa)?J%8JRVW!Zm?zJoMQ^l+ymEZg1d%}jBsx`%!S=#Ff%yL2ggyJID^ zS@Z>^5M(mFXydg-R^g3rspCaVn&W0&g6r9TAH_e`TrPB?a<>Ip&ifO1*6>=_-x4!& zWL0ukk`M$ej}A#=Wv1rBko9e?17@EIXJULaH;%lCEy+~0B{McPg(Q(&61N{uojpPP zJ#hXX`#{*Ay4iO|T)ePt*vQ5vjDOci@cZs0kpw_A4>)HIFqqSMKJzS=^q;6@I#!&?84+mHnp^ zLgtJpeWI8nD{A#(RKFBMdy?PwJxOd%2yqn{`(h>?06zfEf6&INgI=n}!MQOBQH!rL z22-}Y(6Xk<7CY23Us_IQG~8xjRVJJQqzEf~yFw9R_mtsXaHQaUcc;ZxyWO7@dfMyW zFn5$OD`f!Ty`)Lk)eTnRH-l7sj+DM7`taj& ze7d^fD2_B)x>X0m6SPJL9RyWGyT%p%)4gY6?=T^|3#$!v=GX zbNTPNP@BuWCySih#aTXf8|Yga%<@{c+(nnb9%E$akfR<|+lEfB)CiD55889##oSwO zCKJq8D07oZ?$(41);2uT&$!#c%S=Jo0oa16X1Z~FgfYCU-~av1T|+<1kBPSgb}@`D?BEX zW7-0?vL$4hQ5(fygmACQgkfd|=fA!>3YEm_@kCF}8H!M&)l$T0upqXz^~%*}lyfa+ z%Gui}uMI-6Pr4JVP1PPL1nJHVZUy4g89#+b(=XZQYc5Jy&u4K9($Sc&*713*Z zoO!=A*RUXW1ObR#(YZ|G5@eE=mIMl~(yDa=8!%yoc*S9VBrdg`^p7Ya39AfNiwma>GHJ46?Gd z<@RsmN@~c7Hr7t)Goj0Z4tPYQ&C&TS^;K3J`XzUmF3G=Ie5j(&?{DL)lm#SaQ z_;wg4OpD`p;q&N|oU5@&HmMXjN3UY+8$-*0;X*Gx;+Vi&%Z(aS5Tc!*EFMWV@@;+c zlyUj%`2mN5SM{-4_KL=LBK_G>;p$F8-#kT_<6pIL;mtpHI9V+2VH6jK9=1l+rGMW= z70W;l&3(^>ZKp^sq57bZ3L(4Y(dImPYGEbgtpr|x_a)czdvDE}6E}X0-jdc$w@%+v_I-V=(Pk1Znyw$S{Z6-+A1POde~VR` z{vs2Pet10Hx3c4Y>V;|-Ul7~zzTA`&mF1F#ux?%HcXT%K$0AjfkJb2)G$4pKZTae> zEzR50H25lG2tB;;A_>=qB(JuC(bTBRzdX1Q`MPRXg?PQzZ>l+)>kOzs>Ed2+@oazS zO@zn={>o9P#)Affn(htxteL}Y?g#I;loLo@3%oQhy=5-(HAkJ}O9VJKT9NHkfx*}( zD>@<$Vjzqs@Fb#}$HvTw1T5wS;`{s@*~g6hG>2UnWECi?3_mfxuo+ubl5a};QA64T z>r=M?hEX=%8b_D>tz>IE#K91gb-R~eq$E;}b#jj1uaZ#Pb~w-BF|o_GWWtIxa-jd9 ztD>ID$ffElSiLsAcSX&vqfVH7U*5(nyUd1LlQN((a#JJ{n7@xZVuq3+ zoa&CFb`ve7YHFq~SYe-#CIS~MGmqC;1>xfYl4ib(*RHzn_bJIYru|N&X0RnCk}U<4 zl8VDNe+pKuB&gjdXxh4nSY?Nwx`qr`%SH@%?&ORZZ(<{sxUjVNpg*9UV75(=DzvB2+WG>m|h2y5)}yDtXz2r5}J{m@L?C2Zq_x)(1-WIo9p)7Re2;=%QPg1;QzVqL|4v z{hX=<7w&*;51afI(Km(Er**IfT8^{wr@vBI z*MdLdI&yvdwDjAGM%g~=BS=#H$XYQ)GN$}wFmQ`B{a;8!?gJ^HPndM23AR(E<{P-^ zeS3rXDs$sm3w->M;c)vA@`_xL0!`thF_Hnzn`3@+&5tq%FTBs4YxrXHP7#BF`8ZB3 zj8W9;C<_RLE}}!I%`Ce28z}Fo*n->37K^jIyE|JXYa?{4qpH?^WvLSl_SRP(OaB2r zl34Vz=!0yT6B0}_az>In*f>$LSVQ?AO~ItKle(ovl9qr(2BSo# zp1tUMh-oE_@tS=%BzKrLwLSdxeb$-BeEs`ldj1YbuAJs(=K<8_2hF0xzu3v=#{BGCgZtp?^OuvU0eeyI79%fd4Zj+@{$e(S{G(6);>s}x>H7?N zT?TABnvEQ`mkjs;(pd%ehbaXVX|C0@J(HLk;? zGJ+F&F0CF2*e9Os^gW5|4!JmXVWwBld^*y8M0)=|iDgF%Z$idFh-}1V<7i7k@%`;BLu~o>f{8OxO6M}f zl?O=@K+(aDZMMV%X>1WIhUqq3nru8#>NM>S$e2f^Y7eHrgwo$ct*=9aVQY)aU4hx| zV8tz8hP^nwSLpuJJk&@K&9D5DOFd(V6(Q^;TOLhehm-4LMeTozmFmUM)zi z#d^XpTsm#|7KIb{1nsDjz$&M6DQYWZy+i|&KDXI~e93D4qr$LVy@E!# zXr;SLLO>9+4Y^86`%{Z7L14Z>pHibdJ^2Uhkg>R$xgo=gn=;3ndT^(uQ!sJ5UY2BS zvr1c`k3!U!tPsXQdr~Q86)RK7OFn!7Ugzrug0SCh>dq`xndYe#LDNE>>%A~Oo}E)H zPuTE>vfGq4~JE#_(Nf;WrRP3WAXqSOx5pUadqG$%uM)U|^Q0Awq0jfd_cY zNtOsp)I2Je9|g!We3#aNqqYJbydVD2_8>qTm}?Ye-|%+Wv<-uUa*r&42>2KFd;7BLxM=MwoJLu5tbWTbW2k8u`ryL{NrUUGF@y$>wZ*Kv@ubAFtMXcG%;Q$g#8h`q z77kc(e=MioAW>RvVHe}(Oa5Px3xT|NY)d!I@*ANEWj_rdtUY_?wX8t6d!INf zkkA!tsm-RL-o9S}(~LCs$D$#;AdvSwXG3A&{3%%rYbeK@UA11r{0T=698^{WjZVIF zml=H8lLc1>rxjhkvrKHH<8_MUsF@5YA6=Jv*r)sDyLRAyqzvi_%Xc;H+pY6}1`T>D zc#u@O;l;S_G)CXx`|4R%R+cA%#Ggp$c}N1Xyc7zs2_Z{4D9Ycq0EZi8O>#XQ%p-m2 zr|C@Ye}$%7WzNrB>}#2|grkh@DOrl0H6ui}ks%j>&@m;(kMt!#67_HUOJ?*_9L(wOYbK)1sq=4moyP!UIwKrB;TpapQDLPM~ zf$r@mS&w{jkLA6-Lr0wnVVN*8!H~yFLrw z>=)VbT$G3zi*hbqHR#kG%#Hlkiytt5Sd`Fpepa?Fb?cYNy(Hv(FN<}Z%h7xK$?!I> z#N%uTmjoArd=!nxIV(QZG zgy+NS&?W@{VEcZwQMN$QQ;15d{+uMr8Gb+%I=N&l7jb2}kDyIPG|=uHJLNuR1LbL* z6|bH_K2pA7uDUu|BV}@UTxERflC?i<S21*Ba85+GONHkXlmH@jvXO&hKz;Y+qtI#nhu5#gWdSnu2R5Hj#GStB^C~ZcBpxj z_%^fb>IyTriDo;Z@#J4DmQ2k#&+*K2k$UI!5e( zU$*2xEMi}Dm*(f}%i`DuZ@%q9&9gK0+E-?&UoedpS7cgNB}px`RPZG`*?KWfSWb2T zRvOp@`()c8Eq|X;jGsul$VDVQI5JkQf6rO=()#|EWp;%NT3nNpa-JZ6iUp{o?F=d` zD~pLitb<$`|LPndL!Br+{m42h@|AUUr|bA@XJ_ZGLqUW_Atce@-@nA~Zmkr!iKv>K zn)N0&%XJwv!_o*zax57y--)oALc?@WtQsIn2QyzBLDD_!^OuHPTc`!C1v{1S->QG% z#)^~}Qz+&(_9Vr-bwLAJf+G5o-}+SMMavz!0qC=gjj6YLr4)8Gr>Rn7R~ zO*9D{SvV_rSZC{uA2w9hj^BQrvFF7HDo+y>c+!p*)16i$aEqX0e`nDmsvyM9zDOu`Y>u}s!sdrTgy9yyVeQ>LWuXv|5; zsKiqQMG43#VgFQ^luCBZgfKyT7JyCFv3%7Y((~&UOC#dc^Bn0&n_mouKjdEo#vi$` zHJiq|z@J>bH8&|rbf>HjsA6~-b$sa}wza;WjfrD;8U#jqggEiJcbU;!eb*s-BaZYb z7UUY`feEk z|FqtP{5XNpF}N)HavROwkPDRoM&;twxeJ{p;Q?*XV|?c<&m?-SMf33D_8eeRT{dx) z&bMK{yt66JE6()h^x`K%wgJulT!}*tLa_7kYP0nusjQF4CdMg+`N_kOsLar?B^+s#yCoGmzq}m8Z+> zIxI(A**kAFKz31l-oE`^R@qR$DN=cxR0~dZm@{INcMJ=aBls3GG(e@;!!u9i*vO#* z#C5rAA2~ys`^78y_A5i%%u4voX?gglLHYL?747z950m`xHbTIdIEE`NocmHuige?~ z`l>vhE5eLkCA&$z=Ij$42o}<6358N6<*q9$rcqq1bXG0hjpPir#1Q>F*uq&2;aYe! z7O-@78A)xS-kHmLz)-HLx838jo9Qx+r?UiWOTZ9vd*skF-8Spet?pVwscNo5P^CHl zS16Gz4%BwoG>u{?muZbJCXU6Q{f2g8H28u?!9>DtsEadu1)e@~xGRybey1lpf%jz( z1wV%n@|8&2%IvU`U4@gA=8U`MLfCchp3Wq_q%uqg2XDIW3MQHx#`U4m`f`DceTji$ zQ0jdw_%e-z{>Azit4trMtjHm?W2nGW!mHUD#(vBY_m;(3gDYzv&RtG+q0ri# z*HiP%2N&P~R?5>QD64+a;zqEtU#SFD+ARjG0F5?BA!Rczvm=D+`Xk@9#Z!?orQPa) ztFcx)c%A;lROSd?0c%5A-I$k3nNGtt$9TZnpWRK4oYWC1X6)**rTSGuuPni(eQ3Kp zC%Qg%W#ta!Iy>(E(e{^lL}}sodn`HXsQ37bToWTi&xtd$kn^1uO ztfoauoq8F_K;qVlO}v7@1NNEOGz4nFNFdLTEytR3$3Do<2;!LX)ngVV5)Aa>JHbz} z*BOUITkTM0cpcI_2N}t@;eutt^@7yWYCoh24=Xt(@*Z_)okGDt|~bUfQ;YT4={+ zXzM#cG1mu|;j1-L@~jS%C!KH-Eb%TedG$3os~Ioej;(}{qMF)Y9J)|B&v<#nE!KlTq%4`EO)p3{0=Hp+zcIX)Ih{Ik&wHSkkG0cqrZAZ zV{y8Aec4rinb*?SPJG&Pu4@+Ag4TXRScp+PXe;0B`&@aq!%=!}o6wsb;vLmX2ld~m zDxVW+k#WK>D#YpAxp9#7K2rLSJ+xBmhIQ80qq3reWJZRv+cX+4JQ3cfbziGL{NouU z?(j@^vnT5G7SIhGo@jf<%PmpOnrUDEsrI|I;3bLCinETLjM-`;s+59_l?=+{P%ZkI7=l@_Q1iw9>gjo<`&p%I@as{_ z2J-~W{|+@2UB&G2prB z-0qCg*O)H-aY+>%(HF5}np5Y8JnA*K=T>&!5hD&oKxKmNTDU;F(`toD;D@k+Mgv2e zaX+Ds&qcJ`UatNUGGNF$GcFaZ&5VV6)+u<5y*u^!x>ivDf>{on(||e6!qb={%jwca zj03W9xP6drzINK@OW0jn{VZpKfmH@!+4^A_Ld!I2&y-FIN*a6KXCcm4 zNcL@uR*dh=UT=#I=_Kjp3m>#Hx9Q6hB{hL zgmi*|#*JmBs*5l;TN$t={Wq|NiS(A!BqaRQ`i)@Q~?j02om1^Oj)BNN?dI~7ffGQL^d)HcJuq-cNg`_-Krw$3G!8G)K?6EcGZ`7 zYn|pqm+k?ZLH{0jKObX+MwfPv&b2pUIQF_w+RP?qQ-Q*Ya#@q33rFb-6q>WuY8czP zDek0$PZ{L!dB3f97#~&yQGbCc|G1>n<`Qm?d$g@n@JZsYj{X*rMy-Du&AiyKXi9zj z4XO5j=D5MEft-$9)8)p?Vwxa~0LpjUZ7s*z=LAHZJ)K;5Q&0^FYI6Ng(02$lqv8_h z*~ghTWj598Cy9K#Xe%{Z(?F$eor+>nLdd3MjJXoyo@MdZf?|^#08K1JdhjnyZe-Z{ z#+YXRLu1yz&Kkp$qy^Jqg2P6Z_377L-}`Fdy%EEwIi%e)71MuK$j?2isD8Rorum34 zptd&Cr%V7>mCKP337H%N0zm!};KC=ra1?6z_I# z%gsUJnEZ9ik?(&tg?O#mW!qtUhv5Nnq>e~q0^@8eY|egqrlM_O966zdMqU*qEu1JI z+FA#UMtlY2q(_JXU-lHoCn!{}`NbNZUyLe39^4ZheS!MTm2>Tc18pYJD)^W_so-Zg zzFHx%h{$Lq%t$;N=OCF_OkpHw*Mp6O4&(NuQzu>y=p?vT#1k!<)Q&E050r!01jx~` zz3ix*lz_j;kEz?110ZEyTRAD>6gZA(ooLLVR2sItQzlk&zqhT;_=)am3@<>xq<#N8`E}>zs&c&sp(U zK5pk_H-l0YcBYdP4koQJW-|WMH#Zlzgcba7Q@4Y7>`*28LB`h{Hu5-!cIs)?ZaO-N=|&M?x%t4Y*}2kEMmREeEt8i6+RXm6FvXN7!_H+hiJ#VH?`Xv}^`Eze z*;-|^>q5LI(V!00hu4+uOTpkoKSXR1UNfa&Pn_fwjzB* z3Io-A=97}KF~```CZ5sT^zaH*Q?mFHnr>SF5qrWGGY=+a#uSbBZN_M&Oqs&gpHR0U ziObwM)p?KhhZYmXI$Wck7m3Iv`bDJorwSk{Z;cmARPx1x`ND2MlFUa>l{e_PA8Z)z z3)NLs6)Vp1< zsKL>^7Rq`Tf6RP6UZPqZddwJjyVr4JyH9x~x;;Pn)N~DtCAoyl|9G|}sJHf8-&z;6 z+Gb>+At5kZ9aN4;ts-dKcL2rHK@Cyso+p*gFTkO>J|saITU%Q;K0X=$Z$H}F+76>R zH~z`1^P8LUIWN0ZM=d)s`7S4m7ZaD(GMd; ztALrHuiwbonSV5e zIZ!q-=TwX5#NM9}%lrNvm?K|HNwJsUlw~BAupaLVVtq%sp@ez)u>w3>n;Gfp53V0w zG-6n~{lY$fY@31Ccc6ANZ^C-wM1IdPbW{GMCSn9J85<$8v1PmZe$*s`h1>~KQf6;c z5eY?|gx0oiaH`dngJ)2d#zP8nj$04Qt-kxUgi)UTgP)m?!f~tVT{hiFq~k#L;$mvF zprN-TI;c#!Ww%u#l~4?81JGITtibFq&iC3nc6#N$| zh$#e4S{%GJaaIMkH9~#BjtQ>fsE{dB)`j&Smc6yQmQ;N0qn0w^fvdHF-#TuDyoi>< zk=kAxoObN`lCxx`;@&{LQ)0!SPL$MVeUCj1P)9LUigff08ynknnt68GW^Lm=W!7~vf_mm?jh0_9hx(-f2k2c!$JW+A{j{4q3zc~B+5`C-nD z5u0bDeCA$?uUSqVg&fyGG$Fu}Q&m$tYq&_9gjq7qk?ip-3(p3a zEU0CWYhcGXcUL>@!iI7Uvq(k55_bTO?>6BKm#T<(jV=hLYns+|1J=>glnp+pAnUG1 z!BT~$2EO&(K?Yh(8`-{;u#N(@A+cXqX*K( z5sJPgAj_5jMtliXhcfc!0x_`$ffNz3WOwki$jKTkOm(OUO;2lJPtVpF9_zpdrKuwZ z%0fG|Re|tO9~1IfweqCkhY#QR`&0G1ku@%Y9PzStlT9uH9>?X5L-%?%pBfo-LbOTR z8ZsTU`oX8slF#U{q14D6ie4AcZn)3O+oh*QVxN_H^0X@~HJ|SNlOVu?%JC*NenLYz zF2=|UrV8s{WJ%xEC-;Z2S4um|hN!~9y{|VB9=kye>ilhXMN%e4-(ul-g$&5+t#Tpg z6DLDgdvN*tv`E*iH2HC_HfUwozatpi`)f;;i=DKmRm;_8KwWjVt}cD)0yonlaDboy zh5Z7jsj~G-t6@S{|;!!CnVByM#VexTBZrDaH|OMxj(_TTJHmmeRq2 zm362I>utF183-+V)1C>qo0TI^V%Hi;#fvQKkBM2-(*OQS=1bUGQc3TN*!IN+D6E2V zQC%*xMo=+pX^JA@4mRbljj?Bg44H{WJ|sg)SeAQt)`Zb`Mx}>mtN(uhb)#lndee;Q zTgOchgXGiMtl6f*wT!&^W8WYnV?RaYPKYdjsNwFa@QC7YOZo$;feBnKoTeUtY2HxfuB^74n4x*Sq8zUvpM+{-kR&r zsd+zPx8sWuLz>hg5`G3jOFf$IUqgB~M0ak6XoTS80fc*YsU2c2e}zV;9T)#x!n}8hdJ6P8!HD@cuL)Srs>93w&=~i*2 zlj#iO-d3i3lW#*mmw)t$((8JiHEMQ;5M#qk@WUAfd_x#)HQ%ZV{?pV5KjwM^3i-&w zVf!?yH6?}~H2vElkl4t)p%dv#rRo~xpvI#k*3j|X`k2%yK@^(hnG;aK_OZELwBci9=f}`L%O>gL{hpN>25eQD0xWf?rsoC5%3Pb_r1@(f2r_{XHT4& z@9e$SXK^lc+5Lb{Xd3?sTw)tuXy|v`_HJs~xT=bahYxDhQxy2*3%meJZV|E=uTDNl ze56!ZCb;}t6^4tb>e*5ps^z~-9hd7qBbzfX$jLbnD-R5LnDqe9>IC5D7&lYqKX0x^ zI|6VA`ycfl_3TCIs0OW*5-Nw<7NQt0|66J2gjQiqko;PifG`7(*X&8@%^oaS^Na&c zho%N3{IsnS+6(nx2bim!5oXLLL`nn211Er0R_7WW=aXc^ud6=6xT47Q6%a5i$S-L+O-viF50JCaLJSlhok2L(|0^JO6-2RmanCSvj}!FYO)uvG z>Ed!WYxmN|#(zr#)D}WP!B1}?=BJIxciU!D)zf1Biz|K+$7TO?CQvln?s-3AAu#O4 zOYr!hNL75Ok=X7-4O^Ozg_0edHD?cFu&Yxw($0mC5y}mxzz^gMpNfYpvvO(hdAmWp z^%RZ1p8}4!Bq;8dy*rUMyRCuN%JN|;g%(jl?7x_Ym}dJXY2ba$JF+vs~K&GR}4 zV;-Y@i0z?&+u1xo;DHt72WROfCHpHm%TH>3Nc57wb2UTs##rAx^!9_qKG%4 zRX=5LWjA<7`DJbgS+!<p{a3{1AJ)6lf$1j?O>)BCD~MevdOa%^Q6Fv9n7 z#o5`&d}Fd0?r)uT(`YeP4!l;^ z{y1mhBvIowsc9(q#(TIUFqoO&$FkR;xxHGKeDZxAiq}cFp)GDPox)`u~1IK7E-T-rKfJU&9&7V<`LZU}$yqmwx8xHGV?$`R-F zV>&x0S=m1>A$FW|il9RtQ&F{>WU}P2`q{c*(#_Poic96E=`gg|?)rzjvaCJR8W`Dr zta%Vip7i*_&38!=uw)YPA5Wt;O34cMa{(a$?qFy|2umn6U2So=0c>blB!K^JN$G=y z&WiF{WhF+?v55z5V^>3DJ2TZ!4$?Y~Wx5Ct@opRa*6d0KBA_XBHR$ae1R3j%UtQQ` zwmxH7S<`ZUv zxLadu+*fRl$A_w4a#Q=iPfIZ7EF|1ts(f5vNt!rjk@z|@Qn_yP3kJi{z*8|9smGKfa3O1$Ws zbfwWqhU4w%BdVuhpSS2ii!fGcp2_^^?r(nwgDlC|4jXqOh8sSOC8p4y#h`ib zT|lgVB^AOEM&3aaW&lP)Vt$OaLyHh;YTdA<;pa9{JuN2&KRKEpEt-?#O#3T6gn;TE z%cD09qr;%=lZuspN$xASHcT7|`Oz^;LK!6=ljNBT>H^N~)_&|M2R&kL?$~8sQQJ8< z?0+WA$bbOApwinFfCKWT8{nA~UA(^RAN?L-~U)E|G-yg1pEufVa!l3e(3(V@-iEV*s&Fr8mF`GujKo z3(3#bhKwl*_6G)DN@V`14^0#q(%n>5_p^0BS&HP&PcyX1JRaVXisk-j06V94T5K4Q zr*q%@fWO&pX=InVezY3ranMq1$?^SLRxE0|UGqMDrVrCtg@N*LT#V@qUANdc9{0CN zsMuFL))zvzVpTAg)z6$5w0G;HaYBzrp+Wo)TVIazzo3pjaD5ehk>?1aZVfXV=!F?y8^7`>w+Q?OHLl#!#QlySL6IxZ76r%QwkxUkC zIqk&dV?RmWr5M}n5DD+{lWyR4Ys1tPpgjD@vfBz^>%ck;lMpr8N%q*um_6P@H4jmV zvrbOgdJHAASfwIQXY*Zg2`We0c!N9Z4yuWB| z;th(_klkIvc)(9e!snA82=Ji@%Y!D6Y6M~Qid)KK`jrwSQ%kUDF}4saJn>015?c*j zAh8POc~b^&J3O?kRU%O&96D)VT{i++3%`%e5f)w)E*1bX-@N60MLAUL5@P*kNOJ z&GrWh>xUpmcox{tZ-j6L2TZwkkQyRS|3L~(;0=cJfd-o!qXZ^uiXnNGpZubXJ@GF# zGE4%wD6T0+)#|rv%S>F%eD`M8$DbEhhrES(P#rW^qZWA1_rB(_-2X-`lmZu~iRqFb zIcoBdFLk_ZEu&`1>|uWr8I zV*2#MA^poGXJeX1C@I+|9SELFEK~%Zx?|aR8$tT$XW2rTJ2$P{H@n<{8?OFeCROqH zotXz+)$eF`3K9`d`c(tN&pdVVfMM>>tpgob3G(O(g>B(n(`H)>DQS8ovGBHa`rseu{CS&-7 zbC>>;=GAfg!K}i|*xj9sW?c_9yX&m$`D=pHU{t%vu|gpt3(Geiqk4?og%V5W@ejNN zu|M2g7tpV*2S=H9{e&Oa)-v|Cd?x&#oFl$BwMRS(zHKR;{*uF=C~5dN^0O0?q_wZO zie!M6;Ob}Oop<0sRTnlpip z>_|kWZ>Kp|+a{@zFoQu{TKs15gp=zz3UqhlQQ`c$Oci~wZ)8n!oJ&qILcWXVtNw=h zB@juoQ{_y0*smGwA%djgt|R^)_k7(&;aacK=LT0Zdc-)a9>+{0*t|w-9?1MVg!DSElcifkIcnwRpMTT@+u@X0W0{o;{1nd^7?c=0}F-tNcIhTj2!^?vl4a1nufqFOQ z1D78Ua6A5b6z@7J(O}6)HMwYWgz+1>nBpypR@Jc2b898n-B?30;H8I2M<<&Lm-w9D z>HmfvPvYVn%wAsRzis^%-c?%6w*PQA=oGV4an zsvtUWu~B1*7OVct85!(0C?!*raIILy{)#C+Cybk>SU7SKm6tv4dzjJiapj1@Ru+0O zNx{LBslutjdwd(4>;L(Z_^#nLE^ra#GB?yU$@ zAe)={1re6>*H+fSq?r!AC>^GSxkjwHb_oaM;5$YA8hz(pPz%}wFCk}eLatCl}@xJ30>4rn= z!+8OBx_tL*Zr6UreQkSctqdyDW|1pykT|mpwDB+GY69Guw{iatl=O)>v}(i$lyB3F zIx>5Yzj7NDZ4z&piAHHtXtQo$hHwM+Nw0^Fe~<~Es|#ad<6Bc?+ERa;<#pfY>%m>$ z2>++&I+tbB)8b2+@Naq{tNBpnFB``8xyBBMO`Mep#ksV-=Sn3DzI`-tH2|&4DGI;< z^@tqixc$U?i;Jkt3~3d!F^%-Tu%Nw^w-Z{CI;Skvxx6r+R5b6_=B=@ZtW4J^s1Bba zxiq2N6vJkk!yb+$2QxZSMUlhC{w`C|*{!$7&JcEHoiEY#lIl_{1U=h&VuygN{DZO>de zG_;eZT;?CpK&7afmwUw@9(SD95^}k}r(`0Z6TAAaj-@|vM>$~`zd{yP*xvD!)P@jL z<^mG>f(xKs592GK+*jn}#MI_xCBP!Zj_d3newWWLf|?zc_S1gYPp2rOcz0a{%H~ZG ziahxn-No~NnzHnUS$TRqag_pnQuM^ zna4sYEH91v3@B1wB953V=p53`MlC z>QIyT)Hu(d?BU+qO$r(L8#9$n+3)hEH5jeWDZ2ejWN6a#L8f?PiGUN{(rSP zKb(JjuGZ6w!M`L#jxg&k-u;~2Iclp+a3=L(;>{j(BA@G% zoQaJ6hg^E%XbB6H4|zEV7_RAe%*M*3lwJFVV2_QCu)^bXGW@FNf1kkVeJvmW zEZ!@EN5u0c$k5H@OY$;77sj?F3%wm%oKT9Wn^(jM&Iy{(Log1rfsE&0675wND6upE zu?zsSFr@qe#r+IqLGgK~VIdVHhs5ikMRJ#5O_ZPJQY}n!lQonf-sXFY!*fA;>D`F_ z=$`kb0M`TC(-A(2CBEPLTp!YqjMJ3)RKV&rFhirztNz(W5o8*pPlY&}QvQK>)5PAv zk5uq!NXxdi0lz~55ReH(-|WTxgmL}{LMKnqjfbYJA@5_U>6IW*QlJW-Qka^*(d~8%d{$t5yHza=a4DD zB%+3ioy{mo1O@%08`GmBjxw!T|I!n}*{joDknDNWv1}X86=S1BE}6TCGzJnwYWPy_ zysUDbr`!GBQ5cO^L>9diL$uz6X&3Mb59;&+ec_#yBk#s#?=2pvpVDGNeEeICaF|+e zB+{L{Sg1)CEa_uIGF^V(Uz3UY&!0b_e3nu^Q=#kY?qE1u2tCY@r9_8+u_NR=PW2!T zXUU%JSp+(CYR2XXuYD6gsohWoR;{rK`f5uUez>SdMT-f>tFkr^&`=Y7I8HmzMGtPH??QisKJNz z*Xl(Qv~8_0R#IP}h3d+XY5d7}`Jg5!jVU?*h}M)^_x+{JY};yeOPsK*ZG^N?M8+^E z6miQWIGXVE&1b1<{PP`I?JnY^7cyZ0FMP)VCW%irv30rXG;Hq*+{8b?E&R0e2&16T&RU%_%9 zzdo#=PDl^MW43Rvb}P&g12V2x=m*le zx1x;ASl7;upU&8MrNKZ=-ikg#*u&s`?owx_W(x;dPHqiRnb?(^FD@@uU9)w zZ3&t@4xC4K$xvJ(&5dNmY$@hWS2!K<+s8i=f(T8jrSddWUd+?hF{Zx4-{Jwx* zl}ILywK~A^qJykkU*wj2JxxmBR3Hd-bbx=b4g+)QhefVaz)OSj1pI4SgN zhi|CGzhXe>5_5@xYZ>U}cTZ=DU>1joz znyu!Hm+;rx{}tcm{kOa@2CbXSQi6?JCkk*9_=-77ff%+8H}%at97PE1aWnfkalXf` z?RV zd)xV36vwjqGWFmzz$<)0q+!;u;%8z83fe;Gy63S9j1yz@T@E(O1e* z0yw~ny2YfxEi45mEz7onAl zWN*l@V;eYM@1I7t4C6*K=);cFJDhH7&MGg_TYeB!4N(C<7hG)uW7EQ#^?v`J96Fqu zNhM3%D%hq+FV8D!!$(k$z5Ff_7;~ap!DB6OEgOiE`1qz5591HlBK=s1 zO|4@5R#eG0#tsRsAb2T6KDkDs12v?O0!aeq^Yhi#*;lT!eybzXnJR*AvaEm0kVP4w z=1WV~2fbr=vPJ3cZqFW^x8X=mw#!w-3gN=U)`KV5$sN{^A|kLxQToLlF;Tf7ODRMg z`@!vDu^5q)#7azzAhR4IgX3p2rXvg6qnDbs&Ss$IrdlfX`KLbz@Rd?W^F^0G(UKhu(UM*cI!W)1mX0 zRmY-*1+AD%QNvkC94n<+eC7dF6+ zsw9!!Tz^j{O4D=q$0RxA5RTFERa4vV6q8as9hLZcw#X%Y2ftzq+@1iV#*)Ek0Bv;B z+H=b!4zJFu97jJe^mat29@Wcb(?+`Y@V-z3{+;W!nceXDwM%P*hzulw9I-8@QA9f1 z>F9H3YN2TiRmt53`o&k+g1!bD2T2Gg=Y?G^6sEu&hhV3E3GYEXvhEU{F_KSz@@NJ- z#`)P(J~sLFb)k|I=!Epxa*wH-t z(;dNVU+^u+27mqe$@e$%UGjYNqe<8Y0#n>iepS7O!wQwyp-2qXYE-F%P^>Sis?!Gh zf8;=NmIdU51g-V7Kdv)06V;fk+SXkdANXPXrkgulm|7*MB|t}c+ea!%qvd|WdMh8C z-ktPA65gD&F4~{&FX~R|WiLp*ku|k82YNNlHye#9#IWj<9P@P6so1fU(B{S!9wbuT^PgtbD*a^ zvtk5K7KcIsU$8(Uay(W&HB@ztp1PiDj-_&`49np&$2{){{(+a@$Caq=?K==jP!gHXTN9@I}OX&jZk|uvzB{^R=)RdRE z0v|m4F~M7WoRJ~u+)I*Qx(#^wbLh6%5GAD29~p}^v(96!o`?u>iEQ0NH<1#yXx-VP zVuNQ1q@lnO&siTf4Kb4p!C5aQsOcEtSVBi&CRK&up8D4K}jVdC>d*E8%0uXLb>XMx5ktvj&5dZtAJE2z|xq zHVQqD08@0N)-lDTfQio6OBpt1Nv0Q`FhU|t0JUUvkMi59La%eedZo94St^H({nL}# z-Ol0{nUi$t3jpSP}{bdbpPVkKocLBj`^^!%b?{byDDBlU2d|2 z6`vDxfLu;((BTpLG9cggJ8Zu;t-{36S8i>7z zS?n&i-`WaSugti2F<2LbOg5ulrnE1s9gV|OI1>I^Y@s^ z(wMBbM>LL&g4rQ^4Pd}=p|oA@e%L8s#5YkB3mdyXoq~&oI z-G)gNWkO^v(Bq71fRx$V9$u}ZY2JYEWsM}rihshfR;f+2_fSj!INyk>h&l%s%!hz> z7zq-qWVQsxF&i3NJeX{WcFD1Nt{)YcT}kTM@L5eM!`#8Bpu#&6?oS!h_Tv9|6vRVL zu^VKYoBjQ7J!@-*2KjT5RM^DcWP)i%B4|ZUhfC(Ai(>S1-6ccUsLoKD8|hkEBmjkc z>2;i5%0lVeQ=gj|E#IS9aG*m9^mvgD|ACMueZsbKuYG2O9{$(g#t#!~w%FP51J~rW zdQk2FjEy-yT&rfY-DF$wP`B>u<6HcDBo?oj*CK@^if75vw_!`xc=CI{(1P~97j+j) zF?RCsWubeF^X$O3m10xZASIxSzsYQ4nkIs2N@j~=QzgP#Xa=9lH3{9~544e%#U2}G zQtcBrENb|=spC4G)U&RMPDsodqs=h43LhLSoY}f__j{pGysg5`4%3JV_72dw56Ga$ z*=RzaTD#H1F!E=)&>$?de+*0KkYZ}bqM@aju}M02{-WkcQX@z?##Zjq6 zETs)=BWEb7hf78o{)XK}e}@*#Acqz^N_6NmuR6xDaHO#KS^ho#3|(|cxns<&AVW!T=YwjQ^uJm1GF4sNwFl64>tIVJXA&Y*%rMygXMw$&wg zt8ZqO8$&cEt0|hvuQBLP8@5NjSjYdZ)bp-Ww^&sR!h~hQ7OJvqP!BFwKTu7XmNj~e z2N#Zc4|z{082lMo(f{qObRP7zLw73fWAd+F@9b7lFEWNYWpZ&ess2dn^uE185JkYO zBKI^vbUy+Fvs~OX-UpdhM}0^v#dmj}9S2!yq{dVug9>pfkHgVo4sJhk$LIhTl@T)e z43Kq0$Hm1p7$|(VWLDAInm$NaBRw%qjx1(L2xooCaT)I^Yq!v7#4&$iRFth*?DkfU z3KmDLd>OwGzFm$P7AWYbGd6JN$S&5E-Wylt6LOt+Kr<>I2-OWa!_TuQV;L*FX|o1A=nd=Ip+{(J0u?WXpn*NdBSNf=TvDNvmy$5`|Y#nnKvwv+ZW#*g43r0Sot|gc@J569X!^xVhPUAvp zf9Bk}y1FvUhh19(BPC))0X)tfh^QEDV^4rmHlIOJPtqcH_VwJC`+=don|@36OBv%y ztCDDHvne394QXjcAvHOROv#J&1e*DmfJQV+GqkwYzBhu6 zhiCYo;m-@t>K}(_4h7naUTTZ^>1H)G*xNcBC=ni|soX79uku$QX>Rw|ClX%QG^uNeKCnL9%O({0v$GZIiXorJ%ue_VgWcJ{t| z0249{!=+Ss@X_;x0J%v!f5D;%jURS|bO28gZZVNE3VElRPKE|4ks2%ixm0VG_TG+M zdO&`C-DvcK!-TEft`I{!EslI`lfI2=aYKwLT_UZ!+F$k#lG{Pzz;pzMoA-~)Qc4;o=KhM-&r{d{Io#wz z#b$1JASNXrV6()eG3tsb3qRkqMJEm?8MWBsE1zbunMo}`8=w^SSs+Z$Uu>-&y>Loa#dW3`_0z2D4N;N_{ubWcFzY_T=w1h*O}lf zbS>tc!AhA*w_KAyq%HXt235Xphh)!pBM^VbBkDY4s`l+2zmX{UV?gvD%Lf}g!`aG> z=in~Z>?_|@yS3qJodSLvmKqULvQ5`I?6)~i@lwfC^7;zovZqiBva*WM=6O?afx$Dc zkz5OoC8ed|PFKe0ZiX^lK|)4QIzZd>gZmfYq@6=;z4wta3{Lw=5Cmh^m=?w5ocNy; zRFkul`dQ})n0nZrda8SbeW}JlqIGdN^@I*FtyJ6U{}f?W=rInp(!7s>Q3o67^3>#6 zO4=o{ol$14V(1=4UT2LTs6zA4jTnfmjT)r)REI*L4yP`MOdEv%3}=J1q%Jz%coj<;3AJyPRTnK0LT-o*QaT6j#CrIqF`*C_w) z`+E%KJu#fOCJT{bbQX?Vbf%tFa=COk{}}zKLwTE$cN8m3^+$=0D;#7qUI|E-n{1vR zZ*N8!>YV#B5v2;;}thY>9_i*=)vY8&Ey%D<{8;CYk|55dc_$X3gRShoVd)SpcArt;Rc*(gzn-~1CuMeeH>Z5K4jzfph`=UiCK|@(H z=L_H&C!3K0z2AJk@Pa-8@n^B`&%|7q>aL`C3oY@)J}hz=%x1_}!|jVldX$}FEZC~E zWmY-q5Ocn*%A}S${YIP{hP*w^_~6d8;=Yz9RTs}yXt#VsNGM9@g`5}^uV5c3R+tU% zem8)`#C+kq$QcNI&e|_gz9Dr=p_D+=Vyd=mD>czP+`$N6CC2f2W$heSz8wzWy&u%qRkUI zyanUTK5{5Z=16=`cdAzP+PLslCp!IVV?);vCd`G7r5d-&n|?YK?bsP6!AwLtiJ(7) zA7N~yDbc}s5b7AE0B-3e4 zrRFux*#x*RB3NpDh~MF0rU8C#HZhKXo=@TTyY1-Gz1u#gy=^QhcP2uYg$^0 zvE8Lh6L$E0gZ{VyON~;Y7#ypIn`$J|chv}WJT6Pez5i;bn873)1OFK}M~l8mfKHYu zL>*w#{`Ubt#R(NY^I0;@5=5CA(4M0>%TF&nuEc!M_|9fs?kZ(hFdt`jR7QLwEp3}M zk;CJ8Gh_3i^A}-*(84fBS8PWEdZ??kM8|lOz51j=OJV???vmUL7F{5#XG z*CFGP|6NrQ#Yk&E3c9^Qjr2P0QalnT?_w*!$XB&COh|;gc+jTT^E|E=&edsbOH9mJ zm-qquFuXz+Z*)3IQh8T`@I4V+oHoBD5ld1lj$|2wBKY^d9#~H(j0`>sJ(1ZstwtE@ zpnCCDOCicI5XL$mPQJlKtV+SS1nP2Uth<6S`MzxC=U;>nK%?HY6R(|=fOz@8+m8U- ztE4fR_JY7MyaS;uueB)JR|kNs1n9@_ z%$IH7Q;^M}R%K?{8JcB9n!AxJV2Mj8;N6$4u!@u)a%xU%g;^g1^t>g#?1rhK^Z?vO zWP_vx8tK=vcPS|hgBkVXg(dQ=bL#rqY4fti!dP{Y(W&JfgCbXLTIM>Egn|Ze3&ZK* za^3cxVwgKhz8cD5sF@^u#tTs~l7Tk7b1yw1`JE_?WrBpmwr#M=ZObNMk7&%)?}2JE zplpwkpa5x7o@oAQ1ufIKjNWv44Px(H*< z#oJj+vt60vl>pk7oK+29p^^tHSF)z*VGNq|)KX`9H1J}sz=;I$hfzO|cA&cIsDIj; zX$O^JidTD9;CFQQ3;l-e=S+!+Q^x4b$taPNI)B~7^uJ98gJZo~Z}#@ZGU&tMkS9*3YBM7N`3b2!6v+@>-ar(|g)bRe4aP(c`ziV-U9|nk{w$0Tw8v9Mem$j8{z*e)h5in z*E3_Y?-9aU#GeJmgITa=t67LLs-%J(g{Y83$`C$@;a&2f!StW)gny_(aEI9?>_@+t ztwAjmk<|%(<3gTxuHHUU;GAFKcyx(1f; z^JOyWRO+{NVJ2J`e;N)W!n$^wdyo^zl1sB>{hlAwi#-(Y%Dv3tW)VFkb^;zuUEdsS z1CgspB7>I_0d5Qihcd`t7?yBj^n7VBkvKUqv~t(&xBm?V3_nRFW45J0qxWgX%su~x z%x#>~#0$%io)hd5*t_$NwKOv%^5ZABi%{gY_GO`lFN+7Gh_P33ZR&2TRRU42=%7Sq zj>SKMEcV4g-#c?_P=MddU3eylOUeDdbCdD7hqp{0pjZcB#XPp?>t zqajtB?&!|cZ=n~xl$#|04;vy()6NM6pdmD3$JCTUj}T%EBT+mC55E8)om^4C11MTF z1Z79NvmiF}AnDGOBo@5wZ>08@Wp!(J6ajyW1CFP{n2L;Wap)SWw$;K3`SDQQLb5Sb zH!&$9?@DVtumu9Ia{*T!;T0bUcTwsv7T3ht$P~2P3 z?{#*URt2!0r(hw=YH2eFhZAJ{e~wYY#=1qg<+h0umm>%apF=a{>|*y0CEo`JuSh~5 zbT|E!-p zaITNoUjCLVi%s4Dy@&oiRh4g4;M_v}0!Dqlc;kn;g(1zb@L*&1SnZ7S z#Mp=Ie7f5PLX*~c^Xd#^DU+fJAxj}Ol}*R@MY`;d`+Q`K7G~H7vhGF}&0jW*@%E6| zj*nuD`-+onWdOyN%#Na34!++qloCCB++iTplad^;^Pbklm;rKP`T z8yRlO${$RO59cEHuH$@7V8Po_gxlGm8$k@y*bb*gVT%yaFI)hJ;`d$DXMO}By5T%L zwJ}~B*kzVz$bv%EDAL^V3w6EqP*`?4DPN2g@)dnQ!%ho}q>#^bQwsS4?c?$JSkzB6 zYHeLerpPYgx0QmM=HROUf-Za+<5b&_C9b2AmfC_Cny3#U=vm7eBLTzno@JsfIm?aU ziszBTAr!`Kd@%?iDjSh9=?yAD zr?c`EfLtuOy;+C(g>=KIJ6J^Nia!)NR%z)l$%5+KP$Cn?6ma1ke!|%Sy zK*j+OuH(SE;ZVLT0<7&13*^K*wTy9ik<-s{02VWHnkaOhenl^(urG{c87Df5LX<-3 zP_AIw8=@ zvNHrfu&vE9{+vFuZmVto-YSdDn6Fy`k{~hNu0M~msUoqw{byQN)KfNL8<#3UEruzP z61rcsEnitm;n&!Q{nH&zk5{`r#!%z5^Z!#z)!18UB84Ob0bfC)35ys$>l9rRQ|hFF zH_X55MaZY@B{5w>0IMz~jxzpy^ZU%5`l0zVN636R&e+hYvo0p17JRgTHXD^ebz5T8FlkjQStr1>9OizW%Lkx#vtwn=2T28^VM!`AtC~C@MnB#!3HKpF8ww zW}2OTVlbA#x=vUD5Lp;LRg~l$qr7eV)4(;yyJhlLLQIED5B7r@(TEPnfn>v^btWcU z&a(G-mQ0^sn`0bXp0&?|k5avzM88fhV0hH}de^ zQ2F_6`UG2wB!O@hL5&u~lJigbB@T?q4%x*80t{bNz`wcoZKwnmTIEp-!O?zlHPIgk z;-fF;yRG$@&d)sDW00@={8BS8A?g%&8iRj&ysTbBbwK(Kx0REwCPHw_Wf9;`4nz+=R?T$(9n+otHi@m$?TuB zJnGhnM|#@LDXe0@sj+iWV0JDieJm zX50e#gNyh}@mgxf-if@)NpZ{9Zvr#L40WMK?Lw64$UcR8#oF_r%o^Z4H;uoC$kakN5L750LGkQEuO-d4=J(9`Pu>oy{LbtsvBXYMmeZ7v{*Qisn) zUwbx-h<>n+7_Y>EAxCxb!p&6c)Z6t7blXW8`>AEd=rT%Z{u$gz4ad^|6=Bo0P$kICbbFQWgX!90sARAM90+_ zMG!i`O~Yn;dGs)T7GMcZ;Kth_*|2WgK?~F3~ZJ*E^qeks(8==Q_gPq{?2(#s1j>Mf?71sy>FLC6v~Y`nR>rPTGGf8opSz z5JLX&-&z!@6;;^J<>+oq8kt&^Y>Aj$2CTr|0{2l=Ao-6FY@ZLPb5gWw4P@u%=l@IX ztNs4s+qjzCNr^P_%4+(5*o+OiVs;k@U$rF=i^DB={SsH0ZliePEXv#Y7r+<`0HI`m z|NcFG4f_s5!kq!g(-Qn%7sbFFIYfX2ZQXO#fjY`(aATfYw2oi$#0v0vrZKo0rT^K=(05PGy z?CmB>%(Oc%;}hmzI&&|lQxX$$ZdXbiAXx&y+71-qvKR@R^mKIa*#a)L@2M0A2=_MR zovJpq3$KRoT$cv}zTC@<8pJH6L6c8Kw4>_XWe+=uJu#BY|JZyCo z@p@DkTu^I5U;N}j0OtXx_Lbt~$%J8p*%GB>7=O4qSyO=DB4}QFsqnc3N`iDz=e7Lc zVm->%S@E@I&7U;hlMyA=vr%`Vx!WrAsTTyKZ8;jfa}ti5veg>iy;eU>;o}2H-~NnJ zaCVxJT-is%9U~p7r}sdgmo-!dsET`C;(uDaetv!|F9de=jeuG(aKFmZ3h7h2(>54Cs$FM2&3A-IJF0lpotF=^-`L9hRDE94M%$ zLkD`e2Rc}l-)ze^(8J#KvWBG!e)4v^p%gYR{X&G!;^E~ta8R15u6%RjHY?zY4v2I$bOuFpMxo=0Ly z#J_UxOkXuvMS@|tg|vv3|2HDhvMB+nY#!*`6X;rx~-O+-hQ!=(lFrflu{4VJYvr7E2^0gQ3ha`_1 z_dU>i+$JeLu%S%}pCN)r+ZRXS^P}sjA;b5tESNtb>k{T&>@}uDUlOJC2#$4t z0KczcCZ;o!g7-wNAHr0`>(Q-x0M(=%*bo7KVwS#gSkt;Kh-457564l%P;L4((l-XsOp)6|N1m0;atZkYWoUaxtE9~I7nCfL#{a0 z;_WDjfiF~FF^0{qqP7})UadLS@AaXkIh=0Qcu636X)03Y5ZLVsIMpM=yCvs6JJyIq zUjxGb%0!HcbjNbgQ>#=fx+-NTG3)(lUCo#g3GF#?l9+;R3AmHH*c82_`uiSsPJgz6`ovUomN8xMW7`%LBm z&W{ropH6y-fMYBc2ul1ZPVC5sV-HA(2Z?54-=c?Q(4?ZJcLNE0#zYdu$?ku4dY0sT z4SR-~jHheHPth89il8@<+&T$=rhL-_=#$$2`#3Xlirm66TpIp!nWC{pZyZJ#0j#J5 zlxIC`Oe7ETwW%3Cbr6h+DS4Ec?1?iQA$}1q+cH8wf!h3bT)KOUbP6^_GG9#v$kBSj zBK`r~*p`fP5Ijagh-#Dj5h%o7q8RfHdEWmB07<-fHU==}L)Lq>Sa-&*tP6>d8O*t| zD@H9CA_?{Mtbk-!1x8@OA6m>|9xGn{rGOO(!384ckifko@Lza=iy`!hEX|z+Z!!cW zOcMz|-mb!h#y#_J7KN#X12}Xvu)u?t;Kg~W%aQ=^O8wiaaw0soe@JrkPb?sM4_Jp^ z4}0UB#Th|R^=NorGdz#UC~~dTbnAD*fv6o2yQl;ol53_rwWBp~8psVLisc2Wbb(U` zN+PFl2-ckdwg^dpuSix(cBe7iHS)^N2Yuyw&wq)b`V zxb5rz`!$v-u4KeJxi&_qiZ{LSHSDc`6ZrM(kACw~QEtjC1Bn@8J`@)h0*W0oXd^#% zW7w;783@IF@C4q_0e@s@35EZ?@)CGm8@xIp@s&FIKrwNFXeb@;&sJa`qJX}zP=xv3 z*OXXbw^F!)*BWoFrvLp1M)J=DSAwL1)Yx7~F5>^`>&(NU>i<4omP~e$F!rnoDP_4W zjkJm^l{LF4HE8T%vSbYjS>t9%Zu`iR^;VW7^h1_xNwN>J4#Pa3<9Y7udamEI_|J8X z<2&bk&-eZLp7Z{^-p@LlFVRlNJDm!L5$p45=am0x5o-TmBREbXT{S%Sl9BKdInH%Y zc>e1*lpNjBYG~8EKW>b+ua;44q=~3#S8fN(y1I!hF%+N8|pt z2{dvRTY z>7TUP-!5<8&Y#PmFM|8z-@k}t7QDJDe)o%SPdX>I(EQiOREMy_w8CNgtp?rd{p>$X zveZ5Z8G?;3?gyr_Ge_>{2MP0V?Z+POpCGpfgQbBnntR@V6&B_Ir>JMMk?PM#N0Uo- z{}ggm=JuETyo^uudnQ%1tjbSF4LjHu>CJ1ryu1_ZXHu@OZ4A2{TkcKe8G%-K_wRuW zk5;o^zm`y4Y377Jte4xR%$>($)wIF{Jb4g?)P)!bflsS^Fl0FQ;WSs;xrfI^9rWiT9al2zS&1x~yR$cX?^nvRkGg(fai7gi z>QR|azi>l+oeN$MH4@(8rhgxx6H)jlc=|2S)AzY~RU?m>>ZyA>NFc+u;$l6*AVgU)xlDm zVA~3_M0jDT)h|WcK<;!oft&8SB^q~SpdBq? z;v5r!Y?_qk9+>WFO{$MCeA@e&Ljy-#Ow?t0%R28q8rTxJQ4Zlbd#1k{TjkF7=B+-( zTc zYR2}~vM`D4ukxQ!=EP>W%ULVY8S7_{#%t)wiruxgeq#4DIy!podoWuJdOYRxgW<~P z@(G(!r*W0=*bUAq2N8fy_ss+RYi;q1j5fWw`Hu@xVyVQi@=}=nCLkqOJJV< zSnA6JQL#g1GR>vd?caqout;q6mdmo1aG(KCM^CO!yj)cGbiB9@&5wV*+5H+^;|BrU zV|Awevbu@_aJncllyINbU&saOKPa;d8z6@$eOj!DNl3WQ;RuYsJW*hv#OekZX&O~* zu3ur1OO}Vb_swvp()edQa!aU;op?r%ZW}*rcjuuX$pJoKc3)FJ8-9|Ba!`DW@GG zdwP3~=02QZ##Wh|mf6ye18T#`0owD*#$n!VDd2bKt&YaG=TIO|;1|C9*d2F{0aA&@ zJECx#n5aNojmLZfq!7hNLavgTnOOqFsvEBC?9!W3BHk|ym6K_n&-8;!e(r+|8q9Yt z8LPSS{#Wyhil*>+lIgBNM9Ao%!K+TOq$ZC*8{Q|lm)fFnuk~L2l@4pb$d${3w8h5l z#SUAW`72?X6pU%9b)aq4a3Vws82bRqF;UCrJ#}ha;}~cworp1#F9mA!|B1@KixmVf zqk=H|;kQtVB0$)G4q&((pGgV1E@89~st_TxGuSp0A(N? znFnU}Vs?p6Hu{hf*J^Srtr78VSNhdh5H7RWwz?@;ucClM)5t{`q!Zx<-9N=DmlS1* z-}PwNg_$)SrQUk27*43YsQ+TcKn%xhFso{KtQ&L#(rbo7Hob7AM72L$1)&PPYMa}h z3bFUpV7X)!JRG_5=j@YNFXKBNNAKV|&#KMpvR@0V5L-Hda-fszha4I2g-ygsBTEDc zOo~zdfjZ3yE;T|-`EzS-1uP$r0bipYUyJJNo7UP*E&;3PngwFVY2PtKf|4wKrPaaA z26&ykqYGOwaLB0E3bnTM#Np079B=UN+b!jZRo^f{v>BFNq#Ye5taG28b;=^l-kY~> zwUn$rmG=t-&sS?5g9Y)jppV$Cn>S0>z2Lg_!bdttlXfvGp+Yzi&Q^;K;W%gB+tj1R z7MR}Gy2tZ++i`_96Lb5ZNAPv9X;Q(|_H)t-j6n6sorhOCBET6yZIKVaXi_HF@___5 zH#ax4GfvfDngz#uTU+>gli%3J#)d)3^ybd&TtUe%@<-ONVA(a~KAIG4LmIaP!+~3h z>)VZ0`;8KK^ihNopv+3C(nttg51Wc+NfAzJKmC&K82B()h;D`Z7%5eHbdWTP z^NDluyU^*SL&2Dahr^Y+Ff(uo5VPa(A(W-8&Ho2yram&QGKLERdE0ncsaun=l75T& zQaKBQWxpJU}rg>Xl&W;^r}bYHl^Xg5YZqO;r@_$PIcdz#8Wr%ghXKF;^ZVXg{#1QDTx*4VghWt4L|TohaQ}3XzJXCiBy^! z_Sx$DiuX*#fF+^4OEv2K#3}QZYFV?l;j&65eSD=`)+tRtD$R<@s^tnVmAXw{`c`Jg z0Q4oR4l>SXD$#gLGDb$Di*Z1uONW-^YLdWLT757kmz^I_4TOL;vk9KH!*{E1;F-a} zrg&CS(e(<(+-_vqOj)SV|1`Vd`EadnSTrtkM?L*;1Tl}ogB=M!tdWt?!rA?;6w`ZU zVP{^g9jGV2Ks%@-JVDEq$CEqCqRx#F*iqH@&ngUHU1#sR-KuMK)Z8)UJ|3<%(pPZ1 z=tpByJu_?>$dZEbGRkuNv?03P3DQQ&dw-ld#a_#{VxsO@>)+=#m8QLH~Hw%S0A-$L0i) z{wo^2gY}P2XsP%_=vGXACSLV2?_`QFf=aD&02a|c`lCoAIP ziW8$=%UDBm6M@vWWXA2K;s)Yk;N_*1iO=@v?-%DV8K|tROqg=M!nZ@2*6hwC2#Rga zjxGi1Uk8YO$jPmL#Rh02O~gpp;669FJf1`5V%@Q0z9z-txf-jV&pb#GSw)u_sR?>i zxt6>iWvQwXL~WG>tjmni2{WOw9@XY6CJ7dZ>Fp$UcrI`#M)?O?b<5W#?TRyZMy8b? z^P%ZbM@QD3-Xm&Vu%O{pC`25yA&Z&|Oovr(Lp={HTirF#Jds&koB$i!AvLB!se|?r zc6U~MQ8wqB%QQeg-@lp8_G2!4)OlPK)uIi#Hy>$Gg3UZ6Y_nn<^9C$=k9@eb$vN?Q zwqD9}500HQ`MbNx{|#H{dC?6rtQxrMih?M0!QdA%bqsXqk|OaG%t`&wr{Bh7Vc|JB z*8XJ10`>xRapzSAQ_ngpudvt}$9x}@ubC08+1(hPg#!NP5m~W>tY@-EmA#sa462F_ z#$8TFr}3c9s7Bcot$g!+zHrRSN*11wg>Wrp*Qdd*KjMiajmp90^Epg~YrC7{nE>`8 z77PV)!pU59u*F%}7$Z6`IacQd-)2mTC}q;ph)aeLlz5uA=!<#>uKnoYxaZDu z;SG(?!65zp*aHy%VA21%5&gfl9m<9OZO4h!0_R(QQfZz1kMtM+ylZm+ey(2B(=OJs G4*CxXL$^Bs diff --git a/example-data/Artificial/generate_examples.py b/generate_examples.py similarity index 97% rename from example-data/Artificial/generate_examples.py rename to generate_examples.py index d08f0c7..7c09091 100644 --- a/example-data/Artificial/generate_examples.py +++ b/generate_examples.py @@ -13,7 +13,8 @@ from pathlib import Path rng = np.random.default_rng(42) -OUT = Path(__file__).parent +OUT = Path(__file__).resolve().parent / "plottle" / "example-data" / "Artificial" +OUT.mkdir(parents=True, exist_ok=True) # ── 1. Normal distribution (Histogram, Distribution, Interactive Histogram) ── diff --git a/generate_gallery.py b/generate_gallery.py index f1d9ee9..649afa3 100644 --- a/generate_gallery.py +++ b/generate_gallery.py @@ -1,7 +1,7 @@ """Gallery Generator — Plottle. Run this script once from the repo root to produce pre-rendered PNG thumbnails -and a ``docs/gallery/manifest.json`` file that the Gallery page reads. +and a ``plottle/gallery/manifest.json`` file that the Gallery page reads. Usage ----- @@ -9,7 +9,7 @@ Output ------ -docs/gallery/ +plottle/gallery/ manifest.json — metadata for all generated figures histogram.png line_plot.png @@ -33,8 +33,8 @@ # ── Paths ──────────────────────────────────────────────────────────────────── _ROOT = Path(__file__).parent -_EXAMPLE_DIR = _ROOT / "example-data" / "Artificial" -_GALLERY_DIR = _ROOT / "docs" / "gallery" +_EXAMPLE_DIR = _ROOT / "plottle" / "example-data" / "Artificial" +_GALLERY_DIR = _ROOT / "plottle" / "gallery" _GALLERY_DIR.mkdir(parents=True, exist_ok=True) sys.path.insert(0, str(_ROOT)) diff --git a/plottle/Home.py b/plottle/Home.py index ab0b9c3..7cb8f5c 100644 --- a/plottle/Home.py +++ b/plottle/Home.py @@ -37,8 +37,12 @@ sys.path.insert(0, str(_REPO_ROOT)) _PAGES_DIR = Path(__file__).resolve().parent / "pages" -_LOGO_PNG = _REPO_ROOT / "logo.png" -_ASSETS_DIR = _REPO_ROOT / "assets" + +# Assets are inside the package (not at the repo root) so that they survive +# `pip install` -- see audit A-09. Resolving them relative to the repo root meant +# a pip-installed GUI came up with no logo and no NCCU branding. +_ASSETS_DIR = Path(__file__).resolve().parent / "assets" +_LOGO_PNG = _ASSETS_DIR / "logo.png" _NCCU_HORIZ = _ASSETS_DIR / "nccu-horiz-logo.png" _NCCU_WINGS = _ASSETS_DIR / "nccu-wings.png" diff --git a/logo.ico b/plottle/assets/logo.ico similarity index 100% rename from logo.ico rename to plottle/assets/logo.ico diff --git a/logo.png b/plottle/assets/logo.png similarity index 100% rename from logo.png rename to plottle/assets/logo.png diff --git a/assets/nccu-horiz-logo.png b/plottle/assets/nccu-horiz-logo.png similarity index 100% rename from assets/nccu-horiz-logo.png rename to plottle/assets/nccu-horiz-logo.png diff --git a/assets/nccu-wings.png b/plottle/assets/nccu-wings.png similarity index 100% rename from assets/nccu-wings.png rename to plottle/assets/nccu-wings.png diff --git a/example-data/Artificial/bimodal_distribution.csv b/plottle/example-data/Artificial/bimodal_distribution.csv similarity index 100% rename from example-data/Artificial/bimodal_distribution.csv rename to plottle/example-data/Artificial/bimodal_distribution.csv diff --git a/example-data/Artificial/correlation_matrix.npy b/plottle/example-data/Artificial/correlation_matrix.npy similarity index 100% rename from example-data/Artificial/correlation_matrix.npy rename to plottle/example-data/Artificial/correlation_matrix.npy diff --git a/example-data/Artificial/gaussian_surface.npy b/plottle/example-data/Artificial/gaussian_surface.npy similarity index 71% rename from example-data/Artificial/gaussian_surface.npy rename to plottle/example-data/Artificial/gaussian_surface.npy index de91c1851f9f1daa691518fd793c728fba3faf21..7c481e3d0a532a5511e9dba241e4aa0247766321 100644 GIT binary patch delta 998 zcmXw2Uuc_E9OZm1rde0J&$dgyiTfI7jlr$4e>9EL-ln$w8jHm0wk$0+jor*rJF-kL z3qCYHlp&67;U_BrS!^AKjOmQGSmIz(P}e+E3Fy)=A#{RSd{_y?l?$-Aw9d)!|8J9(}d&6MJC2cJhbK3~MES(;Pt9>A_v{?z|xcnGFnQxZfc5L@3s5MV7M7 z0h}Sb;zA3>6cg5HS-A=a5AMwAhoj54h%CV8o~DB%KSpDE%JPn#_g&Qj@FRo`;GFIju5z&g0RSG?m28TV=W zna|(475ig>ouc5rxY#GRh0skOwK`0)Clui}*xvkR&T%!4|B^e)V?R~%dH#U&X**{sxu{G|0eon$HN4J={Kz^Hs zVV<%HEi1JAVi5*P?$^*q<^3)!a>q;m0(o-u#07h)$Expsdi$5ZSC`l-nVCflyO|F` zT4oFip*Ms^3ir-ooXd7m7l{Y^P6LBfd1V8$RO;8DQTu>~79Jk30vCB|uply`=#W#~ ztP5P_?T!s#h>XMML|;YCh6ci@iW)MGT0|2@MvEd8 z+n6f+bB}q1kn|Ws4X=z{l|(I);~|KzVw`Zw2j82R>hyff5{supO-htS=);Lkp(yNS zLS5RM6Y`^PhoEr%WZ+>j!bdzZ^pkj;T0QUYZh7Oj6}t z6*HtvYsho&v_;I`nL9N5)jMoz_V0gA{y5FDG=JQMQ@nEgmxozr0;>Mz3%hm<#Xn_T RR1Rpub=wJ-cyRPY;6Hc2aY_IH delta 998 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 CHo2_; literal 0 HcmV?d00001 diff --git a/plottle/gallery/contour_plot.png b/plottle/gallery/contour_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..178b92ae0c7f2fbe4a75a13310fd3c0445a32574 GIT binary patch literal 27932 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 Coh9D@ literal 0 HcmV?d00001 diff --git a/plottle/gallery/distribution_plot.png b/plottle/gallery/distribution_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..d72d3a8fe4fd129fa1c8bbd626e977a949d57c60 GIT binary patch literal 28556 zcmbq*WmHvB8|EdXySqyo2`}9#EiD~_G)i}OhoE#xNh;k9QUZc>E8WsH`+ncd{F$|8 zty%NKg;&o#XP43woj(Y1aXI|&D>$9r zTXVf%K)42XL3LKp{{VsD?8E-Rsi*GvLLiRUiZYT~o>_;>UcUHlkK!l48Qv{0ID9U; z@|${}O3q5d5sr&fAV+acP z+XhwY7Ap8DE~}V>BZYGM`v37`)GK~IJ_!cA^_%V7ZQ)cn(UUF&oG6)IgW2rk>e5ma zx+Ii&{0t(y}gA#a+$;z z$|o$0O^}4l+lSBF|9!rZAIH#<)Ych=&nyKVv|Ex(<+@B1W2INy9Md@Phclh(+`N{A zH4RN)Uth1mo>c7qMB3HE<4WJLX;99}icy9R*VuFYS;@zJC!eF+uShYI#2x2B_MYjy z45oUWUBtYZV=P=;@?Kto0uBqIl)~<&<5_}`z_~d+k~ldO#D90E=Hd_k@Kv*g!V(j4 z+MXWoJa>!J!aV#6SlEoE&`0kO%~^Qci4FNmoQ4^Usz{f z>v0EqtzK-pi9cyvT-^2FOs8wCD2(+D3*(aMd|=q8hvNXAx1%Ik!X8+^4L@M=k;N^) z$Pv42|I_-H!zHl;_Mmm>cvZ6)FE75`>{mF5tGoNcU-I%?=fQZ&3?2)lt@naV${B%` zZyMntpFe+gK5oCF6A~iB#l`jfHz{w%O>)}@mUvns{(vedD3~~G85tMXf7rMhUri9A4{j z8B0qBb8~ZUrxg+3$D8e@>+aY7c#+O1wE8q_#L(Y6j1YjE?Tv=#Qzjp2!h9uQchT`er>5E|o9g z=?Nub*9!!9#crA4ay#XrCL#*|`js8FHBkS1C}-#W`(LxO8zxV;=?;%Uw_lL&vN~?} z*uaY6Au#t^ykt`O{L7l!=(ZVShFI*Eb^V8J)kqmS-`m|1zmG<>=Fg<0q#&k4B*@Vg z(7~L-K{yw9dP^K5BO?q*>)8)BhiP^q^oq(#s|4{!C_J^W6Lg6>&>lCfV6(2BPBvtgZ+FDiN!(fAeDtw ze&WpR?82D!vRdQPdvyFL89#HcjVNaObN`cWWQ2jN+}z`Tk9CfBvu~X0?_#NZPb5n= z-oG_5`0cak&{&(8m?(DMdAnEPe*Scp-g)5BPM0*~*fCR~dnKH!&SGg2@Nkiss~a$Q zUyMa5)CZ~g#B06q<-)@r<3iBy=1=-V2Y90~)RI>(F3Cm?K4D4kiV&*JA?FgzzfBOP>U2)!BQo!~Bd(;)bN`C>dUupAd@DhKz|9})|_4aKYwf}WceSLi`KC^1g&H47C zdGp*?{cm%`CcfRQtgIP26;{aDRF)t9j+#OAjEz_Fj-6OwA5KqCM=f9Q43G$W|6>8$ z?7hp_dc(P*cD3w5&Bn?3mV<-iU^7AdEo)k|3&kKB8XAd3?6T{$3Ofr+q{CcIQ2qDs zHM6ri4IanF4Zb(;-T#h~mR$YrU+e&BNnb+)mzM-%)LuZCFrD}AY~w=gY>57AQ&Yw} zKC(*?1K;xUXg;Q;S!H@`k7qYn991^1n5U(seJw5yb6D-j=FqF@5?Ebn_aTJ{xF6^> zSd9?P{`%Div)mwcz$gLQvsWrA^}=6nHx-f__1KkJ(_W-0S!K?y*7E$?wyf3DQ&dDn z=*saq5`4=?_G!}QJ0)9)AE&h6@9^8N6e?%Z{c|Q1y`q=lLRgXKEW;_1Mp;{24}&fg zt$#n;=}Ak6I6QW%iV)|iR5(l@wO<({1^PWb zT)Cf<#mNbP1UTSAVdvmbpLun%-s^sD%ST2;N;=Oxd{t6cmkehb@OYk!>=zIs=y61W z(B*%gxjLtk3w5Cz86Ewe`F2??g-OMnD5n3Y-ec7-9bA4poeL}ut77b8VmYK3;c$(I zqrlyLexyG4YdBOkMA&r#zAo%>v?O-U^`;>f&UATsx#0>u&|%^GyPt<5|9(oxZbEeo z3>LQQ1MWAeF(ATjd%yDbof(FC2lRY>+l<(x0tUnBb64_i>0@j@}Ljl`IkL<}SZTU*;2_d^5w)eg#+tG?f)_cKI&8kScn z25EVCaEFJ76;xFle8z4)EG!Bg4D|I$gF`}i0v>%^y=3Wdi8u{W21tI4jKD#Pi;LA+ z2r>j5J}9)Q#NsHTYaPE_rUoDJUpNC@7$Sia9ks4F_>^bHi%yd~5^x91?hU z+_~y_`*5|Iker_Au~PTU{M8 zKvGv%ce`|ZQ(^Le22nRM65SD^=q3q~D-1H^q;?gP7h{&kxNQD6I63jdDEz~L;Cl+3 zZH;7RtmY;ZMRp>3T3R?YkyFH~)*~Sbs52xiEKItp*I?+wt~c^$tgb5cNKDN@i^_v` z&zvCD=yV;pvBliSOJazOj0{HesOdiG zct@%NgLG9o4^sSQxU%c)P327Z(?ftH903fNNYHE!(|ZwimDfm3pWZ$AxY+!`IyYq@o>JKUcti>GT|d~W`#>p=;Oe}`d-m+v_3eK3 z>C`K(`M++i0fIeAO-uD$@^NI(Lb?ONgB*u$fD`TQ?b&mvr9ZZw4v@VcBrhlzVL`iQauWD{gXTkcw0cBz8Rm1A`M#Xx1~G zI^YIffNQzm2{-{8L)ulAh20M%bajbY+1O6MM_{oZjOGjXJ+wc`MHIaC%cv{%ql25z@J zMRDy_w;0pl%n`1MK3;D&+#s_d?NvkV_I{PI3k$bS{QGU}Q>nI|)o*SVL(Fy5h@#Gv zQoA{ru=tlhbIcyJPY){{7L_%PxBsTq?u@q2{)~`9E`Lg6W8OaAzBVzL02`jkZPpWb z4!r9{l0x764<8OMr;{09-5ywERf{z29egZ}J4X z92FInhIg|Yt*@Sp3~2^PEIMyzs*#pnf)s_|Po?ufd7fUy%)t?t4Rz^pY<`T#1W90k zgk0ReZCQX>H4C~WMt0EpcgVV5&nbVS_#BjvZ_m(){>@h-^h1AgxK=?gZ-ucUKkO*w zKo2%L#y}&loGF0m)N#XP?02D^V4u4QwO{y-+6mg~q?{bAAPGpbVLaojk85k)Ar0Mv zfh&Let2=Jd5=72Wv{(uI%z569eGbbO_Mm(IeAuylcv(cbOeyt`NcD3T; zG*=62nYceGU*Ajwh^>i$+TV24vY(iqZv9eW0<@{8f6`6pn3<6QNJ2$L)%*4q)7a;b ze^Dei;89Sg(je^Mz#j40Gg>-2`19?FLEt!XRwEw;+yCofbLl!y;Jzo9i%u4xIN`+f zqhMnXE;WBR1wH!0SR<$vzGuVC8NAk5mM=(ygM$-4eR|hg?izlPfsKVFXKqec)%oas zf4BN1=kG7Z1he58a4krU2{ z0mJ|GV zV^S?+W2!G|xnf(ssass;eyp#-=Z%dG&!}zy1B;8F0q}&CQ1>UnM%+;1ZUcUSxE=fr z$L3C|QiuNK%ikZX!=)4->1LU3o0^~uOiX8ZA#Pa*rKP2TP*Y^7yLIpd;-4KmvUlsj z63fK#?$2MZQ^G)c3Cl3P6bh|>bh60*_eYxpZ-DaysZyRjEosC)FpiZvPFqM7z^ieA zT%jkpnvW|krwc5&@pg<7Y3X8B+S5-LRS1JAHX5rpXzH!u`JVB;kJ|Iq_5XF9+_D_6 zwpqn8wlOG?|BPTRL?3f;G|W(MWu6Z^E1 zQXVYyMH}5CxkL#uVM;`yosMjw{ZhK;eQy7`EQV*`q}qrv zGBJvWnfLwBO+Ou+68P^AfcI$IqqpB2msc%fC=Zt9PycIAEb*x0BR=9YJ159~27P(8Ja27~vLlQxG3-PqRTh7^>jGXK41{MWAf z(p=Cymewz9OU*j?{BAm5AA`f5A%(pE#0=+If2{!ubnOh6!7E83aCjK)fZblEaq^&N zM}g+QS9Fo|Hu&zKTyvef;@iz(I z6-eo%LX7GmD1GV&UjcK$V>y_0#nB#|?Sm ze6aK%j*O25@PjU#MpxH;&b}^fM0c+~yKELArdMSmBDH{Lg(+nUIZyB3oz5l{*Kmi+ zZkn6b>79VvHtm|+X-qB+dqnp2tIpW`e8+9!E7dgeJDZdeO)(M2C#GyT2Lszk2WNwB zn{2^lKNGo&$-n@eW^CqNzfu8}!tsUmY7nkgg`r=8@kV zcqrTg#_{d_DyFf`ZN-7t;;_{``zOjIayF^KjnwA632jBhhNPsVd73F=#lA(SdJ~Wp z&UQh6r}R0oC|QD*u+{1T*kv-0H?Jruhes_-9&9b~^}}CY7Kgn)`VYJ~#GJbxIf%uG z;<+jD@by?vP9yr*@(N4&)22PAteEdNj8?Urtcxdd1Law<$sK)-x`Je*x(cfy3 z(t=`bG6SWAP z%idDqg8)lB9H{WDm~=6NNNmpGmjIu$%;*rUl&k!L{;GsYlE(RHmZ?@DFq4^i!%!Oe z^5@)^*se?(5)-<#yM4xDV;UK)v_c{zqAWfH8U@zf`)}p(y-dV2iv{jnYB6D6JTqFl zwt&2z`XJndA>mx-Zx&0rTVe26g$2E^76p=wub}KyDz|*|uC$DQu zqvU$dB_r4jlJXKII8o1rF6%6M)n}I!Ve9l%NuHRP7=&?fOU}KRdVsc?tu{HCVm)?4(rKL0v7W)h_T9Ctm~|q~ zgicltJWw6Q#wpxEFWKa$wGeD>mkpWk-@mWrM^N?r+nqk`!&h4a^rpMb4Zq#&S~oIv zpSG@17&5glj*0&bNze9>Nw!7SGi_^BFq=cyRDAZ7VLZaB`!%Dv1MW5xm z&uO38Qnq-Hk{kv-dRF{nA%#Mi%lWAmnNIzTdEEWv<&nj1w(!}FT7C&|0DK6ewy-Fm zf%>55YO*&nqI_I^x(o0;tp9xiI$Ai$7uD?OfB#&4LI38t7KFS+C63Cznx)xmX_g_} z12(pKeiEuVA8r&D*Ywsm>(#8{(*DU!&^r+gS8GPXn8ealkb+cCquFkdsXV(lyAisY zTs9&9m`=NW0mlodUcgg-axl=;#CtoQ6{V6X&@7@O)dAHBK@3COO?r|3)ydo(DitC- z=WBjqk?omaq3xiq5R5}fbTE1NRwiu2G7jl&%V9Efh^=ZXB;?LtqvP?`4$>8hijQP; zc`*MiGB!3;skkmPCoL_EI^f>rrKo5} ze-@{su1^M-jvz3&|0d%Og;H?yszfczUf3M&$Xzpr8LqT&U9WN6ZMeFT%gK%yx?@0X zwNeT0qRBO;N<)G-1H?TMoCKLf`sc592^AkTVGyyG`Y~|Pu@w_=!6D-nGq$)yvyH>- z?Ccl@mF_>SepeaAfF1w$X=Q3^>KGea4J@Xi=^1>rjm>&k<52{4{BOE9-P~+qD58{A zY=JFwf+TL3LxcH1jQ9`I*7g}+OB2n*Yrq{W<0EtOThO92s0kZI` zVe`~wqd}#dqa!CB9UTtgpCy#HRpt+AfLB7z|Jg2W<<0A~gdNM{n-zdmha*@}U^q?f zl*aTr@5U5CfY5#IufD~h@%eyXH?h+kF*7=udeOS`YfFZ{{39Q3m4J;R3_{8o=%o3; z*HHx_rZvjJP-aq$@nxx9ZN-kVGE`k7H^L&#=Kwbf5B-tGCjOL>5jij*2dLdv6Bhvb z0YyXNs^4t5ax4%kMO%#=BSEt!isZEBa0iNEO!P;`r2sEhD6t6-3Y@Z9OkZQk%un~s z{N#D@%%#Q4XSvra#LRYX+`L%3lV+UaSmAVdkm00!sQxlm_b60|X?*i8*CCbjj{wfd`T2=b`Cpqg4ywWrUh-ZH#bO

    &wQTrb!m$gx-&OrV2*`=q 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 literal 0 HcmV?d00001 diff --git a/plottle/gallery/heatmap.png b/plottle/gallery/heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..ced02e7b45ecb02d0cb5e904f17063c30cdf24af GIT binary patch literal 17607 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 wQww4zkjt%pAU7tdqhR{#J2 literal 0 HcmV?d00001 diff --git a/plottle/gallery/histogram.png b/plottle/gallery/histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..fcada7556f1b34e7c45cf5881b717c3eb11ddb06 GIT binary patch literal 19093 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 K71QM}-1uK4&8rgt literal 0 HcmV?d00001 diff --git a/plottle/gallery/interactive_3d_surface.png b/plottle/gallery/interactive_3d_surface.png new file mode 100644 index 0000000000000000000000000000000000000000..2fb1f268cc9afcf621ba3f6f1b48b17ac6557f22 GIT binary patch literal 7263 zcmeHMXH--9w~bgw5DO@Z6h}dkDgsgzupvc?fb=#Jfe{ce1*9d;ILaU((vd1sLJ1&J zLse-~BQ2CrL?odY7=$Dc+B^Bbwch*uKD{rqRsw6?+}zyX`R%>W-sgtiG1fh>UwA(P zfjFSAchd}k*zp10TKo3E5#hQI!thT6qhpOR_jbkj-9xz`jP7B4JiRfV51dc=x}eYx zyuFm<6&2+bWl#N%!T6vx6cir*&l&RGC^rSv$j()`$}c{8HfRLm&^-6O<4){M5CUCWAo&c4%Dzu*e;=c`WLRfjk?vw5JIZVC0Y_S%9V@>2QedB zGY!47We17I1uv7b`do8tk*!b8?m7_K#GCNDyu`jq;i7x0vNiACHSFz7YeSv8bA+~z z>so!{!cJKpLw`?2vwo;o=t&$oj6ggunPBWjAijE?dV)ZlIeZoIBx>I�R}yhY-I> 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 literal 0 HcmV?d00001 diff --git a/plottle/gallery/interactive_histogram.png b/plottle/gallery/interactive_histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..06f9dfb2e5515a7f0ece8b71075c4587954c6636 GIT binary patch literal 7286 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 Kwea$-2mc0YGe<`N literal 0 HcmV?d00001 diff --git a/plottle/gallery/interactive_line.png b/plottle/gallery/interactive_line.png new file mode 100644 index 0000000000000000000000000000000000000000..26ff43559c4aeb56765f116865a6ebeb31ca573d GIT binary patch literal 6403 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 B=6?VH literal 0 HcmV?d00001 diff --git a/plottle/gallery/line_plot.png b/plottle/gallery/line_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..286e248d99adbe6e576482c577a8619176cbbf7e GIT binary patch literal 48283 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 S{X-o1qa^=GE?>qZ=sy6ml(q!` literal 0 HcmV?d00001 diff --git a/docs/gallery/manifest.json b/plottle/gallery/manifest.json similarity index 100% rename from docs/gallery/manifest.json rename to plottle/gallery/manifest.json diff --git a/plottle/gallery/regression_plot.png b/plottle/gallery/regression_plot.png new file mode 100644 index 0000000000000000000000000000000000000000..40acdff0a6b7cfe2feee563867834788ee814703 GIT binary patch literal 60898 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

    tO&w%bb1=vP&sXfvS4KO1Z|B9 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

    dmSWD|Z?2q_im^2qg``#r$n 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∈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

    v502^&+J-dw zpc9)f$hdrtzN7`?wI(HhLT2#vIVm7Z-)nqRZO!Dv>;}R3dc_ngq z=%hXut(La<8?y_u-$Ty%0wpA@V4F zxGZA_=YQ)gbzs(&Zj3#m;jvHElea0+%G2>A7A)FpM}58?tH73Gp7Rh;?-1Zz1X!eH zyNhXaM0_roFd{pC;#Wm0%4>O`JwL^<1Z;#=xjrC)B+4dHUwRqKHmcoqBQM=r#NYj0 zXV{_d_^;!8OEYA{nch^kM)=t5I&RgGpd6PifISoy+SHTDKMOG*?r^_#bYOb#JqJU! zP0gz22?CzjTKAVGR%AehJqrCV&W3-k>OWoQ)WsFWsc-B-%ZU9SKCX*hhi|@XOKV4x z1U0!RnwYjryyNJ12s6CT^wMDF@7>tS0aBkl$bkj;#5>NycGNfL`$c?X@)f5L_`XbqBlxy7yq35hnf>;xB~g#S z$3ZFddQ-5xw|qnhN{m0FB2a^{BXxR#(Eq7iD)4D~YGP{-6cepJeAM$LISQ=EA|=Hi zgOjnL+|ZpN+d6jf<~aZC;>h^QEa4PX9oYRTFQ0|WC(NTQ8NcV1Vz7_3nc}S>*NBU9 z0vprCw>Q_*L`yo1n-=XM*W(K88@~?xULy9iSE+4R&j2{57kIo7WSy(InbvLus!*>~ zU6qbmq{bOi{XiBCxB?<+p%DNjTPU*(ny8+gU8$FI>=&_vy0U){OG<5_(vPZnB!4!; zKgy0KYfl~e?a5fGFZY7*UNeR9_8TRCl}P;IDb2`pI)6( zAT>Yf%&9FvpIXO}+c&q_-T3oAgKf;s4c2#PNqFC~XBY>!s;R3x8FKK80~MNSQ{QmU ztYh^&9Pm?9?$PNS?!$?q;@iFo@2`fV?p}<{vLhVf-d&47R=vM^%}ko>IESQ z%zMK}ejC|=!*b1cXK~sA>3;k3{RKUef8S(b^fiK-`C9mjHd^G4FBJE=1!$}af?5C# zaq8{!9Mc^gj22_5TU7_Cz$(&yuTRI5^64&|_UZ#eiq9fS46%O%%gGdRjTZ$=VWtC6 zGbnE6Nvlnx*Gyw-6$>T=*{)_j05q{gNScAdE>*v}g6Hs*WNu{eKSf%}av|Z#TTn*( zh)TIEa(^OHByheO!M@4r;5h(Vb2@x^yN`Cv-_oy;^_+n+GVe&mSYc>ZyI0t8F-rx4x)tPa~KoL@ij2^XyMn(fCM@G-$PD7 zf6ZGWHwX)i3dV}%_jlF=Q@#>KSoqS8}CE_tI9=bu(i#rd}i+8at*klzEwaA*4TJpfXhz^d8z`n;uxK(U|zn+b~^MeDdK zWw2>YrLly)E^(5P7n6{X5CAc@Avo+psJN8o1BtA_o#lk+>|Sjo%{Z5YlT{HC)KV_I zPxHN9GslcIUu0?%cKd9cYqPFbV%gg5*YFZGL9a;CNm;$m1AaoRJFx=r5kt0c@BZ0< z114K>V*$#(G%0Thb3MKWeqw3|{-D4Fm(KF$sTJnm#VUi}P@W-*+|N2W>i28s(U6f& z&(53md^$13t?Hu_J!6--%&8!sT-3^`AW<^sp^@_7HX zlQ|zilpr;RWMYCM)J&Xa85mmY+?uWRV9}J>4Dvb#ukJ}uT^jpl&Ivql&C?G@4^)~M zyk&0D^%}Ks80r9n2f%WwUk-8^g!Q*fZKY3z7PQzD0cJ=K2!CQb!LSB~Foi=3iT&2KX;h*7N8j`8$`L6{` zbch;vYP+JR^C415)PDU&x%;9s&>#H|;RV=c9~zE7#f)X;1Dbo0pRI`sweFSHN{>W* zmPN0;zecLLc`V5$>Qf54s^w7tDR*}O_8DMrH2@r~Y_8hGV@JW$Q3-kR>L}gbppu5> zVuZZOLr_X|<}io$jiY1E^W8~gWLFA95l(3i!}9)B;)?^J?rc;UM}uf%QHEk`G^!Z2 zRgYL#FjWcat!9!UM&I+M)ka3M=Q*kJNrV1-lkHYsS5Xp=OS3IV&qi1$%}JD?M)o8T zHYsrNn$<>Vrv020Nz68W1>RmTJP);1K15?9eVQ+d0W=yo{~aTxUj~{qys>rUK(ew{PdOID$v zV(W=%ymVE@M};#+e?aA_?e&@29GjPu;vPQfj zy!JHp>62 z!8mADTr_6H7MwQWnW|=^%T9J_-Gdax@I+J{(u;7rR!DUIEY;`r$BF7kmq1~lekem}fr*p2Ms*})FcO#CRYL}Ir#^TGfC8JIg>{YM#aGO3w;KRV z0(M#T-ZQFXredxLu{rQ2L$mqaTzE9?a;V5fXHbClPG`Eq^>5^-?@4q*(Bu@2uefK~ zq&O~hHB;FaWh#(FFdbUKx`RoKdcluQ#2KT_cY~|B^AL`mX3f$U>2mCiWcwRxz5K)& zF-$+-J_6Ozm8S+2>99X@LW>b7rYpD5?UZob%3k@T_b=UWbElgDcoDRcaMDaxt&O8B%^+8b?2p~ z9^VL6%5LJ3hLC4eaS9x?6Vp|Eaad?c0$h>46yB(pSH6J%L`H@$yQQqLmGnnlNF!K# zVp_{#u}xeRlNcJmhM1iJtvS_AG?c8r!g(;EEHVTuYvn;-F@MQzo@CA3KyHl7X!2iC zLL^tJm=6E%i7elbBxb#%qfUS=N#*;6VyDb= z34*hFHDb{DT_?)5o!-i7qOc(NgW{cJqv$G047$>X)BE3zevBgIhb#*++?$`jy-FyM zHa)+`-9KBa;p;y_lgB^M5d$^b(7k%!OpLkb(lo_89v^`Jh~^;peF!(9_1z&M(<n?j6U>{AiADY;EM+z+pGaa5B4F^!>ap6BP>kb@bwvS zMAmAg-GTL2_+(9TJ28Xc82NsrDn=)%Yl{xVvWc(bUa3AEbS=C3ePuTw(&H$41STRS z?c<*_iW9GKV#PZ@7zKh z;yWKcQaU+lOOKazi2X{Rj~PU76@@YeZO?3n)~;!Eh+-=$Zb#TQ-b4NHF?OqS%1<(9Bz%0ZY-L^^bx0jYHur>2e1M9T8 z`T4Q4oo+|YKvsIMER+G<{m@5umY{@6*X)ek=|oq$m6-h)=+0xMKn#M6idLu39-h|t zjW(lAA2=C6;Oqf?s1fbfV_E{W?{$wM#R|5_euy`{(8WS00@lnkW6%lua2!g%*Uc?? zup*OR3s(UNR+pt4E1#qeMxU^gN05qWp0Tb6+M5MQ8y%@fSblu-C$tq-8EFK#+hk&$ z2iQ@efxyzXFWYQNR|&uJoy;wFZFlcox1WZhFmF4nJMIoa>t3iYyn-m6 z>3MD`45!VUCHNIZlRpJ0VnD9EwS7Y1{5Q6r=voR_KfcTWtV0oSP56FE??EfEr&q8k z4;Q<{uZ4v{1Vg^GahJKYyJcW)JCKFmxayaP)%$6CmGlEOs7|E(Q& zB_j$iK=ymGhRS;%!Jc}HC*y9%>18pG{Zf<57B-S{yh}qfZPWa{Zqgpx!V??p+BcVv zXy5fxY2zVd1saP!LayBdQ#GZRMa)rg-<#H5JFmG_7o(*gOS@ol*PQ?hF)ML!HzyvV zp|~21u%AwZ?>prV$ujL{po21_aZ{|2Ob@?6ERFGHTi(XqFZQhipz>uPo=kV^BGUe+ z+`HM<}z9$=|Y43qwtG)dh{)!qS@j$>$e)bsSuV25=sQA2287qFS%MVsmR7kOx z8tH^n5!aa0zZTIU57a5Ai1oA;>oT2sk$Y;%P-g#vc(UC2;dDu)qdDyWm^5l7^V8x= zC86dS=u6K6vZ#nB^vnOF%X@M!Sko&tyq??D@vuYetHvU;c0eeSfYR85#!^r^S;=Vk zm|p)}3g>UBOVNv{L}`K$tAFNLYfSeq=~{zQ0VHDSR>j5kZwxDS|03xzGZMgbTuR@_ zV>CDhOhfC9NExOJ7CfK{0JS73Unc;C`(7<5Pv_2Z*7VImKULg`tNew;EeLE$uWP&A zKRrKp2C+{rAU|r-%h0XsS^!!)VIwZuJYjf;52d9r2_>hr z595g1+fy9@#U{a#5u&E_AMP!cFZVqB%GfW7)&cPPQyRx5;vB*BqW0T)VKwC8(%S0{ z--01YNrsdv(Cg6NXwkG`?bpW%jbL_aOpbY!)T$a8BB`r2HOgZ*LzlvBY5xjVPX(6o zG@Y%VA~qU5(sNYo{0S~Kukk&_Ih8L{o7C1jPiQ?SnD!!Q%=uxergVN6C)Tz=%lR18 zCRqno)xTX6B7CsD3U98}-Zky>fkB z{*+aFej2WlhBY{#0tD1co0xAdkr0Uko&ZA8q+wh5YEWQ*$v`d_p7IjiueFMbjFuc@ z^i^6rz|J-tzi(Yv{7_i|*=GPSZc!2-o(0^bAgr(E(}kXF&W5(1S-!P>d~>j~<^PTR z0hQJ3AS>HLf}U*Bs$yJ9=wA+32)VK0-tW{pd;c6%p&0)-T!mz_^G;r#~ z(D23D1MCsvUG||1;lx4p^1ou#xuY#?f1!cTnGONGCq(wcknJjKFGi8exRa{0q1CDQf?bNYxRa*~c*sb%yvcj*j6 zM*P@TqJI-&rYFC(>cC|J7Wa+=9(J|6_;JB^Jv8j(P^!@&K!%6$Og_iCZro|eVkl9% zdKZlMw2@I7%`OP9`ESEs{nfF!82`S;>@+`WP+xOWTTu3aSaZhJlphu<4-Ik zw5MS_0lNkdfph_r13##UoAFa(KYm>4Fy`YI!D3xHGjqV&+gN#CZZ8xojf;sCwBXRZVlI&WUNm!O#wptW-Y(you z6C;#cfZBYVXn0q0xmd%!a~b<(8W~jIi|xV9#baq7j4$rkzOzqGDo^6F?DyQ=da-WJ zYXhlb7>-6`UG?{u#vI{S7rptgPZD4M{z(e-no&|o)6-a_XMwAF_5RUW3SgiENP1x8 zJB_qB$}tC6>bLhY`WSiiE?Nz!p49vR3vh~@wemfOxIk^nY5LR!E{>-6tYZUpyp$$; z!K3FL_*Ej2`6XIV@;-zztFoJ@GSQ7-(Kc+XNc>&Cv;6nB*L#tjW+`f))mHFWGm_QB z&OYh7NZQm0TpA|i_o-xLfZW4df&UDB9>tobQ*C*Un(tXprgsUAsO&|u?- zF^1%&yeQh~BhVaus5IC#cXc`}4O$HqptAsK+(?bxqaMUc;vB|!j8P*{)+DgB)~7aT zy`QQUxBp|e46t$Oe1hUY`Oxk>K(=}Gsm-LyFgjBsv+w}E=y#zI3G*(=f4SSCasccp zAiO3UkzXbVLd0^*%A!H`iPFnoKfp9Ho?x^{o5*F^h-Z3vy$XT+b0o1)5`Se4@-+WB^6NR7V$#7Eyns!snC6XTIXqd( zt6Cuah+2!Ncjc9S+LwHSv!~to9tZ*;{vi9wB06COAAm}fnrNuWlNoQto{Rntx7Mi?2#Bk2Wm}9u}zeWel zD z0I~!nmI^zEc9YwJ3pT@YYhE9AJu9y(Zn&17cIwHSZCS-&#P~$Ob$kPoU=Ty1!w-94 z{PZy*Xz3DUN&)8mLgyaP?GPE6+^YAjA%I6f?2t#4njp9pYv?YhtLjz=LmjJD3IG~Z zXS?}@&K=uSZ74)Q8;zS72M-%n)Ff;)9QwVnK2BpoLjw&96$AO-h%Q3tl zxGU(4VX?_OU9kU;rMLBuj2ccgE!5P0ALqL~z1~KxG_2s*@VE%T;sJq1Y3FmG1M>jL z#|B!`;zCl6d+A1IpWE_P?P}EEW`(69&$vazMnz)sBG>F1me2?7cz3huPM9$2z8JTN zcWX6_t{kq50gd3Fh=x4amcfF~6fWLL=zlIVkNbSSiB9I#<-$h0<1y)c1$oJn?@QkBCM#LzWBn$w!dBFX7E8dI@jLzg5OnwZgWssh zzvFQQ%Q!@K1)RTQdi6)4u6K))zwDef+5#4hnsAyf8DI{i)yn)tZ0NG3j zeGh~}B|8PFgeuSt{ZY>uX#5fWMhgDCUg3)n?Z{jp{~rw|^P8rmY?|MAB*E5dFoLj9 zTD^$j^K@xItRlrm@HhbUlQ9F7G*Jdvw+fZ!b6MB%TwSoRH@4g&xxvK}vv!*D++V13 zDF17iaNMsX7RWtE-E6FnO2z)BYNUh+K~#FFRjzy*DAL%IeB!N#rEunOT4}GucLmK( zA@u5ffe-ChtMnXbhf>tm1~=I0695Yx&&|TdvbjfT3G)9aJ6r!?orwTL$Z^AnZ&WG> zWfZy27J;2y;`(k&AmpCR_nsgK43n+?0|+dUBFRi}7XlCjw;5*M=X3KW^Ki<42(HNs zcYv$_l_b(3;=^NUl!GAyDx$A9yO%W}fIA4db z>l?dcb{s*o!n$EQhbkmb{M~C#*!50Ycz#en4Q_-{aq#HHD%Db4D6xp|| zg4D(O^L?EyDAg)>G-N-JAh@Gq5ovf7y>D61arn*6KPgevpfkPxTk_TIIz(H{|xu+8SEG8PG65HR>JSCZXl1vBpRfgKcj8DhfRSUR&VlMj-n zhHJ*{c5F-(v=y#K*k_%x+Unm!U+#!i18;A!W;^#8{mUTi+S+G-$Aym#aZ6}k*y4X6(=|9p(jfxp>1#RxVS7blk%;OyyIn2;p zAP!Y#zL?e%bpI5bR4m~R*FUJmK)e3;{%fViZxL@-9qf1C^CYBfu-+tTE~?4*0S)Dk zu?lkARI?3l$iqx@fLU5mF`hoKu7FInjbT$n{@q9zdBqfQqznh=tyXlyyL2%VnF$)s zZA0H~XTKfIj`$@aTAgopHq!7l^oay(>RABV+u1m|qF7EH0xfvSuU`)K(wo2u=)6Br zr)>{`6Z>r_Zv6-HWs-MChMca~C8UFanf-I`S2c!+FF zMy67%wjH2}tX4XBSZG$sEAAT(5&k|7VwiCEm3#d#1pZNQ%(OPf=pf}f?D?zpEwa4^ zR?E`GLmQ0^n=pJ-RmQ}0@R|p5{ANIK>UJU*K1mr-ylw*1l5f8Xdu*`s!@~6jU|}&| zoIxFd@dCBfg!BtCn6#PXwxf$`OO@%@((2^~Y~*IsL19<*dP6bj{s zNpo3QeYRv3WE%U9>r3*>__cga5WsKntl)8-dR};q{ID5iFZ-X*k1iY%3DX@U%t#S@ zsVyIKSIvqrLeV$~+>vjg56%QKllB3K^pY&`%*o%@KjZ!c9In{&N88T_rY4(MH>#Up zW>}v$WGzZ6w~WSnDW49MW%DJ)niY`#0pe6K(|JrgOx|QXMX=5ayg<2tqtI39@&slwzRucn zBD-k_ByeBrP>ImVpgrQiSZsb=E5guZyjG7N_M=h=?+)(^kR7-0P$)S2@71v8Q40O^ ziWX-iETVXuPa-N*(>qv8EJ0#LhKz0BoyDF{PXD#fg+Lr|AU4X^RLjYO4kKL!@egnE zPl(}A-T8(37r2GhA+p~YL&tOD*C8U!f8_niEg^))wCWjEp6+3@agknU#(Vr2AT-TA zKGW#I*(5dhyq>&?&1f}2DUZl^h>-s4fJ>EKG&p-NO9Frpro)G#p}K($Egs3{=j&w`)#%J$ zUOB{+c0yA+0K1if_)Lv?YBK@0zO*j(_h$r9<)>+S!f2NI1Ctz}Mz35US_I?RF-V`E zeFoqAn6#whHIJwzH~K?mfc$BA9_W?|apKOayRHVb_m^jyQ0x7doItOT*2?iH#nxj?*EY#q zF`ZdiPjB}>pC1W6-?)^Rl!*?o-@$+E9kp`!tVlqn+Z$M}mOt(;q=pi4+oQ&<i8Xs4E%>xpsP2VBDC6^6V7q~>J)g;)v zRj;xp-v>I@s%*4=bOL6+z(8w&s8!^iZsoj?;cq>mv(&O**Afsc43A3;@rt9;WF)N0 zrj;c5ZlD$?QGf(r0~I#cp>g5(PnY8nfL38~+uV>N`m&bcQwWwbymO@;tJIqsw?$=k zpsP1J{qz4XCbY2m&;NX~;4TW6KIPOIt(b(F8Onh>^^`E$7KWxYAmg~v@eB zj|Z)m+HlqMI7MdAcXMs&i(w`Vp9SCOlfify3V9-6CVD_+c8+RLgWEAHo}eZVszz|* z2|OIGKPkly5iY~lC6eOZ0WOU!M3f~A`>r}yhxckK4qQ3l0wHc=+JxhLuub(m{q8tK z8N?mTe3DqkoA{EVZC@UPd}OWHF{C!+FiWr{0WEqub<3+#OQy)kE!fm8(|J-sbVn>1 zkV(3Hjx^+PJ0dB<_@4(6NF>mK#mWDPC~{PhnGu~a2B6~q=A@w*O5~0dOO|wGgFFG? z#iK+tEx8kU(6`9|%N$6qp-PZzFX9gIj{BmIQyjzUfOjlPx=WWajoVSc?GI9NQ2udz zw#mfN$Y*FW_CRrg*l@ch%_SrnEAQ&Z1?6UnnH*^6F^Gx96< zk{(`Dcanvy7{v_oJj5V`Vp&dZ$tv;x38V`?AqtNpCAv1Ewqcs%_$_@*P=iJ?Bp?iLxQw)S0(g|flClep{3xxKT@0z)Y;Z_*a7anqTR^np zOV2ST5fY|~!3WOJrVKa@vg}So83=W72G}D@?6<=jztUKL0#y`f`QF^bK_vs9Hfj+d z4#-D1%1MzVUuy&~N{0;oMC9+aMrx*s)(Qnc;^E|@ew8w6dCKdTel^ka&xORPSEDP) zM|3^Xzm>5CcNl7$HUY=hHf;G&#iqM|eYP+a(10x6d1CwL|FtNBJ!WTr(IT+(5vbpU zhs{Dm1|B;J$2)%?%TQ*1?ODZ1gy5?uxej-`3!dZBUbWwjD0BVrrJ03ke=gd!0vu#q zFuC>Pi31d#Ex5}$VDuc&c9lYvVeKYx#vlnnroi~s*Q!ys_D45SPWPm?_2#x)IWEe@ z?`rLm##|q2%Y$Bi=%XJU50|pzRmv&+{2i0Ws&&U+w1Ul);)sPde4UhmS}bIOK59!7 z8j|&tlP~d9;=0MZ=ch;v#Q&YQMDkHumsNMMby*c`Jr{UR0lHnAia0@-^iXF` zx?V3Zv1*ngk0j_sbq>A%W8$mt6Wcxq(%FuR!&rQ24#34)dW?)DF=G{u5{B#w#Pg&> z$sn?Tnd}GHaDuIsnD@=XjB5XmbU;_btS6=+!A8C)de2!o1uimFG5`qMv-ijVY zvtgEJ#b#!nv0Z+45;LH;k+`cmTE7(EBOVl$t{`s)SPR5V{#7=J>p3Yxp zW{OiU_;TJIgh@!u&~MDr;ju>jhD4rBLRaeGE1?Id>cMg$jXz9tl{MX}!Ae9<3$g9yBJa0`X+AnJ13c9!-opFgbl zC(u1AA&PWGmm7P;15_}bWfxcv{QLwgfw^@_pVyv5TOPWiZGcH7n#OpHfBCq{AEK@5 zK?~{vb>!#d6yIEK)q_nS^J~@T2%#|m&n{zi(H!~ z((g8Z+yFW?kC$1drJu<&w{0Gj3C?5CmfjJur2k#0mLvdDk#E!Y8s!E-c&;^)y@Yml zGeQ;KsjfKpblE!AM&*WFo~b_x+3U>lBu+R!Rc(Cuwo9?m=I?DKJ@&=pr-Ld>@a-9? z_}JOpo{u>CyZ;ly$HL312woV^`&GUngY>FdPYZ@Rk-3OdTB8C8=~B!dNFvL~wnZ9n zA4A??-iQq)<#L6Yiam})2|A>cWB8h_BTFCQFC8AfXiM)fK?wah{R>)Vn=JQKS{`Kd zWpjr|NlN&2c~tWC(om*QQkKmaZH37@HUvn?{4^=&=>8ggQP$5t1Exi5m5^)Nm4vO5 zEs(<03sY_&(M1FIui?qbV0!$|QW;t+#Jl9-&;M~t8S}S30p0SA&Ei#l!JVzLT;!P( z%ptf}8C{@QmtwsW&mTA_G3PE!Cu!VfBP%ppb-; z5=%p63zv)k?_q%Isk@!kMyBQCqZ|<_ThoZRHIJXA&o>t<+Hp(Hf&Or|Gn8}$X0DV6 zNnQmE?-?`{ADRQXFf(u9vJu?5u-SuY;ds9$yx)EobrfJv!NdJ&>QmHba}3GA$5C6H zFwOyScG#hJ^?PuTuk8F)@34&M==j76x{c3<8^C>_5Xd#jfG&=9(O{hg>b|n@ z?>f_Iw0B3>5xn@v$2={yvyw96A?!Z*9MI_>G*4mD)74G}z=G@*+sxmxZBM7$n`X-c zmB{3CQw3j0RvzmxqHW&le_!=mNI;ou%R347q1);cco+=ajx45Yy6aaG8R$J-0W%Yr z?Pdd%GM}!x=SZ%O6Jl1>@`t~@$=nC!wUfe=Y3^9gyfA-{^qx@_du+FzIXH1zFcMjt z2!~?3^28KA%d?g+PaDvndO9$)n=+B1#%e({nrrGNxD0MdZ~X)y5;PyH+Fk z5u}@(Bn&rcw%~*G<1>ZPQ*5g@?I;a_&V(4Fyp(7hB_f+fx7L-%`47CdF>cVH*ivA^ zYNQM2BsoIeWEfz$@+rW~$}vFU9=t2m2pBMs_0YyLkGpO<-2qdb&z1u7RwKD=+iEVQ z0PN|b65@rT8&=MeCP?|qwA73avvCq}XwK*HLE9Lr7)^f!xWeJ+pwkGxv4NEtpzLZm ziuwhX@iup}tukA<1<8?K7u&=x6uIS|)PjaD-cmkJbYPCvjrdq$ z@axPEkTVm+NOy^hZGP5(j0W$Z-10p{CgpEE>&q_FWWJhy_m=RUc)>=nU~D|w1`_E} zd|Z%ZmkTOIM^0@vzN@#e9RaPz4BNu)tFbXiXMrG4Yk8?f|z!J zxc~p9M7l0U2O%#k;IUx&E+1;BpfTZM=rE{J(&DM~q1ZaEZ(gTVB&o5AzaNNKQDMA7 zHklZWAZ)@0aY-^LJ4)#`cNCkc0A~~GZc6v>4soYkOd>P=6SoOcT38@cMx7*;{gG;U+3eq4D z6%;^n*#Z_@2K+F*=$@-x?Y92hB%?;^y&WLy47@pyQ;u??MWJj}EtZOQsWF-PqWJMc z=@CFB#(d?_F)g?$-b>NT!`3ppd;^x?KdLX4X?O15dA01mwEnpFDH1weJlC?c_z!&ku07xCe&(<~@aB#Sp$(|F zvjvpn$tiL=;&M69yXs{8`c?UZb&TOI~)uLW(gmNd}zBcO)}#T2#|$hK8=16 z=CM5XH%J!xR6QCa9gys6Z04|&StOf$^KD(aJ;b^^@@yT+R5KY&=B(w)RSV-Z>s~(H znJ^?%&@Od)XY+GPAzOT|p-F{tU0I~;r!J~Cv`dLjCU`NZpNwFVnIFm=ygz7PrJ0d6 z_sN?c6UvN2E#c)@%lo83P>yytEsY!*8CkTT8kd2O?`aa7q0RZ+@v(D!QqsK9*4Eae z2M}URNMbF!ZGSJTxLag}d;PPH^D{n&_jJeMMULEgXpQL<3M!51M(!7UUUbjA0{e(1 z)CIUhy3wf0?+5J(<2ADCezg-JVel{SWd`KweGG`5+qx=K3jZ)=6Fg;OuRUK!pZ*94 zX4M{gSQB!ju$JpR%oWFJAdeX^kHP$I3>C|cH@oi5Gp^xnJ%LT?K!`(Y^xt>8+rFyR zy>Yc@syU;Km7V0_;c;}a<-5@>(aMIy;j^|&-UmX(`gNsZo~o)(CT-kO%{a9ZsYJ~} z%Er-1kry^S@6&dni z>?vBqjhe8#?5$z(H06zYgH&!6e`RIggeE_tIXu;Fink<9MaRjJg(UnM_~-dUb~$fd zQpBBjdP(ts$fDC--NjqpzJ3T?ijVu!YHV&^IxR-;E8BlLocB3jy_@%&q5Aqnk%UD< z72RZEfOrL(2v;s;?LM>S(e?~OczAeTUS8?_Z(dtdGUtEKQW{4lC$CLU6KBZ5q=Ki= zvVi*OLR;0grZHGK^5gVuO+YrsXv%E9i<~#Zx!So^34@&5dLbP(4uVPrTf37nu_uK( z_>$$`#36su1xkX8i>^KmlTAgt-g)TRET=KWg9Vq%adtIZahoHa4i$&1g`W272QR3O zP|?w$DlDxavS7!_$-(huyuz9vmf7;eDiE;VS7yR(4!l&g>^@vK{2)3KmB*=+eV2}g z=2}ng> z8!YXW^BtVoUxjkMqaj6V>O7av#tn9ytY#7vq=e(;BaKTseh%c6S@+X>dwaXv(u&1% zl$~!F{fvE_#I3D0tovNYHiB(HF8}%U?;VZzt6#tTa`<{vtoBPnMWN4gT;v(=3zckO zNxGl?#a{E8Y*kXxn+V)y8zbHN-um%H)(@MI7R!)^6axGlxdzML(u$gzm-qUOKkkwt zJuY_Lu(P(`IF_dd5rv!BXG3_wL@d#lPi_v61#K0#df^ldCTwy`SWK$3?{B=PB}FFW z@N1rDR(Re>>`os`tJ}=2@H>1EABpNrNXiTPPTj#;Ei5K3o-AQLsh&?~$W-NxLeYjt zonE4olq#$0a?yWDVq&!{u@M~oHDYJIV|w_KFBwv^gAdC5OM`yxiR0%V>tvs}aCZ0d znC}fbj`u{L)9oT@pA5W;d`5;$SWq@^rC`r9$|;alP^IwGKhG=^sxMNF!>zcu4AH=P2j`$4@1Or_Cg;YuiK*SgGOSeUU&wOAdw!#ENcwzmLjDi zH#$DjP<&gS_&q|^8$06jDR&ZfC46CJX0|oU{wsr~K~D#!ck<>d>b)AMe)N8rLqpq2 zK2X^s$KKr_k(Sfmjx-Jsrc`jyV9Q4R&7=c4(t}rJ=wPU5Aol0)3x%?bCA9?c-3OhV z#ZMpM$?peb53F<)DaT!5vWu*+3eHaMGN9XB^|ZvxK%w46CU((342s?AO=YIy?3rC& z3f+L@0MGFMmUFL(}WU>%+{zL-wE;I?6D)tL63Y{$1xKmNm7Zw~J#v{W(1( zFK2~QVm*|YDb%5d{X={`xnd{^Wq1u9kwLq>wi;GU z;u=w0cOSvmO$+(gM+_7m*D9Aqd;Ywz>q`B1nb7`N!_`9Tz6Y$#t^xjvXp&-A?AM(A zaG9;IGPJo!z-n5z#^u4xe2R?x+)y^5w^r3U(VOrCbE~{V9vxdZf%(%8B{zfCMROfw z6Uc3f+j)uDpdU#W=ZvIid=Ry>tZUi}(!@~lXFuGgrlbsG&G0XOxIK<8`_Cp-8QA;&@DNRoL7|ks zB;`e+P&ZZzxvrH#A{fYadEDU9&}9kcK;!%UFRP$q-oB-= zj+}LkQOv23d!h#kk&T-hc!7r}8;=|wR$|xU2A|tih6o_(FZCl6kJ!L zTNli-17pS=zLs0{%x-QHo0ypFuaA<#W>Qa2-50OH2Cq1EWOD~)3WmST%rHP|^*-Lo zs*rP|_S&9SC^2rFU0I2AZaNzopHnjS^b{s1C!bwi#SaP!ieZqZPfkwmBf08z{?{v2((j6IBRwq0bw)BU#Q$39myi(b@`Xd@FdGLq z#w#uXl@ayYqV3C&j<2m1JtQ$`v8!TcXUE66MB)xcVUm_+u=pAi0?r5-T1wC zOwG!4Q|X@d)cT*4BN(O5|F|{mwS-=Z7IRw`W#?GcFEbB^#B96Y2wRT{Kwynt%HM{w zr?Zm`(FUPfjuU{3Mi9Pl~RhGAs z1!P^RS65ecn*t@J{_M!*X>nLbUiSfi<>%)oN%{!`K_kKqt&nrYr>Cb!e9vrzt4&F} zw1>HBOw7#Kl75GkuZU>`@fv*(Ty@h;vx`~5mWc1U>I@BgQURx#m6er`5()E0;6N`V z6&1=l-RJ9gmeT7kOIdSsW{j$#+40U?A4$hefAA^D*<u z?30f`wZk}eXiM;q9}gzC^%NAsH~q?Wjzq+5f86+%Dn>yNj%{XUhH*|`s#s`>h_kqu ztZjF1Z#(Ed@>_P2y?pgbret&>uOMOg}t9~usgXcDnWT> zAm{GxT0x2Vc)6ALdQnX(UEHGN`JZ0^aaF%38oYQBvtPmqMW4(DCtiQa5~~<`)z}+L z#A&LOvt(TvDEADtnR0qVgI~_IG;pCBi+v701q-8q0LA$Dcy&49Ri4beyiOONFHCM- zMq?jTQ^K?hF5iu#Mf&*o%*TpMgFES&uU~H+&r%)%NnYoy0ULR9^K3SD_Ojo%XkzA$=2%(rhFUckkD=CbfL3al(9aYNal(k9_wSkR-nPSB78 zifDKY3=F%QH8bK8lwA@YYcEkzQOFQjDA)O%$sAqpk^SMr*KsrD320dRw`76#L3L?v z-=i&V#dvydjP&Wj&jZkz6*=A3)z^P()cEu%c0y7T+tbicg_+L*?ep!?3bwZSt@HCf z|0F2u|COiyJC*;BB>%zP6Cq#Bc=Kkv=T4|>)*Z+(e2>3TwRLpJWod|t)$0QQi3Xes zLWkYj>3=KYY#eR9U2IrK4pSFA%l#SgV`I9J9Yd)vUXXL?SKvCqPi$vP2pEhRPXXnV+Y!iYhxBTXSEU zgv;svs<2UwWfwW1(cE%x3LYt`mxjAMw?#IKU2eVHyqlYwV^n=%ArT0kn7Ax;UxsKk z+gt2Py6scG`IdrJZ8nrt3ZXG+Pl%7-^2z5HpJ_9q!SBthS92gq{}qS;pf4uh{`_eJ z>4}+}n|LPZypfyz^YMJNZtW8$c<+$GT=mHVJ2zL?Qu|S!sm}q|0s{k+#638^#xpqk z1@)&(DyggAb#=XUxP^}1*l@r=5JtCWc71(vPIv+iFon1Wm@%!=$Dlfw@h2)E8tqFx zZ_I8blR@2(%~NmtklWhYVwjA(yC8rNV`A6Fme=w(YFg1J2vYjncXV~BF!?$&GxM>< zSfihayEvU<9IdTRdUA3UWF|&lUQ+OId#ae*&NqSnv1w9xUyR({##CL!eR@_hq42~m z)Wj-80Ay}&fFvvgfCUh}<}Gvszw4qB5fvXoSy>qaM-HPH>>nxAOA@lbGCx1Bp`{fD zGiZIqHC{(sMnv?tsTczGk$@olHs2WwjT){%)2VKI^L=S;&4QVmBWiy03&9a`GvIto z1rVahYu5;Qd3jad3gV{-JC+aE1)hm}ZcRnyKg|6yI(pTjBThkIpT^wW+_X$rd`c1c zMq8ub5ds0Y1!X5m1&Cvk0z{1r&l?M%UB|F+EdsnZU$>Gj=j|;D>iI$rQ?&zI#z7zv z%;&kGOGSi>L1=1fYE(>&ypxkt1wRIesU$oLjr4qd#bJv{1oS7BBt9%-W8)+dXL=r! z&kj1gEG!>-Fy`tqyJSP|aeZK5fSHl;j!K4yD$7U=gH=?dBWqbY!;$I+}D9Nk-==0N0~ph}+`=vx?>ESJe=L$+7-}S- zEFK0=5va|{8WC^xBJF5QZL)YwDlCZzM(85eI@Zm>SeS-sX=_h(YZvM=fjExsb?t_7ZiDJEvFcDpVa?eJ z(Hq5S5Uz3bk`s&8kF>RAfh>R?WGN?ul)orY!O%wq+H*hw_)>Z`^0kN~ey_7+Ncta_ zs!Ctiw4N8R%hvuVo$LVrsHCLS4BhC-??XobM2MqQQ5S3=$Yl+E=4E3MK@Wk8!A!Wt zK(+#vbl`2^Jx}(3YWkn9<|6E@HBwYQ2(vDAtRDD+^@Wu*JW2=&2_3CyV!sxv8JXAU z7tuY-Vvh|lwy-*oZUT_zctrr*q_p7Z>}Uq~9|BlD@fH>W0v3VD8L-iTxr^9DR`vN- zQt7rz+d&O|{bzu$aC$~NkKQ#R+=ky|VmK5+ni7svwMZBVv_Tw}I*i}KNGe0%x3xu4 zY_5TZ4k3JY0Rdn@VLw{j{^R|9$L%1ndG$8L+n=*D5Yru4T#=G$`N$7PMEo2sxau_X z*-^*%NL)~`vfWQ9N-Y->S2JYMYiB1Z`aN6A%Ms1ZcPJ?-1-*I2#c80MAnY=>oA!U) z|87?`R_{?zq$VSS_41xoG{p#tHcDl@Lok5LLc$eiDAUH0&^9pTkZH!V< z(}(XLn1QY?B3Ly=m`O~G`uwCnXm)EW&iV5RE*Q4js2^c^ zc6z|Z#nlGGF@A?JJ~m1MXgeNoN*shr@~w*)pTJ0fjGWxuApM{g25yX!l63u2zqtV8 zqd>7cyS|F`Oyj&IRth1#6OMhy{|Z#6Dmve=nz@sw77xC=br z6h^1s&=oefJbriW_)%6+lP{Jvefob%-X?Sa literal 0 HcmV?d00001 diff --git a/plottle/pages/1_Data_Upload.py b/plottle/pages/1_Data_Upload.py index b32267d..d00c1cf 100644 --- a/plottle/pages/1_Data_Upload.py +++ b/plottle/pages/1_Data_Upload.py @@ -23,9 +23,10 @@ import numpy as np import pandas as pd -# Resolve the repo root so we can find example datasets -_APP_ROOT = Path(__file__).parent.parent.parent -_EXAMPLE_DIR = _APP_ROOT / "example-data" / "Artificial" +_APP_ROOT = Path(__file__).resolve().parent.parent.parent +# Example datasets ship inside the package so this tab works after +# `pip install` -- see audit A-09. +_EXAMPLE_DIR = Path(__file__).resolve().parent.parent / "example-data" / "Artificial" # Metadata for each built-in example file _EXAMPLES = { @@ -212,7 +213,7 @@ def _load_example_cached(path: str): if not _EXAMPLE_DIR.exists(): st.warning( f"Example data directory not found: `{_EXAMPLE_DIR}`. " - "Run `generate_examples.py` in `example-data/Artificial/` first." + "Run `python generate_examples.py` from the repository root first." ) else: st.markdown( diff --git a/plottle/pages/8_Gallery.py b/plottle/pages/8_Gallery.py index 2ee0bcc..493a8a9 100644 --- a/plottle/pages/8_Gallery.py +++ b/plottle/pages/8_Gallery.py @@ -19,8 +19,10 @@ import streamlit as st -_APP_ROOT = Path(__file__).parent.parent.parent -_GALLERY_DIR = _APP_ROOT / "docs" / "gallery" +_APP_ROOT = Path(__file__).resolve().parent.parent.parent +# Packaged alongside the code so the Gallery is populated after `pip install` +# rather than only in a source checkout -- see audit A-09. +_GALLERY_DIR = Path(__file__).resolve().parent.parent / "gallery" _MANIFEST_PATH = _GALLERY_DIR / "manifest.json" sys.path.insert(0, str(_APP_ROOT)) diff --git a/pyproject.toml b/pyproject.toml index e8efe8b..57550c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -86,6 +86,19 @@ Changelog = "https://github.com/The-Schultz-Lab/plottle/blob/main/CHANGELOG.md" [tool.setuptools.dynamic] version = {attr = "plottle.__version__"} +# Runtime assets must be declared explicitly or the wheel ships only .py files, +# leaving a pip-installed GUI with no logo, theme, example data or gallery. +# See audit A-09 / mediator G-012. +[tool.setuptools.package-data] +plottle = [ + "assets/*.png", + "assets/*.ico", + "gallery/*.png", + "gallery/manifest.json", + "example-data/Artificial/*.csv", + "example-data/Artificial/*.npy", +] + [tool.setuptools.packages.find] where = ["."] include = ["plottle*"] From 4930ae7e88ebf1a6cc17e5d4876148f9a87e5b97 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 14:47:53 +0000 Subject: [PATCH 4/5] Make CI actually verify what it claims (A-10, A-11, A-12, A-38) CORRECTION to the audit's A-10. I reported that CI "currently produces 6 mypy errors, so the next push to main goes red". That was wrong, and wrong in a way that mattered. Verified by running CI's exact lint commands against origin/main in a CI-like environment: mypy ... -> Success: no issues found in 13 source files ruff -> All checks passed! The 6 errors I measured were an artifact of my local environment having matplotlib and numpy installed. CI's lint job installed only `ruff mypy types-PyYAML types-requests`, so with no scientific stack present --ignore-missing-imports collapsed numpy, scipy, pandas, matplotlib, seaborn, plotly and streamlit to `Any`. The real finding is worse than the one I reported: mypy was printing "Success" while checking essentially nothing. For a library whose entire surface is third-party array and figure types, every meaningful type relationship was unchecked. It was green because it was blind. A-10 -- the lint job now installs the project (`pip install -e ".[dev,formats,nist]"`), so mypy checks against real stubs. That surfaced 8 errors, now all fixed: - report.py x3: add_axes is typed for a 4-tuple, not a list. - plotting.py: histogram's `bins` accepted an ndarray, which is valid at runtime but not per matplotlib's stub -- converted, and it no longer shadows the parameter with the edges hist() returns. - plotting.py x2: set_theta_* live on PolarAxes; plt.subplots is typed as returning the base Axes. Narrowed with cast. - data_tools.py x3: my own _safe_eval from f1302ae reused `op` across branches and left the operator maps unannotated. These two CI *would* have caught -- so the step was not useless, just nearly blind. ruff and mypy are now pinned exactly in the dev extra; unpinned lint tools mean CI can turn red with no code change, and dependabot's dev-tools group already exists to bump them. A-11 -- `pytest tests/` replaces the hand-written 15-file list, so test_cli.py (27 tests) and test_integration.py (14) run for the first time. A-12 -- 6-cell matrix: ubuntu x 3.9/3.10/3.11/3.12 plus macos x 3.12 and windows x 3.11, with fail-fast disabled. Verified beforehand that all 75 source files parse under 3.9 syntax with no `X | Y` annotations or match statements, so the 3.9 cells are plausible rather than aspirational. macOS x 3.9 -- the exact G-010 environment -- is not in the matrix: macOS runners are arm64 and actions/setup-python has no 3.9 build for them. Rather than pin an Intel runner that GitHub is retiring, tests/test_gui_paths.py covers it OS-independently: 13 tests asserting the GUI path constants stay `.resolve()`-anchored (G-010), that Home.py routes only to page files that exist, and that every packaged asset and gallery/example entry actually ships (A-09). Both guards were mutation-tested -- removing `.resolve()` fails 2 tests, hiding one asset fails 1 -- so they are not vacuous. A-38 -- added `permissions: contents: read`, a concurrency group, and pip caching. docs.yml action versions bumped to match tests.yml, which is what the four open dependabot PRs cover. 967 passed, 21 skipped. ruff, ruff format and mypy all clean with the project installed. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013YLgSnkyRUosy5sxWUb33P --- .github/workflows/docs.yml | 8 +-- .github/workflows/tests.yml | 87 ++++++++++++++-------- plottle/data_tools.py | 28 ++++---- plottle/plotting.py | 21 ++++-- plottle/report.py | 6 +- pyproject.toml | 7 +- tests/test_gui_paths.py | 139 ++++++++++++++++++++++++++++++++++++ 7 files changed, 238 insertions(+), 58 deletions(-) create mode 100644 tests/test_gui_paths.py diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 07a8446..116407a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -23,13 +23,13 @@ jobs: name: Build site runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Configure Pages - uses: actions/configure-pages@v4 + uses: actions/configure-pages@v6 - name: Upload Pages artifact - uses: actions/upload-pages-artifact@v3 + uses: actions/upload-pages-artifact@v5 with: path: ./docs/ @@ -43,4 +43,4 @@ jobs: steps: - name: Deploy to GitHub Pages id: deployment - uses: actions/deploy-pages@v4 + uses: actions/deploy-pages@v5 diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 2ce5441..68cd6aa 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -6,8 +6,18 @@ on: pull_request: branches: [main] +# Read-only is all either job needs. +permissions: + contents: read + +# Superseding pushes cancel in-flight runs instead of queueing behind them. +concurrency: + group: tests-${{ github.ref }} + cancel-in-progress: true + jobs: lint: + name: Lint and type-check runs-on: ubuntu-latest steps: @@ -17,9 +27,16 @@ jobs: uses: actions/setup-python@v6 with: python-version: "3.11" + cache: pip + cache-dependency-path: pyproject.toml - - name: Install lint tools - run: pip install ruff mypy types-PyYAML types-requests + # Install the project itself, not just the lint tools. Previously this job + # installed only `ruff mypy types-*`, so numpy/pandas/matplotlib/streamlit were + # all absent and --ignore-missing-imports collapsed them to `Any` -- mypy was + # reporting "Success" while checking almost nothing. ruff and mypy are pinned in + # the dev extra so a tool release cannot turn CI red on its own. See audit A-10. + - name: Install project and dev tooling + run: pip install -e ".[dev,formats,nist]" - name: ruff check run: ruff check plottle/ @@ -46,45 +63,57 @@ jobs: --ignore-missing-imports --no-strict-optional --explicit-package-bases test: - runs-on: ubuntu-latest + name: Tests (${{ matrix.os }}, Python ${{ matrix.python-version }}) + runs-on: ${{ matrix.os }} + + strategy: + # One failing cell should not hide the others -- knowing whether a break is + # version-specific or universal is most of the diagnosis. + fail-fast: false + matrix: + # pyproject declares requires-python = ">=3.9,!=3.9.7" and classifiers for + # 3.9-3.12, so every one of those is tested. Testing only 3.11 is what let + # G-010 (st.Page on 3.9) and the tomllib import in the Settings page (3.11+ + # stdlib) reach users. See audit A-12. + os: [ubuntu-latest] + python-version: ["3.9", "3.10", "3.11", "3.12"] + include: + # Non-Linux spot checks: the setup/launch scripts target macOS and Windows. + # Note macOS runners are arm64 and actions/setup-python has no 3.9 build for + # them, so the exact G-010 combination (macOS + 3.9) needs an Intel runner. + # Until then it is covered by ubuntu 3.9 plus the absolute-path assertions in + # tests/test_gui_paths.py, which are OS-independent. + - os: macos-latest + python-version: "3.12" + - os: windows-latest + python-version: "3.11" steps: - uses: actions/checkout@v6 - - name: Set up Python 3.11 + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v6 with: - python-version: "3.11" + python-version: ${{ matrix.python-version }} + cache: pip + cache-dependency-path: pyproject.toml - - name: Install dependencies - run: pip install -r requirements.txt + - name: Install project and test dependencies + run: pip install -e ".[dev,formats,nist]" - - name: Run tests with coverage + # Run the whole suite. This previously enumerated 15 files by hand and so never + # ran tests/test_cli.py (27 tests, the entire CLI surface) or + # tests/test_integration.py (14 tests) -- a hand-maintained list gives no signal + # when it falls behind. See audit A-11. + - name: Run tests env: MPLBACKEND: Agg - run: | - pytest \ - tests/test_io.py \ - tests/test_math.py \ - tests/test_plotting.py \ - tests/test_plotting_advanced.py \ - tests/test_utils.py \ - tests/test_signal.py \ - tests/test_peaks.py \ - tests/test_data_tools.py \ - tests/test_annotations.py \ - tests/test_spectroscopy.py \ - tests/test_molecular_parsers.py \ - tests/test_batch.py \ - tests/test_report.py \ - tests/test_plugin_loader.py \ - tests/test_nist.py \ - --cov=plottle \ - --cov-report=xml \ - --cov-report=term-missing \ - -v + run: pytest tests/ --cov=plottle --cov-report=xml --cov-report=term-missing -v + # One cell only: with a matrix, every job uploading the same artifact name is an + # error on upload-artifact v4+. - name: Upload coverage report + if: matrix.os == 'ubuntu-latest' && matrix.python-version == '3.11' uses: actions/upload-artifact@v7 with: name: coverage-report diff --git a/plottle/data_tools.py b/plottle/data_tools.py index f1d07d0..ecc5294 100644 --- a/plottle/data_tools.py +++ b/plottle/data_tools.py @@ -36,7 +36,7 @@ import ast import math import operator -from typing import Any, Dict, List, Optional +from typing import Any, Callable, Dict, List, Optional import numpy as np import pandas as pd @@ -84,7 +84,7 @@ # whitelists AST node types and rejects `ast.Attribute` outright. Anything not # explicitly allowed raises ValueError rather than being evaluated. -_BIN_OPS = { +_BIN_OPS: Dict[type, Callable[[Any, Any], Any]] = { ast.Add: operator.add, ast.Sub: operator.sub, ast.Mult: operator.mul, @@ -94,13 +94,13 @@ ast.Pow: operator.pow, } -_UNARY_OPS = { +_UNARY_OPS: Dict[type, Callable[[Any], Any]] = { ast.UAdd: operator.pos, ast.USub: operator.neg, ast.Not: operator.not_, } -_COMPARE_OPS = { +_COMPARE_OPS: Dict[type, Callable[[Any, Any], Any]] = { ast.Eq: operator.eq, ast.NotEq: operator.ne, ast.Lt: operator.lt, @@ -185,20 +185,20 @@ def _eval(node: ast.AST) -> Any: return namespace[node.id] if isinstance(node, ast.BinOp): - op = _BIN_OPS.get(type(node.op)) - if op is None: + bin_op = _BIN_OPS.get(type(node.op)) + if bin_op is None: raise ValueError(f"operator `{type(node.op).__name__}` is not allowed") left, right = _eval(node.left), _eval(node.right) - if op is operator.pow and isinstance(right, (int, float)): + if bin_op is operator.pow and isinstance(right, (int, float)): if abs(right) > _MAX_POW_EXPONENT: raise ValueError(f"exponent {right} exceeds the limit of {_MAX_POW_EXPONENT}") - return op(left, right) + return bin_op(left, right) if isinstance(node, ast.UnaryOp): - op = _UNARY_OPS.get(type(node.op)) - if op is None: + unary_op = _UNARY_OPS.get(type(node.op)) + if unary_op is None: raise ValueError(f"operator `{type(node.op).__name__}` is not allowed") - return op(_eval(node.operand)) + return unary_op(_eval(node.operand)) if isinstance(node, ast.BoolOp): values = [_eval(v) for v in node.values] @@ -211,11 +211,11 @@ def _eval(node: ast.AST) -> Any: result = None left = _eval(node.left) for op_node, comparator_node in zip(node.ops, node.comparators): - op = _COMPARE_OPS.get(type(op_node)) - if op is None: + cmp_op = _COMPARE_OPS.get(type(op_node)) + if cmp_op is None: raise ValueError(f"comparison `{type(op_node).__name__}` is not allowed") right = _eval(comparator_node) - outcome = op(left, right) + outcome = cmp_op(left, right) result = outcome if result is None else (result & outcome) left = right return result diff --git a/plottle/plotting.py b/plottle/plotting.py index 9cfb661..147698e 100644 --- a/plottle/plotting.py +++ b/plottle/plotting.py @@ -17,10 +17,11 @@ from matplotlib.figure import Figure from matplotlib.axes import Axes from pathlib import Path -from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union, cast if TYPE_CHECKING: import pandas as pd + from matplotlib.projections.polar import PolarAxes # Okabe-Ito colorblind-safe palette (8 colors) COLORBLIND_PALETTE: List[str] = [ @@ -252,9 +253,14 @@ def histogram( fig, ax = create_figure(figsize=figsize) - counts, bins, patches = ax.hist( + # matplotlib types `bins` as int | Sequence[float] | str | None; an ndarray of + # explicit edges is valid at runtime but not per the stub, so convert it. + _bins: Union[int, str, List[float], None] = ( + [float(edge) for edge in bins] if isinstance(bins, np.ndarray) else bins + ) + counts, bin_edges, patches = ax.hist( data, - bins=bins, + bins=_bins, color=color, alpha=alpha, density=density, @@ -269,7 +275,7 @@ def histogram( # Calculate statistics info = { "counts": counts, - "bins": bins, + "bins": bin_edges, "mean": float(np.mean(data)), "std": float(np.std(data)), } @@ -1207,8 +1213,11 @@ def polar_plot( theta_arr = np.asarray(theta, dtype=float) r_arr = np.asarray(r, dtype=float) fig, ax = plt.subplots(figsize=figsize, subplot_kw={"projection": "polar"}) - ax.set_theta_zero_location(theta_zero_location) - ax.set_theta_direction(theta_direction) + # subplot_kw guarantees a PolarAxes at runtime; plt.subplots is typed as returning + # the base Axes, which has no set_theta_* methods. + polar_ax = cast("PolarAxes", ax) + polar_ax.set_theta_zero_location(theta_zero_location) + polar_ax.set_theta_direction(theta_direction) ax.plot(theta_arr, r_arr, color=color, linestyle=linestyle, linewidth=linewidth, **kwargs) if fill: ax.fill(theta_arr, r_arr, alpha=fill_alpha, color=color) diff --git a/plottle/report.py b/plottle/report.py index 7b96498..5bab4e8 100644 --- a/plottle/report.py +++ b/plottle/report.py @@ -62,7 +62,7 @@ def _make_title_page( A matplotlib Figure (caller is responsible for closing it). """ fig = plt.figure(figsize=(8.5, 11), facecolor="white") - ax = fig.add_axes([0, 0, 1, 1]) + ax = fig.add_axes((0.0, 0.0, 1.0, 1.0)) ax.set_axis_off() # Decorative horizontal rules @@ -200,7 +200,7 @@ def _dataframe_to_figure( row_height = 0.35 fig_height = max(3.0, min(14.0, 1.5 + n_rows * row_height)) fig = plt.figure(figsize=(11, fig_height), facecolor="white") - ax = fig.add_axes([0.02, 0.02, 0.96, 0.96]) + ax = fig.add_axes((0.02, 0.02, 0.96, 0.96)) ax.set_axis_off() # Title @@ -273,7 +273,7 @@ def _analysis_result_to_figure(result: dict) -> Figure: A matplotlib Figure (caller is responsible for closing it). """ fig = plt.figure(figsize=(8.5, 6), facecolor="white") - ax = fig.add_axes([0.05, 0.05, 0.90, 0.90]) + ax = fig.add_axes((0.05, 0.05, 0.90, 0.90)) ax.set_axis_off() r_type = result.get("type", "analysis") diff --git a/pyproject.toml b/pyproject.toml index 57550c8..7eac5bc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -60,8 +60,11 @@ docs = [ dev = [ "pytest>=7.4.0", "pytest-cov>=4.1.0", - "ruff>=0.4.0", - "mypy>=1.5.0", + # ruff and mypy are pinned exactly: both gate CI, and both add new checks in + # minor releases, so an unpinned floor means CI can turn red with no code + # change. Dependabot's `dev-tools` group bumps these. See audit A-10. + "ruff==0.16.1", + "mypy==2.3.0", "types-PyYAML>=6.0.0", "types-requests>=2.28.0", "build>=1.0.0", diff --git a/tests/test_gui_paths.py b/tests/test_gui_paths.py new file mode 100644 index 0000000..d355b6a --- /dev/null +++ b/tests/test_gui_paths.py @@ -0,0 +1,139 @@ +"""Path-resolution guards for the Streamlit GUI. + +These tests exist because two shipped defects came from path handling that only +broke on a platform or Python version CI did not test: + +- **G-010** — ``Path(__file__)`` is *relative* when Streamlit invokes the entry + script, so ``Path(__file__).parent / "pages"`` produced a relative path that + ``st.Page()`` could not stat. Reported by a student on macOS / Python 3.9. + The fix was ``.resolve()``; these tests assert it stays. + +- **A-09** — runtime assets were resolved relative to the *repository root*, so a + pip-installed GUI came up with no logo, no branding, no example data and an + empty gallery. Every ``.exists()`` guard in ``Home.py`` meant this failed + silently. These tests assert the assets are inside the package and present. + +Both checks are OS- and version-independent, which is the point: they hold on +every matrix cell rather than only on the one where the bug happened to show. +""" + +import json +from pathlib import Path + +import pytest + + +@pytest.fixture(scope="module") +def package_root() -> Path: + import plottle + + return Path(plottle.__file__).resolve().parent + + +# ── G-010: every GUI path must be absolute ──────────────────────────────────── + + +class TestGuiPathsAreAbsolute: + """Regression guard for G-010. + + ``Home.py`` imports streamlit at module scope, so rather than importing it we + read the source and assert the path expressions are anchored with + ``.resolve()``. That keeps the test dependency-free and lets it run on every + matrix cell. + """ + + @pytest.fixture(scope="class") + def home_source(self, package_root: Path) -> str: + return (package_root / "Home.py").read_text(encoding="utf-8") + + @pytest.mark.parametrize("name", ["_PAGES_DIR", "_ASSETS_DIR"]) + def test_path_constants_are_resolved(self, home_source: str, name: str) -> None: + line = next( + (ln for ln in home_source.splitlines() if ln.strip().startswith(f"{name} =")), + None, + ) + assert line is not None, f"{name} not found in Home.py" + assert ".resolve()" in line, ( + f"{name} must be anchored with Path(__file__).resolve() -- a relative " + f"__file__ under `streamlit run` is what caused G-010. Got: {line.strip()}" + ) + + def test_no_unresolved_file_parent_paths(self, home_source: str) -> None: + offenders = [ + ln.strip() + for ln in home_source.splitlines() + if "Path(__file__).parent" in ln and ".resolve()" not in ln + ] + assert not offenders, ( + "Path(__file__).parent without .resolve() reintroduces G-010: " f"{offenders}" + ) + + def test_page_files_referenced_by_home_all_exist(self, package_root: Path) -> None: + import re + + source = (package_root / "Home.py").read_text(encoding="utf-8") + referenced = set(re.findall(r'_PAGES_DIR / "([^"]+)"', source)) + assert referenced, "expected Home.py to reference page files via _PAGES_DIR" + + pages_dir = package_root / "pages" + missing = sorted(name for name in referenced if not (pages_dir / name).exists()) + assert not missing, f"Home.py routes to page files that do not exist: {missing}" + + +# ── A-09: assets must live inside the package and be present ────────────────── + + +class TestPackagedAssetsArePresent: + """Regression guard for A-09. + + Asserted against the installed package directory, so this fails if an asset is + moved back outside the package or dropped from ``package-data``. + """ + + @pytest.mark.parametrize( + "relative_path", + [ + "assets/logo.png", + "assets/logo.ico", + "assets/nccu-horiz-logo.png", + "assets/nccu-wings.png", + "gallery/manifest.json", + "example-data/Artificial/normal_distribution.csv", + "example-data/Artificial/gaussian_surface.npy", + ], + ) + def test_asset_ships_with_the_package(self, package_root: Path, relative_path: str) -> None: + asset = package_root / relative_path + assert asset.is_file(), ( + f"{relative_path} is missing from the package. Assets resolved relative to " + "the repo root are absent from a pip install -- see audit A-09." + ) + assert asset.stat().st_size > 0, f"{relative_path} is empty" + + def test_every_gallery_manifest_entry_has_its_png(self, package_root: Path) -> None: + manifest = json.loads((package_root / "gallery" / "manifest.json").read_text("utf-8")) + missing = [ + entry["filename"] + for entry in manifest + if not (package_root / "gallery" / entry["filename"]).is_file() + ] + assert not missing, f"gallery manifest references missing PNGs: {missing}" + + def test_example_metadata_matches_shipped_files(self, package_root: Path) -> None: + """Every dataset the Data Upload page advertises must actually ship.""" + import re + + source = (package_root / "pages" / "1_Data_Upload.py").read_text(encoding="utf-8") + + # Slice from `_EXAMPLES = {` to its closing brace at column 0, so this does not + # depend on whatever happens to follow the dict. + lines = source.splitlines() + start = next(i for i, ln in enumerate(lines) if ln.startswith("_EXAMPLES = {")) + end = next(i for i, ln in enumerate(lines[start:], start) if ln == "}") + block = "\n".join(lines[start : end + 1]) + advertised = set(re.findall(r'"([\w-]+\.(?:csv|npy))":', block)) + assert advertised, "expected _EXAMPLES to list example filenames" + + example_dir = package_root / "example-data" / "Artificial" + missing = sorted(name for name in advertised if not (example_dir / name).exists()) + assert not missing, f"_EXAMPLES advertises datasets that do not ship: {missing}" From 002ef49d234bb64318461a0e1ab8bfe8611951be Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 31 Jul 2026 15:04:02 +0000 Subject: [PATCH 5/5] Split a `test` extra so the Python 3.9 matrix cell can install Fixes the one red cell on PR #23. Six of seven were green; ubuntu x Python 3.9 failed in 16 seconds: ERROR: No matching distribution found for mypy==2.3.0; extra == "dev" (from versions: ... 1.18.2, 1.19.0, 1.19.1) This is my bug from 4930ae7, not a Python 3.9 incompatibility. mypy 2.3.0 requires Python >=3.10, and I had the test job installing `.[dev,formats,nist]` -- so the 3.9 cell died resolving lint tooling it never runs, before a single test executed. Notably the library itself was never the problem: pip had already resolved numpy, pandas, scipy, matplotlib, streamlit>=1.49 and tomli for 3.9 without complaint. TDEC-012's Python 3.9 floor stands. Added a `test` extra (pytest + pytest-cov only) and pointed the test matrix at `.[test,formats,nist]`. `dev` now includes `plottle[test]` and keeps the lint tools, so the lint job and contributors are unchanged. The underlying mistake was coupling the test matrix's dependency floor to the lint tools' own Python support. Comments on both the extra and the workflow step record that the matrix must install `[test,...]`, never `[dev,...]`. Verified in a clean venv that `[test,formats,nist]` resolves with no mypy, ruff, build, twine or types-* leaking in, and with pytest, pytest-cov, h5py, xarray, netcdf4, requests, streamlit and numpy all present. My first check of this used `pip --dry-run --report` in the working venv and was worthless -- that report lists only newly-installed packages, so everything already present read as missing. Clean venv, per G-018. 967 passed, 21 skipped locally. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_013YLgSnkyRUosy5sxWUb33P --- .github/workflows/tests.yml | 5 ++++- pyproject.toml | 12 +++++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 68cd6aa..0c84f3d 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -98,8 +98,11 @@ jobs: cache: pip cache-dependency-path: pyproject.toml + # `[test,...]`, not `[dev,...]`: the lint tools pinned in `dev` have higher + # Python floors than this matrix spans (mypy 2.3 requires >=3.10), and the test + # job does not run them. - name: Install project and test dependencies - run: pip install -e ".[dev,formats,nist]" + run: pip install -e ".[test,formats,nist]" # Run the whole suite. This previously enumerated 15 files by hand and so never # ran tests/test_cli.py (27 tests, the entire CLI surface) or diff --git a/pyproject.toml b/pyproject.toml index 7eac5bc..f57483d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -57,12 +57,22 @@ docs = [ "sphinx>=7.0.0", "furo>=2024.1.29", ] -dev = [ +# Only what running the test suite needs. Deliberately separate from `dev`: the test +# matrix spans Python 3.9-3.12, and the lint tools pinned in `dev` have their own, +# higher Python floors (mypy 2.3 requires >=3.10). Installing `dev` in the test job +# made the Python 3.9 cell fail while resolving lint tooling it never runs. +# The test matrix must install `[test,...]`, never `[dev,...]`. +test = [ "pytest>=7.4.0", "pytest-cov>=4.1.0", +] +dev = [ + "plottle[test]", # ruff and mypy are pinned exactly: both gate CI, and both add new checks in # minor releases, so an unpinned floor means CI can turn red with no code # change. Dependabot's `dev-tools` group bumps these. See audit A-10. + # NOTE: these pins constrain the Python versions `dev` can install on. Keep them + # out of anything the 3.9 test cell installs. "ruff==0.16.1", "mypy==2.3.0", "types-PyYAML>=6.0.0",