easy-viz 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
easy_viz-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Arian Mokhtariha
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,72 @@
1
+ Metadata-Version: 2.4
2
+ Name: easy-viz
3
+ Version: 0.1.0
4
+ Summary: The Metabase / Power BI of Python at the code level: query result in, finished Plotly figure out.
5
+ Keywords: plotly,visualization,charts,sql,analytics,dataframe
6
+ Author: Arian Mokhtariha
7
+ License-Expression: MIT
8
+ License-File: LICENSE
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Intended Audience :: Science/Research
11
+ Classifier: Framework :: Jupyter
12
+ Classifier: Operating System :: OS Independent
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.13
15
+ Classifier: Programming Language :: Python :: 3.14
16
+ Classifier: Programming Language :: Python :: 3.15
17
+ Classifier: Topic :: Scientific/Engineering :: Visualization
18
+ Classifier: Typing :: Typed
19
+ Requires-Dist: plotly>=7.1
20
+ Requires-Dist: narwhals>=2.8
21
+ Requires-Dist: numpy>=2.1
22
+ Requires-Dist: scipy>=1.14.1
23
+ Requires-Dist: kaleido>=1.5 ; extra == 'export'
24
+ Requires-Python: >=3.13
25
+ Project-URL: Homepage, https://github.com/arianmokhtariha/easy-viz
26
+ Project-URL: Repository, https://github.com/arianmokhtariha/easy-viz
27
+ Project-URL: Changelog, https://github.com/arianmokhtariha/easy-viz/blob/main/CHANGELOG.md
28
+ Project-URL: Issues, https://github.com/arianmokhtariha/easy-viz/issues
29
+ Provides-Extra: export
30
+ Description-Content-Type: text/markdown
31
+
32
+ # easy-viz
33
+
34
+ [![CI](https://github.com/arianmokhtariha/easy-viz/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/arianmokhtariha/easy-viz/actions/workflows/ci.yml)
35
+
36
+ The Metabase / Power BI of Python, at the code level: a query result goes in, a
37
+ finished Plotly figure comes out.
38
+
39
+ Run your SQL (or anything else), pass the table straight to an easy-viz function, and
40
+ get a finished chart. Every feature of the chart is a typed, documented parameter, so a
41
+ plot goes from a one-line default to an advanced chart by changing arguments, not by
42
+ writing plotting code. Every function returns a plain Plotly figure, so anything the
43
+ parameters don't cover can still be done with Plotly.
44
+
45
+ > **Status:** alpha, under active development. The API may still change between
46
+ > 0.x releases; the [changelog](https://github.com/arianmokhtariha/easy-viz/blob/main/CHANGELOG.md)
47
+ > lists every change.
48
+
49
+ ## Install
50
+ ```
51
+ pip install easy-viz
52
+ ```
53
+ For PNG, SVG and PDF export with `ev.save()`, add the `export` extra (it needs
54
+ Chrome; `plotly_get_chrome` installs it):
55
+ ```
56
+ pip install "easy-viz[export]"
57
+ ```
58
+ Python 3.13 or newer.
59
+
60
+ The [gallery](https://github.com/arianmokhtariha/easy-viz/tree/main/gallery) shows
61
+ every function on a fictional retailer's data, starting from a SQL query each time.
62
+
63
+ ## Development
64
+ ```
65
+ uv sync --all-extras --all-groups
66
+ uv run pytest
67
+ ```
68
+ What easy-viz is for: [`docs/product.md`](https://github.com/arianmokhtariha/easy-viz/blob/main/docs/product.md).
69
+ How it's organised, and why: [`docs/`](https://github.com/arianmokhtariha/easy-viz/tree/main/docs).
70
+ <!-- Links are absolute because this file is also the PyPI project page, where
71
+ relative links break. -->
72
+
@@ -0,0 +1,41 @@
1
+ # easy-viz
2
+
3
+ [![CI](https://github.com/arianmokhtariha/easy-viz/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/arianmokhtariha/easy-viz/actions/workflows/ci.yml)
4
+
5
+ The Metabase / Power BI of Python, at the code level: a query result goes in, a
6
+ finished Plotly figure comes out.
7
+
8
+ Run your SQL (or anything else), pass the table straight to an easy-viz function, and
9
+ get a finished chart. Every feature of the chart is a typed, documented parameter, so a
10
+ plot goes from a one-line default to an advanced chart by changing arguments, not by
11
+ writing plotting code. Every function returns a plain Plotly figure, so anything the
12
+ parameters don't cover can still be done with Plotly.
13
+
14
+ > **Status:** alpha, under active development. The API may still change between
15
+ > 0.x releases; the [changelog](https://github.com/arianmokhtariha/easy-viz/blob/main/CHANGELOG.md)
16
+ > lists every change.
17
+
18
+ ## Install
19
+ ```
20
+ pip install easy-viz
21
+ ```
22
+ For PNG, SVG and PDF export with `ev.save()`, add the `export` extra (it needs
23
+ Chrome; `plotly_get_chrome` installs it):
24
+ ```
25
+ pip install "easy-viz[export]"
26
+ ```
27
+ Python 3.13 or newer.
28
+
29
+ The [gallery](https://github.com/arianmokhtariha/easy-viz/tree/main/gallery) shows
30
+ every function on a fictional retailer's data, starting from a SQL query each time.
31
+
32
+ ## Development
33
+ ```
34
+ uv sync --all-extras --all-groups
35
+ uv run pytest
36
+ ```
37
+ What easy-viz is for: [`docs/product.md`](https://github.com/arianmokhtariha/easy-viz/blob/main/docs/product.md).
38
+ How it's organised, and why: [`docs/`](https://github.com/arianmokhtariha/easy-viz/tree/main/docs).
39
+ <!-- Links are absolute because this file is also the PyPI project page, where
40
+ relative links break. -->
41
+
@@ -0,0 +1,130 @@
1
+ [project]
2
+ name = "easy-viz"
3
+ version = "0.1.0"
4
+ description = "The Metabase / Power BI of Python at the code level: query result in, finished Plotly figure out."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ license-files = ["LICENSE"]
8
+ requires-python = ">=3.13"
9
+ keywords = [
10
+ "plotly",
11
+ "visualization",
12
+ "charts",
13
+ "sql",
14
+ "analytics",
15
+ "dataframe",
16
+ ]
17
+ classifiers = [
18
+ "Development Status :: 3 - Alpha",
19
+ "Intended Audience :: Science/Research",
20
+ "Framework :: Jupyter",
21
+ "Operating System :: OS Independent",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.13",
24
+ "Programming Language :: Python :: 3.14",
25
+ "Programming Language :: Python :: 3.15",
26
+ "Topic :: Scientific/Engineering :: Visualization",
27
+ "Typing :: Typed",
28
+ ]
29
+ dependencies = [
30
+ "plotly>=7.1",
31
+ "narwhals>=2.8",
32
+ "numpy>=2.1",
33
+ "scipy>=1.14.1",
34
+ ]
35
+
36
+ [[project.authors]]
37
+ name = "Arian Mokhtariha"
38
+
39
+ [project.urls]
40
+ Homepage = "https://github.com/arianmokhtariha/easy-viz"
41
+ Repository = "https://github.com/arianmokhtariha/easy-viz"
42
+ Changelog = "https://github.com/arianmokhtariha/easy-viz/blob/main/CHANGELOG.md"
43
+ Issues = "https://github.com/arianmokhtariha/easy-viz/issues"
44
+
45
+ [project.optional-dependencies]
46
+ export = ["kaleido>=1.5"]
47
+
48
+ [dependency-groups]
49
+ dev = [
50
+ "pytest>=9",
51
+ "pytest-cov",
52
+ "syrupy>=6",
53
+ "ruff>=0.17",
54
+ "mypy>=2.4",
55
+ "scipy-stubs",
56
+ "pandas>=2.2",
57
+ "polars>=1.0",
58
+ "pyarrow>=17",
59
+ "kaleido>=1.5",
60
+ "ipykernel",
61
+ "nbformat>=4.2",
62
+ "nbmake",
63
+ "nbclient>=0.10",
64
+ "duckdb>=1.5 ; python_full_version < '3.15'",
65
+ ]
66
+ docs = [
67
+ "sphinx",
68
+ "pydata-sphinx-theme",
69
+ "numpydoc",
70
+ "myst-nb>=1.4",
71
+ ]
72
+
73
+ [build-system]
74
+ requires = ["uv_build>=0.13,<0.14"]
75
+ build-backend = "uv_build"
76
+
77
+ [tool.uv.build-backend]
78
+ source-exclude = [
79
+ "**/CLAUDE.md",
80
+ "**/CLAUDE.local.md",
81
+ ".claude/**",
82
+ ]
83
+
84
+ [tool.ruff]
85
+ line-length = 88
86
+
87
+ [tool.ruff.lint]
88
+ select = [
89
+ "E",
90
+ "W",
91
+ "F",
92
+ "I",
93
+ "N",
94
+ "UP",
95
+ "B",
96
+ "SIM",
97
+ "NPY",
98
+ "D",
99
+ "ANN",
100
+ "TID",
101
+ "RUF",
102
+ ]
103
+
104
+ [tool.ruff.lint.pydocstyle]
105
+ convention = "numpy"
106
+
107
+ [tool.ruff.lint.flake8-tidy-imports]
108
+ ban-relative-imports = "all"
109
+
110
+ [tool.ruff.lint.per-file-ignores]
111
+ "tests/**" = ["D"]
112
+ "examples/**" = ["D"]
113
+ "gallery/_template.ipynb" = ["F401"]
114
+
115
+ [tool.mypy]
116
+ python_version = "3.13"
117
+ strict = true
118
+ warn_unreachable = true
119
+
120
+ [[tool.mypy.overrides]]
121
+ module = ["plotly.*"]
122
+ ignore_missing_imports = true
123
+
124
+ [tool.pytest.ini_options]
125
+ testpaths = ["tests"]
126
+ addopts = [
127
+ "--strict-markers",
128
+ "-ra",
129
+ ]
130
+ markers = ["export: needs Chrome for kaleido static export"]
@@ -0,0 +1,113 @@
1
+ [project]
2
+ name = "easy-viz"
3
+ version = "0.1.0"
4
+ description = "The Metabase / Power BI of Python at the code level: query result in, finished Plotly figure out."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ license-files = ["LICENSE"]
8
+ requires-python = ">=3.13"
9
+ authors = [{ name = "Arian Mokhtariha" }]
10
+ keywords = ["plotly", "visualization", "charts", "sql", "analytics", "dataframe"]
11
+ # The Python versions match the CI matrix (tests/test_packaging.py checks it). No
12
+ # license classifier: the SPDX `license` field above replaces it (PEP 639).
13
+ classifiers = [
14
+ "Development Status :: 3 - Alpha",
15
+ "Intended Audience :: Science/Research",
16
+ "Framework :: Jupyter",
17
+ "Operating System :: OS Independent",
18
+ "Programming Language :: Python :: 3",
19
+ "Programming Language :: Python :: 3.13",
20
+ "Programming Language :: Python :: 3.14",
21
+ "Programming Language :: Python :: 3.15",
22
+ "Topic :: Scientific/Engineering :: Visualization",
23
+ "Typing :: Typed",
24
+ ]
25
+ # Lower bounds only, never upper caps: easy-viz must fit into users' existing
26
+ # environments without forcing them to up- or downgrade anything.
27
+ dependencies = [
28
+ "plotly>=7.1", # rendering core
29
+ "narwhals>=2.8", # accepts pandas / polars / pyarrow / ... without depending on them;
30
+ # 2.8 is the first that reads DuckDB 1.5 query results
31
+ "numpy>=2.1", # numeric work; 2.1 is the first with Python 3.13 wheels
32
+ "scipy>=1.14.1", # statistics (KDE, regression, clustering, distributions);
33
+ # 1.14.1 is the first with Python 3.13 wheels
34
+ ]
35
+
36
+ [project.urls]
37
+ Homepage = "https://github.com/arianmokhtariha/easy-viz"
38
+ Repository = "https://github.com/arianmokhtariha/easy-viz"
39
+ Changelog = "https://github.com/arianmokhtariha/easy-viz/blob/main/CHANGELOG.md"
40
+ Issues = "https://github.com/arianmokhtariha/easy-viz/issues"
41
+
42
+ [project.optional-dependencies]
43
+ export = ["kaleido>=1.5"] # static PNG/SVG/PDF export; needs Chrome (plotly_get_chrome)
44
+
45
+ [dependency-groups]
46
+ dev = [
47
+ "pytest>=9",
48
+ "pytest-cov", # test coverage report
49
+ "syrupy>=6", # snapshot tests of figure output
50
+ "ruff>=0.17", # lint + format
51
+ "mypy>=2.4", # type checking
52
+ "scipy-stubs", # type information for scipy
53
+ "pandas>=2.2", # test inputs: easy-viz must work with every dataframe library
54
+ "polars>=1.0",
55
+ "pyarrow>=17",
56
+ "kaleido>=1.5", # export tests and rendering figures for visual review
57
+ "ipykernel", # use the project's .venv as a notebook kernel
58
+ "nbformat>=4.2", # Plotly needs it to display figures in notebooks
59
+ "nbmake", # runs the gallery notebooks as tests
60
+ "nbclient>=0.10", # executes the gallery notebooks (scripts/build_gallery.py)
61
+ # The gallery notebooks query the showcase data with SQL. DuckDB has no Python
62
+ # 3.15 wheel yet, so the gallery builds and runs on 3.13/3.14 until it does.
63
+ "duckdb>=1.5 ; python_full_version < '3.15'",
64
+ ]
65
+ docs = [
66
+ "sphinx",
67
+ "pydata-sphinx-theme",
68
+ "numpydoc",
69
+ "myst-nb>=1.4", # renders Markdown docs and the gallery notebooks
70
+ ]
71
+
72
+ [build-system]
73
+ requires = ["uv_build>=0.13,<0.14"]
74
+ build-backend = "uv_build"
75
+
76
+ [tool.uv.build-backend]
77
+ # Agent guides and agent definitions are tracked but are not part of the library.
78
+ source-exclude = ["**/CLAUDE.md", "**/CLAUDE.local.md", ".claude/**"]
79
+
80
+ [tool.ruff]
81
+ line-length = 88
82
+
83
+ [tool.ruff.lint]
84
+ # E/W/F: errors, I: import order, N: naming, UP: modern syntax, B: likely bugs,
85
+ # SIM: simplifications, NPY: numpy, D: docstrings, ANN: type annotations,
86
+ # TID: import rules, RUF: ruff extras
87
+ select = ["E", "W", "F", "I", "N", "UP", "B", "SIM", "NPY", "D", "ANN", "TID", "RUF"]
88
+
89
+ [tool.ruff.lint.pydocstyle]
90
+ convention = "numpy"
91
+
92
+ [tool.ruff.lint.flake8-tidy-imports]
93
+ ban-relative-imports = "all" # absolute imports only
94
+
95
+ [tool.ruff.lint.per-file-ignores]
96
+ "tests/**" = ["D"]
97
+ "examples/**" = ["D"]
98
+ # Its placeholder cells are comments, so `ev` stays unused until a notebook fills them.
99
+ "gallery/_template.ipynb" = ["F401"]
100
+
101
+ [tool.mypy]
102
+ python_version = "3.13" # the supported minimum: flags 3.14/3.15-only features
103
+ strict = true
104
+ warn_unreachable = true
105
+
106
+ [[tool.mypy.overrides]]
107
+ module = ["plotly.*"] # Plotly ships no type information
108
+ ignore_missing_imports = true
109
+
110
+ [tool.pytest.ini_options]
111
+ testpaths = ["tests"]
112
+ addopts = ["--strict-markers", "-ra"]
113
+ markers = ["export: needs Chrome for kaleido static export"]
@@ -0,0 +1,21 @@
1
+ """easy-viz: analytical plots in one call."""
2
+
3
+ from easy_viz._warnings import EasyVizWarning
4
+ from easy_viz.config import get_config, set_config
5
+ from easy_viz.export import save, save_many
6
+ from easy_viz.plots.comparison import bar_plot
7
+ from easy_viz.plots.timeseries import line_plot
8
+ from easy_viz.theme import Theme, get_theme, set_theme
9
+
10
+ __all__ = [
11
+ "EasyVizWarning",
12
+ "Theme",
13
+ "bar_plot",
14
+ "get_config",
15
+ "get_theme",
16
+ "line_plot",
17
+ "save",
18
+ "save_many",
19
+ "set_config",
20
+ "set_theme",
21
+ ]