blowing-bubbles 0.2.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.
Files changed (35) hide show
  1. blowing_bubbles-0.2.0/LICENSE +21 -0
  2. blowing_bubbles-0.2.0/PKG-INFO +108 -0
  3. blowing_bubbles-0.2.0/README.md +79 -0
  4. blowing_bubbles-0.2.0/pyproject.toml +103 -0
  5. blowing_bubbles-0.2.0/pyproject.toml.orig +93 -0
  6. blowing_bubbles-0.2.0/src/blowing_bubbles/__init__.py +19 -0
  7. blowing_bubbles-0.2.0/src/blowing_bubbles/circuit_impedance/__init__.py +15 -0
  8. blowing_bubbles-0.2.0/src/blowing_bubbles/circuit_impedance/impedance.py +288 -0
  9. blowing_bubbles-0.2.0/src/blowing_bubbles/classes/__init__.py +25 -0
  10. blowing_bubbles-0.2.0/src/blowing_bubbles/classes/circuit_classes.py +999 -0
  11. blowing_bubbles-0.2.0/src/blowing_bubbles/classes/data_classes.py +1036 -0
  12. blowing_bubbles-0.2.0/src/blowing_bubbles/py.typed +0 -0
  13. blowing_bubbles-0.2.0/src/blowing_bubbles/scripts/__init__.py +18 -0
  14. blowing_bubbles-0.2.0/src/blowing_bubbles/scripts/fit_circuit.py +601 -0
  15. blowing_bubbles-0.2.0/src/blowing_bubbles/scripts/global_minimize.py +1393 -0
  16. blowing_bubbles-0.2.0/src/blowing_bubbles/scripts/quality.py +224 -0
  17. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/__init__.py +26 -0
  18. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/__main__.py +13 -0
  19. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/analysis.py +250 -0
  20. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/analysis_plots.py +127 -0
  21. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/app.py +613 -0
  22. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-128.png +0 -0
  23. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-16.png +0 -0
  24. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-256.png +0 -0
  25. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-32.png +0 -0
  26. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-48.png +0 -0
  27. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-512.png +0 -0
  28. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon-64.png +0 -0
  29. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon.png +0 -0
  30. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/assets/icon.svg +6 -0
  31. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/batch.py +250 -0
  32. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/desktop.py +219 -0
  33. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/folder_picker.py +73 -0
  34. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/live.py +129 -0
  35. blowing_bubbles-0.2.0/src/blowing_bubbles/ui/plots.py +159 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Oliver Mohr
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,108 @@
1
+ Metadata-Version: 2.4
2
+ Name: blowing-bubbles
3
+ Version: 0.2.0
4
+ Summary: Equivalent-circuit fitting of electrochemical impedance spectra (EIS).
5
+ Keywords: electrochemistry,impedance spectroscopy,EIS,equivalent circuit,CPE,fitting
6
+ Author: Oliver Mohr
7
+ Author-email: Oliver Mohr <oliver@mohr.dk>
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Intended Audience :: Science/Research
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Topic :: Scientific/Engineering :: Chemistry
17
+ Requires-Dist: matplotlib>=3.4
18
+ Requires-Dist: numpy>=1.20
19
+ Requires-Dist: pandas>=1.3
20
+ Requires-Dist: scipy>=1.7
21
+ Requires-Dist: streamlit>=1.66.1
22
+ Requires-Dist: tool>=0.8.0
23
+ Requires-Python: >=3.13
24
+ Project-URL: Repository, https://github.com/LePies/BlowingBubbles
25
+ Project-URL: Issues, https://github.com/LePies/BlowingBubbles/issues
26
+ Project-URL: Changelog, https://github.com/LePies/BlowingBubbles/blob/main/CHANGELOG.md
27
+ Project-URL: Documentation, https://github.com/LePies/BlowingBubbles/tree/main/docs
28
+ Description-Content-Type: text/markdown
29
+
30
+ <p align="center">
31
+ <img src="src/blowing_bubbles/ui/assets/icon.svg" width="140" alt="BlowingBubbles icon">
32
+ </p>
33
+
34
+ # BlowingBubbles
35
+
36
+ <p align="center">
37
+ <img src="https://img.shields.io/badge/python-3.14%2B-blue" alt="Python 3.14+">
38
+ <img src="https://img.shields.io/badge/license-MIT-green" alt="License: MIT">
39
+ <img src="https://img.shields.io/badge/docs-no_finished_builds-red" alt="Docs: no finished builds">
40
+ </p>
41
+
42
+ Python tools for electrochemical impedance spectroscopy (EIS): load spectra, evaluate
43
+ the R–CPE equivalent circuit, and fit branch parameters.
44
+
45
+ ## Installation
46
+
47
+ ```bash
48
+ pip install blowing-bubbles
49
+ ```
50
+
51
+ ## License
52
+
53
+ Released under the [MIT License](LICENSE): free use, modification, and redistribution.
54
+
55
+ ## Contributing
56
+
57
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the development setup (uv, ruff, ty,
58
+ deptry, pytest). To report a security issue, see [SECURITY.md](SECURITY.md).
59
+
60
+ ## Citation (published scientific work)
61
+
62
+ If you use BlowingBubbles in **published** scientific work (papers, theses, preprints,
63
+ citable reports), please cite the entry in [`CITATION.bib`](CITATION.bib) or
64
+ [`CITATION.cff`](CITATION.cff). Private or internal use does not require a citation.
65
+ See [`ACADEMIC_CITATION.md`](ACADEMIC_CITATION.md).
66
+
67
+ ## Interactive UI
68
+
69
+ An optional Streamlit UI (single-spectrum fitting, batch folder fitting, and a
70
+ live-tune mode) is included. Install the extra group and launch it:
71
+
72
+ ```bash
73
+ uv sync --group ui
74
+ streamlit run src/blowing_bubbles/ui/app.py # or: python -m blowing_bubbles.ui
75
+ ```
76
+
77
+ ### Windows desktop app
78
+
79
+ The same UI can be packaged as a standalone desktop app (native window via
80
+ Edge WebView2, no browser chrome):
81
+
82
+ ```bash
83
+ uv sync --group desktop
84
+ uv run pyinstaller desktop.spec --clean
85
+ # produces dist/BlowingBubbles/ with the launcher BlowingBubbles.exe inside
86
+ # (onedir build: starts much faster than onefile; ship the whole folder)
87
+ ```
88
+
89
+ The exe needs the WebView2 runtime on the target machine (preinstalled on
90
+ Windows 11; a bootstrapper is available for Windows 10).
91
+
92
+ ## Documentation
93
+
94
+ The documentation is built with [Sphinx](https://www.sphinx-doc.org/). The
95
+ Sphinx dependencies are in the `docs` dependency group, which `uv sync`
96
+ installs by default. From the project root:
97
+
98
+ ```bash
99
+ uv sync
100
+ uv run sphinx-build -W -b html docs/source docs/build/html
101
+ ```
102
+
103
+ Then open `docs/build/html/index.html` in a browser.
104
+
105
+ The build also runs the scripts in `examples/` to generate the example gallery.
106
+ That takes a few minutes the first time; after that, only changed examples are
107
+ re-run. To re-read all source files, add `-E`; to start completely fresh, delete
108
+ `docs/build/`. See `docs/source/getting_started.rst` for more details.
@@ -0,0 +1,79 @@
1
+ <p align="center">
2
+ <img src="src/blowing_bubbles/ui/assets/icon.svg" width="140" alt="BlowingBubbles icon">
3
+ </p>
4
+
5
+ # BlowingBubbles
6
+
7
+ <p align="center">
8
+ <img src="https://img.shields.io/badge/python-3.14%2B-blue" alt="Python 3.14+">
9
+ <img src="https://img.shields.io/badge/license-MIT-green" alt="License: MIT">
10
+ <img src="https://img.shields.io/badge/docs-no_finished_builds-red" alt="Docs: no finished builds">
11
+ </p>
12
+
13
+ Python tools for electrochemical impedance spectroscopy (EIS): load spectra, evaluate
14
+ the R–CPE equivalent circuit, and fit branch parameters.
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ pip install blowing-bubbles
20
+ ```
21
+
22
+ ## License
23
+
24
+ Released under the [MIT License](LICENSE): free use, modification, and redistribution.
25
+
26
+ ## Contributing
27
+
28
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for the development setup (uv, ruff, ty,
29
+ deptry, pytest). To report a security issue, see [SECURITY.md](SECURITY.md).
30
+
31
+ ## Citation (published scientific work)
32
+
33
+ If you use BlowingBubbles in **published** scientific work (papers, theses, preprints,
34
+ citable reports), please cite the entry in [`CITATION.bib`](CITATION.bib) or
35
+ [`CITATION.cff`](CITATION.cff). Private or internal use does not require a citation.
36
+ See [`ACADEMIC_CITATION.md`](ACADEMIC_CITATION.md).
37
+
38
+ ## Interactive UI
39
+
40
+ An optional Streamlit UI (single-spectrum fitting, batch folder fitting, and a
41
+ live-tune mode) is included. Install the extra group and launch it:
42
+
43
+ ```bash
44
+ uv sync --group ui
45
+ streamlit run src/blowing_bubbles/ui/app.py # or: python -m blowing_bubbles.ui
46
+ ```
47
+
48
+ ### Windows desktop app
49
+
50
+ The same UI can be packaged as a standalone desktop app (native window via
51
+ Edge WebView2, no browser chrome):
52
+
53
+ ```bash
54
+ uv sync --group desktop
55
+ uv run pyinstaller desktop.spec --clean
56
+ # produces dist/BlowingBubbles/ with the launcher BlowingBubbles.exe inside
57
+ # (onedir build: starts much faster than onefile; ship the whole folder)
58
+ ```
59
+
60
+ The exe needs the WebView2 runtime on the target machine (preinstalled on
61
+ Windows 11; a bootstrapper is available for Windows 10).
62
+
63
+ ## Documentation
64
+
65
+ The documentation is built with [Sphinx](https://www.sphinx-doc.org/). The
66
+ Sphinx dependencies are in the `docs` dependency group, which `uv sync`
67
+ installs by default. From the project root:
68
+
69
+ ```bash
70
+ uv sync
71
+ uv run sphinx-build -W -b html docs/source docs/build/html
72
+ ```
73
+
74
+ Then open `docs/build/html/index.html` in a browser.
75
+
76
+ The build also runs the scripts in `examples/` to generate the example gallery.
77
+ That takes a few minutes the first time; after that, only changed examples are
78
+ re-run. To re-read all source files, add `-E`; to start completely fresh, delete
79
+ `docs/build/`. See `docs/source/getting_started.rst` for more details.
@@ -0,0 +1,103 @@
1
+ [project]
2
+ name = "blowing-bubbles"
3
+ version = "0.2.0"
4
+ description = "Equivalent-circuit fitting of electrochemical impedance spectra (EIS)."
5
+ readme = "README.md"
6
+ license = "MIT"
7
+ license-files = ["LICENSE"]
8
+ requires-python = ">=3.13"
9
+ keywords = [
10
+ "electrochemistry",
11
+ "impedance spectroscopy",
12
+ "EIS",
13
+ "equivalent circuit",
14
+ "CPE",
15
+ "fitting",
16
+ ]
17
+ classifiers = [
18
+ "Development Status :: 4 - Beta",
19
+ "Intended Audience :: Science/Research",
20
+ "License :: OSI Approved :: MIT License",
21
+ "Operating System :: OS Independent",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.13",
24
+ "Topic :: Scientific/Engineering :: Chemistry",
25
+ ]
26
+ dependencies = [
27
+ "matplotlib>=3.4",
28
+ "numpy>=1.20",
29
+ "pandas>=1.3",
30
+ "scipy>=1.7",
31
+ "streamlit>=1.66.1",
32
+ "tool>=0.8.0",
33
+ ]
34
+
35
+ [[project.authors]]
36
+ name = "Oliver Mohr"
37
+ email = "oliver@mohr.dk"
38
+
39
+ [project.urls]
40
+ Repository = "https://github.com/LePies/BlowingBubbles"
41
+ Issues = "https://github.com/LePies/BlowingBubbles/issues"
42
+ Changelog = "https://github.com/LePies/BlowingBubbles/blob/main/CHANGELOG.md"
43
+ Documentation = "https://github.com/LePies/BlowingBubbles/tree/main/docs"
44
+
45
+ [build-system]
46
+ requires = ["uv_build>=0.11.16,<0.14.0"]
47
+ build-backend = "uv_build"
48
+
49
+ [dependency-groups]
50
+ dev = [
51
+ "deptry>=0.20",
52
+ "pytest>=9.2.0",
53
+ "pytest-cov>=7.0.0",
54
+ "ruff>=0.15.14",
55
+ "ty>=0.0.38",
56
+ ]
57
+ ui = ["streamlit>=1.40"]
58
+ desktop = [
59
+ "streamlit>=1.40",
60
+ "pywebview>=5.0",
61
+ "pyinstaller>=6.0",
62
+ ]
63
+ docs = [
64
+ "furo>=2025.12.19",
65
+ "myst-nb>=1.4.0",
66
+ "myst-parser>=5.1.0",
67
+ "sphinx>=9.0.4",
68
+ "sphinx-autoapi>=3.8.1",
69
+ "sphinx-gallery>=0.16",
70
+ "sphinxcontrib-bibtex>=2.7.0",
71
+ ]
72
+
73
+ [tool.uv]
74
+ default-groups = [
75
+ "dev",
76
+ "docs",
77
+ ]
78
+
79
+ [tool.pytest.ini_options]
80
+ pythonpath = ["src"]
81
+ testpaths = ["src/tests"]
82
+
83
+ [tool.coverage.run]
84
+ source = ["blowing_bubbles"]
85
+ omit = [
86
+ "src/blowing_bubbles/ui/*",
87
+ "src/tests/*",
88
+ ]
89
+
90
+ [tool.coverage.report]
91
+ show_missing = true
92
+ skip_covered = true
93
+
94
+ [tool.deptry]
95
+ known_first_party = ["blowing_bubbles"]
96
+ extend_exclude = ["docs/"]
97
+
98
+ [tool.deptry.package_module_name_map]
99
+ pywebview = "webview"
100
+
101
+ [tool.deptry.ignore]
102
+ DEP002 = ["tool"]
103
+ DEP004 = ["pytest"]
@@ -0,0 +1,93 @@
1
+ [project]
2
+ name = "blowing-bubbles"
3
+ version = "0.2.0"
4
+ description = "Equivalent-circuit fitting of electrochemical impedance spectra (EIS)."
5
+ readme = "README.md"
6
+ authors = [
7
+ { name = "Oliver Mohr", email = "oliver@mohr.dk" }
8
+ ]
9
+ license = "MIT"
10
+ license-files = ["LICENSE"]
11
+ requires-python = ">=3.13"
12
+ keywords = [
13
+ "electrochemistry",
14
+ "impedance spectroscopy",
15
+ "EIS",
16
+ "equivalent circuit",
17
+ "CPE",
18
+ "fitting",
19
+ ]
20
+ classifiers = [
21
+ "Development Status :: 4 - Beta",
22
+ "Intended Audience :: Science/Research",
23
+ "License :: OSI Approved :: MIT License",
24
+ "Operating System :: OS Independent",
25
+ "Programming Language :: Python :: 3",
26
+ "Programming Language :: Python :: 3.13",
27
+ "Topic :: Scientific/Engineering :: Chemistry",
28
+ ]
29
+ dependencies = [
30
+ "matplotlib>=3.4",
31
+ "numpy>=1.20",
32
+ "pandas>=1.3",
33
+ "scipy>=1.7",
34
+ "streamlit>=1.66.1",
35
+ "tool>=0.8.0",
36
+ ]
37
+
38
+ [project.urls]
39
+ Repository = "https://github.com/LePies/BlowingBubbles"
40
+ Issues = "https://github.com/LePies/BlowingBubbles/issues"
41
+ Changelog = "https://github.com/LePies/BlowingBubbles/blob/main/CHANGELOG.md"
42
+ Documentation = "https://github.com/LePies/BlowingBubbles/tree/main/docs"
43
+
44
+ [build-system]
45
+ requires = ["uv_build>=0.11.16,<0.14.0"]
46
+ build-backend = "uv_build"
47
+
48
+ [dependency-groups]
49
+ dev = [
50
+ "deptry>=0.20",
51
+ "pytest>=9.2.0",
52
+ "pytest-cov>=7.0.0",
53
+ "ruff>=0.15.14",
54
+ "ty>=0.0.38",
55
+ ]
56
+ ui = [
57
+ "streamlit>=1.40",
58
+ ]
59
+ desktop = [
60
+ "streamlit>=1.40",
61
+ "pywebview>=5.0",
62
+ "pyinstaller>=6.0",
63
+ ]
64
+ docs = [
65
+ "furo>=2025.12.19",
66
+ "myst-nb>=1.4.0",
67
+ "myst-parser>=5.1.0",
68
+ "sphinx>=9.0.4",
69
+ "sphinx-autoapi>=3.8.1",
70
+ "sphinx-gallery>=0.16",
71
+ "sphinxcontrib-bibtex>=2.7.0",
72
+ ]
73
+
74
+ [tool.uv]
75
+ default-groups = ["dev", "docs"]
76
+
77
+ [tool.pytest.ini_options]
78
+ pythonpath = ["src"]
79
+ testpaths = ["src/tests"]
80
+
81
+ [tool.coverage.run]
82
+ source = ["blowing_bubbles"]
83
+ omit = ["src/blowing_bubbles/ui/*", "src/tests/*"]
84
+
85
+ [tool.coverage.report]
86
+ show_missing = true
87
+ skip_covered = true
88
+
89
+ [tool.deptry]
90
+ known_first_party = ["blowing_bubbles"]
91
+ extend_exclude = ["docs/"]
92
+ package_module_name_map = { "pywebview" = "webview" }
93
+ ignore = { "DEP002" = ["tool"], "DEP004" = ["pytest"] }
@@ -0,0 +1,19 @@
1
+ r"""BlowingBubbles — equivalent-circuit fitting of electrochemical impedance spectra.
2
+
3
+ The main entry point is :class:`~blowing_bubbles.classes.EISData` (load, process
4
+ and fit a spectrum); fitted parameters are held in
5
+ :class:`~blowing_bubbles.classes.CircuitParameters` and
6
+ :class:`~blowing_bubbles.classes.FitResults`. Subpackages:
7
+
8
+ - :mod:`blowing_bubbles.classes` — data, parameter and fit-result containers;
9
+ - :mod:`blowing_bubbles.circuit_impedance` — impedance forward model and
10
+ analytic gradients;
11
+ - :mod:`blowing_bubbles.scripts` — fitting routines and fit-quality metrics.
12
+
13
+ Licensed under MIT (see ``LICENSE``). Cite ``CITATION.bib`` in published
14
+ scientific work; see ``ACADEMIC_CITATION.md``.
15
+ """
16
+
17
+ __version__ = "0.2.0"
18
+
19
+ __all__ = ["__version__", "circuit_impedance", "classes", "scripts"]
@@ -0,0 +1,15 @@
1
+ r"""Forward model and gradients for the BlowingBubbles R–CPE equivalent circuit.
2
+
3
+ Re-exports :func:`~blowing_bubbles.circuit_impedance.impedance.circuit_impedance`
4
+ (complex impedance of the circuit) and
5
+ :func:`~blowing_bubbles.circuit_impedance.impedance.circuit_impedance_parameter_gradient`
6
+ (analytic partial derivatives) from
7
+ :mod:`blowing_bubbles.circuit_impedance.impedance`.
8
+ """
9
+
10
+ from .impedance import circuit_impedance, circuit_impedance_parameter_gradient
11
+
12
+ __all__ = [
13
+ "circuit_impedance",
14
+ "circuit_impedance_parameter_gradient",
15
+ ]