diff --git a/.github/workflows/bumpversion.yml b/.github/workflows/bumpversion.yml new file mode 100644 index 00000000..e54a5898 --- /dev/null +++ b/.github/workflows/bumpversion.yml @@ -0,0 +1,66 @@ +name: Bump version + +on: + push: + branches: + - master + +jobs: + bump-version: + if: "!startsWith(github.event.head_commit.message, 'bump:')" + runs-on: ubuntu-latest + name: "Bump version and create changelog with commitizen" + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Run image + uses: abatilo/actions-poetry@v2.0.0 + with: + poetry-version: 1.1.8 + - name: Cache Poetry virtualenv + uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: venv-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} + restore-keys: | + venv-${{ matrix.os }}-${{ matrix.python-version }}- + + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs + + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' + + - name: Verify github tags + run: | + git config --global user.name '${{ github.actor }}' + git config --global user.email '${{ github.actor }}@users.noreply.github.com' + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY + git checkout $GITHUB_HEAD_REF + git fetch --all --tags + git tag + + # - name: Create bump and changelog + # uses: commitizen-tools/commitizen-action@master + # with: + # github_token: ${{ secrets.GITHUB_TOKEN }} + + - name: Create bump and changelog + run: | + poetry run cz bump --changelog + + - name: Push changelog, version files and new tag + run: | + git config --global user.name '${{ github.actor }}' + git config --global user.email '${{ github.actor }}@users.noreply.github.com' + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY + git checkout $GITHUB_HEAD_REF + git push --force + git push --tags --force diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..7414a094 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,65 @@ +name: ci + +on: [push] + +jobs: + + CI: + strategy: + fail-fast: false + matrix: + python-version: [3.7] + os: [ubuntu-18.04, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up Python + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Run image + uses: abatilo/actions-poetry@v2.0.0 + with: + poetry-version: 1.1.8 + - name: Cache Poetry virtualenv + uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: venv-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} + restore-keys: | + venv-${{ matrix.os }}-${{ matrix.python-version }}- + + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs + + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' + + - name: Test with pytest + run: poetry run pytest --cov . --cov-report xml:coverage-reports/coverage-fm2prof-src.xml --junitxml=xunit-reports/xunit-result-fm2prof-src.xml + + - name: Autoformat code if the check fails + if: ${{ (matrix.os == 'ubuntu-18.04') && (matrix.python-version == 3.8) }} + run: | + poetry run isort . + poetry run black . + git config --global user.name '${{ github.actor }}' + git config --global user.email '${{ github.actor }}@users.noreply.github.com' + git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY + git checkout $GITHUB_HEAD_REF + git commit -am "autoformat: isort & black" && git push || true + + - name: SonarCloud Scan + uses: SonarSource/sonarcloud-github-action@master + if: ${{ (matrix.os == 'ubuntu-18.04') && (matrix.python-version == 3.8) }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..5a0f48a6 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,40 @@ +name: docs +on: + push: + branches: + - master +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + with: + python-version: 3.8 + + - name: Run image + uses: abatilo/actions-poetry@v2.0.0 + with: + poetry-version: 1.1.8 + - name: Cache Poetry virtualenv + uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: venv-${{ matrix.os }}-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} + restore-keys: | + venv-${{ matrix.os }}-${{ matrix.python-version }}- + + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs + + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' + + - name: Build SPHINX docs + uses: ammaraskar/sphinx-action@master + with: + docs-folder: "docs/" diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..8cba7953 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode +.pytest_cache +**__pycache__** \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..f0dc5342 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: + - repo: https://github.com/commitizen-tools/commitizen + rev: v2.20.0 + hooks: + - id: commitizen + stages: [commit-msg] \ No newline at end of file diff --git a/CHANGELOG.rst b/docs/CHANGELOG.rst similarity index 100% rename from CHANGELOG.rst rename to docs/CHANGELOG.rst diff --git a/environment.yml b/environment.yml index 1dbdf3c9..fcde2068 100644 --- a/environment.yml +++ b/environment.yml @@ -2,7 +2,7 @@ name: fm2prof channels: - defaults dependencies: - - python=3.6 + - python=3.7 - netCDF4 - scipy - numpy @@ -10,7 +10,6 @@ dependencies: - matplotlib - shapely - pylint - - netcdf4 - scikit-learn - pytest - jupyter diff --git a/fm2prof/__init__.py b/fm2prof/__init__.py index f8f75418..527de7d4 100644 --- a/fm2prof/__init__.py +++ b/fm2prof/__init__.py @@ -1,2 +1,4 @@ +__version__ = "1.4.3" + from fm2prof.Fm2ProfRunner import Project -from fm2prof import utils \ No newline at end of file +from fm2prof import utils diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..2409ddb0 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1760 @@ +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "argcomplete" +version = "1.12.3" +description = "Bash tab completion for argparse" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +importlib-metadata = {version = ">=0.23,<5", markers = "python_version == \"3.7\""} + +[package.extras] +test = ["coverage", "flake8", "pexpect", "wheel"] + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "babel" +version = "2.9.1" +description = "Internationalization utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "backports.entry-points-selectable" +version = "1.1.1" +description = "Compatibility shim providing selectable entry points for older implementations" +category = "dev" +optional = false +python-versions = ">=2.7" + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"] + +[[package]] +name = "black" +version = "21.11b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0,<1" +platformdirs = ">=2" +regex = ">=2021.4.4" +tomli = ">=0.2.6,<2.0.0" +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} +typing-extensions = [ + {version = ">=3.10.0.0", markers = "python_version < \"3.10\""}, + {version = "!=3.10.0.1", markers = "python_version >= \"3.10\""}, +] + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +python2 = ["typed-ast (>=1.4.3)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "cfgv" +version = "3.3.1" +description = "Validate configuration and produce human readable error messages." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[[package]] +name = "cftime" +version = "1.5.1.1" +description = "Time-handling functionality from netcdf4-python" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = "*" + +[[package]] +name = "charset-normalizer" +version = "2.0.8" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "dev" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.0.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "commitizen" +version = "2.20.0" +description = "Python commitizen client tool" +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0.0" + +[package.dependencies] +argcomplete = ">=1.12.1,<2.0.0" +colorama = ">=0.4.1,<0.5.0" +decli = ">=0.5.2,<0.6.0" +jinja2 = ">=2.10.3" +packaging = ">=19,<22" +pyyaml = ">=3.08" +questionary = ">=1.4.0,<2.0.0" +termcolor = ">=1.1,<2.0" +tomlkit = ">=0.5.3,<1.0.0" + +[[package]] +name = "coverage" +version = "6.2" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "cycler" +version = "0.11.0" +description = "Composable style cycles" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "decli" +version = "0.5.2" +description = "Minimal, easy-to-use, declarative cli tool" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "distlib" +version = "0.3.3" +description = "Distribution utilities" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "docutils" +version = "0.17.1" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "filelock" +version = "3.4.0" +description = "A platform independent file lock." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] +testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] + +[[package]] +name = "fonttools" +version = "4.28.2" +description = "Tools to manipulate font files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=13.0.0)", "xattr"] +graphite = ["lz4 (>=1.7.4.2)"] +interpolatable = ["scipy", "munkres"] +lxml = ["lxml (>=4.0,<5)"] +pathops = ["skia-pathops (>=0.5.0)"] +plot = ["matplotlib"] +symfont = ["sympy"] +type1 = ["xattr"] +ufo = ["fs (>=2.2.0,<3)"] +unicode = ["unicodedata2 (>=13.0.0)"] +woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] + +[[package]] +name = "geojson" +version = "2.5.0" +description = "Python bindings and utilities for GeoJSON" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "identify" +version = "2.4.0" +description = "File identification library for Python" +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.3.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "importlib-metadata" +version = "4.8.2" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "jinja2" +version = "3.0.3" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "kiwisolver" +version = "1.3.2" +description = "A fast implementation of the Cassowary constraint solver" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "matplotlib" +version = "3.5.0" +description = "Python plotting package" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +cycler = ">=0.10" +fonttools = ">=4.22.0" +kiwisolver = ">=1.0.1" +numpy = ">=1.17" +packaging = ">=20.0" +pillow = ">=6.2.0" +pyparsing = ">=2.2.1" +python-dateutil = ">=2.7" +setuptools_scm = ">=4" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "netcdf4" +version = "1.5.0" +description = "Provides an object-oriented python interface to the netCDF version 4 library." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +cftime = "*" +numpy = ">=1.7" + +[[package]] +name = "nodeenv" +version = "1.6.0" +description = "Node.js virtual environment builder" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "numpy" +version = "1.21.1" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pandas" +version = "1.3.4" +description = "Powerful data structures for data analysis, time series, and statistics" +category = "main" +optional = false +python-versions = ">=3.7.1" + +[package.dependencies] +numpy = [ + {version = ">=1.17.3", markers = "platform_machine != \"aarch64\" and platform_machine != \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.19.2", markers = "platform_machine == \"aarch64\" and python_version < \"3.10\""}, + {version = ">=1.20.0", markers = "platform_machine == \"arm64\" and python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, +] +python-dateutil = ">=2.7.3" +pytz = ">=2017.3" + +[package.extras] +test = ["hypothesis (>=3.58)", "pytest (>=6.0)", "pytest-xdist"] + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pillow" +version = "8.4.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "platformdirs" +version = "2.4.0" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] +test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry-semver" +version = "0.1.0" +description = "A semantic versioning library for Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "poetry2conda" +version = "0.3.0" +description = "Convert pyproject.toml to environment.yaml" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[package.dependencies] +poetry-semver = ">=0.1.0,<0.2.0" +toml = ">=0.10.0,<0.11.0" + +[[package]] +name = "pre-commit" +version = "2.15.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +category = "dev" +optional = false +python-versions = ">=3.6.1" + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +toml = "*" +virtualenv = ">=20.0.8" + +[[package]] +name = "prompt-toolkit" +version = "3.0.23" +description = "Library for building powerful interactive command lines in Python" +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pygments" +version = "2.10.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pyparsing" +version = "3.0.6" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "3.0.0" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "pytz" +version = "2021.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyyaml" +version = "6.0" +description = "YAML parser and emitter for Python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "questionary" +version = "1.10.0" +description = "Python library to build pretty command line user prompts ⭐️" +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" + +[package.dependencies] +prompt_toolkit = ">=2.0,<4.0" + +[package.extras] +docs = ["Sphinx (>=3.3,<4.0)", "sphinx-rtd-theme (>=0.5.0,<0.6.0)", "sphinx-autobuild (>=2020.9.1,<2021.0.0)", "sphinx-copybutton (>=0.3.1,<0.4.0)", "sphinx-autodoc-typehints (>=1.11.1,<2.0.0)"] + +[[package]] +name = "regex" +version = "2021.11.10" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "requests" +version = "2.26.0" +description = "Python HTTP for Humans." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "scikit-learn" +version = "0.19.2" +description = "A set of python modules for machine learning and data mining" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +alldeps = ["numpy (>=1.8.2)", "scipy (>=0.13.3)"] + +[[package]] +name = "scipy" +version = "1.6.1" +description = "SciPy: Scientific Library for Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +numpy = ">=1.16.5" + +[[package]] +name = "seaborn" +version = "0.7.1" +description = "Seaborn: statistical data visualization" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +matplotlib = "*" +numpy = "*" +pandas = "*" +scipy = "*" + +[[package]] +name = "setuptools-scm" +version = "6.3.2" +description = "the blessed package to manage your versions by scm tags" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +packaging = ">=20.0" +tomli = ">=1.0.0" + +[package.extras] +toml = ["setuptools (>=42)", "tomli (>=1.0.0)"] + +[[package]] +name = "shapely" +version = "1.8.0" +description = "Geometric objects, predicates, and operations" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +all = ["pytest", "pytest-cov", "numpy"] +test = ["pytest", "pytest-cov"] +vectorized = ["numpy"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "sphinx" +version = "4.3.1" +description = "Python documentation generator" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.18" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.5" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.900)", "docutils-stubs", "types-typed-ast", "types-pkg-resources", "types-requests"] +test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tomli" +version = "1.2.2" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tomlkit" +version = "0.7.2" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "typed-ast" +version = "1.5.0" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "typing-extensions" +version = "4.0.0" +description = "Backported and Experimental Type Hints for Python 3.6+" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "urllib3" +version = "1.26.7" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.10.0" +description = "Virtual Python Environment builder" +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +"backports.entry-points-selectable" = ">=1.0.4" +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +platformdirs = ">=2,<3" +six = ">=1.9.0,<2" + +[package.extras] +docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.6.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = "^3.7" +content-hash = "8b147c002d971b29e93d951d5c39113ca9e555b083c9a54f3fcbe5e094a07706" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +argcomplete = [ + {file = "argcomplete-1.12.3-py2.py3-none-any.whl", hash = "sha256:291f0beca7fd49ce285d2f10e4c1c77e9460cf823eef2de54df0c0fec88b0d81"}, + {file = "argcomplete-1.12.3.tar.gz", hash = "sha256:2c7dbffd8c045ea534921e63b0be6fe65e88599990d8dc408ac8c542b72a5445"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +babel = [ + {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, + {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, +] +"backports.entry-points-selectable" = [ + {file = "backports.entry_points_selectable-1.1.1-py2.py3-none-any.whl", hash = "sha256:7fceed9532a7aa2bd888654a7314f864a3c16a4e710b34a58cfc0f08114c663b"}, + {file = "backports.entry_points_selectable-1.1.1.tar.gz", hash = "sha256:914b21a479fde881635f7af5adc7f6e38d6b274be32269070c53b698c60d5386"}, +] +black = [ + {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, + {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +cfgv = [ + {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, + {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, +] +cftime = [ + {file = "cftime-1.5.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:06033c132beb5e560f1957c048fdfbb3c876b3cc2f3e5e0f664927d98b5fae44"}, + {file = "cftime-1.5.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfc3f3da4efc22ae22096c2b20ac9d5da01b3038c4ed4407fcd501efab26099"}, + {file = "cftime-1.5.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4260ca466a445af7b243d84a7c96833b9261bdfd15ba86028d9710b7d700f490"}, + {file = "cftime-1.5.1.1-cp310-none-win_amd64.whl", hash = "sha256:cd33cd2e220c1c283f6fe3273352d7754795f86835ad04520f26a441a5b45193"}, + {file = "cftime-1.5.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:72eff06667df45cc87c7b50c87ee67471a32b73cdfaac903bb65945823a4bdf3"}, + {file = "cftime-1.5.1.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:940fcaec3159e8ba6ad93bd939108c665c35650fcf6cd026687b40b48bca8110"}, + {file = "cftime-1.5.1.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bcca217713f6468ea0fe18637ff2a113bcb5cf9c7328ba535a0323033110e419"}, + {file = "cftime-1.5.1.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f549ad17102403984a9c865313f758c346cbb04dd4550946cab81a5fea132ff3"}, + {file = "cftime-1.5.1.1-cp36-none-win_amd64.whl", hash = "sha256:40517a5c2352c847f919b7f29963015c37c071ebc2e89ecc4f62aa4b80d9a72e"}, + {file = "cftime-1.5.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a220f9652f34038c0d9ca275bbfb50efc52dbf867733746cf8a7dcd3b5b84cf1"}, + {file = "cftime-1.5.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75dc17b031e85feece5a5770f00342dedeb4349dc530bcd1cd25deb7064cab32"}, + {file = "cftime-1.5.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff292fcd4d2322fe28bcc0c9e70a37e048858aa68a9aaa43710a73100fa1e77d"}, + {file = "cftime-1.5.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01882a6f540f61b87db7e6c1a389d278e97b63b8c40457df7d5b98a25413c1a7"}, + {file = "cftime-1.5.1.1-cp37-none-win_amd64.whl", hash = "sha256:35cb5cbcbd9f8083265a3ce4283ebc62114e28d589d6bf62d98532ada6cfc890"}, + {file = "cftime-1.5.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd2311da209bbcff4221d344cb6ee217ce6b465832b013106e1ae21e947818f8"}, + {file = "cftime-1.5.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5850ed2ae6c218d57249cf75fa27accd4e3436617a8ea9cd2bea6cb031f449fd"}, + {file = "cftime-1.5.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3196615252312762ce2196664b2614d254d5e4d2b0cf5c7866c5916e45cec66"}, + {file = "cftime-1.5.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fae15273aafd0c9382637b03ef6fa51274c28c84dc3b459a969be2121f41c648"}, + {file = "cftime-1.5.1.1-cp38-none-win_amd64.whl", hash = "sha256:2ebdc5b20fb113ad0aa41c61fa7f9d52cb3a22b4b847ed2bf653d7e1f81ae8e2"}, + {file = "cftime-1.5.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c5d0985d99a4c749d90016e993dedd6c37c5b6d459b5747eb3a14e9ad63dc669"}, + {file = "cftime-1.5.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db62b4383815596a92acb6cfa3779b208292aa17f90c10669ee50806b2795cee"}, + {file = "cftime-1.5.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae7151d4c0759f7263d3baf4ca7283f715f99a02cf3bd4cf2403ae0e5312b64e"}, + {file = "cftime-1.5.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bcdf2a3d52a36e81e30d07ae93afdeb057cca8eb0a28c21cfef1f523ade1fe74"}, + {file = "cftime-1.5.1.1-cp39-none-win_amd64.whl", hash = "sha256:6db9129b4f26202c1ba4610b667693e686922011bd7166e7573dea668bb70c88"}, + {file = "cftime-1.5.1.1.tar.gz", hash = "sha256:6dc4d76ec7fe5a2d3c00dbe6604c757f1319613b75ef157554ef3648bf102a50"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.8.tar.gz", hash = "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0"}, + {file = "charset_normalizer-2.0.8-py3-none-any.whl", hash = "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405"}, +] +click = [ + {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, + {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +commitizen = [ + {file = "commitizen-2.20.0-py3-none-any.whl", hash = "sha256:a8c9f75718f0507d703c3b3aeef43bebc3ed0979c8995f9214185956a1bc1c05"}, + {file = "commitizen-2.20.0.tar.gz", hash = "sha256:b52eb35ffbe8281fc3187e648fae2bdd75ed1d17d31c8a0592909ccb7278292f"}, +] +coverage = [ + {file = "coverage-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da"}, + {file = "coverage-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971"}, + {file = "coverage-6.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840"}, + {file = "coverage-6.2-cp310-cp310-win32.whl", hash = "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c"}, + {file = "coverage-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f"}, + {file = "coverage-6.2-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76"}, + {file = "coverage-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47"}, + {file = "coverage-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64"}, + {file = "coverage-6.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48"}, + {file = "coverage-6.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17"}, + {file = "coverage-6.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781"}, + {file = "coverage-6.2-cp36-cp36m-win32.whl", hash = "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a"}, + {file = "coverage-6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0"}, + {file = "coverage-6.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884"}, + {file = "coverage-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617"}, + {file = "coverage-6.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8"}, + {file = "coverage-6.2-cp37-cp37m-win32.whl", hash = "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4"}, + {file = "coverage-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74"}, + {file = "coverage-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc"}, + {file = "coverage-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475"}, + {file = "coverage-6.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57"}, + {file = "coverage-6.2-cp38-cp38-win32.whl", hash = "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c"}, + {file = "coverage-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2"}, + {file = "coverage-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c"}, + {file = "coverage-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3"}, + {file = "coverage-6.2-cp39-cp39-win32.whl", hash = "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282"}, + {file = "coverage-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644"}, + {file = "coverage-6.2-pp36.pp37.pp38-none-any.whl", hash = "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de"}, + {file = "coverage-6.2.tar.gz", hash = "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8"}, +] +cycler = [ + {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, + {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, +] +decli = [ + {file = "decli-0.5.2-py3-none-any.whl", hash = "sha256:d3207bc02d0169bf6ed74ccca09ce62edca0eb25b0ebf8bf4ae3fb8333e15ca0"}, + {file = "decli-0.5.2.tar.gz", hash = "sha256:f2cde55034a75c819c630c7655a844c612f2598c42c21299160465df6ad463ad"}, +] +distlib = [ + {file = "distlib-0.3.3-py2.py3-none-any.whl", hash = "sha256:c8b54e8454e5bf6237cc84c20e8264c3e991e824ef27e8f1e81049867d861e31"}, + {file = "distlib-0.3.3.zip", hash = "sha256:d982d0751ff6eaaab5e2ec8e691d949ee80eddf01a62eaa96ddb11531fe16b05"}, +] +docutils = [ + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, +] +filelock = [ + {file = "filelock-3.4.0-py3-none-any.whl", hash = "sha256:2e139a228bcf56dd8b2274a65174d005c4a6b68540ee0bdbb92c76f43f29f7e8"}, + {file = "filelock-3.4.0.tar.gz", hash = "sha256:93d512b32a23baf4cac44ffd72ccf70732aeff7b8050fcaf6d3ec406d954baf4"}, +] +fonttools = [ + {file = "fonttools-4.28.2-py3-none-any.whl", hash = "sha256:eff1da7ea274c54cb8842853005a139f711646cbf6f1bcfb6c9b86a627f35ff0"}, + {file = "fonttools-4.28.2.zip", hash = "sha256:dca694331af74c8ad47acc5171e57f6b78fac5692bf050f2ab572964577ac0dd"}, +] +geojson = [ + {file = "geojson-2.5.0-py2.py3-none-any.whl", hash = "sha256:ccbd13368dd728f4e4f13ffe6aaf725b6e802c692ba0dde628be475040c534ba"}, + {file = "geojson-2.5.0.tar.gz", hash = "sha256:6e4bb7ace4226a45d9c8c8b1348b3fc43540658359f93c3f7e03efa9f15f658a"}, +] +identify = [ + {file = "identify-2.4.0-py2.py3-none-any.whl", hash = "sha256:eba31ca80258de6bb51453084bff4a923187cd2193b9c13710f2516ab30732cc"}, + {file = "identify-2.4.0.tar.gz", hash = "sha256:a33ae873287e81651c7800ca309dc1f84679b763c9c8b30680e16fbfa82f0107"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +imagesize = [ + {file = "imagesize-1.3.0-py2.py3-none-any.whl", hash = "sha256:1db2f82529e53c3e929e8926a1fa9235aa82d0bd0c580359c67ec31b2fddaa8c"}, + {file = "imagesize-1.3.0.tar.gz", hash = "sha256:cd1750d452385ca327479d45b64d9c7729ecf0b3969a58148298c77092261f9d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"}, + {file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +jinja2 = [ + {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, + {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, +] +kiwisolver = [ + {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1d819553730d3c2724582124aee8a03c846ec4362ded1034c16fb3ef309264e6"}, + {file = "kiwisolver-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8d93a1095f83e908fc253f2fb569c2711414c0bfd451cab580466465b235b470"}, + {file = "kiwisolver-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c4550a359c5157aaf8507e6820d98682872b9100ce7607f8aa070b4b8af6c298"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2210f28778c7d2ee13f3c2a20a3a22db889e75f4ec13a21072eabb5693801e84"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:82f49c5a79d3839bc8f38cb5f4bfc87e15f04cbafa5fbd12fb32c941cb529cfb"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9661a04ca3c950a8ac8c47f53cbc0b530bce1b52f516a1e87b7736fec24bfff0"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ddb500a2808c100e72c075cbb00bf32e62763c82b6a882d403f01a119e3f402"}, + {file = "kiwisolver-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72be6ebb4e92520b9726d7146bc9c9b277513a57a38efcf66db0620aec0097e0"}, + {file = "kiwisolver-1.3.2-cp310-cp310-win32.whl", hash = "sha256:83d2c9db5dfc537d0171e32de160461230eb14663299b7e6d18ca6dca21e4977"}, + {file = "kiwisolver-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:cba430db673c29376135e695c6e2501c44c256a81495da849e85d1793ee975ad"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4116ba9a58109ed5e4cb315bdcbff9838f3159d099ba5259c7c7fb77f8537492"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19554bd8d54cf41139f376753af1a644b63c9ca93f8f72009d50a2080f870f77"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a4cf5bbdc861987a7745aed7a536c6405256853c94abc9f3287c3fa401b174"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0007840186bacfaa0aba4466d5890334ea5938e0bb7e28078a0eb0e63b5b59d5"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec2eba188c1906b05b9b49ae55aae4efd8150c61ba450e6721f64620c50b59eb"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3dbb3cea20b4af4f49f84cffaf45dd5f88e8594d18568e0225e6ad9dec0e7967"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:5326ddfacbe51abf9469fe668944bc2e399181a2158cb5d45e1d40856b2a0589"}, + {file = "kiwisolver-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c6572c2dab23c86a14e82c245473d45b4c515314f1f859e92608dcafbd2f19b8"}, + {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b5074fb09429f2b7bc82b6fb4be8645dcbac14e592128beeff5461dcde0af09f"}, + {file = "kiwisolver-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22521219ca739654a296eea6d4367703558fba16f98688bd8ce65abff36eaa84"}, + {file = "kiwisolver-1.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c358721aebd40c243894298f685a19eb0491a5c3e0b923b9f887ef1193ddf829"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ba5a1041480c6e0a8b11a9544d53562abc2d19220bfa14133e0cdd9967e97af"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44e6adf67577dbdfa2d9f06db9fbc5639afefdb5bf2b4dfec25c3a7fbc619536"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1d45d1c74f88b9f41062716c727f78f2a59a5476ecbe74956fafb423c5c87a76"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70adc3658138bc77a36ce769f5f183169bc0a2906a4f61f09673f7181255ac9b"}, + {file = "kiwisolver-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6a5431940f28b6de123de42f0eb47b84a073ee3c3345dc109ad550a3307dd28"}, + {file = "kiwisolver-1.3.2-cp38-cp38-win32.whl", hash = "sha256:ee040a7de8d295dbd261ef2d6d3192f13e2b08ec4a954de34a6fb8ff6422e24c"}, + {file = "kiwisolver-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:8dc3d842fa41a33fe83d9f5c66c0cc1f28756530cd89944b63b072281e852031"}, + {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a498bcd005e8a3fedd0022bb30ee0ad92728154a8798b703f394484452550507"}, + {file = "kiwisolver-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80efd202108c3a4150e042b269f7c78643420cc232a0a771743bb96b742f838f"}, + {file = "kiwisolver-1.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f8eb7b6716f5b50e9c06207a14172cf2de201e41912ebe732846c02c830455b9"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f441422bb313ab25de7b3dbfd388e790eceb76ce01a18199ec4944b369017009"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:30fa008c172355c7768159983a7270cb23838c4d7db73d6c0f6b60dde0d432c6"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f8f6c8f4f1cff93ca5058d6ec5f0efda922ecb3f4c5fb76181f327decff98b8"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba677bcaff9429fd1bf01648ad0901cea56c0d068df383d5f5856d88221fe75b"}, + {file = "kiwisolver-1.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7843b1624d6ccca403a610d1277f7c28ad184c5aa88a1750c1a999754e65b439"}, + {file = "kiwisolver-1.3.2-cp39-cp39-win32.whl", hash = "sha256:e6f5eb2f53fac7d408a45fbcdeda7224b1cfff64919d0f95473420a931347ae9"}, + {file = "kiwisolver-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:eedd3b59190885d1ebdf6c5e0ca56828beb1949b4dfe6e5d0256a461429ac386"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dedc71c8eb9c5096037766390172c34fb86ef048b8e8958b4e484b9e505d66bc"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bf7eb45d14fc036514c09554bf983f2a72323254912ed0c3c8e697b62c4c158f"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b65bd35f3e06a47b5c30ea99e0c2b88f72c6476eedaf8cfbc8e66adb5479dcf"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25405f88a37c5f5bcba01c6e350086d65e7465fd1caaf986333d2a045045a223"}, + {file = "kiwisolver-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:bcadb05c3d4794eb9eee1dddf1c24215c92fb7b55a80beae7a60530a91060560"}, + {file = "kiwisolver-1.3.2.tar.gz", hash = "sha256:fc4453705b81d03568d5b808ad8f09c77c47534f6ac2e72e733f9ca4714aa75c"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +matplotlib = [ + {file = "matplotlib-3.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4b018ea6f26424a0852eb60eb406420d9f0d34f65736ea7bbfbb104946a66d86"}, + {file = "matplotlib-3.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a07ff2565da72a7b384a9e000b15b6b8270d81370af8a3531a16f6fbcee023cc"}, + {file = "matplotlib-3.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2eea16883aa7724c95eea0eb473ab585c6cf66f0e28f7f13e63deb38f4fd6d0f"}, + {file = "matplotlib-3.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e020a42f3338823a393dd2f80e39a2c07b9f941dfe2c778eb104eeb33d60bb5"}, + {file = "matplotlib-3.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bac8eb1eccef540d7f4e844b6313d9f7722efd48c07e1b4bfec1056132127fd"}, + {file = "matplotlib-3.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a7cb59ebd63a8ac4542ec1c61dd08724f82ec3aa7bb6b4b9e212d43c611ce3d"}, + {file = "matplotlib-3.5.0-cp310-cp310-win32.whl", hash = "sha256:6e0e6b2111165522ad336705499b1f968c34a9e84d05d498ee5af0b5697d1efe"}, + {file = "matplotlib-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:ff5d9fe518ad2de14ce82ab906b6ab5c2b0c7f4f984400ff8a7a905daa580a0a"}, + {file = "matplotlib-3.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:66b172610db0ececebebb09d146f54205f87c7b841454e408fba854764f91bdd"}, + {file = "matplotlib-3.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee3d9ff16d749a9aa521bd7d86f0dbf256b2d2ac8ce31b19e4d2c86d2f2ff0b6"}, + {file = "matplotlib-3.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:970aa97297537540369d05fe0fd1bb952593f9ab696c9b427c06990a83e2418b"}, + {file = "matplotlib-3.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:153a0cf6a6ff4f406a0600d2034710c49988bacc6313d193b32716f98a697580"}, + {file = "matplotlib-3.5.0-cp37-cp37m-win32.whl", hash = "sha256:6db02c5605f063b67780f4d5753476b6a4944343284aa4e93c5e8ff6e9ec7f76"}, + {file = "matplotlib-3.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:df0042cab69f4d246f4cb8fc297770ac4ae6ec2983f61836b04a117722037dcd"}, + {file = "matplotlib-3.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a7bf8b05c214d32fb7ca7c001fde70b9b426378e897b0adbf77b85ea3569d56a"}, + {file = "matplotlib-3.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0abf8b51cc6d3ba34d1b15b26e329f23879848a0cf1216954c1f432ffc7e1af7"}, + {file = "matplotlib-3.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:13930a0c9bec0fd25f43c448b047a21af1353328b946f044a8fc3be077c6b1a8"}, + {file = "matplotlib-3.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18f6e52386300db5cc4d1e9019ad9da2e80658bab018834d963ebb0aa5355095"}, + {file = "matplotlib-3.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba107add08e12600b072cf3c47aaa1ab85dd4d3c48107a5d3377d1bf80f8b235"}, + {file = "matplotlib-3.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2089b9014792dcc87bb1d620cde847913338abf7d957ef05587382b0cb76d44e"}, + {file = "matplotlib-3.5.0-cp38-cp38-win32.whl", hash = "sha256:f23fbf70d2e80f4e03a83fc1206a8306d9bc50482fee4239f10676ce7e470c83"}, + {file = "matplotlib-3.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:71a1851111f23f82fc43d2b6b2bfdd3f760579a664ebc939576fe21cc6133d01"}, + {file = "matplotlib-3.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d092b7ba63182d2dd427904e3eb58dd5c46ec67c5968de14a4b5007010a3a4cc"}, + {file = "matplotlib-3.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ac17a7e7b06ee426a4989f0b7f24ab1a592e39cdf56353a90f4e998bc0bf44d6"}, + {file = "matplotlib-3.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a5b62d1805cc83d755972033c05cea78a1e177a159fc84da5c9c4ab6303ccbd9"}, + {file = "matplotlib-3.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:666d717a4798eb9c5d3ae83fe80c7bc6ed696b93e879cb01cb24a74155c73612"}, + {file = "matplotlib-3.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f877882b7ddede7090c7d87be27a0f4720fe7fc6fddd4409c06e1aa0f1ae8d"}, + {file = "matplotlib-3.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7baf23adb698d8c6ca7339c9dde00931bc47b2dd82fa912827fef9f93db77f5e"}, + {file = "matplotlib-3.5.0-cp39-cp39-win32.whl", hash = "sha256:b3b687e905da32e5f2e5f16efa713f5d1fcd9fb8b8c697895de35c91fedeb086"}, + {file = "matplotlib-3.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6cef5b31e27c31253c0f852b629a38d550ae66ec6850129c49d872f9ee428cb"}, + {file = "matplotlib-3.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0dcaf5648cecddc328e81a0421821a1f65a1d517b20746c94a1f0f5c36fb51a"}, + {file = "matplotlib-3.5.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b5e439d9e55d645f2a4dca63e2f66d68fe974c405053b132d61c7e98c25dfeb2"}, + {file = "matplotlib-3.5.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dc8c5c23e7056e126275dbf29efba817b3d94196690930d0968873ac3a94ab82"}, + {file = "matplotlib-3.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a0ea10faa3bab0714d3a19c7e0921279a68d57552414d6eceaea99f97d7735db"}, + {file = "matplotlib-3.5.0.tar.gz", hash = "sha256:38892a254420d95594285077276162a5e9e9c30b6da08bdc2a4d53331ad9a6fa"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +netcdf4 = [ + {file = "netCDF4-1.5.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:5a9793da673980ac82f82e6d5865fe793b15733af8bc1eb9bd27e5dec8e36213"}, + {file = "netCDF4-1.5.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:3e4f1f5e070562c1251fea35f05b9bb3e45cd45547429fdb50989cb91e85af32"}, + {file = "netCDF4-1.5.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d28eb0cb58b2781ab68be1b259a1d9832c5650f3eb66000fe777a6434c1e96fb"}, + {file = "netCDF4-1.5.0-cp27-cp27m-win32.whl", hash = "sha256:5ba21cb5916a0750e6694923123a554eaed6b9a48cf19488be22cdff9a87a5fc"}, + {file = "netCDF4-1.5.0-cp27-cp27m-win_amd64.whl", hash = "sha256:861fc5019ec1cb9c06bcab669bf404552b2777ae6bed31a9dfef6660c281a4b8"}, + {file = "netCDF4-1.5.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c054a7f3d6eff3862dfb1bb6670aca17902c13050fe0192774476275522690e3"}, + {file = "netCDF4-1.5.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b691f903f0d4c28ef1ec397f9d436875b35cc2b323cd165d0d7ebdfe8c204b8f"}, + {file = "netCDF4-1.5.0-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:726d8c0988f35967b29727329338a4389437775f26afaf7e4d0d17b08b54d3c2"}, + {file = "netCDF4-1.5.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b3a35f05419c7df14c28e0cc9057782cfd351964eec46319ef7eaa9554aeea99"}, + {file = "netCDF4-1.5.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1828771450c86b1ffbf75ac261547ff5dd55df2662b178813d0af1f92c24f21f"}, + {file = "netCDF4-1.5.0-cp35-cp35m-win32.whl", hash = "sha256:e3911d89b6d48b373f55bc4b9bc084dd8b725d666fcaaffd96ce27a7bbcbf762"}, + {file = "netCDF4-1.5.0-cp35-cp35m-win_amd64.whl", hash = "sha256:3e01fc91cf7b8fd3365daac1b80b6ff82a16fa95f20e40944dc2b72027dbccee"}, + {file = "netCDF4-1.5.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:08d1baad79966fdb841af11237dabbb230cec152abe1ce20b0eff1024a85bc02"}, + {file = "netCDF4-1.5.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b3a3c191b20a9a8dc69e096f482f9a38b61e04016f2cebeb30b2a4cb74bcece6"}, + {file = "netCDF4-1.5.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:67b4211f5466f910e5869719f928b763c442439004f94c2149cc44f153a4c485"}, + {file = "netCDF4-1.5.0-cp36-cp36m-win32.whl", hash = "sha256:0dae3e0528f091a9db9c4299c49dac435917405a48a791e826b31d5cec4ddbc9"}, + {file = "netCDF4-1.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:de8035a6a673cca52d3503d70dbbc74c7ca0775687601ed1130dd2c4f0889087"}, + {file = "netCDF4-1.5.0-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3605ea6dfd9746fc50ef260056bc38d68e5871ed5054488b566df7fd55df370a"}, + {file = "netCDF4-1.5.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:be3009bf8ae27396e9da6979a46b56e89de6c4c15f872ef249d73bd5939f8cb9"}, + {file = "netCDF4-1.5.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:aa028b4f27390d32ec12135a97dbeeaf3e28ebb03ecf36890d6eda9f9a49f052"}, + {file = "netCDF4-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:f6c7f3fdddb888e409defbb16b2de07752ebe1f6d16342a3c2b6aae2c20d093f"}, + {file = "netCDF4-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1ec1d5d2aa927ee75e06b6af31befe12f322f35e1171d53c1f79467b807d6cb5"}, + {file = "netCDF4-1.5.0.tar.gz", hash = "sha256:c258d1104f5fe0f110f4a140b0c84ebf32c2cc5803f186ee72fa93a4a464c0d9"}, +] +nodeenv = [ + {file = "nodeenv-1.6.0-py2.py3-none-any.whl", hash = "sha256:621e6b7076565ddcacd2db0294c0381e01fd28945ab36bcf00f41c5daf63bef7"}, + {file = "nodeenv-1.6.0.tar.gz", hash = "sha256:3ef13ff90291ba2a4a7a4ff9a979b63ffdd00a464dbe04acf0ea6471517a4c2b"}, +] +numpy = [ + {file = "numpy-1.21.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38e8648f9449a549a7dfe8d8755a5979b45b3538520d1e735637ef28e8c2dc50"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:fd7d7409fa643a91d0a05c7554dd68aa9c9bb16e186f6ccfe40d6e003156e33a"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a75b4498b1e93d8b700282dc8e655b8bd559c0904b3910b144646dbbbc03e062"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1412aa0aec3e00bc23fbb8664d76552b4efde98fb71f60737c83efbac24112f1"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e46ceaff65609b5399163de5893d8f2a82d3c77d5e56d976c8b5fb01faa6b671"}, + {file = "numpy-1.21.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:c6a2324085dd52f96498419ba95b5777e40b6bcbc20088fddb9e8cbb58885e8e"}, + {file = "numpy-1.21.1-cp37-cp37m-win32.whl", hash = "sha256:73101b2a1fef16602696d133db402a7e7586654682244344b8329cdcbbb82172"}, + {file = "numpy-1.21.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7a708a79c9a9d26904d1cca8d383bf869edf6f8e7650d85dbc77b041e8c5a0f8"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95b995d0c413f5d0428b3f880e8fe1660ff9396dcd1f9eedbc311f37b5652e16"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:635e6bd31c9fb3d475c8f44a089569070d10a9ef18ed13738b03049280281267"}, + {file = "numpy-1.21.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4a3d5fb89bfe21be2ef47c0614b9c9c707b7362386c9a3ff1feae63e0267ccb6"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a326af80e86d0e9ce92bcc1e65c8ff88297de4fa14ee936cb2293d414c9ec63"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:791492091744b0fe390a6ce85cc1bf5149968ac7d5f0477288f78c89b385d9af"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0318c465786c1f63ac05d7c4dbcecd4d2d7e13f0959b01b534ea1e92202235c5"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9a513bd9c1551894ee3d31369f9b07460ef223694098cf27d399513415855b68"}, + {file = "numpy-1.21.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:91c6f5fc58df1e0a3cc0c3a717bb3308ff850abdaa6d2d802573ee2b11f674a8"}, + {file = "numpy-1.21.1-cp38-cp38-win32.whl", hash = "sha256:978010b68e17150db8765355d1ccdd450f9fc916824e8c4e35ee620590e234cd"}, + {file = "numpy-1.21.1-cp38-cp38-win_amd64.whl", hash = "sha256:9749a40a5b22333467f02fe11edc98f022133ee1bfa8ab99bda5e5437b831214"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d7a4aeac3b94af92a9373d6e77b37691b86411f9745190d2c351f410ab3a791f"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d9e7912a56108aba9b31df688a4c4f5cb0d9d3787386b87d504762b6754fbb1b"}, + {file = "numpy-1.21.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25b40b98ebdd272bc3020935427a4530b7d60dfbe1ab9381a39147834e985eac"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8a92c5aea763d14ba9d6475803fc7904bda7decc2a0a68153f587ad82941fec1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05a0f648eb28bae4bcb204e6fd14603de2908de982e761a2fc78efe0f19e96e1"}, + {file = "numpy-1.21.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f01f28075a92eede918b965e86e8f0ba7b7797a95aa8d35e1cc8821f5fc3ad6a"}, + {file = "numpy-1.21.1-cp39-cp39-win32.whl", hash = "sha256:88c0b89ad1cc24a5efbb99ff9ab5db0f9a86e9cc50240177a571fbe9c2860ac2"}, + {file = "numpy-1.21.1-cp39-cp39-win_amd64.whl", hash = "sha256:01721eefe70544d548425a07c80be8377096a54118070b8a62476866d5208e33"}, + {file = "numpy-1.21.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d4d1de6e6fb3d28781c73fbde702ac97f03d79e4ffd6598b880b2d95d62ead4"}, + {file = "numpy-1.21.1.zip", hash = "sha256:dff4af63638afcc57a3dfb9e4b26d434a7a602d225b42d746ea7fe2edf1342fd"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pandas = [ + {file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:372d72a3d8a5f2dbaf566a5fa5fa7f230842ac80f29a931fb4b071502cf86b9a"}, + {file = "pandas-1.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d99d2350adb7b6c3f7f8f0e5dfb7d34ff8dd4bc0a53e62c445b7e43e163fce63"}, + {file = "pandas-1.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c2646458e1dce44df9f71a01dc65f7e8fa4307f29e5c0f2f92c97f47a5bf22f5"}, + {file = "pandas-1.3.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5298a733e5bfbb761181fd4672c36d0c627320eb999c59c65156c6a90c7e1b4f"}, + {file = "pandas-1.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22808afb8f96e2269dcc5b846decacb2f526dd0b47baebc63d913bf847317c8f"}, + {file = "pandas-1.3.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b528e126c13816a4374e56b7b18bfe91f7a7f6576d1aadba5dee6a87a7f479ae"}, + {file = "pandas-1.3.4-cp37-cp37m-win32.whl", hash = "sha256:fe48e4925455c964db914b958f6e7032d285848b7538a5e1b19aeb26ffaea3ec"}, + {file = "pandas-1.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eaca36a80acaacb8183930e2e5ad7f71539a66805d6204ea88736570b2876a7b"}, + {file = "pandas-1.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:42493f8ae67918bf129869abea8204df899902287a7f5eaf596c8e54e0ac7ff4"}, + {file = "pandas-1.3.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a388960f979665b447f0847626e40f99af8cf191bce9dc571d716433130cb3a7"}, + {file = "pandas-1.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ba0aac1397e1d7b654fccf263a4798a9e84ef749866060d19e577e927d66e1b"}, + {file = "pandas-1.3.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f567e972dce3bbc3a8076e0b675273b4a9e8576ac629149cf8286ee13c259ae5"}, + {file = "pandas-1.3.4-cp38-cp38-win32.whl", hash = "sha256:c1aa4de4919358c5ef119f6377bc5964b3a7023c23e845d9db7d9016fa0c5b1c"}, + {file = "pandas-1.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:dd324f8ee05925ee85de0ea3f0d66e1362e8c80799eb4eb04927d32335a3e44a"}, + {file = "pandas-1.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d47750cf07dee6b55d8423471be70d627314277976ff2edd1381f02d52dbadf9"}, + {file = "pandas-1.3.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d1dc09c0013d8faa7474574d61b575f9af6257ab95c93dcf33a14fd8d2c1bab"}, + {file = "pandas-1.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10e10a2527db79af6e830c3d5842a4d60383b162885270f8cffc15abca4ba4a9"}, + {file = "pandas-1.3.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35c77609acd2e4d517da41bae0c11c70d31c87aae8dd1aabd2670906c6d2c143"}, + {file = "pandas-1.3.4-cp39-cp39-win32.whl", hash = "sha256:003ba92db58b71a5f8add604a17a059f3068ef4e8c0c365b088468d0d64935fd"}, + {file = "pandas-1.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:a51528192755f7429c5bcc9e80832c517340317c861318fea9cea081b57c9afd"}, + {file = "pandas-1.3.4.tar.gz", hash = "sha256:a2aa18d3f0b7d538e21932f637fbfe8518d085238b429e4790a35e1e44a96ffc"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pillow = [ + {file = "Pillow-8.4.0-cp310-cp310-macosx_10_10_universal2.whl", hash = "sha256:81f8d5c81e483a9442d72d182e1fb6dcb9723f289a57e8030811bac9ea3fef8d"}, + {file = "Pillow-8.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3f97cfb1e5a392d75dd8b9fd274d205404729923840ca94ca45a0af57e13dbe6"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb9fc393f3c61f9054e1ed26e6fe912c7321af2f41ff49d3f83d05bacf22cc78"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82cdb63100ef5eedb8391732375e6d05993b765f72cb34311fab92103314649"}, + {file = "Pillow-8.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62cc1afda735a8d109007164714e73771b499768b9bb5afcbbee9d0ff374b43f"}, + {file = "Pillow-8.4.0-cp310-cp310-win32.whl", hash = "sha256:e3dacecfbeec9a33e932f00c6cd7996e62f53ad46fbe677577394aaa90ee419a"}, + {file = "Pillow-8.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:620582db2a85b2df5f8a82ddeb52116560d7e5e6b055095f04ad828d1b0baa39"}, + {file = "Pillow-8.4.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:1bc723b434fbc4ab50bb68e11e93ce5fb69866ad621e3c2c9bdb0cd70e345f55"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72cbcfd54df6caf85cc35264c77ede902452d6df41166010262374155947460c"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70ad9e5c6cb9b8487280a02c0ad8a51581dcbbe8484ce058477692a27c151c0a"}, + {file = "Pillow-8.4.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a49dc2e2f74e65efaa32b153527fc5ac98508d502fa46e74fa4fd678ed6645"}, + {file = "Pillow-8.4.0-cp36-cp36m-win32.whl", hash = "sha256:93ce9e955cc95959df98505e4608ad98281fff037350d8c2671c9aa86bcf10a9"}, + {file = "Pillow-8.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2e4440b8f00f504ee4b53fe30f4e381aae30b0568193be305256b1462216feff"}, + {file = "Pillow-8.4.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:8c803ac3c28bbc53763e6825746f05cc407b20e4a69d0122e526a582e3b5e153"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8a17b5d948f4ceeceb66384727dde11b240736fddeda54ca740b9b8b1556b29"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1394a6ad5abc838c5cd8a92c5a07535648cdf6d09e8e2d6df916dfa9ea86ead8"}, + {file = "Pillow-8.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:792e5c12376594bfcb986ebf3855aa4b7c225754e9a9521298e460e92fb4a488"}, + {file = "Pillow-8.4.0-cp37-cp37m-win32.whl", hash = "sha256:d99ec152570e4196772e7a8e4ba5320d2d27bf22fdf11743dd882936ed64305b"}, + {file = "Pillow-8.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7b7017b61bbcdd7f6363aeceb881e23c46583739cb69a3ab39cb384f6ec82e5b"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:d89363f02658e253dbd171f7c3716a5d340a24ee82d38aab9183f7fdf0cdca49"}, + {file = "Pillow-8.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0a0956fdc5defc34462bb1c765ee88d933239f9a94bc37d132004775241a7585"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b7bb9de00197fb4261825c15551adf7605cf14a80badf1761d61e59da347779"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72b9e656e340447f827885b8d7a15fc8c4e68d410dc2297ef6787eec0f0ea409"}, + {file = "Pillow-8.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5a4532a12314149d8b4e4ad8ff09dde7427731fcfa5917ff16d0291f13609df"}, + {file = "Pillow-8.4.0-cp38-cp38-win32.whl", hash = "sha256:82aafa8d5eb68c8463b6e9baeb4f19043bb31fefc03eb7b216b51e6a9981ae09"}, + {file = "Pillow-8.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:066f3999cb3b070a95c3652712cffa1a748cd02d60ad7b4e485c3748a04d9d76"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:5503c86916d27c2e101b7f71c2ae2cddba01a2cf55b8395b0255fd33fa4d1f1a"}, + {file = "Pillow-8.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4acc0985ddf39d1bc969a9220b51d94ed51695d455c228d8ac29fcdb25810e6e"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b052a619a8bfcf26bd8b3f48f45283f9e977890263e4571f2393ed8898d331b"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:493cb4e415f44cd601fcec11c99836f707bb714ab03f5ed46ac25713baf0ff20"}, + {file = "Pillow-8.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8831cb7332eda5dc89b21a7bce7ef6ad305548820595033a4b03cf3091235ed"}, + {file = "Pillow-8.4.0-cp39-cp39-win32.whl", hash = "sha256:5e9ac5f66616b87d4da618a20ab0a38324dbe88d8a39b55be8964eb520021e02"}, + {file = "Pillow-8.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:3eb1ce5f65908556c2d8685a8f0a6e989d887ec4057326f6c22b24e8a172c66b"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ddc4d832a0f0b4c52fff973a0d44b6c99839a9d016fe4e6a1cb8f3eea96479c2"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a3e5ddc44c14042f0844b8cf7d2cd455f6cc80fd7f5eefbe657292cf601d9ad"}, + {file = "Pillow-8.4.0-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70e94281588ef053ae8998039610dbd71bc509e4acbc77ab59d7d2937b10698"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:3862b7256046fcd950618ed22d1d60b842e3a40a48236a5498746f21189afbbc"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4901622493f88b1a29bd30ec1a2f683782e57c3c16a2dbc7f2595ba01f639df"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c471a734240653a0ec91dec0996696eea227eafe72a33bd06c92697728046b"}, + {file = "Pillow-8.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:244cf3b97802c34c41905d22810846802a3329ddcb93ccc432870243211c79fc"}, + {file = "Pillow-8.4.0.tar.gz", hash = "sha256:b8e2f83c56e141920c39464b852de3719dfbfb6e3c99a2d8da0edf4fb33176ed"}, +] +platformdirs = [ + {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, + {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poetry-semver = [ + {file = "poetry-semver-0.1.0.tar.gz", hash = "sha256:d809b612aa27b39bf2d0fc9d31b4f4809b0e972646c5f19cfa46c725b7638810"}, + {file = "poetry_semver-0.1.0-py2.py3-none-any.whl", hash = "sha256:4e6349bd7231cc657f0e1930f7b204e87e33dfd63eef5cac869363969515083a"}, +] +poetry2conda = [ + {file = "poetry2conda-0.3.0-py3-none-any.whl", hash = "sha256:218618d37331bd6d3d3007edcf21d71802990a0ce9c27e8bb23f739cfa82ed03"}, + {file = "poetry2conda-0.3.0.tar.gz", hash = "sha256:574b6295ff877ff8fb56fe2034160ff9ee9db55a3f3c2faec65458e69125491b"}, +] +pre-commit = [ + {file = "pre_commit-2.15.0-py2.py3-none-any.whl", hash = "sha256:a4ed01000afcb484d9eb8d504272e642c4c4099bbad3a6b27e519bd6a3e928a6"}, + {file = "pre_commit-2.15.0.tar.gz", hash = "sha256:3c25add78dbdfb6a28a651780d5c311ac40dd17f160eb3954a0c59da40a505a7"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.23-py3-none-any.whl", hash = "sha256:5f29d62cb7a0ecacfa3d8ceea05a63cd22500543472d64298fc06ddda906b25d"}, + {file = "prompt_toolkit-3.0.23.tar.gz", hash = "sha256:7053aba00895473cb357819358ef33f11aa97e4ac83d38efb123e5649ceeecaf"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pygments = [ + {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, + {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, +] +pyparsing = [ + {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, + {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, +] +pytest = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] +pytest-cov = [ + {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"}, + {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] +pytz = [ + {file = "pytz-2021.3-py2.py3-none-any.whl", hash = "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c"}, + {file = "pytz-2021.3.tar.gz", hash = "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326"}, +] +pyyaml = [ + {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, + {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, + {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, + {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, + {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, + {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, + {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, + {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, + {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, + {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, + {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, + {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, + {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, + {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, + {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, + {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, + {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, + {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, + {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, + {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, + {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, + {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, +] +questionary = [ + {file = "questionary-1.10.0-py3-none-any.whl", hash = "sha256:fecfcc8cca110fda9d561cb83f1e97ecbb93c613ff857f655818839dac74ce90"}, + {file = "questionary-1.10.0.tar.gz", hash = "sha256:600d3aefecce26d48d97eee936fdb66e4bc27f934c3ab6dd1e292c4f43946d90"}, +] +regex = [ + {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"}, + {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"}, + {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"}, + {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9ed0b1e5e0759d6b7f8e2f143894b2a7f3edd313f38cf44e1e15d360e11749b"}, + {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:473e67837f786404570eae33c3b64a4b9635ae9f00145250851a1292f484c063"}, + {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2fee3ed82a011184807d2127f1733b4f6b2ff6ec7151d83ef3477f3b96a13d03"}, + {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d5fd67df77bab0d3f4ea1d7afca9ef15c2ee35dfb348c7b57ffb9782a6e4db6e"}, + {file = "regex-2021.11.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5d408a642a5484b9b4d11dea15a489ea0928c7e410c7525cd892f4d04f2f617b"}, + {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"}, + {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"}, + {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"}, + {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"}, + {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:74cbeac0451f27d4f50e6e8a8f3a52ca074b5e2da9f7b505c4201a57a8ed6286"}, + {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:3598893bde43091ee5ca0a6ad20f08a0435e93a69255eeb5f81b85e81e329264"}, + {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:50a7ddf3d131dc5633dccdb51417e2d1910d25cbcf842115a3a5893509140a3a"}, + {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:61600a7ca4bcf78a96a68a27c2ae9389763b5b94b63943d5158f2a377e09d29a"}, + {file = "regex-2021.11.10-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:563d5f9354e15e048465061509403f68424fef37d5add3064038c2511c8f5e00"}, + {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"}, + {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"}, + {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"}, + {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"}, + {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:42b50fa6666b0d50c30a990527127334d6b96dd969011e843e726a64011485da"}, + {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6e1d2cc79e8dae442b3fa4a26c5794428b98f81389af90623ffcc650ce9f6732"}, + {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:0416f7399e918c4b0e074a0f66e5191077ee2ca32a0f99d4c187a62beb47aa05"}, + {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ce298e3d0c65bd03fa65ffcc6db0e2b578e8f626d468db64fdf8457731052942"}, + {file = "regex-2021.11.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:dc07f021ee80510f3cd3af2cad5b6a3b3a10b057521d9e6aaeb621730d320c5a"}, + {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"}, + {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"}, + {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"}, + {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"}, + {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"}, + {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f5be7805e53dafe94d295399cfbe5227f39995a997f4fd8539bf3cbdc8f47ca8"}, + {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a955b747d620a50408b7fdf948e04359d6e762ff8a85f5775d907ceced715129"}, + {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:139a23d1f5d30db2cc6c7fd9c6d6497872a672db22c4ae1910be22d4f4b2068a"}, + {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:ca49e1ab99593438b204e00f3970e7a5f70d045267051dfa6b5f4304fcfa1dbf"}, + {file = "regex-2021.11.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:96fc32c16ea6d60d3ca7f63397bff5c75c5a562f7db6dec7d412f7c4d2e78ec0"}, + {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"}, + {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"}, + {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"}, + {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"}, + {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"}, + {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cd410a1cbb2d297c67d8521759ab2ee3f1d66206d2e4328502a487589a2cb21b"}, + {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e6096b0688e6e14af6a1b10eaad86b4ff17935c49aa774eac7c95a57a4e8c296"}, + {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:529801a0d58809b60b3531ee804d3e3be4b412c94b5d267daa3de7fadef00f49"}, + {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f594b96fe2e0821d026365f72ac7b4f0b487487fb3d4aaf10dd9d97d88a9737"}, + {file = "regex-2021.11.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2409b5c9cef7054dde93a9803156b411b677affc84fca69e908b1cb2c540025d"}, + {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"}, + {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"}, + {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"}, +] +requests = [ + {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, + {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, +] +scikit-learn = [ + {file = "scikit-learn-0.19.2.tar.gz", hash = "sha256:b276739a5f863ccacb61999a3067d0895ee291c95502929b2ae56ea1f882e888"}, + {file = "scikit_learn-0.19.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:66bfc2b6b15db1725d03ea657ec9184ff09dcbf1ecd834ef85f2edc2c9cbba97"}, + {file = "scikit_learn-0.19.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:aad6b9aac1617bd7efa0450643888bbd3410679a94bc8680d9863825686ef369"}, + {file = "scikit_learn-0.19.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:69a34d389d9ca4687ad00af4e11d53686771f484c37366f68617ef656bab16ab"}, + {file = "scikit_learn-0.19.2-cp27-cp27m-win32.whl", hash = "sha256:ed2a9a9bea6ec443b7effe5695c9c168b7bf9a67df6d880729760feda871b6a3"}, + {file = "scikit_learn-0.19.2-cp27-cp27m-win_amd64.whl", hash = "sha256:ce121baa8e85ec27c3065281657dcd78adaab7dcb046c7fe96ad4e5a9dcb6610"}, + {file = "scikit_learn-0.19.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:5f7577fbb2399a4712e96cf0e786638168940a876c33735a1b5d5a86ba4b1370"}, + {file = "scikit_learn-0.19.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a402c1484fe65df42d5dbc22a58e0695fe3afe2b0b229aee2a09c6d60ba8e5c2"}, + {file = "scikit_learn-0.19.2-cp34-cp34m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:efd842d70b87e3ef3429c3149840b9189d4441ca951ab0cec62c94a964e219d9"}, + {file = "scikit_learn-0.19.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:c6612e7e43988b8b5e1957150449493a55f9c059de641083df7a964f86f2d1e7"}, + {file = "scikit_learn-0.19.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:f1428af5c381f6eef30ffbc7e047b7c713d4efa5d7bf5e57b62b3fc8d387044b"}, + {file = "scikit_learn-0.19.2-cp34-cp34m-win32.whl", hash = "sha256:9ebb38ab1d0ee143982aed561811903ac6c1abb512ae2b9019b3b65bde63ffb9"}, + {file = "scikit_learn-0.19.2-cp34-cp34m-win_amd64.whl", hash = "sha256:b3dc88c4d2bcb26ffc5afe16d053ae28317d7d1de083651defcd5453a04f1563"}, + {file = "scikit_learn-0.19.2-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:b3e4681253e95da5aa5c231889a32b084fd997962bf8beda6f796bf422f734b2"}, + {file = "scikit_learn-0.19.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c3d852d49d6c1710089d4513702099fa6f8e1aebfedf222319d80c47b0a195f8"}, + {file = "scikit_learn-0.19.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f6c7bf8cd4de1640b760b47f4d28deb26dbbf9acbe0194cdff54a898e190d872"}, + {file = "scikit_learn-0.19.2-cp35-cp35m-win32.whl", hash = "sha256:f8329ac2160ad8bbbac6a507374685ceca3f24ca427fa9ee61a501280e1972d9"}, + {file = "scikit_learn-0.19.2-cp35-cp35m-win_amd64.whl", hash = "sha256:3e3ce307d7c5c5811658ba8686b24b571a8244eaafe707665ad601f400d5ce98"}, + {file = "scikit_learn-0.19.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:0a718b5ffbd5053fb3f9e1a2e20b7c4f256dd8035e246b907d3117d20bac0260"}, + {file = "scikit_learn-0.19.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ad4db28d3dc16c01df75ed6efb72524537de3839a5d179fcf94094359fc72ec5"}, + {file = "scikit_learn-0.19.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:42ad71502237c9fe300ecf157f5a394df717789a2dde541dd7034b539c70bdcc"}, + {file = "scikit_learn-0.19.2-cp36-cp36m-win32.whl", hash = "sha256:c69e5c6051366a6ac9600d730276db939b1a205e42504ec0b8371f154b0058db"}, + {file = "scikit_learn-0.19.2-cp36-cp36m-win_amd64.whl", hash = "sha256:1725540b754a9967778e9385e1ee2c8db50d5ab70ed835c9f5e36002ffabc169"}, + {file = "scikit_learn-0.19.2-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:47b4090b7686642e41176becb7c42ef3cc665d7ee0db5e7ea5d307ec9779327e"}, + {file = "scikit_learn-0.19.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:42cba716db197e0d1670e2fc13c4cc4a86d5c5358120ccfee6ec427b154e74ff"}, + {file = "scikit_learn-0.19.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:51d99a08c8bf689cf60c9d8dca6e3d3e5f6d762def85ad735dcea11fb528a89b"}, + {file = "scikit_learn-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:75297f3dd6685f01555f1bb75846995d45650af417280b69c81bf11b6987aed5"}, + {file = "scikit_learn-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:fefba2a43b92f8393366093b60efbe984a72a2b41cce16b4002005e4104ef938"}, +] +scipy = [ + {file = "scipy-1.6.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a15a1f3fc0abff33e792d6049161b7795909b40b97c6cc2934ed54384017ab76"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e79570979ccdc3d165456dd62041d9556fb9733b86b4b6d818af7a0afc15f092"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a423533c55fec61456dedee7b6ee7dce0bb6bfa395424ea374d25afa262be261"}, + {file = "scipy-1.6.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:33d6b7df40d197bdd3049d64e8e680227151673465e5d85723b3b8f6b15a6ced"}, + {file = "scipy-1.6.1-cp37-cp37m-win32.whl", hash = "sha256:6725e3fbb47da428794f243864f2297462e9ee448297c93ed1dcbc44335feb78"}, + {file = "scipy-1.6.1-cp37-cp37m-win_amd64.whl", hash = "sha256:5fa9c6530b1661f1370bcd332a1e62ca7881785cc0f80c0d559b636567fab63c"}, + {file = "scipy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bd50daf727f7c195e26f27467c85ce653d41df4358a25b32434a50d8870fc519"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:f46dd15335e8a320b0fb4685f58b7471702234cba8bb3442b69a3e1dc329c345"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0e5b0ccf63155d90da576edd2768b66fb276446c371b73841e3503be1d63fb5d"}, + {file = "scipy-1.6.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2481efbb3740977e3c831edfd0bd9867be26387cacf24eb5e366a6a374d3d00d"}, + {file = "scipy-1.6.1-cp38-cp38-win32.whl", hash = "sha256:68cb4c424112cd4be886b4d979c5497fba190714085f46b8ae67a5e4416c32b4"}, + {file = "scipy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:5f331eeed0297232d2e6eea51b54e8278ed8bb10b099f69c44e2558c090d06bf"}, + {file = "scipy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0c8a51d33556bf70367452d4d601d1742c0e806cd0194785914daf19775f0e67"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:83bf7c16245c15bc58ee76c5418e46ea1811edcc2e2b03041b804e46084ab627"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:794e768cc5f779736593046c9714e0f3a5940bc6dcc1dba885ad64cbfb28e9f0"}, + {file = "scipy-1.6.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5da5471aed911fe7e52b86bf9ea32fb55ae93e2f0fac66c32e58897cfb02fa07"}, + {file = "scipy-1.6.1-cp39-cp39-win32.whl", hash = "sha256:8e403a337749ed40af60e537cc4d4c03febddcc56cd26e774c9b1b600a70d3e4"}, + {file = "scipy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5193a098ae9f29af283dcf0041f762601faf2e595c0db1da929875b7570353f"}, + {file = "scipy-1.6.1.tar.gz", hash = "sha256:c4fceb864890b6168e79b0e714c585dbe2fd4222768ee90bc1aa0f8218691b11"}, +] +seaborn = [ + {file = "seaborn-0.7.1.tar.gz", hash = "sha256:fa274344b1ee72f723bab751c40a5c671801d47a29ee9b5e69fcf63a18ce5c5d"}, +] +setuptools-scm = [ + {file = "setuptools_scm-6.3.2-py3-none-any.whl", hash = "sha256:4c64444b1d49c4063ae60bfe1680f611c8b13833d556fd1d6050c0023162a119"}, + {file = "setuptools_scm-6.3.2.tar.gz", hash = "sha256:a49aa8081eeb3514eb9728fa5040f2eaa962d6c6f4ec9c32f6c1fba88f88a0f2"}, +] +shapely = [ + {file = "Shapely-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5632cedea6d815b61eb4c264da1c3f24a8ce2ceba2f74e30fba340ca230563"}, + {file = "Shapely-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ce1f18a0c9bb6b483c73bd7a0eb3a5e90676bcc29b9c27120236e662195c9d"}, + {file = "Shapely-1.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e8cdffeec6d0c47ed1eb215ec4e80c024ac05be6ded982061c1e1188034f22f"}, + {file = "Shapely-1.8.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83d10f8b47a7568fc90063f72da62cda201dc92ecadf80cc00c015babc48e11f"}, + {file = "Shapely-1.8.0-cp36-cp36m-win32.whl", hash = "sha256:78b3a46dadd47c27e658d5e8d9006b4b1eb9b7ab947b450059225dcee799a18f"}, + {file = "Shapely-1.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0e640d6da59172d679270f0dfd88128b6ae7c57df864a030dd858ff924c307fc"}, + {file = "Shapely-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68bdf463f7a609fbed42bbded18fa74c82a5741251984a5597d070060f4286f4"}, + {file = "Shapely-1.8.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c3cc87e66cbffd00ce0457c03969b64935752824bf43a1cd61f21cf606997d6"}, + {file = "Shapely-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:bd84d993a0e8e07f5ebb4c67794d5392fdd23ce59a7ccc121900f2080f57989a"}, + {file = "Shapely-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:796b15a483ac37c2dc757654186d0e064a42fb6f43cb9d1ff65d81cd0c92a84e"}, + {file = "Shapely-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:622f62d2b2da81dd40841a56db0f78bcf9f9af7a83c7d5f5dc9bcb234aa650ba"}, + {file = "Shapely-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26b43b69dfeb8a8cb27aacf5597134baf12337845c2bacb01809540c20d3d904"}, + {file = "Shapely-1.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cfb9d72d255af1a484e3859f4c9bb737950faf1d16c21d2b949ffc4ba5f46147"}, + {file = "Shapely-1.8.0-cp38-cp38-win32.whl", hash = "sha256:f304243b1f4d7bca9b3c9fdeec6565171e1b611fb4a3d6c93efc870c8a75958c"}, + {file = "Shapely-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:8917a91430126165cfa4bc2b4cf168121e37ff0c8657134e7398c597ca1fe934"}, + {file = "Shapely-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:19b54cd840883fd71cce98fd94916d1731eed8a32c115eb082b3ed24e631be02"}, + {file = "Shapely-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13cbb959863cec32d48e2cffdc4bb81828bc3b0fa4256c9b2b32edac5021a0e4"}, + {file = "Shapely-1.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7e1aebf4f1b2fbef40152fd531216387fcf6fe4ff2d777268381979b63c7c779"}, + {file = "Shapely-1.8.0-cp39-cp39-win32.whl", hash = "sha256:83145eda2e582c2046d1ecc6a0d7dbfe97f492434311124f65ea60f4e87a6b65"}, + {file = "Shapely-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b54ebd8fa4b78320f6d87032fe91363c7c1bf0f8d4a30eb93bca6413f787fd5"}, + {file = "Shapely-1.8.0.tar.gz", hash = "sha256:f5307ee14ba4199f8bbcf6532ca33064661c1433960c432c84f0daa73b47ef9c"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +sphinx = [ + {file = "Sphinx-4.3.1-py3-none-any.whl", hash = "sha256:048dac56039a5713f47a554589dc98a442b39226a2b9ed7f82797fcb2fe9253f"}, + {file = "Sphinx-4.3.1.tar.gz", hash = "sha256:32a5b3e9a1b176cc25ed048557d4d3d01af635e6b76c5bc7a43b0a34447fbd45"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tomli = [ + {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, + {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, +] +tomlkit = [ + {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, + {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, +] +typed-ast = [ + {file = "typed_ast-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b310a207ee9fde3f46ba327989e6cba4195bc0c8c70a158456e7b10233e6bed"}, + {file = "typed_ast-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52ca2b2b524d770bed7a393371a38e91943f9160a190141e0df911586066ecda"}, + {file = "typed_ast-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:14fed8820114a389a2b7e91624db5f85f3f6682fda09fe0268a59aabd28fe5f5"}, + {file = "typed_ast-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:65c81abbabda7d760df7304d843cc9dbe7ef5d485504ca59a46ae2d1731d2428"}, + {file = "typed_ast-1.5.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:37ba2ab65a0028b1a4f2b61a8fe77f12d242731977d274a03d68ebb751271508"}, + {file = "typed_ast-1.5.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:49af5b8f6f03ed1eb89ee06c1d7c2e7c8e743d720c3746a5857609a1abc94c94"}, + {file = "typed_ast-1.5.0-cp36-cp36m-win_amd64.whl", hash = "sha256:e4374a76e61399a173137e7984a1d7e356038cf844f24fd8aea46c8029a2f712"}, + {file = "typed_ast-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ea517c2bb11c5e4ba7a83a91482a2837041181d57d3ed0749a6c382a2b6b7086"}, + {file = "typed_ast-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:51040bf45aacefa44fa67fb9ebcd1f2bec73182b99a532c2394eea7dabd18e24"}, + {file = "typed_ast-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:806e0c7346b9b4af8c62d9a29053f484599921a4448c37fbbcbbf15c25138570"}, + {file = "typed_ast-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a67fd5914603e2165e075f1b12f5a8356bfb9557e8bfb74511108cfbab0f51ed"}, + {file = "typed_ast-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:224afecb8b39739f5c9562794a7c98325cb9d972712e1a98b6989a4720219541"}, + {file = "typed_ast-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:155b74b078be842d2eb630dd30a280025eca0a5383c7d45853c27afee65f278f"}, + {file = "typed_ast-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:361b9e5d27bd8e3ccb6ea6ad6c4f3c0be322a1a0f8177db6d56264fa0ae40410"}, + {file = "typed_ast-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:618912cbc7e17b4aeba86ffe071698c6e2d292acbd6d1d5ec1ee724b8c4ae450"}, + {file = "typed_ast-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7e6731044f748340ef68dcadb5172a4b1f40847a2983fe3983b2a66445fbc8e6"}, + {file = "typed_ast-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e8a9b9c87801cecaad3b4c2b8876387115d1a14caa602c1618cedbb0cb2a14e6"}, + {file = "typed_ast-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:ec184dfb5d3d11e82841dbb973e7092b75f306b625fad7b2e665b64c5d60ab3f"}, + {file = "typed_ast-1.5.0.tar.gz", hash = "sha256:ff4ad88271aa7a55f19b6a161ed44e088c393846d954729549e3cde8257747bb"}, +] +typing-extensions = [ + {file = "typing_extensions-4.0.0-py3-none-any.whl", hash = "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9"}, + {file = "typing_extensions-4.0.0.tar.gz", hash = "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed"}, +] +urllib3 = [ + {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, + {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, +] +virtualenv = [ + {file = "virtualenv-20.10.0-py2.py3-none-any.whl", hash = "sha256:4b02e52a624336eece99c96e3ab7111f469c24ba226a53ec474e8e787b365814"}, + {file = "virtualenv-20.10.0.tar.gz", hash = "sha256:576d05b46eace16a9c348085f7d0dc8ef28713a2cabaa1cf0aea41e8f12c9218"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +zipp = [ + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, +] diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..3b67ab32 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,89 @@ +[tool.poetry] +name = "fm2prof" +version = "1.4.3" +description = "Package use to reduce Delft3D FM models from 2D models to 1D models" +authors = ["K.D. Berends "] +maintainers = ["Carles S. Soriano Perez "] +license = "GNU LGPL" +packages = [ + { include = "fm2prof" }, +] + +[tool.poetry.dependencies] +python = "^3.7" +seaborn = "^0.7" +pandas = "^1.3.4" +numpy = "^1.14" +netCDF4 = "1.5" +scipy = "^1.0" +scikit-learn = "^0.19.0" +geojson = "^2.4.1" +Shapely = "^1.8.0" +click = "^8.0.3" +matplotlib = "^3.5.0" + +[tool.poetry.dev-dependencies] +pytest = "^6.2.5" +pytest-cov = "^3.0.0" +black = "^21.11b1" +isort = "^5.10.1" +Sphinx = "^4.3.1" +commitizen = "^2.20.0" +pre-commit = "^2.15.0" +poetry2conda = "^0.3.0" + +[tool.commitizen] +name = "cz_conventional_commits" +changelog_file = "docs/CHANGELOG.rst" +update_changelog_on_bump = true +version = "1.4.3" +tag_format = "v$major.$minor.$patch" +version_files = [ + "fm2prof/__init__.py", + "pyproject.toml:version" +] + +[tool.commitizen.custommize] +bump_pattern = "^(break|new|fix|hotfix|refactor|docs)" +bump_map = {"break" = "MAJOR", "new" = "MINOR", "fix" = "PATCH", "hotfix" = "PATCH", "refactor"="PATCH", "docs" = "PATCH"} + +[tool.coverage.run] +omit = [ + "test/*", + "docs/*" + ] + +[tool.black] +line-length = 88 +target-version = ['py37', 'py38'] +exclude = ''' +( + /( + \.eggs # exclude a few common directories in the + | \.git # root of the project + | \.hg + | \.mypy_cache + | \.tox + | \.venv + | _build + | buck-out + | build + | dist + | \.virtualenvs + )/ +) +''' + +[tool.isort] +profile = "black" +multi_line_output = 3 +line_length = 88 + +[build-system] +requires = ["poetry-core>=1.0.4"] +build-backend = "poetry.core.masonry.api" + +[tool.poetry2conda.dependencies] +pandas = { channel = "conda-forge" } +netCDF4 = { channel = "conda-forge" } +shapely = { channel = "conda-forge" } diff --git a/setup.py b/setup.py deleted file mode 100644 index 73d54e56..00000000 --- a/setup.py +++ /dev/null @@ -1,29 +0,0 @@ -from setuptools import setup, find_packages - -# more info: https://docs.python.org/3/distutils/setupscript.html -# https://docs.pytest.org/en/latest/goodpractices.html#choosing-a-test-layout-import-rules - -setup( - name="fm2prof", - packages=(find_packages(exclude=('tests', 'ReportGenerator'))), - # package_dir={'fm2prof': 'fm2prof'}, - version='1.4.0', - description='Package use to reduce Delft3D FM models from 2D models to 1D models', - license='LICENSE.txt', - long_description=open('README.txt').read(), - author='K.D. Berends', - author_email='koen.berends@deltares.nl', - url='https://www.deltares.nl/nl/', - download_url='https://repos.deltares.nl/repos/RIVmodels/rivtools/branches/fm2profTool', - install_requires=[ - "seaborn>=0.7", - "pandas>=0.18", - "numpy>=1.12", - "matplotlib>=1.5", - "netCDF4>=1.2.9", - "scipy>=1.0", - "scikit_learn>=0.19.0", - "geojson>=2.4.1", - "shapely" - ], -) diff --git a/tests/TestUtils.py b/tests/TestUtils.py index 8d436602..d719331c 100644 --- a/tests/TestUtils.py +++ b/tests/TestUtils.py @@ -1,15 +1,24 @@ -import sys +import contextlib import os +import shutil +import sys +from pathlib import Path +from typing import List + +import pytest + try: from pip import main as pipmain -except: +except Exception as e_info: from pip._internal import main as pipmain class TestUtils: - _name_external = 'external_test_data' - _name_local = 'test_data' + _name_external = "external_test_data" + _name_local = "test_data" + _name_artifacts = "artifacts" + _temp_copies = "temp-copies" @staticmethod def install_package(package: str): @@ -19,70 +28,59 @@ def install_package(package: str): Arguments: package {str} -- Name of the PIP package. """ - pipmain(['install', package]) + pipmain(["install", package]) + + @staticmethod + def get_external_test_data_dir() -> Path: + return Path(__file__).parent / TestUtils._name_external @staticmethod - def get_local_test_data_dir(dir_name: str): + def get_local_test_data_dir(dir_name: str) -> Path: """ Returns the desired directory relative to the test data. Avoiding extra code on the tests. """ - directory = TestUtils.get_test_data_dir( - dir_name, TestUtils._name_local) + directory = TestUtils.get_test_data_dir(dir_name, TestUtils._name_local) return directory @staticmethod - def get_external_test_data_dir(dir_name: str): + def get_external_repo(dir_name: str) -> Path: """ - Returns the desired directory relative to the test external data. - Avoiding extra code on the tests. + Returns the parent directory of this repo directory. + + Args: + dir_name (str): Repo 'sibbling' of the current one. + + Returns: + Path: Path to the sibbling repo. """ - directory = TestUtils.get_test_data_dir( - dir_name, TestUtils._name_external) - return directory + return Path(__file__).parent.parent.parent / dir_name @staticmethod - def get_test_data_dir(dir_name: str, test_data_name: str): + def get_test_data_dir(dir_name: str, test_data_name: str) -> Path: """ Returns the desired directory relative to the test external data. Avoiding extra code on the tests. """ - test_dir = os.path.dirname(__file__) - try: - dir_path = '{}\\{}\\'.format(test_data_name, dir_name) - test_dir = os.path.join(test_dir, dir_path) - except Exception: - print("An error occurred trying to find {}".format(dir_name)) - return test_dir + return Path(__file__).parent / test_data_name / dir_name @staticmethod - def get_test_dir(dir_name: str): - """Returns the desired directory inside the Tests folder - - Arguments: - dir_name {str} -- Target directory. - - Returns: - {str} -- Path to the target directory. - """ - test_dir = os.path.dirname(__file__) - dir_path = os.path.join(test_dir, dir_name) - return dir_path + def get_local_test_file(filepath: str) -> Path: + return Path(__file__).parent / TestUtils._name_local / filepath @staticmethod - def get_test_dir_output(dir_name: str) -> str: - """Returns the path to the output test data. - If it does not exist already it is created. + @contextlib.contextmanager + def working_directory(path: Path): + """Changes working directory and returns to previous on exit.""" + prev_cwd = Path.cwd() + os.chdir(path) + try: + yield + finally: + os.chdir(prev_cwd) - Arguments: - dir_name {str} -- Name of the folder under Output. - Returns: - str -- Path to the test output dir. - """ - output_dir = os.path.join('Output', dir_name) - test_dir = TestUtils.get_test_dir(output_dir) - # Create it if it does not exist - if not os.path.exists(test_dir): - os.mkdir(test_dir) - return test_dir +skipwhenexternalsmissing = pytest.mark.skipif( + not (TestUtils.get_external_test_data_dir().is_dir()), + reason="Only to be run to generate expected data from local machines.", +) diff --git a/tests/test_Import.py b/tests/test_Import.py index 77817ae1..a6a6475d 100644 --- a/tests/test_Import.py +++ b/tests/test_Import.py @@ -5,38 +5,37 @@ import numbers from pathlib import Path import shutil -from tests.TestUtils import TestUtils +from tests.TestUtils import TestUtils, skipwhenexternalsmissing from fm2prof.Import import FmModelData, FMDataImporter class Test_FMDataImporter: @pytest.mark.unittest + @skipwhenexternalsmissing def test_when_map_file_without_czu_no_exception(self): # 1. Set up test data - test_map = Path(TestUtils.get_local_test_data_dir("main_test_data")).joinpath("fm_map.nc") + test_map = Path(TestUtils.get_local_test_data_dir("main_test_data")).joinpath( + "fm_map.nc" + ) + assert test_map.is_file() # 2. Set initial expectations + return_value = FMDataImporter().import_dflow2d(test_map) - # 3. Run test - try: - FMDataImporter().import_dflow2d(test_map) - except: - pytest.fail('No exception expected but was thrown') - - # 4. Verify final expectations - + # 3. Verify final expectations + assert return_value is not None -class Test_FmModelData: +class Test_FmModelData: @pytest.mark.unittest - @pytest.mark.parametrize("arg_list", [(''), (None)]) + @pytest.mark.parametrize("arg_list", [(""), (None)]) def test_when_no_arguments_exception_is_risen(self, arg_list): # 1. Set up test data arg_list = arg_list # 2. Set initial expectations - expected_error_message = 'FM model data was not read correctly.' + expected_error_message = "FM model data was not read correctly." # 3. Run test with pytest.raises(Exception) as pytest_wrapped_e: @@ -44,21 +43,26 @@ def test_when_no_arguments_exception_is_risen(self, arg_list): # 4. Verify final expectations recieved_error_message = str(pytest_wrapped_e.value) - assert expected_error_message == recieved_error_message, '' + \ - 'Expected error message {},'.format(expected_error_message) + \ - ' does not match generated {}'.format(recieved_error_message) + assert expected_error_message == recieved_error_message, ( + "" + + "Expected error message {},".format(expected_error_message) + + " does not match generated {}".format(recieved_error_message) + ) @pytest.mark.unittest - @pytest.mark.parametrize("arg_list", [(''), (None)]) + @pytest.mark.parametrize("arg_list", [(""), (None)]) def test_when_argument_length_not_as_expected_then_exception_is_risen( - self, arg_list): + self, arg_list + ): # 1. Set up test data - arg_list = ['arg1', 'arg2'] + arg_list = ["arg1", "arg2"] # 2. Set initial expectations - expected_error_message = '' + \ - 'Fm model data expects 5 arguments but only' + \ - ' {} were given'.format(len(arg_list)) + expected_error_message = ( + "" + + "Fm model data expects 5 arguments but only" + + " {} were given".format(len(arg_list)) + ) # 3. Run test with pytest.raises(Exception) as pytest_wrapped_e: @@ -66,36 +70,38 @@ def test_when_argument_length_not_as_expected_then_exception_is_risen( # 4. Verify final expectations recieved_error_message = str(pytest_wrapped_e.value) - assert expected_error_message == recieved_error_message, '' + \ - 'Expected error message {},'.format(expected_error_message) + \ - ' does not match generated {}'.format(recieved_error_message) + assert expected_error_message == recieved_error_message, ( + "" + + "Expected error message {},".format(expected_error_message) + + " does not match generated {}".format(recieved_error_message) + ) @pytest.mark.unittest def test_when_given_expected_arguments_then_object_is_created(self): # 1. Set up test data - time_dependent_data = 'arg1' - time_independent_data = 'arg2' - edge_data = 'arg3' - node_coordinates = 'arg4' - css_data = 'arg5' + time_dependent_data = "arg1" + time_independent_data = "arg2" + edge_data = "arg3" + node_coordinates = "arg4" + css_data = "arg5" arg_list = [ time_dependent_data, time_independent_data, edge_data, node_coordinates, - css_data] + css_data, + ] return_fm_model_data = None # 2. Run test try: return_fm_model_data = FmModelData(arg_list) except: - pytest.fail('No exception expected but was thrown') + pytest.fail("No exception expected but was thrown") # 4. Verify final expectations assert return_fm_model_data is not None assert return_fm_model_data.time_dependent_data == time_dependent_data - assert return_fm_model_data.time_independent_data \ - == time_independent_data + assert return_fm_model_data.time_independent_data == time_independent_data assert return_fm_model_data.edge_data == edge_data assert return_fm_model_data.node_coordinates == node_coordinates assert return_fm_model_data.css_data_list == [] @@ -103,11 +109,11 @@ def test_when_given_expected_arguments_then_object_is_created(self): @pytest.mark.unittest def test_when_given_data_dictionary_then_css_data_list_is_set(self): # 1. Set up test data - time_dependent_data = 'arg1' - time_independent_data = 'arg2' - edge_data = 'arg3' - node_coordinates = 'arg4' - dummy_key = 'dummyKey' + time_dependent_data = "arg1" + time_independent_data = "arg2" + edge_data = "arg3" + node_coordinates = "arg4" + dummy_key = "dummyKey" dummy_values = [0, 1] css_data_dict = { dummy_key: dummy_values, @@ -118,7 +124,8 @@ def test_when_given_data_dictionary_then_css_data_list_is_set(self): time_independent_data, edge_data, node_coordinates, - css_data_dict] + css_data_dict, + ] return_fm_model_data = None # 2. Set expectations @@ -128,7 +135,7 @@ def test_when_given_data_dictionary_then_css_data_list_is_set(self): try: return_fm_model_data = FmModelData(arg_list) except: - pytest.fail('No exception expected but was thrown') + pytest.fail("No exception expected but was thrown") # 4. Verify final expectations assert return_fm_model_data is not None @@ -137,12 +144,11 @@ def test_when_given_data_dictionary_then_css_data_list_is_set(self): class Test_get_ordered_css_list: - @pytest.mark.unittest def test_when_given_dictionary_then_returns_list(self): # 1. Set up test_data return_list = None - dummy_key = 'dummyKey' + dummy_key = "dummyKey" dummy_values = [0, 1] test_dict = { dummy_key: dummy_values, @@ -155,21 +161,22 @@ def test_when_given_dictionary_then_returns_list(self): try: return_list = FmModelData.get_ordered_css_list(test_dict) except: - pytest.fail('No exception expected but was thrown') + pytest.fail("No exception expected but was thrown") # 4. Verify final expectations assert return_list is not None - assert return_list == expected_list, '' + \ - 'Expected return value {},'.format(expected_list) + \ - ' but return {} instead.'.format(return_list) + assert return_list == expected_list, ( + "" + + "Expected return value {},".format(expected_list) + + " but return {} instead.".format(return_list) + ) @pytest.mark.unittest - @pytest.mark.parametrize('test_dict', [(''), (None), ({})]) - def test_when_given_unexpected_value_then_returns_empty_list( - self, test_dict): + @pytest.mark.parametrize("test_dict", [(""), (None), ({})]) + def test_when_given_unexpected_value_then_returns_empty_list(self, test_dict): # 1. Set up test_data return_list = None - dummy_key = 'dummyKey' + dummy_key = "dummyKey" dummy_values = [0, 1] # 2. Run test @@ -179,10 +186,12 @@ def test_when_given_unexpected_value_then_returns_empty_list( try: return_list = FmModelData.get_ordered_css_list(test_dict) except: - pytest.fail('No exception expected but was thrown') + pytest.fail("No exception expected but was thrown") # 4. Verify final expectations assert return_list is not None - assert return_list == expected_list, '' + \ - 'Expected return value {},'.format(expected_list) + \ - ' but return {} instead.'.format(return_list) + assert return_list == expected_list, ( + "" + + "Expected return value {},".format(expected_list) + + " but return {} instead.".format(return_list) + ) diff --git a/tests/test_acceptance.py b/tests/test_acceptance.py index 9f897a51..99d24397 100644 --- a/tests/test_acceptance.py +++ b/tests/test_acceptance.py @@ -1,3 +1,4 @@ +from pathlib import Path import unittest import pytest import sys @@ -6,7 +7,7 @@ import shutil import matplotlib.pyplot as plt -from tests.TestUtils import TestUtils +from tests.TestUtils import TestUtils, skipwhenexternalsmissing from fm2prof.Fm2ProfRunner import Fm2ProfRunner from fm2prof.IniFile import IniFile @@ -16,22 +17,23 @@ from fm2prof.utils import VisualiseOutput from tests.fm2prof_latex_report import Fm2ProfLatexReport from tests.CompareWaalModel import CompareWaalModel as CompareWaalModel -from tests.CompareIdealizedModel \ - import CompareIdealizedModel, CompareHelper +from tests.CompareIdealizedModel import CompareIdealizedModel, CompareHelper + + _root_output_dir = None # Test data to be used -_waal_case = 'case_08_waal' -_case01 = 'case_01_rectangle' -_case02 = 'case_02_compound' -_case03 = 'case_03_threestage' -_case04 = 'case_04_storage' -_case05 = 'case_05_dyke' -_case06 = 'case_06_plassen' -_case07 = 'case_07_triangular' -_case09 = 'case_09_region_polygon' -_case10 = 'case_10_section_polygon' +_waal_case = "case_08_waal" +_case01 = "case_01_rectangle" +_case02 = "case_02_compound" +_case03 = "case_03_threestage" +_case04 = "case_04_storage" +_case05 = "case_05_dyke" +_case06 = "case_06_plassen" +_case07 = "case_07_triangular" +_case09 = "case_09_region_polygon" +_case10 = "case_10_section_polygon" _test_scenarios_ids = [ _case01, @@ -43,7 +45,7 @@ _case07, _case09, _case10, - _waal_case + _waal_case, ] """ To use excluding markups the following command line can be used: @@ -56,69 +58,79 @@ _test_scenarios = [ pytest.param( _case01, - 'Data\\2DModelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DModelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case02, - 'Data\\2DModelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DModelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case03, - 'Data\\2DModelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DModelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case04, - 'Data\\2DmodelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DmodelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case05, - 'Data\\2DmodelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DmodelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case06, - 'Data\\2DmodelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DmodelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case07, - 'Data\\2DModelOutput\\FlowFM_map.nc', - 'Data\\cross_section_locations.xyz', - '', - ''), + "Data\\2DModelOutput\\FlowFM_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + ), pytest.param( _case09, - 'Data\\FM\\FlowFM_fm2prof_map.nc', - 'Data\\cross_section_locations.xyz', - 'Data\\regions_complex.geojson', - ''), + "Data\\FM\\FlowFM_fm2prof_map.nc", + "Data\\cross_section_locations.xyz", + "Data\\regions_complex.geojson", + "", + ), pytest.param( _case10, - 'Data\\FM\\FlowFM_fm2prof_map.nc', - 'Data\\cross_section_locations.xyz', - '', - 'Data\\sections_complex.geojson'), + "Data\\FM\\FlowFM_fm2prof_map.nc", + "Data\\cross_section_locations.xyz", + "", + "Data\\sections_complex.geojson", + ), pytest.param( _waal_case, - 'Data\\FM\\FlowFM_fm2prof_map.nc', - 'Data\\cross_section_locations.xyz', - '', - '', - marks=pytest.mark.slow) + "Data\\FM\\FlowFM_fm2prof_map.nc", + "Data\\cross_section_locations.xyz", + "", + "", + marks=pytest.mark.slow, + ), ] -_run_with_files_dir_name = 'RunWithFiles_Output' -_base_output_dir_name = 'Output' +_run_with_files_dir_name = "RunWithFiles_Output" +_base_output_dir_name = "Output" def get_valid_inifile_input_parameters(): @@ -134,35 +146,34 @@ def get_valid_inifile_input_parameters(): "sdstorage": 1, "frictionweighing": 0, "sectionsmethod": 0, - "exportmapfiles": 0 + "exportmapfiles": 0, } -def _get_base_output_dir(): +def _get_base_output_dir() -> Path: """ Sets up the necessary data for MainMethodTest """ output_dir = _create_test_root_output_dir(_run_with_files_dir_name) # Create it if it does not exist - if not os.path.exists(output_dir): - os.mkdir(output_dir) + if not output_dir.is_dir(): + output_dir.mkdir() return output_dir -def _create_test_root_output_dir(dirName=None): +def _create_test_root_output_dir(dirName=None) -> Path: """ Create test output directory so it's easier to collect output afterwards. """ - _root_output_dir = os.path.join( - os.path.dirname(__file__), _base_output_dir_name) - if not os.path.exists(_root_output_dir): - os.mkdir(_root_output_dir) + _root_output_dir = Path(__file__).parent / _base_output_dir_name + if not _root_output_dir.is_dir(): + _root_output_dir.mkdir() if dirName is not None: - subOutputDir = os.path.join(_root_output_dir, dirName) - if not os.path.exists(subOutputDir): - os.mkdir(subOutputDir) + subOutputDir: Path = _root_output_dir / dirName + if not subOutputDir.is_dir(): + subOutputDir.mkdir() return subOutputDir return _root_output_dir @@ -179,71 +190,59 @@ def _check_and_create_test_case_output_dir(base_output_dir, caseName): if os.path.exists(output_directory) and os.listdir(output_directory): shutil.rmtree(output_directory) - #if not os.path.exists(output_directory): + # if not os.path.exists(output_directory): # os.mkdir(output_directory) return output_directory - -def _get_test_case_output_dir(case_name: str): +def _get_test_case_output_dir(case_name: str) -> Path: base_output_dir = _get_base_output_dir() - output_directory = os.path.join(base_output_dir, case_name, 'CaseName01') + output_directory = base_output_dir / case_name / "CaseName01" return output_directory class ARCHIVED_Test_Generate_Reports: _latex_report_path = None - @pytest.fixture(scope='class') + @pytest.fixture(scope="class") def report_data(self): - """Prepares the class properties to be used in the tests. - """ - test_data_dir = os.path.join( - _base_output_dir_name, _run_with_files_dir_name) + """Prepares the class properties to be used in the tests.""" + test_data_dir = os.path.join(_base_output_dir_name, _run_with_files_dir_name) test_data_dir_path = TestUtils.get_test_dir(test_data_dir) report_content = Fm2ProfLatexReport( - scenarios_ids=_test_scenarios_ids, - data_dir=test_data_dir_path) + scenarios_ids=_test_scenarios_ids, data_dir=test_data_dir_path + ) yield test_data_dir_path, report_content @pytest.mark.generate_test_report - def test_when_output_generated_then_generate_latex_source_file( - self, report_data): + def test_when_output_generated_then_generate_latex_source_file(self, report_data): - assert report_data is not None, '' + \ - 'No test data available.' + assert report_data is not None, "" + "No test data available." # We save the generated report in the test directory as well. test_data_dir, report_content = report_data output_dir = test_data_dir try: report = LatexReport(report_content) - latex_report_path = \ - report.generate_latex_report( - target_dir=output_dir) + latex_report_path = report.generate_latex_report(target_dir=output_dir) assert os.path.exists(latex_report_path) except Exception as e_info: - err_mssg = 'Error while generating latex source ' + \ - '{}'.format(str(e_info)) + err_mssg = "Error while generating latex source " + "{}".format(str(e_info)) pytest.fail(err_mssg) @pytest.mark.generate_test_report def test_when_latex_source_generated_then_compile_to_pdf(self): try: - LatexReport.convert_to_pdf( - 'tests/Output/RunWithFiles_Output/latex_report/') + LatexReport.convert_to_pdf("tests/Output/RunWithFiles_Output/latex_report/") except Exception as e_info: - err_mssg = 'Error while compiling latex report ' + \ - '{}'.format(str(e_info)) + err_mssg = "Error while compiling latex report " + "{}".format(str(e_info)) pytest.fail(err_mssg) @pytest.mark.generate_test_report - def test_when_output_generated_then_generate_html_report( - self, report_data): + def test_when_output_generated_then_generate_html_report(self, report_data): - assert report_data is not None, '' + \ - 'No test data available.' + assert report_data is not None, "" + "No test data available." # We save the generated report in the test directory as well. test_data_dir, report_content = report_data @@ -252,27 +251,32 @@ def test_when_output_generated_then_generate_html_report( report = HtmlReport(report_content) report.generate_html_report(target_dir=output_dir) except Exception as e_info: - err_mssg = 'Error while generating python report ' + \ - '{}'.format(str(e_info)) + err_mssg = "Error while generating python report " + "{}".format( + str(e_info) + ) pytest.fail(err_mssg) class Test_Run_Testcases: - @pytest.mark.acceptance @pytest.mark.parametrize( ("case_name", "map_file", "css_file", "region_file", "section_file"), - _test_scenarios[:-3], ids=_test_scenarios_ids[:-3]) + _test_scenarios[:-3], + ids=_test_scenarios_ids[:-3], + ) + @skipwhenexternalsmissing def test_when_given_input_data_then_output_is_generated( - self, case_name, map_file, css_file, region_file, section_file): + self, case_name, map_file, css_file, region_file, section_file + ): # 1. Set up test data. iniFilePath = None iniFile = IniFile(iniFilePath) test_data_dir = TestUtils.get_external_test_data_dir(case_name) base_output_dir = _get_base_output_dir() - iniFile._set_output_directory_no_validation(_check_and_create_test_case_output_dir( - base_output_dir, case_name)) + iniFile._set_output_directory_no_validation( + _check_and_create_test_case_output_dir(base_output_dir, case_name) + ) if region_file: region_file_path = os.path.join(test_data_dir, region_file) @@ -284,48 +288,52 @@ def test_when_given_input_data_then_output_is_generated( else: section_file_path = section_file - #iniFile.set_parameter('ExportMapFiles', True) - iniFile.set_parameter('skipmaps', 6) - iniFile.set_input_file('2dmapoutput', os.path.join(test_data_dir, map_file)) - iniFile.set_input_file('crosssectionlocationfile', os.path.join(test_data_dir, css_file)) - iniFile.set_input_file('regionpolygonfile', region_file_path) - iniFile.set_input_file('sectionpolygonfile', section_file_path) + # iniFile.set_parameter('ExportMapFiles', True) + iniFile.set_parameter("skipmaps", 6) + iniFile.set_input_file("2dmapoutput", os.path.join(test_data_dir, map_file)) + iniFile.set_input_file( + "crosssectionlocationfile", os.path.join(test_data_dir, css_file) + ) + iniFile.set_input_file("regionpolygonfile", region_file_path) + iniFile.set_input_file("sectionpolygonfile", section_file_path) # Create the runner and set the saving figures variable to true buf = io.StringIO(iniFile.print_configuration()) runner = Fm2ProfRunner(buf) # 2. Verify precondition (no output generated) - assert (os.path.exists(iniFile.get_output_directory()) and - not len(os.listdir(iniFile.get_output_directory())) > 1) + assert ( + os.path.exists(iniFile.get_output_directory()) + and not len(os.listdir(iniFile.get_output_directory())) > 1 + ) # 3. Run file: runner.run() # 4. Verify there is output generated: - assert os.listdir(iniFile.get_output_directory()), '' + \ - 'There is no output generated for {0}'.format(case_name) + assert os.listdir( + iniFile.get_output_directory() + ), "" + "There is no output generated for {0}".format(case_name) class ARCHIVED_Test_Main_Run_IniFile: - def __run_main_with_arguments(self, ini_file): pythonCall = "fm2prof\\main.py -i {0}".format(ini_file) os.system("python {0}".format(pythonCall)) def __create_test_ini_file(self, root_dir, case_name, map_file, css_file): - output_dir = os.path.join(root_dir, 'OutputFiles') + output_dir = os.path.join(root_dir, "OutputFiles") if not os.path.exists(output_dir): os.makedirs(output_dir) - input_files_key = 'InputFiles' - input_parameters_key = 'InputParameters' - output_directory_key = 'OutputDirectory' + input_files_key = "InputFiles" + input_parameters_key = "InputParameters" + output_directory_key = "OutputDirectory" - test_data_dir = TestUtils.get_local_test_data_dir('main_test_data') + test_data_dir = TestUtils.get_local_test_data_dir("main_test_data") input_file_paths = { "fm_netcdfile": os.path.join(test_data_dir, map_file), - 'crosssectionlocationfile': os.path.join(test_data_dir, css_file), + "crosssectionlocationfile": os.path.join(test_data_dir, css_file), } input_parameters = { "number_of_css_points": 20, @@ -340,25 +348,25 @@ def __create_test_ini_file(self, root_dir, case_name, map_file, css_file): "frictionweighing": 0, "sectionsmethod": 0, "sdoptimisationmethod": 0, - "exportmapfiles": 0 + "exportmapfiles": 0, } # write file - file_path = os.path.join(root_dir, '{}_ini_file.ini'.format(case_name)) - f = open(file_path, 'w+') + file_path = os.path.join(root_dir, "{}_ini_file.ini".format(case_name)) + f = open(file_path, "w+") - f.writelines('[{}]\r\n'.format(input_files_key)) + f.writelines("[{}]\r\n".format(input_files_key)) for key, value in input_file_paths.items(): - f.writelines('{} = {}\r\n'.format(key, value)) - f.writelines('\r\n') - f.writelines('[{}]\r\n'.format(input_parameters_key)) + f.writelines("{} = {}\r\n".format(key, value)) + f.writelines("\r\n") + f.writelines("[{}]\r\n".format(input_parameters_key)) for key, value in input_parameters.items(): - f.writelines('{} = {}\r\n'.format(key, value)) + f.writelines("{} = {}\r\n".format(key, value)) - f.writelines('\r\n') - f.writelines('[{}]\r\n'.format(output_directory_key)) - f.writelines('OutputDir = {}\r\n'.format(output_dir)) - f.writelines('CaseName = {}\r\n'.format(case_name)) + f.writelines("\r\n") + f.writelines("[{}]\r\n".format(output_directory_key)) + f.writelines("OutputDir = {}\r\n".format(output_dir)) + f.writelines("CaseName = {}\r\n".format(case_name)) f.close() return (file_path, output_dir) @@ -376,21 +384,22 @@ def _get_custom_dir(self): @pytest.mark.systemtest def test_when_given_inifile_then_output_is_generated(self): # 1. Set up test data. - case_name = 'main_case' - map_file = 'fm_map.nc' - css_file = 'fm_css.xyz' + case_name = "main_case" + map_file = "fm_map.nc" + css_file = "fm_css.xyz" root_output_dir = self._get_custom_dir() (ini_file_path, output_dir) = self.__create_test_ini_file( - root_output_dir, case_name, map_file, css_file) + root_output_dir, case_name, map_file, css_file + ) # 2. Verify precondition (no output generated) assert os.path.exists(ini_file_path) expected_files = [ - 'CrossSectionDefinitions.ini', - 'CrossSectionLocations.ini', - 'geometry.csv', - 'roughness.csv', - 'volumes.csv', + "CrossSectionDefinitions.ini", + "CrossSectionLocations.ini", + "geometry.csv", + "roughness.csv", + "volumes.csv", ] # 3. Run file: @@ -399,24 +408,22 @@ def test_when_given_inifile_then_output_is_generated(self): except Exception as e_error: if os.path.exists(root_output_dir): shutil.rmtree(root_output_dir) - pytest.fail( - 'No exception expected but was thrown {}.'.format( - str(e_error))) + pytest.fail("No exception expected but was thrown {}.".format(str(e_error))) # 4. Verify there is output generated: - output_files = os.path.join(output_dir, '{}01'.format(case_name)) + output_files = os.path.join(output_dir, "{}01".format(case_name)) generated_files = os.listdir(output_files) if os.path.exists(root_output_dir): shutil.rmtree(root_output_dir) - assert generated_files, '' + \ - 'There is no output generated for {0}'.format(case_name) + assert generated_files, "" + "There is no output generated for {0}".format( + case_name + ) for expected_file in expected_files: assert expected_file in generated_files class ARCHIVED_Test_Compare_Waal_Model: - """Requires fm2prof output generated for waal_case - """ + """Requires fm2prof output generated for waal_case""" @pytest.mark.slow @pytest.mark.acceptance @@ -424,8 +431,8 @@ class ARCHIVED_Test_Compare_Waal_Model: def test_when_fm2prof_output_then_use_it_for_sobek_model_input(self): # 1. Set up test data waal_test_folder = TestUtils.get_external_test_data_dir(_waal_case) - sobek_dir = os.path.join(waal_test_folder, 'Model_SOBEK') - fm_dir = os.path.join(waal_test_folder, 'Model_FM') + sobek_dir = os.path.join(waal_test_folder, "Model_SOBEK") + fm_dir = os.path.join(waal_test_folder, "Model_FM") fm2prof_dir = _get_test_case_output_dir(_waal_case) result_figures = [] @@ -437,22 +444,24 @@ def test_when_fm2prof_output_then_use_it_for_sobek_model_input(self): case_name=_waal_case, results_dir=fm2prof_dir, sobek_dir=sobek_dir, - fm_dir=fm_dir) + fm_dir=fm_dir, + ) except Exception as e_info: pytest.fail( - 'No exception expected but was thrown ' + - '{}.'.format(str(e_info))) + "No exception expected but was thrown " + "{}.".format(str(e_info)) + ) # 3. Verify final expectations assert output_1d - assert os.path.exists(output_1d), '' + \ - 'No output found at {}.'.format(output_1d) + assert os.path.exists(output_1d), "" + "No output found at {}.".format( + output_1d + ) def test_when_sobek_output_exist_then_create_figures(self): # 1. Set up test data waal_test_folder = TestUtils.get_external_test_data_dir(_waal_case) - sobek_dir = os.path.join(waal_test_folder, 'Model_SOBEK') - fm_dir = os.path.join(waal_test_folder, 'Model_FM') + sobek_dir = os.path.join(waal_test_folder, "Model_SOBEK") + fm_dir = os.path.join(waal_test_folder, "Model_FM") fm2prof_dir = _get_test_case_output_dir(_waal_case) result_figures = [] @@ -464,24 +473,26 @@ def test_when_sobek_output_exist_then_create_figures(self): case_name=_waal_case, results_dir=fm2prof_dir, sobek_dir=sobek_dir, - fm_dir=fm_dir) + fm_dir=fm_dir, + ) except Exception as e_info: pytest.fail( - 'No exception expected but was thrown ' + - '{}.'.format(str(e_info))) + "No exception expected but was thrown " + "{}.".format(str(e_info)) + ) # 3. Verify final expectations assert result_figures for fig_path in result_figures: - assert os.path.exists(fig_path), '' + \ - 'Figure not found at path {}.'.format(fig_path) + assert os.path.exists(fig_path), "" + "Figure not found at path {}.".format( + fig_path + ) @pytest.mark.acceptance @pytest.mark.requires_output @pytest.mark.parametrize( - ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids) - def test_when_output_exists_then_compare_waal_model_volume( - self, case_name: str): + ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids + ) + def test_when_output_exists_then_compare_waal_model_volume(self, case_name: str): if case_name != _waal_case: # print('This case is tested on another fixture.') return @@ -489,74 +500,78 @@ def test_when_output_exists_then_compare_waal_model_volume( fm2prof_dir = _get_test_case_output_dir(case_name) # Data from the above tests is saved directly in fm2prof_dir, # not in case_name/output - fm2prof_fig_dir = os.path.join(fm2prof_dir, 'Figures') + fm2prof_fig_dir = os.path.join(fm2prof_dir, "Figures") - volume_file_name = 'volumes.csv' + volume_file_name = "volumes.csv" input_volume_file = os.path.join(fm2prof_dir, volume_file_name) # 2. Verify / create necessary folders and directories - assert os.path.exists(input_volume_file), '' + \ - 'Input file {} could not be found'.format(input_volume_file) + assert os.path.exists( + input_volume_file + ), "" + "Input file {} could not be found".format(input_volume_file) if not os.path.exists(fm2prof_fig_dir): os.makedirs(fm2prof_fig_dir) # 3. Run try: waal_comparer = CompareWaalModel() - waal_comparer._compare_volume( - case_name, input_volume_file, fm2prof_fig_dir) + waal_comparer._compare_volume(case_name, input_volume_file, fm2prof_fig_dir) except Exception as e_info: pytest.fail( - 'No exception expected but was thrown ' + - '{}.'.format(str(e_info))) + "No exception expected but was thrown " + "{}.".format(str(e_info)) + ) # 4. Final expectation - assert os.listdir(fm2prof_fig_dir), '' + \ - 'There is no volume output generated for {0}'.format(case_name) + assert os.listdir( + fm2prof_fig_dir + ), "" + "There is no volume output generated for {0}".format(case_name) class Test_Compare_Idealized_Model: # region of helpers __case_01_tzw = [ [0, 150, 0], - [0, 150+1e-5, 0+1e-5], + [0, 150 + 1e-5, 0 + 1e-5], + [3000, 150, -1], [3000, 150, -1], - [3000, 150, -1]] + ] __case_02_tzw = [ [0, 0, -2], - [0, 50-1e-2, -2], + [0, 50 - 1e-2, -2], [0, 50, 0], [0, 150, 1e-2], [3000, 0, -3], - [3000, 50-1e-2, -3], + [3000, 50 - 1e-2, -3], [3000, 50, -1], - [3000, 150, -1+1e-2]] + [3000, 150, -1 + 1e-2], + ] __case_03_tzw = [ [0, 0, -2], - [0, 50-1e-2, -2], + [0, 50 - 1e-2, -2], [0, 50, 0], - [0, 100-1e-2, 0], + [0, 100 - 1e-2, 0], [0, 100, 0.5], [0, 150, 0.5], [3000, 0, -3], - [3000, 50-1e-2, -3], + [3000, 50 - 1e-2, -3], [3000, 50, -1], - [3000, 100-1e-2, -1], + [3000, 100 - 1e-2, -1], [3000, 100, -0.5], [3000, 150, -0.5], - ] + ] __case_05_tzw = [ [0, 0, -2], - [0, 50-1e-2, -2], + [0, 50 - 1e-2, -2], [0, 50, 1], - [0, 150, 1+1e-2], + [0, 150, 1 + 1e-2], [3000, 0, -3], - [3000, 50-1e-2, -3], + [3000, 50 - 1e-2, -3], [3000, 50, 0], - [3000, 150, 0+1e-2]] + [3000, 150, 0 + 1e-2], + ] __case_07_tzw = [ [0, 00, -2], @@ -566,7 +581,8 @@ class Test_Compare_Idealized_Model: [10000, 00, -4], [10000, 200, -4], [10000, 200.000001, -2], - [10000, 500, -2]] + [10000, 500, -2], + ] __case_tzw_dict = { _case01: __case_01_tzw, @@ -584,9 +600,9 @@ class Test_Compare_Idealized_Model: @pytest.mark.acceptance @pytest.mark.requires_output @pytest.mark.parametrize( - ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids) - def ARCHIVED_test_compare_generic_model_geometry( - self, case_name: str): + ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids + ) + def ARCHIVED_test_compare_generic_model_geometry(self, case_name: str): if case_name == _waal_case: # print('This case is tested on another fixture.') return @@ -594,90 +610,95 @@ def ARCHIVED_test_compare_generic_model_geometry( fm2prof_dir = _get_test_case_output_dir(case_name) # Data from the above tests is saved directly in fm2prof_dir, # not in case_name/output - fm2prof_fig_dir_head = os.path.join(fm2prof_dir, 'Figures') - fm2prof_fig_dir = os.path.join(fm2prof_fig_dir_head, 'Geometry') + fm2prof_fig_dir_head = os.path.join(fm2prof_dir, "Figures") + fm2prof_fig_dir = os.path.join(fm2prof_fig_dir_head, "Geometry") - geometry_file_name = 'geometry.csv' + geometry_file_name = "geometry.csv" input_geometry_file = os.path.join(fm2prof_dir, geometry_file_name) # 2. Verify / create necessary folders and directories - assert os.path.exists(input_geometry_file), '' + \ - 'Input file {} could not be found'.format(input_geometry_file) + assert os.path.exists( + input_geometry_file + ), "" + "Input file {} could not be found".format(input_geometry_file) if os.path.exists(fm2prof_fig_dir): shutil.rmtree(fm2prof_fig_dir) os.makedirs(fm2prof_fig_dir) - #os.makedirs(fm2prof_fig_dir) + # os.makedirs(fm2prof_fig_dir) # 3. Run tzw_values = self.__case_tzw_dict.get(case_name) if not tzw_values or tzw_values is None: - pytest.fail( - 'Test failed, no values retrieved for {}'.format(case_name)) + pytest.fail("Test failed, no values retrieved for {}".format(case_name)) try: generic_comparer = CompareIdealizedModel() generic_comparer._compare_css( - case_name, tzw_values, - input_geometry_file, fm2prof_fig_dir) + case_name, tzw_values, input_geometry_file, fm2prof_fig_dir + ) except Exception as e_info: pytest.fail( - 'No exception expected but was thrown ' + - '{}.'.format(str(e_info))) + "No exception expected but was thrown " + "{}.".format(str(e_info)) + ) # 4. Final expectation - assert os.listdir(fm2prof_fig_dir), '' + \ - 'There is no geometry output generated for {0}'.format(case_name) + assert os.listdir( + fm2prof_fig_dir + ), "" + "There is no geometry output generated for {0}".format(case_name) # region for tests @pytest.mark.acceptance @pytest.mark.requires_output @pytest.mark.parametrize( - ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids) + ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids + ) def ARCHIVED_test_when_output_exists_then_compare_generic_model_roughness( - self, case_name: str): + self, case_name: str + ): if case_name == _waal_case: # print('This case is tested on another fixture.') return # 1. Get all necessary output / input directories fm2prof_dir = _get_test_case_output_dir(case_name) - fm2prof_fig_dir = os.path.join(fm2prof_dir, 'Figures', 'Roughness') + fm2prof_fig_dir = os.path.join(fm2prof_dir, "Figures", "Roughness") - roughness_file_name = 'roughness.csv' - input_roughness_file = os.path.join( - fm2prof_dir, roughness_file_name) + roughness_file_name = "roughness.csv" + input_roughness_file = os.path.join(fm2prof_dir, roughness_file_name) # 2. Verify / create necessary folders and directories - assert os.path.exists(input_roughness_file), '' + \ - 'Input file {} could not be found'.format(input_roughness_file) + assert os.path.exists( + input_roughness_file + ), "" + "Input file {} could not be found".format(input_roughness_file) if not os.path.exists(fm2prof_fig_dir): os.makedirs(fm2prof_fig_dir) # 3. Run tzw_values = self.__case_tzw_dict.get(case_name) if not tzw_values or tzw_values is None: - pytest.fail( - 'Test failed, no values retrieved for {}'.format(case_name)) + pytest.fail("Test failed, no values retrieved for {}".format(case_name)) try: generic_comparer = CompareIdealizedModel() generic_comparer._compare_roughness( - case_name, tzw_values, - input_roughness_file, fm2prof_fig_dir) + case_name, tzw_values, input_roughness_file, fm2prof_fig_dir + ) except Exception as e_info: pytest.fail( - 'No exception expected but was thrown ' + - '{}.'.format(str(e_info))) + "No exception expected but was thrown " + "{}.".format(str(e_info)) + ) - assert os.listdir(fm2prof_fig_dir), '' + \ - 'There is no roughness output generated for {0}'.format(case_name) + assert os.listdir( + fm2prof_fig_dir + ), "" + "There is no roughness output generated for {0}".format(case_name) @pytest.mark.acceptance @pytest.mark.requires_output @pytest.mark.parametrize( - ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids) + ("case_name"), _test_scenarios_ids, ids=_test_scenarios_ids + ) def ARCHIVED_test_when_output_exists_then_compare_generic_model_volume( - self, case_name: str): + self, case_name: str + ): if case_name == _waal_case: # print('This case is tested on another fixture.') return @@ -685,14 +706,15 @@ def ARCHIVED_test_when_output_exists_then_compare_generic_model_volume( fm2prof_dir = _get_test_case_output_dir(case_name) # Data from the above tests is saved directly in fm2prof_dir, # not in case_name/output - fm2prof_fig_dir = os.path.join(fm2prof_dir, 'Figures', 'Volume') + fm2prof_fig_dir = os.path.join(fm2prof_dir, "Figures", "Volume") - volume_file_name = 'volumes.csv' + volume_file_name = "volumes.csv" input_volume_file = os.path.join(fm2prof_dir, volume_file_name) # 2. Verify / create necessary folders and directories - assert os.path.exists(input_volume_file), '' + \ - 'Input file {} could not be found'.format(input_volume_file) + assert os.path.exists( + input_volume_file + ), "" + "Input file {} could not be found".format(input_volume_file) if not os.path.exists(fm2prof_fig_dir): os.makedirs(fm2prof_fig_dir) @@ -700,74 +722,76 @@ def ARCHIVED_test_when_output_exists_then_compare_generic_model_volume( try: generic_comparer = CompareIdealizedModel() generic_comparer._compare_volume( - case_name, input_volume_file, fm2prof_fig_dir) + case_name, input_volume_file, fm2prof_fig_dir + ) except Exception as e_info: pytest.fail( - 'No exception expected but was thrown ' + - '{}.'.format(str(e_info))) + "No exception expected but was thrown " + "{}.".format(str(e_info)) + ) # 4. Final expectation - assert os.listdir(fm2prof_fig_dir), '' + \ - 'There is no volume output generated for {0}'.format(case_name) + assert os.listdir( + fm2prof_fig_dir + ), "" + "There is no volume output generated for {0}".format(case_name) @pytest.mark.acceptance - @pytest.mark.requires_output @pytest.mark.parametrize( - ("case_name"), _test_scenarios_ids[:-3], ids=_test_scenarios_ids[:-3]) + ("case_name"), _test_scenarios_ids[:-3], ids=_test_scenarios_ids[:-3] + ) + @skipwhenexternalsmissing def test_when_output_exists_then_compare_with_reference(self, case_name: str): """ This test is supposed to supercede the others """ # 1. Get all necessary output / input directories reference_geometry = self.__case_tzw_dict.get(case_name) - reference_roughness = None#CompareHelper.get_analytical_roughness_for_case(case_name) + reference_roughness = ( + None # CompareHelper.get_analytical_roughness_for_case(case_name) + ) reference__volume = [] fm2prof_dir = _get_test_case_output_dir(case_name) # 2. Verify / create necessary folders and directories # 3. Run - + visualiser = VisualiseOutput(fm2prof_dir) frictionhelper = CompareHelper.get_analytical_roughness_for_case(case_name) for css in visualiser.cross_sections(): ref = CompareHelper.interpolate_to_css(css, reference_geometry) ref = CompareHelper.convert_ZW_to_symmetric_css(ref) - + ref_friction = frictionhelper(css) - visualiser.make_figure(css, reference_geometry=ref, reference_roughness=ref_friction) + visualiser.make_figure( + css, reference_geometry=ref, reference_roughness=ref_friction + ) class ARCHIVED_Test_WaalPerformance: - @pytest.mark.acceptance @pytest.mark.workinprogress def test_when_waal_case_then_performance_is_slow(self): # 1. Set up test model. - case_name = 'case_08_waal' - local_test_dir = TestUtils.get_local_test_data_dir('performance_waal') - ini_file = os.path.join(local_test_dir, 'fm2prof_08.ini') - json_file = \ - os.path.join(local_test_dir, 'SectionPolygonDissolved.json') + case_name = "case_08_waal" + local_test_dir = TestUtils.get_local_test_data_dir("performance_waal") + ini_file = os.path.join(local_test_dir, "fm2prof_08.ini") + json_file = os.path.join(local_test_dir, "SectionPolygonDissolved.json") external_test_dir = TestUtils.get_external_test_data_dir(case_name) - map_file = os.path.join( - external_test_dir, - 'Data\\FM\\FlowFM_fm2prof_map.nc') - css_file = os.path.join( - external_test_dir, - 'Data\\cross_section_locations.xyz') + map_file = os.path.join(external_test_dir, "Data\\FM\\FlowFM_fm2prof_map.nc") + css_file = os.path.join(external_test_dir, "Data\\cross_section_locations.xyz") # 1.1. Create ini file. ini_file_path = None test_ini_file = IniFile(ini_file_path) base_output_dir = _get_base_output_dir() - test_ini_file._output_dir = \ - _check_and_create_test_case_output_dir(base_output_dir, case_name) + test_ini_file._output_dir = _check_and_create_test_case_output_dir( + base_output_dir, case_name + ) test_ini_file._input_file_paths = { - 'fm_netcdfile': map_file, - 'crosssectionlocationfile': css_file, - 'regionpolygonfile': None, - 'sectionpolygonfile': json_file + "fm_netcdfile": map_file, + "crosssectionlocationfile": css_file, + "regionpolygonfile": None, + "sectionpolygonfile": json_file, } test_ini_file._input_parameters = { "number_of_css_points": 20, @@ -782,15 +806,14 @@ def test_when_waal_case_then_performance_is_slow(self): "frictionweighing": 0, "sectionsmethod": 1, "sdoptimisationmethod": 0, - "exportmapfiles": 1 + "exportmapfiles": 1, } # 2. Verify initial expectations. - assert os.path.exists(ini_file), 'Ini (test) file was not found.' - assert os.path.exists(json_file), 'Json (test) file was not found.' - assert os.path.exists(map_file), 'Map (test) file was not found.' - assert os.path.exists(css_file), '' + \ - 'CrossSection (test) file was not found' + assert os.path.exists(ini_file), "Ini (test) file was not found." + assert os.path.exists(json_file), "Json (test) file was not found." + assert os.path.exists(map_file), "Map (test) file was not found." + assert os.path.exists(css_file), "" + "CrossSection (test) file was not found" # 3. Run test. try: @@ -799,9 +822,7 @@ def test_when_waal_case_then_performance_is_slow(self): except Exception as e_error: # if os.path.exists(root_output_dir): # shutil.rmtree(root_output_dir) - pytest.fail( - 'No exception expected but was thrown {}.'.format( - str(e_error))) + pytest.fail("No exception expected but was thrown {}.".format(str(e_error))) # 4. Verify final expectations. pass @@ -810,7 +831,7 @@ def test_dummy_timing(self): import timeit def f(): - y = next((i for i in range(100000) if i == 1000), '-10') + y = next((i for i in range(100000) if i == 1000), "-10") print(y) def fs(): @@ -822,13 +843,14 @@ def fs(): assert f_res < fs_res def merge_names(self, a, b): - val = '{} & {}'.format(a, b) + val = "{} & {}".format(a, b) return val def test_dummy_mp(self): from itertools import product import multiprocessing - names = ['Brown', 'Wilson', 'Bartlett', 'Rivera', 'Molloy', 'Opie'] + + names = ["Brown", "Wilson", "Bartlett", "Rivera", "Molloy", "Opie"] with multiprocessing.Pool(processes=3) as pool: results = pool.starmap(self.merge_names, product(names, repeat=2)) assert results is not None diff --git a/tests/test_data/IniFile/fm2prof.ini b/tests/test_data/IniFile/fm2prof.ini new file mode 100644 index 00000000..509ac837 --- /dev/null +++ b/tests/test_data/IniFile/fm2prof.ini @@ -0,0 +1,22 @@ +[InputFiles] +FM_netCDFile = tests/external_test_data/case_08_waal/Data/FM/FlowFM_fm2prof_map.nc # Output file from FM2D model (.net file) +CrossSectionLocationFile = tests/external_test_data/case_08_waal/Data/cross_section_locations.xyz # .csv or .txt file that contains four columns: X_coordinate,Y_coordinate,CrossSectionName,Length. +RegionPolygonFile = tests/external_test_data/AreaPolygons/Simple # User defined polygons in json format in the directory; all json files in this directory are used; if not specified, FM2PROF uses the default +SectionPolygonFile = # Fraction of section 1-4 in each polygon + +[InputParameters] +number_of_css_points = 20 # INT Number of points which are used to generate cross-sections (default = 20) +transitionheight_sd = 0.25 # FLOAT Transition height at the summer dike (m) (default = 0.5) +velocity_threshold = 0.01 # FLOAT Absolute velocity threshold in m/s +relative_threshold = 0.03 # FLOAT Relative velocity threshold (percent of mean flow velocity; 0-1) +min_depth_storage = 0.02 # FLOAT Minimum depth (m) for storage identification (default = 0.02) +plassen_timesteps = 10 # INT Number of timesteps that are used for identifying lakes (default=10) +storagemethod_wli = 1 # INT Add storage to water level independent cross-section section (1 or 0) +bedlevelcriterium = 0.1 # FLOAT Ignore the lowest percentage of bed level points (?) +SDstorage = 1 # INT Summer dike option on/off (1 or 0) +Frictionweighing = 0 # INT Weighted average for roughness calculation (1) or the orginary arithmetric mean (0) +sectionsmethod = 1 # INT Define cross-section sections with user-defined polygon (description) + +[OutputDirectory] +OutputDir = tmp # DIR Output files are saved in OutputDir/CaseName; if not specified, subdirectory is created in the current directory +CaseName = # STR Subdirectory name under OutputDir (no space); if not specified, "CaseXX" (01, 02..) are used \ No newline at end of file diff --git a/tests/test_data/IniFile/invalid_ini_file.ini b/tests/test_data/IniFile/invalid_ini_file.ini new file mode 100644 index 00000000..d14aec77 --- /dev/null +++ b/tests/test_data/IniFile/invalid_ini_file.ini @@ -0,0 +1,8 @@ +FM_netCDFile = +CrossSectionLocationFile +gebiedsvakken_dir = # User defined polygon; if not specified, FM2PROF uses the default +SectionFractionFile = # Fraction of section 1-4 in each polygon + +[InputParameters] +number_of_css_points = 20 # INT Number of points which are used to generate cross-sections (default = 20) +transitionheight_sd = 0.25 # FLOAT Transition height at the summer dike (m) (default = 0.5) \ No newline at end of file diff --git a/tests/test_data/IniFile/valid_dummy_inifile.ini b/tests/test_data/IniFile/valid_dummy_inifile.ini new file mode 100644 index 00000000..658c904d --- /dev/null +++ b/tests/test_data/IniFile/valid_dummy_inifile.ini @@ -0,0 +1,10 @@ +[section_zero] +Option_ZERO_Zero = string # Output file from FM2D model (.net file) +Option_Zero_One = 4.2 # .csv or .txt file that contains four columns: X_coordinate,Y_coordinate,CrossSectionName,Length. + +[section_one] +Option_One_Zero = 42 # INT Number of points which are used to generate cross-sections (default = 20) +Option_One_Two = string + +[section_two] +# no options \ No newline at end of file diff --git a/tests/test_data/IniFile/valid_ini_file.ini b/tests/test_data/IniFile/valid_ini_file.ini new file mode 100644 index 00000000..d242a9d9 --- /dev/null +++ b/tests/test_data/IniFile/valid_ini_file.ini @@ -0,0 +1,28 @@ +[input] +2DMapOutput = dummy.nc# Output file from FM2D model (.net file) +CrossSectionLocationFile = dummy.xyz# .csv or .txt file (, as delimiter) that contains four columns: X_coordinate,Y_coordinate,BranchName,Length,Chainage. +RegionPolygonFile = # User defined polygons in json format +SectionPolygonFile = # User defined polygons in json format + +[parameters] +CaseName = # Subdirectory name under OutputDir (no space); if not specified, 'CaseXX' (01, 02..) are used +MaximumPointsInProfile = 20 # Number of points which are used to generate cross-sections (value = 20) +AbsoluteVelocityThreshold = 0.05 # Absolute velocity threshold in m/s. Used to determine storage +RelativeVelocityThreshold = 0.03 # Relative velocity threshold (percent of mean flow velocity; 0-1). Used to determine storage +MinimumDepthThreshold = 0.02 # Minimum depth (m) for storage identification +BedlevelCriterium = 0.05 # Ignore the lowest percentage of bed level points +LakeTimesteps = 10 # Number of timesteps that are used for identifying lakes (value=10) +ExtrapolateStorage = True # Add storage to water level independent cross-section section +SDCorrection = True # Use summerdike volume correction +SDFloodplainBase = 0.5 # minimum distance between floodplain base level and crest level in meters +SDTransitionHeight = 0.5 # Transition height at the summer dike (m) +SDOptimisationMethod = 0 # [0] Optimise on Total volume, [1] optimise on flow volume, [2] optimise on both +FrictionWeighingMethod = 0 # Options. [0] arithmetric mean, [1] Weighted average +ExportMapFiles = False # Export detailed map output. Only use for small models or limited number of cross-sections b/c output can be huge. +CssSelection = # provide comma separated list of ints; e.g. 38, 39, 40. Leave empty to generate all cross-sections +SkipMaps = 1 # number of timesteps to skip at begin of 2D output. Use to skip problems related to initial conditions. +ClassificationMethod = 0 # How to classify 2D output using Section and Region polygons. Options: [0] Do not classify regions or sections. [1] Use DeltaShell +MinimumTotalWidth = 0.5 # Minimum width in meters. Zero width may lead to numerical instability in 1D solvers + +[output] +OutputDirectory = dummy# Output files are saved in OutputDir/CaseName; if not specified, subdirectory is created in the current directory diff --git a/tests/test_data/Output/WriteMaskOutputFile/mask_points.geojson b/tests/test_data/Output/WriteMaskOutputFile/mask_points.geojson new file mode 100644 index 00000000..eacfeca0 --- /dev/null +++ b/tests/test_data/Output/WriteMaskOutputFile/mask_points.geojson @@ -0,0 +1,27 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -11.216111, + 28.261124 + ] + }, + "properties": {} + }, + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + -160.363901, + 83.620762 + ] + }, + "properties": {} + } + ] +} \ No newline at end of file diff --git a/tests/test_data/Output/WriteMaskOutputFile/no_mask_points.geojson b/tests/test_data/Output/WriteMaskOutputFile/no_mask_points.geojson new file mode 100644 index 00000000..f9f334a4 --- /dev/null +++ b/tests/test_data/Output/WriteMaskOutputFile/no_mask_points.geojson @@ -0,0 +1,4 @@ +{ + "type": "FeatureCollection", + "features": null +} \ No newline at end of file diff --git a/tests/test_data/functions_test_data/cross_section_locations.xyz b/tests/test_data/functions_test_data/cross_section_locations.xyz new file mode 100644 index 00000000..5a6cb460 --- /dev/null +++ b/tests/test_data/functions_test_data/cross_section_locations.xyz @@ -0,0 +1,2 @@ +25,75,case1,250,0 +475,75,case1,500,500 diff --git a/tests/test_data/maskoutputfile_test_data/mask_points.geojson b/tests/test_data/maskoutputfile_test_data/mask_points.geojson new file mode 100644 index 00000000..32b8f7ff --- /dev/null +++ b/tests/test_data/maskoutputfile_test_data/mask_points.geojson @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "Point", "properties": {}, "coordinates": [4.2, 4.2]}, "properties": {}}, {"type": "Feature", "geometry": {"type": "Point", "properties": {}, "coordinates": [42, 42]}, "properties": {}}]} \ No newline at end of file diff --git a/tests/test_data/maskoutputfile_test_data/no_content.geojson b/tests/test_data/maskoutputfile_test_data/no_content.geojson new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_data/maskoutputfile_test_data/no_mask_points.geojson b/tests/test_data/maskoutputfile_test_data/no_mask_points.geojson new file mode 100644 index 00000000..2b6efbb3 --- /dev/null +++ b/tests/test_data/maskoutputfile_test_data/no_mask_points.geojson @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": null} \ No newline at end of file diff --git a/tests/test_data/maskoutputfile_test_data/test_file.wrongextension b/tests/test_data/maskoutputfile_test_data/test_file.wrongextension new file mode 100644 index 00000000..32b8f7ff --- /dev/null +++ b/tests/test_data/maskoutputfile_test_data/test_file.wrongextension @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "Point", "properties": {}, "coordinates": [4.2, 4.2]}, "properties": {}}, {"type": "Feature", "geometry": {"type": "Point", "properties": {}, "coordinates": [42, 42]}, "properties": {}}]} \ No newline at end of file diff --git a/tests/test_maskoutputfile.py b/tests/test_maskoutputfile.py index 9e21696a..6d85482a 100644 --- a/tests/test_maskoutputfile.py +++ b/tests/test_maskoutputfile.py @@ -7,22 +7,20 @@ import shutil import json import geojson - +from pathlib import Path from fm2prof.MaskOutputFile import MaskOutputFile from tests.TestUtils import TestUtils class MaskOutputFileHelper: - @staticmethod def get_mask_point(): - mask_point = geojson.utils.generate_random('Point') + mask_point = geojson.utils.generate_random("Point") return mask_point class Test_create_mask_point: - @pytest.mark.unittest def test_when_no_coords_does_not_raise(self): # 1. Set up test model @@ -35,15 +33,12 @@ def test_when_no_coords_does_not_raise(self): try: mask_point = MaskOutputFile.create_mask_point(coords, properties) except: - pytest.fail('Exception risen but not expected.') + pytest.fail("Exception risen but not expected.") # 4. Verify final expectations - assert mask_point is not None, '' + \ - 'No mask_point generated' + assert mask_point is not None, "" + "No mask_point generated" @pytest.mark.unittest - @pytest.mark.parametrize( - "coords_values", - [(4.2, 2.4), (4.2, 2.4, 42)]) + @pytest.mark.parametrize("coords_values", [(4.2, 2.4), (4.2, 2.4, 42)]) def test_when_valid_coords_does_not_raise(self, coords_values: tuple): # 1. Set up test model coords = coords_values @@ -54,15 +49,12 @@ def test_when_valid_coords_does_not_raise(self, coords_values: tuple): try: mask_point = MaskOutputFile.create_mask_point(coords, properties) except: - pytest.fail('Exception risen but not expected.') + pytest.fail("Exception risen but not expected.") # 3. Verify final expectations - assert mask_point is not None, '' + \ - 'No mask_point generated' + assert mask_point is not None, "" + "No mask_point generated" @pytest.mark.unittest - @pytest.mark.parametrize( - "coords_values", - [(4.2)]) + @pytest.mark.parametrize("coords_values", [(4.2)]) def test_when_invalid_coords_raises(self, coords_values: tuple): # 1. Set up test model coords = coords_values @@ -76,10 +68,8 @@ def test_when_invalid_coords_raises(self, coords_values: tuple): exception_thrown = True # 3. Verify final expectations - assert exception_thrown, '' + \ - 'No exception was thrown but it was expected.' - assert mask_point is None, '' + \ - 'Mask point generated but was not expected.' + assert exception_thrown, "" + "No exception was thrown but it was expected." + assert mask_point is None, "" + "Mask point generated but was not expected." @pytest.mark.unittest def test_when_no_properties_does_not_raise(self): @@ -93,32 +83,29 @@ def test_when_no_properties_does_not_raise(self): try: mask_point = MaskOutputFile.create_mask_point(coords, properties) except: - pytest.fail('Exception risen but not expected.') + pytest.fail("Exception risen but not expected.") # 4. Verify final expectations - assert mask_point is not None, '' + \ - 'No mask_point generated' + assert mask_point is not None, "" + "No mask_point generated" class Test_validate_extension: - @pytest.mark.unittest - @pytest.mark.parametrize( - "file_name", - [(None), ('')]) + @pytest.mark.parametrize("file_name", [(None), ("")]) def test_when_no_file_path_doesnot_raise(self, file_name): try: MaskOutputFile.validate_extension(file_name) except: - pytest.fail('Exception risen but not expected.') + pytest.fail("Exception risen but not expected.") @pytest.mark.unittest def test_when_invalid_extension_raises_expected_exception(self): # 1. Set up test data - file_name = 'test_file.wrongextension' + file_name = "test_file.wrongextension" # 2. Set expectations - expected_error = '' + \ - 'Invalid file path extension, should be .json or .geojson.' + expected_error = ( + "" + "Invalid file path extension, should be .json or .geojson." + ) # 3. Run test with pytest.raises(IOError) as e_info: @@ -126,33 +113,28 @@ def test_when_invalid_extension_raises_expected_exception(self): # 4. Verify final expectations error_message = str(e_info.value) - assert error_message == expected_error, '' + \ - 'Expected exception message {},'.format(expected_error) + \ - 'retrieved {}'.format(error_message) + assert error_message == expected_error, ( + "" + + "Expected exception message {},".format(expected_error) + + "retrieved {}".format(error_message) + ) @pytest.mark.unittest - @pytest.mark.parametrize( - "file_name", - [('n.json'), ('n.geojson')]) + @pytest.mark.parametrize("file_name", [("n.json"), ("n.geojson")]) def test_when_valid_extension_does_not_raise(self, file_name): try: MaskOutputFile.validate_extension(file_name) except: - pytest.fail('Exception risen but not expected.') + pytest.fail("Exception risen but not expected.") class Test_read_mask_output_file: - @pytest.mark.unittest @pytest.mark.parametrize( "file_path_name", - [ - (None), - ('invalidfile.geojson'), - ('invalidfile.json'), - ('invalidfile.xyz')]) - def test_when_invalid_file_path_given_then_emtpy_geojson( - self, file_path_name): + [(None), ("invalidfile.geojson"), ("invalidfile.json"), ("invalidfile.xyz")], + ) + def test_when_invalid_file_path_given_then_emtpy_geojson(self, file_path_name): # 1. Set up test data read_geojson = None @@ -163,103 +145,92 @@ def test_when_invalid_file_path_given_then_emtpy_geojson( try: read_geojson = MaskOutputFile.read_mask_output_file(file_path_name) except: - pytest.fail('Exception thrown but not expected.') + pytest.fail("Exception thrown but not expected.") # 4. Verify final expectations - assert read_geojson, '' + \ - 'No geojson data was generated.' - assert read_geojson == expected_geojson, '' + \ - 'Expected {} but got {}'.format(expected_geojson, read_geojson) + assert read_geojson, "" + "No geojson data was generated." + assert read_geojson == expected_geojson, "" + "Expected {} but got {}".format( + expected_geojson, read_geojson + ) @pytest.mark.integrationtest def test_when_file_path_wrong_extension_then_raise_exception(self): # 1. Set up test data - test_dir = TestUtils.get_local_test_data_dir( - 'maskoutputfile_test_data') - file_name = 'test_file.wrongextension' - file_path = os.path.join(test_dir, file_name) + file_path = ( + TestUtils.get_local_test_data_dir("maskoutputfile_test_data") + / "test_file.wrongextension" + ) read_geojson_data = None # 2. Set expectations - assert os.path.exists(file_path), '' + \ - 'File {} could not be found.'.format(file_path) - expected_error = '' + \ - 'Invalid file path extension, should be .json or .geojson.' + assert file_path.exists(), "" + "File {} could not be found.".format(file_path) + expected_error = ( + "" + "Invalid file path extension, should be .json or .geojson." + ) # 3. Run test with pytest.raises(IOError) as e_info: - read_geojson_data = MaskOutputFile.read_mask_output_file(file_path) + read_geojson_data = MaskOutputFile.read_mask_output_file(str(file_path)) # 4. Verify final expectations assert not read_geojson_data error_message = str(e_info.value) - assert error_message == expected_error, '' + \ - 'Expected exception message {},'.format(expected_error) + \ - 'retrieved {}'.format(error_message) + assert error_message == expected_error, ( + "" + + "Expected exception message {},".format(expected_error) + + "retrieved {}".format(error_message) + ) @pytest.mark.systemtest @pytest.mark.parametrize( - "file_name", - [('no_mask_points.geojson'), ('no_content.geojson')]) + "file_name", [("no_mask_points.geojson"), ("no_content.geojson")] + ) def test_when_valid_file_with_no_content_then_returns_expected_geojson( - self, file_name): + self, file_name + ): # 1. Set up test data - test_dir = TestUtils.get_local_test_data_dir( - 'maskoutputfile_test_data') - file_path = os.path.join(test_dir, file_name) + file_path: Path = ( + TestUtils.get_local_test_data_dir("maskoutputfile_test_data") / file_name + ) - # 2. Set up initial expectations expected_geojson = geojson.FeatureCollection(None) - assert os.path.exists(file_path), '' + \ - 'File not found at {}'.format(file_path) + assert file_path.is_file(), "File not found at {}".format(file_path) # 2. Read data - try: - read_geojson = MaskOutputFile.read_mask_output_file(file_path) - except: - pytest.fail('Exception thrown but not expected.') + read_geojson = MaskOutputFile.read_mask_output_file(str(file_path)) # 3. Verify final expectations - assert read_geojson, '' + \ - 'No geojson data was generated.' - assert read_geojson == expected_geojson, '' + \ - 'Expected {} but got {}'.format(expected_geojson, read_geojson) + assert read_geojson, "No geojson data was generated." + assert ( + read_geojson == expected_geojson + ), f"Expected {expected_geojson} but got {read_geojson}" @pytest.mark.systemtest - def test_when_valid_file_with_content_then_returns_expected_geojson( - self): + def test_when_valid_file_with_content_then_returns_expected_geojson(self): # 1. Set up test data - test_dir = TestUtils.get_local_test_data_dir( - 'maskoutputfile_test_data') - file_name = 'mask_points.geojson' - file_path = os.path.join(test_dir, file_name) + file_path = ( + TestUtils.get_local_test_data_dir("maskoutputfile_test_data") + / "mask_points.geojson" + ) # 2. Verify initial expectations - assert os.path.exists(file_path), '' + \ - 'File not found at {}'.format(file_path) + assert file_path.exists(), f"File not found at {file_path}" # 2. Read data - try: - read_geojson = MaskOutputFile.read_mask_output_file(file_path) - except: - pytest.fail('Exception thrown but not expected.') + read_geojson = MaskOutputFile.read_mask_output_file(str(file_path)) # 3. Verify final expectations - assert read_geojson, '' + \ - 'No geojson data was generated.' - assert read_geojson.is_valid, '' + \ - 'The geojson data is not valid.' + assert read_geojson, "" + "No geojson data was generated." + assert read_geojson.is_valid, "" + "The geojson data is not valid." class Test_write_mask_output_file: - - @pytest.fixture(scope='class') + @pytest.fixture(scope="class") def test_folder(self): - """Prepares the class properties to be used in the tests. - """ - test_dir = TestUtils.get_test_dir('Output\\WriteMaskOutputFile') - if not os.path.exists(test_dir): - os.makedirs(test_dir) + """Prepares the class properties to be used in the tests.""" + test_dir = TestUtils.get_local_test_data_dir("Output") / "WriteMaskOutputFile" + if not test_dir.is_dir(): + test_dir.mkdir(parents=True, exist_ok=True) yield test_dir @pytest.mark.unittest @@ -271,17 +242,18 @@ def test_when_no_file_path_given_then_exception_not_risen(self): try: MaskOutputFile.write_mask_output_file(file_path, mask_points) except: - pytest.fail('Exception thrown but not expected.') + pytest.fail("Exception thrown but not expected.") @pytest.mark.integrationtest def test_when_file_path_with_wrong_extension_then_exception_is_risen(self): # 1. Set up test data - file_path = 'test_file.wrongextension' + file_path = "test_file.wrongextension" mask_points = None # 2. Set expectations - expected_error = '' + \ - 'Invalid file path extension, should be .json or .geojson.' + expected_error = ( + "" + "Invalid file path extension, should be .json or .geojson." + ) # 3. Run test with pytest.raises(IOError) as e_info: @@ -289,15 +261,18 @@ def test_when_file_path_with_wrong_extension_then_exception_is_risen(self): # 4. Verify final expectations error_message = str(e_info.value) - assert error_message == expected_error, '' + \ - 'Expected exception message {},'.format(expected_error) + \ - 'retrieved {}'.format(error_message) + assert error_message == expected_error, ( + "" + + "Expected exception message {},".format(expected_error) + + "retrieved {}".format(error_message) + ) @pytest.mark.systemtest def test_when_valid_file_path_and_no_mask_point_then_writes_expectations( - self, test_folder): + self, test_folder + ): # 1. Set up test data - file_name = 'no_mask_points.geojson' + file_name = "no_mask_points.geojson" file_path = os.path.join(test_folder, file_name) mask_points = None @@ -309,32 +284,33 @@ def test_when_valid_file_path_and_no_mask_point_then_writes_expectations( try: MaskOutputFile.write_mask_output_file(file_path, mask_points) except: - pytest.fail('Exception thrown but not expected.') + pytest.fail("Exception thrown but not expected.") # 4. Verify final expectations - assert os.path.exists(file_path), '' + \ - 'File {} not found.'.format(file_path) + assert os.path.exists(file_path), "" + "File {} not found.".format(file_path) with open(file_path) as geojson_file: read_mask_points = geojson.load(geojson_file) - assert read_mask_points, '' + \ - 'No mask points were read from {}'.format(file_path) - assert expected_mask_points == read_mask_points, '' + \ - 'Expected {} ,'.format(expected_mask_points) + \ - 'but got {}'.format(read_mask_points) + assert read_mask_points, "" + "No mask points were read from {}".format( + file_path + ) + assert expected_mask_points == read_mask_points, ( + "" + + "Expected {} ,".format(expected_mask_points) + + "but got {}".format(read_mask_points) + ) @pytest.mark.systemtest def test_when_valid_file_path_and_mask_points_then_writes_expectations( - self, test_folder): + self, test_folder + ): # 1. Set up test data - file_name = 'mask_points.geojson' + file_name = "mask_points.geojson" file_path = os.path.join(test_folder, file_name) mask_points = [ - geojson.Feature( - geometry=MaskOutputFileHelper.get_mask_point()), - geojson.Feature( - geometry=MaskOutputFileHelper.get_mask_point()) + geojson.Feature(geometry=MaskOutputFileHelper.get_mask_point()), + geojson.Feature(geometry=MaskOutputFileHelper.get_mask_point()), ] # 2. Set expectations @@ -345,17 +321,19 @@ def test_when_valid_file_path_and_mask_points_then_writes_expectations( try: MaskOutputFile.write_mask_output_file(file_path, mask_points) except: - pytest.fail('Exception thrown but not expected.') + pytest.fail("Exception thrown but not expected.") # 4. Verify final expectations - assert os.path.exists(file_path), '' + \ - 'File {} not found.'.format(file_path) + assert os.path.exists(file_path), "" + "File {} not found.".format(file_path) with open(file_path) as geojson_file: read_mask_points = geojson.load(geojson_file) - assert read_mask_points, '' + \ - 'No mask points were read from {}'.format(file_path) - assert expected_mask_points == read_mask_points, '' + \ - 'Expected {} ,'.format(expected_mask_points) + \ - 'but got {}'.format(read_mask_points) + assert read_mask_points, "" + "No mask points were read from {}".format( + file_path + ) + assert expected_mask_points == read_mask_points, ( + "" + + "Expected {} ,".format(expected_mask_points) + + "but got {}".format(read_mask_points) + )