From 64bd89588f222fcf8cea5101136b52bb3a3205ad Mon Sep 17 00:00:00 2001 From: Martin Vonk <66305055+martinvonk@users.noreply.github.com> Date: Thu, 23 Feb 2023 14:09:24 +0100 Subject: [PATCH 01/14] Update README.md remove spaces [list-item-bullet-indent] --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index b63f427..d88cd87 100644 --- a/README.md +++ b/README.md @@ -32,11 +32,11 @@ To get the development version download the GitHub code to your computer. Use cd `pip install -e .` ## Literature - 1. B. Lloyd-Hughes and M.A. Saunders (2002) - A Drought Climatology for Europe. DOI: 10.1002/joc.846 - 2. S.M. Vicente-Serrano, S. Beguería and J.I. López-Moreno (2010) - A Multi-scalar drought index sensitive to global warming: The Standardized Precipitation Evapotranspiration Index. DOI: 10.1175/2009JCLI2909.1 - 3. J.P.Bloomfield and B.P. Marchant, B. P. (2013) - Analysis of groundwater drought building on the standardised precipitation index approach. DOI: 10.5194/hess-17-4769-2013 - 4. A. Babre, A. Kalvāns, Z. Avotniece, I. Retiķe, J. Bikše, K.P.M. Jemeljanova, A. Zelenkevičs and A. Dēliņa (2022) - The use of predefined drought indices for the assessment of groundwater drought episodes in the Baltic States over the period 1989–2018. DOI: 10.1016/j.ejrh.2022.101049 - 5. E. Tijdeman, K. Stahl and L.M. Tallaksen (2020) - Drought characteristics derived based on the Standardized Streamflow Index: A large sample comparison for parametric and nonparametric methods. DOI: 10.1029/2019WR026315 +1. B. Lloyd-Hughes and M.A. Saunders (2002) - A Drought Climatology for Europe. DOI: 10.1002/joc.846 +2. S.M. Vicente-Serrano, S. Beguería and J.I. López-Moreno (2010) - A Multi-scalar drought index sensitive to global warming: The Standardized Precipitation Evapotranspiration Index. DOI: 10.1175/2009JCLI2909.1 +3. J.P.Bloomfield and B.P. Marchant, B. P. (2013) - Analysis of groundwater drought building on the standardised precipitation index approach. DOI: 10.5194/hess-17-4769-2013 +4. A. Babre, A. Kalvāns, Z. Avotniece, I. Retiķe, J. Bikše, K.P.M. Jemeljanova, A. Zelenkevičs and A. Dēliņa (2022) - The use of predefined drought indices for the assessment of groundwater drought episodes in the Baltic States over the period 1989–2018. DOI: 10.1016/j.ejrh.2022.101049 +5. E. Tijdeman, K. Stahl and L.M. Tallaksen (2020) - Drought characteristics derived based on the Standardized Streamflow Index: A large sample comparison for parametric and nonparametric methods. DOI: 10.1029/2019WR026315 Note that the method for calculating the drought indices does not come from these articles and SciPy is used for deriving the distribution. However the literature is helpful as a reference to understand the context and application of drought indices. From 4ae156797cfbbc847a2e4e88cefd911f17f19aff Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 14:13:54 +0100 Subject: [PATCH 02/14] remove unused imports --- tests/test_dist_utils.py | 2 -- tests/test_plots.py | 1 - 2 files changed, 3 deletions(-) diff --git a/tests/test_dist_utils.py b/tests/test_dist_utils.py index 9afae9b..2e98317 100644 --- a/tests/test_dist_utils.py +++ b/tests/test_dist_utils.py @@ -1,5 +1,3 @@ -from numpy import random - from spei.utils import dists_test from .fixtures import head diff --git a/tests/test_plots.py b/tests/test_plots.py index b93dc20..a817e10 100644 --- a/tests/test_plots.py +++ b/tests/test_plots.py @@ -1,5 +1,4 @@ import matplotlib as mpl -import pytest from pandas import Series from scipy.stats import pearson3 From f2b6f2e02fb855b807523b77772eb427eee3fffc Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 14:16:59 +0100 Subject: [PATCH 03/14] Update _typing.py redefine numpy types --- src/spei/_typing.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/spei/_typing.py b/src/spei/_typing.py index a80dfb3..09917b3 100644 --- a/src/spei/_typing.py +++ b/src/spei/_typing.py @@ -2,9 +2,11 @@ from typing import Any, Union from matplotlib.axes import Axes -from numpy import float64 -from numpy.typing import NDArray +from numpy import float64 as npfloat64 +from numpy.typing import npNDArray from scipy.stats._continuous_distns import rv_continuous ContinuousDist = Union[Any, rv_continuous] Axes = Union[Any, Axes] +NDarray = npNDArray +float64 = npfloat64 From 3765e6c99d137f4998fb019e262f733726192155 Mon Sep 17 00:00:00 2001 From: Martin Vonk <66305055+martinvonk@users.noreply.github.com> Date: Thu, 23 Feb 2023 21:45:10 +0100 Subject: [PATCH 04/14] Add codacy grade code quality badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d88cd87..a272c3a 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ ![PyPI](https://img.shields.io/pypi/v/spei?style=flat-square) ![PyPi Supported Python Versions](https://img.shields.io/pypi/pyversions/spei?style=flat-square) ![Code Size](https://img.shields.io/github/languages/code-size/martinvonk/spei?style=flat-square) ![PyPi Downloads](https://img.shields.io/pypi/dm/spei?style=flat-square) ![License](https://img.shields.io/pypi/l/spei?style=flat-square) ![Tests](https://img.shields.io/github/actions/workflow/status/martinvonk/spei/tests.yml?style=flat-square) +![CodacyGrade](https://img.shields.io/codacy/grade/908b566912314666b84e1add22ea7d66?style=flat-square) ![MyPy](https://img.shields.io/badge/%20type_checker-mypy-%231674b1?style=flat-square) ![Black](https://img.shields.io/badge/code%20style-black-black?style=flat-square) From 49b892c447572dea9a1020d6ccda959c334bd072 Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 21:50:56 +0100 Subject: [PATCH 05/14] Update tests.yml add codacy coverage --- .github/workflows/tests.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 4c8ed33..cf93f29 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -55,16 +55,49 @@ jobs: PYTEST_ADDOPTS: "--color=yes" steps: - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 with: python-version: ${{ matrix.python }} check-latest: true + - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox + - name: Setup tox environment run: tox -e ${{ matrix.toxenv }} --notest + - name: Test run: tox -e ${{ matrix.toxenv }} --skip-pkg-install + + - name: Store coverage + uses: actions/upload-artifact@v3 + with: + name: coverage + path: coverage.xml + if-no-files-found: ignore + + coverage: + name: Coverage + runs-on: ubuntu-latest + needs: test + steps: + - name: Set up Python ${{ matrix.python }} + uses: actions/setup-python@v4 + with: + check-latest: true + + - name: Get coverage + uses: actions/download-artifact@v3 + with: + name: coverage + + - name: Run codacy-coverage-reporter + if: ${{ github.repository == 'martinvonk/SPEI' && success() }} + uses: codacy/codacy-coverage-reporter-action@master + with: + project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} + coverage-reports: coverage.xml From 25eac45d4aa9e83a8cf5a34e9dae4e10ee2e9a4e Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 21:53:31 +0100 Subject: [PATCH 06/14] Update _typing.py fix tests --- src/spei/_typing.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/spei/_typing.py b/src/spei/_typing.py index 09917b3..38e4471 100644 --- a/src/spei/_typing.py +++ b/src/spei/_typing.py @@ -3,10 +3,10 @@ from matplotlib.axes import Axes from numpy import float64 as npfloat64 -from numpy.typing import npNDArray +from numpy.typing import NDArray as npNDArray from scipy.stats._continuous_distns import rv_continuous ContinuousDist = Union[Any, rv_continuous] Axes = Union[Any, Axes] -NDarray = npNDArray +NDArray = npNDArray float64 = npfloat64 From 2e37d55553a0466c564181de66b16c633d6ceb5c Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 22:09:16 +0100 Subject: [PATCH 07/14] fix mypy error error: Bad number of arguments for type alias, expected: 0, given: 1 [type-arg] Due to NDArray[float64] and NDArray[Axes] --- src/spei/_typing.py | 12 ++++++------ src/spei/plot.py | 8 ++++---- src/spei/si.py | 14 +++++++------- src/spei/utils.py | 10 +++++----- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/spei/_typing.py b/src/spei/_typing.py index 38e4471..d874811 100644 --- a/src/spei/_typing.py +++ b/src/spei/_typing.py @@ -1,12 +1,12 @@ # flake8: noqa from typing import Any, Union -from matplotlib.axes import Axes -from numpy import float64 as npfloat64 -from numpy.typing import NDArray as npNDArray +from matplotlib.axes import Axes as mplAxes +from numpy import float64 +from numpy.typing import NDArray from scipy.stats._continuous_distns import rv_continuous ContinuousDist = Union[Any, rv_continuous] -Axes = Union[Any, Axes] -NDArray = npNDArray -float64 = npfloat64 +Axes = Union[Any, mplAxes] +NDArrayAxes = NDArray[Axes] +NDArrayFloat = NDArray[float64] diff --git a/src/spei/plot.py b/src/spei/plot.py index 5e58705..fe72fa5 100644 --- a/src/spei/plot.py +++ b/src/spei/plot.py @@ -7,7 +7,7 @@ from pandas import Series from scipy.stats import gaussian_kde -from ._typing import Axes, ContinuousDist, NDArray, float64 +from ._typing import Axes, ContinuousDist, NDArrayAxes from .utils import dist_test, validate_index, validate_series @@ -40,9 +40,9 @@ def si( nmin = -bound nmax = bound - droughts = si.to_numpy(dtype=float64, copy=True) + droughts = si.to_numpy(dtype=float, copy=True) droughts[droughts > 0] = 0 - nodroughts = si.to_numpy(dtype=float64, copy=True) + nodroughts = si.to_numpy(dtype=float, copy=True) nodroughts[nodroughts < 0] = 0 x, y = meshgrid(si.index, linspace(nmin, nmax, 100)) @@ -64,7 +64,7 @@ def dist( cmap: Optional[str] = None, figsize: tuple = (8, 10), legend: bool = True, -) -> NDArray[Axes]: +) -> NDArrayAxes: """Plot the (cumulative) histogram and scipy fitted distribution for the time series on a monthly basis. diff --git a/src/spei/si.py b/src/spei/si.py index 544fc0f..310617e 100644 --- a/src/spei/si.py +++ b/src/spei/si.py @@ -4,7 +4,7 @@ from pandas import DatetimeIndex, Series from scipy.stats import fisk, gamma, genextreme, norm -from ._typing import ContinuousDist, NDArray, float64 +from ._typing import ContinuousDist, NDArrayFloat from .utils import validate_index, validate_series @@ -42,7 +42,7 @@ def compute_si_ppf( series = validate_series(series) index = validate_index(series.index) - si = Series(index=index, dtype=float64) + si = Series(index=index, dtype=float) for month in range(1, 13): data = series[index.month == month].sort_values() if not sgi: @@ -58,16 +58,16 @@ def compute_si_ppf( def compute_cdf( - data: Union[Series, NDArray[float64]], dist: ContinuousDist -) -> NDArray[float64]: + data: Union[Series, NDArrayFloat], dist: ContinuousDist +) -> NDArrayFloat: *pars, loc, scale = dist.fit(data, scale=std(data)) cdf = dist.cdf(data, pars, loc=loc, scale=scale) return cdf def compute_cdf_probzero( - data: Union[Series, NDArray[float64]], dist: ContinuousDist -) -> NDArray[float64]: + data: Union[Series, NDArrayFloat], dist: ContinuousDist +) -> NDArrayFloat: p0 = (data == 0.0).sum() / len(data) *pars, loc, scale = dist.fit(data[data != 0.0], scale=std(data)) cdf_sub = dist.cdf(data, pars, loc=loc, scale=scale) @@ -76,7 +76,7 @@ def compute_cdf_probzero( return cdf -def compute_cdf_nsf(data: Union[Series, NDArray[float64]]) -> NDArray[float64]: +def compute_cdf_nsf(data: Union[Series, NDArrayFloat]) -> NDArrayFloat: """Normal Scores Transform""" n = data.size cdf = linspace(1 / (2 * n), 1 - 1 / (2 * n), n) diff --git a/src/spei/utils.py b/src/spei/utils.py index a9f0c42..770928b 100644 --- a/src/spei/utils.py +++ b/src/spei/utils.py @@ -15,7 +15,7 @@ pearson3, ) -from ._typing import ContinuousDist, NDArray, float64 +from ._typing import ContinuousDist, NDArrayFloat def validate_series(series: Series) -> Series: @@ -53,7 +53,7 @@ def validate_index(index: Index) -> DatetimeIndex: def dist_test( - series: Union[Series, NDArray[float64]], + series: Union[Series, NDArrayFloat], dist: ContinuousDist, N: int = 100, alpha: float = 0.05, @@ -66,7 +66,7 @@ def dist_test( Parameters ---------- - data : Union[Series, NDArray[float64]] + data : Union[Series, NDArray[float]] pandas Series or numpy array of floats of observations of random variables dist: scipy.stats.rv_continuous @@ -100,7 +100,7 @@ def dist_test( def dists_test( - series: Union[Series, NDArray[float64]], + series: Union[Series, NDArrayFloat], distributions: Optional[List[ContinuousDist]] = None, N: int = 100, alpha: float = 0.05, @@ -113,7 +113,7 @@ def dists_test( Parameters ---------- - series : Union[Series, NDArray[float64]] + series : Union[Series, NDArray[float]] pandas Series with observations of random variables distributions : list of scipy.stats.rv_continuous, optional A list of (can be) any continuous distribution from the scipy.stats From 48f58ee6770eb4314a41f240433307722e34f96a Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 22:21:00 +0100 Subject: [PATCH 08/14] Update tests.yml fix codacy? --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cf93f29..9eb1f22 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -97,7 +97,7 @@ jobs: - name: Run codacy-coverage-reporter if: ${{ github.repository == 'martinvonk/SPEI' && success() }} - uses: codacy/codacy-coverage-reporter-action@master + uses: codacy/codacy-coverage-reporter-action@main with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml From 8fb27aa266a187be7d7c2f0881a868157539739d Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 22:51:09 +0100 Subject: [PATCH 09/14] Revert "Update tests.yml" This reverts commit 48f58ee6770eb4314a41f240433307722e34f96a. --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9eb1f22..cf93f29 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -97,7 +97,7 @@ jobs: - name: Run codacy-coverage-reporter if: ${{ github.repository == 'martinvonk/SPEI' && success() }} - uses: codacy/codacy-coverage-reporter-action@main + uses: codacy/codacy-coverage-reporter-action@master with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} coverage-reports: coverage.xml From 7ff021bda7b758ba5e825f8431f573061f753e5c Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 23:05:54 +0100 Subject: [PATCH 10/14] add codacy coverage --- .github/workflows/tests.yml | 28 +++++----------------------- pyproject.toml | 11 ++++++++++- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cf93f29..0742e29 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -39,6 +39,10 @@ jobs: python: "3.9" os: ubuntu-latest toxenv: lint + - name: Codacy Coverage Report + python: "3.9" + os: ubuntu-latest + toxenv: coverage name: ${{ matrix.name }} env: @@ -73,30 +77,8 @@ jobs: - name: Test run: tox -e ${{ matrix.toxenv }} --skip-pkg-install - - name: Store coverage - uses: actions/upload-artifact@v3 - with: - name: coverage - path: coverage.xml - if-no-files-found: ignore - - coverage: - name: Coverage - runs-on: ubuntu-latest - needs: test - steps: - - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4 - with: - check-latest: true - - - name: Get coverage - uses: actions/download-artifact@v3 - with: - name: coverage - - name: Run codacy-coverage-reporter - if: ${{ github.repository == 'martinvonk/SPEI' && success() }} + if: ${{ matrix.toxenv == 'coverage' && github.repository == 'martinvonk/spei' && success() }} uses: codacy/codacy-coverage-reporter-action@master with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} diff --git a/pyproject.toml b/pyproject.toml index 4665692..aaca232 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,8 @@ linting = ["flake8"] formatting = ["black[jupyter]", "isort"] typing = ["mypy", "pandas-stubs"] pytesting = ["pytest>=7", "pytest-cov", "pytest-sugar"] -dev = ["spei[linting,formatting,typing,pytesting]"] +coveraging = ["coverage"] +dev = ["spei[linting,formatting,typing,pytesting,coveraging]"] [tool.setuptools.dynamic] version = { attr = "spei._version.__version__" } @@ -86,4 +87,12 @@ legacy_tox_ini = """ extras = linting commands = flake8 src --max-line-length=88 + + [testenv:coverage] + description = get coverage for codacy + basepython = 3.9 + extras = coveraging,pytesting + commands = + coverage run -m pytest tests + coverage xml """ From 9d9de998a2465b91f38c3d9dd84e8af23a8cdb53 Mon Sep 17 00:00:00 2001 From: Martin Vonk <66305055+martinvonk@users.noreply.github.com> Date: Thu, 23 Feb 2023 23:15:19 +0100 Subject: [PATCH 11/14] Update README.md Add codacy coverage badge --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a272c3a..fe4525d 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ ![Tests](https://img.shields.io/github/actions/workflow/status/martinvonk/spei/tests.yml?style=flat-square) ![CodacyGrade](https://img.shields.io/codacy/grade/908b566912314666b84e1add22ea7d66?style=flat-square) +![CodacyCoverage](https://img.shields.io/codacy/coverage/908b566912314666b84e1add22ea7d66?style=flat-square) ![MyPy](https://img.shields.io/badge/%20type_checker-mypy-%231674b1?style=flat-square) ![Black](https://img.shields.io/badge/code%20style-black-black?style=flat-square) From 2c165f62b2ed1659a59308a9a24af1d34db172d6 Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 23:05:54 +0100 Subject: [PATCH 12/14] add codacy coverage --- .github/workflows/tests.yml | 28 +++++----------------------- pyproject.toml | 11 ++++++++++- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index cf93f29..0742e29 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -39,6 +39,10 @@ jobs: python: "3.9" os: ubuntu-latest toxenv: lint + - name: Codacy Coverage Report + python: "3.9" + os: ubuntu-latest + toxenv: coverage name: ${{ matrix.name }} env: @@ -73,30 +77,8 @@ jobs: - name: Test run: tox -e ${{ matrix.toxenv }} --skip-pkg-install - - name: Store coverage - uses: actions/upload-artifact@v3 - with: - name: coverage - path: coverage.xml - if-no-files-found: ignore - - coverage: - name: Coverage - runs-on: ubuntu-latest - needs: test - steps: - - name: Set up Python ${{ matrix.python }} - uses: actions/setup-python@v4 - with: - check-latest: true - - - name: Get coverage - uses: actions/download-artifact@v3 - with: - name: coverage - - name: Run codacy-coverage-reporter - if: ${{ github.repository == 'martinvonk/SPEI' && success() }} + if: ${{ matrix.toxenv == 'coverage' && github.repository == 'martinvonk/spei' && success() }} uses: codacy/codacy-coverage-reporter-action@master with: project-token: ${{ secrets.CODACY_PROJECT_TOKEN }} diff --git a/pyproject.toml b/pyproject.toml index 4665692..ac90c62 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,7 +32,8 @@ linting = ["flake8"] formatting = ["black[jupyter]", "isort"] typing = ["mypy", "pandas-stubs"] pytesting = ["pytest>=7", "pytest-cov", "pytest-sugar"] -dev = ["spei[linting,formatting,typing,pytesting]"] +coveraging = ["coverage"] +dev = ["spei[linting,formatting,typing,pytesting,coveraging]"] [tool.setuptools.dynamic] version = { attr = "spei._version.__version__" } @@ -86,4 +87,12 @@ legacy_tox_ini = """ extras = linting commands = flake8 src --max-line-length=88 + + [testenv:coverage] + description = get coverage report xml + basepython = 3.9 + extras = coveraging,pytesting + commands = + coverage run -m pytest tests + coverage xml """ From db99a1b67c784f805caebb7367da804e1aa6e976 Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 23:19:18 +0100 Subject: [PATCH 13/14] Update .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index b04eb26..40ab694 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ /.mypy_cache /.tox /.pytest_cache -/htmlcov \ No newline at end of file +/htmlcov +coverage.xml From 62a4e200d200e33380dc228cde798c7998a6b25b Mon Sep 17 00:00:00 2001 From: Martin Vonk Date: Thu, 23 Feb 2023 23:19:27 +0100 Subject: [PATCH 14/14] Update _version.py bump version to 0.3.2 --- src/spei/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/spei/_version.py b/src/spei/_version.py index 260c070..f9aa3e1 100644 --- a/src/spei/_version.py +++ b/src/spei/_version.py @@ -1 +1 @@ -__version__ = "0.3.1" +__version__ = "0.3.2"