diff --git a/.flake8 b/.flake8 new file mode 100644 index 00000000..ef90a1be --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +ignore = E501,E225,E226,E303,E201,E202,E203,W503 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..687f3b11 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,9 @@ +# GitHub syntax highlighting +pixi.lock linguist-language=YAML + +.gitattributes export-ignore +.hgignore export-ignore + +old export-ignore +./try export-ignore +./bench export-ignore diff --git a/.github/workflows/ci-linux.yaml b/.github/workflows/ci-linux.yaml new file mode 100644 index 00000000..af8d0ee1 --- /dev/null +++ b/.github/workflows/ci-linux.yaml @@ -0,0 +1,44 @@ +name: CI Linux + +on: + - push + - pull_request + +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.9", "3.10", "3.11"] + + steps: + - name: Install apt packages + run: | + sudo apt-get update + sudo apt-get install xvfb x11-utils libxkbcommon-x11-0 libxcb-icccm4 \ + libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 \ + libxcb-xinerama0 libxcb-xfixes0 xdotool + + - uses: actions/checkout@v3 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install pdm nox + + - name: Test with nox + run: | + nox -s test + + - name: Upload coverage to codecov + if: ${{ success() }} + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + fail_ci_if_error: false # optional (default = false) + verbose: true # optional (default = false) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml deleted file mode 100644 index f1bb32c7..00000000 --- a/.github/workflows/ci.yaml +++ /dev/null @@ -1,51 +0,0 @@ -name: ci-linux - -on: - - push - -env: - FORCE_COLOR: 1 - -jobs: - tests: - runs-on: ubuntu-latest - strategy: - max-parallel: 5 - matrix: - python-version: ["3.9", "3.10"] - - steps: - - name: Checkout - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Install apt packages - run: | - sudo apt-get update - sudo apt-get install xvfb x11-utils libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-randr0 libxcb-render-util0 libxcb-xinerama0 libxcb-xfixes0 xdotool - - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python-version }} - cache: "pip" - cache-dependency-path: "requirements/test.txt" - - - name: Verify Python environment - run: | - pip list - pip cache list - pip check - - - name: Install dependencies - run: | - python -m pip install --upgrade pip nox - - - name: Run tests - run: | - xvfb-run --auto-servernum nox --session tests-cov -- -v --cov-report=xml - - - name: Upload coverage to codecov - if: ${{ success() }} - uses: codecov/codecov-action@v3 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1acd0fa6..114b3d09 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,10 +1,117 @@ +stages: + # - pixi + - image + - lint + - test + - doc + - build + variables: - CODECOV_TOKEN: 0ac60028-17ba-4383-b4ad-b5ba5ca35f3d + COVERAGE_DIR: .coverage_$CI_COMMIT_SHA + DOCKER_IMAGE_PATH: registry.heptapod.net:443/fluiddyn/fluidimage/ci/default + +image: $DOCKER_IMAGE_PATH:stable + +# ugly workaround https://gitlab.com/gitlab-org/gitlab/-/issues/370052#note_1207556577 +workflow: + rules: + - if: $CI_PIPELINE_SOURCE == "merge_request_event" + - if: $CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS + when: never + - if: $CI_COMMIT_BRANCH + - if: $CI_COMMIT_TAG + + +# Build an image for the other tasks; this should be a scheduled job, as +# it is quite unnecessary to run on every invocation. +image:build: + stage: image + needs: [] + tags: + - container-registry-push + rules: + - if: '$CI_PIPELINE_SOURCE == "schedule"' + - if: '$CI_BUILD_IMAGES == "1"' + image: + name: gcr.io/kaniko-project/executor:debug + entrypoint: [ "" ] + before_script: + - "" + script: + - | + cat > /kaniko/.docker/config.json < + /kaniko/executor --context $CI_PROJECT_DIR + --dockerfile $CI_PROJECT_DIR/docker/Dockerfile + --single-snapshot + --cleanup + --destination $DOCKER_IMAGE_PATH:stable + + +validate_code: + stage: lint + needs: + - job: "image:build" + optional: true + script: + - nox -s validate_code + tests: - image: fluiddyn/python3-stable:testing + stage: test + needs: + - job: "image:build" + optional: true + script: + - xvfb-run nox -s test-cov + + +pages: + stage: doc + needs: + - job: "image:build" + optional: true + variables: + FLUIDFFT_TRANSONIC_BACKEND: "python" + script: + - xvfb-run --auto-servernum nox -s doc + - mkdir -p public/$CI_COMMIT_REF_NAME + - rsync -rvc --delete doc/_build/html/* public/$CI_COMMIT_REF_NAME/ + # This directory can become too large leading to error. + # It can be purged with the botton "Clear runner caches" + # in https://foss.heptapod.net/fluiddyn/fluidimage/-/pipelines + - ls public + - echo "CI_COMMIT_REF_NAME="$CI_COMMIT_REF_NAME + - echo See https://fluiddyn.pages.heptapod.net/fluidimage/$CI_COMMIT_REF_NAME + artifacts: + name: "$CI_COMMIT_REF_NAME" + paths: + - public + expire_in: 5 days + when: always + + +build:package: + stage: build + before_script: + - pip install build twine script: - - python -m venv venv - - source venv/bin/activate - - pip install -U pip nox - - xvfb-run nox -s tests-cov + - rm -rf dist + - python -m build -s + - ls dist + - twine check --strict dist/* + needs: [] + artifacts: + when: always + paths: + - dist + expire_in: 24 hrs diff --git a/.hgignore b/.hgignore index 97154078..42a986f1 100644 --- a/.hgignore +++ b/.hgignore @@ -11,8 +11,10 @@ fluidimage/_hg_rev.py **/.vscode/* -venv/* -.nox/* +.venv +.nox + +.pdm-python *.swp *.swo @@ -21,6 +23,8 @@ venv/* *build/* **/__pythran__ +**/__python__ +**/__numba__ .tox/* *.so @@ -59,7 +63,8 @@ doc/ipynb/*.nbconvert.ipynb doc/ipynb/**.png doc/examples/oar_launcher* doc/examples/topo.dot -*/.ipynb_checkpoints/* +**/.ipynb_checkpoints/* +doc/_jupyter_cache fluidimage/post_proc/*.h5 @@ -69,7 +74,7 @@ image_samples/*/*.piv image_samples/*/*/log_*.txt image_samples/*/*/params_*.xml image_samples/*/Images.bench -image_samples/4th_PIV-Challenge_Case_E/E_Calibration_Images/Camera_0*/calib*.npy +image_samples/4th_PIV-Challenge_Case_E/E_Calibration_Images/Camera_0*/calib*.npz image_samples/Milestone/Images_many* image_samples/Karman/Images.civ/* diff --git a/.readthedocs.yml b/.readthedocs.yml index be6b059c..1b39e67a 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -1,21 +1,18 @@ -# Read the Docs configuration file -# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details - -# Required version: 2 build: os: ubuntu-22.04 tools: python: "3.11" + apt_packages: + - graphviz + jobs: + post_create_environment: + - pip install pdm pip -U + post_install: + - pdm use -f $READTHEDOCS_VIRTUALENV_PATH + - pdm sync -G doc -G opencv --no-self + - pip install . -C setup-args=-Dtransonic-backend=python sphinx: configuration: doc/conf.py - -python: - system_packages: true - install: - - method: pip - path: . - extra_requirements: - - doc diff --git a/AUTHORS.rst b/AUTHORS.md similarity index 90% rename from AUTHORS.rst rename to AUTHORS.md index 47c5d13d..2b50c6b8 100644 --- a/AUTHORS.rst +++ b/AUTHORS.md @@ -1,3 +1,4 @@ +# Main contributors The main contributors are: diff --git a/CHANGES.rst b/CHANGES.md similarity index 56% rename from CHANGES.rst rename to CHANGES.md index a67c3cd6..be8b26fe 100644 --- a/CHANGES.rst +++ b/CHANGES.md @@ -1,44 +1,41 @@ +# Release notes -0.1.5_ (2023-02-15) -------------------- +See also the +[unreleased changes](https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.5...branch%2Fdefault). + +# [0.1.5] (2023-02-15) - Requires Python 3.9 - Improves legend, warnings, error log and documentation -0.1.4_ (2022-12-13) -------------------- +# [0.1.4] (2022-12-13) - Support Python 3.10 - Avoid a bug with pyfftw 0.13 -0.1.3_ (2021-09-29) -------------------- +# [0.1.3] (2021-09-29) - Many bugfixes! - Improve VectorFieldOnGrid and ArrayOfVectorFieldsOnGrid - UVmat compatibility - Fix incompatibility OpenCV and PyQt5 -0.1.2_ (2019-06-05) -------------------- +# [0.1.2] (2019-06-05) - Bugfix install Windows -0.1.1_ (2019-05-23) -------------------- +# [0.1.1] (2019-05-23) - Optical flow computation - Bugfixes + internal code improvements -0.1.0 (2018-10-03) ------------------- +# 0.1.0 (2018-10-03) - New topologies and executors with Trio! - Much better coverage & many bugfixes! - Better surface tracking -0.0.3 (2018-08-29) ------------------- +# 0.0.3 (2018-08-29) - Requirement Python >= 3.6 - Surface tracking @@ -49,22 +46,21 @@ - fluidimslideshow-pg and fluidimviewer-pg (based on PyQtgraph) - OpenCV backend for preprocessing -0.0.2 (2017-04-13) ------------------- +# 0.0.2 (2017-04-13) - Bug fixes and documentation changes. - Continuous integration (python 2.7 and 3.5) with bitbucket pipelines - (`coverage ~40% `_) + ([coverage ~40%](https://codecov.io/gh/fluiddyn/fluidimage)) - Preprocessing of images. - First simple GUI (`fluidimviewer` and `fluidimlauncher`). -0.0.1b (2016-05-31) -------------------- +# 0.0.1b (2016-05-31) - Topology and waiting queues classes to run work in parallel. - PIV work and topology (multipass, different correlation methods). -.. _0.1.3: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.3...0.1.4 -.. _0.1.3: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.2...0.1.3 -.. _0.1.2: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.1...0.1.2 -.. _0.1.1: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.0...0.1.1 +[0.1.1]: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.0...0.1.1 +[0.1.2]: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.1...0.1.2 +[0.1.3]: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.2...0.1.3 +[0.1.4]: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.3...0.1.4 +[0.1.5]: https://foss.heptapod.net/fluiddyn/fluidimage/-/compare/0.1.4...0.1.5 \ No newline at end of file diff --git a/Makefile b/Makefile index 2aed4bb0..58464b14 100644 --- a/Makefile +++ b/Makefile @@ -1,53 +1,31 @@ -.PHONY: clean clean_all develop build_ext_inplace requirements +.PHONY: clean cleanall develop -develop: - pip install -e .[dev] +develop: sync -build_ext_inplace: - python setup.py build_ext --inplace +sync: + pdm sync + +lock: + pdm lock clean: rm -rf build -cleanso: - find fluidimage -name "*.so" -delete - cleantransonic: find fluidimage -type d -name __pythran__ | xargs rm -rf -cleanall: clean cleanso cleantransonic +cleanall: clean cleantransonic black: - black -l 82 fluidimage try *.py doc + pdm run black isort: - isort -rc --atomic -tc fluidimage bin bench doc/examples - -tests: - OMP_NUM_THREADS=1 pytest - -_tests_coverage: - mkdir -p .coverage - TRANSONIC_NO_REPLACE=1 OMP_NUM_THREADS=1 coverage run -p -m pytest + pdm run isort -_report_coverage: - coverage combine - coverage report - coverage html - coverage xml - @echo "Code coverage analysis complete. View detailed report:" - @echo "file://${PWD}/.coverage/index.html" - -coverage: _tests_coverage _report_coverage +test: + OMP_NUM_THREADS=1 pdm run pytest src list-sessions: @nox --version 2>/dev/null || pip install nox @$(NOX) -l - -requirements: 'pip-compile(main)' 'pip-compile(doc)' 'pip-compile(test)' 'pip-compile(dev)' - -# Catch-all target: route all unknown targets to nox sessions -%: Makefile - @nox --version 2>/dev/null || pip install nox - @nox -s $@ diff --git a/README.md b/README.md new file mode 100644 index 00000000..2b3d360d --- /dev/null +++ b/README.md @@ -0,0 +1,57 @@ +FluidImage +========== + +[![Latest version](https://img.shields.io/pypi/v/fluidimage.svg)](https://pypi.python.org/pypi/fluidimage/) +[![Documentation status](https://readthedocs.org/projects/fluidimage/badge/?version=latest)](http://fluidimage.readthedocs.org) +[![Code coverage](https://codecov.io/gh/fluiddyn/fluidimage/branch/branch%2Fdefault/graph/badge.svg)](https://codecov.io/gh/fluiddyn/fluidimage/branch/branch%2Fdefault/) +[![Heptapod CI](https://foss.heptapod.net/fluiddyn/fluidimage/badges/branch/default/pipeline.svg)](https://foss.heptapod.net/fluiddyn/fluidimage/-/pipelines) +[![Github Actions](https://github.com/fluiddyn/fluidimage/actions/workflows/ci-linux.yml/badge.svg?branch=branch/default)](https://github.com/fluiddyn/fluidimage/actions) + +FluidImage is a libre Python framework for scientific processing of +large series of images. + +**Documentation:** + +Image processing for fluid mechanics is highly dominated by proprietary +tools. Such tools are not ideal when you want to understand and tweak +the processes and/or to use clusters. With the improvement of the +open-source tools for scientific computing and collaborative +development, one can think it is possible to build together a good +library/toolkit specialized in image processing for fluid mechanics. +This is our project with FluidImage. + +This package is young but already good enough to be used "in +production" to + +- display and pre-process images, + +- compute displacement or velocity fields with [Particle Image + Velocimetry](https://en.wikipedia.org/wiki/Particle_image_velocimetry%20(PIV)) + (PIV, i.e. displacements of pattern obtained by correlations of + cropped images) and [optical + flow](https://en.wikipedia.org/wiki/Optical_flow), + +- analyze and display PIV fields. + +We want to make FluidImage easy (useful documentation, easy +installation, usable with scripts and GUI in Qt), reliable (with good +[unittests](https://codecov.io/gh/fluiddyn/fluidimage/)) and very +efficient, in particular when the number of images to process becomes +large. Thus we want FluidImage to be able to run efficiently and easily +on a personal computer and on big clusters. The efficiency is achieved +by using + +- a framework for asynchronous computations (currently, we use + [Trio](https://trio.readthedocs.io) + multiprocessing, and in the + long term we want to be able to plug FluidImage to distributed + computational systems like [Dask](http://dask.pydata.org), + [Spark](https://spark.apache.org/) or + [Storm](http://storm.apache.org/)), + +- the available cores of the central processing units (CPU) and the + available graphics processing units (GPU), + +- good profiling and efficient and specialized algorithms, + +- cutting-edge tools for fast computations with Python (in particular + [Pythran](https://pythonhosted.org/pythran/)). diff --git a/README.rst b/README.rst deleted file mode 100644 index 68d55ca3..00000000 --- a/README.rst +++ /dev/null @@ -1,69 +0,0 @@ -FluidImage -========== - -|release| |docs| |coverage| |heptapod_ci| |github_actions| - -.. |release| image:: https://img.shields.io/pypi/v/fluidimage.svg - :target: https://pypi.python.org/pypi/fluidimage/ - :alt: Latest version - -.. |docs| image:: https://readthedocs.org/projects/fluidimage/badge/?version=latest - :target: http://fluidimage.readthedocs.org - :alt: Documentation status - -.. |coverage| image:: https://codecov.io/gh/fluiddyn/fluidimage/branch/branch%2Fdefault/graph/badge.svg - :target: https://codecov.io/gh/fluiddyn/fluidimage/branch/branch%2Fdefault/ - :alt: Code coverage - -.. |heptapod_ci| image:: https://foss.heptapod.net/fluiddyn/fluidimage/badges/branch/default/pipeline.svg - :target: https://foss.heptapod.net/fluiddyn/fluidimage/-/pipelines - :alt: Heptapod CI - -.. |github_actions| image:: https://github.com/fluiddyn/fluidimage/actions/workflows/ci.yml/badge.svg?branch=branch/default - :target: https://github.com/fluiddyn/fluidimage/actions - :alt: Github Actions - -FluidImage is a libre Python framework for scientific processing of large -series of images. - -**Documentation:** http://fluidimage.readthedocs.org - -Image processing for fluid mechanics is highly dominated by proprietary tools. -Such tools are not ideal when you want to understand and tweak the processes -and/or to use clusters. With the improvement of the open-source tools for -scientific computing and collaborative development, one can think it is -possible to build together a good library/toolkit specialized in image -processing for fluid mechanics. This is our project with FluidImage. - -This package is young but already good enough to be used "in production" to - -- display and pre-process images, - -- compute displacement or velocity fields with `Particle Image Velocimetry - `_ (PIV, i.e. - displacements of pattern obtained by correlations of cropped images) and - `optical flow `_, - -- analyze and display PIV fields. - -We want to make FluidImage easy (useful documentation, easy installation, -usable with scripts and GUI in Qt), reliable (with good `unittests -`_) and very efficient, in -particular when the number of images to process becomes large. Thus we want -FluidImage to be able to run efficiently and easily on a personal computer and -on big clusters. The efficiency is achieved by using - -- a framework for asynchronous computations (currently, we use `Trio - `_ + multiprocessing, and in the long term we want - to be able to plug FluidImage to distributed computational systems like `Dask - `_, `Spark `_ or `Storm - `_), - -- the available cores of the central processing units (CPU) and the available - graphics processing units (GPU), - -- good profiling and efficient and specialized algorithms, - -- cutting-edge tools for fast computations with Python (in particular `Pythran - `_ and `Theano - `_). diff --git a/bin/fluidimlauncher b/bin/fluidimlauncher deleted file mode 100755 index 8b878443..00000000 --- a/bin/fluidimlauncher +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env python - -from fluidimage.gui.launcher.main import main - -if __name__ == '__main__': - main() diff --git a/bin/fluidimviewer b/bin/fluidimviewer deleted file mode 100755 index 78b53bca..00000000 --- a/bin/fluidimviewer +++ /dev/null @@ -1,11 +0,0 @@ -#! /usr/bin/env python -""" -Minimalist image viewer for PIV -=============================== - -""" - -from fluidimage.gui.imviewer import ImageViewer, parse_args - -args = parse_args() -self = ImageViewer(args) diff --git a/doc/HOWTO_build_the_doc b/doc/HOWTO_build_the_doc deleted file mode 100644 index c3c83329..00000000 --- a/doc/HOWTO_build_the_doc +++ /dev/null @@ -1,33 +0,0 @@ -Run in a terminal from this directory:: - - make - -Also useful:: - - make clean - make cleanall - -Dependencies to build the documentation: - -- sphinx -- numpydoc - -Build the doc nearly as in readthedocs with conda -------------------------------------------------- - -```bash - -export READTHEDOCS=1 -cd ~/Dev/fluidimage -conda remove --name latest --all -y -conda env create --name latest --file doc/environment.yml -conda install --yes --quiet --name latest mock pillow sphinx sphinx_rtd_theme -conda activate latest -pip install -U recommonmark readthedocs-sphinx-ext -python ./setup.py install --force - -cd doc -make cleanall -sphinx-build -T -b readthedocs -d _build/doctrees-readthedocs -D language=en . _build/html - -``` diff --git a/doc/Makefile b/doc/Makefile index 3b0715c0..9c15aa48 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -48,20 +48,12 @@ help: @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" -cleanipynb: - rm -rf $(IPYTHON_NOTEBOOKS_DIR) - rm -f $(IPYTHON_NOTEBOOKS_RST) - rm -f ipynb/*.nbconvert.ipynb - -clean: cleanipynb +clean: rm -rf $(BUILDDIR)/* cleanall: clean rm -rf generated html.zip -cleannbconvert.ipynb: - rm -f ipynb/*.nbconvert.ipynb - dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo diff --git a/doc/authors.md b/doc/authors.md new file mode 120000 index 00000000..3234d6e0 --- /dev/null +++ b/doc/authors.md @@ -0,0 +1 @@ +../AUTHORS.md \ No newline at end of file diff --git a/doc/authors.rst b/doc/authors.rst deleted file mode 100644 index 0661b54d..00000000 --- a/doc/authors.rst +++ /dev/null @@ -1,4 +0,0 @@ -Authors -======= - -.. include:: ../AUTHORS.rst diff --git a/doc/changes.md b/doc/changes.md new file mode 120000 index 00000000..cf547089 --- /dev/null +++ b/doc/changes.md @@ -0,0 +1 @@ +../CHANGES.md \ No newline at end of file diff --git a/doc/changes.rst b/doc/changes.rst deleted file mode 100644 index 955deaf2..00000000 --- a/doc/changes.rst +++ /dev/null @@ -1,4 +0,0 @@ -Changes -======= - -.. include:: ../CHANGES.rst diff --git a/doc/conf.py b/doc/conf.py index a09e04ef..b7323d74 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -11,27 +11,10 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys import os os.environ["OMP_NUM_THREADS"] = "1" -# to be able to build the doc without h5py with Read the docs - -import fluiddoc - -if fluiddoc.on_rtd: - print("Mock modules to build the documentation on READTHEDOCS.") - # this package comes from fluiddyn - fluiddoc.mock_modules( - [ - "theano", - "reikna.cluda", - "reikna.fft", - "reikna.transformations", - ] - ) - import fluidimage # we want this module to be importable. @@ -42,16 +25,6 @@ traceback.print_exc() -from fluiddoc.ipynb_maker import ipynb_to_rst - -ipynb_to_rst() - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath("../scripts")) -sys.path.insert(0, os.path.abspath("./")) - # -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. @@ -70,21 +43,27 @@ "sphinx.ext.autosummary", "numpydoc", "fluiddoc.mathmacro", + "sphinx.ext.inheritance_diagram", # requires Graphviz + "myst_nb", + "sphinx_copybutton", ] -try: - import readthedocs_ext -except ImportError: - pass -else: - extensions.append("readthedocs_ext.readthedocs") - +# Execute ipynb files into with a cache ... +nb_execution_mode = "cache" +nb_execution_cache_path = "./_jupyter_cache" +os.makedirs(nb_execution_cache_path, exist_ok=True) +# ... except these ipynb files +nb_execution_excludepatterns = ["ipynbslides/*"] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = ".rst" +source_suffix = { + ".rst": "restructuredtext", + ".ipynb": "myst-nb", + ".myst": "myst-nb", +} # The encoding of source files. # source_encoding = 'utf-8-sig' @@ -149,7 +128,7 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'default' -html_theme = "sphinx_rtd_theme" +html_theme = "pydata_sphinx_theme" # Theme options are theme-specific and customize the look and feel of a theme @@ -312,3 +291,25 @@ autodoc_member_order = "bysource" todo_include_todos = True + +nb_execution_raise_on_error = True +nb_execution_show_tb = True +nb_merge_streams = True +nb_execution_timeout = 120 + +myst_enable_extensions = [ + "amsmath", + # "attrs_inline", + "colon_fence", + # "deflist", + "dollarmath", + # "fieldlist", + # "linkify", + # "replacements", + # "smartquotes", + # "strikethrough", + "substitution", + # "tasklist", +] + +suppress_warnings = ["mystnb.unknown_mime_type"] diff --git a/doc/examples/piv_as_real/args.py b/doc/examples/piv_as_real/args.py index 988f2da8..2be206cf 100644 --- a/doc/examples/piv_as_real/args.py +++ b/doc/examples/piv_as_real/args.py @@ -4,6 +4,7 @@ It is used in other scripts in this directory. """ + import argparse diff --git a/doc/examples/piv_as_real/job_piv.py b/doc/examples/piv_as_real/job_piv.py index d31757c7..9609d51f 100755 --- a/doc/examples/piv_as_real/job_piv.py +++ b/doc/examples/piv_as_real/job_piv.py @@ -18,7 +18,6 @@ def main(args): - params = params_piv.make_params_piv( args.exp, savinghow=args.saving_how, @@ -31,7 +30,6 @@ def main(args): if __name__ == "__main__": - from fluidcoriolis.milestone.args_piv import parse_args args = parse_args(doc=__doc__, postfix_in="pre", postfix_out="piv") diff --git a/doc/examples/piv_as_real/job_pre.py b/doc/examples/piv_as_real/job_pre.py index a5fa5565..992beadd 100755 --- a/doc/examples/piv_as_real/job_pre.py +++ b/doc/examples/piv_as_real/job_pre.py @@ -29,7 +29,6 @@ def main(args): - list_params = params_pre.make_params_pre( args.exp, savinghow=args.saving_how, postfix_out=args.postfix_out ) @@ -41,7 +40,6 @@ def main(args): if __name__ == "__main__": - from args import parse_args args = parse_args(doc=__doc__, postfix_in=None, postfix_out="pre") diff --git a/doc/examples/piv_as_real/params_piv.py b/doc/examples/piv_as_real/params_piv.py index 4260d8e9..8eec513f 100644 --- a/doc/examples/piv_as_real/params_piv.py +++ b/doc/examples/piv_as_real/params_piv.py @@ -8,6 +8,7 @@ ./try_piv.py & """ + from glob import glob from fluidimage.topologies.piv import TopologyPIV @@ -21,7 +22,6 @@ def get_path(iexp): def make_params_piv( iexp, savinghow="recompute", postfix_in="pre", postfix_out="piv" ): - path = get_path(iexp) if postfix_in is not None and postfix_in != "": diff --git a/doc/index.rst b/doc/index.rst index a0ea56ff..819001cb 100644 --- a/doc/index.rst +++ b/doc/index.rst @@ -1,7 +1,5 @@ .. FluidImage documentation master file -.. include:: ../README.rst - User Guide ---------- diff --git a/doc/ipynb/tuto_calibration2dsimple.ipynb b/doc/ipynb/tuto_calibration2dsimple.ipynb index 72e31cd8..b4dd0244 100644 --- a/doc/ipynb/tuto_calibration2dsimple.ipynb +++ b/doc/ipynb/tuto_calibration2dsimple.ipynb @@ -59,7 +59,7 @@ "outputs": [], "source": [ "with h5py.File(path_piv) as file:\n", - " shape_im = file['couple/shape_images'].value\n", + " shape_im = file['couple/shape_images'][...]\n", "\n", "point0 = (10, 20)\n", "point1 = (10, 10)\n", @@ -310,4 +310,4 @@ }, "nbformat": 4, "nbformat_minor": 2 -} \ No newline at end of file +} diff --git a/doc/ipynb/tuto_opencv_calibration.ipynb b/doc/ipynb/tuto_opencv_calibration.ipynb index 066034b9..e651ee1a 100644 --- a/doc/ipynb/tuto_opencv_calibration.ipynb +++ b/doc/ipynb/tuto_opencv_calibration.ipynb @@ -9,8 +9,7 @@ "The calibration was performed using the Python bindings of the OpenCV [Bradski, 2000] library. This has been\n", "made easier to use through the module `fluidimage.calibration.calib_cv`. We shall use this module on a set of\n", "5 calibration images of a target which has a circle grid. The white dots on this particular target is evenly\n", - "spaced at `3 mm`. For the same camera position, the target'sworld coordinate `z` varies as `[-6, -3, 0, 3, 6]` mm.\n", - "\n", + "spaced at `3 mm`. For the same camera position, the target coordinate `z` varies as `[-6, -3, 0, 3, 6]` mm.\n", "\n", "We shall proceed as follows:\n", "\n", @@ -41,8 +40,8 @@ "from fluidimage import get_path_image_samples\n", "\n", "path = get_path_image_samples() / \"TomoPIV\" / \"calibration\" / \"cam0\"\n", - "calib_files = list(path.glob(\"*.tif\"))\n", - "calib_files" + "calib_files = sorted(path.glob(\"*.tif\"))\n", + "[path.name for path in calib_files]" ] }, { @@ -71,7 +70,7 @@ "\n", "def imshow(image, ax=plt):\n", " ax.imshow(image, cmap='gray', vmax=255)\n", - " \n", + "\n", "image = imread(str(calib_files[2])) # z = 0 image\n", "imshow(image)" ] @@ -150,7 +149,7 @@ "def find_origin(filename):\n", " params = SimpleCircleGrid.create_default_params()\n", " params.minArea = 18.\n", - " \n", + "\n", " circle_grid = SimpleCircleGrid(params)\n", "\n", " # Pass the filled image to detect the square\n", @@ -215,7 +214,7 @@ " image, origin, nx=7, ny=7, ds=50, debug=debug)\n", "\n", " return centers\n", - " \n", + "\n", "centers = construct_image_points(calib_files[2], debug=True)" ] }, @@ -289,7 +288,7 @@ "def calibrate_camera(cam=\"cam0\", debug=False):\n", " path_calib_h5 = path_output / (cam + \".h5\")\n", " calib = CalibCV(path_calib_h5)\n", - " \n", + "\n", " objpoints = []\n", " imgpoints = []\n", " zs = []\n", @@ -306,7 +305,7 @@ " )\n", " centers = construct_image_points(str(filename))\n", " imgpoints.append(centers)\n", - " \n", + "\n", " im_shape = imread(str(filename)).shape[::-1]\n", " origin = find_origin(str(files[2]))\n", " return calib.calibrate(imgpoints, objpoints, zs, im_shape, origin, debug)\n", @@ -367,7 +366,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -381,9 +380,9 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.0" + "version": "3.9.2" } }, "nbformat": 4, - "nbformat_minor": 2 -} \ No newline at end of file + "nbformat_minor": 4 +} diff --git a/doc/ipynb/tuto_stereo_reconstruction.ipynb b/doc/ipynb/tuto_stereo_reconstruction.ipynb index b19bb411..6c83e163 100644 --- a/doc/ipynb/tuto_stereo_reconstruction.ipynb +++ b/doc/ipynb/tuto_stereo_reconstruction.ipynb @@ -37,12 +37,12 @@ "source": [ "def make_calib_path(index_cam):\n", " path_cam = pathbase / f'E_Calibration_Images/Camera_0{index_cam}'\n", - " path = path_cam / f'calib{index_cam}.npy'\n", + " path = path_cam / f'calib{index_cam}.npz'\n", " if not os.path.exists(path):\n", " # we need to create this calib file.\n", " from fluidimage.calibration import CalibDirect\n", " calib = CalibDirect(\n", - " glob_str_xml=str(path_cam / 'img*.xml'), \n", + " glob_str_xml=str(path_cam / 'img*.xml'),\n", " shape_img=(1024, 1024))\n", " calib.compute_interpolents()\n", " nb_lines_x, nb_lines_y = 64, 64\n", diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 00000000..7448f230 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,44 @@ +FROM python:3.9 +LABEL Pierre Augier + +RUN apt-get update + +# also include utilities for debugging +RUN apt-get install -y --no-install-recommends \ + clang \ + emacs vim \ + meld less \ + # python3-pip is for Mercurial (hg-git, hg-evolve) + mercurial python3-pip git +RUN apt-get install -y --no-install-recommends \ + rsync \ + libgl1 xvfb xauth libgl1-mesa-dev \ + libxkbcommon-x11-0 \ + sudo graphviz + +RUN rm -rf /var/lib/apt/lists/* + +RUN groupadd -g 1000 appuser && useradd -m -r -u 1000 -g appuser -s /bin/bash appuser -s /bin/bash && usermod -a -G sudo appuser +RUN echo appuser:appuser | chpasswd +USER appuser +ARG HOME=/home/appuser +RUN mkdir -p $HOME/opt +WORKDIR $HOME/opt +RUN echo $USER $HOME $PWD && whoami + +ENV PIP_BREAK_SYSTEM_PACKAGES=1 + +RUN $(hg debuginstall -T '{pythonexe}') -m pip install hg-evolve hg-git --no-cache-dir --user + +COPY --chown=appuser:appuser docker/hgrc $HOME/.hgrc +COPY --chown=appuser:appuser docker/pythranrc $HOME/.pythranrc + +RUN mkdir -p $HOME/.local/include +RUN mkdir -p $HOME/.local/lib + +ENV PATH=$HOME/.local/bin:$PATH + +RUN mkdir -p $HOME/.config/matplotlib +RUN echo 'backend : agg' > $HOME/.config/matplotlib/matplotlibrc + +RUN python -m pip install -U pip pdm nox --user diff --git a/docker/Makefile b/docker/Makefile new file mode 100644 index 00000000..4f081828 --- /dev/null +++ b/docker/Makefile @@ -0,0 +1,49 @@ +image := image-fluidimage +tag := $(shell date -I'date'| tr -d "[:punct:]") + +define STR_HELP +This makefile can be used to build images and start containers. + +Examples +-------- +$ make start # starts Docker service +$ make pull # pulls a Docker image fron Docker hub +$ make build # by default builds python3-stable image +$ make run +$ make build image=python3-stable +$ make cleanall # clean (unnecessary, not all) containers and images + +endef + +export STR_HELP + +.PHONY: help + +help: + @echo "$$STR_HELP" + +start: + systemctl start docker + +build: + docker build -f Dockerfile -t fluiddyn/$(image) .. + docker tag fluiddyn/$(image) fluiddyn/$(image):$(tag) + +list: + @printf "\nImages: " + docker images + @printf "\nContainers: " + docker ps + +cleancontainers: + @echo "Clean exited containers." + for cont in $$(docker ps -a | awk 'NR>1{print $$1}'); do docker stop $$cont; docker rm $$cont; done + +cleanimages: + @echo "Clean dangling images with no tag." + for img in $$(docker images -qf "dangling=true"); do docker rmi -f $$img; done + +cleanall: cleancontainers cleanimages cleanmako + +run: + docker run --name $(image) --restart always -it fluiddyn/$(image) bash diff --git a/docker/hgrc b/docker/hgrc new file mode 100644 index 00000000..31f4fdfc --- /dev/null +++ b/docker/hgrc @@ -0,0 +1,34 @@ +# example user config (see 'hg help config' for more info) +[ui] +# name and email, e.g. +# username = Jane Doe +username = appuser +editor = emacs -nw -Q + +# We recommend enabling tweakdefaults to get slight improvements to +# the UI over time. Make sure to set HGPLAIN in the environment when +# writing scripts! +tweakdefaults = True + +[extensions] +# uncomment these lines to enable some popular extensions +# (see 'hg help extensions' for more info) +# +churn = +shelve = +hgext.extdiff = +rebase = +absorb = +evolve = +topic = +hggit = + +[extdiff] +cmd.meld = + +[trusted] +users = root + +[alias] +lg = log -G +up = up -v diff --git a/docker/pythranrc b/docker/pythranrc new file mode 100644 index 00000000..71e26e0b --- /dev/null +++ b/docker/pythranrc @@ -0,0 +1,7 @@ +[pythran] +complex_hook = True + +[compiler] +CXX=clang++ +CC=clang +blas=openblas diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 47adf40b..00000000 --- a/environment.yml +++ /dev/null @@ -1,14 +0,0 @@ - -channels: - - conda-forge - -dependencies: - - python=3.6 - - numpy - - scipy - - mpi4py - - h5py - - jupyter - - matplotlib - - fftw - - pyfftw diff --git a/fluidimage/_version.py b/fluidimage/_version.py deleted file mode 100644 index 178907a5..00000000 --- a/fluidimage/_version.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Module where the version is written. - -It is executed in setup.py and imported in fluidimage/__init__.py. - -See: - -http://en.wikipedia.org/wiki/Software_versioning -http://legacy.python.org/dev/peps/pep-0386/ - -'a' or 'alpha' means alpha version (internal testing), -'b' or 'beta' means beta version (external testing). -""" -__version__ = "0.1.5" - -try: - from fluidimage._hg_rev import hg_rev -except ImportError: - hg_rev = "?" diff --git a/fluidimage/gui/launcher/Makefile b/fluidimage/gui/launcher/Makefile deleted file mode 100644 index bb8f2e49..00000000 --- a/fluidimage/gui/launcher/Makefile +++ /dev/null @@ -1,20 +0,0 @@ - -# PYQT=PyQt4 -# PATHPyQt4 = $(shell python -c "import $(PYQT); print($(PYQT).__file__.split('$(PYQT)')[0] + '$(PYQT)')") - -UI_FILES = $(wildcard *.ui) -PY_FILES = $(UI_FILES:.ui=.py) - -.PHONY: run clean - -run: $(PY_FILES) - python -m fluidimage.gui.launcher.main - -ui2py: $(PY_FILES) - -clean: - rm -f $(PY_FILES) - -%.py: %.ui - # python $(PATHPyQt4)/uic/pyuic.py $(notdir $<) -o $@ - pyuic5 $(notdir $<) -o $@ diff --git a/fluidimage/gui/launcher/mainwindow.py b/fluidimage/gui/launcher/mainwindow.py deleted file mode 100644 index 586470fe..00000000 --- a/fluidimage/gui/launcher/mainwindow.py +++ /dev/null @@ -1,60 +0,0 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'mainwindow.ui' -# -# Created by: PyQt5 UI code generator 5.6 -# -# WARNING! All changes made in this file will be lost! - -# !!! Changed by hand to get the tests working !!! -# before it was `from PyQt5 ...` -from matplotlib.backends.qt_compat import QtCore, QtGui, QtWidgets - - -class Ui_MainWindow: - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(775, 901) - self.centralwidget = QtWidgets.QWidget(MainWindow) - self.centralwidget.setObjectName("centralwidget") - self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget) - self.verticalLayout_2.setObjectName("verticalLayout_2") - MainWindow.setCentralWidget(self.centralwidget) - self.menubar = QtWidgets.QMenuBar(MainWindow) - self.menubar.setGeometry(QtCore.QRect(0, 0, 775, 24)) - self.menubar.setObjectName("menubar") - self.menuFile = QtWidgets.QMenu(self.menubar) - self.menuFile.setObjectName("menuFile") - self.menuTopologies = QtWidgets.QMenu(self.menubar) - self.menuTopologies.setObjectName("menuTopologies") - self.menuComputations = QtWidgets.QMenu(self.menubar) - self.menuComputations.setObjectName("menuComputations") - MainWindow.setMenuBar(self.menubar) - self.statusbar = QtWidgets.QStatusBar(MainWindow) - self.statusbar.setObjectName("statusbar") - MainWindow.setStatusBar(self.statusbar) - self.actionOpen = QtWidgets.QAction(MainWindow) - self.actionOpen.setObjectName("actionOpen") - self.actionTopologyPIV = QtWidgets.QAction(MainWindow) - self.actionTopologyPIV.setObjectName("actionTopologyPIV") - self.actionTopologyPreproc = QtWidgets.QAction(MainWindow) - self.actionTopologyPreproc.setObjectName("actionTopologyPreproc") - self.menuFile.addAction(self.actionOpen) - self.menubar.addAction(self.menuFile.menuAction()) - self.menubar.addAction(self.menuTopologies.menuAction()) - self.menubar.addAction(self.menuComputations.menuAction()) - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) - self.menuFile.setTitle(_translate("MainWindow", "File")) - self.menuTopologies.setTitle(_translate("MainWindow", "Topologies")) - self.menuComputations.setTitle(_translate("MainWindow", "Computations")) - self.actionOpen.setText(_translate("MainWindow", "Open")) - self.actionTopologyPIV.setText(_translate("MainWindow", "TopologyPIV")) - self.actionTopologyPreproc.setText( - _translate("MainWindow", "TopologyPreproc") - ) diff --git a/meson.build b/meson.build new file mode 100644 index 00000000..50f259e0 --- /dev/null +++ b/meson.build @@ -0,0 +1,67 @@ +project( + 'fluidimage', + 'cpp', + license: 'CeCILL', + meson_version: '>= 1.1.0', + default_options: [ + 'buildtype=release', + 'cpp_std=c++11', + ], +) + +# https://mesonbuild.com/Python-module.html +py_mod = import('python') +py = py_mod.find_installation('python3', pure: false) +py_dep = py.dependency() + +backend = get_option('transonic-backend') + +if backend.contains(',') + backends = backend.split(',') +else + backends = [backend] +endif + +use_pythran = backend.contains('pythran') +if use_pythran + incdir_numpy = run_command('transonic-get-include', 'numpy', check: true).stdout().strip() + inc_np = include_directories(incdir_numpy) + np_dep = declare_dependency(include_directories: inc_np) + + incdir_pythran = run_command('transonic-get-include', 'pythran', check: true).stdout().strip() + pythran = find_program('pythran', native: true) + + cpp_args_pythran = [ + '-DENABLE_PYTHON_MODULE', + '-D__PYTHRAN__=3', + '-DPYTHRAN_BLAS_NONE' + ] + + if get_option('use-xsimd') == true + # xsimd is unvendored from pythran by conda-forge, and due to a compiler + # activation bug the default /include/ may not be visible (see + # gh-15698). Hence look for xsimd explicitly. + xsimd_dep = dependency('xsimd', required: false) + pythran_dep = declare_dependency( + include_directories: incdir_pythran, + dependencies: xsimd_dep, + ) + cpp_args_pythran += ['-DUSE_XSIMD'] + else + pythran_dep = declare_dependency( + include_directories: incdir_pythran, + ) + endif + + pythran_complex_hook = get_option('pythran-complex-hook') + if pythran_complex_hook == 'os-dependent' + pythran_complex_hook = host_machine.system() == 'linux' + endif + + if get_option('native') + cpp_args_pythran += ['-march=native', '-Ofast'] + endif + +endif + +subdir('src/fluidimage') diff --git a/meson.options b/meson.options new file mode 100644 index 00000000..a543b9fe --- /dev/null +++ b/meson.options @@ -0,0 +1,27 @@ +option( + 'transonic-backend', + type: 'string', + value: 'pythran,python,numba', + description: + 'pythran,python,numba (default), cython, numpy, numba; ' + + 'or comma separated value representing multi-backends', +) +option( + 'native', + type: 'boolean', + value: false, + description: 'Performance oriented and not portable build', +) +option( + 'use-xsimd', + type: 'boolean', + value: true, + description: 'Turns on xsimd vectorization', +) +option( + 'pythran-complex-hook', + type: 'combo', + choices: ['os-dependent', 'true', 'false'], + value: 'os-dependent', + description: 'Pythran complex_hook option', +) diff --git a/noxfile.py b/noxfile.py index 47cf57d0..a66d5183 100644 --- a/noxfile.py +++ b/noxfile.py @@ -15,90 +15,57 @@ execute ``make list-sessions```` or ``nox -l`` for a list of sessions. """ -import re -import shlex -from pathlib import Path -from functools import partial -import nox +import os -PACKAGE = "snek5000" -CWD = Path.cwd() +from datetime import timedelta +from functools import partial +from pathlib import Path +from time import time -if (CWD / "poetry.lock").exists(): - BUILD_SYSTEM = "poetry" - PACKAGE_SPEC = "pyproject.toml" -else: - BUILD_SYSTEM = "setuptools" - PACKAGE_SPEC = "setup.cfg" +import nox TEST_ENV_VARS = {"OMP_NUM_THREADS": "1"} -EXTRA_REQUIRES = ("main", "doc", "test", "dev") - - -@nox.session(name="pip-compile", reuse_venv=True) -@nox.parametrize( - "extra", [nox.param(extra, id=extra) for extra in EXTRA_REQUIRES] -) -def pip_compile(session, extra): - """Pin dependencies to requirements/*.txt - - How to run all:: - - pipx install nox - nox -s pip-compile - - """ - session.install("pip-tools") - req = Path("requirements") - if extra == "main": - in_extra = "" - in_file = "" - else: - in_extra = f"--extra {extra}" - in_file = req / "vcs_packages.in" - - out_file = req / f"{extra}.txt" +no_venv_session = partial(nox.session, venv_backend="none") +os.environ.update({"PDM_IGNORE_SAVED_PYTHON": "1"}) +nox.options.sessions = ["test-cov"] +nox.options.reuse_existing_virtualenvs = 1 - session.run( - *shlex.split( - "python -m piptools compile --resolver backtracking --quiet " - f"{in_extra} {in_file} {PACKAGE_SPEC} " - f"-o {out_file}" - ), - *session.posargs, - ) - session.log(f"Removing absolute paths from {out_file}") - packages = out_file.read_text() - rel_path_packages = packages.replace( - "file://" + str(Path.cwd().resolve()), "." +@nox.session +def validate_code(session): + session.run_always( + "pdm", "sync", "--clean", "-G", "dev", "--no-self", external=True ) + session.run("pdm", "validate_code", external=True) - if extra == "tests": - tests_editable = out_file.parent / out_file.name.replace( - "tests", "tests-editable" - ) - session.log(f"Copying {out_file} with -e flag in {tests_editable}") - tests_editable.write_text(rel_path_packages) - session.log(f"Removing -e flag in {out_file}") - rel_path_packages = re.sub(r"^-e\ \.", ".", rel_path_packages, flags=re.M) - - session.log(f"Writing {out_file}") - out_file.write_text(rel_path_packages) +class TimePrinter: + def __init__(self): + self.time_start = self.time_last = time() -no_venv_session = partial(nox.session, venv_backend="none") -nox.options.sessions = ["tests"] + def __call__(self, task: str): + time_now = time() + if self.time_start != self.time_last: + print( + f"Time for {task}: {timedelta(seconds=time_now - self.time_last)}" + ) + print( + f"Session started since {timedelta(seconds=time_now - self.time_start)}" + ) + self.time_last = time_now @nox.session -def tests(session): +def test(session): """Execute unit-tests using pytest""" - session.install("-r", "requirements/test.txt") + command = "pdm sync --clean -G test -G qt --no-self" + session.run_always(*command.split(), external=True) + session.install(".", "--no-deps") + session.run( "python", "-m", @@ -108,14 +75,13 @@ def tests(session): ) -@no_venv_session(name="tests-cov") -def tests_cov(session): +@no_venv_session(name="test-cov") +def test_cov(session): """Execute unit-tests using pytest+pytest-cov""" session.notify( - "tests", + "test", [ "--cov", - # "--cov-config=setup.cfg", "--no-cov-on-fail", "--cov-report=term-missing", *session.posargs, @@ -123,12 +89,80 @@ def tests_cov(session): ) -@nox.session(name="coverage-html") -def coverage_html(session, nox=False): - """Generate coverage report in HTML. Requires `tests-cov` session.""" - report = Path.cwd() / ".coverage" / "html" / "index.html" - session.install("coverage[toml]") - session.run("coverage", "html") +@nox.session +def doc(session): + """Build the documentation""" + print_times = TimePrinter() + command = "pdm sync -G doc -G opencv --no-self" + session.run_always(*command.split(), external=True) + print_times("pdm sync") + + session.install( + ".", "-C", "setup-args=-Dtransonic-backend=python", "--no-deps" + ) + print_times("install self") + + session.chdir("doc") + session.run("make", "cleanall", external=True) + session.run("make", external=True) + print_times("make doc") + + +def _get_version_from_pyproject(path=Path.cwd()): + if isinstance(path, str): + path = Path(path) + + if path.name != "pyproject.toml": + path /= "pyproject.toml" + + in_project = False + version = None + with open(path, encoding="utf-8") as file: + for line in file: + if line.startswith("[project]"): + in_project = True + if line.startswith("version =") and in_project: + version = line.split("=")[1].strip() + version = version[1:-1] + break + + assert version is not None + return version + + +@nox.session(name="add-tag-for-release", venv_backend="none") +def add_tag_for_release(session): + """Add a tag to the repo for a new version""" + session.run("hg", "pull", external=True) + + result = session.run( + *"hg log -r default -G".split(), external=True, silent=True + ) + if result[0] != "@": + session.run("hg", "update", "default", external=True) + + version = _get_version_from_pyproject() + version_core = _get_version_from_pyproject("lib") + + print(f"{version = }, {version_core = }") + if version != version_core: + session.error("version != version_core") + + result = session.run("hg", "tags", "-T", "{tag},", external=True, silent=True) + last_tag = result.split(",", 2)[1] + print(f"{last_tag = }") + + if last_tag == version: + session.error("last_tag == version") + + answer = input( + f'Do you really want to add and push the new tag "{version}"? (yes/[no]) ' + ) + + if answer != "yes": + print("Maybe next time then. Bye!") + return - print("Code coverage analysis complete. View detailed report:") - print(f"file://{report}") + print("Let's go!") + session.run("hg", "tag", version, external=True) + session.run("hg", "push", external=True) diff --git a/pdm.lock b/pdm.lock new file mode 100644 index 00000000..88885209 --- /dev/null +++ b/pdm.lock @@ -0,0 +1,3645 @@ +# This file is @generated by PDM. +# It is not intended for manual editing. + +[metadata] +groups = ["default", "build", "dev", "doc", "opencv", "pims", "test"] +strategy = ["cross_platform", "inherit_metadata"] +lock_version = "4.4.1" +content_hash = "sha256:5906b55ac62cff1d16936f86be16b07f474de091161f26de85fa4f97c9e5b5cd" + +[[package]] +name = "accessible-pygments" +version = "0.0.4" +summary = "A collection of accessible pygments styles" +groups = ["doc"] +dependencies = [ + "pygments>=1.5", +] +files = [ + {file = "accessible-pygments-0.0.4.tar.gz", hash = "sha256:e7b57a9b15958e9601c7e9eb07a440c813283545a20973f2574a5f453d0e953e"}, + {file = "accessible_pygments-0.0.4-py2.py3-none-any.whl", hash = "sha256:416c6d8c1ea1c5ad8701903a20fcedf953c6e720d64f33dc47bfb2d3f2fa4e8d"}, +] + +[[package]] +name = "alabaster" +version = "0.7.16" +requires_python = ">=3.9" +summary = "A light, configurable Sphinx theme" +groups = ["doc"] +files = [ + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, +] + +[[package]] +name = "anyio" +version = "4.2.0" +requires_python = ">=3.8" +summary = "High level compatibility layer for multiple asynchronous event loop implementations" +groups = ["doc"] +dependencies = [ + "exceptiongroup>=1.0.2; python_version < \"3.11\"", + "idna>=2.8", + "sniffio>=1.1", + "typing-extensions>=4.1; python_version < \"3.11\"", +] +files = [ + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +requires_python = ">=3.6" +summary = "Disable App Nap on macOS >= 10.9" +groups = ["doc"] +marker = "platform_system == \"Darwin\"" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +requires_python = ">=3.7" +summary = "Argon2 for Python" +groups = ["doc"] +dependencies = [ + "argon2-cffi-bindings", +] +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +requires_python = ">=3.6" +summary = "Low-level CFFI bindings for Argon2" +groups = ["doc"] +dependencies = [ + "cffi>=1.0.1", +] +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[[package]] +name = "arrow" +version = "1.3.0" +requires_python = ">=3.8" +summary = "Better dates & times for Python" +groups = ["doc"] +dependencies = [ + "python-dateutil>=2.7.0", + "types-python-dateutil>=2.8.10", +] +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[[package]] +name = "astroid" +version = "3.0.3" +requires_python = ">=3.8.0" +summary = "An abstract syntax tree for Python with inference support." +groups = ["dev"] +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.11\"", +] +files = [ + {file = "astroid-3.0.3-py3-none-any.whl", hash = "sha256:92fcf218b89f449cdf9f7b39a269f8d5d617b27be68434912e11e79203963a17"}, + {file = "astroid-3.0.3.tar.gz", hash = "sha256:4148645659b08b70d72460ed1921158027a9e53ae8b7234149b1400eddacbb93"}, +] + +[[package]] +name = "asttokens" +version = "2.4.1" +summary = "Annotate AST trees with source code positions" +groups = ["default", "doc", "test"] +dependencies = [ + "six>=1.12.0", +] +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[[package]] +name = "async-lru" +version = "2.0.4" +requires_python = ">=3.8" +summary = "Simple LRU cache for asyncio" +groups = ["doc"] +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.11\"", +] +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +requires_python = ">=3.7" +summary = "Classes Without Boilerplate" +groups = ["default", "doc", "test"] +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[[package]] +name = "autopep8" +version = "2.0.4" +requires_python = ">=3.6" +summary = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +groups = ["build", "default", "test"] +dependencies = [ + "pycodestyle>=2.10.0", + "tomli; python_version < \"3.11\"", +] +files = [ + {file = "autopep8-2.0.4-py2.py3-none-any.whl", hash = "sha256:067959ca4a07b24dbd5345efa8325f5f58da4298dab0dde0443d5ed765de80cb"}, + {file = "autopep8-2.0.4.tar.gz", hash = "sha256:2913064abd97b3419d1cc83ea71f042cb821f87e45b9c88cad5ad3c4ea87fe0c"}, +] + +[[package]] +name = "babel" +version = "2.14.0" +requires_python = ">=3.7" +summary = "Internationalization utilities" +groups = ["doc"] +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +requires_python = ">=3.6.0" +summary = "Screen-scraping library" +groups = ["doc"] +dependencies = [ + "soupsieve>1.2", +] +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[[package]] +name = "beniget" +version = "0.4.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Extract semantic information about static Python code" +groups = ["build", "default", "test"] +dependencies = [ + "gast~=0.5.0", +] +files = [ + {file = "beniget-0.4.1-py3-none-any.whl", hash = "sha256:cb061256631313f9d06031b824f7f403baecaf609b2d3d14d43f23356cf143f2"}, + {file = "beniget-0.4.1.tar.gz", hash = "sha256:75554b3b8ad0553ce2f607627dad3d95c60c441189875b98e097528f8e23ac0c"}, +] + +[[package]] +name = "black" +version = "24.2.0" +requires_python = ">=3.8" +summary = "The uncompromising code formatter." +groups = ["dev"] +dependencies = [ + "click>=8.0.0", + "mypy-extensions>=0.4.3", + "packaging>=22.0", + "pathspec>=0.9.0", + "platformdirs>=2", + "tomli>=1.1.0; python_version < \"3.11\"", + "typing-extensions>=4.0.1; python_version < \"3.11\"", +] +files = [ + {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, + {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, + {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, + {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, + {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, + {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, + {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, + {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, + {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, + {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, + {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, + {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, + {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, + {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, + {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, + {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, + {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, + {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, +] + +[[package]] +name = "bleach" +version = "6.1.0" +requires_python = ">=3.8" +summary = "An easy safelist-based HTML-sanitizing tool." +groups = ["doc"] +dependencies = [ + "six>=1.9.0", + "webencodings", +] +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +requires_python = ">=3.6" +summary = "Python package for providing Mozilla's CA Bundle." +groups = ["doc"] +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +requires_python = ">=3.8" +summary = "Foreign Function Interface for Python calling C code." +groups = ["default", "doc", "test"] +dependencies = [ + "pycparser", +] +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +requires_python = ">=3.7.0" +summary = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +groups = ["doc"] +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +requires_python = ">=3.7" +summary = "Composable command line interface toolkit" +groups = ["default", "dev", "doc", "test"] +dependencies = [ + "colorama; platform_system == \"Windows\"", +] +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[[package]] +name = "cloudpickle" +version = "3.0.0" +requires_python = ">=3.8" +summary = "Pickler class to extend the standard pickle.Pickler functionality" +groups = ["default", "test"] +files = [ + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +summary = "Cross-platform colored terminal text." +groups = ["build", "default", "dev", "doc", "test"] +marker = "sys_platform == \"win32\" or os_name == \"nt\" or platform_system == \"Windows\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.1" +requires_python = ">=3.8" +summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +groups = ["doc"] +dependencies = [ + "traitlets>=4", +] +files = [ + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, +] + +[[package]] +name = "contourpy" +version = "1.2.0" +requires_python = ">=3.9" +summary = "Python library for calculating contours of 2D quadrilateral grids" +groups = ["default", "test"] +dependencies = [ + "numpy<2.0,>=1.20", +] +files = [ + {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"}, + {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"}, + {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"}, + {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"}, + {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"}, + {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"}, + {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"}, + {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"}, + {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"}, + {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"}, + {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"}, + {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"}, + {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"}, + {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"}, + {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"}, + {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"}, + {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"}, + {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"}, + {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"}, + {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"}, + {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"}, + {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"}, + {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"}, +] + +[[package]] +name = "coverage" +version = "7.4.1" +requires_python = ">=3.8" +summary = "Code coverage measurement for Python" +groups = ["test"] +files = [ + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, +] + +[[package]] +name = "coverage" +version = "7.4.1" +extras = ["toml"] +requires_python = ">=3.8" +summary = "Code coverage measurement for Python" +groups = ["test"] +dependencies = [ + "coverage==7.4.1", + "tomli; python_full_version <= \"3.11.0a6\"", +] +files = [ + {file = "coverage-7.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:077d366e724f24fc02dbfe9d946534357fda71af9764ff99d73c3c596001bbd7"}, + {file = "coverage-7.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0193657651f5399d433c92f8ae264aff31fc1d066deee4b831549526433f3f61"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d17bbc946f52ca67adf72a5ee783cd7cd3477f8f8796f59b4974a9b59cacc9ee"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3277f5fa7483c927fe3a7b017b39351610265308f5267ac6d4c2b64cc1d8d25"}, + {file = "coverage-7.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dceb61d40cbfcf45f51e59933c784a50846dc03211054bd76b421a713dcdf19"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6008adeca04a445ea6ef31b2cbaf1d01d02986047606f7da266629afee982630"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c61f66d93d712f6e03369b6a7769233bfda880b12f417eefdd4f16d1deb2fc4c"}, + {file = "coverage-7.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9bb62fac84d5f2ff523304e59e5c439955fb3b7f44e3d7b2085184db74d733b"}, + {file = "coverage-7.4.1-cp310-cp310-win32.whl", hash = "sha256:f86f368e1c7ce897bf2457b9eb61169a44e2ef797099fb5728482b8d69f3f016"}, + {file = "coverage-7.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:869b5046d41abfea3e381dd143407b0d29b8282a904a19cb908fa24d090cc018"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b8ffb498a83d7e0305968289441914154fb0ef5d8b3157df02a90c6695978295"}, + {file = "coverage-7.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3cacfaefe6089d477264001f90f55b7881ba615953414999c46cc9713ff93c8c"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d6850e6e36e332d5511a48a251790ddc545e16e8beaf046c03985c69ccb2676"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18e961aa13b6d47f758cc5879383d27b5b3f3dcd9ce8cdbfdc2571fe86feb4dd"}, + {file = "coverage-7.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfd1e1b9f0898817babf840b77ce9fe655ecbe8b1b327983df485b30df8cc011"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6b00e21f86598b6330f0019b40fb397e705135040dbedc2ca9a93c7441178e74"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:536d609c6963c50055bab766d9951b6c394759190d03311f3e9fcf194ca909e1"}, + {file = "coverage-7.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ac8f8eb153724f84885a1374999b7e45734bf93a87d8df1e7ce2146860edef6"}, + {file = "coverage-7.4.1-cp311-cp311-win32.whl", hash = "sha256:f3771b23bb3675a06f5d885c3630b1d01ea6cac9e84a01aaf5508706dba546c5"}, + {file = "coverage-7.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:9d2f9d4cc2a53b38cabc2d6d80f7f9b7e3da26b2f53d48f05876fef7956b6968"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f68ef3660677e6624c8cace943e4765545f8191313a07288a53d3da188bd8581"}, + {file = "coverage-7.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23b27b8a698e749b61809fb637eb98ebf0e505710ec46a8aa6f1be7dc0dc43a6"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e3424c554391dc9ef4a92ad28665756566a28fecf47308f91841f6c49288e66"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0860a348bf7004c812c8368d1fc7f77fe8e4c095d661a579196a9533778e156"}, + {file = "coverage-7.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe558371c1bdf3b8fa03e097c523fb9645b8730399c14fe7721ee9c9e2a545d3"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3468cc8720402af37b6c6e7e2a9cdb9f6c16c728638a2ebc768ba1ef6f26c3a1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:02f2edb575d62172aa28fe00efe821ae31f25dc3d589055b3fb64d51e52e4ab1"}, + {file = "coverage-7.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ca6e61dc52f601d1d224526360cdeab0d0712ec104a2ce6cc5ccef6ed9a233bc"}, + {file = "coverage-7.4.1-cp312-cp312-win32.whl", hash = "sha256:ca7b26a5e456a843b9b6683eada193fc1f65c761b3a473941efe5a291f604c74"}, + {file = "coverage-7.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:85ccc5fa54c2ed64bd91ed3b4a627b9cce04646a659512a051fa82a92c04a448"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e738a492b6221f8dcf281b67129510835461132b03024830ac0e554311a5c54"}, + {file = "coverage-7.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:46342fed0fff72efcda77040b14728049200cbba1279e0bf1188f1f2078c1d70"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9641e21670c68c7e57d2053ddf6c443e4f0a6e18e547e86af3fad0795414a628"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aeb2c2688ed93b027eb0d26aa188ada34acb22dceea256d76390eea135083950"}, + {file = "coverage-7.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12c923757de24e4e2110cf8832d83a886a4cf215c6e61ed506006872b43a6d1"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0491275c3b9971cdbd28a4595c2cb5838f08036bca31765bad5e17edf900b2c7"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8dfc5e195bbef80aabd81596ef52a1277ee7143fe419efc3c4d8ba2754671756"}, + {file = "coverage-7.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1a78b656a4d12b0490ca72651fe4d9f5e07e3c6461063a9b6265ee45eb2bdd35"}, + {file = "coverage-7.4.1-cp39-cp39-win32.whl", hash = "sha256:f90515974b39f4dea2f27c0959688621b46d96d5a626cf9c53dbc653a895c05c"}, + {file = "coverage-7.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:64e723ca82a84053dd7bfcc986bdb34af8d9da83c521c19d6b472bc6880e191a"}, + {file = "coverage-7.4.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:32a8d985462e37cfdab611a6f95b09d7c091d07668fdc26e47a725ee575fe166"}, + {file = "coverage-7.4.1.tar.gz", hash = "sha256:1ed4b95480952b1a26d863e546fa5094564aa0065e1e5f0d4d0041f293251d04"}, +] + +[[package]] +name = "cycler" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Composable style cycles" +groups = ["default", "test"] +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[[package]] +name = "dask" +version = "2024.2.0" +requires_python = ">=3.9" +summary = "Parallel PyData with Task Scheduling" +groups = ["default", "test"] +dependencies = [ + "click>=8.1", + "cloudpickle>=1.5.0", + "fsspec>=2021.09.0", + "importlib-metadata>=4.13.0", + "packaging>=20.0", + "partd>=1.2.0", + "pyyaml>=5.3.1", + "toolz>=0.10.0", +] +files = [ + {file = "dask-2024.2.0-py3-none-any.whl", hash = "sha256:439efe5479a102d4d2712d69a52458e6c1e78b96c7020976399ce249097caf48"}, + {file = "dask-2024.2.0.tar.gz", hash = "sha256:7ab6e8a2c1e256a4c930f2996c652f057239dee49e1c5c4742f351efe6deecd1"}, +] + +[[package]] +name = "dask" +version = "2024.2.0" +extras = ["array"] +requires_python = ">=3.9" +summary = "Parallel PyData with Task Scheduling" +groups = ["default", "test"] +dependencies = [ + "dask==2024.2.0", + "numpy>=1.21", +] +files = [ + {file = "dask-2024.2.0-py3-none-any.whl", hash = "sha256:439efe5479a102d4d2712d69a52458e6c1e78b96c7020976399ce249097caf48"}, + {file = "dask-2024.2.0.tar.gz", hash = "sha256:7ab6e8a2c1e256a4c930f2996c652f057239dee49e1c5c4742f351efe6deecd1"}, +] + +[[package]] +name = "debugpy" +version = "1.8.1" +requires_python = ">=3.8" +summary = "An implementation of the Debug Adapter Protocol for Python" +groups = ["doc"] +files = [ + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +requires_python = ">=3.5" +summary = "Decorators for Humans" +groups = ["default", "doc", "test"] +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "XML bomb protection for Python stdlib modules" +groups = ["doc"] +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "dill" +version = "0.3.8" +requires_python = ">=3.8" +summary = "serialize all of Python" +groups = ["dev"] +files = [ + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, +] + +[[package]] +name = "distro" +version = "1.9.0" +requires_python = ">=3.6" +summary = "Distro - an OS platform information API" +groups = ["default", "test"] +files = [ + {file = "distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2"}, + {file = "distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed"}, +] + +[[package]] +name = "docutils" +version = "0.20.1" +requires_python = ">=3.7" +summary = "Docutils -- Python Documentation Utilities" +groups = ["doc"] +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +requires_python = ">=3.7" +summary = "Backport of PEP 654 (exception groups)" +groups = ["default", "doc", "test"] +marker = "python_version < \"3.11\"" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[[package]] +name = "executing" +version = "2.0.1" +requires_python = ">=3.5" +summary = "Get the currently executing AST node of a frame, and other information" +groups = ["default", "doc", "test"] +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[[package]] +name = "fastjsonschema" +version = "2.19.1" +summary = "Fastest Python implementation of JSON schema" +groups = ["doc"] +files = [ + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, +] + +[[package]] +name = "fluiddyn" +version = "0.5.3" +requires_python = ">=3.9" +summary = "Framework for studying fluid dynamics." +groups = ["default", "test"] +dependencies = [ + "distro", + "h5netcdf", + "h5py", + "matplotlib", + "numpy", + "psutil>=5.2.1", + "qtpy", +] +files = [ + {file = "fluiddyn-0.5.3-py3-none-any.whl", hash = "sha256:f21a7563d1447102b6f6cc3f1bcf071e7bce27c7a8130e7c1ac6ba55c0620f50"}, + {file = "fluiddyn-0.5.3.tar.gz", hash = "sha256:75a3f9640716a686a87337c615ecd6b9dc88f8dd797f407863e3a995645f0513"}, +] + +[[package]] +name = "fonttools" +version = "4.49.0" +requires_python = ">=3.8" +summary = "Tools to manipulate font files" +groups = ["default", "test"] +files = [ + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d970ecca0aac90d399e458f0b7a8a597e08f95de021f17785fb68e2dc0b99717"}, + {file = "fonttools-4.49.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac9a745b7609f489faa65e1dc842168c18530874a5f5b742ac3dd79e26bca8bc"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ba0e00620ca28d4ca11fc700806fd69144b463aa3275e1b36e56c7c09915559"}, + {file = "fonttools-4.49.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdee3ab220283057e7840d5fb768ad4c2ebe65bdba6f75d5d7bf47f4e0ed7d29"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ce7033cb61f2bb65d8849658d3786188afd80f53dad8366a7232654804529532"}, + {file = "fonttools-4.49.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07bc5ea02bb7bc3aa40a1eb0481ce20e8d9b9642a9536cde0218290dd6085828"}, + {file = "fonttools-4.49.0-cp310-cp310-win32.whl", hash = "sha256:86eef6aab7fd7c6c8545f3ebd00fd1d6729ca1f63b0cb4d621bccb7d1d1c852b"}, + {file = "fonttools-4.49.0-cp310-cp310-win_amd64.whl", hash = "sha256:1fac1b7eebfce75ea663e860e7c5b4a8831b858c17acd68263bc156125201abf"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:edc0cce355984bb3c1d1e89d6a661934d39586bb32191ebff98c600f8957c63e"}, + {file = "fonttools-4.49.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:83a0d9336de2cba86d886507dd6e0153df333ac787377325a39a2797ec529814"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36c8865bdb5cfeec88f5028e7e592370a0657b676c6f1d84a2108e0564f90e22"}, + {file = "fonttools-4.49.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33037d9e56e2562c710c8954d0f20d25b8386b397250d65581e544edc9d6b942"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8fb022d799b96df3eaa27263e9eea306bd3d437cc9aa981820850281a02b6c9a"}, + {file = "fonttools-4.49.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:33c584c0ef7dc54f5dd4f84082eabd8d09d1871a3d8ca2986b0c0c98165f8e86"}, + {file = "fonttools-4.49.0-cp311-cp311-win32.whl", hash = "sha256:cbe61b158deb09cffdd8540dc4a948d6e8f4d5b4f3bf5cd7db09bd6a61fee64e"}, + {file = "fonttools-4.49.0-cp311-cp311-win_amd64.whl", hash = "sha256:fc11e5114f3f978d0cea7e9853627935b30d451742eeb4239a81a677bdee6bf6"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d647a0e697e5daa98c87993726da8281c7233d9d4ffe410812a4896c7c57c075"}, + {file = "fonttools-4.49.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f3bbe672df03563d1f3a691ae531f2e31f84061724c319652039e5a70927167e"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bebd91041dda0d511b0d303180ed36e31f4f54b106b1259b69fade68413aa7ff"}, + {file = "fonttools-4.49.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4145f91531fd43c50f9eb893faa08399816bb0b13c425667c48475c9f3a2b9b5"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ea329dafb9670ffbdf4dbc3b0e5c264104abcd8441d56de77f06967f032943cb"}, + {file = "fonttools-4.49.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c076a9e548521ecc13d944b1d261ff3d7825048c338722a4bd126d22316087b7"}, + {file = "fonttools-4.49.0-cp312-cp312-win32.whl", hash = "sha256:b607ea1e96768d13be26d2b400d10d3ebd1456343eb5eaddd2f47d1c4bd00880"}, + {file = "fonttools-4.49.0-cp312-cp312-win_amd64.whl", hash = "sha256:a974c49a981e187381b9cc2c07c6b902d0079b88ff01aed34695ec5360767034"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:08877e355d3dde1c11973bb58d4acad1981e6d1140711230a4bfb40b2b937ccc"}, + {file = "fonttools-4.49.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fdb54b076f25d6b0f0298dc706acee5052de20c83530fa165b60d1f2e9cbe3cb"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0af65c720520710cc01c293f9c70bd69684365c6015cc3671db2b7d807fe51f2"}, + {file = "fonttools-4.49.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f255ce8ed7556658f6d23f6afd22a6d9bbc3edb9b96c96682124dc487e1bf42"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d00af0884c0e65f60dfaf9340e26658836b935052fdd0439952ae42e44fdd2be"}, + {file = "fonttools-4.49.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:263832fae27481d48dfafcc43174644b6706639661e242902ceb30553557e16c"}, + {file = "fonttools-4.49.0-cp39-cp39-win32.whl", hash = "sha256:0404faea044577a01bb82d47a8fa4bc7a54067fa7e324785dd65d200d6dd1133"}, + {file = "fonttools-4.49.0-cp39-cp39-win_amd64.whl", hash = "sha256:b050d362df50fc6e38ae3954d8c29bf2da52be384649ee8245fdb5186b620836"}, + {file = "fonttools-4.49.0-py3-none-any.whl", hash = "sha256:af281525e5dd7fa0b39fb1667b8d5ca0e2a9079967e14c4bfe90fd1cd13e0f18"}, + {file = "fonttools-4.49.0.tar.gz", hash = "sha256:ebf46e7f01b7af7861310417d7c49591a85d99146fc23a5ba82fdb28af156321"}, +] + +[[package]] +name = "fqdn" +version = "1.5.1" +requires_python = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +summary = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +groups = ["doc"] +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "fsspec" +version = "2024.2.0" +requires_python = ">=3.8" +summary = "File-system specification" +groups = ["default", "test"] +files = [ + {file = "fsspec-2024.2.0-py3-none-any.whl", hash = "sha256:817f969556fa5916bc682e02ca2045f96ff7f586d45110fcb76022063ad2c7d8"}, + {file = "fsspec-2024.2.0.tar.gz", hash = "sha256:b6ad1a679f760dda52b1168c859d01b7b80648ea6f7f7c7f5a8a91dc3f3ecb84"}, +] + +[[package]] +name = "gast" +version = "0.5.4" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Python AST that abstracts the underlying Python version" +groups = ["build", "default", "test"] +files = [ + {file = "gast-0.5.4-py3-none-any.whl", hash = "sha256:6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316"}, + {file = "gast-0.5.4.tar.gz", hash = "sha256:9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97"}, +] + +[[package]] +name = "greenlet" +version = "3.0.3" +requires_python = ">=3.7" +summary = "Lightweight in-process concurrent programming" +groups = ["doc"] +marker = "platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\"" +files = [ + {file = "greenlet-3.0.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:9da2bd29ed9e4f15955dd1595ad7bc9320308a3b766ef7f837e23ad4b4aac31a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d353cadd6083fdb056bb46ed07e4340b0869c305c8ca54ef9da3421acbdf6881"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dca1e2f3ca00b84a396bc1bce13dd21f680f035314d2379c4160c98153b2059b"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3ed7fb269f15dc662787f4119ec300ad0702fa1b19d2135a37c2c4de6fadfd4a"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd4f49ae60e10adbc94b45c0b5e6a179acc1736cf7a90160b404076ee283cf83"}, + {file = "greenlet-3.0.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73a411ef564e0e097dbe7e866bb2dda0f027e072b04da387282b02c308807405"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7f362975f2d179f9e26928c5b517524e89dd48530a0202570d55ad6ca5d8a56f"}, + {file = "greenlet-3.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:649dde7de1a5eceb258f9cb00bdf50e978c9db1b996964cd80703614c86495eb"}, + {file = "greenlet-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:68834da854554926fbedd38c76e60c4a2e3198c6fbed520b106a8986445caaf9"}, + {file = "greenlet-3.0.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:b1b5667cced97081bf57b8fa1d6bfca67814b0afd38208d52538316e9422fc61"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52f59dd9c96ad2fc0d5724107444f76eb20aaccb675bf825df6435acb7703559"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:afaff6cf5200befd5cec055b07d1c0a5a06c040fe5ad148abcd11ba6ab9b114e"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe754d231288e1e64323cfad462fcee8f0288654c10bdf4f603a39ed923bef33"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2797aa5aedac23af156bbb5a6aa2cd3427ada2972c828244eb7d1b9255846379"}, + {file = "greenlet-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7f009caad047246ed379e1c4dbcb8b020f0a390667ea74d2387be2998f58a22"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c5e1536de2aad7bf62e27baf79225d0d64360d4168cf2e6becb91baf1ed074f3"}, + {file = "greenlet-3.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:894393ce10ceac937e56ec00bb71c4c2f8209ad516e96033e4b3b1de270e200d"}, + {file = "greenlet-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:1ea188d4f49089fc6fb283845ab18a2518d279c7cd9da1065d7a84e991748728"}, + {file = "greenlet-3.0.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:70fb482fdf2c707765ab5f0b6655e9cfcf3780d8d87355a063547b41177599be"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4d1ac74f5c0c0524e4a24335350edad7e5f03b9532da7ea4d3c54d527784f2e"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149e94a2dd82d19838fe4b2259f1b6b9957d5ba1b25640d2380bea9c5df37676"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:15d79dd26056573940fcb8c7413d84118086f2ec1a8acdfa854631084393efcc"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:881b7db1ebff4ba09aaaeae6aa491daeb226c8150fc20e836ad00041bcb11230"}, + {file = "greenlet-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fcd2469d6a2cf298f198f0487e0a5b1a47a42ca0fa4dfd1b6862c999f018ebbf"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1f672519db1796ca0d8753f9e78ec02355e862d0998193038c7073045899f305"}, + {file = "greenlet-3.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2516a9957eed41dd8f1ec0c604f1cdc86758b587d964668b5b196a9db5bfcde6"}, + {file = "greenlet-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:bba5387a6975598857d86de9eac14210a49d554a77eb8261cc68b7d082f78ce2"}, + {file = "greenlet-3.0.3-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:da70d4d51c8b306bb7a031d5cff6cc25ad253affe89b70352af5f1cb68e74b53"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086152f8fbc5955df88382e8a75984e2bb1c892ad2e3c80a2508954e52295257"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d73a9fe764d77f87f8ec26a0c85144d6a951a6c438dfe50487df5595c6373eac"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7dcbe92cc99f08c8dd11f930de4d99ef756c3591a5377d1d9cd7dd5e896da71"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1551a8195c0d4a68fac7a4325efac0d541b48def35feb49d803674ac32582f61"}, + {file = "greenlet-3.0.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:64d7675ad83578e3fc149b617a444fab8efdafc9385471f868eb5ff83e446b8b"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b37eef18ea55f2ffd8f00ff8fe7c8d3818abd3e25fb73fae2ca3b672e333a7a6"}, + {file = "greenlet-3.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:77457465d89b8263bca14759d7c1684df840b6811b2499838cc5b040a8b5b113"}, + {file = "greenlet-3.0.3-cp39-cp39-win32.whl", hash = "sha256:57e8974f23e47dac22b83436bdcf23080ade568ce77df33159e019d161ce1d1e"}, + {file = "greenlet-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c5ee858cfe08f34712f548c3c363e807e7186f03ad7a5039ebadb29e8c6be067"}, + {file = "greenlet-3.0.3.tar.gz", hash = "sha256:43374442353259554ce33599da8b692d5aa96f8976d567d4badf263371fbe491"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +requires_python = ">=3.7" +summary = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +groups = ["doc"] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h5netcdf" +version = "1.3.0" +requires_python = ">=3.9" +summary = "netCDF4 via h5py" +groups = ["default", "test"] +dependencies = [ + "h5py", + "packaging", +] +files = [ + {file = "h5netcdf-1.3.0-py3-none-any.whl", hash = "sha256:f2df69dcd3665dc9c4d43eb6529dedd113b2508090d12ac973573305a8406465"}, + {file = "h5netcdf-1.3.0.tar.gz", hash = "sha256:a171c027daeb34b24c24a3b6304195b8eabbb6f10c748256ed3cfe19806383cf"}, +] + +[[package]] +name = "h5py" +version = "3.10.0" +requires_python = ">=3.8" +summary = "Read and write HDF5 files from Python" +groups = ["default", "test"] +dependencies = [ + "numpy>=1.17.3", +] +files = [ + {file = "h5py-3.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f"}, + {file = "h5py-3.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03"}, + {file = "h5py-3.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d"}, + {file = "h5py-3.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc"}, + {file = "h5py-3.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7"}, + {file = "h5py-3.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52"}, + {file = "h5py-3.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3"}, + {file = "h5py-3.10.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20"}, + {file = "h5py-3.10.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039"}, + {file = "h5py-3.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52"}, + {file = "h5py-3.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824"}, + {file = "h5py-3.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229"}, + {file = "h5py-3.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770"}, + {file = "h5py-3.10.0.tar.gz", hash = "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049"}, +] + +[[package]] +name = "httpcore" +version = "1.0.3" +requires_python = ">=3.8" +summary = "A minimal low-level HTTP client." +groups = ["doc"] +dependencies = [ + "certifi", + "h11<0.15,>=0.13", +] +files = [ + {file = "httpcore-1.0.3-py3-none-any.whl", hash = "sha256:9a6a501c3099307d9fd76ac244e08503427679b1e81ceb1d922485e2f2462ad2"}, + {file = "httpcore-1.0.3.tar.gz", hash = "sha256:5c0f9546ad17dac4d0772b0808856eb616eb8b48ce94f49ed819fd6982a8a544"}, +] + +[[package]] +name = "httpx" +version = "0.26.0" +requires_python = ">=3.8" +summary = "The next generation HTTP client." +groups = ["doc"] +dependencies = [ + "anyio", + "certifi", + "httpcore==1.*", + "idna", + "sniffio", +] +files = [ + {file = "httpx-0.26.0-py3-none-any.whl", hash = "sha256:8915f5a3627c4d47b73e8202457cb28f1266982d1159bd5779d86a80c0eab1cd"}, + {file = "httpx-0.26.0.tar.gz", hash = "sha256:451b55c30d5185ea6b23c2c793abf9bb237d2a7dfb901ced6ff69ad37ec1dfaf"}, +] + +[[package]] +name = "idna" +version = "3.6" +requires_python = ">=3.5" +summary = "Internationalized Domain Names in Applications (IDNA)" +groups = ["default", "doc", "test"] +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "imageio" +version = "2.34.0" +requires_python = ">=3.8" +summary = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +groups = ["default", "pims", "test"] +dependencies = [ + "numpy", + "pillow>=8.3.2", +] +files = [ + {file = "imageio-2.34.0-py3-none-any.whl", hash = "sha256:08082bf47ccb54843d9c73fe9fc8f3a88c72452ab676b58aca74f36167e8ccba"}, + {file = "imageio-2.34.0.tar.gz", hash = "sha256:ae9732e10acf807a22c389aef193f42215718e16bd06eed0c5bb57e1034a4d53"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Getting image size from png/jpeg/jpeg2000/gif file" +groups = ["doc"] +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.1" +requires_python = ">=3.8" +summary = "Read metadata from Python packages" +groups = ["default", "doc", "test"] +dependencies = [ + "zipp>=0.5", +] +files = [ + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, +] + +[[package]] +name = "importlib-resources" +version = "6.1.1" +requires_python = ">=3.8" +summary = "Read resources from Python packages" +groups = ["default", "test"] +marker = "python_version < \"3.10\"" +dependencies = [ + "zipp>=3.1.0; python_version < \"3.10\"", +] +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +requires_python = ">=3.7" +summary = "brain-dead simple config-ini parsing" +groups = ["test"] +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.2" +requires_python = ">=3.8" +summary = "IPython Kernel for Jupyter" +groups = ["doc"] +dependencies = [ + "appnope; platform_system == \"Darwin\"", + "comm>=0.1.1", + "debugpy>=1.6.5", + "ipython>=7.23.1", + "jupyter-client>=6.1.12", + "jupyter-core!=5.0.*,>=4.12", + "matplotlib-inline>=0.1", + "nest-asyncio", + "packaging", + "psutil", + "pyzmq>=24", + "tornado>=6.1", + "traitlets>=5.4.0", +] +files = [ + {file = "ipykernel-6.29.2-py3-none-any.whl", hash = "sha256:50384f5c577a260a1d53f1f59a828c7266d321c9b7d00d345693783f66616055"}, + {file = "ipykernel-6.29.2.tar.gz", hash = "sha256:3bade28004e3ff624ed57974948116670604ac5f676d12339693f3142176d3f0"}, +] + +[[package]] +name = "ipython" +version = "8.18.1" +requires_python = ">=3.9" +summary = "IPython: Productive Interactive Computing" +groups = ["default", "doc", "test"] +dependencies = [ + "colorama; sys_platform == \"win32\"", + "decorator", + "exceptiongroup; python_version < \"3.11\"", + "jedi>=0.16", + "matplotlib-inline", + "pexpect>4.3; sys_platform != \"win32\"", + "prompt-toolkit<3.1.0,>=3.0.41", + "pygments>=2.4.0", + "stack-data", + "traitlets>=5", + "typing-extensions; python_version < \"3.10\"", +] +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[[package]] +name = "ipywidgets" +version = "8.1.2" +requires_python = ">=3.7" +summary = "Jupyter interactive widgets" +groups = ["doc"] +dependencies = [ + "comm>=0.1.3", + "ipython>=6.1.0", + "jupyterlab-widgets~=3.0.10", + "traitlets>=4.3.1", + "widgetsnbextension~=4.0.10", +] +files = [ + {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, + {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, +] + +[[package]] +name = "isoduration" +version = "20.11.0" +requires_python = ">=3.7" +summary = "Operations with ISO 8601 durations" +groups = ["doc"] +dependencies = [ + "arrow>=0.15.0", +] +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[[package]] +name = "isort" +version = "5.13.2" +requires_python = ">=3.8.0" +summary = "A Python utility / library to sort Python imports." +groups = ["dev"] +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[[package]] +name = "jedi" +version = "0.19.1" +requires_python = ">=3.6" +summary = "An autocompletion tool for Python that can be used for text editors." +groups = ["default", "doc", "test"] +dependencies = [ + "parso<0.9.0,>=0.8.3", +] +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[[package]] +name = "jinja2" +version = "3.1.3" +requires_python = ">=3.7" +summary = "A very fast and expressive template engine." +groups = ["doc"] +dependencies = [ + "MarkupSafe>=2.0", +] +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[[package]] +name = "json5" +version = "0.9.14" +summary = "A Python implementation of the JSON5 data format." +groups = ["doc"] +files = [ + {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, + {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, +] + +[[package]] +name = "jsonpointer" +version = "2.4" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +summary = "Identify specific nodes in a JSON document (RFC 6901) " +groups = ["doc"] +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "jsonschema" +version = "4.21.1" +requires_python = ">=3.8" +summary = "An implementation of JSON Schema validation for Python" +groups = ["doc"] +dependencies = [ + "attrs>=22.2.0", + "jsonschema-specifications>=2023.03.6", + "referencing>=0.28.4", + "rpds-py>=0.7.1", +] +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +requires_python = ">=3.8" +summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +groups = ["doc"] +dependencies = [ + "referencing>=0.31.0", +] +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[[package]] +name = "jsonschema" +version = "4.21.1" +extras = ["format-nongpl"] +requires_python = ">=3.8" +summary = "An implementation of JSON Schema validation for Python" +groups = ["doc"] +dependencies = [ + "fqdn", + "idna", + "isoduration", + "jsonpointer>1.13", + "jsonschema==4.21.1", + "rfc3339-validator", + "rfc3986-validator>0.1.0", + "uri-template", + "webcolors>=1.11", +] +files = [ + {file = "jsonschema-4.21.1-py3-none-any.whl", hash = "sha256:7996507afae316306f9e2290407761157c6f78002dcf7419acb99822143d1c6f"}, + {file = "jsonschema-4.21.1.tar.gz", hash = "sha256:85727c00279f5fa6bedbe6238d2aa6403bedd8b4864ab11207d07df3cc1b2ee5"}, +] + +[[package]] +name = "jupyter" +version = "1.0.0" +summary = "Jupyter metapackage. Install all the Jupyter components in one go." +groups = ["doc"] +dependencies = [ + "ipykernel", + "ipywidgets", + "jupyter-console", + "nbconvert", + "notebook", + "qtconsole", +] +files = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] + +[[package]] +name = "jupyter-cache" +version = "1.0.0" +requires_python = ">=3.9" +summary = "A defined interface for working with a cache of jupyter notebooks." +groups = ["doc"] +dependencies = [ + "attrs", + "click", + "importlib-metadata", + "nbclient>=0.2", + "nbformat", + "pyyaml", + "sqlalchemy<3,>=1.3.12", + "tabulate", +] +files = [ + {file = "jupyter_cache-1.0.0-py3-none-any.whl", hash = "sha256:594b1c4e29b488b36547e12477645f489dbdc62cc939b2408df5679f79245078"}, + {file = "jupyter_cache-1.0.0.tar.gz", hash = "sha256:d0fa7d7533cd5798198d8889318269a8c1382ed3b22f622c09a9356521f48687"}, +] + +[[package]] +name = "jupyter-client" +version = "8.6.0" +requires_python = ">=3.8" +summary = "Jupyter protocol implementation and client libraries" +groups = ["doc"] +dependencies = [ + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "jupyter-core!=5.0.*,>=4.12", + "python-dateutil>=2.8.2", + "pyzmq>=23.0", + "tornado>=6.2", + "traitlets>=5.3", +] +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +requires_python = ">=3.7" +summary = "Jupyter terminal console" +groups = ["doc"] +dependencies = [ + "ipykernel>=6.14", + "ipython", + "jupyter-client>=7.0.0", + "jupyter-core!=5.0.*,>=4.12", + "prompt-toolkit>=3.0.30", + "pygments", + "pyzmq>=17", + "traitlets>=5.4", +] +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[[package]] +name = "jupyter-core" +version = "5.7.1" +requires_python = ">=3.8" +summary = "Jupyter core package. A base package on which Jupyter projects rely." +groups = ["doc"] +dependencies = [ + "platformdirs>=2.5", + "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", + "traitlets>=5.3", +] +files = [ + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, +] + +[[package]] +name = "jupyter-events" +version = "0.9.0" +requires_python = ">=3.8" +summary = "Jupyter Event System library" +groups = ["doc"] +dependencies = [ + "jsonschema[format-nongpl]>=4.18.0", + "python-json-logger>=2.0.4", + "pyyaml>=5.3", + "referencing", + "rfc3339-validator", + "rfc3986-validator>=0.1.1", + "traitlets>=5.3", +] +files = [ + {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, + {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, +] + +[[package]] +name = "jupyter-lsp" +version = "2.2.2" +requires_python = ">=3.8" +summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +groups = ["doc"] +dependencies = [ + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "jupyter-server>=1.1.2", +] +files = [ + {file = "jupyter-lsp-2.2.2.tar.gz", hash = "sha256:256d24620542ae4bba04a50fc1f6ffe208093a07d8e697fea0a8d1b8ca1b7e5b"}, + {file = "jupyter_lsp-2.2.2-py3-none-any.whl", hash = "sha256:3b95229e4168355a8c91928057c1621ac3510ba98b2a925e82ebd77f078b1aa5"}, +] + +[[package]] +name = "jupyter-server" +version = "2.12.5" +requires_python = ">=3.8" +summary = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +groups = ["doc"] +dependencies = [ + "anyio>=3.1.0", + "argon2-cffi", + "jinja2", + "jupyter-client>=7.4.4", + "jupyter-core!=5.0.*,>=4.12", + "jupyter-events>=0.9.0", + "jupyter-server-terminals", + "nbconvert>=6.4.4", + "nbformat>=5.3.0", + "overrides", + "packaging", + "prometheus-client", + "pywinpty; os_name == \"nt\"", + "pyzmq>=24", + "send2trash>=1.8.2", + "terminado>=0.8.3", + "tornado>=6.2.0", + "traitlets>=5.6.0", + "websocket-client", +] +files = [ + {file = "jupyter_server-2.12.5-py3-none-any.whl", hash = "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923"}, + {file = "jupyter_server-2.12.5.tar.gz", hash = "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689"}, +] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.2" +requires_python = ">=3.8" +summary = "A Jupyter Server Extension Providing Terminals." +groups = ["doc"] +dependencies = [ + "pywinpty>=2.0.3; os_name == \"nt\"", + "terminado>=0.8.3", +] +files = [ + {file = "jupyter_server_terminals-0.5.2-py3-none-any.whl", hash = "sha256:1b80c12765da979513c42c90215481bbc39bd8ae7c0350b4f85bc3eb58d0fa80"}, + {file = "jupyter_server_terminals-0.5.2.tar.gz", hash = "sha256:396b5ccc0881e550bf0ee7012c6ef1b53edbde69e67cab1d56e89711b46052e8"}, +] + +[[package]] +name = "jupyterlab" +version = "4.1.1" +requires_python = ">=3.8" +summary = "JupyterLab computational environment" +groups = ["doc"] +dependencies = [ + "async-lru>=1.0.0", + "httpx>=0.25.0", + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "ipykernel", + "jinja2>=3.0.3", + "jupyter-core", + "jupyter-lsp>=2.0.0", + "jupyter-server<3,>=2.4.0", + "jupyterlab-server<3,>=2.19.0", + "notebook-shim>=0.2", + "packaging", + "tomli; python_version < \"3.11\"", + "tornado>=6.2.0", + "traitlets", +] +files = [ + {file = "jupyterlab-4.1.1-py3-none-any.whl", hash = "sha256:fa3e8c18b804eac04e51ceebd9dd3dd396e08106816f0d09cc426799d7087632"}, + {file = "jupyterlab-4.1.1.tar.gz", hash = "sha256:8acc9f561729d8f32c14c294c397917cddfeeb13a5d46f811979b71b4911a9fd"}, +] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +requires_python = ">=3.8" +summary = "Pygments theme using JupyterLab CSS variables" +groups = ["doc"] +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.25.3" +requires_python = ">=3.8" +summary = "A set of server components for JupyterLab and JupyterLab like applications." +groups = ["doc"] +dependencies = [ + "babel>=2.10", + "importlib-metadata>=4.8.3; python_version < \"3.10\"", + "jinja2>=3.0.3", + "json5>=0.9.0", + "jsonschema>=4.18.0", + "jupyter-server<3,>=1.21", + "packaging>=21.3", + "requests>=2.31", +] +files = [ + {file = "jupyterlab_server-2.25.3-py3-none-any.whl", hash = "sha256:c48862519fded9b418c71645d85a49b2f0ec50d032ba8316738e9276046088c1"}, + {file = "jupyterlab_server-2.25.3.tar.gz", hash = "sha256:846f125a8a19656611df5b03e5912c8393cea6900859baa64fa515eb64a8dc40"}, +] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.10" +requires_python = ">=3.7" +summary = "Jupyter interactive widgets for JupyterLab" +groups = ["doc"] +files = [ + {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, + {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, +] + +[[package]] +name = "kiwisolver" +version = "1.4.5" +requires_python = ">=3.7" +summary = "A fast implementation of the Cassowary constraint solver" +groups = ["default", "test"] +files = [ + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, +] + +[[package]] +name = "lazy-loader" +version = "0.3" +requires_python = ">=3.7" +summary = "lazy_loader" +groups = ["default", "test"] +files = [ + {file = "lazy_loader-0.3-py3-none-any.whl", hash = "sha256:1e9e76ee8631e264c62ce10006718e80b2cfc74340d17d1031e0f84af7478554"}, + {file = "lazy_loader-0.3.tar.gz", hash = "sha256:3b68898e34f5b2a29daaaac172c6555512d0f32074f147e2254e4a6d9d838f37"}, +] + +[[package]] +name = "locket" +version = "1.0.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "File-based locks for Python on Linux and Windows" +groups = ["default", "test"] +files = [ + {file = "locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3"}, + {file = "locket-1.0.0.tar.gz", hash = "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632"}, +] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +requires_python = ">=3.8" +summary = "Python port of markdown-it. Markdown parsing, done right!" +groups = ["doc"] +dependencies = [ + "mdurl~=0.1", +] +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +requires_python = ">=3.7" +summary = "Safely add untrusted strings to HTML/XML markup." +groups = ["doc"] +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib" +version = "3.8.3" +requires_python = ">=3.9" +summary = "Python plotting package" +groups = ["default", "test"] +dependencies = [ + "contourpy>=1.0.1", + "cycler>=0.10", + "fonttools>=4.22.0", + "importlib-resources>=3.2.0; python_version < \"3.10\"", + "kiwisolver>=1.3.1", + "numpy<2,>=1.21", + "packaging>=20.0", + "pillow>=8", + "pyparsing>=2.3.1", + "python-dateutil>=2.7", +] +files = [ + {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"}, + {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"}, + {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"}, + {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"}, + {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"}, + {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"}, + {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"}, + {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"}, + {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"}, + {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"}, + {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"}, + {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"}, + {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"}, + {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"}, + {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"}, + {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"}, + {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"}, + {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"}, + {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +requires_python = ">=3.5" +summary = "Inline Matplotlib backend for Jupyter" +groups = ["default", "doc", "test"] +dependencies = [ + "traitlets", +] +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[[package]] +name = "mccabe" +version = "0.7.0" +requires_python = ">=3.6" +summary = "McCabe checker, plugin for flake8" +groups = ["dev"] +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +requires_python = ">=3.8" +summary = "Collection of plugins for markdown-it-py" +groups = ["doc"] +dependencies = [ + "markdown-it-py<4.0.0,>=1.0.0", +] +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +requires_python = ">=3.7" +summary = "Markdown URL utilities" +groups = ["doc"] +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "meson" +version = "1.3.2" +requires_python = ">=3.7" +summary = "A high performance build system" +groups = ["build"] +files = [ + {file = "meson-1.3.2-py3-none-any.whl", hash = "sha256:0ba4a71fbc060c44721c7b674807598c5af9ea51335073cae7a3e9a95b375c89"}, + {file = "meson-1.3.2.tar.gz", hash = "sha256:492eb450c8b073024276f916f5adbb3c4bb7e90e9e6ec124efda064f3d9b5baa"}, +] + +[[package]] +name = "meson-python" +version = "0.15.0" +requires_python = ">=3.7" +summary = "Meson Python build backend (PEP 517)" +groups = ["build"] +dependencies = [ + "colorama; os_name == \"nt\"", + "meson>=0.63.3; python_version < \"3.12\"", + "meson>=1.2.3; python_version >= \"3.12\"", + "pyproject-metadata>=0.7.1", + "tomli>=1.0.0; python_version < \"3.11\"", +] +files = [ + {file = "meson_python-0.15.0-py3-none-any.whl", hash = "sha256:3ae38253ff02b2e947a05e362a2eaf5a9a09d133c5666b4123399ee5fbf2e591"}, + {file = "meson_python-0.15.0.tar.gz", hash = "sha256:fddb73eecd49e89c1c41c87937cd89c2d0b65a1c63ba28238681d4bd9484d26f"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +requires_python = ">=3.7" +summary = "A sane and fast Markdown parser with useful plugins and renderers" +groups = ["doc"] +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +requires_python = ">=3.5" +summary = "Type system extensions for programs checked with the mypy type checker." +groups = ["dev"] +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "myst-nb" +version = "1.0.0" +requires_python = ">=3.9" +summary = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser." +groups = ["doc"] +dependencies = [ + "importlib-metadata", + "ipykernel", + "ipython", + "jupyter-cache>=0.5", + "myst-parser>=1.0.0", + "nbclient", + "nbformat>=5.0", + "pyyaml", + "sphinx>=5", + "typing-extensions", +] +files = [ + {file = "myst_nb-1.0.0-py3-none-any.whl", hash = "sha256:ee8febc6dd7d9e32bede0c66a9b962b2e2fdab697428ee9fbfd4919d82380911"}, + {file = "myst_nb-1.0.0.tar.gz", hash = "sha256:9077e42a1c6b441ea55078506f83555dda5d6c816ef4930841d71d239e3e0c5e"}, +] + +[[package]] +name = "myst-parser" +version = "2.0.0" +requires_python = ">=3.8" +summary = "An extended [CommonMark](https://spec.commonmark.org/) compliant parser," +groups = ["doc"] +dependencies = [ + "docutils<0.21,>=0.16", + "jinja2", + "markdown-it-py~=3.0", + "mdit-py-plugins~=0.4", + "pyyaml", + "sphinx<8,>=6", +] +files = [ + {file = "myst_parser-2.0.0-py3-none-any.whl", hash = "sha256:7c36344ae39c8e740dad7fdabf5aa6fc4897a813083c6cc9990044eb93656b14"}, + {file = "myst_parser-2.0.0.tar.gz", hash = "sha256:ea929a67a6a0b1683cdbe19b8d2e724cd7643f8aa3e7bb18dd65beac3483bead"}, +] + +[[package]] +name = "nbclient" +version = "0.9.0" +requires_python = ">=3.8.0" +summary = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +groups = ["doc"] +dependencies = [ + "jupyter-client>=6.1.12", + "jupyter-core!=5.0.*,>=4.12", + "nbformat>=5.1", + "traitlets>=5.4", +] +files = [ + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, +] + +[[package]] +name = "nbconvert" +version = "7.16.0" +requires_python = ">=3.8" +summary = "Converting Jupyter Notebooks" +groups = ["doc"] +dependencies = [ + "beautifulsoup4", + "bleach!=5.0.0", + "defusedxml", + "importlib-metadata>=3.6; python_version < \"3.10\"", + "jinja2>=3.0", + "jupyter-core>=4.7", + "jupyterlab-pygments", + "markupsafe>=2.0", + "mistune<4,>=2.0.3", + "nbclient>=0.5.0", + "nbformat>=5.7", + "packaging", + "pandocfilters>=1.4.1", + "pygments>=2.4.1", + "tinycss2", + "traitlets>=5.1", +] +files = [ + {file = "nbconvert-7.16.0-py3-none-any.whl", hash = "sha256:ad3dc865ea6e2768d31b7eb6c7ab3be014927216a5ece3ef276748dd809054c7"}, + {file = "nbconvert-7.16.0.tar.gz", hash = "sha256:813e6553796362489ae572e39ba1bff978536192fb518e10826b0e8cadf03ec8"}, +] + +[[package]] +name = "nbformat" +version = "5.9.2" +requires_python = ">=3.8" +summary = "The Jupyter Notebook format" +groups = ["doc"] +dependencies = [ + "fastjsonschema", + "jsonschema>=2.6", + "jupyter-core", + "traitlets>=5.1", +] +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +requires_python = ">=3.5" +summary = "Patch asyncio to allow nested event loops" +groups = ["doc"] +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "networkx" +version = "3.2.1" +requires_python = ">=3.9" +summary = "Python package for creating and manipulating graphs and networks" +groups = ["default", "test"] +files = [ + {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"}, + {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"}, +] + +[[package]] +name = "ninja" +version = "1.11.1.1" +summary = "Ninja is a small build system with a focus on speed" +groups = ["build"] +files = [ + {file = "ninja-1.11.1.1-py2.py3-none-macosx_10_9_universal2.macosx_10_9_x86_64.macosx_11_0_arm64.macosx_11_0_universal2.whl", hash = "sha256:376889c76d87b95b5719fdd61dd7db193aa7fd4432e5d52d2e44e4c497bdbbee"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_i686.manylinux_2_5_i686.whl", hash = "sha256:ecf80cf5afd09f14dcceff28cb3f11dc90fb97c999c89307aea435889cb66877"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:84502ec98f02a037a169c4b0d5d86075eaf6afc55e1879003d6cab51ced2ea4b"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:73b93c14046447c7c5cc892433d4fae65d6364bec6685411cb97a8bcf815f93a"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:18302d96a5467ea98b68e1cae1ae4b4fb2b2a56a82b955193c637557c7273dbd"}, + {file = "ninja-1.11.1.1-py2.py3-none-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:aad34a70ef15b12519946c5633344bc775a7656d789d9ed5fdb0d456383716ef"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:d491fc8d89cdcb416107c349ad1e3a735d4c4af5e1cb8f5f727baca6350fdaea"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_i686.whl", hash = "sha256:7563ce1d9fe6ed5af0b8dd9ab4a214bf4ff1f2f6fd6dc29f480981f0f8b8b249"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_ppc64le.whl", hash = "sha256:9df724344202b83018abb45cb1efc22efd337a1496514e7e6b3b59655be85205"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_s390x.whl", hash = "sha256:3e0f9be5bb20d74d58c66cc1c414c3e6aeb45c35b0d0e41e8d739c2c0d57784f"}, + {file = "ninja-1.11.1.1-py2.py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:76482ba746a2618eecf89d5253c0d1e4f1da1270d41e9f54dfbd91831b0f6885"}, + {file = "ninja-1.11.1.1-py2.py3-none-win32.whl", hash = "sha256:fa2ba9d74acfdfbfbcf06fad1b8282de8a7a8c481d9dee45c859a8c93fcc1082"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_amd64.whl", hash = "sha256:95da904130bfa02ea74ff9c0116b4ad266174fafb1c707aa50212bc7859aebf1"}, + {file = "ninja-1.11.1.1-py2.py3-none-win_arm64.whl", hash = "sha256:185e0641bde601e53841525c4196278e9aaf4463758da6dd1e752c0a0f54136a"}, + {file = "ninja-1.11.1.1.tar.gz", hash = "sha256:9d793b08dd857e38d0b6ffe9e6b7145d7c485a42dcfea04905ca0cdb6017cc3c"}, +] + +[[package]] +name = "notebook" +version = "7.1.0" +requires_python = ">=3.8" +summary = "Jupyter Notebook - A web-based notebook environment for interactive computing" +groups = ["doc"] +dependencies = [ + "jupyter-server<3,>=2.4.0", + "jupyterlab-server<3,>=2.22.1", + "jupyterlab<4.2,>=4.1.1", + "notebook-shim<0.3,>=0.2", + "tornado>=6.2.0", +] +files = [ + {file = "notebook-7.1.0-py3-none-any.whl", hash = "sha256:a8fa4ccb5e5fe220f29d9900337efd7752bc6f2efe004d6f320db01f7743adc9"}, + {file = "notebook-7.1.0.tar.gz", hash = "sha256:99caf01ff166b1cc86355c9b37c1ba9bf566c1d7fc4ab57bb6f8f24e36c4260e"}, +] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +requires_python = ">=3.7" +summary = "A shim layer for notebook traits and config" +groups = ["doc"] +dependencies = [ + "jupyter-server<3,>=1.8", +] +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +requires_python = ">=3.9" +summary = "Fundamental package for array computing in Python" +groups = ["build", "default", "doc", "opencv", "pims", "test"] +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] + +[[package]] +name = "numpydoc" +version = "1.6.0" +requires_python = ">=3.8" +summary = "Sphinx extension to support docstrings in Numpy format" +groups = ["doc"] +dependencies = [ + "Jinja2>=2.10", + "sphinx>=5", + "tabulate>=0.8.10", + "tomli>=1.1.0; python_version < \"3.11\"", +] +files = [ + {file = "numpydoc-1.6.0-py3-none-any.whl", hash = "sha256:b6ddaa654a52bdf967763c1e773be41f1c3ae3da39ee0de973f2680048acafaa"}, + {file = "numpydoc-1.6.0.tar.gz", hash = "sha256:ae7a5380f0a06373c3afe16ccd15bd79bc6b07f2704cbc6f1e7ecc94b4f5fc0d"}, +] + +[[package]] +name = "opencv-python" +version = "4.9.0.80" +requires_python = ">=3.6" +summary = "Wrapper package for OpenCV python bindings." +groups = ["opencv", "test"] +dependencies = [ + "numpy>=1.17.0; python_version >= \"3.7\"", + "numpy>=1.17.3; python_version >= \"3.8\"", + "numpy>=1.19.3; python_version >= \"3.6\" and platform_system == \"Linux\" and platform_machine == \"aarch64\"", + "numpy>=1.19.3; python_version >= \"3.9\"", + "numpy>=1.21.0; python_version <= \"3.9\" and platform_system == \"Darwin\" and platform_machine == \"arm64\"", + "numpy>=1.21.2; python_version >= \"3.10\"", + "numpy>=1.21.4; python_version >= \"3.10\" and platform_system == \"Darwin\"", + "numpy>=1.23.5; python_version >= \"3.11\"", + "numpy>=1.26.0; python_version >= \"3.12\"", +] +files = [ + {file = "opencv-python-4.9.0.80.tar.gz", hash = "sha256:1a9f0e6267de3a1a1db0c54213d022c7c8b5b9ca4b580e80bdc58516c922c9e1"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-macosx_10_16_x86_64.whl", hash = "sha256:7e5f7aa4486651a6ebfa8ed4b594b65bd2d2f41beeb4241a3e4b1b85acbbbadb"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:71dfb9555ccccdd77305fc3dcca5897fbf0cf28b297c51ee55e079c065d812a3"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b34a52e9da36dda8c151c6394aed602e4b17fa041df0b9f5b93ae10b0fcca2a"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4088cab82b66a3b37ffc452976b14a3c599269c247895ae9ceb4066d8188a57"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-win32.whl", hash = "sha256:dcf000c36dd1651118a2462257e3a9e76db789a78432e1f303c7bac54f63ef6c"}, + {file = "opencv_python-4.9.0.80-cp37-abi3-win_amd64.whl", hash = "sha256:3f16f08e02b2a2da44259c7cc712e779eff1dd8b55fdb0323e8cab09548086c0"}, +] + +[[package]] +name = "outcome" +version = "1.3.0.post0" +requires_python = ">=3.7" +summary = "Capture the outcome of Python function calls." +groups = ["default", "test"] +dependencies = [ + "attrs>=19.2.0", +] +files = [ + {file = "outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b"}, + {file = "outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8"}, +] + +[[package]] +name = "overrides" +version = "7.7.0" +requires_python = ">=3.6" +summary = "A decorator to automatically detect mismatch when overriding a method." +groups = ["doc"] +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "23.2" +requires_python = ">=3.7" +summary = "Core utilities for Python packages" +groups = ["build", "default", "dev", "doc", "test"] +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "pandas" +version = "2.2.0" +requires_python = ">=3.9" +summary = "Powerful data structures for data analysis, time series, and statistics" +groups = ["doc"] +dependencies = [ + "numpy<2,>=1.22.4; python_version < \"3.11\"", + "numpy<2,>=1.23.2; python_version == \"3.11\"", + "numpy<2,>=1.26.0; python_version >= \"3.12\"", + "python-dateutil>=2.8.2", + "pytz>=2020.1", + "tzdata>=2022.7", +] +files = [ + {file = "pandas-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8108ee1712bb4fa2c16981fba7e68b3f6ea330277f5ca34fa8d557e986a11670"}, + {file = "pandas-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:736da9ad4033aeab51d067fc3bd69a0ba36f5a60f66a527b3d72e2030e63280a"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38e0b4fc3ddceb56ec8a287313bc22abe17ab0eb184069f08fc6a9352a769b18"}, + {file = "pandas-2.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20404d2adefe92aed3b38da41d0847a143a09be982a31b85bc7dd565bdba0f4e"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ea3ee3f125032bfcade3a4cf85131ed064b4f8dd23e5ce6fa16473e48ebcaf5"}, + {file = "pandas-2.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f9670b3ac00a387620489dfc1bca66db47a787f4e55911f1293063a78b108df1"}, + {file = "pandas-2.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:5a946f210383c7e6d16312d30b238fd508d80d927014f3b33fb5b15c2f895430"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a1b438fa26b208005c997e78672f1aa8138f67002e833312e6230f3e57fa87d5"}, + {file = "pandas-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ce2fbc8d9bf303ce54a476116165220a1fedf15985b09656b4b4275300e920b"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2707514a7bec41a4ab81f2ccce8b382961a29fbe9492eab1305bb075b2b1ff4f"}, + {file = "pandas-2.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85793cbdc2d5bc32620dc8ffa715423f0c680dacacf55056ba13454a5be5de88"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:cfd6c2491dc821b10c716ad6776e7ab311f7df5d16038d0b7458bc0b67dc10f3"}, + {file = "pandas-2.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a146b9dcacc3123aa2b399df1a284de5f46287a4ab4fbfc237eac98a92ebcb71"}, + {file = "pandas-2.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:fbc1b53c0e1fdf16388c33c3cca160f798d38aea2978004dd3f4d3dec56454c9"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a41d06f308a024981dcaa6c41f2f2be46a6b186b902c94c2674e8cb5c42985bc"}, + {file = "pandas-2.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:159205c99d7a5ce89ecfc37cb08ed179de7783737cea403b295b5eda8e9c56d1"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eb1e1f3861ea9132b32f2133788f3b14911b68102d562715d71bd0013bc45440"}, + {file = "pandas-2.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:761cb99b42a69005dec2b08854fb1d4888fdf7b05db23a8c5a099e4b886a2106"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a20628faaf444da122b2a64b1e5360cde100ee6283ae8effa0d8745153809a2e"}, + {file = "pandas-2.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f5be5d03ea2073627e7111f61b9f1f0d9625dc3c4d8dda72cc827b0c58a1d042"}, + {file = "pandas-2.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:a626795722d893ed6aacb64d2401d017ddc8a2341b49e0384ab9bf7112bdec30"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f66419d4a41132eb7e9a73dcec9486cf5019f52d90dd35547af11bc58f8637d"}, + {file = "pandas-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:57abcaeda83fb80d447f28ab0cc7b32b13978f6f733875ebd1ed14f8fbc0f4ab"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e60f1f7dba3c2d5ca159e18c46a34e7ca7247a73b5dd1a22b6d59707ed6b899a"}, + {file = "pandas-2.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb61dc8567b798b969bcc1fc964788f5a68214d333cade8319c7ab33e2b5d88a"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:52826b5f4ed658fa2b729264d63f6732b8b29949c7fd234510d57c61dbeadfcd"}, + {file = "pandas-2.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bde2bc699dbd80d7bc7f9cab1e23a95c4375de615860ca089f34e7c64f4a8de7"}, + {file = "pandas-2.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:3de918a754bbf2da2381e8a3dcc45eede8cd7775b047b923f9006d5f876802ae"}, + {file = "pandas-2.2.0.tar.gz", hash = "sha256:30b83f7c3eb217fb4d1b494a57a2fda5444f17834f5df2de6b2ffff68dc3c8e2"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "Utilities for writing pandoc filters in python" +groups = ["doc"] +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +requires_python = ">=3.6" +summary = "A Python Parser" +groups = ["default", "doc", "test"] +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[[package]] +name = "partd" +version = "1.4.1" +requires_python = ">=3.7" +summary = "Appendable key-value storage" +groups = ["default", "test"] +dependencies = [ + "locket", + "toolz", +] +files = [ + {file = "partd-1.4.1-py3-none-any.whl", hash = "sha256:27e766663d36c161e2827aa3e28541c992f0b9527d3cca047e13fb3acdb989e6"}, + {file = "partd-1.4.1.tar.gz", hash = "sha256:56c25dd49e6fea5727e731203c466c6e092f308d8f0024e199d02f6aa2167f67"}, +] + +[[package]] +name = "pathspec" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Utility library for gitignore style pattern matching of file paths." +groups = ["dev"] +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +summary = "Pexpect allows easy control of interactive console applications." +groups = ["default", "doc", "test"] +marker = "sys_platform != \"win32\"" +dependencies = [ + "ptyprocess>=0.5", +] +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[[package]] +name = "pillow" +version = "10.2.0" +requires_python = ">=3.8" +summary = "Python Imaging Library (Fork)" +groups = ["default", "pims", "test"] +files = [ + {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"}, + {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"}, + {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"}, + {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"}, + {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"}, + {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"}, + {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"}, + {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"}, + {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"}, + {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"}, + {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"}, + {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"}, + {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"}, + {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"}, + {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"}, + {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"}, + {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"}, + {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"}, + {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"}, + {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"}, + {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"}, + {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"}, + {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"}, + {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"}, + {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"}, + {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"}, + {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"}, + {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"}, + {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, +] + +[[package]] +name = "pims" +version = "0.6.1" +requires_python = ">=3.7" +summary = "Python Image Sequence" +groups = ["pims"] +dependencies = [ + "imageio", + "numpy>=1.19", + "slicerator>=0.9.8", +] +files = [ + {file = "PIMS-0.6.1.tar.gz", hash = "sha256:e2b704461d4ea9bce8b6a22ca35836fe67d6d34537736b405341ae5547194f3b"}, +] + +[[package]] +name = "pip" +version = "24.0" +requires_python = ">=3.7" +summary = "The PyPA recommended tool for installing Python packages." +groups = ["dev"] +files = [ + {file = "pip-24.0-py3-none-any.whl", hash = "sha256:ba0d021a166865d2265246961bec0152ff124de910c5cc39f1156ce3fa7c69dc"}, + {file = "pip-24.0.tar.gz", hash = "sha256:ea9bd1a847e8c5774a5777bb398c19e80bcd4e2aa16a4b301b718fe6f593aba2"}, +] + +[[package]] +name = "platformdirs" +version = "4.2.0" +requires_python = ">=3.8" +summary = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +groups = ["dev", "doc"] +files = [ + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, +] + +[[package]] +name = "pluggy" +version = "1.4.0" +requires_python = ">=3.8" +summary = "plugin and hook calling mechanisms for python" +groups = ["test"] +files = [ + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, +] + +[[package]] +name = "ply" +version = "3.11" +summary = "Python Lex & Yacc" +groups = ["build"] +files = [ + {file = "ply-3.11-py2.py3-none-any.whl", hash = "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"}, + {file = "ply-3.11.tar.gz", hash = "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3"}, +] + +[[package]] +name = "prometheus-client" +version = "0.20.0" +requires_python = ">=3.8" +summary = "Python client for the Prometheus monitoring system." +groups = ["doc"] +files = [ + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +requires_python = ">=3.7.0" +summary = "Library for building powerful interactive command lines in Python" +groups = ["default", "doc", "test"] +dependencies = [ + "wcwidth", +] +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[[package]] +name = "psutil" +version = "5.9.8" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +summary = "Cross-platform lib for process and system monitoring in Python." +groups = ["default", "doc", "test"] +files = [ + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +summary = "Run a subprocess in a pseudo terminal" +groups = ["default", "doc", "test"] +marker = "sys_platform != \"win32\" or os_name != \"nt\"" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +summary = "Safely evaluate AST nodes without side effects" +groups = ["default", "doc", "test"] +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[[package]] +name = "pycodestyle" +version = "2.11.1" +requires_python = ">=3.8" +summary = "Python style guide checker" +groups = ["build", "default", "test"] +files = [ + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +summary = "C parser in Python" +groups = ["default", "doc", "test"] +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydata-sphinx-theme" +version = "0.15.2" +requires_python = ">=3.9" +summary = "Bootstrap-based Sphinx theme from the PyData community" +groups = ["doc"] +dependencies = [ + "Babel", + "accessible-pygments", + "beautifulsoup4", + "docutils!=0.17.0", + "packaging", + "pygments>=2.7", + "sphinx>=5.0", + "typing-extensions", +] +files = [ + {file = "pydata_sphinx_theme-0.15.2-py3-none-any.whl", hash = "sha256:0c5fa1fa98a9b26dae590666ff576f27e26c7ba708fee754ecb9e07359ed4588"}, + {file = "pydata_sphinx_theme-0.15.2.tar.gz", hash = "sha256:4243fee85b3afcfae9df64f83210a04e7182e53bc3db8841ffff6d21d95ae320"}, +] + +[[package]] +name = "pyfftw" +version = "0.13.1" +requires_python = ">=3.8" +summary = "A pythonic wrapper around FFTW, the FFT library, presenting a unified interface for all the supported transforms." +groups = ["default", "test"] +dependencies = [ + "numpy<2.0,>=1.20", +] +files = [ + {file = "pyFFTW-0.13.1-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:bed25dbb4b10454b564db951bfad976a382bc8d6af38d7f0995b239f17f58a0c"}, + {file = "pyFFTW-0.13.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48a571116ab78c44cbd86fb46c5df021b1199e4ea9c0c607d14a7c7c5b6bab3a"}, + {file = "pyFFTW-0.13.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f46337a3fb8270ef1237db25097c21905f5d2b045f49afea217b603a320c329"}, + {file = "pyFFTW-0.13.1-cp310-cp310-win32.whl", hash = "sha256:c2208655e0b24b2afe4bafd05eeca5fee8e8a56fa045e296f782b1f61e088dfb"}, + {file = "pyFFTW-0.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:60a09f9e80544b82d18682f7301942613fcb34f0daf316f2833bcea13d76fc0c"}, + {file = "pyFFTW-0.13.1-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:dee09034f5d0464b828a8fd37da46776fc740e31870dd9e5d36d15c34f72102c"}, + {file = "pyFFTW-0.13.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b5ee9b582befebcdb29a8d73e03e70c96ecd53625c9c72eb753a967cf2979b4"}, + {file = "pyFFTW-0.13.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bfce5e4190b07af8dfca4bfeef7481ea61148744bd92d4df944357ee3939a83"}, + {file = "pyFFTW-0.13.1-cp311-cp311-win32.whl", hash = "sha256:51675f9bc7536a3ac9893d8277a3af000ce4207ad978db219bdc715662ce1bcb"}, + {file = "pyFFTW-0.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:11c280b8062a201cc6aab6641b7a4f4d45d8e5f5f2d9ba2c1514c9510e0c5f32"}, + {file = "pyFFTW-0.13.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:c05b7ddec15070c72704d0ad5e632222b0775327ab6890af288a2a36eb15043e"}, + {file = "pyFFTW-0.13.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d872744959a4df7307b32fbeb288137ed242cf24034a791abb3ee901c8c1bf3e"}, + {file = "pyFFTW-0.13.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a67d3109fb2c549ee95c8dbbcf07020400672cbfb48f79c3f88b615a1c95598"}, + {file = "pyFFTW-0.13.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d799b442815f56b821b615ee3e8960ab9f3bc1e7a4bcbcf5813b847005875b47"}, + {file = "pyFFTW-0.13.1-cp39-cp39-win32.whl", hash = "sha256:18ac39489848a10785ddd998df242f58d5f75017c414297fee470bfdec202168"}, + {file = "pyFFTW-0.13.1-cp39-cp39-win_amd64.whl", hash = "sha256:af58834b496b473419c4dcd47e01657d1d066e9c23198e1cb82eba82356c9097"}, + {file = "pyFFTW-0.13.1-pp38-pypy38_pp73-macosx_10_13_x86_64.whl", hash = "sha256:415040bcadcad887bf112d2db0ff4b13e808d1aad7fddcd60acef20e0e11c84a"}, + {file = "pyFFTW-0.13.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e68503033864f9650f480624a0830b10367ad446cb7b5bef33d0d1c596519446"}, + {file = "pyFFTW-0.13.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7ccfa55d50a5464890a9486b835965e29f9df4e9d3e856cc51c9d2a34964e4a8"}, + {file = "pyFFTW-0.13.1.tar.gz", hash = "sha256:09155e90a0c6d0c1f2d1f3668180a7de95fb9f83fef5137a112fb05978e87320"}, +] + +[[package]] +name = "pygments" +version = "2.17.2" +requires_python = ">=3.7" +summary = "Pygments is a syntax highlighting package written in Python." +groups = ["default", "doc", "test"] +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[[package]] +name = "pylint" +version = "3.0.3" +requires_python = ">=3.8.0" +summary = "python code static checker" +groups = ["dev"] +dependencies = [ + "astroid<=3.1.0-dev0,>=3.0.1", + "colorama>=0.4.5; sys_platform == \"win32\"", + "dill>=0.2; python_version < \"3.11\"", + "dill>=0.3.6; python_version >= \"3.11\"", + "dill>=0.3.7; python_version >= \"3.12\"", + "isort!=5.13.0,<6,>=4.2.5", + "mccabe<0.8,>=0.6", + "platformdirs>=2.2.0", + "tomli>=1.1.0; python_version < \"3.11\"", + "tomlkit>=0.10.1", + "typing-extensions>=3.10.0; python_version < \"3.10\"", +] +files = [ + {file = "pylint-3.0.3-py3-none-any.whl", hash = "sha256:7a1585285aefc5165db81083c3e06363a27448f6b467b3b0f30dbd0ac1f73810"}, + {file = "pylint-3.0.3.tar.gz", hash = "sha256:58c2398b0301e049609a8429789ec6edf3aabe9b6c5fec916acd18639c16de8b"}, +] + +[[package]] +name = "pyparsing" +version = "3.1.1" +requires_python = ">=3.6.8" +summary = "pyparsing module - Classes and methods to define and execute parsing grammars" +groups = ["default", "test"] +files = [ + {file = "pyparsing-3.1.1-py3-none-any.whl", hash = "sha256:32c7c0b711493c72ff18a981d24f28aaf9c1fb7ed5e9667c9e84e3db623bdbfb"}, + {file = "pyparsing-3.1.1.tar.gz", hash = "sha256:ede28a1a32462f5a9705e07aea48001a08f7cf81a021585011deba701581a0db"}, +] + +[[package]] +name = "pyproject-metadata" +version = "0.7.1" +requires_python = ">=3.7" +summary = "PEP 621 metadata parsing" +groups = ["build"] +dependencies = [ + "packaging>=19.0", +] +files = [ + {file = "pyproject-metadata-0.7.1.tar.gz", hash = "sha256:0a94f18b108b9b21f3a26a3d541f056c34edcb17dc872a144a15618fed7aef67"}, + {file = "pyproject_metadata-0.7.1-py3-none-any.whl", hash = "sha256:28691fbb36266a819ec56c9fa1ecaf36f879d6944dfde5411e87fc4ff793aa60"}, +] + +[[package]] +name = "pytest" +version = "8.0.0" +requires_python = ">=3.8" +summary = "pytest: simple powerful testing with Python" +groups = ["test"] +dependencies = [ + "colorama; sys_platform == \"win32\"", + "exceptiongroup>=1.0.0rc8; python_version < \"3.11\"", + "iniconfig", + "packaging", + "pluggy<2.0,>=1.3.0", + "tomli>=1.0.0; python_version < \"3.11\"", +] +files = [ + {file = "pytest-8.0.0-py3-none-any.whl", hash = "sha256:50fb9cbe836c3f20f0dfa99c565201fb75dc54c8d76373cd1bde06b06657bdb6"}, + {file = "pytest-8.0.0.tar.gz", hash = "sha256:249b1b0864530ba251b7438274c4d251c58d868edaaec8762893ad4a0d71c36c"}, +] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +requires_python = ">=3.7" +summary = "Pytest plugin for measuring coverage." +groups = ["test"] +dependencies = [ + "coverage[toml]>=5.2.1", + "pytest>=4.6", +] +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +summary = "Extensions to the standard Python datetime module" +groups = ["default", "doc", "test"] +dependencies = [ + "six>=1.5", +] +files = [ + {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"}, +] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +requires_python = ">=3.6" +summary = "A python library adding a json log formatter" +groups = ["doc"] +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "pythran" +version = "0.15.0" +requires_python = ">=3.7" +summary = "Ahead of Time compiler for numeric kernels" +groups = ["build"] +dependencies = [ + "beniget~=0.4.0", + "gast~=0.5.0", + "numpy", + "ply>=3.4", + "setuptools", +] +files = [ + {file = "pythran-0.15.0-py3-none-any.whl", hash = "sha256:74d52f9b5fc4d307a48c7ee741dff3bcb55014f91b6fb851a22cd8f381d404d1"}, + {file = "pythran-0.15.0.tar.gz", hash = "sha256:f9bc61bcb96df2cd4b578abc5a62dfb3fbb0b0ef02c264513dfb615c5f87871c"}, +] + +[[package]] +name = "pytz" +version = "2024.1" +summary = "World timezone definitions, modern and historical" +groups = ["doc"] +files = [ + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, +] + +[[package]] +name = "pywin32" +version = "306" +summary = "Python for Window Extensions" +groups = ["doc"] +marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.12" +requires_python = ">=3.8" +summary = "Pseudo terminal support for Windows from Python." +groups = ["doc"] +marker = "os_name == \"nt\"" +files = [ + {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, + {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, + {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, + {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, + {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +requires_python = ">=3.6" +summary = "YAML parser and emitter for Python" +groups = ["default", "doc", "test"] +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyzmq" +version = "25.1.2" +requires_python = ">=3.6" +summary = "Python bindings for 0MQ" +groups = ["doc"] +dependencies = [ + "cffi; implementation_name == \"pypy\"", +] +files = [ + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, +] + +[[package]] +name = "qtconsole" +version = "5.5.1" +requires_python = ">= 3.8" +summary = "Jupyter Qt console" +groups = ["doc"] +dependencies = [ + "ipykernel>=4.1", + "jupyter-client>=4.1", + "jupyter-core", + "packaging", + "pygments", + "pyzmq>=17.1", + "qtpy>=2.4.0", + "traitlets!=5.2.1,!=5.2.2", +] +files = [ + {file = "qtconsole-5.5.1-py3-none-any.whl", hash = "sha256:8c75fa3e9b4ed884880ff7cea90a1b67451219279ec33deaee1d59e3df1a5d2b"}, + {file = "qtconsole-5.5.1.tar.gz", hash = "sha256:a0e806c6951db9490628e4df80caec9669b65149c7ba40f9bf033c025a5b56bc"}, +] + +[[package]] +name = "qtpy" +version = "2.4.1" +requires_python = ">=3.7" +summary = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +groups = ["default", "doc", "test"] +dependencies = [ + "packaging", +] +files = [ + {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, + {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, +] + +[[package]] +name = "referencing" +version = "0.33.0" +requires_python = ">=3.8" +summary = "JSON Referencing + Python" +groups = ["doc"] +dependencies = [ + "attrs>=22.2.0", + "rpds-py>=0.7.0", +] +files = [ + {file = "referencing-0.33.0-py3-none-any.whl", hash = "sha256:39240f2ecc770258f28b642dd47fd74bc8b02484de54e1882b74b35ebd779bd5"}, + {file = "referencing-0.33.0.tar.gz", hash = "sha256:c775fedf74bc0f9189c2a3be1c12fd03e8c23f4d371dce795df44e06c5b412f7"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +requires_python = ">=3.7" +summary = "Python HTTP for Humans." +groups = ["doc"] +dependencies = [ + "certifi>=2017.4.17", + "charset-normalizer<4,>=2", + "idna<4,>=2.5", + "urllib3<3,>=1.21.1", +] +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "A pure python RFC3339 validator" +groups = ["doc"] +dependencies = [ + "six", +] +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +summary = "Pure python rfc3986 validator" +groups = ["doc"] +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rpds-py" +version = "0.18.0" +requires_python = ">=3.8" +summary = "Python bindings to Rust's persistent data structures (rpds)" +groups = ["doc"] +files = [ + {file = "rpds_py-0.18.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:5b4e7d8d6c9b2e8ee2d55c90b59c707ca59bc30058269b3db7b1f8df5763557e"}, + {file = "rpds_py-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c463ed05f9dfb9baebef68048aed8dcdc94411e4bf3d33a39ba97e271624f8f7"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01e36a39af54a30f28b73096dd39b6802eddd04c90dbe161c1b8dbe22353189f"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d62dec4976954a23d7f91f2f4530852b0c7608116c257833922a896101336c51"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd18772815d5f008fa03d2b9a681ae38d5ae9f0e599f7dda233c439fcaa00d40"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:923d39efa3cfb7279a0327e337a7958bff00cc447fd07a25cddb0a1cc9a6d2da"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39514da80f971362f9267c600b6d459bfbbc549cffc2cef8e47474fddc9b45b1"}, + {file = "rpds_py-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a34d557a42aa28bd5c48a023c570219ba2593bcbbb8dc1b98d8cf5d529ab1434"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:93df1de2f7f7239dc9cc5a4a12408ee1598725036bd2dedadc14d94525192fc3"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:34b18ba135c687f4dac449aa5157d36e2cbb7c03cbea4ddbd88604e076aa836e"}, + {file = "rpds_py-0.18.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c0b5dcf9193625afd8ecc92312d6ed78781c46ecbf39af9ad4681fc9f464af88"}, + {file = "rpds_py-0.18.0-cp310-none-win32.whl", hash = "sha256:c4325ff0442a12113a6379af66978c3fe562f846763287ef66bdc1d57925d337"}, + {file = "rpds_py-0.18.0-cp310-none-win_amd64.whl", hash = "sha256:7223a2a5fe0d217e60a60cdae28d6949140dde9c3bcc714063c5b463065e3d66"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:3a96e0c6a41dcdba3a0a581bbf6c44bb863f27c541547fb4b9711fd8cf0ffad4"}, + {file = "rpds_py-0.18.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30f43887bbae0d49113cbaab729a112251a940e9b274536613097ab8b4899cf6"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcb25daa9219b4cf3a0ab24b0eb9a5cc8949ed4dc72acb8fa16b7e1681aa3c58"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d68c93e381010662ab873fea609bf6c0f428b6d0bb00f2c6939782e0818d37bf"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b34b7aa8b261c1dbf7720b5d6f01f38243e9b9daf7e6b8bc1fd4657000062f2c"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e6d75ab12b0bbab7215e5d40f1e5b738aa539598db27ef83b2ec46747df90e1"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b8612cd233543a3781bc659c731b9d607de65890085098986dfd573fc2befe5"}, + {file = "rpds_py-0.18.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:aec493917dd45e3c69d00a8874e7cbed844efd935595ef78a0f25f14312e33c6"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:661d25cbffaf8cc42e971dd570d87cb29a665f49f4abe1f9e76be9a5182c4688"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1df3659d26f539ac74fb3b0c481cdf9d725386e3552c6fa2974f4d33d78e544b"}, + {file = "rpds_py-0.18.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1ce3ba137ed54f83e56fb983a5859a27d43a40188ba798993812fed73c70836"}, + {file = "rpds_py-0.18.0-cp311-none-win32.whl", hash = "sha256:69e64831e22a6b377772e7fb337533c365085b31619005802a79242fee620bc1"}, + {file = "rpds_py-0.18.0-cp311-none-win_amd64.whl", hash = "sha256:998e33ad22dc7ec7e030b3df701c43630b5bc0d8fbc2267653577e3fec279afa"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7f2facbd386dd60cbbf1a794181e6aa0bd429bd78bfdf775436020172e2a23f0"}, + {file = "rpds_py-0.18.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d9a5be316c15ffb2b3c405c4ff14448c36b4435be062a7f578ccd8b01f0c4d8"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd5bf1af8efe569654bbef5a3e0a56eca45f87cfcffab31dd8dde70da5982475"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5417558f6887e9b6b65b4527232553c139b57ec42c64570569b155262ac0754f"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56a737287efecafc16f6d067c2ea0117abadcd078d58721f967952db329a3e5c"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f03bccbd8586e9dd37219bce4d4e0d3ab492e6b3b533e973fa08a112cb2ffc9"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4457a94da0d5c53dc4b3e4de1158bdab077db23c53232f37a3cb7afdb053a4e3"}, + {file = "rpds_py-0.18.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ab39c1ba9023914297dd88ec3b3b3c3f33671baeb6acf82ad7ce883f6e8e157"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9d54553c1136b50fd12cc17e5b11ad07374c316df307e4cfd6441bea5fb68496"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0af039631b6de0397ab2ba16eaf2872e9f8fca391b44d3d8cac317860a700a3f"}, + {file = "rpds_py-0.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:84ffab12db93b5f6bad84c712c92060a2d321b35c3c9960b43d08d0f639d60d7"}, + {file = "rpds_py-0.18.0-cp312-none-win32.whl", hash = "sha256:685537e07897f173abcf67258bee3c05c374fa6fff89d4c7e42fb391b0605e98"}, + {file = "rpds_py-0.18.0-cp312-none-win_amd64.whl", hash = "sha256:e003b002ec72c8d5a3e3da2989c7d6065b47d9eaa70cd8808b5384fbb970f4ec"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5307def11a35f5ae4581a0b658b0af8178c65c530e94893345bebf41cc139d33"}, + {file = "rpds_py-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77f195baa60a54ef9d2de16fbbfd3ff8b04edc0c0140a761b56c267ac11aa467"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39f5441553f1c2aed4de4377178ad8ff8f9d733723d6c66d983d75341de265ab"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9a00312dea9310d4cb7dbd7787e722d2e86a95c2db92fbd7d0155f97127bcb40"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f2fc11e8fe034ee3c34d316d0ad8808f45bc3b9ce5857ff29d513f3ff2923a1"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:586f8204935b9ec884500498ccc91aa869fc652c40c093bd9e1471fbcc25c022"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ddc2f4dfd396c7bfa18e6ce371cba60e4cf9d2e5cdb71376aa2da264605b60b9"}, + {file = "rpds_py-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ddcba87675b6d509139d1b521e0c8250e967e63b5909a7e8f8944d0f90ff36f"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7bd339195d84439cbe5771546fe8a4e8a7a045417d8f9de9a368c434e42a721e"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:d7c36232a90d4755b720fbd76739d8891732b18cf240a9c645d75f00639a9024"}, + {file = "rpds_py-0.18.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6b0817e34942b2ca527b0e9298373e7cc75f429e8da2055607f4931fded23e20"}, + {file = "rpds_py-0.18.0-cp39-none-win32.whl", hash = "sha256:99f70b740dc04d09e6b2699b675874367885217a2e9f782bdf5395632ac663b7"}, + {file = "rpds_py-0.18.0-cp39-none-win_amd64.whl", hash = "sha256:6ef687afab047554a2d366e112dd187b62d261d49eb79b77e386f94644363294"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad36cfb355e24f1bd37cac88c112cd7730873f20fb0bdaf8ba59eedf8216079f"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:36b3ee798c58ace201289024b52788161e1ea133e4ac93fba7d49da5fec0ef9e"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8a2f084546cc59ea99fda8e070be2fd140c3092dc11524a71aa8f0f3d5a55ca"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e4461d0f003a0aa9be2bdd1b798a041f177189c1a0f7619fe8c95ad08d9a45d7"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8db715ebe3bb7d86d77ac1826f7d67ec11a70dbd2376b7cc214199360517b641"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:793968759cd0d96cac1e367afd70c235867831983f876a53389ad869b043c948"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66e6a3af5a75363d2c9a48b07cb27c4ea542938b1a2e93b15a503cdfa8490795"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6ef0befbb5d79cf32d0266f5cff01545602344eda89480e1dd88aca964260b18"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1d4acf42190d449d5e89654d5c1ed3a4f17925eec71f05e2a41414689cda02d1"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a5f446dd5055667aabaee78487f2b5ab72e244f9bc0b2ffebfeec79051679984"}, + {file = "rpds_py-0.18.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9dbbeb27f4e70bfd9eec1be5477517365afe05a9b2c441a0b21929ee61048124"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:22806714311a69fd0af9b35b7be97c18a0fc2826e6827dbb3a8c94eac6cf7eeb"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:b34ae4636dfc4e76a438ab826a0d1eed2589ca7d9a1b2d5bb546978ac6485461"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c8370641f1a7f0e0669ddccca22f1da893cef7628396431eb445d46d893e5cd"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c8362467a0fdeccd47935f22c256bec5e6abe543bf0d66e3d3d57a8fb5731863"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11a8c85ef4a07a7638180bf04fe189d12757c696eb41f310d2426895356dcf05"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b316144e85316da2723f9d8dc75bada12fa58489a527091fa1d5a612643d1a0e"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf1ea2e34868f6fbf070e1af291c8180480310173de0b0c43fc38a02929fc0e3"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e546e768d08ad55b20b11dbb78a745151acbd938f8f00d0cfbabe8b0199b9880"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4901165d170a5fde6f589acb90a6b33629ad1ec976d4529e769c6f3d885e3e80"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:618a3d6cae6ef8ec88bb76dd80b83cfe415ad4f1d942ca2a903bf6b6ff97a2da"}, + {file = "rpds_py-0.18.0-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ed4eb745efbff0a8e9587d22a84be94a5eb7d2d99c02dacf7bd0911713ed14dd"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:6c81e5f372cd0dc5dc4809553d34f832f60a46034a5f187756d9b90586c2c307"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:43fbac5f22e25bee1d482c97474f930a353542855f05c1161fd804c9dc74a09d"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d7faa6f14017c0b1e69f5e2c357b998731ea75a442ab3841c0dbbbfe902d2c4"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:08231ac30a842bd04daabc4d71fddd7e6d26189406d5a69535638e4dcb88fe76"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:044a3e61a7c2dafacae99d1e722cc2d4c05280790ec5a05031b3876809d89a5c"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f26b5bd1079acdb0c7a5645e350fe54d16b17bfc5e71f371c449383d3342e17"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:482103aed1dfe2f3b71a58eff35ba105289b8d862551ea576bd15479aba01f66"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1374f4129f9bcca53a1bba0bb86bf78325a0374577cf7e9e4cd046b1e6f20e24"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:635dc434ff724b178cb192c70016cc0ad25a275228f749ee0daf0eddbc8183b1"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:bc362ee4e314870a70f4ae88772d72d877246537d9f8cb8f7eacf10884862432"}, + {file = "rpds_py-0.18.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:4832d7d380477521a8c1644bbab6588dfedea5e30a7d967b5fb75977c45fd77f"}, + {file = "rpds_py-0.18.0.tar.gz", hash = "sha256:42821446ee7a76f5d9f71f9e33a4fb2ffd724bb3e7f93386150b61a43115788d"}, +] + +[[package]] +name = "scikit-image" +version = "0.22.0" +requires_python = ">=3.9" +summary = "Image processing in Python" +groups = ["default", "test"] +dependencies = [ + "imageio>=2.27", + "lazy-loader>=0.3", + "networkx>=2.8", + "numpy>=1.22", + "packaging>=21", + "pillow>=9.0.1", + "scipy>=1.8", + "tifffile>=2022.8.12", +] +files = [ + {file = "scikit_image-0.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:74ec5c1d4693506842cc7c9487c89d8fc32aed064e9363def7af08b8f8cbb31d"}, + {file = "scikit_image-0.22.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:a05ae4fe03d802587ed8974e900b943275548cde6a6807b785039d63e9a7a5ff"}, + {file = "scikit_image-0.22.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a92dca3d95b1301442af055e196a54b5a5128c6768b79fc0a4098f1d662dee6"}, + {file = "scikit_image-0.22.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3663d063d8bf2fb9bdfb0ca967b9ee3b6593139c860c7abc2d2351a8a8863938"}, + {file = "scikit_image-0.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:ebdbdc901bae14dab637f8d5c99f6d5cc7aaf4a3b6f4003194e003e9f688a6fc"}, + {file = "scikit_image-0.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95d6da2d8a44a36ae04437c76d32deb4e3c993ffc846b394b9949fd8ded73cb2"}, + {file = "scikit_image-0.22.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:2c6ef454a85f569659b813ac2a93948022b0298516b757c9c6c904132be327e2"}, + {file = "scikit_image-0.22.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87872f067444ee90a00dd49ca897208308645382e8a24bd3e76f301af2352cd"}, + {file = "scikit_image-0.22.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5c378db54e61b491b9edeefff87e49fcf7fdf729bb93c777d7a5f15d36f743e"}, + {file = "scikit_image-0.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:2bcb74adb0634258a67f66c2bb29978c9a3e222463e003b67ba12056c003971b"}, + {file = "scikit_image-0.22.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:003ca2274ac0fac252280e7179ff986ff783407001459ddea443fe7916e38cff"}, + {file = "scikit_image-0.22.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:cf3c0c15b60ae3e557a0c7575fbd352f0c3ce0afca562febfe3ab80efbeec0e9"}, + {file = "scikit_image-0.22.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5b23908dd4d120e6aecb1ed0277563e8cbc8d6c0565bdc4c4c6475d53608452"}, + {file = "scikit_image-0.22.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be79d7493f320a964f8fcf603121595ba82f84720de999db0fcca002266a549a"}, + {file = "scikit_image-0.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:722b970aa5da725dca55252c373b18bbea7858c1cdb406e19f9b01a4a73b30b2"}, + {file = "scikit_image-0.22.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:22318b35044cfeeb63ee60c56fc62450e5fe516228138f1d06c7a26378248a86"}, + {file = "scikit_image-0.22.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:9e801c44a814afdadeabf4dffdffc23733e393767958b82319706f5fa3e1eaa9"}, + {file = "scikit_image-0.22.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c472a1fb3665ec5c00423684590631d95f9afcbc97f01407d348b821880b2cb3"}, + {file = "scikit_image-0.22.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b7a6c89e8d6252332121b58f50e1625c35f7d6a85489c0b6b7ee4f5155d547a"}, + {file = "scikit_image-0.22.0-cp39-cp39-win_amd64.whl", hash = "sha256:5071b8f6341bfb0737ab05c8ab4ac0261f9e25dbcc7b5d31e5ed230fd24a7929"}, + {file = "scikit_image-0.22.0.tar.gz", hash = "sha256:018d734df1d2da2719087d15f679d19285fce97cd37695103deadfaef2873236"}, +] + +[[package]] +name = "scipy" +version = "1.12.0" +requires_python = ">=3.9" +summary = "Fundamental algorithms for scientific computing in Python" +groups = ["default", "test"] +dependencies = [ + "numpy<1.29.0,>=1.22.4", +] +files = [ + {file = "scipy-1.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:78e4402e140879387187f7f25d91cc592b3501a2e51dfb320f48dfb73565f10b"}, + {file = "scipy-1.12.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f5f00ebaf8de24d14b8449981a2842d404152774c1a1d880c901bf454cb8e2a1"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e53958531a7c695ff66c2e7bb7b79560ffdc562e2051644c5576c39ff8efb563"}, + {file = "scipy-1.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e32847e08da8d895ce09d108a494d9eb78974cf6de23063f93306a3e419960c"}, + {file = "scipy-1.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4c1020cad92772bf44b8e4cdabc1df5d87376cb219742549ef69fc9fd86282dd"}, + {file = "scipy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:75ea2a144096b5e39402e2ff53a36fecfd3b960d786b7efd3c180e29c39e53f2"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:408c68423f9de16cb9e602528be4ce0d6312b05001f3de61fe9ec8b1263cad08"}, + {file = "scipy-1.12.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5adfad5dbf0163397beb4aca679187d24aec085343755fcdbdeb32b3679f254c"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3003652496f6e7c387b1cf63f4bb720951cfa18907e998ea551e6de51a04467"}, + {file = "scipy-1.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b8066bce124ee5531d12a74b617d9ac0ea59245246410e19bca549656d9a40a"}, + {file = "scipy-1.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8bee4993817e204d761dba10dbab0774ba5a8612e57e81319ea04d84945375ba"}, + {file = "scipy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a24024d45ce9a675c1fb8494e8e5244efea1c7a09c60beb1eeb80373d0fecc70"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e7e76cc48638228212c747ada851ef355c2bb5e7f939e10952bc504c11f4e372"}, + {file = "scipy-1.12.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:f7ce148dffcd64ade37b2df9315541f9adad6efcaa86866ee7dd5db0c8f041c3"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c39f92041f490422924dfdb782527a4abddf4707616e07b021de33467f917bc"}, + {file = "scipy-1.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ebda398f86e56178c2fa94cad15bf457a218a54a35c2a7b4490b9f9cb2676c"}, + {file = "scipy-1.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:95e5c750d55cf518c398a8240571b0e0782c2d5a703250872f36eaf737751338"}, + {file = "scipy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e646d8571804a304e1da01040d21577685ce8e2db08ac58e543eaca063453e1c"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:913d6e7956c3a671de3b05ccb66b11bc293f56bfdef040583a7221d9e22a2e35"}, + {file = "scipy-1.12.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba1b0c7256ad75401c73e4b3cf09d1f176e9bd4248f0d3112170fb2ec4db067"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:730badef9b827b368f351eacae2e82da414e13cf8bd5051b4bdfd720271a5371"}, + {file = "scipy-1.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6546dc2c11a9df6926afcbdd8a3edec28566e4e785b915e849348c6dd9f3f490"}, + {file = "scipy-1.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:196ebad3a4882081f62a5bf4aeb7326aa34b110e533aab23e4374fcccb0890dc"}, + {file = "scipy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:b360f1b6b2f742781299514e99ff560d1fe9bd1bff2712894b52abe528d1fd1e"}, + {file = "scipy-1.12.0.tar.gz", hash = "sha256:4bf5abab8a36d20193c698b0f1fc282c1d083c94723902c447e5d2f1780936a3"}, +] + +[[package]] +name = "send2trash" +version = "1.8.2" +requires_python = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +summary = "Send file to trash natively under Mac OS X, Windows and Linux" +groups = ["doc"] +files = [ + {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, + {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, +] + +[[package]] +name = "setuptools" +version = "69.1.0" +requires_python = ">=3.8" +summary = "Easily download, build, install, upgrade, and uninstall Python packages" +groups = ["build"] +files = [ + {file = "setuptools-69.1.0-py3-none-any.whl", hash = "sha256:c054629b81b946d63a9c6e732bc8b2513a7c3ea645f11d0139a2191d735c60c6"}, + {file = "setuptools-69.1.0.tar.gz", hash = "sha256:850894c4195f09c4ed30dba56213bf7c3f21d86ed6bdaafb5df5972593bfc401"}, +] + +[[package]] +name = "six" +version = "1.16.0" +requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +summary = "Python 2 and 3 compatibility utilities" +groups = ["default", "doc", "test"] +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "slicerator" +version = "1.1.0" +summary = "A lazy-loading, fancy-sliceable iterable." +groups = ["pims"] +files = [ + {file = "slicerator-1.1.0-py3-none-any.whl", hash = "sha256:167668d48c6d3a5ba0bd3d54b2688e81ee267dc20aef299e547d711e6f3c441a"}, + {file = "slicerator-1.1.0.tar.gz", hash = "sha256:44010a7f5cd87680c07213b5cabe81d1fb71252962943e5373ee7d14605d6046"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +requires_python = ">=3.7" +summary = "Sniff out which async library your code is running under" +groups = ["default", "doc", "test"] +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +summary = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +groups = ["doc"] +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +summary = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +groups = ["default", "test"] +files = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +requires_python = ">=3.8" +summary = "A modern CSS selector implementation for Beautiful Soup." +groups = ["doc"] +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "sphinx" +version = "7.2.6" +requires_python = ">=3.9" +summary = "Python documentation generator" +groups = ["doc"] +dependencies = [ + "Jinja2>=3.0", + "Pygments>=2.14", + "alabaster<0.8,>=0.7", + "babel>=2.9", + "colorama>=0.4.5; sys_platform == \"win32\"", + "docutils<0.21,>=0.18.1", + "imagesize>=1.3", + "importlib-metadata>=4.8; python_version < \"3.10\"", + "packaging>=21.0", + "requests>=2.25.0", + "snowballstemmer>=2.0", + "sphinxcontrib-applehelp", + "sphinxcontrib-devhelp", + "sphinxcontrib-htmlhelp>=2.0.0", + "sphinxcontrib-jsmath", + "sphinxcontrib-qthelp", + "sphinxcontrib-serializinghtml>=1.1.9", +] +files = [ + {file = "sphinx-7.2.6-py3-none-any.whl", hash = "sha256:1e09160a40b956dc623c910118fa636da93bd3ca0b9876a7b3df90f07d691560"}, + {file = "sphinx-7.2.6.tar.gz", hash = "sha256:9a5160e1ea90688d5963ba09a2dcd8bdd526620edbb65c328728f1b2228d5ab5"}, +] + +[[package]] +name = "sphinx-copybutton" +version = "0.5.2" +requires_python = ">=3.7" +summary = "Add a copy button to each of your code cells." +groups = ["doc"] +dependencies = [ + "sphinx>=1.8", +] +files = [ + {file = "sphinx-copybutton-0.5.2.tar.gz", hash = "sha256:4cf17c82fb9646d1bc9ca92ac280813a3b605d8c421225fd9913154103ee1fbd"}, + {file = "sphinx_copybutton-0.5.2-py3-none-any.whl", hash = "sha256:fb543fd386d917746c9a2c50360c7905b605726b9355cd26e9974857afeae06e"}, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.8" +requires_python = ">=3.9" +summary = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +groups = ["doc"] +files = [ + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, +] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.6" +requires_python = ">=3.9" +summary = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +groups = ["doc"] +files = [ + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, +] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.5" +requires_python = ">=3.9" +summary = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +groups = ["doc"] +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, +] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +requires_python = ">=3.5" +summary = "A sphinx extension which renders display math in HTML via JavaScript" +groups = ["doc"] +files = [ + {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"}, +] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.7" +requires_python = ">=3.9" +summary = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +groups = ["doc"] +files = [ + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, +] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.10" +requires_python = ">=3.9" +summary = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +groups = ["doc"] +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.27" +requires_python = ">=3.7" +summary = "Database Abstraction Library" +groups = ["doc"] +dependencies = [ + "greenlet!=0.4.17; platform_machine == \"win32\" or platform_machine == \"WIN32\" or platform_machine == \"AMD64\" or platform_machine == \"amd64\" or platform_machine == \"x86_64\" or platform_machine == \"ppc64le\" or platform_machine == \"aarch64\"", + "typing-extensions>=4.6.0", +] +files = [ + {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d04e579e911562f1055d26dab1868d3e0bb905db3bccf664ee8ad109f035618a"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fa67d821c1fd268a5a87922ef4940442513b4e6c377553506b9db3b83beebbd8"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c7a596d0be71b7baa037f4ac10d5e057d276f65a9a611c46970f012752ebf2d"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:954d9735ee9c3fa74874c830d089a815b7b48df6f6b6e357a74130e478dbd951"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5cd20f58c29bbf2680039ff9f569fa6d21453fbd2fa84dbdb4092f006424c2e6"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:03f448ffb731b48323bda68bcc93152f751436ad6037f18a42b7e16af9e91c07"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-win32.whl", hash = "sha256:d997c5938a08b5e172c30583ba6b8aad657ed9901fc24caf3a7152eeccb2f1b4"}, + {file = "SQLAlchemy-2.0.27-cp310-cp310-win_amd64.whl", hash = "sha256:eb15ef40b833f5b2f19eeae65d65e191f039e71790dd565c2af2a3783f72262f"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6c5bad7c60a392850d2f0fee8f355953abaec878c483dd7c3836e0089f046bf6"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3012ab65ea42de1be81fff5fb28d6db893ef978950afc8130ba707179b4284a"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dbcd77c4d94b23e0753c5ed8deba8c69f331d4fd83f68bfc9db58bc8983f49cd"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d177b7e82f6dd5e1aebd24d9c3297c70ce09cd1d5d37b43e53f39514379c029c"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:680b9a36029b30cf063698755d277885d4a0eab70a2c7c6e71aab601323cba45"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1306102f6d9e625cebaca3d4c9c8f10588735ef877f0360b5cdb4fdfd3fd7131"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-win32.whl", hash = "sha256:5b78aa9f4f68212248aaf8943d84c0ff0f74efc65a661c2fc68b82d498311fd5"}, + {file = "SQLAlchemy-2.0.27-cp311-cp311-win_amd64.whl", hash = "sha256:15e19a84b84528f52a68143439d0c7a3a69befcd4f50b8ef9b7b69d2628ae7c4"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0de1263aac858f288a80b2071990f02082c51d88335a1db0d589237a3435fe71"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce850db091bf7d2a1f2fdb615220b968aeff3849007b1204bf6e3e50a57b3d32"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dfc936870507da96aebb43e664ae3a71a7b96278382bcfe84d277b88e379b18"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4fbe6a766301f2e8a4519f4500fe74ef0a8509a59e07a4085458f26228cd7cc"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4535c49d961fe9a77392e3a630a626af5baa967172d42732b7a43496c8b28876"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0fb3bffc0ced37e5aa4ac2416f56d6d858f46d4da70c09bb731a246e70bff4d5"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-win32.whl", hash = "sha256:7f470327d06400a0aa7926b375b8e8c3c31d335e0884f509fe272b3c700a7254"}, + {file = "SQLAlchemy-2.0.27-cp312-cp312-win_amd64.whl", hash = "sha256:f9374e270e2553653d710ece397df67db9d19c60d2647bcd35bfc616f1622dcd"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d07ee7793f2aeb9b80ec8ceb96bc8cc08a2aec8a1b152da1955d64e4825fcbac"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cb0845e934647232b6ff5150df37ceffd0b67b754b9fdbb095233deebcddbd4a"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fc19ae2e07a067663dd24fca55f8ed06a288384f0e6e3910420bf4b1270cc51"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b90053be91973a6fb6020a6e44382c97739736a5a9d74e08cc29b196639eb979"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2f5c9dfb0b9ab5e3a8a00249534bdd838d943ec4cfb9abe176a6c33408430230"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33e8bde8fff203de50399b9039c4e14e42d4d227759155c21f8da4a47fc8053c"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-win32.whl", hash = "sha256:d873c21b356bfaf1589b89090a4011e6532582b3a8ea568a00e0c3aab09399dd"}, + {file = "SQLAlchemy-2.0.27-cp39-cp39-win_amd64.whl", hash = "sha256:ff2f1b7c963961d41403b650842dc2039175b906ab2093635d8319bef0b7d620"}, + {file = "SQLAlchemy-2.0.27-py3-none-any.whl", hash = "sha256:1ab4e0448018d01b142c916cc7119ca573803a4745cfe341b8f95657812700ac"}, + {file = "SQLAlchemy-2.0.27.tar.gz", hash = "sha256:86a6ed69a71fe6b88bf9331594fa390a2adda4a49b5c06f98e47bf0d392534f8"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +summary = "Extract data from python stack frames and tracebacks for informative displays" +groups = ["default", "doc", "test"] +dependencies = [ + "asttokens>=2.1.0", + "executing>=1.2.0", + "pure-eval", +] +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +requires_python = ">=3.7" +summary = "Pretty-print tabular data" +groups = ["doc"] +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[[package]] +name = "terminado" +version = "0.18.0" +requires_python = ">=3.8" +summary = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +groups = ["doc"] +dependencies = [ + "ptyprocess; os_name != \"nt\"", + "pywinpty>=1.1.0; os_name == \"nt\"", + "tornado>=6.1.0", +] +files = [ + {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, + {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, +] + +[[package]] +name = "tifffile" +version = "2024.2.12" +requires_python = ">=3.9" +summary = "Read and write TIFF files" +groups = ["default", "test"] +dependencies = [ + "numpy", +] +files = [ + {file = "tifffile-2024.2.12-py3-none-any.whl", hash = "sha256:870998f82fbc94ff7c3528884c1b0ae54863504ff51dbebea431ac3fa8fb7c21"}, + {file = "tifffile-2024.2.12.tar.gz", hash = "sha256:4920a3ec8e8e003e673d3c6531863c99eedd570d1b8b7e141c072ed78ff8030d"}, +] + +[[package]] +name = "tinycss2" +version = "1.2.1" +requires_python = ">=3.7" +summary = "A tiny CSS parser" +groups = ["doc"] +dependencies = [ + "webencodings>=0.4", +] +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +requires_python = ">=3.7" +summary = "A lil' TOML parser" +groups = ["build", "default", "dev", "doc", "test"] +marker = "python_version < \"3.11\"" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.3" +requires_python = ">=3.7" +summary = "Style preserving TOML library" +groups = ["dev"] +files = [ + {file = "tomlkit-0.12.3-py3-none-any.whl", hash = "sha256:b0a645a9156dc7cb5d3a1f0d4bab66db287fcb8e0430bdd4664a095ea16414ba"}, + {file = "tomlkit-0.12.3.tar.gz", hash = "sha256:75baf5012d06501f07bee5bf8e801b9f343e7aac5a92581f20f80ce632e6b5a4"}, +] + +[[package]] +name = "toolz" +version = "0.12.1" +requires_python = ">=3.7" +summary = "List processing tools and functional utilities" +groups = ["default", "test"] +files = [ + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, +] + +[[package]] +name = "tornado" +version = "6.4" +requires_python = ">= 3.8" +summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +groups = ["doc"] +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + +[[package]] +name = "traitlets" +version = "5.14.1" +requires_python = ">=3.8" +summary = "Traitlets Python configuration system" +groups = ["default", "doc", "test"] +files = [ + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, +] + +[[package]] +name = "transonic" +version = "0.6.2" +requires_python = ">=3.9" +summary = "Make your Python code fly at transonic speeds!" +groups = ["build", "default", "test"] +dependencies = [ + "autopep8", + "beniget~=0.4.0", + "gast~=0.5.0", + "numpy", +] +files = [ + {file = "transonic-0.6.2-py3-none-any.whl", hash = "sha256:07534c54354276e3d63632b075d6c275ab3a4f3b1009d7a38771e88cb988031e"}, + {file = "transonic-0.6.2.tar.gz", hash = "sha256:74fa7acc5d819a3b8507d01600a17ab18ae7869ec59bf0ef7b1c9a8b92c58a7e"}, +] + +[[package]] +name = "trio" +version = "0.24.0" +requires_python = ">=3.8" +summary = "A friendly Python library for async concurrency and I/O" +groups = ["default", "test"] +dependencies = [ + "attrs>=20.1.0", + "cffi>=1.14; os_name == \"nt\" and implementation_name != \"pypy\"", + "exceptiongroup; python_version < \"3.11\"", + "idna", + "outcome", + "sniffio>=1.3.0", + "sortedcontainers", +] +files = [ + {file = "trio-0.24.0-py3-none-any.whl", hash = "sha256:c3bd3a4e3e3025cd9a2241eae75637c43fe0b9e88b4c97b9161a55b9e54cd72c"}, + {file = "trio-0.24.0.tar.gz", hash = "sha256:ffa09a74a6bf81b84f8613909fb0beaee84757450183a7a2e0b47b455c0cac5d"}, +] + +[[package]] +name = "types-python-dateutil" +version = "2.8.19.20240106" +requires_python = ">=3.8" +summary = "Typing stubs for python-dateutil" +groups = ["doc"] +files = [ + {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, + {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, +] + +[[package]] +name = "typing-extensions" +version = "4.9.0" +requires_python = ">=3.8" +summary = "Backported and Experimental Type Hints for Python 3.8+" +groups = ["default", "dev", "doc", "test"] +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "tzdata" +version = "2024.1" +requires_python = ">=2" +summary = "Provider of IANA time zone data" +groups = ["doc"] +files = [ + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +requires_python = ">=3.7" +summary = "RFC 6570 URI Template Processor" +groups = ["doc"] +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[[package]] +name = "urllib3" +version = "2.2.0" +requires_python = ">=3.8" +summary = "HTTP library with thread-safe connection pooling, file post, and more." +groups = ["doc"] +files = [ + {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, + {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, +] + +[[package]] +name = "wcwidth" +version = "0.2.13" +summary = "Measures the displayed width of unicode strings in a terminal" +groups = ["default", "doc", "test"] +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "1.13" +requires_python = ">=3.7" +summary = "A library for working with the color formats defined by HTML and CSS." +groups = ["doc"] +files = [ + {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, + {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +summary = "Character encoding aliases for legacy web content" +groups = ["doc"] +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.7.0" +requires_python = ">=3.8" +summary = "WebSocket client for Python with low level API options" +groups = ["doc"] +files = [ + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, +] + +[[package]] +name = "widgetsnbextension" +version = "4.0.10" +requires_python = ">=3.7" +summary = "Jupyter interactive widgets for Jupyter Notebook" +groups = ["doc"] +files = [ + {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, + {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, +] + +[[package]] +name = "zipp" +version = "3.17.0" +requires_python = ">=3.8" +summary = "Backport of pathlib-compatible object wrapper for zip files" +groups = ["default", "doc", "test"] +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] diff --git a/pylintrc b/pylintrc index abecd221..67fac493 100644 --- a/pylintrc +++ b/pylintrc @@ -1,15 +1,634 @@ +[MAIN] + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Clear in-memory caches upon conclusion of linting. Useful if running pylint +# in a server-like mode. +clear-cache-post-run=no + +# Load and enable all available extensions. Use --list-extensions to see a list +# all available extensions. +#enable-all-extensions= + +# In error mode, messages with a category besides ERROR or FATAL are +# suppressed, and no reports are done by default. Error mode is compatible with +# disabling specific errors. +#errors-only= + +# Always return a 0 (non-error) status code, even if lint errors are found. +# This is primarily useful in continuous integration scripts. +#exit-zero= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) +extension-pkg-whitelist= + +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold under which the program will exit with error. +fail-under=10 + +# Interpret the stdin as a python script, whose filename needs to be passed as +# the module_or_package argument. +#from-stdin= + +# Files or directories to be skipped. They should be base names, not paths. +ignore=CVS + +# Add files or directories matching the regular expressions patterns to the +# ignore-list. The regex matches against paths and can be in Posix or Windows +# format. Because '\\' represents the directory delimiter on Windows systems, +# it can't be used as an escape character. +ignore-paths= + +# Files or directories matching the regular expression patterns are skipped. +# The regex matches against base names, not paths. The default value ignores +# Emacs file locks +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use, and will cap the count on Windows to +# avoid hangs. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.9 + +# Discover python modules and packages in the file system subtree. +recursive=no + +# Add paths to the list of the source roots. Supports globbing patterns. The +# source root is an absolute path or a path relative to the current working +# directory used to determine a package namespace for modules located under the +# source root. +source-roots= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + +# In verbose mode, extra non-checker-related info will be displayed. +#verbose= + + [BASIC] -# Regular expression matching correct constant names -const-rgx=[a-z_][a-z0-9_]{1,30}$ +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. If left empty, argument names will be checked with the set +# naming style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. +#class-attribute-rgx= + +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. If left empty, class names will be checked with the set naming style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=snake_case + +# Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. If left empty, function names will be checked with the set +# naming style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _ + +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. If left empty, method names will be checked with the set naming style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. If left empty, module names will be checked with the set naming style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Regular expression matching correct type alias names. If left empty, type +# alias names will be checked with the set naming style. +#typealias-rgx= + +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. If left empty, variable names will be checked with the set +# naming style. +#variable-rgx= + + +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + asyncSetUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict,_fields,_replace,_source,_make,os._exit + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=mcs + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions=builtins.BaseException,builtins.Exception + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow explicit reexports by alias from a package __init__. +allow-reexport-from-package=no + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[LOGGING] + +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. +logging-format-style=old + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence=HIGH, + CONTROL_FLOW, + INFERENCE, + INFERENCE_FAILURE, + UNDEFINED + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then re-enable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + use-implicit-booleaness-not-comparison-to-string, + use-implicit-booleaness-not-comparison-to-zero + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable= + + +[METHOD_ARGS] + +# List of qualified names (i.e., library.method) which require a timeout +# parameter e.g. 'requests.api.get,requests.api.post' +timeout-methods=requests.api.delete,requests.api.get,requests.api.head,requests.api.options,requests.api.patch,requests.api.post,requests.api.put,requests.api.request + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + +# Regular expression of note tags to take in consideration. +notes-rgx= + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +msg-template= + +# Set the output format. Available formats are: text, parseable, colorized, +# json2 (improved json format), json (old json format) and msvs (visual +# studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[SIMILARITIES] + +# Comments are removed from the similarity computation +ignore-comments=yes + +# Docstrings are removed from the similarity computation +ignore-docstrings=yes + +# Imports are removed from the similarity computation +ignore-imports=yes + +# Signatures are removed from the similarity computation +ignore-signatures=yes + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. No available dictionaries : You need to install +# both the python package and the system dependency for enchant to work. +spelling-dict= + +# List of comma separated words that should be considered directives if they +# appear at the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[STRING] + +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. +check-str-concat-over-line-jumps=no + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of symbolic message names to ignore for Mixin members. +ignored-checks-for-mixins=no-member, + not-async-context-manager, + not-context-manager, + attribute-defined-outside-init + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# Regex pattern to define which classes are considered mixins. +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of names allowed to shadow builtins +allowed-redefined-builtins= + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ -# Regular expression matching correct variable names -variable-rgx=[a-z_][a-z0-9_]{1,30}$ +# Argument names that match this expression will be ignored. +ignored-argument-names=_.*|^ignored_|^unused_ -# Naming hint for variable names -variable-name-hint=[a-z_][a-z0-9_]{1,30}$ +# Tells whether we should check for unused import in __init__ files. +init-import=no -disable=C0103,W0621,W0212,C0330,W1202,W1203 \ No newline at end of file +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io diff --git a/pyproject.toml b/pyproject.toml index edb8f5e9..886f19df 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,157 @@ [build-system] requires = [ - "setuptools", - "wheel", - "setuptools_scm", - "transonic >= 0.2.2", - ] + "meson-python", + "numpy", + "transonic>=0.6.2", + "pythran>=0.9.7", +] +build-backend = 'mesonpy' -build-backend = "setuptools.build_meta" +[project] +name = "fluidimage" +version = "0.1.5" +description = "Fluid image processing with Python." +authors = [ + {name = "Pierre Augier", email = "pierre.augier@legi.cnrs.fr"}, +] +dependencies = [ + "numpy >= 1.8", + "matplotlib >= 3.4", + "scipy >= 0.14.1", + "h5py", + "h5netcdf", + "transonic>=0.6.2", + "fluiddyn", + "pyfftw >= 0.10.4", + "imageio", + "scikit-image >= 0.12.3", + "trio >=0.13", + "dask[array]", + "ipython", +] +requires-python = ">=3.9,<3.13" +readme = "README.md" +license = {text = "CeCILL"} +keywords = [ + "PIV", +] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Education", + "Intended Audience :: Science/Research", + "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.9", + "Topic :: Scientific/Engineering", +] -[tox] -isolated_build = "True" +[project.urls] +Homepage = "https://foss.heptapod.net/fluiddyn/fluidimage" + +[project.scripts] +fluidimviewer-pg = "fluidimage.gui.pg_main:main" +fluidimviewer = "fluidimage.gui.imviewer:main" +fluidimlauncher = "fluidimage.gui.launcher.main:main" + +[project.optional-dependencies] +pims = ["pims"] +opencv = ["opencv-python"] +# qt = ["PySide6"] + +[tool.meson-python.args] +setup = ['-Doptimization=3'] + + +[tool.pdm] +distribution = true +package-dir = "src" +ignore_package_warnings = ["ipython"] + +[tool.pdm.dev-dependencies] + +# because meson-python editable build needs the build dependencies +build = [ + "meson-python", + "numpy", + "transonic>=0.6.1", + "pythran>=0.9.7", + "ninja", +] +doc = [ + "sphinx", + "pydata-sphinx-theme", + "numpydoc", + "jupyter", + "pandas", + "myst-nb", + "sphinx-copybutton", +] +test = [ + "pytest", + "coverage", + "pytest-cov", + "fluidimage[opencv]" +] +# test-qt = ["pytest-qt"] + +dev = [ + "pip", + "black", + "pylint", + "isort", +] + +[tool.pdm.scripts] +black = "black src doc" +isort = "isort -rc --atomic -tc src bench doc/examples" +black_check = "black --check src doc" +lint = {shell="pylint -rn --rcfile=pylintrc --jobs=$(nproc) src doc --exit-zero"} +validate_code = {composite = ["black_check", "lint"]} + +[tool.pdm.options] +lock = ["-G", ":all"] +sync = ["--no-isolation"] +install = ["--no-isolation"] + + +[tool.coverage.run] +source = ["./src"] +data_file = ".coverage/coverage" +omit = [ + "**/__pythran__/*.py", + "**/__python__/*.py", + "**/__numba__/*.py", +] +[tool.coverage.report] +show_missing = true +exclude_lines = [ + "if __name__ == .__main__.:", + "if \"sphinx\" in sys.modules:", + "raise ValueError", + "raise NotImplementedError", + "raise ImportError", + "except KeyError:", + "except ImportError:", + "except AttributeError:", + "except NotImplementedError:", +] + +[tool.coverage.html] +directory = ".coverage" + +[tool.coverage.xml] +output = ".coverage/coverage.xml" + + +[tool.black] +line-length = 82 +target-version = ["py39"] +extend-exclude = "/(__pythran__|__python__|__numba__|build|doc/_build|\\.ipynb_checkpoints/*)/" + + +[tool.isort] +profile = "black" +line_length = 82 +src_paths = ["src", "doc"] diff --git a/requirements/dev.txt b/requirements/dev.txt deleted file mode 100644 index 7e5a4185..00000000 --- a/requirements/dev.txt +++ /dev/null @@ -1,516 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --extra=dev --output-file=requirements/dev.txt --resolver=backtracking requirements/vcs_packages.in setup.cfg -# -alabaster==0.7.12 - # via sphinx -anyio==3.6.2 - # via jupyter-server -argon2-cffi==21.3.0 - # via - # jupyter-server - # nbclassic - # notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -arrow==1.2.3 - # via isoduration -asttokens==2.2.1 - # via stack-data -async-generator==1.10 - # via trio -attrs==22.1.0 - # via - # jsonschema - # outcome - # pytest - # trio -autopep8==2.0.0 - # via transonic -babel==2.11.0 - # via sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.11.1 - # via nbconvert -beniget==0.4.1 - # via transonic -bleach==5.0.1 - # via nbconvert -certifi==2022.12.7 - # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==2.1.1 - # via requests -click==8.1.3 - # via dask -cloudpickle==2.2.0 - # via dask -comm==0.1.2 - # via ipykernel -commonmark==0.9.1 - # via recommonmark -contourpy==1.0.6 - # via matplotlib -coverage[toml]==6.5.0 - # via - # fluidimage (setup.cfg) - # pytest-cov -cycler==0.11.0 - # via matplotlib -dask[array]==2022.12.0 - # via fluidimage (setup.cfg) -debugpy==1.6.4 - # via ipykernel -decorator==5.1.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -distro==1.8.0 - # via fluiddyn -docutils==0.17.1 - # via - # nbsphinx - # recommonmark - # sphinx - # sphinx-rtd-theme -entrypoints==0.4 - # via jupyter-client -exceptiongroup==1.0.4 - # via - # pytest - # trio -executing==1.2.0 - # via stack-data -fastjsonschema==2.16.2 - # via nbformat -fluiddyn==0.5.1 - # via fluidimage (setup.cfg) -fonttools==4.38.0 - # via matplotlib -fqdn==1.5.1 - # via jsonschema -fsspec==2022.11.0 - # via dask -gast==0.5.3 - # via - # beniget - # transonic -h5netcdf==1.1.0 - # via - # fluiddyn - # fluidimage (setup.cfg) -h5py==3.7.0 - # via - # fluiddyn - # fluidimage (setup.cfg) - # h5netcdf -idna==3.4 - # via - # anyio - # jsonschema - # requests - # trio -imageio==2.22.4 - # via - # fluidimage (setup.cfg) - # pims - # scikit-image -imagesize==1.4.1 - # via sphinx -importlib-metadata==5.1.0 - # via - # nbconvert - # sphinx -iniconfig==1.1.1 - # via pytest -ipykernel==6.19.2 - # via - # ipywidgets - # jupyter - # jupyter-console - # nbclassic - # notebook - # qtconsole -ipython==8.7.0 - # via - # fluidimage (setup.cfg) - # ipykernel - # ipywidgets - # jupyter-console -ipython-genutils==0.2.0 - # via - # nbclassic - # notebook - # qtconsole -ipywidgets==8.0.3 - # via jupyter -isoduration==20.11.0 - # via jsonschema -jedi==0.18.2 - # via ipython -jinja2==3.1.2 - # via - # jupyter-server - # nbclassic - # nbconvert - # nbsphinx - # notebook - # numpydoc - # sphinx -jsonpointer==2.3 - # via jsonschema -jsonschema[format-nongpl]==4.17.3 - # via - # jupyter-events - # nbformat -jupyter==1.0.0 - # via fluidimage (setup.cfg) -jupyter-client==7.4.8 - # via - # ipykernel - # jupyter-console - # jupyter-server - # nbclassic - # nbclient - # notebook - # qtconsole -jupyter-console==6.4.4 - # via jupyter -jupyter-core==5.1.0 - # via - # jupyter-client - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook - # qtconsole -jupyter-events==0.5.0 - # via jupyter-server -jupyter-server==2.0.1 - # via - # nbclassic - # notebook-shim -jupyter-server-terminals==0.4.2 - # via jupyter-server -jupyterlab-pygments==0.2.2 - # via nbconvert -jupyterlab-widgets==3.0.4 - # via ipywidgets -kiwisolver==1.4.4 - # via matplotlib -locket==1.0.0 - # via partd -markupsafe==2.1.1 - # via - # jinja2 - # nbconvert -matplotlib==3.6.2 - # via - # fluiddyn - # fluidimage (setup.cfg) -matplotlib-inline==0.1.6 - # via - # ipykernel - # ipython -mistune==2.0.4 - # via nbconvert -nbclassic==0.4.8 - # via notebook -nbclient==0.7.2 - # via nbconvert -nbconvert==7.2.6 - # via - # jupyter - # jupyter-server - # nbclassic - # nbsphinx - # notebook -nbformat==5.7.0 - # via - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # nbsphinx - # notebook -nbsphinx==0.8.10 - # via fluidimage (setup.cfg) -nest-asyncio==1.5.6 - # via - # ipykernel - # jupyter-client - # nbclassic - # notebook -networkx==2.8.8 - # via scikit-image -notebook==6.5.2 - # via jupyter -notebook-shim==0.2.2 - # via nbclassic -numpy==1.23.5 - # via - # contourpy - # dask - # fluiddyn - # fluidimage (setup.cfg) - # h5py - # imageio - # matplotlib - # opencv-python - # pims - # pyfftw - # pywavelets - # scikit-image - # scipy - # tifffile - # transonic -numpydoc==1.5.0 - # via fluidimage (setup.cfg) -opencv-python==4.6.0.66 - # via fluidimage (setup.cfg) -outcome==1.2.0 - # via trio -packaging==22.0 - # via - # dask - # h5netcdf - # ipykernel - # jupyter-server - # matplotlib - # nbconvert - # pytest - # qtpy - # scikit-image - # sphinx -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -partd==1.3.0 - # via dask -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==9.3.0 - # via - # imageio - # matplotlib - # scikit-image -pims==0.6.1 - # via fluidimage (setup.cfg) -platformdirs==2.6.0 - # via jupyter-core -pluggy==1.0.0 - # via pytest -prometheus-client==0.15.0 - # via - # jupyter-server - # nbclassic - # notebook -prompt-toolkit==3.0.36 - # via - # ipython - # jupyter-console -psutil==5.9.4 - # via - # fluiddyn - # ipykernel -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pure-eval==0.2.2 - # via stack-data -pycodestyle==2.10.0 - # via autopep8 -pycparser==2.21 - # via cffi -pyfftw==0.13.0 - # via fluidimage (setup.cfg) -pygments==2.13.0 - # via - # ipython - # jupyter-console - # nbconvert - # qtconsole - # sphinx -pyparsing==3.0.9 - # via matplotlib -pyqt5==5.14.2 - # via fluidimage (setup.cfg) -pyqt5-sip==12.11.0 - # via pyqt5 -pyrsistent==0.19.2 - # via jsonschema -pytest==7.2.0 - # via - # fluidimage (setup.cfg) - # pytest-cov - # pytest-qt -pytest-cov==4.0.0 - # via fluidimage (setup.cfg) -pytest-qt==4.2.0 - # via fluidimage (setup.cfg) -python-dateutil==2.8.2 - # via - # arrow - # jupyter-client - # matplotlib -python-json-logger==2.0.4 - # via jupyter-events -pytz==2022.6 - # via babel -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0 - # via - # dask - # jupyter-events -pyzmq==24.0.1 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook - # qtconsole -qtconsole==5.4.0 - # via jupyter -qtpy==2.3.0 - # via - # fluiddyn - # qtconsole -recommonmark==0.7.1 - # via fluidimage (setup.cfg) -requests==2.28.1 - # via sphinx -rfc3339-validator==0.1.4 - # via jsonschema -rfc3986-validator==0.1.1 - # via jsonschema -scikit-image==0.19.3 - # via fluidimage (setup.cfg) -scipy==1.9.3 - # via - # fluidimage (setup.cfg) - # scikit-image -send2trash==1.8.0 - # via - # jupyter-server - # nbclassic - # notebook -six==1.16.0 - # via - # asttokens - # bleach - # python-dateutil - # rfc3339-validator -slicerator==1.1.0 - # via pims -sniffio==1.3.0 - # via - # anyio - # trio -snowballstemmer==2.2.0 - # via sphinx -sortedcontainers==2.4.0 - # via trio -soupsieve==2.3.2.post1 - # via beautifulsoup4 -sphinx==5.3.0 - # via - # fluidimage (setup.cfg) - # nbsphinx - # numpydoc - # recommonmark - # sphinx-rtd-theme -sphinx-rtd-theme==1.1.1 - # via fluidimage (setup.cfg) -sphinxcontrib-applehelp==1.0.2 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -stack-data==0.6.2 - # via ipython -terminado==0.17.1 - # via - # jupyter-server - # jupyter-server-terminals - # nbclassic - # notebook -tifffile==2022.10.10 - # via scikit-image -tinycss2==1.2.1 - # via nbconvert -tomli==2.0.1 - # via - # autopep8 - # coverage - # pytest -toolz==0.12.0 - # via - # dask - # partd -tornado==6.2 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook - # terminado -traitlets==5.7.0 - # via - # comm - # ipykernel - # ipython - # ipywidgets - # jupyter-client - # jupyter-core - # jupyter-events - # jupyter-server - # matplotlib-inline - # nbclassic - # nbclient - # nbconvert - # nbformat - # nbsphinx - # notebook - # qtconsole -transonic==0.5.1 - # via fluidimage (setup.cfg) -trio==0.22.0 - # via fluidimage (setup.cfg) -uri-template==1.2.0 - # via jsonschema -urllib3==1.26.13 - # via requests -wcwidth==0.2.5 - # via prompt-toolkit -webcolors==1.12 - # via jsonschema -webencodings==0.5.1 - # via - # bleach - # tinycss2 -websocket-client==1.4.2 - # via jupyter-server -widgetsnbextension==4.0.4 - # via ipywidgets -zipp==3.11.0 - # via importlib-metadata diff --git a/requirements/doc.txt b/requirements/doc.txt deleted file mode 100644 index d4481e66..00000000 --- a/requirements/doc.txt +++ /dev/null @@ -1,492 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --extra=doc --output-file=requirements/doc.txt --resolver=backtracking requirements/vcs_packages.in setup.cfg -# -alabaster==0.7.12 - # via sphinx -anyio==3.6.2 - # via jupyter-server -argon2-cffi==21.3.0 - # via - # jupyter-server - # nbclassic - # notebook -argon2-cffi-bindings==21.2.0 - # via argon2-cffi -arrow==1.2.3 - # via isoduration -asttokens==2.2.1 - # via stack-data -async-generator==1.10 - # via trio -attrs==22.1.0 - # via - # jsonschema - # outcome - # trio -autopep8==2.0.0 - # via transonic -babel==2.11.0 - # via sphinx -backcall==0.2.0 - # via ipython -beautifulsoup4==4.11.1 - # via nbconvert -beniget==0.4.1 - # via transonic -bleach==5.0.1 - # via nbconvert -certifi==2022.12.7 - # via requests -cffi==1.15.1 - # via argon2-cffi-bindings -charset-normalizer==2.1.1 - # via requests -click==8.1.3 - # via dask -cloudpickle==2.2.0 - # via dask -comm==0.1.2 - # via ipykernel -commonmark==0.9.1 - # via recommonmark -contourpy==1.0.6 - # via matplotlib -cycler==0.11.0 - # via matplotlib -dask[array]==2022.12.0 - # via fluidimage (setup.cfg) -debugpy==1.6.4 - # via ipykernel -decorator==5.1.1 - # via ipython -defusedxml==0.7.1 - # via nbconvert -distro==1.8.0 - # via fluiddyn -docutils==0.17.1 - # via - # nbsphinx - # recommonmark - # sphinx - # sphinx-rtd-theme -entrypoints==0.4 - # via jupyter-client -exceptiongroup==1.0.4 - # via trio -executing==1.2.0 - # via stack-data -fastjsonschema==2.16.2 - # via nbformat -fluiddyn==0.5.1 - # via fluidimage (setup.cfg) -fonttools==4.38.0 - # via matplotlib -fqdn==1.5.1 - # via jsonschema -fsspec==2022.11.0 - # via dask -gast==0.5.3 - # via - # beniget - # transonic -h5netcdf==1.1.0 - # via - # fluiddyn - # fluidimage (setup.cfg) -h5py==3.7.0 - # via - # fluiddyn - # fluidimage (setup.cfg) - # h5netcdf -idna==3.4 - # via - # anyio - # jsonschema - # requests - # trio -imageio==2.22.4 - # via - # fluidimage (setup.cfg) - # pims - # scikit-image -imagesize==1.4.1 - # via sphinx -importlib-metadata==5.1.0 - # via - # nbconvert - # sphinx -ipykernel==6.19.2 - # via - # ipywidgets - # jupyter - # jupyter-console - # nbclassic - # notebook - # qtconsole -ipython==8.7.0 - # via - # fluidimage (setup.cfg) - # ipykernel - # ipywidgets - # jupyter-console -ipython-genutils==0.2.0 - # via - # nbclassic - # notebook - # qtconsole -ipywidgets==8.0.3 - # via jupyter -isoduration==20.11.0 - # via jsonschema -jedi==0.18.2 - # via ipython -jinja2==3.1.2 - # via - # jupyter-server - # nbclassic - # nbconvert - # nbsphinx - # notebook - # numpydoc - # sphinx -jsonpointer==2.3 - # via jsonschema -jsonschema[format-nongpl]==4.17.3 - # via - # jupyter-events - # nbformat -jupyter==1.0.0 - # via fluidimage (setup.cfg) -jupyter-client==7.4.8 - # via - # ipykernel - # jupyter-console - # jupyter-server - # nbclassic - # nbclient - # notebook - # qtconsole -jupyter-console==6.4.4 - # via jupyter -jupyter-core==5.1.0 - # via - # jupyter-client - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # nbformat - # notebook - # qtconsole -jupyter-events==0.5.0 - # via jupyter-server -jupyter-server==2.0.1 - # via - # nbclassic - # notebook-shim -jupyter-server-terminals==0.4.2 - # via jupyter-server -jupyterlab-pygments==0.2.2 - # via nbconvert -jupyterlab-widgets==3.0.4 - # via ipywidgets -kiwisolver==1.4.4 - # via matplotlib -locket==1.0.0 - # via partd -markupsafe==2.1.1 - # via - # jinja2 - # nbconvert -matplotlib==3.6.2 - # via - # fluiddyn - # fluidimage (setup.cfg) -matplotlib-inline==0.1.6 - # via - # ipykernel - # ipython -mistune==2.0.4 - # via nbconvert -nbclassic==0.4.8 - # via notebook -nbclient==0.7.2 - # via nbconvert -nbconvert==7.2.6 - # via - # jupyter - # jupyter-server - # nbclassic - # nbsphinx - # notebook -nbformat==5.7.0 - # via - # jupyter-server - # nbclassic - # nbclient - # nbconvert - # nbsphinx - # notebook -nbsphinx==0.8.10 - # via fluidimage (setup.cfg) -nest-asyncio==1.5.6 - # via - # ipykernel - # jupyter-client - # nbclassic - # notebook -networkx==2.8.8 - # via scikit-image -notebook==6.5.2 - # via jupyter -notebook-shim==0.2.2 - # via nbclassic -numpy==1.23.5 - # via - # contourpy - # dask - # fluiddyn - # fluidimage (setup.cfg) - # h5py - # imageio - # matplotlib - # opencv-python - # pims - # pyfftw - # pywavelets - # scikit-image - # scipy - # tifffile - # transonic -numpydoc==1.5.0 - # via fluidimage (setup.cfg) -opencv-python==4.6.0.66 - # via fluidimage (setup.cfg) -outcome==1.2.0 - # via trio -packaging==22.0 - # via - # dask - # h5netcdf - # ipykernel - # jupyter-server - # matplotlib - # nbconvert - # qtpy - # scikit-image - # sphinx -pandocfilters==1.5.0 - # via nbconvert -parso==0.8.3 - # via jedi -partd==1.3.0 - # via dask -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==9.3.0 - # via - # imageio - # matplotlib - # scikit-image -pims==0.6.1 - # via fluidimage (setup.cfg) -platformdirs==2.6.0 - # via jupyter-core -prometheus-client==0.15.0 - # via - # jupyter-server - # nbclassic - # notebook -prompt-toolkit==3.0.36 - # via - # ipython - # jupyter-console -psutil==5.9.4 - # via - # fluiddyn - # ipykernel -ptyprocess==0.7.0 - # via - # pexpect - # terminado -pure-eval==0.2.2 - # via stack-data -pycodestyle==2.10.0 - # via autopep8 -pycparser==2.21 - # via cffi -pyfftw==0.13.0 - # via fluidimage (setup.cfg) -pygments==2.13.0 - # via - # ipython - # jupyter-console - # nbconvert - # qtconsole - # sphinx -pyparsing==3.0.9 - # via matplotlib -pyqt5==5.14.2 - # via fluidimage (setup.cfg) -pyqt5-sip==12.11.0 - # via pyqt5 -pyrsistent==0.19.2 - # via jsonschema -python-dateutil==2.8.2 - # via - # arrow - # jupyter-client - # matplotlib -python-json-logger==2.0.4 - # via jupyter-events -pytz==2022.6 - # via babel -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0 - # via - # dask - # jupyter-events -pyzmq==24.0.1 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook - # qtconsole -qtconsole==5.4.0 - # via jupyter -qtpy==2.3.0 - # via - # fluiddyn - # qtconsole -recommonmark==0.7.1 - # via fluidimage (setup.cfg) -requests==2.28.1 - # via sphinx -rfc3339-validator==0.1.4 - # via jsonschema -rfc3986-validator==0.1.1 - # via jsonschema -scikit-image==0.19.3 - # via fluidimage (setup.cfg) -scipy==1.9.3 - # via - # fluidimage (setup.cfg) - # scikit-image -send2trash==1.8.0 - # via - # jupyter-server - # nbclassic - # notebook -six==1.16.0 - # via - # asttokens - # bleach - # python-dateutil - # rfc3339-validator -slicerator==1.1.0 - # via pims -sniffio==1.3.0 - # via - # anyio - # trio -snowballstemmer==2.2.0 - # via sphinx -sortedcontainers==2.4.0 - # via trio -soupsieve==2.3.2.post1 - # via beautifulsoup4 -sphinx==5.3.0 - # via - # fluidimage (setup.cfg) - # nbsphinx - # numpydoc - # recommonmark - # sphinx-rtd-theme -sphinx-rtd-theme==1.1.1 - # via fluidimage (setup.cfg) -sphinxcontrib-applehelp==1.0.2 - # via sphinx -sphinxcontrib-devhelp==1.0.2 - # via sphinx -sphinxcontrib-htmlhelp==2.0.0 - # via sphinx -sphinxcontrib-jsmath==1.0.1 - # via sphinx -sphinxcontrib-qthelp==1.0.3 - # via sphinx -sphinxcontrib-serializinghtml==1.1.5 - # via sphinx -stack-data==0.6.2 - # via ipython -terminado==0.17.1 - # via - # jupyter-server - # jupyter-server-terminals - # nbclassic - # notebook -tifffile==2022.10.10 - # via scikit-image -tinycss2==1.2.1 - # via nbconvert -tomli==2.0.1 - # via autopep8 -toolz==0.12.0 - # via - # dask - # partd -tornado==6.2 - # via - # ipykernel - # jupyter-client - # jupyter-server - # nbclassic - # notebook - # terminado -traitlets==5.7.0 - # via - # comm - # ipykernel - # ipython - # ipywidgets - # jupyter-client - # jupyter-core - # jupyter-events - # jupyter-server - # matplotlib-inline - # nbclassic - # nbclient - # nbconvert - # nbformat - # nbsphinx - # notebook - # qtconsole -transonic==0.5.1 - # via fluidimage (setup.cfg) -trio==0.22.0 - # via fluidimage (setup.cfg) -uri-template==1.2.0 - # via jsonschema -urllib3==1.26.13 - # via requests -wcwidth==0.2.5 - # via prompt-toolkit -webcolors==1.12 - # via jsonschema -webencodings==0.5.1 - # via - # bleach - # tinycss2 -websocket-client==1.4.2 - # via jupyter-server -widgetsnbextension==4.0.4 - # via ipywidgets -zipp==3.11.0 - # via importlib-metadata diff --git a/requirements/main.txt b/requirements/main.txt deleted file mode 100644 index b52c1406..00000000 --- a/requirements/main.txt +++ /dev/null @@ -1,183 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --output-file=requirements/main.txt --resolver=backtracking setup.cfg -# -asttokens==2.2.1 - # via stack-data -async-generator==1.10 - # via trio -attrs==22.1.0 - # via - # outcome - # trio -autopep8==2.0.0 - # via transonic -backcall==0.2.0 - # via ipython -beniget==0.4.1 - # via transonic -click==8.1.3 - # via dask -cloudpickle==2.2.0 - # via dask -contourpy==1.0.6 - # via matplotlib -cycler==0.11.0 - # via matplotlib -dask[array]==2022.12.0 - # via fluidimage (setup.cfg) -decorator==5.1.1 - # via ipython -distro==1.8.0 - # via fluiddyn -exceptiongroup==1.0.4 - # via trio -executing==1.2.0 - # via stack-data -fluiddyn==0.5.1 - # via fluidimage (setup.cfg) -fonttools==4.38.0 - # via matplotlib -fsspec==2022.11.0 - # via dask -gast==0.5.3 - # via - # beniget - # transonic -h5netcdf==1.1.0 - # via - # fluiddyn - # fluidimage (setup.cfg) -h5py==3.7.0 - # via - # fluiddyn - # fluidimage (setup.cfg) - # h5netcdf -idna==3.4 - # via trio -imageio==2.22.4 - # via - # fluidimage (setup.cfg) - # pims - # scikit-image -ipython==8.7.0 - # via fluidimage (setup.cfg) -jedi==0.18.2 - # via ipython -kiwisolver==1.4.4 - # via matplotlib -locket==1.0.0 - # via partd -matplotlib==3.6.2 - # via - # fluiddyn - # fluidimage (setup.cfg) -matplotlib-inline==0.1.6 - # via ipython -networkx==2.8.8 - # via scikit-image -numpy==1.23.5 - # via - # contourpy - # dask - # fluiddyn - # fluidimage (setup.cfg) - # h5py - # imageio - # matplotlib - # opencv-python - # pims - # pyfftw - # pywavelets - # scikit-image - # scipy - # tifffile - # transonic -opencv-python==4.6.0.66 - # via fluidimage (setup.cfg) -outcome==1.2.0 - # via trio -packaging==22.0 - # via - # dask - # h5netcdf - # matplotlib - # qtpy - # scikit-image -parso==0.8.3 - # via jedi -partd==1.3.0 - # via dask -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==9.3.0 - # via - # imageio - # matplotlib - # scikit-image -pims==0.6.1 - # via fluidimage (setup.cfg) -prompt-toolkit==3.0.36 - # via ipython -psutil==5.9.4 - # via fluiddyn -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.2 - # via stack-data -pycodestyle==2.10.0 - # via autopep8 -pyfftw==0.13.0 - # via fluidimage (setup.cfg) -pygments==2.13.0 - # via ipython -pyparsing==3.0.9 - # via matplotlib -python-dateutil==2.8.2 - # via matplotlib -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0 - # via dask -qtpy==2.3.0 - # via fluiddyn -scikit-image==0.19.3 - # via fluidimage (setup.cfg) -scipy==1.9.3 - # via - # fluidimage (setup.cfg) - # scikit-image -six==1.16.0 - # via - # asttokens - # python-dateutil -slicerator==1.1.0 - # via pims -sniffio==1.3.0 - # via trio -sortedcontainers==2.4.0 - # via trio -stack-data==0.6.2 - # via ipython -tifffile==2022.10.10 - # via scikit-image -tomli==2.0.1 - # via autopep8 -toolz==0.12.0 - # via - # dask - # partd -traitlets==5.7.0 - # via - # ipython - # matplotlib-inline -transonic==0.5.1 - # via fluidimage (setup.cfg) -trio==0.22.0 - # via fluidimage (setup.cfg) -wcwidth==0.2.5 - # via prompt-toolkit diff --git a/requirements/test.txt b/requirements/test.txt deleted file mode 100644 index 7e0f0fe9..00000000 --- a/requirements/test.txt +++ /dev/null @@ -1,211 +0,0 @@ -# -# This file is autogenerated by pip-compile with Python 3.9 -# by the following command: -# -# pip-compile --extra=test --output-file=requirements/test.txt --resolver=backtracking requirements/vcs_packages.in setup.cfg -# -asttokens==2.2.1 - # via stack-data -async-generator==1.10 - # via trio -attrs==22.1.0 - # via - # outcome - # pytest - # trio -autopep8==2.0.0 - # via transonic -backcall==0.2.0 - # via ipython -beniget==0.4.1 - # via transonic -click==8.1.3 - # via dask -cloudpickle==2.2.0 - # via dask -contourpy==1.0.6 - # via matplotlib -coverage[toml]==6.5.0 - # via - # fluidimage (setup.cfg) - # pytest-cov -cycler==0.11.0 - # via matplotlib -dask[array]==2022.12.0 - # via fluidimage (setup.cfg) -decorator==5.1.1 - # via ipython -distro==1.8.0 - # via fluiddyn -exceptiongroup==1.0.4 - # via - # pytest - # trio -executing==1.2.0 - # via stack-data -fluiddyn==0.5.1 - # via fluidimage (setup.cfg) -fonttools==4.38.0 - # via matplotlib -fsspec==2022.11.0 - # via dask -gast==0.5.3 - # via - # beniget - # transonic -h5netcdf==1.1.0 - # via - # fluiddyn - # fluidimage (setup.cfg) -h5py==3.7.0 - # via - # fluiddyn - # fluidimage (setup.cfg) - # h5netcdf -idna==3.4 - # via trio -imageio==2.22.4 - # via - # fluidimage (setup.cfg) - # pims - # scikit-image -iniconfig==1.1.1 - # via pytest -ipython==8.7.0 - # via fluidimage (setup.cfg) -jedi==0.18.2 - # via ipython -kiwisolver==1.4.4 - # via matplotlib -locket==1.0.0 - # via partd -matplotlib==3.6.2 - # via - # fluiddyn - # fluidimage (setup.cfg) -matplotlib-inline==0.1.6 - # via ipython -networkx==2.8.8 - # via scikit-image -numpy==1.23.5 - # via - # contourpy - # dask - # fluiddyn - # fluidimage (setup.cfg) - # h5py - # imageio - # matplotlib - # opencv-python - # pims - # pyfftw - # pywavelets - # scikit-image - # scipy - # tifffile - # transonic -opencv-python==4.6.0.66 - # via fluidimage (setup.cfg) -outcome==1.2.0 - # via trio -packaging==22.0 - # via - # dask - # h5netcdf - # matplotlib - # pytest - # qtpy - # scikit-image -parso==0.8.3 - # via jedi -partd==1.3.0 - # via dask -pexpect==4.8.0 - # via ipython -pickleshare==0.7.5 - # via ipython -pillow==9.3.0 - # via - # imageio - # matplotlib - # scikit-image -pims==0.6.1 - # via fluidimage (setup.cfg) -pluggy==1.0.0 - # via pytest -prompt-toolkit==3.0.36 - # via ipython -psutil==5.9.4 - # via fluiddyn -ptyprocess==0.7.0 - # via pexpect -pure-eval==0.2.2 - # via stack-data -pycodestyle==2.10.0 - # via autopep8 -pyfftw==0.13.0 - # via fluidimage (setup.cfg) -pygments==2.13.0 - # via ipython -pyparsing==3.0.9 - # via matplotlib -pyqt5==5.14.2 - # via fluidimage (setup.cfg) -pyqt5-sip==12.11.0 - # via pyqt5 -pytest==7.2.0 - # via - # fluidimage (setup.cfg) - # pytest-cov - # pytest-qt -pytest-cov==4.0.0 - # via fluidimage (setup.cfg) -pytest-qt==4.2.0 - # via fluidimage (setup.cfg) -python-dateutil==2.8.2 - # via matplotlib -pywavelets==1.4.1 - # via scikit-image -pyyaml==6.0 - # via dask -qtpy==2.3.0 - # via fluiddyn -scikit-image==0.19.3 - # via fluidimage (setup.cfg) -scipy==1.9.3 - # via - # fluidimage (setup.cfg) - # scikit-image -six==1.16.0 - # via - # asttokens - # python-dateutil -slicerator==1.1.0 - # via pims -sniffio==1.3.0 - # via trio -sortedcontainers==2.4.0 - # via trio -stack-data==0.6.2 - # via ipython -tifffile==2022.10.10 - # via scikit-image -tomli==2.0.1 - # via - # autopep8 - # coverage - # pytest -toolz==0.12.0 - # via - # dask - # partd -traitlets==5.7.0 - # via - # ipython - # matplotlib-inline -transonic==0.5.1 - # via fluidimage (setup.cfg) -trio==0.22.0 - # via fluidimage (setup.cfg) -wcwidth==0.2.5 - # via prompt-toolkit diff --git a/requirements/vcs_packages.in b/requirements/vcs_packages.in deleted file mode 100644 index e69de29b..00000000 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 8764c00e..00000000 --- a/setup.cfg +++ /dev/null @@ -1,81 +0,0 @@ - -[options] -python_requires = >= 3.9 - -install_requires = - fluiddyn >= 0.3.4 - transonic >= 0.2.2 - scipy >= 0.14.1 - numpy >= 1.8 - matplotlib >= 3.4 - pyfftw >= 0.10.4 - imageio - scikit-image >= 0.12.3 - h5py - h5netcdf - pims - trio >=0.13 - dask[array] - ipython - opencv-python - -[options.extras_require] - -doc = - sphinx<7 - sphinx_rtd_theme - numpydoc - jupyter - nbsphinx - recommonmark - PyQt5==5.14.2 - -test = - pytest - pytest-qt - PyQt5==5.14.2 - coverage[toml] - pytest-cov - -dev = - %(doc)s - %(test)s - -[flake8] -ignore = E501,E225,E226,E303,E201,E202,E203,W503 - -[coverage:run] -source = ./fluidimage -data_file = .coverage/coverage -omit = */test*.py - */_try_*.py - */_bench_*.py - */_evaluate_*.py - */more_experimental_executors/*.py - fluidimage/old_topo/* - fluidimage/postproc/postproc.py - -[coverage:report] -show_missing = True -exclude_lines = - raise ValueError - raise NotImplementedError - raise ImportError - raise RuntimeError - raise TypeError - except ImportError: - if test: - if check: - if __name__ == "__main__": - if "sphinx" in sys.modules: - -[coverage:html] -directory = .coverage/html - -[coverage:xml] -output = .coverage/coverage.xml - -[isort] -line_length = 82 -known_first_party = fluiddyn,fluiddoc,fluidimage,transonic -multi_line_output = 3 diff --git a/setup.py b/setup.py deleted file mode 100644 index 6463dd28..00000000 --- a/setup.py +++ /dev/null @@ -1,182 +0,0 @@ -import os -import sys -from pathlib import Path -from logging import ERROR, INFO -from distutils.util import strtobool - -from runpy import run_path - -from setuptools import setup, find_packages - -from transonic.dist import ParallelBuildExt, get_logger -import setuptools_scm - -if sys.version_info[:2] < (3, 9): - raise RuntimeError("Python version >= 3.9 required.") - -if "egg_info" in sys.argv: - level = ERROR -else: - level = INFO - -logger = get_logger("fluidimage") -logger.setLevel(level) - -build_dependencies_backends = { - "pythran": ["pythran>=0.9.7"], - "cython": ["cython"], - "python": [], - "numba": [], -} - -TRANSONIC_BACKEND = os.environ.get("FLUIDIMAGE_TRANSONIC_BACKEND", "pythran") - -if "DISABLE_PYTHRAN" in os.environ: - DISABLE_PYTHRAN = strtobool(os.environ["DISABLE_PYTHRAN"]) - - if ( - "FLUIDIMAGE_TRANSONIC_BACKEND" in os.environ - and DISABLE_PYTHRAN - and TRANSONIC_BACKEND == "pythran" - ): - raise ValueError - - if DISABLE_PYTHRAN: - TRANSONIC_BACKEND = "python" - - -if TRANSONIC_BACKEND not in build_dependencies_backends: - raise ValueError( - f"FLUIDIMAGE_TRANSONIC_BACKEND={TRANSONIC_BACKEND} " - f"not in {list(build_dependencies_backends.keys())}" - ) - -setup_requires = [] -setup_requires.extend(build_dependencies_backends[TRANSONIC_BACKEND]) - -here = Path(__file__).parent.absolute() - -path_image_samples = here / "image_samples" -if path_image_samples.exists(): - with open("fluidimage/_path_image_samples.py", "w") as file: - file.write( - "from pathlib import Path\n\n" - f'path_image_samples = Path(r"{path_image_samples}")\n' - ) - -# Get the long description from the relevant file -with open("README.rst") as file: - long_description = file.read() -lines = long_description.splitlines(True) -for i, line in enumerate(lines): - if line.endswith(":alt: Code coverage\n"): - iline_coverage = i - break - -long_description = "".join(lines[iline_coverage + 2 :]) - -# Get the version from the relevant file -d = run_path("fluidimage/_version.py") -__version__ = d["__version__"] - - -def write_rev(rev): - with open("fluidimage/_hg_rev.py", "w") as file: - file.write(f'hg_rev = "{rev}"\n') - - -try: - full_version = setuptools_scm.get_version() -except (LookupError, OSError): - revision = "?" -else: - try: - revision = full_version.split("+")[1] - except IndexError: - revision = full_version - if "." in revision: - revision = revision.split(".")[0] -write_rev(revision) - - -def transonize(): - - from transonic.dist import make_backend_files - - paths = [ - "fluidimage/calcul/correl.py", - "fluidimage/topologies/example.py", - "fluidimage/calcul/interpolate/thin_plate_spline.py", - "fluidimage/calcul/subpix.py", - ] - make_backend_files([here / path for path in paths]) - - -def create_pythran_extensions(): - import numpy as np - from transonic.dist import init_pythran_extensions - - compile_arch = os.getenv("CARCH", "native") - extensions = init_pythran_extensions( - "fluidimage", - include_dirs=np.get_include(), - compile_args=("-O3", f"-march={compile_arch}", "-DUSE_XSIMD"), - ) - return extensions - - -def create_extensions(): - if "egg_info" in sys.argv or "dist_info" in sys.argv: - return [] - - logger.info("Running fluidimage setup.py on platform " + sys.platform) - - transonize() - - ext_modules = create_pythran_extensions() - - if ext_modules: - logger.info( - "The following extensions could be built if necessary:\n" - + "".join([ext.name + "\n" for ext in ext_modules]) - ) - - return ext_modules - - -setup( - name="fluidimage", - version=__version__, - description=("fluid image processing with Python."), - long_description=long_description, - keywords="PIV", - author="Pierre Augier", - author_email="pierre.augier@legi.cnrs.fr", - url="https://foss.heptapod.net/fluiddyn/fluidimage", - python_requires=">=3.9", - license="CeCILL", - classifiers=[ - # How mature is this project? Common values are - # 3 - Alpha - # 4 - Beta - # 5 - Production/Stable - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Science/Research", - "Intended Audience :: Education", - "Topic :: Scientific/Engineering", - "License :: OSI Approved :: GNU General Public License v2 (GPLv2)", - # actually CeCILL License (GPL compatible license for French laws) - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - ], - packages=find_packages(exclude=["doc", "include", "scripts"]), - scripts=["bin/fluidimviewer", "bin/fluidimlauncher"], - entry_points={ - "console_scripts": ["fluidimviewer-pg = fluidimage.gui.pg_main:main"] - }, - setup_requires=setup_requires, - ext_modules=create_extensions(), - cmdclass={"build_ext": ParallelBuildExt}, -) diff --git a/fluidimage/__init__.py b/src/fluidimage/__init__.py similarity index 100% rename from fluidimage/__init__.py rename to src/fluidimage/__init__.py diff --git a/fluidimage/_opencv.py b/src/fluidimage/_opencv.py similarity index 96% rename from fluidimage/_opencv.py rename to src/fluidimage/_opencv.py index 3bd1a884..632cf6b3 100644 --- a/fluidimage/_opencv.py +++ b/src/fluidimage/_opencv.py @@ -14,3 +14,5 @@ " pip install opencv-python\n" " conda install -c conda-forge opencv" ) + +__all__ = ["cv2"] diff --git a/src/fluidimage/_version.py b/src/fluidimage/_version.py new file mode 100644 index 00000000..e1ae1e1c --- /dev/null +++ b/src/fluidimage/_version.py @@ -0,0 +1,9 @@ +from importlib import metadata + +__version__ = metadata.version(__package__) + + +try: + from fluidimage._hg_rev import hg_rev +except ImportError: + hg_rev = "?" diff --git a/fluidimage/calcul/__init__.py b/src/fluidimage/calcul/__init__.py similarity index 100% rename from fluidimage/calcul/__init__.py rename to src/fluidimage/calcul/__init__.py diff --git a/fluidimage/calcul/_evaluate_subpix.py b/src/fluidimage/calcul/_evaluate_subpix.py similarity index 99% rename from fluidimage/calcul/_evaluate_subpix.py rename to src/fluidimage/calcul/_evaluate_subpix.py index 5c9621ea..4756069e 100644 --- a/fluidimage/calcul/_evaluate_subpix.py +++ b/src/fluidimage/calcul/_evaluate_subpix.py @@ -30,7 +30,6 @@ def setUpImages(nx, ny, dx, dy, part_size): - displacements = np.array([dx, dy]) nb_particles = (nx // 4) ** 2 diff --git a/fluidimage/calcul/_try_correl_images_diff_sizes.py b/src/fluidimage/calcul/_try_correl_images_diff_sizes.py similarity index 100% rename from fluidimage/calcul/_try_correl_images_diff_sizes.py rename to src/fluidimage/calcul/_try_correl_images_diff_sizes.py diff --git a/fluidimage/calcul/_try_correl_images_same_size.py b/src/fluidimage/calcul/_try_correl_images_same_size.py similarity index 100% rename from fluidimage/calcul/_try_correl_images_same_size.py rename to src/fluidimage/calcul/_try_correl_images_same_size.py diff --git a/fluidimage/calcul/correl.cu b/src/fluidimage/calcul/correl.cu similarity index 100% rename from fluidimage/calcul/correl.cu rename to src/fluidimage/calcul/correl.cu diff --git a/fluidimage/calcul/correl.py b/src/fluidimage/calcul/correl.py similarity index 98% rename from fluidimage/calcul/correl.py rename to src/fluidimage/calcul/correl.py index 0d2bfa8a..0bfca3f6 100644 --- a/fluidimage/calcul/correl.py +++ b/src/fluidimage/calcul/correl.py @@ -77,7 +77,6 @@ def parse_displacement_max(displ_max, im0_shape): def _compute_indices_max(correl, norm): - iy, ix = np.unravel_index(np.nanargmax(correl), correl.shape) if norm == 0: @@ -120,7 +119,6 @@ def __init__( nb_peaks_to_search=1, mode=None, ): - self.mode = mode self.subpix = SubPix(method=method_subpix, nsubpix=nsubpix) @@ -156,8 +154,8 @@ def compute_displacements_from_correl(self, correl, norm=1.0): try: ix, iy, correl_max = _compute_indices_max(correl, norm) - except PIVError as e: - ix, iy, correl_max = e.results + except PIVError as piv_error: + ix, iy, correl_max = piv_error.results # second chance to find a better peak... correl[ iy - self.particle_radius : iy + self.particle_radius + 1, @@ -165,10 +163,10 @@ def compute_displacements_from_correl(self, correl, norm=1.0): ] = np.nan try: ix2, iy2, correl_max2 = _compute_indices_max(correl, norm) - except PIVError as e2: + except PIVError as _piv_error: dx, dy = self.compute_displacement_from_indices(ix, iy) - e.results = (dx, dy, correl_max) - raise e + _piv_error.results = (dx, dy, correl_max) + raise _piv_error else: ix, iy, correl_max = ix2, iy2, correl_max2 @@ -223,7 +221,7 @@ def correl_numpy(im0: A, im1: A, disp_max: int): displacement max. Notes - ------- + ----- im1_shape inf to im0_shape @@ -316,7 +314,6 @@ class CorrelPythran(CorrelBase): _tag = "pythran" def _init2(self): - if self.displacement_max is None: if self.im0_shape == self.im1_shape: displacement_max = min(self.im0_shape) // 2 - 1 @@ -353,7 +350,6 @@ class CorrelPyCuda(CorrelBase): _tag = "pycuda" def _init2(self): - if self.displacement_max is None: if self.im0_shape == self.im1_shape: displacement_max = min(self.im0_shape) // 2 @@ -578,7 +574,6 @@ def __call__(self, im0, im1): if (self.ny0 < 2 * self.displacement_max + self.ny1) & ( self.nx0 < 2 * self.displacement_max + self.nx1 ): - im0b = np.zeros( ( 2 * self.displacement_max + self.ny1, @@ -630,7 +625,6 @@ class CorrelFFTBase(CorrelBase): _tag = "fft.base" def _init2(self): - if self.displacement_max is not None: where_large_displacement = np.zeros(self.im0_shape, dtype=bool) @@ -655,7 +649,6 @@ def _check_im_shape(self, im0_shape, im1_shape): ) def compute_displacements_from_correl(self, correl, norm=1.0): - """Compute the displacement (with subpix) from a correlation.""" if self.displacement_max is not None: diff --git a/fluidimage/calcul/correl_pycuda.py b/src/fluidimage/calcul/correl_pycuda.py similarity index 100% rename from fluidimage/calcul/correl_pycuda.py rename to src/fluidimage/calcul/correl_pycuda.py diff --git a/fluidimage/calcul/errors.py b/src/fluidimage/calcul/errors.py similarity index 100% rename from fluidimage/calcul/errors.py rename to src/fluidimage/calcul/errors.py diff --git a/fluidimage/calcul/fft.py b/src/fluidimage/calcul/fft.py similarity index 99% rename from fluidimage/calcul/fft.py rename to src/fluidimage/calcul/fft.py index 63f49fd4..7a6d4724 100644 --- a/fluidimage/calcul/fft.py +++ b/src/fluidimage/calcul/fft.py @@ -69,7 +69,6 @@ class CUFFT2DReal2Complex: type_complex = "complex64" def __init__(self, nx, ny): - shapeX = [ny, nx] shapeK = [ny, nx] @@ -125,7 +124,6 @@ class SKCUFFT2DReal2Complex: type_complex = "complex64" def __init__(self, nx, ny): - shapeX = [ny, nx] shapeK = [ny, nx // 2 + 1] @@ -173,7 +171,6 @@ class FFTW2DReal2Complex: type_complex = "complex64" def __init__(self, nx, ny): - shapeX = [ny, nx] shapeK = [ny, nx // 2 + 1] diff --git a/fluidimage/calcul/interpolate/__init__.py b/src/fluidimage/calcul/interpolate/__init__.py similarity index 100% rename from fluidimage/calcul/interpolate/__init__.py rename to src/fluidimage/calcul/interpolate/__init__.py diff --git a/fluidimage/calcul/interpolate/_bench_tps.py b/src/fluidimage/calcul/interpolate/_bench_tps.py similarity index 100% rename from fluidimage/calcul/interpolate/_bench_tps.py rename to src/fluidimage/calcul/interpolate/_bench_tps.py diff --git a/fluidimage/calcul/interpolate/_bench_tps_matrix.py b/src/fluidimage/calcul/interpolate/_bench_tps_matrix.py similarity index 100% rename from fluidimage/calcul/interpolate/_bench_tps_matrix.py rename to src/fluidimage/calcul/interpolate/_bench_tps_matrix.py diff --git a/fluidimage/calcul/interpolate/_try_cusolve.py b/src/fluidimage/calcul/interpolate/_try_cusolve.py similarity index 100% rename from fluidimage/calcul/interpolate/_try_cusolve.py rename to src/fluidimage/calcul/interpolate/_try_cusolve.py diff --git a/fluidimage/calcul/interpolate/_try_griddata.py b/src/fluidimage/calcul/interpolate/_try_griddata.py similarity index 99% rename from fluidimage/calcul/interpolate/_try_griddata.py rename to src/fluidimage/calcul/interpolate/_try_griddata.py index 6d2e2bc0..eb2df3e4 100644 --- a/fluidimage/calcul/interpolate/_try_griddata.py +++ b/src/fluidimage/calcul/interpolate/_try_griddata.py @@ -64,7 +64,6 @@ def myplot(i, x, y, U, title=None): t0 = clock() if method == "tps": - # calculate tps coeff U_smooth, U_tps = compute_tps_coeff(centers, U, 0) # evaluate interpolation on the new grid @@ -76,7 +75,6 @@ def myplot(i, x, y, U, title=None): DUX_eval, DUY_eval = tps.compute_gradient(U_tps) elif method == "tps_subdom": - smoothing_coef = 0.5 subdom_size = 50 @@ -90,11 +88,9 @@ def myplot(i, x, y, U, title=None): U_eval = tps.compute_eval(U_tps) elif method == "griddata_mpl": - U_eval = mlab.griddata(x, y, U, xI, yI, "linear") elif method == "griddata_scipy": - grid_x, grid_y = np.meshgrid(xI, yI) # nearest, linear, cubic U_eval = interpolate.griddata(centers.T, U, (grid_x, grid_y), "cubic", 0) diff --git a/fluidimage/calcul/interpolate/_try_interpolation.py b/src/fluidimage/calcul/interpolate/_try_interpolation.py similarity index 100% rename from fluidimage/calcul/interpolate/_try_interpolation.py rename to src/fluidimage/calcul/interpolate/_try_interpolation.py diff --git a/fluidimage/calcul/interpolate/_try_tps.py b/src/fluidimage/calcul/interpolate/_try_tps.py similarity index 100% rename from fluidimage/calcul/interpolate/_try_tps.py rename to src/fluidimage/calcul/interpolate/_try_tps.py diff --git a/fluidimage/calcul/interpolate/_try_tps_2.py b/src/fluidimage/calcul/interpolate/_try_tps_2.py similarity index 100% rename from fluidimage/calcul/interpolate/_try_tps_2.py rename to src/fluidimage/calcul/interpolate/_try_tps_2.py diff --git a/fluidimage/calcul/interpolate/_try_tps_class.py b/src/fluidimage/calcul/interpolate/_try_tps_class.py similarity index 99% rename from fluidimage/calcul/interpolate/_try_tps_class.py rename to src/fluidimage/calcul/interpolate/_try_tps_class.py index cdb01179..7146853a 100644 --- a/fluidimage/calcul/interpolate/_try_tps_class.py +++ b/src/fluidimage/calcul/interpolate/_try_tps_class.py @@ -49,7 +49,6 @@ def myplot(i, x, y, U, title=None): new_positions = np.vstack([XI, YI]) if method == "tps": - # calculate tps coeff U_smooth, U_tps = compute_tps_coeff(centers, U, 0) # evaluate interpolation on the new grid @@ -62,13 +61,11 @@ def myplot(i, x, y, U, title=None): DUX_eval, DUY_eval = tps.compute_gradient(U_tps) elif method == "griddata_mpl": - U_eval = griddata(x, y, U, xI, yI, "linear") DUX_eval, DUY_eval = sc.gradient(U_eval) elif method == "griddata_scipy": - grid_x, grid_y = np.meshgrid(xI, yI) # nearest, linear, cubic U_eval = interpolate.griddata(centers.T, U, (grid_x, grid_y), "cubic", 0) diff --git a/fluidimage/calcul/interpolate/_try_tps_subdom.py b/src/fluidimage/calcul/interpolate/_try_tps_subdom.py similarity index 100% rename from fluidimage/calcul/interpolate/_try_tps_subdom.py rename to src/fluidimage/calcul/interpolate/_try_tps_subdom.py diff --git a/fluidimage/calcul/interpolate/griddata.py b/src/fluidimage/calcul/interpolate/griddata.py similarity index 99% rename from fluidimage/calcul/interpolate/griddata.py rename to src/fluidimage/calcul/interpolate/griddata.py index 627350bf..b3bce17b 100644 --- a/fluidimage/calcul/interpolate/griddata.py +++ b/src/fluidimage/calcul/interpolate/griddata.py @@ -3,6 +3,7 @@ """ + import numpy as np from matplotlib import mlab from scipy import interpolate diff --git a/src/fluidimage/calcul/interpolate/meson.build b/src/fluidimage/calcul/interpolate/meson.build new file mode 100644 index 00000000..bd680909 --- /dev/null +++ b/src/fluidimage/calcul/interpolate/meson.build @@ -0,0 +1,28 @@ + +python_sources = [ + '__init__.py', + '_bench_tps.py', + '_bench_tps_matrix.py', + '_try_cusolve.py', + '_try_griddata.py', + '_try_interpolation.py', + '_try_tps.py', + '_try_tps_2.py', + '_try_tps_class.py', + '_try_tps_subdom.py', + 'griddata.py', + 'test_thin_plate_spline.py', + 'thin_plate_spline.py', + 'thin_plate_spline_subdom.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/calcul/interpolate' +) + +run_command(['transonic', '--meson', '--backend', backend, 'thin_plate_spline.py'], check: true) + +foreach be : backends + subdir('__' + be + '__') +endforeach diff --git a/fluidimage/calcul/interpolate/test_thin_plate_spline.py b/src/fluidimage/calcul/interpolate/test_thin_plate_spline.py similarity index 100% rename from fluidimage/calcul/interpolate/test_thin_plate_spline.py rename to src/fluidimage/calcul/interpolate/test_thin_plate_spline.py diff --git a/fluidimage/calcul/interpolate/thin_plate_spline.py b/src/fluidimage/calcul/interpolate/thin_plate_spline.py similarity index 100% rename from fluidimage/calcul/interpolate/thin_plate_spline.py rename to src/fluidimage/calcul/interpolate/thin_plate_spline.py diff --git a/fluidimage/calcul/interpolate/thin_plate_spline_subdom.py b/src/fluidimage/calcul/interpolate/thin_plate_spline_subdom.py similarity index 100% rename from fluidimage/calcul/interpolate/thin_plate_spline_subdom.py rename to src/fluidimage/calcul/interpolate/thin_plate_spline_subdom.py diff --git a/src/fluidimage/calcul/meson.build b/src/fluidimage/calcul/meson.build new file mode 100644 index 00000000..9fcdb924 --- /dev/null +++ b/src/fluidimage/calcul/meson.build @@ -0,0 +1,28 @@ + +python_sources = [ + '__init__.py', + '_evaluate_subpix.py', + '_try_correl_images_diff_sizes.py', + '_try_correl_images_same_size.py', + 'correl.py', + 'correl_pycuda.py', + 'errors.py', + 'fft.py', + 'smooth_clean.py', + 'subpix.py', + 'test_correl.py', + 'test_fft.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/calcul' +) + +subdir('interpolate') + +run_command(['transonic', '--meson', '--backend', backend, 'correl.py', 'subpix.py'], check: true) + +foreach be : backends + subdir('__' + be + '__') +endforeach diff --git a/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=1.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=1.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=1.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=1.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=2.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=2.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=2.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=2.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=3.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=3.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=3.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=3.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=4.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=4.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=4.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/2d_gaussian _part_size=4.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=1.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=1.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=1.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=1.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=2.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=2.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=2.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=2.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=3.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=3.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=3.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=3.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=4.0 _nx_ny = 64_64.png b/src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=4.0 _nx_ny = 64_64.png similarity index 100% rename from fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=4.0 _nx_ny = 64_64.png rename to src/fluidimage/calcul/plot_evaluate_subpix/centroid _part_size=4.0 _nx_ny = 64_64.png diff --git a/fluidimage/calcul/reduction_kernel.cu b/src/fluidimage/calcul/reduction_kernel.cu similarity index 100% rename from fluidimage/calcul/reduction_kernel.cu rename to src/fluidimage/calcul/reduction_kernel.cu diff --git a/fluidimage/calcul/smooth_clean.py b/src/fluidimage/calcul/smooth_clean.py similarity index 100% rename from fluidimage/calcul/smooth_clean.py rename to src/fluidimage/calcul/smooth_clean.py index 0bf3beab..9f0c866c 100644 --- a/fluidimage/calcul/smooth_clean.py +++ b/src/fluidimage/calcul/smooth_clean.py @@ -3,6 +3,7 @@ """ + import numpy as np from scipy.interpolate import interp2d from scipy.ndimage import convolve @@ -20,7 +21,6 @@ def _smooth(a, for_norm): def smooth_clean(xs, ys, deltaxs, deltays, iyvecs, ixvecs, threshold): - nx = len(ixvecs) ny = len(iyvecs) diff --git a/fluidimage/calcul/subpix.py b/src/fluidimage/calcul/subpix.py similarity index 99% rename from fluidimage/calcul/subpix.py rename to src/fluidimage/calcul/subpix.py index 019fc26a..fccf1bb4 100644 --- a/fluidimage/calcul/subpix.py +++ b/src/fluidimage/calcul/subpix.py @@ -148,7 +148,6 @@ def compute_subpix(self, correl, ix, iy, method=None, nsubpix=None): ) if method == "2d_gaussian": - correl_crop = correl[ iy - nsubpix : iy + nsubpix + 1, ix - nsubpix : ix + nsubpix + 1 ] @@ -181,7 +180,6 @@ def compute_subpix(self, correl, ix, iy, method=None, nsubpix=None): ) elif method == "centroid": - correl_crop = correl[ iy - nsubpix : iy + nsubpix + 1, ix - nsubpix : ix + nsubpix + 1 ] diff --git a/fluidimage/calcul/test_correl.py b/src/fluidimage/calcul/test_correl.py similarity index 99% rename from fluidimage/calcul/test_correl.py rename to src/fluidimage/calcul/test_correl.py index d4b6c63e..ecaff504 100644 --- a/fluidimage/calcul/test_correl.py +++ b/src/fluidimage/calcul/test_correl.py @@ -74,7 +74,6 @@ def setUpClass(cls): for k, cls in classes.items(): def _test(self, cls=cls, k=k): - if issubclass(cls, CorrelFFTBase): displacement_max = "50%" else: diff --git a/fluidimage/calcul/test_fft.py b/src/fluidimage/calcul/test_fft.py similarity index 99% rename from fluidimage/calcul/test_fft.py rename to src/fluidimage/calcul/test_fft.py index b025f019..0529b6a1 100644 --- a/fluidimage/calcul/test_fft.py +++ b/src/fluidimage/calcul/test_fft.py @@ -10,7 +10,6 @@ class TestFFTW2DReal2Complex(unittest.TestCase): - # def test_correl(self): # rtime, ntime = 0., 0. @@ -57,7 +56,6 @@ def test_fft(self): self.compute_and_check(func_fft, op) def compute_and_check(self, func_fft, op): - energyK = op.compute_energy_from_Fourier(func_fft) func = op.ifft(func_fft) @@ -77,7 +75,6 @@ def compute_and_check(self, func_fft, op): self.assertAlmostEqual(energyK / energyKback, 1.0, places=3) def compute_and_check2(self, func, op): - energyX = op.compute_energy_from_spatial(func) func_fft = op.fft(func) energyK = op.compute_energy_from_Fourier(func_fft) @@ -106,7 +103,6 @@ def bench_fft_random(self): rtime, ntime = 0.0, 0.0 Nloops = 2 for nloop in range(Nloops): - op = FFTW2DReal2Complex(nx, ny) func = np.random.random(op.shapeX) diff --git a/fluidimage/calibration/__init__.py b/src/fluidimage/calibration/__init__.py similarity index 100% rename from fluidimage/calibration/__init__.py rename to src/fluidimage/calibration/__init__.py diff --git a/fluidimage/calibration/calib2d_simple.py b/src/fluidimage/calibration/calib2d_simple.py similarity index 99% rename from fluidimage/calibration/calib2d_simple.py rename to src/fluidimage/calibration/calib2d_simple.py index 3f0dd8ff..2a5f7180 100644 --- a/fluidimage/calibration/calib2d_simple.py +++ b/src/fluidimage/calibration/calib2d_simple.py @@ -63,7 +63,6 @@ def __init__( point_origin=(0, 0), orig_phys=(0.0, 0.0), ): - self.point0 = np.array(point0) self.point1 = np.array(point1) self.distance = distance diff --git a/fluidimage/calibration/calib_cv.py b/src/fluidimage/calibration/calib_cv.py similarity index 99% rename from fluidimage/calibration/calib_cv.py rename to src/fluidimage/calibration/calib_cv.py index f6e87d6b..38782b33 100644 --- a/fluidimage/calibration/calib_cv.py +++ b/src/fluidimage/calibration/calib_cv.py @@ -14,6 +14,7 @@ :private-members: """ + import os import matplotlib.pyplot as plt @@ -60,7 +61,7 @@ def create_default_params(): params_cv = cv2.SimpleBlobDetector_Params() # Slightly nicer defaults params_cv.filterByColor = False - params_cv.minArea = 0.0 + params_cv.minArea = 0.1 return ParamContainerCV(params_cv, "SimpleBlobDetector") def __init__(self, params: ParamContainerCV) -> None: diff --git a/fluidimage/calibration/calib_direct.py b/src/fluidimage/calibration/calib_direct.py similarity index 98% rename from fluidimage/calibration/calib_direct.py rename to src/fluidimage/calibration/calib_direct.py index f35526c0..2949aa99 100644 --- a/fluidimage/calibration/calib_direct.py +++ b/src/fluidimage/calibration/calib_direct.py @@ -10,6 +10,7 @@ :private-members: """ + import glob import warnings from math import sqrt @@ -91,7 +92,6 @@ class CalibDirect: """ def __init__(self, glob_str_xml=None, shape_img=(None, None), path_file=None): - if path_file: self.load(path_file) else: @@ -254,23 +254,21 @@ def pixel2line(self, indx, indy): def save(self, pth_file): """Save calibration""" - np.save( + np.savez( pth_file, - [ - self.interp_lines, - self.paths_xml, - self.nb_pixels_x, - self.nb_pixels_y, - ], + interp_lines=self.interp_lines, + paths_xml=self.paths_xml, + nb_pixels_x=self.nb_pixels_x, + nb_pixels_y=self.nb_pixels_y, ) def load(self, pth_file): """Load calibration""" tmp = np.load(pth_file, allow_pickle=True) - self.interp_lines = tmp[0] - self.paths_xml = tmp[1] - self.nb_pixels_x = tmp[2] - self.nb_pixels_y = tmp[3] + self.interp_lines = tmp["interp_lines"] + self.paths_xml = tmp["paths_xml"] + self.nb_pixels_x = tmp["nb_pixels_x"] + self.nb_pixels_y = tmp["nb_pixels_y"] def intersect_with_plane(self, indx, indy, a, b, c, d): """Find intersection with the line associated to the pixel indx, indy @@ -427,9 +425,7 @@ def check_interp_lines_coeffs(self, number=100): pylab.ylabel("y (pix)") pylab.colorbar() pylab.figure() - pylab.pcolor( - x, y, np.sqrt(dx**2 + dy**2 + dz**2), shading="nearest" - ) + pylab.pcolor(x, y, np.sqrt(dx**2 + dy**2 + dz**2), shading="nearest") pylab.title("norm(d)") pylab.xlabel("x (pix)") pylab.ylabel("y (pix)") diff --git a/fluidimage/calibration/calib_tsai.py b/src/fluidimage/calibration/calib_tsai.py similarity index 100% rename from fluidimage/calibration/calib_tsai.py rename to src/fluidimage/calibration/calib_tsai.py diff --git a/src/fluidimage/calibration/meson.build b/src/fluidimage/calibration/meson.build new file mode 100644 index 00000000..5bb3e8d6 --- /dev/null +++ b/src/fluidimage/calibration/meson.build @@ -0,0 +1,17 @@ + +python_sources = [ + '__init__.py', + 'calib2d_simple.py', + 'calib_cv.py', + 'calib_direct.py', + 'calib_tsai.py', + 'test_calib_cv.py', + 'test_direct_stereo_reconstruction.py', + 'test_tsai_calibration.py', + 'util.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/calibration' +) diff --git a/fluidimage/calibration/test_calib_cv.py b/src/fluidimage/calibration/test_calib_cv.py similarity index 85% rename from fluidimage/calibration/test_calib_cv.py rename to src/fluidimage/calibration/test_calib_cv.py index 0719b48e..aac52c2a 100644 --- a/fluidimage/calibration/test_calib_cv.py +++ b/src/fluidimage/calibration/test_calib_cv.py @@ -2,7 +2,6 @@ from numpy.testing import assert_almost_equal, assert_array_equal -from fluiddyn.io import stdout_redirected from fluidimage import get_path_image_samples from fluidimage.calibration.calib_cv import ( CalibCV, @@ -23,7 +22,9 @@ def construct_image_points(path, origin): params = SimpleCircleGrid.create_default_params() circle_grid = SimpleCircleGrid(params) - centers = circle_grid.detect_grid(image, origin, nx=7, ny=7, ds=50) + centers = circle_grid.detect_grid( + image, origin, nx=7, ny=7, ds=50, debug=True + ) return centers @@ -34,7 +35,6 @@ class TestCalib(unittest.TestCase): @classmethod def setUpClass(cls): path_cache = pathbase / "cam0.h5" - # with stdout_redirected(): cls.calib_cache = CalibCV(str(path_cache)) def test_interpolate(self): @@ -45,8 +45,7 @@ def test_interpolate(self): def test_calibrate(self): """Tests construct_object_points and CalibCV methods.""" path_input = pathbase / "cam0" / "0mm_cam0.tif" - with stdout_redirected(): - calib = CalibCV("fluidimage_test_calib_cv.h5") + calib = CalibCV("fluidimage_test_calib_cv.h5") result_cache = self.calib_cache.params @@ -62,7 +61,3 @@ def test_calibrate(self): assert_array_equal(mtx, result_cache.cam_mtx) assert_almost_equal(rvecs[0], result_cache.rotation[2]) assert_almost_equal(tvecs[0], result_cache.translate[2]) - - -if __name__ == "__main__": - unittest.main() diff --git a/fluidimage/calibration/test_direct_stereo_reconstruction.py b/src/fluidimage/calibration/test_direct_stereo_reconstruction.py similarity index 96% rename from fluidimage/calibration/test_direct_stereo_reconstruction.py rename to src/fluidimage/calibration/test_direct_stereo_reconstruction.py index 99ee0c6b..c377d7f0 100644 --- a/fluidimage/calibration/test_direct_stereo_reconstruction.py +++ b/src/fluidimage/calibration/test_direct_stereo_reconstruction.py @@ -12,7 +12,6 @@ def get_piv_field(path): - try: with h5py.File(path, "r") as file: keyspiv = [key for key in file.keys() if key.startswith("piv")] @@ -33,12 +32,11 @@ class TestCalib(unittest.TestCase): """Test fluidimage.calibration DirectStereoReconstruction, CalibDirect.""" def test(self): - path_cam1 = pathbase / "E_Calibration_Images" / "Camera_01" path_cam3 = pathbase / "E_Calibration_Images" / "Camera_03" - path_calib1 = path_cam1 / "calib1.npy" - path_calib3 = path_cam3 / "calib3.npy" + path_calib1 = path_cam1 / "calib1.npz" + path_calib3 = path_cam3 / "calib3.npz" nb_pixelx, nb_pixely = 1024, 1024 nbline_x, nbline_y = 32, 32 diff --git a/fluidimage/calibration/test_tsai_calibration.py b/src/fluidimage/calibration/test_tsai_calibration.py similarity index 99% rename from fluidimage/calibration/test_tsai_calibration.py rename to src/fluidimage/calibration/test_tsai_calibration.py index 948e625c..32ba9e26 100644 --- a/fluidimage/calibration/test_tsai_calibration.py +++ b/src/fluidimage/calibration/test_tsai_calibration.py @@ -14,7 +14,6 @@ def get_piv_field(path): - try: with h5py.File(path, "r") as file: keyspiv = [key for key in file.keys() if key.startswith("piv")] diff --git a/fluidimage/calibration/util.py b/src/fluidimage/calibration/util.py similarity index 99% rename from fluidimage/calibration/util.py rename to src/fluidimage/calibration/util.py index 38b098d1..faae0b21 100644 --- a/fluidimage/calibration/util.py +++ b/src/fluidimage/calibration/util.py @@ -11,7 +11,6 @@ def get_number_from_string(string): - return [float(word) for word in string.split() if word] @@ -97,7 +96,6 @@ def make_params_calibration(path_file): params._set_attribs({"f": f, "C": C, "kc": kc, "T": T, "R": R, "omc": omc}) if calib_uvmat.nb_slice is not None: - nb_slice = np.array(calib_uvmat["nb_slice"]) zslice_coord = np.zeros([nb_slice, 3]) diff --git a/fluidimage/config.py b/src/fluidimage/config.py similarity index 100% rename from fluidimage/config.py rename to src/fluidimage/config.py diff --git a/fluidimage/data_objects/__init__.py b/src/fluidimage/data_objects/__init__.py similarity index 100% rename from fluidimage/data_objects/__init__.py rename to src/fluidimage/data_objects/__init__.py diff --git a/fluidimage/data_objects/display_piv.py b/src/fluidimage/data_objects/display_piv.py similarity index 98% rename from fluidimage/data_objects/display_piv.py rename to src/fluidimage/data_objects/display_piv.py index 2cae8faf..74a1beea 100644 --- a/fluidimage/data_objects/display_piv.py +++ b/src/fluidimage/data_objects/display_piv.py @@ -46,7 +46,6 @@ def __init__( xlim=None, ylim=None, ): - self.piv_results = piv_results if ( @@ -70,11 +69,11 @@ def __init__( if im0 is not None: p0 = np.percentile( - np.reshape(im0, (1, np.product(im0.shape))).transpose(), + np.reshape(im0, (1, np.prod(im0.shape))).transpose(), pourcent_histo, ) p1 = np.percentile( - np.reshape(im1, (1, np.product(im1.shape))).transpose(), + np.reshape(im1, (1, np.prod(im1.shape))).transpose(), pourcent_histo, ) @@ -409,7 +408,7 @@ def select_arrow(self, ind, artist=None): ax2.set_title(s) print(s) - for (dx, dy, cmax) in other_peaks: + for dx, dy, cmax in other_peaks: i1, i0 = compute_indices_from_displacement( dx, dy, result.indices_no_displacement ) diff --git a/fluidimage/data_objects/display_pre.py b/src/fluidimage/data_objects/display_pre.py similarity index 87% rename from fluidimage/data_objects/display_pre.py rename to src/fluidimage/data_objects/display_pre.py index e5d72bac..b1a8fcf2 100644 --- a/fluidimage/data_objects/display_pre.py +++ b/src/fluidimage/data_objects/display_pre.py @@ -15,7 +15,6 @@ class DisplayPreProc: """Display pairs of images""" def __init__(self, im0, im1, im0p, im1p, pourcent_histo=99, hist=False): - fig = plt.figure() fig.event_handler = self @@ -27,19 +26,19 @@ def __init__(self, im0, im1, im0p, im1p, pourcent_histo=99, hist=False): self.ax2 = ax2 p0 = np.percentile( - np.reshape(im0, (1, np.product(im0.shape))).transpose(), + np.reshape(im0, (1, np.prod(im0.shape))).transpose(), pourcent_histo, ) p1 = np.percentile( - np.reshape(im1, (1, np.product(im1.shape))).transpose(), + np.reshape(im1, (1, np.prod(im1.shape))).transpose(), pourcent_histo, ) p0p = np.percentile( - np.reshape(im0p, (1, np.product(im0p.shape))).transpose(), + np.reshape(im0p, (1, np.prod(im0p.shape))).transpose(), pourcent_histo, ) p1p = np.percentile( - np.reshape(im1p, (1, np.product(im1p.shape))).transpose(), + np.reshape(im1p, (1, np.prod(im1p.shape))).transpose(), pourcent_histo, ) im0[im0 > p0] = p0 @@ -86,17 +85,17 @@ def __init__(self, im0, im1, im0p, im1p, pourcent_histo=99, hist=False): ax3 = plt.subplot(121) ax4 = plt.subplot(122) hist0 = np.histogram( - np.reshape(im0, (1, np.product(im0.shape))).transpose(), bins="fd" + np.reshape(im0, (1, np.prod(im0.shape))).transpose(), bins="fd" ) hist1 = np.histogram( - np.reshape(im1, (1, np.product(im1.shape))).transpose(), bins="fd" + np.reshape(im1, (1, np.prod(im1.shape))).transpose(), bins="fd" ) hist0p = np.histogram( - np.reshape(im0p, (1, np.product(im0p.shape))).transpose(), + np.reshape(im0p, (1, np.prod(im0p.shape))).transpose(), bins="fd", ) hist1p = np.histogram( - np.reshape(im1p, (1, np.product(im1p.shape))).transpose(), + np.reshape(im1p, (1, np.prod(im1p.shape))).transpose(), bins="fd", ) incr = 1 diff --git a/src/fluidimage/data_objects/meson.build b/src/fluidimage/data_objects/meson.build new file mode 100644 index 00000000..46eb5325 --- /dev/null +++ b/src/fluidimage/data_objects/meson.build @@ -0,0 +1,14 @@ + +python_sources = [ + '__init__.py', + 'display_piv.py', + 'display_pre.py', + 'piv.py', + 'preproc.py', + 'tomo.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/data_objects' +) diff --git a/fluidimage/data_objects/piv.py b/src/fluidimage/data_objects/piv.py similarity index 99% rename from fluidimage/data_objects/piv.py rename to src/fluidimage/data_objects/piv.py index 21a4757b..b76e3708 100644 --- a/fluidimage/data_objects/piv.py +++ b/src/fluidimage/data_objects/piv.py @@ -95,7 +95,6 @@ def __init__( hdf5_parent=None, params_mask=None, ): - self.params_mask = params_mask if str_path is not None: @@ -191,7 +190,6 @@ def save(self, path=None, hdf5_parent=None): group.create_dataset("shape_images", data=arr0.shape) def _load(self, path=None, hdf5_object=None): - if path is not None: raise NotImplementedError @@ -227,7 +225,6 @@ def __init__( hdf5_parent=None, params_mask=None, ): - self.params_mask = params_mask if str_path is not None: @@ -284,7 +281,6 @@ def __init__( secondary_peaks=None, indices_no_displacement=None, ): - if hdf5_object is not None: if couple is not None: self.couple = couple @@ -353,7 +349,6 @@ def _get_name(self, kind): return get_name_bos(self.couple.name, serie) def save(self, path=None, out_format=None, kind=None): - name = self._get_name(kind) if path is not None: @@ -373,7 +368,6 @@ def save(self, path=None, out_format=None, kind=None): return path_file def _save_in_hdf5_object(self, file, tag="piv0"): - if "class_name" not in file.attrs.keys(): file.attrs["class_name"] = "HeavyPIVResults" file.attrs["module_name"] = "fluidimage.data_objects.piv" @@ -427,13 +421,11 @@ def _save_in_hdf5_object(self, file, tag="piv0"): g.create_dataset(f"subdom{i}", data=arr) def _load(self, path): - self.file_name = os.path.basename(path) with h5py.File(path, "r") as file: self._load_from_hdf5_object(file["piv0"]) def _load_from_hdf5_object(self, g_piv): - file = g_piv.parent if not hasattr(self, "params"): @@ -553,7 +545,6 @@ def append(self, results): self.__dict__[f"piv{i}"] = results def _get_name(self, kind): - if hasattr(self, "file_name"): return self.file_name @@ -561,7 +552,6 @@ def _get_name(self, kind): return r._get_name(kind) def save(self, path=None, out_format=None, kind=None): - name = self._get_name(kind) if path is not None: @@ -592,7 +582,6 @@ def save(self, path=None, out_format=None, kind=None): return path_file def _load(self, path): - self.file_name = os.path.basename(path) with h5py.File(path, "r") as file: self.params = ParamContainer(hdf5_object=file["params"]) @@ -615,11 +604,9 @@ def _load(self, path): ) def _save_as_uvmat(self, file): - file.dimensions = {"nb_coord": 2, "nb_bounds": 2} for i, ir in enumerate(self.passes): - iuvmat = i + 1 str_i = str(iuvmat) str_nb_vec = "nb_vec_" + str_i @@ -768,7 +755,6 @@ def __init__( hdf5_object=None, file_name=None, ): - if file_name is not None: self.file_name = file_name if hdf5_object is not None: @@ -826,7 +812,6 @@ def save(self, path=None, out_format=None, kind=None): return self def _save_in_hdf5_object(self, file, tag="piv"): - if "class_name" not in file.attrs.keys(): file.attrs["class_name"] = "LightPIVResults" file.attrs["module_name"] = "fluidimage.data_objects.piv" @@ -857,7 +842,6 @@ def _load(self, path): self._load_from_hdf5_object(file[max(keys)]) def _load_from_hdf5_object(self, g_piv): - file = g_piv.parent if not hasattr(self, "params"): diff --git a/fluidimage/data_objects/preproc.py b/src/fluidimage/data_objects/preproc.py similarity index 99% rename from fluidimage/data_objects/preproc.py rename to src/fluidimage/data_objects/preproc.py index a4c7febb..06666147 100644 --- a/fluidimage/data_objects/preproc.py +++ b/src/fluidimage/data_objects/preproc.py @@ -92,7 +92,6 @@ def __init__( str_path=None, hdf5_parent=None, ): - if str_path is not None: self._load(path=str_path) return @@ -133,7 +132,6 @@ def save(self, path=None, hdf5_parent=None): class PreprocResults(LightPIVResults): def __init__(self, params=None, str_path=None, hdf5_object=None): - self._keys_to_be_saved = ["data"] if hdf5_object is not None: if params is not None: diff --git a/fluidimage/data_objects/tomo.py b/src/fluidimage/data_objects/tomo.py similarity index 99% rename from fluidimage/data_objects/tomo.py rename to src/fluidimage/data_objects/tomo.py index ccf32a54..92274a24 100644 --- a/fluidimage/data_objects/tomo.py +++ b/src/fluidimage/data_objects/tomo.py @@ -15,7 +15,6 @@ """ - import os import shutil diff --git a/fluidimage/executors/__init__.py b/src/fluidimage/executors/__init__.py similarity index 99% rename from fluidimage/executors/__init__.py rename to src/fluidimage/executors/__init__.py index 46de83bf..f91497ed 100644 --- a/fluidimage/executors/__init__.py +++ b/src/fluidimage/executors/__init__.py @@ -24,6 +24,7 @@ servers """ + import os import trio diff --git a/fluidimage/executors/base.py b/src/fluidimage/executors/base.py similarity index 99% rename from fluidimage/executors/base.py rename to src/fluidimage/executors/base.py index a94737da..6bc33ec8 100644 --- a/fluidimage/executors/base.py +++ b/src/fluidimage/executors/base.py @@ -73,7 +73,6 @@ def __init__( sleep_time=None, stop_if_error=False, ): - if not _omp_num_threads_equal_1_at_import: raise SystemError( "For performance reason," diff --git a/fluidimage/executors/exec_async.py b/src/fluidimage/executors/exec_async.py similarity index 99% rename from fluidimage/executors/exec_async.py rename to src/fluidimage/executors/exec_async.py index d908c40c..6144c0b1 100644 --- a/fluidimage/executors/exec_async.py +++ b/src/fluidimage/executors/exec_async.py @@ -114,7 +114,6 @@ def define_functions(self): """ for work in self.works: - # global functions if work.kind is not None and "global" in work.kind: @@ -308,7 +307,6 @@ async def update_has_to_stop(self): """ while not self._has_to_stop: - result = ( (not any([bool(queue) for queue in self.topology.queues])) and self.nb_working_workers_cpu == 0 diff --git a/fluidimage/executors/exec_async_multiproc.py b/src/fluidimage/executors/exec_async_multiproc.py similarity index 99% rename from fluidimage/executors/exec_async_multiproc.py rename to src/fluidimage/executors/exec_async_multiproc.py index d4605499..5e19f503 100644 --- a/fluidimage/executors/exec_async_multiproc.py +++ b/src/fluidimage/executors/exec_async_multiproc.py @@ -71,7 +71,6 @@ def exec_work_and_comm(func, obj, child_conn, event): event = Event() def run_process(): - # we do this complicate thing because there may be a strange bug def start_process_and_check(index_attempt): diff --git a/fluidimage/executors/exec_async_sequential.py b/src/fluidimage/executors/exec_async_sequential.py similarity index 100% rename from fluidimage/executors/exec_async_sequential.py rename to src/fluidimage/executors/exec_async_sequential.py diff --git a/fluidimage/executors/exec_async_servers.py b/src/fluidimage/executors/exec_async_servers.py similarity index 99% rename from fluidimage/executors/exec_async_servers.py rename to src/fluidimage/executors/exec_async_servers.py index c67d5cef..5cac0308 100644 --- a/fluidimage/executors/exec_async_servers.py +++ b/src/fluidimage/executors/exec_async_servers.py @@ -145,7 +145,6 @@ async def update_has_to_stop(self): """ while not self._has_to_stop: - result = ( (not any([bool(queue) for queue in self.topology.queues])) and all(worker.is_unoccupied for worker in self.workers) @@ -223,7 +222,6 @@ def run_process(): def def_async_func_work_cpu(self, work): async def func(work=work): - while True: while not work.input_queue or ( work.output_queue is not None diff --git a/fluidimage/executors/exec_sequential.py b/src/fluidimage/executors/exec_sequential.py similarity index 99% rename from fluidimage/executors/exec_sequential.py rename to src/fluidimage/executors/exec_sequential.py index b8022342..ba4c2fb6 100644 --- a/fluidimage/executors/exec_sequential.py +++ b/src/fluidimage/executors/exec_sequential.py @@ -25,11 +25,8 @@ def compute(self): self._finalize_compute() def _run_works(self): - while not all([len(queue) == 0 for queue in self.topology.queues]): - for work in self.works: - # global functions if work.kind is not None and "global" in work.kind: if len(work.output_queue) > self.nb_items_queue_max: diff --git a/src/fluidimage/executors/meson.build b/src/fluidimage/executors/meson.build new file mode 100644 index 00000000..ae4a51bb --- /dev/null +++ b/src/fluidimage/executors/meson.build @@ -0,0 +1,17 @@ + +python_sources = [ + '__init__.py', + 'base.py', + 'exec_async.py', + 'exec_async_multiproc.py', + 'exec_async_sequential.py', + 'exec_async_servers.py', + 'exec_sequential.py', + 'multi_exec_async.py', + 'servers.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/executors' +) diff --git a/fluidimage/executors/multi_exec_async.py b/src/fluidimage/executors/multi_exec_async.py similarity index 100% rename from fluidimage/executors/multi_exec_async.py rename to src/fluidimage/executors/multi_exec_async.py diff --git a/fluidimage/executors/servers.py b/src/fluidimage/executors/servers.py similarity index 99% rename from fluidimage/executors/servers.py rename to src/fluidimage/executors/servers.py index e0c756c0..e49fa6c4 100644 --- a/fluidimage/executors/servers.py +++ b/src/fluidimage/executors/servers.py @@ -159,7 +159,6 @@ def __init__( log_path, logging_level, ): - if in_process: def signal_handler(sig, frame): diff --git a/fluidimage/gui/__init__.py b/src/fluidimage/gui/__init__.py similarity index 100% rename from fluidimage/gui/__init__.py rename to src/fluidimage/gui/__init__.py diff --git a/fluidimage/gui/imviewer.py b/src/fluidimage/gui/imviewer.py similarity index 98% rename from fluidimage/gui/imviewer.py rename to src/fluidimage/gui/imviewer.py index 399ae2d6..68e4e798 100644 --- a/fluidimage/gui/imviewer.py +++ b/src/fluidimage/gui/imviewer.py @@ -69,7 +69,6 @@ class ImageViewer: """Simple Image viewer.""" def __init__(self, args): - path_in = args.path if os.path.isdir(path_in): self.path_files = glob(os.path.join(path_in, "*")) @@ -324,6 +323,6 @@ def onclick(self, event): self._switch() -# if debug and __name__ == '__main__': -# args = parse_args() -# self = ImageViewer(args) +def main(): + args = parse_args() + ImageViewer(args) diff --git a/src/fluidimage/gui/launcher/Makefile b/src/fluidimage/gui/launcher/Makefile new file mode 100644 index 00000000..2f613e50 --- /dev/null +++ b/src/fluidimage/gui/launcher/Makefile @@ -0,0 +1,16 @@ + +UI_FILES = $(wildcard *.ui) +PY_FILES = $(UI_FILES:.ui=.py) + +.PHONY: run clean + +run: $(PY_FILES) + python -m fluidimage.gui.launcher.main + +ui2py: $(PY_FILES) + +clean: + rm -f $(PY_FILES) + +%.py: %.ui + pyside6-uic $(notdir $<) -o $@ diff --git a/fluidimage/gui/launcher/__init__.py b/src/fluidimage/gui/launcher/__init__.py similarity index 100% rename from fluidimage/gui/launcher/__init__.py rename to src/fluidimage/gui/launcher/__init__.py diff --git a/fluidimage/gui/launcher/main.py b/src/fluidimage/gui/launcher/main.py similarity index 76% rename from fluidimage/gui/launcher/main.py rename to src/fluidimage/gui/launcher/main.py index 29a1a05e..5823962c 100644 --- a/fluidimage/gui/launcher/main.py +++ b/src/fluidimage/gui/launcher/main.py @@ -8,19 +8,26 @@ import sys -from matplotlib.backends.qt_compat import QtWidgets +try: + from matplotlib.backends.qt_compat import QtWidgets, QtGui +except ImportError: + base_classes = [] +else: + + from .mainwindow import Ui_MainWindow + from fluiddyn.util.paramcontainer_gui import QtParamContainer + + base_classes = [QtWidgets.QMainWindow, Ui_MainWindow] + from fluiddyn.util.paramcontainer import ParamContainer -from fluiddyn.util.paramcontainer_gui import QtParamContainer from fluidimage.topologies.launcher import ( TopologyPIVLauncher, TopologyPreprocLauncher, ) -from .mainwindow import Ui_MainWindow - -class Program(QtWidgets.QMainWindow, Ui_MainWindow): +class Program(*base_classes): def __init__(self): topologies = [TopologyPreprocLauncher, TopologyPIVLauncher] self.topologies = {cls.__name__: cls for cls in topologies} @@ -32,11 +39,12 @@ def __init__(self): self.actions = {} for topo_name in topo_names: - action = self.actions[topo_name] = QtWidgets.QAction(self) + action = self.actions[topo_name] = QtGui.QAction(self) self.menuTopologies.addAction(action) action.setText(topo_name) - def func(_, topo_name=topo_name): + def func(_=None, topo_name=topo_name): + print(f"{topo_name = }") self.init_topo(topo_name) action.triggered.connect(func) @@ -50,7 +58,8 @@ def open_file(self): path_file = QtWidgets.QFileDialog.getOpenFileName( self.centralwidget, "OpenFile" ) - + if path_file == ("", ""): + return params = ParamContainer(path_file=path_file) print(params) raise NotImplementedError @@ -76,7 +85,11 @@ def init_topo(self, topo_name): def main(): - app = QtWidgets.QApplication(sys.argv) + + app = QtWidgets.QApplication.instance() + if not app: + app = QtWidgets.QApplication(sys.argv) + w = Program() w.show() sys.exit(app.exec_()) diff --git a/src/fluidimage/gui/launcher/mainwindow.py b/src/fluidimage/gui/launcher/mainwindow.py new file mode 100644 index 00000000..346199fd --- /dev/null +++ b/src/fluidimage/gui/launcher/mainwindow.py @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- + +################################################################################ +## Form generated from reading UI file 'mainwindow.ui' +## +## Created by: Qt User Interface Compiler version 6.6.1 +## +## WARNING! All changes made in this file will be lost when recompiling UI file! +################################################################################ + +from PySide6.QtCore import ( + QCoreApplication, + QDate, + QDateTime, + QLocale, + QMetaObject, + QObject, + QPoint, + QRect, + QSize, + QTime, + QUrl, + Qt, +) +from PySide6.QtGui import ( + QAction, + QBrush, + QColor, + QConicalGradient, + QCursor, + QFont, + QFontDatabase, + QGradient, + QIcon, + QImage, + QKeySequence, + QLinearGradient, + QPainter, + QPalette, + QPixmap, + QRadialGradient, + QTransform, +) +from PySide6.QtWidgets import ( + QApplication, + QMainWindow, + QMenu, + QMenuBar, + QSizePolicy, + QStatusBar, + QVBoxLayout, + QWidget, +) + + +class Ui_MainWindow(object): + def setupUi(self, MainWindow): + if not MainWindow.objectName(): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(775, 901) + self.actionOpen = QAction(MainWindow) + self.actionOpen.setObjectName("actionOpen") + self.actionTopologyPIV = QAction(MainWindow) + self.actionTopologyPIV.setObjectName("actionTopologyPIV") + self.actionTopologyPreproc = QAction(MainWindow) + self.actionTopologyPreproc.setObjectName("actionTopologyPreproc") + self.centralwidget = QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.verticalLayout_2 = QVBoxLayout(self.centralwidget) + self.verticalLayout_2.setObjectName("verticalLayout_2") + MainWindow.setCentralWidget(self.centralwidget) + self.menubar = QMenuBar(MainWindow) + self.menubar.setObjectName("menubar") + self.menubar.setGeometry(QRect(0, 0, 775, 24)) + self.menuFile = QMenu(self.menubar) + self.menuFile.setObjectName("menuFile") + self.menuTopologies = QMenu(self.menubar) + self.menuTopologies.setObjectName("menuTopologies") + self.menuComputations = QMenu(self.menubar) + self.menuComputations.setObjectName("menuComputations") + MainWindow.setMenuBar(self.menubar) + self.statusbar = QStatusBar(MainWindow) + self.statusbar.setObjectName("statusbar") + MainWindow.setStatusBar(self.statusbar) + + self.menubar.addAction(self.menuFile.menuAction()) + self.menubar.addAction(self.menuTopologies.menuAction()) + self.menubar.addAction(self.menuComputations.menuAction()) + self.menuFile.addAction(self.actionOpen) + + self.retranslateUi(MainWindow) + + QMetaObject.connectSlotsByName(MainWindow) + + # setupUi + + def retranslateUi(self, MainWindow): + MainWindow.setWindowTitle( + QCoreApplication.translate("MainWindow", "MainWindow", None) + ) + self.actionOpen.setText( + QCoreApplication.translate("MainWindow", "Open", None) + ) + self.actionTopologyPIV.setText( + QCoreApplication.translate("MainWindow", "TopologyPIV", None) + ) + self.actionTopologyPreproc.setText( + QCoreApplication.translate("MainWindow", "TopologyPreproc", None) + ) + self.menuFile.setTitle( + QCoreApplication.translate("MainWindow", "File", None) + ) + self.menuTopologies.setTitle( + QCoreApplication.translate("MainWindow", "Topologies", None) + ) + self.menuComputations.setTitle( + QCoreApplication.translate("MainWindow", "Computations", None) + ) + + # retranslateUi diff --git a/fluidimage/gui/launcher/mainwindow.ui b/src/fluidimage/gui/launcher/mainwindow.ui similarity index 100% rename from fluidimage/gui/launcher/mainwindow.ui rename to src/fluidimage/gui/launcher/mainwindow.ui diff --git a/src/fluidimage/gui/launcher/meson.build b/src/fluidimage/gui/launcher/meson.build new file mode 100644 index 00000000..83f146e7 --- /dev/null +++ b/src/fluidimage/gui/launcher/meson.build @@ -0,0 +1,12 @@ + +python_sources = [ + '__init__.py', + 'main.py', + 'mainwindow.py', + 'test_launcher.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/gui/launcher' +) diff --git a/fluidimage/gui/launcher/test_launcher.py b/src/fluidimage/gui/launcher/test_launcher.py similarity index 99% rename from fluidimage/gui/launcher/test_launcher.py rename to src/fluidimage/gui/launcher/test_launcher.py index 82c0c211..d3dcf82e 100644 --- a/fluidimage/gui/launcher/test_launcher.py +++ b/src/fluidimage/gui/launcher/test_launcher.py @@ -10,6 +10,7 @@ else: import_error_qt_compat = False + # For Travis where PyQt5 can't be installed (why?) @pytest.mark.skipif( import_error_qt_compat, reason="ImportError matplotlib.backends.qt_compat" diff --git a/src/fluidimage/gui/meson.build b/src/fluidimage/gui/meson.build new file mode 100644 index 00000000..ec28bc3b --- /dev/null +++ b/src/fluidimage/gui/meson.build @@ -0,0 +1,16 @@ + +python_sources = [ + '__init__.py', + 'imviewer.py', + 'pg_main.py', + 'pg_wrapper.py', + 'test_imviewer.py', + 'test_imviewer_pg.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/gui' +) + +subdir('launcher') diff --git a/fluidimage/gui/pg_main.py b/src/fluidimage/gui/pg_main.py similarity index 100% rename from fluidimage/gui/pg_main.py rename to src/fluidimage/gui/pg_main.py diff --git a/fluidimage/gui/pg_wrapper.py b/src/fluidimage/gui/pg_wrapper.py similarity index 100% rename from fluidimage/gui/pg_wrapper.py rename to src/fluidimage/gui/pg_wrapper.py diff --git a/fluidimage/gui/test_imviewer.py b/src/fluidimage/gui/test_imviewer.py similarity index 100% rename from fluidimage/gui/test_imviewer.py rename to src/fluidimage/gui/test_imviewer.py diff --git a/fluidimage/gui/test_imviewer_pg.py b/src/fluidimage/gui/test_imviewer_pg.py similarity index 100% rename from fluidimage/gui/test_imviewer_pg.py rename to src/fluidimage/gui/test_imviewer_pg.py diff --git a/src/fluidimage/meson.build b/src/fluidimage/meson.build new file mode 100644 index 00000000..2767d738 --- /dev/null +++ b/src/fluidimage/meson.build @@ -0,0 +1,27 @@ + +python_sources = [ + '__init__.py', + '_opencv.py', + '_version.py', + 'config.py', + 'run_from_xml.py', + 'synthetic.py', + 'test_run_from_xml.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage' +) + +subdir('calcul') +subdir('calibration') +subdir('data_objects') +subdir('executors') +subdir('gui') +subdir('postproc') +subdir('preproc') +subdir('reconstruct') +subdir('topologies') +subdir('util') +subdir('works') diff --git a/fluidimage/postproc/__init__.py b/src/fluidimage/postproc/__init__.py similarity index 100% rename from fluidimage/postproc/__init__.py rename to src/fluidimage/postproc/__init__.py diff --git a/fluidimage/postproc/_try_postproc.py b/src/fluidimage/postproc/_try_postproc.py similarity index 100% rename from fluidimage/postproc/_try_postproc.py rename to src/fluidimage/postproc/_try_postproc.py diff --git a/src/fluidimage/postproc/meson.build b/src/fluidimage/postproc/meson.build new file mode 100644 index 00000000..12dbea57 --- /dev/null +++ b/src/fluidimage/postproc/meson.build @@ -0,0 +1,16 @@ + +python_sources = [ + '__init__.py', + '_try_postproc.py', + 'piv.py', + 'postproc.py', + 'test_piv.py', + 'test_util.py', + 'util.py', + 'vector_field.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/postproc' +) diff --git a/fluidimage/postproc/piv.py b/src/fluidimage/postproc/piv.py similarity index 99% rename from fluidimage/postproc/piv.py rename to src/fluidimage/postproc/piv.py index 0890bdba..659fe647 100644 --- a/fluidimage/postproc/piv.py +++ b/src/fluidimage/postproc/piv.py @@ -15,7 +15,6 @@ """ - import h5py diff --git a/fluidimage/postproc/postproc.py b/src/fluidimage/postproc/postproc.py similarity index 99% rename from fluidimage/postproc/postproc.py rename to src/fluidimage/postproc/postproc.py index 66e58ab6..2aa8c7f2 100644 --- a/fluidimage/postproc/postproc.py +++ b/src/fluidimage/postproc/postproc.py @@ -48,7 +48,6 @@ def compute_derivatives(dx, dy, U, V, edge_order=2): def displayf(X, Y, U=None, V=None, background=None, *args): - if background is not None: pylab.pcolor(X, Y, background) if U is not None: @@ -127,7 +126,6 @@ def compute_norm(self, U, V): return norm def compute_spatial_fft(self, parseval=False): - fftU, kx, ky, psdU = compute_2dspectrum( self.X, self.Y, self.U, axes=(0, 1) ) @@ -167,7 +165,6 @@ def compute_spatial_fft(self, parseval=False): class PIV_PostProc_serie(LightPIVResults): def __init__(self, path=None): - warn( "The class PIV_Postproc_serie is deprecated (the code is not tested!). " "Please use fluidimage.postproc.vector_field.ArrayOfVectorFieldOnGrid instead.", @@ -308,7 +305,6 @@ def compute_temporal_fft(self): # print(energspectral) def compute_spatial_fft(self): - fftU, kx, ky, psdU = compute_2dspectrum( self.X, self.Y, self.U, axes=(1, 2) ) diff --git a/fluidimage/postproc/test_piv.py b/src/fluidimage/postproc/test_piv.py similarity index 99% rename from fluidimage/postproc/test_piv.py rename to src/fluidimage/postproc/test_piv.py index a06f98ec..0f5c9e3d 100644 --- a/fluidimage/postproc/test_piv.py +++ b/src/fluidimage/postproc/test_piv.py @@ -28,7 +28,6 @@ def test_from_MultipassPIVResults(self): PIV2d.from_file(self.path_piv) def test_piv_objects(self): - ny, nx = 8, 12 xs1d = np.linspace(-1, 1, nx) @@ -83,7 +82,6 @@ def test_piv_objects(self): assert params == piv_loaded.params def test_compute_time_average(self): - ny, nx = 8, 12 xs1d = np.linspace(-1, 1, nx) diff --git a/fluidimage/postproc/test_util.py b/src/fluidimage/postproc/test_util.py similarity index 99% rename from fluidimage/postproc/test_util.py rename to src/fluidimage/postproc/test_util.py index ffa08db8..8b9f14df 100644 --- a/fluidimage/postproc/test_util.py +++ b/src/fluidimage/postproc/test_util.py @@ -22,7 +22,6 @@ def test_compute_1dspectrum(): def _test_compute_2dspectrum(nt): - nx = 10 ny = 100 lx = 1000 @@ -71,7 +70,6 @@ def test_compute_2dspectrum_input3d(): def test_reshape_on_grid_final(): - x_increasing = np.linspace(-1, 1, 2) x_decreasing = np.linspace(2, 1, 2) y_increasing = np.linspace(0, 2, 10) diff --git a/fluidimage/postproc/util.py b/src/fluidimage/postproc/util.py similarity index 99% rename from fluidimage/postproc/util.py rename to src/fluidimage/postproc/util.py index 155210a4..59ee19b4 100644 --- a/fluidimage/postproc/util.py +++ b/src/fluidimage/postproc/util.py @@ -78,7 +78,6 @@ def compute_div(dUdx, dVdy): def compute_1dspectrum(x, signal, axis=0): - """ Computes the 1D Fourier Transform diff --git a/fluidimage/postproc/vector_field.py b/src/fluidimage/postproc/vector_field.py similarity index 99% rename from fluidimage/postproc/vector_field.py rename to src/fluidimage/postproc/vector_field.py index 6fc014da..9e4767d1 100644 --- a/fluidimage/postproc/vector_field.py +++ b/src/fluidimage/postproc/vector_field.py @@ -105,7 +105,6 @@ def __init__( history=["fluidimage"], params: Optional[ParamContainer] = None, ): - if isinstance(z, np.ndarray) and z.ndim == 0: z = z.item() @@ -230,7 +229,12 @@ def from_file(cls, path, load_params=False): deltays = piv["deltays_final"][...] kwargs = {} - (X, Y, kwargs["vx"], kwargs["vy"],) = reshape_on_grid_final( + ( + X, + Y, + kwargs["vx"], + kwargs["vy"], + ) = reshape_on_grid_final( ixvecs_final, iyvecs_final, deltaxs, deltays ) diff --git a/fluidimage/preproc/__init__.py b/src/fluidimage/preproc/__init__.py similarity index 100% rename from fluidimage/preproc/__init__.py rename to src/fluidimage/preproc/__init__.py diff --git a/fluidimage/preproc/_toolbox_cv.py b/src/fluidimage/preproc/_toolbox_cv.py similarity index 100% rename from fluidimage/preproc/_toolbox_cv.py rename to src/fluidimage/preproc/_toolbox_cv.py diff --git a/fluidimage/preproc/_toolbox_py.py b/src/fluidimage/preproc/_toolbox_py.py similarity index 100% rename from fluidimage/preproc/_toolbox_py.py rename to src/fluidimage/preproc/_toolbox_py.py diff --git a/fluidimage/preproc/base.py b/src/fluidimage/preproc/base.py similarity index 99% rename from fluidimage/preproc/base.py rename to src/fluidimage/preproc/base.py index 23d06109..ad80f635 100644 --- a/fluidimage/preproc/base.py +++ b/src/fluidimage/preproc/base.py @@ -10,6 +10,7 @@ :private-members: """ + import os import sys diff --git a/fluidimage/preproc/image2image.py b/src/fluidimage/preproc/image2image.py similarity index 100% rename from fluidimage/preproc/image2image.py rename to src/fluidimage/preproc/image2image.py diff --git a/fluidimage/preproc/io.py b/src/fluidimage/preproc/io.py similarity index 100% rename from fluidimage/preproc/io.py rename to src/fluidimage/preproc/io.py diff --git a/src/fluidimage/preproc/meson.build b/src/fluidimage/preproc/meson.build new file mode 100644 index 00000000..6f97f1f1 --- /dev/null +++ b/src/fluidimage/preproc/meson.build @@ -0,0 +1,17 @@ + +python_sources = [ + '__init__.py', + '_toolbox_cv.py', + '_toolbox_py.py', + 'base.py', + 'image2image.py', + 'io.py', + 'test_base.py', + 'test_image2image.py', + 'toolbox.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/preproc' +) diff --git a/fluidimage/preproc/test_base.py b/src/fluidimage/preproc/test_base.py similarity index 99% rename from fluidimage/preproc/test_base.py rename to src/fluidimage/preproc/test_base.py index 2de89c7b..815ff7df 100644 --- a/fluidimage/preproc/test_base.py +++ b/src/fluidimage/preproc/test_base.py @@ -10,7 +10,6 @@ class TestPreprocKarman(unittest.TestCase): - name = "Karman" @classmethod diff --git a/fluidimage/preproc/test_image2image.py b/src/fluidimage/preproc/test_image2image.py similarity index 99% rename from fluidimage/preproc/test_image2image.py rename to src/fluidimage/preproc/test_image2image.py index e4012d58..f5a0b017 100644 --- a/fluidimage/preproc/test_image2image.py +++ b/src/fluidimage/preproc/test_image2image.py @@ -9,7 +9,6 @@ class TestTopoExample(unittest.TestCase): def test_apply_im2im_filter(self): - serie = SerieOfArraysFromFiles(path_src, "2:") result = apply_im2im_filter(serie) assert len(result) == 3 diff --git a/fluidimage/preproc/toolbox.py b/src/fluidimage/preproc/toolbox.py similarity index 100% rename from fluidimage/preproc/toolbox.py rename to src/fluidimage/preproc/toolbox.py diff --git a/fluidimage/reconstruct/__init__.py b/src/fluidimage/reconstruct/__init__.py similarity index 100% rename from fluidimage/reconstruct/__init__.py rename to src/fluidimage/reconstruct/__init__.py diff --git a/src/fluidimage/reconstruct/meson.build b/src/fluidimage/reconstruct/meson.build new file mode 100644 index 00000000..fc0f96d4 --- /dev/null +++ b/src/fluidimage/reconstruct/meson.build @@ -0,0 +1,11 @@ + +python_sources = [ + '__init__.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/reconstruct' +) + +subdir('tomo') diff --git a/fluidimage/reconstruct/tomo/__init__.py b/src/fluidimage/reconstruct/tomo/__init__.py similarity index 99% rename from fluidimage/reconstruct/tomo/__init__.py rename to src/fluidimage/reconstruct/tomo/__init__.py index 3bb1ea4f..e6ff3da0 100644 --- a/fluidimage/reconstruct/tomo/__init__.py +++ b/src/fluidimage/reconstruct/tomo/__init__.py @@ -14,4 +14,5 @@ """ + from .mlos import TomoMLOSCV diff --git a/src/fluidimage/reconstruct/tomo/meson.build b/src/fluidimage/reconstruct/tomo/meson.build new file mode 100644 index 00000000..a06cdd59 --- /dev/null +++ b/src/fluidimage/reconstruct/tomo/meson.build @@ -0,0 +1,11 @@ + +python_sources = [ + '__init__.py', + 'mlos.py', + 'test_mlos.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/reconstruct/tomo' +) diff --git a/fluidimage/reconstruct/tomo/mlos.py b/src/fluidimage/reconstruct/tomo/mlos.py similarity index 100% rename from fluidimage/reconstruct/tomo/mlos.py rename to src/fluidimage/reconstruct/tomo/mlos.py diff --git a/fluidimage/reconstruct/tomo/test_mlos.py b/src/fluidimage/reconstruct/tomo/test_mlos.py similarity index 100% rename from fluidimage/reconstruct/tomo/test_mlos.py rename to src/fluidimage/reconstruct/tomo/test_mlos.py diff --git a/fluidimage/run_from_xml.py b/src/fluidimage/run_from_xml.py similarity index 99% rename from fluidimage/run_from_xml.py rename to src/fluidimage/run_from_xml.py index 35afcaa7..48ab0492 100644 --- a/fluidimage/run_from_xml.py +++ b/src/fluidimage/run_from_xml.py @@ -209,7 +209,6 @@ def modif_fluidimage_params(params, args): def main(): - reset_logger() config_logging("info") @@ -269,5 +268,4 @@ def main(): if __name__ == "__main__": - result = main() diff --git a/fluidimage/synthetic.py b/src/fluidimage/synthetic.py similarity index 100% rename from fluidimage/synthetic.py rename to src/fluidimage/synthetic.py diff --git a/fluidimage/test_run_from_xml.py b/src/fluidimage/test_run_from_xml.py similarity index 99% rename from fluidimage/test_run_from_xml.py rename to src/fluidimage/test_run_from_xml.py index 79878be1..ed4e0f2a 100644 --- a/fluidimage/test_run_from_xml.py +++ b/src/fluidimage/test_run_from_xml.py @@ -20,7 +20,6 @@ def tearDownClass(cls): os.chdir(cls.current_dir) def test_main(self): - path = path_image_samples / "Karman/Images.civ/0_XML/Karman_1-4.xml" command = f"run {str(path)} --mode recompute" sys.argv = command.split() diff --git a/fluidimage/topologies/__init__.py b/src/fluidimage/topologies/__init__.py similarity index 100% rename from fluidimage/topologies/__init__.py rename to src/fluidimage/topologies/__init__.py diff --git a/fluidimage/topologies/base.py b/src/fluidimage/topologies/base.py similarity index 99% rename from fluidimage/topologies/base.py rename to src/fluidimage/topologies/base.py index f31e9057..4bacb903 100644 --- a/fluidimage/topologies/base.py +++ b/src/fluidimage/topologies/base.py @@ -113,7 +113,6 @@ class TopologyBase: def __init__( self, path_dir_result=None, logging_level="info", nb_max_workers=None ): - self.path_dir_result = path_dir_result self.logging_level = logging_level self.nb_max_workers = nb_max_workers diff --git a/fluidimage/topologies/bos.py b/src/fluidimage/topologies/bos.py similarity index 100% rename from fluidimage/topologies/bos.py rename to src/fluidimage/topologies/bos.py index 25dfc13d..7cb03a10 100644 --- a/fluidimage/topologies/bos.py +++ b/src/fluidimage/topologies/bos.py @@ -6,6 +6,7 @@ :private-members: """ + import json import sys from pathlib import Path @@ -137,7 +138,6 @@ def create_default_params(cls): return params def __init__(self, params, logging_level="info", nb_max_workers=None): - self.params = params self.serie = SerieOfArraysFromFiles( diff --git a/fluidimage/topologies/example.py b/src/fluidimage/topologies/example.py similarity index 98% rename from fluidimage/topologies/example.py rename to src/fluidimage/topologies/example.py index 60f5a616..9993ad00 100644 --- a/fluidimage/topologies/example.py +++ b/src/fluidimage/topologies/example.py @@ -25,26 +25,24 @@ @boost def cpu1(array1: A, array2: A, nloops: int = 10): - a = np.arange(10000000 // nloops) result = a - for i in range(nloops): + for _ in range(nloops): result += a**3 + a**2 + 2 - for i in range(nloops): + for _ in range(nloops): array1 = array1 * array2 return (array1, array1) @boost def cpu2(array1: A, array2: A, nloops: int = 10): - a = np.arange(10000000 // nloops) result = a - for i in range(nloops): + for _ in range(nloops): result += a**3 + a**2 + 2 - for i in range(nloops): + for _ in range(nloops): array1 = np.multiply(array1, array2) return array1 diff --git a/fluidimage/topologies/image2image.py b/src/fluidimage/topologies/image2image.py similarity index 99% rename from fluidimage/topologies/image2image.py rename to src/fluidimage/topologies/image2image.py index d22eb60e..bcfbb878 100644 --- a/fluidimage/topologies/image2image.py +++ b/src/fluidimage/topologies/image2image.py @@ -122,7 +122,6 @@ def create_default_params(cls): return params def __init__(self, params, logging_level="info", nb_max_workers=None): - self.params = params if params.im2im is None: diff --git a/fluidimage/topologies/launcher.py b/src/fluidimage/topologies/launcher.py similarity index 99% rename from fluidimage/topologies/launcher.py rename to src/fluidimage/topologies/launcher.py index ea072f42..782d68cf 100644 --- a/fluidimage/topologies/launcher.py +++ b/src/fluidimage/topologies/launcher.py @@ -15,6 +15,7 @@ :private-members: """ + import inspect import json diff --git a/fluidimage/topologies/log.py b/src/fluidimage/topologies/log.py similarity index 100% rename from fluidimage/topologies/log.py rename to src/fluidimage/topologies/log.py diff --git a/src/fluidimage/topologies/meson.build b/src/fluidimage/topologies/meson.build new file mode 100644 index 00000000..41abd42f --- /dev/null +++ b/src/fluidimage/topologies/meson.build @@ -0,0 +1,33 @@ + +python_sources = [ + '__init__.py', + 'base.py', + 'bos.py', + 'example.py', + 'image2image.py', + 'launcher.py', + 'log.py', + 'nb_cpu_cores.py', + 'optical_flow.py', + 'piv.py', + 'preproc.py', + 'surface_tracking.py', + 'test_bos.py', + 'test_example.py', + 'test_image2image.py', + 'test_optical_flow.py', + 'test_piv.py', + 'test_preproc.py', + 'test_surftracking.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/topologies' +) + +run_command(['transonic', '--meson', '--backend', backend, 'example.py'], check: true) + +foreach be : backends + subdir('__' + be + '__') +endforeach diff --git a/fluidimage/topologies/nb_cpu_cores.py b/src/fluidimage/topologies/nb_cpu_cores.py similarity index 100% rename from fluidimage/topologies/nb_cpu_cores.py rename to src/fluidimage/topologies/nb_cpu_cores.py diff --git a/fluidimage/topologies/optical_flow.py b/src/fluidimage/topologies/optical_flow.py similarity index 100% rename from fluidimage/topologies/optical_flow.py rename to src/fluidimage/topologies/optical_flow.py diff --git a/fluidimage/topologies/piv.py b/src/fluidimage/topologies/piv.py similarity index 100% rename from fluidimage/topologies/piv.py rename to src/fluidimage/topologies/piv.py index 7d891b86..a8f445f7 100644 --- a/fluidimage/topologies/piv.py +++ b/src/fluidimage/topologies/piv.py @@ -6,6 +6,7 @@ :private-members: """ + import copy import json import sys @@ -180,7 +181,6 @@ def create_default_params(cls): return params def __init__(self, params, logging_level="info", nb_max_workers=None): - self.params = params self.series = SeriesOfArrays( diff --git a/fluidimage/topologies/preproc.py b/src/fluidimage/topologies/preproc.py similarity index 99% rename from fluidimage/topologies/preproc.py rename to src/fluidimage/topologies/preproc.py index 77ab16e3..414df84b 100644 --- a/fluidimage/topologies/preproc.py +++ b/src/fluidimage/topologies/preproc.py @@ -6,6 +6,7 @@ :private-members: """ + import copy import json import os diff --git a/fluidimage/topologies/surface_tracking.py b/src/fluidimage/topologies/surface_tracking.py similarity index 98% rename from fluidimage/topologies/surface_tracking.py rename to src/fluidimage/topologies/surface_tracking.py index 2c909965..603207fe 100644 --- a/fluidimage/topologies/surface_tracking.py +++ b/src/fluidimage/topologies/surface_tracking.py @@ -14,6 +14,7 @@ - example integrated in the documentation """ + import json import sys from pathlib import Path @@ -52,11 +53,7 @@ class TopologySurfaceTracking(TopologyBase): @classmethod def create_default_params(cls): - """Class method returning the default parameters. - - For developers: cf. fluidsim.base.params - - """ + """Class method returning the default parameters.""" params = ParamContainer(tag="params") WorkSurfaceTracking._complete_params_with_default(params) @@ -140,7 +137,6 @@ def create_default_params(cls): return params def __init__(self, params, logging_level="info", nb_max_workers=None): - self.params = params if params.surface_tracking is None: @@ -304,7 +300,6 @@ def save_image(self, tuple_image_path): imsave_h5(path_out, image, splitext=False) def fill_queue_paths(self, input_queue, output_queues): - assert input_queue is None queue_paths = output_queues[0] queue_couples_of_names = output_queues[1] diff --git a/fluidimage/topologies/test_bos.py b/src/fluidimage/topologies/test_bos.py similarity index 100% rename from fluidimage/topologies/test_bos.py rename to src/fluidimage/topologies/test_bos.py diff --git a/fluidimage/topologies/test_example.py b/src/fluidimage/topologies/test_example.py similarity index 99% rename from fluidimage/topologies/test_example.py rename to src/fluidimage/topologies/test_example.py index 920cab31..76d858db 100644 --- a/fluidimage/topologies/test_example.py +++ b/src/fluidimage/topologies/test_example.py @@ -20,7 +20,6 @@ def _test(self, executor=None): - params = TopologyExample.create_default_params() params["path_input"] = path_input diff --git a/fluidimage/topologies/test_image2image.py b/src/fluidimage/topologies/test_image2image.py similarity index 100% rename from fluidimage/topologies/test_image2image.py rename to src/fluidimage/topologies/test_image2image.py diff --git a/fluidimage/topologies/test_optical_flow.py b/src/fluidimage/topologies/test_optical_flow.py similarity index 100% rename from fluidimage/topologies/test_optical_flow.py rename to src/fluidimage/topologies/test_optical_flow.py diff --git a/fluidimage/topologies/test_piv.py b/src/fluidimage/topologies/test_piv.py similarity index 100% rename from fluidimage/topologies/test_piv.py rename to src/fluidimage/topologies/test_piv.py diff --git a/fluidimage/topologies/test_preproc.py b/src/fluidimage/topologies/test_preproc.py similarity index 100% rename from fluidimage/topologies/test_preproc.py rename to src/fluidimage/topologies/test_preproc.py diff --git a/fluidimage/topologies/test_surftracking.py b/src/fluidimage/topologies/test_surftracking.py similarity index 100% rename from fluidimage/topologies/test_surftracking.py rename to src/fluidimage/topologies/test_surftracking.py diff --git a/fluidimage/util/__init__.py b/src/fluidimage/util/__init__.py similarity index 100% rename from fluidimage/util/__init__.py rename to src/fluidimage/util/__init__.py diff --git a/fluidimage/util/log.py b/src/fluidimage/util/log.py similarity index 100% rename from fluidimage/util/log.py rename to src/fluidimage/util/log.py diff --git a/src/fluidimage/util/meson.build b/src/fluidimage/util/meson.build new file mode 100644 index 00000000..7a49f626 --- /dev/null +++ b/src/fluidimage/util/meson.build @@ -0,0 +1,12 @@ + +python_sources = [ + '__init__.py', + 'log.py', + 'test_util.py', + 'util.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/util' +) diff --git a/fluidimage/util/test_util.py b/src/fluidimage/util/test_util.py similarity index 99% rename from fluidimage/util/test_util.py rename to src/fluidimage/util/test_util.py index cd6ba492..8965fcfd 100644 --- a/fluidimage/util/test_util.py +++ b/src/fluidimage/util/test_util.py @@ -5,7 +5,6 @@ class TestUtil(unittest.TestCase): def test_util(self): - try: imread("__oups__.png") except (NameError, FileNotFoundError): diff --git a/fluidimage/util/util.py b/src/fluidimage/util/util.py similarity index 100% rename from fluidimage/util/util.py rename to src/fluidimage/util/util.py diff --git a/fluidimage/works/__init__.py b/src/fluidimage/works/__init__.py similarity index 99% rename from fluidimage/works/__init__.py rename to src/fluidimage/works/__init__.py index 22146d42..23f6b8d6 100644 --- a/fluidimage/works/__init__.py +++ b/src/fluidimage/works/__init__.py @@ -18,6 +18,7 @@ optical_flow """ + from .. import imread diff --git a/src/fluidimage/works/meson.build b/src/fluidimage/works/meson.build new file mode 100644 index 00000000..1bda9392 --- /dev/null +++ b/src/fluidimage/works/meson.build @@ -0,0 +1,15 @@ + +python_sources = [ + '__init__.py', + 'optical_flow.py', + 'preproc.py', + 'surface_tracking.py', + 'with_mask.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/works' +) + +subdir('piv') diff --git a/fluidimage/works/optical_flow.py b/src/fluidimage/works/optical_flow.py similarity index 99% rename from fluidimage/works/optical_flow.py rename to src/fluidimage/works/optical_flow.py index d802b01a..684d44d9 100644 --- a/fluidimage/works/optical_flow.py +++ b/src/fluidimage/works/optical_flow.py @@ -29,7 +29,6 @@ def optical_flow( vmin=0, vmax=np.inf, ): - positions0 = cv2.goodFeaturesToTrack(im0, **feature_params) positions1, st, err = cv2.calcOpticalFlowPyrLK( @@ -178,13 +177,11 @@ def _complete_params_with_default(cls, params): ) def __init__(self, params): - self.params = params self.dict_params_features = dict_from_params(self.params.features) self.dict_params_flow = dict_from_params(self.params.optical_flow) def calcul(self, couple): - if isinstance(couple, SerieOfArraysFromFiles): couple = ArrayCouple(serie=couple) diff --git a/fluidimage/works/piv/__init__.py b/src/fluidimage/works/piv/__init__.py similarity index 100% rename from fluidimage/works/piv/__init__.py rename to src/fluidimage/works/piv/__init__.py diff --git a/fluidimage/works/piv/_try_piv.py b/src/fluidimage/works/piv/_try_piv.py similarity index 100% rename from fluidimage/works/piv/_try_piv.py rename to src/fluidimage/works/piv/_try_piv.py diff --git a/fluidimage/works/piv/fix.py b/src/fluidimage/works/piv/fix.py similarity index 99% rename from fluidimage/works/piv/fix.py rename to src/fluidimage/works/piv/fix.py index e937ae53..d5939992 100644 --- a/fluidimage/works/piv/fix.py +++ b/src/fluidimage/works/piv/fix.py @@ -28,7 +28,6 @@ def create_default_params(cls): @classmethod def _complete_params_with_default(cls, params, tag="fix"): - params._set_child( tag, attribs={ @@ -158,7 +157,7 @@ def put_to_nan(inds, explanation): dy_approx0 = 0 other_peaks_good = [] - for (dx, dy, corr) in other_peaks: + for dx, dy, corr in other_peaks: if ( corr / correl0 > ratio_correl_peaks and corr > self.params_fix.correl_min diff --git a/src/fluidimage/works/piv/meson.build b/src/fluidimage/works/piv/meson.build new file mode 100644 index 00000000..5e3172c0 --- /dev/null +++ b/src/fluidimage/works/piv/meson.build @@ -0,0 +1,14 @@ + +python_sources = [ + '__init__.py', + '_try_piv.py', + 'fix.py', + 'multipass.py', + 'singlepass.py', + 'test_piv.py', +] + +py.install_sources( + python_sources, + subdir: 'fluidimage/works/piv' +) diff --git a/fluidimage/works/piv/multipass.py b/src/fluidimage/works/piv/multipass.py similarity index 99% rename from fluidimage/works/piv/multipass.py rename to src/fluidimage/works/piv/multipass.py index 1a81aee5..ba3849dd 100644 --- a/fluidimage/works/piv/multipass.py +++ b/src/fluidimage/works/piv/multipass.py @@ -108,7 +108,6 @@ def _complete_params_with_default(cls, params): ) def __init__(self, params=None): - self.params = params self.works_piv = [] diff --git a/fluidimage/works/piv/singlepass.py b/src/fluidimage/works/piv/singlepass.py similarity index 100% rename from fluidimage/works/piv/singlepass.py rename to src/fluidimage/works/piv/singlepass.py diff --git a/fluidimage/works/piv/test_piv.py b/src/fluidimage/works/piv/test_piv.py similarity index 99% rename from fluidimage/works/piv/test_piv.py rename to src/fluidimage/works/piv/test_piv.py index a7dadfa5..bb772116 100644 --- a/fluidimage/works/piv/test_piv.py +++ b/src/fluidimage/works/piv/test_piv.py @@ -30,7 +30,6 @@ def tearDownClass(cls): rmtree(cls.path_tmp) def test_minimal_piv(self): - params = WorkPIV.create_default_params() # for a very short computation @@ -66,7 +65,6 @@ def test_minimal_piv(self): LightPIVResults(str_path=str(path_file)) def test_piv_list(self): - params = WorkPIV.create_default_params() # for a very short computation diff --git a/fluidimage/works/preproc.py b/src/fluidimage/works/preproc.py similarity index 99% rename from fluidimage/works/preproc.py rename to src/fluidimage/works/preproc.py index dee735fe..6db025f3 100644 --- a/fluidimage/works/preproc.py +++ b/src/fluidimage/works/preproc.py @@ -10,6 +10,7 @@ :private-members: """ + import sys import numpy as np diff --git a/fluidimage/works/surface_tracking.py b/src/fluidimage/works/surface_tracking.py similarity index 99% rename from fluidimage/works/surface_tracking.py rename to src/fluidimage/works/surface_tracking.py index 31d315da..ba06a6f1 100644 --- a/fluidimage/works/surface_tracking.py +++ b/src/fluidimage/works/surface_tracking.py @@ -6,6 +6,7 @@ :private-members: """ + ############################################################################### # !/usr/bin/env python # # -*- coding: utf-8 -*- # @@ -161,7 +162,6 @@ def _complete_params_with_default(cls, params): ) def __init__(self, params): - self.cpt = 0 self.params = params @@ -419,7 +419,7 @@ def process_frame( reduction factor for the frame array to speed up the calc Returns - -------- + ------- a: array containing phase [radians] """ diff --git a/fluidimage/works/with_mask.py b/src/fluidimage/works/with_mask.py similarity index 99% rename from fluidimage/works/with_mask.py rename to src/fluidimage/works/with_mask.py index 95c50e12..73bbfacf 100644 --- a/fluidimage/works/with_mask.py +++ b/src/fluidimage/works/with_mask.py @@ -23,7 +23,6 @@ def _xyoriginalimage_from_xymasked(self, xs, ys): @classmethod def _complete_params_with_default_mask(cls, params): - params._set_child("mask", attribs={"strcrop": None}) params.mask._set_doc( diff --git a/tox.ini b/tox.ini deleted file mode 100644 index fac07bdb..00000000 --- a/tox.ini +++ /dev/null @@ -1,51 +0,0 @@ -# Tox (http://tox.testrun.org/) is a tool for running tests in -# multiple virtualenvs. This configuration file will run the test -# suite on all supported python versions. To use it, "pip install tox" -# and then run "tox" from this directory. -# http://tox.readthedocs.io/en/latest/config.html -# -# To run tox faster, check out Detox -# (https://pypi.python.org/pypi/detox), which runs your tox runs in -# parallel. To use it, "pip install detox" and then run "detox" from -# this directory. -[tox] -envlist = - py{36}-pythran-pyqt5 - py{38}-pythran-pyqt5 - codecov -isolated_build = True - -[testenv] -setenv = - !pythran: DISABLE_PYTHRAN = 1 -whitelist_externals = - pytest - xvfb-run - make -usedevelop = True -deps = - pip>=20.2.3 - coverage - pytest - pyqt5: pytest-qt - pyqt5: PyQt5==5.14.2 -commands = - xvfb-run make _tests_coverage - -[testenv:codecov] -passenv = CODECOV_TOKEN -deps = codecov -whitelist_externals = make -skip_install = True -commands = - make _report_coverage - codecov --file .coverage/coverage.xml --commit {env:CI_COMMIT_SHA} \ - --branch {env:CI_COMMIT_BRANCH} --name Heptapod_{env:CI_JOB_ID} - -[testenv:codecov-travis] -passenv = CI TRAVIS TRAVIS_* -deps = codecov -skip_install = True -commands = - make _report_coverage - codecov --file .coverage/coverage.xml diff --git a/try/experimental/topology/piv.py b/try/experimental/topology/piv.py index dbd792d0..2fc27516 100644 --- a/try/experimental/topology/piv.py +++ b/try/experimental/topology/piv.py @@ -47,11 +47,7 @@ class TopologyPIV(TopologyBase): @classmethod def create_default_params(cls): - """Class method returning the default parameters. - - For developers: cf. fluidsim.base.params - - """ + """Class method returning the default parameters.""" params = ParamContainer(tag="params") params._set_child( diff --git a/try/experimental/topology/piv_2.py b/try/experimental/topology/piv_2.py index 975196df..693de289 100644 --- a/try/experimental/topology/piv_2.py +++ b/try/experimental/topology/piv_2.py @@ -47,11 +47,7 @@ class TopologyPIV(TopologyBase): @classmethod def create_default_params(cls): - """Class method returning the default parameters. - - For developers: cf. fluidsim.base.params - - """ + """Class method returning the default parameters.""" params = ParamContainer(tag="params") params._set_child( diff --git a/try/experimental/topology/socket_asycncio.py b/try/experimental/topology/socket_asycncio.py index 47a9a856..6bd345c1 100644 --- a/try/experimental/topology/socket_asycncio.py +++ b/try/experimental/topology/socket_asycncio.py @@ -20,12 +20,10 @@ # # # await loop.sock_sendall(client, response.encode('utf8')) # client.close() -def create_default_params(): - """Class method returning the default parameters. - For developers: cf. fluidsim.base.params - """ +def create_default_params(): + """Class method returning the default parameters.""" params = ParamContainer(tag="params") params._set_child( diff --git a/try/surface_tracking/topo_old/surface_tracking.py b/try/surface_tracking/topo_old/surface_tracking.py index 92d107bd..19135377 100644 --- a/try/surface_tracking/topo_old/surface_tracking.py +++ b/try/surface_tracking/topo_old/surface_tracking.py @@ -56,11 +56,7 @@ class TopologySurfaceTracking(TopologyBase): @classmethod def create_default_params(cls): - """Class method returning the default parameters. - - For developers: cf. fluidsim.base.params - - """ + """Class method returning the default parameters.""" params = ParamContainer(tag="params") params._set_child(