diff --git a/.github/workflows/ci-linux.yml b/.github/workflows/ci-linux.yml index f6aeca8..54a8945 100644 --- a/.github/workflows/ci-linux.yml +++ b/.github/workflows/ci-linux.yml @@ -30,7 +30,7 @@ jobs: - name: Install dependencies run: | - python -m pip install --upgrade pip nox + python -m pip install --upgrade pip nox pdm - name: Run tests run: | diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 8609696..8aacebc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,8 +1,89 @@ +stages: + - pixi + - image + - lint + - test + - report + - test-release + - doc + variables: CODECOV_TOKEN: 4ebf45ff-904a-4a74-aa03-d9fba26cc145 + COVERAGE_DIR: .coverage_$CI_COMMIT_SHA + DOCKER_IMAGE_PATH: registry.heptapod.net:443/fluiddyn/fluidfft/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 + + +# pixi-test: +# stage: pixi +# image: $DOCKER_IMAGE_PATH:pixi +# script: +# - pixi info +# # - rm -rf ../transonic +# # - hg clone https://foss.heptapod.net/fluiddyn/transonic ../transonic +# - pixi run install-editable +# - pixi run pytest -v + + +# 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 + 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: + - echo "CI_COMMIT_HG_BRANCH $CI_COMMIT_HG_BRANCH" + - echo "CI_COMMIT_BRANCH $CI_COMMIT_BRANCH" + - nox -s validate_code + tests: - image: fluiddyn/python3-stable:lastest + stage: test + needs: + - job: "image:build" + optional: true script: - cp site.cfg.default site.cfg - python -m venv venv @@ -12,9 +93,37 @@ tests: tests_pythran_mpi: - image: fluiddyn/python3-stable:lastest + stage: test + needs: + - job: "image:build" + optional: true script: - python -m venv venv - source venv/bin/activate - pip install -U pip nox - nox -s tests-full + + +pages: + stage: doc + needs: + - job: "image:build" + optional: true + variables: + FLUIDFFT_TRANSONIC_BACKEND: "python" + script: + - 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/fluidsim/-/pipelines + - ls public + - echo "CI_COMMIT_REF_NAME="$CI_COMMIT_REF_NAME + - echo See https://fluiddyn.pages.heptapod.net/fluidsim/$CI_COMMIT_REF_NAME + artifacts: + name: "$CI_COMMIT_REF_NAME" + paths: + - public + expire_in: 5 days + when: always diff --git a/.hgignore b/.hgignore index 0db4c0d..bb8e082 100644 --- a/.hgignore +++ b/.hgignore @@ -52,6 +52,7 @@ site.cfg .coverage .tox .nox +.venv .cache .mypy_cache **/__pythran__/* diff --git a/Makefile b/Makefile index f2778b4..cd38264 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,10 @@ .PHONY: clean cleanall cleanmako cleancython develop build_ext_inplace list-sessions requirements -develop: - pip install -v -e .[dev] | grep -v link +develop: sync + pdm run pip install -e . --no-deps --no-build-isolation -v + +sync: + pdm sync --clean --no-self clean: rm -rf build @@ -21,7 +24,7 @@ cleanmako: cleanall: clean cleanso cleanmako cleancython cleanpythran black: - black -l 82 src *.py + pdm run black tests: pytest -s src @@ -56,9 +59,10 @@ 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)' +lock: + pdm lock -G :all # Catch-all target: route all unknown targets to nox sessions %: @nox --version 2>/dev/null || pip install nox - @nox -s $@ \ No newline at end of file + @nox -s $@ diff --git a/doc/examples/compute_grad.py b/doc/examples/compute_grad.py index dba902b..64b5026 100644 --- a/doc/examples/compute_grad.py +++ b/doc/examples/compute_grad.py @@ -4,7 +4,7 @@ nx = ny = 100 lx = ly = 2 * np.pi -oper = OperatorsPseudoSpectral2D(nx, ny, lx, ly, fft='fft2d.with_fftw2d') +oper = OperatorsPseudoSpectral2D(nx, ny, lx, ly, fft="fft2d.with_fftw2d") u = np.sin(oper.XX + oper.YY) u_fft = oper.fft(u) diff --git a/docker/Dockerfile b/docker/Dockerfile new file mode 100644 index 0000000..2381000 --- /dev/null +++ b/docker/Dockerfile @@ -0,0 +1,65 @@ +FROM python:3.9 +LABEL Pierre Augier + +RUN apt-get update + +RUN apt-get install -y --no-install-recommends \ + libfftw3-dev libfftw3-mpi-dev \ + openmpi-bin libhdf5-openmpi-dev libopenblas-dev +RUN apt-get install -y --no-install-recommends \ + gfortran clang +# also include utilities for debugging +RUN apt-get install -y --no-install-recommends \ + 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 \ + swig 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 +RUN ln -s /usr/include/fftw* $HOME/.local/include +RUN ln -s /usr/lib/x86_64-linux-gnu/libfftw3* $HOME/.local/lib + +ENV LD_LIBRARY_PATH=$HOME/.local/lib +ENV PATH=$HOME/.local/bin:$PATH +ENV CPATH=$HOME/.local/include:$CPATH + +RUN mkdir -p $HOME/.config/matplotlib +RUN echo 'backend : agg' > $HOME/.config/matplotlib/matplotlibrc + +RUN wget https://foss.heptapod.net/fluiddyn/fluidfft/raw/branch/default/site.cfg.files/site.cfg.docker -O ~/.fluidfft-site.cfg + +RUN wget https://foss.heptapod.net/fluiddyn/fluidfft/raw/branch/default/doc/install/install_p3dfft.sh -O ./install_p3dfft.sh +RUN chmod +x install_p3dfft.sh +RUN export FCFLAGS="-w -fallow-argument-mismatch -O2" && \ + export FFLAGS="-w -fallow-argument-mismatch -O2" && \ + ./install_p3dfft.sh + +RUN wget https://foss.heptapod.net/fluiddyn/fluidfft/raw/branch/default/doc/install/install_pfft.sh -O ./install_pfft.sh +RUN chmod +x install_pfft.sh +RUN ./install_pfft.sh + +RUN python -m pip install --upgrade pip +RUN python -m pip install --upgrade pdm nox diff --git a/docker/Makefile b/docker/Makefile new file mode 100644 index 0000000..24da7a3 --- /dev/null +++ b/docker/Makefile @@ -0,0 +1,49 @@ +image := image-fluidfft +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 0000000..31f4fdf --- /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 0000000..71e26e0 --- /dev/null +++ b/docker/pythranrc @@ -0,0 +1,7 @@ +[pythran] +complex_hook = True + +[compiler] +CXX=clang++ +CC=clang +blas=openblas diff --git a/noxfile.py b/noxfile.py index 1a0561d..1ffd2cc 100644 --- a/noxfile.py +++ b/noxfile.py @@ -30,6 +30,14 @@ no_venv_session = partial(nox.session, venv_backend="none") +@nox.session +def validate_code(session): + session.run_always( + "pdm", "sync", "--clean", "-G", "lint", "--no-self", external=True + ) + session.run("pdm", "validate_code", external=True) + + @nox.session def tests(session): """Execute unit-tests using pytest""" @@ -37,7 +45,7 @@ def tests(session): session.run_always( "pdm", "sync", "-G", "test", "--clean", "--no-self", external=True ) - session.install("-v", "-e", ".", "--force-reinstall", "--no-deps", silent=False) + session.install("-v", "-e", ".", "--no-deps", silent=False) session.run("ls", "src/fluidfft/fft3d", silent=False, external=True) session.run( @@ -78,7 +86,15 @@ def tests_full(session): """Execute all unit-tests using pytest""" session.run_always( - "pdm", "sync", "-G", "test", "-G", "mpi", "--clean", "--no-self", external=True + "pdm", + "sync", + "-G", + "test", + "-G", + "mpi", + "--clean", + "--no-self", + external=True, ) session.install("-v", "-e", ".", "--force-reinstall", "--no-deps", silent=False) @@ -101,3 +117,13 @@ def run_command(command, **kwargs): "mpirun -np 2 --oversubscribe coverage run -p -m unittest discover src", external=True, ) + + +@nox.session +def doc(session): + session.run_always("pdm", "sync", "-G", "doc", "--no-self", external=True) + session.install("-e", ".", "--no-deps", env={"FLUIDFFT_TRANSONIC_BACKEND": "python"}) + + session.chdir("doc") + session.run("make", "cleanall", external=True) + session.run("make", external=True) diff --git a/pdm.lock b/pdm.lock index d656961..4e8ba5c 100644 --- a/pdm.lock +++ b/pdm.lock @@ -2,17 +2,17 @@ # It is not intended for manual editing. [metadata] -groups = ["default", "dev", "doc", "mpi", "pyfftw", "test"] +groups = ["default", "build", "dev", "doc", "lint", "mpi", "pyfftw", "test"] strategy = ["cross_platform", "inherit_metadata"] lock_version = "4.4.1" -content_hash = "sha256:451335e91c5878558bddb5594b5f82082bd385c7e6a20baf72202bf1cddc38d1" +content_hash = "sha256:3e8d44e8664b93bf198cfefaeae4dae6a6551f5d436d6118c060340f5a447a75" [[package]] name = "alabaster" version = "0.7.16" requires_python = ">=3.9" summary = "A light, configurable Sphinx theme" -groups = ["dev", "doc"] +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"}, @@ -23,7 +23,7 @@ name = "anyio" version = "4.2.0" requires_python = ">=3.8" summary = "High level compatibility layer for multiple asynchronous event loop implementations" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "exceptiongroup>=1.0.2; python_version < \"3.11\"", "idna>=2.8", @@ -39,7 +39,7 @@ files = [ name = "appnope" version = "0.1.3" summary = "Disable App Nap on macOS >= 10.9" -groups = ["dev", "doc"] +groups = ["doc"] marker = "platform_system == \"Darwin\"" files = [ {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, @@ -51,7 +51,7 @@ name = "argon2-cffi" version = "23.1.0" requires_python = ">=3.7" summary = "Argon2 for Python" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "argon2-cffi-bindings", ] @@ -65,7 +65,7 @@ name = "argon2-cffi-bindings" version = "21.2.0" requires_python = ">=3.6" summary = "Low-level CFFI bindings for Argon2" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "cffi>=1.0.1", ] @@ -98,7 +98,7 @@ name = "arrow" version = "1.3.0" requires_python = ">=3.8" summary = "Better dates & times for Python" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "python-dateutil>=2.7.0", "types-python-dateutil>=2.8.10", @@ -108,11 +108,25 @@ files = [ {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, ] +[[package]] +name = "astroid" +version = "3.0.2" +requires_python = ">=3.8.0" +summary = "An abstract syntax tree for Python with inference support." +groups = ["lint"] +dependencies = [ + "typing-extensions>=4.0.0; python_version < \"3.11\"", +] +files = [ + {file = "astroid-3.0.2-py3-none-any.whl", hash = "sha256:d6e62862355f60e716164082d6b4b041d38e2a8cf1c7cd953ded5108bac8ff5c"}, + {file = "astroid-3.0.2.tar.gz", hash = "sha256:4a61cf0a59097c7bb52689b0fd63717cd2a8a14dc9f1eee97b82d814881c8c91"}, +] + [[package]] name = "asttokens" version = "2.4.1" summary = "Annotate AST trees with source code positions" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] dependencies = [ "six>=1.12.0", ] @@ -126,7 +140,7 @@ name = "async-lru" version = "2.0.4" requires_python = ">=3.8" summary = "Simple LRU cache for asyncio" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "typing-extensions>=4.0.0; python_version < \"3.11\"", ] @@ -140,7 +154,7 @@ name = "attrs" version = "23.2.0" requires_python = ">=3.7" summary = "Classes Without Boilerplate" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, @@ -151,7 +165,7 @@ 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 = ["default"] +groups = ["build", "default"] dependencies = [ "pycodestyle>=2.10.0", "tomli; python_version < \"3.11\"", @@ -166,7 +180,7 @@ name = "babel" version = "2.14.0" requires_python = ">=3.7" summary = "Internationalization utilities" -groups = ["dev", "doc"] +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"}, @@ -177,7 +191,7 @@ name = "beautifulsoup4" version = "4.12.3" requires_python = ">=3.6.0" summary = "Screen-scraping library" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "soupsieve>1.2", ] @@ -191,7 +205,7 @@ 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 = ["default"] +groups = ["build", "default"] dependencies = [ "gast~=0.5.0", ] @@ -200,12 +214,48 @@ files = [ {file = "beniget-0.4.1.tar.gz", hash = "sha256:75554b3b8ad0553ce2f607627dad3d95c60c441189875b98e097528f8e23ac0c"}, ] +[[package]] +name = "black" +version = "23.12.1" +requires_python = ">=3.8" +summary = "The uncompromising code formatter." +groups = ["lint"] +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-23.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0aaf6041986767a5e0ce663c7a2f0e9eaf21e6ff87a5f95cbf3675bfd4c41d2"}, + {file = "black-23.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c88b3711d12905b74206227109272673edce0cb29f27e1385f33b0163c414bba"}, + {file = "black-23.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a920b569dc6b3472513ba6ddea21f440d4b4c699494d2e972a1753cdc25df7b0"}, + {file = "black-23.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:3fa4be75ef2a6b96ea8d92b1587dd8cb3a35c7e3d51f0738ced0781c3aa3a5a3"}, + {file = "black-23.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d4df77958a622f9b5a4c96edb4b8c0034f8434032ab11077ec6c56ae9f384ba"}, + {file = "black-23.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:602cfb1196dc692424c70b6507593a2b29aac0547c1be9a1d1365f0d964c353b"}, + {file = "black-23.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c4352800f14be5b4864016882cdba10755bd50805c95f728011bcb47a4afd59"}, + {file = "black-23.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:0808494f2b2df923ffc5723ed3c7b096bd76341f6213989759287611e9837d50"}, + {file = "black-23.12.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:25e57fd232a6d6ff3f4478a6fd0580838e47c93c83eaf1ccc92d4faf27112c4e"}, + {file = "black-23.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d9e13db441c509a3763a7a3d9a49ccc1b4e974a47be4e08ade2a228876500ec"}, + {file = "black-23.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d1bd9c210f8b109b1762ec9fd36592fdd528485aadb3f5849b2740ef17e674e"}, + {file = "black-23.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:ae76c22bde5cbb6bfd211ec343ded2163bba7883c7bc77f6b756a1049436fbb9"}, + {file = "black-23.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e1b38b3135fd4c025c28c55ddfc236b05af657828a8a6abe5deec419a0b7055"}, + {file = "black-23.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4f0031eaa7b921db76decd73636ef3a12c942ed367d8c3841a0739412b260a54"}, + {file = "black-23.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97e56155c6b737854e60a9ab1c598ff2533d57e7506d97af5481141671abf3ea"}, + {file = "black-23.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:dd15245c8b68fe2b6bd0f32c1556509d11bb33aec9b5d0866dd8e2ed3dba09c2"}, + {file = "black-23.12.1-py3-none-any.whl", hash = "sha256:78baad24af0f033958cad29731e27363183e140962595def56423e626f4bee3e"}, + {file = "black-23.12.1.tar.gz", hash = "sha256:4ce3ef14ebe8d9509188014d96af1c456a910d5b5cbf434a09fef7e024b3d0d5"}, +] + [[package]] name = "bleach" version = "6.1.0" requires_python = ">=3.8" summary = "An easy safelist-based HTML-sanitizing tool." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "six>=1.9.0", "webencodings", @@ -220,7 +270,7 @@ name = "certifi" version = "2023.11.17" requires_python = ">=3.6" summary = "Python package for providing Mozilla's CA Bundle." -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, @@ -231,7 +281,7 @@ name = "cffi" version = "1.16.0" requires_python = ">=3.8" summary = "Foreign Function Interface for Python calling C code." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "pycparser", ] @@ -287,7 +337,7 @@ 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 = ["dev", "doc"] +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"}, @@ -353,13 +403,27 @@ files = [ {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 = ["lint"] +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 = "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 = ["dev", "doc", "test"] -marker = "sys_platform == \"win32\"" +groups = ["dev", "doc", "lint", "test"] +marker = "sys_platform == \"win32\" 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"}, @@ -370,7 +434,7 @@ name = "comm" version = "0.2.1" requires_python = ">=3.8" summary = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "traitlets>=4", ] @@ -440,7 +504,7 @@ name = "coverage" version = "7.4.0" requires_python = ">=3.8" summary = "Code coverage measurement for Python" -groups = ["dev", "test"] +groups = ["test"] files = [ {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, @@ -558,7 +622,7 @@ name = "cython" version = "3.0.8" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "The Cython compiler for writing C extensions in the Python language." -groups = ["test"] +groups = ["build", "test"] files = [ {file = "Cython-3.0.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a846e0a38e2b24e9a5c5dc74b0e54c6e29420d88d1dafabc99e0fc0f3e338636"}, {file = "Cython-3.0.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45523fdc2b78d79b32834cc1cc12dc2ca8967af87e22a3ee1bff20e77c7f5520"}, @@ -601,7 +665,7 @@ name = "debugpy" version = "1.8.0" requires_python = ">=3.8" summary = "An implementation of the Debug Adapter Protocol for Python" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, @@ -624,7 +688,7 @@ name = "decorator" version = "5.1.1" requires_python = ">=3.5" summary = "Decorators for Humans" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] files = [ {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, @@ -635,12 +699,23 @@ 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 = ["dev", "doc"] +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.7" +requires_python = ">=3.7" +summary = "serialize all of Python" +groups = ["lint"] +files = [ + {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"}, + {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"}, +] + [[package]] name = "distro" version = "1.9.0" @@ -657,7 +732,7 @@ name = "docutils" version = "0.20.1" requires_python = ">=3.7" summary = "Docutils -- Python Documentation Utilities" -groups = ["dev", "doc"] +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"}, @@ -680,7 +755,7 @@ name = "executing" version = "2.0.1" requires_python = ">=3.5" summary = "Get the currently executing AST node of a frame, and other information" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] files = [ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, @@ -690,7 +765,7 @@ files = [ name = "fastjsonschema" version = "2.19.1" summary = "Fastest Python implementation of JSON schema" -groups = ["dev", "doc"] +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"}, @@ -764,7 +839,7 @@ 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 = ["dev", "doc"] +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"}, @@ -775,7 +850,7 @@ 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 = ["default"] +groups = ["build", "default"] files = [ {file = "gast-0.5.4-py3-none-any.whl", hash = "sha256:6fc4fa5fa10b72fb8aab4ae58bcb023058386e67b6fa2e3e34cec5c769360316"}, {file = "gast-0.5.4.tar.gz", hash = "sha256:9c270fe5f4b130969b54174de7db4e764b09b4f7f67ccfc32480e29f78348d97"}, @@ -833,7 +908,7 @@ name = "idna" version = "3.6" requires_python = ">=3.5" summary = "Internationalized Domain Names in Applications (IDNA)" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, @@ -844,7 +919,7 @@ 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 = ["dev", "doc"] +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"}, @@ -855,7 +930,7 @@ name = "importlib-metadata" version = "7.0.1" requires_python = ">=3.8" summary = "Read metadata from Python packages" -groups = ["dev", "doc"] +groups = ["doc"] marker = "python_version < \"3.10\"" dependencies = [ "zipp>=0.5", @@ -896,7 +971,7 @@ name = "ipykernel" version = "6.29.0" requires_python = ">=3.8" summary = "IPython Kernel for Jupyter" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "appnope; platform_system == \"Darwin\"", "comm>=0.1.1", @@ -922,7 +997,7 @@ name = "ipython" version = "8.18.1" requires_python = ">=3.9" summary = "IPython: Productive Interactive Computing" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] dependencies = [ "colorama; sys_platform == \"win32\"", "decorator", @@ -946,7 +1021,7 @@ name = "ipywidgets" version = "8.1.1" requires_python = ">=3.7" summary = "Jupyter interactive widgets" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "comm>=0.1.3", "ipython>=6.1.0", @@ -964,7 +1039,7 @@ name = "isoduration" version = "20.11.0" requires_python = ">=3.7" summary = "Operations with ISO 8601 durations" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "arrow>=0.15.0", ] @@ -973,12 +1048,23 @@ files = [ {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 = ["lint"] +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 = ["dev", "doc", "test"] +groups = ["dev", "doc"] dependencies = [ "parso<0.9.0,>=0.8.3", ] @@ -992,7 +1078,7 @@ name = "jinja2" version = "3.1.3" requires_python = ">=3.7" summary = "A very fast and expressive template engine." -groups = ["dev", "doc"] +groups = ["build", "doc"] dependencies = [ "MarkupSafe>=2.0", ] @@ -1005,7 +1091,7 @@ files = [ name = "json5" version = "0.9.14" summary = "A Python implementation of the JSON5 data format." -groups = ["dev", "doc"] +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"}, @@ -1016,7 +1102,7 @@ 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 = ["dev", "doc"] +groups = ["doc"] files = [ {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, @@ -1027,7 +1113,7 @@ name = "jsonschema" version = "4.21.1" requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "attrs>=22.2.0", "jsonschema-specifications>=2023.03.6", @@ -1044,7 +1130,7 @@ name = "jsonschema-specifications" version = "2023.12.1" requires_python = ">=3.8" summary = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "referencing>=0.31.0", ] @@ -1059,7 +1145,7 @@ version = "4.21.1" extras = ["format-nongpl"] requires_python = ">=3.8" summary = "An implementation of JSON Schema validation for Python" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "fqdn", "idna", @@ -1080,7 +1166,7 @@ files = [ name = "jupyter" version = "1.0.0" summary = "Jupyter metapackage. Install all the Jupyter components in one go." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "ipykernel", "ipywidgets", @@ -1100,7 +1186,7 @@ name = "jupyter-client" version = "8.6.0" requires_python = ">=3.8" summary = "Jupyter protocol implementation and client libraries" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-core!=5.0.*,>=4.12", @@ -1119,7 +1205,7 @@ name = "jupyter-console" version = "6.6.3" requires_python = ">=3.7" summary = "Jupyter terminal console" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "ipykernel>=6.14", "ipython", @@ -1140,7 +1226,7 @@ name = "jupyter-core" version = "5.7.1" requires_python = ">=3.8" summary = "Jupyter core package. A base package on which Jupyter projects rely." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "platformdirs>=2.5", "pywin32>=300; sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"", @@ -1156,7 +1242,7 @@ name = "jupyter-events" version = "0.9.0" requires_python = ">=3.8" summary = "Jupyter Event System library" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "jsonschema[format-nongpl]>=4.18.0", "python-json-logger>=2.0.4", @@ -1176,7 +1262,7 @@ name = "jupyter-lsp" version = "2.2.2" requires_python = ">=3.8" summary = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "importlib-metadata>=4.8.3; python_version < \"3.10\"", "jupyter-server>=1.1.2", @@ -1191,7 +1277,7 @@ 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 = ["dev", "doc"] +groups = ["doc"] dependencies = [ "anyio>=3.1.0", "argon2-cffi", @@ -1223,7 +1309,7 @@ name = "jupyter-server-terminals" version = "0.5.2" requires_python = ">=3.8" summary = "A Jupyter Server Extension Providing Terminals." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "pywinpty>=2.0.3; os_name == \"nt\"", "terminado>=0.8.3", @@ -1238,7 +1324,7 @@ name = "jupyterlab" version = "4.0.11" requires_python = ">=3.8" summary = "JupyterLab computational environment" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "async-lru>=1.0.0", "importlib-metadata>=4.8.3; python_version < \"3.10\"", @@ -1264,7 +1350,7 @@ name = "jupyterlab-pygments" version = "0.3.0" requires_python = ">=3.8" summary = "Pygments theme using JupyterLab CSS variables" -groups = ["dev", "doc"] +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"}, @@ -1275,7 +1361,7 @@ name = "jupyterlab-server" version = "2.25.2" requires_python = ">=3.8" summary = "A set of server components for JupyterLab and JupyterLab like applications." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "babel>=2.10", "importlib-metadata>=4.8.3; python_version < \"3.10\"", @@ -1296,7 +1382,7 @@ name = "jupyterlab-widgets" version = "3.0.9" requires_python = ">=3.7" summary = "Jupyter interactive widgets for JupyterLab" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "jupyterlab_widgets-3.0.9-py3-none-any.whl", hash = "sha256:3cf5bdf5b897bf3bccf1c11873aa4afd776d7430200f765e0686bd352487b58d"}, {file = "jupyterlab_widgets-3.0.9.tar.gz", hash = "sha256:6005a4e974c7beee84060fdfba341a3218495046de8ae3ec64888e5fe19fdb4c"}, @@ -1392,7 +1478,7 @@ name = "markupsafe" version = "2.1.4" requires_python = ">=3.7" summary = "Safely add untrusted strings to HTML/XML markup." -groups = ["dev", "doc"] +groups = ["build", "doc"] files = [ {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:de8153a7aae3835484ac168a9a9bdaa0c5eee4e0bc595503c95d53b942879c84"}, {file = "MarkupSafe-2.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e888ff76ceb39601c59e219f281466c6d7e66bd375b4ec1ce83bcdc68306796b"}, @@ -1491,7 +1577,7 @@ name = "matplotlib-inline" version = "0.1.6" requires_python = ">=3.5" summary = "Inline Matplotlib backend for Jupyter" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] dependencies = [ "traitlets", ] @@ -1500,12 +1586,23 @@ files = [ {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 = ["lint"] +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 = "mistune" version = "3.0.2" requires_python = ">=3.7" summary = "A sane and fast Markdown parser with useful plugins and renderers" -groups = ["dev", "doc"] +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"}, @@ -1516,7 +1613,7 @@ name = "mpi4py" version = "3.1.5" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" summary = "Python bindings for MPI" -groups = ["default", "dev", "mpi"] +groups = ["default", "mpi"] files = [ {file = "mpi4py-3.1.5-cp310-cp310-win32.whl", hash = "sha256:f39df0d985cb6fb342ee6c6902cadf21b2d828d7df00b182573da0242646b715"}, {file = "mpi4py-3.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:aec0e6238ed76c930c07df7dcea19f3be5ca958fb76353e668b19511ed4c86d7"}, @@ -1529,12 +1626,23 @@ files = [ {file = "mpi4py-3.1.5.tar.gz", hash = "sha256:a706e76db9255135c2fb5d1ef54cb4f7b0e4ad9e33cbada7de27626205f2a153"}, ] +[[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 = ["lint"] +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 = "nbclient" version = "0.9.0" requires_python = ">=3.8.0" summary = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "jupyter-client>=6.1.12", "jupyter-core!=5.0.*,>=4.12", @@ -1551,7 +1659,7 @@ name = "nbconvert" version = "7.14.2" requires_python = ">=3.8" summary = "Converting Jupyter Notebooks" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "beautifulsoup4", "bleach!=5.0.0", @@ -1580,7 +1688,7 @@ name = "nbformat" version = "5.9.2" requires_python = ">=3.8" summary = "The Jupyter Notebook format" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "fastjsonschema", "jsonschema>=2.6", @@ -1597,7 +1705,7 @@ name = "nbsphinx" version = "0.9.3" requires_python = ">=3.6" summary = "Jupyter Notebook Tools for Sphinx" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "docutils", "jinja2", @@ -1616,7 +1724,7 @@ name = "nest-asyncio" version = "1.6.0" requires_python = ">=3.5" summary = "Patch asyncio to allow nested event loops" -groups = ["dev", "doc"] +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"}, @@ -1627,7 +1735,7 @@ name = "notebook" version = "7.0.7" requires_python = ">=3.8" summary = "Jupyter Notebook - A web-based notebook environment for interactive computing" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "jupyter-server<3,>=2.4.0", "jupyterlab-server<3,>=2.22.1", @@ -1645,7 +1753,7 @@ name = "notebook-shim" version = "0.2.3" requires_python = ">=3.7" summary = "A shim layer for notebook traits and config" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "jupyter-server<3,>=1.8", ] @@ -1659,7 +1767,7 @@ name = "numpy" version = "1.26.3" requires_python = ">=3.9" summary = "Fundamental package for array computing in Python" -groups = ["default", "dev", "doc", "pyfftw", "test"] +groups = ["build", "default", "doc", "pyfftw"] files = [ {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, @@ -1704,7 +1812,7 @@ name = "numpydoc" version = "1.6.0" requires_python = ">=3.8" summary = "Sphinx extension to support docstrings in Numpy format" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "Jinja2>=2.10", "sphinx>=5", @@ -1721,7 +1829,7 @@ name = "overrides" version = "7.6.0" requires_python = ">=3.6" summary = "A decorator to automatically detect mismatch when overriding a method." -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "overrides-7.6.0-py3-none-any.whl", hash = "sha256:c36e6635519ea9c5b043b65c36d4b886aee8bd45b7d4681d2a6df0898df4b654"}, {file = "overrides-7.6.0.tar.gz", hash = "sha256:01e15bbbf15b766f0675c275baa1878bd1c7dc9bc7b9ee13e677cdba93dc1bd9"}, @@ -1732,7 +1840,7 @@ name = "packaging" version = "23.2" requires_python = ">=3.7" summary = "Core utilities for Python packages" -groups = ["default", "dev", "doc", "test"] +groups = ["default", "doc", "lint", "test"] files = [ {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, @@ -1743,7 +1851,7 @@ name = "pandas" version = "2.2.0" requires_python = ">=3.9" summary = "Powerful data structures for data analysis, time series, and statistics" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "numpy<2,>=1.22.4; python_version < \"3.11\"", "numpy<2,>=1.23.2; python_version == \"3.11\"", @@ -1789,7 +1897,7 @@ 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 = ["dev", "doc"] +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"}, @@ -1800,17 +1908,28 @@ name = "parso" version = "0.8.3" requires_python = ">=3.6" summary = "A Python Parser" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] 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 = "pathspec" +version = "0.12.1" +requires_python = ">=3.8" +summary = "Utility library for gitignore style pattern matching of file paths." +groups = ["lint"] +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 = ["dev", "doc", "test"] +groups = ["dev", "doc"] marker = "sys_platform != \"win32\"" dependencies = [ "ptyprocess>=0.5", @@ -1887,12 +2006,23 @@ files = [ {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"}, ] +[[package]] +name = "pip" +version = "23.3.2" +requires_python = ">=3.7" +summary = "The PyPA recommended tool for installing Python packages." +groups = ["dev"] +files = [ + {file = "pip-23.3.2-py3-none-any.whl", hash = "sha256:5052d7889c1f9d05224cd41741acb7c5d6fa735ab34e339624a614eaaa7e7d76"}, + {file = "pip-23.3.2.tar.gz", hash = "sha256:7fd9972f96db22c8077a1ee2691b172c8089b17a5652a44494a9ecb0d78f9149"}, +] + [[package]] name = "platformdirs" version = "4.1.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"] +groups = ["doc", "lint"] files = [ {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, @@ -1909,12 +2039,22 @@ files = [ {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, ] +[[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.19.0" requires_python = ">=3.8" summary = "Python client for the Prometheus monitoring system." -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, @@ -1925,7 +2065,7 @@ name = "prompt-toolkit" version = "3.0.43" requires_python = ">=3.7.0" summary = "Library for building powerful interactive command lines in Python" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] dependencies = [ "wcwidth", ] @@ -1939,7 +2079,7 @@ 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", "dev", "doc"] +groups = ["default", "doc"] 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"}, @@ -1954,7 +2094,7 @@ files = [ name = "ptyprocess" version = "0.7.0" summary = "Run a subprocess in a pseudo terminal" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] marker = "sys_platform != \"win32\" or os_name != \"nt\"" files = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, @@ -1965,7 +2105,7 @@ files = [ name = "pure-eval" version = "0.2.2" summary = "Safely evaluate AST nodes without side effects" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] 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"}, @@ -1976,7 +2116,7 @@ name = "pycodestyle" version = "2.11.1" requires_python = ">=3.8" summary = "Python style guide checker" -groups = ["default"] +groups = ["build", "default"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -1987,7 +2127,7 @@ name = "pycparser" version = "2.21" requires_python = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" summary = "C parser in Python" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, @@ -1998,7 +2138,7 @@ 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 = ["dev", "doc", "pyfftw", "test"] +groups = ["doc", "pyfftw"] dependencies = [ "numpy<2.0,>=1.20", ] @@ -2030,12 +2170,36 @@ name = "pygments" version = "2.17.2" requires_python = ">=3.7" summary = "Pygments is a syntax highlighting package written in Python." -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] 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 = ["lint"] +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" @@ -2086,7 +2250,7 @@ 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", "dev", "doc"] +groups = ["default", "doc"] dependencies = [ "six>=1.5", ] @@ -2100,17 +2264,35 @@ name = "python-json-logger" version = "2.0.7" requires_python = ">=3.6" summary = "A python library adding a json log formatter" -groups = ["dev", "doc"] +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 = "2023.3.post1" summary = "World timezone definitions, modern and historical" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, @@ -2120,7 +2302,7 @@ files = [ name = "pywin32" version = "306" summary = "Python for Window Extensions" -groups = ["dev", "doc"] +groups = ["doc"] marker = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" files = [ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, @@ -2140,7 +2322,7 @@ name = "pywinpty" version = "2.0.12" requires_python = ">=3.8" summary = "Pseudo terminal support for Windows from Python." -groups = ["dev", "doc"] +groups = ["doc"] marker = "os_name == \"nt\"" files = [ {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, @@ -2155,7 +2337,7 @@ name = "pyyaml" version = "6.0.1" requires_python = ">=3.6" summary = "YAML parser and emitter for Python" -groups = ["dev", "doc"] +groups = ["doc"] 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"}, @@ -2196,7 +2378,7 @@ name = "pyzmq" version = "25.1.2" requires_python = ">=3.6" summary = "Python bindings for 0MQ" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "cffi; implementation_name == \"pypy\"", ] @@ -2273,7 +2455,7 @@ name = "qtconsole" version = "5.5.1" requires_python = ">= 3.8" summary = "Jupyter Qt console" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "ipykernel>=4.1", "jupyter-client>=4.1", @@ -2294,7 +2476,7 @@ 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", "dev", "doc"] +groups = ["default", "doc"] dependencies = [ "packaging", ] @@ -2308,7 +2490,7 @@ name = "referencing" version = "0.32.1" requires_python = ">=3.8" summary = "JSON Referencing + Python" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "attrs>=22.2.0", "rpds-py>=0.7.0", @@ -2323,7 +2505,7 @@ name = "requests" version = "2.31.0" requires_python = ">=3.7" summary = "Python HTTP for Humans." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "certifi>=2017.4.17", "charset-normalizer<4,>=2", @@ -2340,7 +2522,7 @@ 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 = ["dev", "doc"] +groups = ["doc"] dependencies = [ "six", ] @@ -2354,7 +2536,7 @@ 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 = ["dev", "doc"] +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"}, @@ -2365,7 +2547,7 @@ name = "rpds-py" version = "0.17.1" requires_python = ">=3.8" summary = "Python bindings to Rust's persistent data structures (rpds)" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, @@ -2460,18 +2642,29 @@ 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 = ["dev", "doc"] +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.0.3" +requires_python = ">=3.8" +summary = "Easily download, build, install, upgrade, and uninstall Python packages" +groups = ["build"] +files = [ + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, +] + [[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", "dev", "doc", "test"] +groups = ["default", "dev", "doc"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -2482,7 +2675,7 @@ name = "sniffio" version = "1.3.0" requires_python = ">=3.7" summary = "Sniff out which async library your code is running under" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, @@ -2492,7 +2685,7 @@ files = [ name = "snowballstemmer" version = "2.2.0" summary = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -groups = ["dev", "doc"] +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"}, @@ -2503,7 +2696,7 @@ name = "soupsieve" version = "2.5" requires_python = ">=3.8" summary = "A modern CSS selector implementation for Beautiful Soup." -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, @@ -2514,7 +2707,7 @@ name = "sphinx" version = "7.2.6" requires_python = ">=3.9" summary = "Python documentation generator" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "Jinja2>=3.0", "Pygments>=2.14", @@ -2574,7 +2767,7 @@ name = "sphinxcontrib-applehelp" version = "1.0.8" requires_python = ">=3.9" summary = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -groups = ["dev", "doc"] +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"}, @@ -2585,7 +2778,7 @@ name = "sphinxcontrib-devhelp" version = "1.0.6" requires_python = ">=3.9" summary = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -groups = ["dev", "doc"] +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"}, @@ -2596,7 +2789,7 @@ name = "sphinxcontrib-htmlhelp" version = "2.0.5" requires_python = ">=3.9" summary = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -groups = ["dev", "doc"] +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"}, @@ -2621,7 +2814,7 @@ name = "sphinxcontrib-jsmath" version = "1.0.1" requires_python = ">=3.5" summary = "A sphinx extension which renders display math in HTML via JavaScript" -groups = ["dev", "doc"] +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"}, @@ -2632,7 +2825,7 @@ name = "sphinxcontrib-qthelp" version = "1.0.7" requires_python = ">=3.9" summary = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -groups = ["dev", "doc"] +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"}, @@ -2643,7 +2836,7 @@ 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 = ["dev", "doc"] +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"}, @@ -2653,7 +2846,7 @@ files = [ name = "stack-data" version = "0.6.3" summary = "Extract data from python stack frames and tracebacks for informative displays" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] dependencies = [ "asttokens>=2.1.0", "executing>=1.2.0", @@ -2669,7 +2862,7 @@ name = "tabulate" version = "0.9.0" requires_python = ">=3.7" summary = "Pretty-print tabular data" -groups = ["dev", "doc"] +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"}, @@ -2680,7 +2873,7 @@ name = "terminado" version = "0.18.0" requires_python = ">=3.8" summary = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "ptyprocess; os_name != \"nt\"", "pywinpty>=1.1.0; os_name == \"nt\"", @@ -2696,7 +2889,7 @@ name = "tinycss2" version = "1.2.1" requires_python = ">=3.7" summary = "A tiny CSS parser" -groups = ["dev", "doc"] +groups = ["doc"] dependencies = [ "webencodings>=0.4", ] @@ -2710,19 +2903,30 @@ name = "tomli" version = "2.0.1" requires_python = ">=3.7" summary = "A lil' TOML parser" -groups = ["default", "dev", "doc", "test"] +groups = ["build", "default", "doc", "lint", "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 = ["lint"] +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 = "tornado" version = "6.4" requires_python = ">= 3.8" summary = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -groups = ["dev", "doc"] +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"}, @@ -2742,7 +2946,7 @@ name = "traitlets" version = "5.14.1" requires_python = ">=3.8" summary = "Traitlets Python configuration system" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] files = [ {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, @@ -2753,7 +2957,7 @@ name = "transonic" version = "0.6.0" requires_python = ">=3.9" summary = "Make your Python code fly at transonic speeds!" -groups = ["default"] +groups = ["build", "default"] dependencies = [ "autopep8", "beniget~=0.4.0", @@ -2770,7 +2974,7 @@ name = "types-python-dateutil" version = "2.8.19.20240106" requires_python = ">=3.8" summary = "Typing stubs for python-dateutil" -groups = ["dev", "doc"] +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"}, @@ -2781,7 +2985,7 @@ name = "typing-extensions" version = "4.9.0" requires_python = ">=3.8" summary = "Backported and Experimental Type Hints for Python 3.8+" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc", "lint"] marker = "python_version < \"3.11\"" files = [ {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, @@ -2793,7 +2997,7 @@ name = "tzdata" version = "2023.4" requires_python = ">=2" summary = "Provider of IANA time zone data" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, @@ -2804,7 +3008,7 @@ name = "uri-template" version = "1.3.0" requires_python = ">=3.7" summary = "RFC 6570 URI Template Processor" -groups = ["dev", "doc"] +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"}, @@ -2815,7 +3019,7 @@ name = "urllib3" version = "2.1.0" requires_python = ">=3.8" summary = "HTTP library with thread-safe connection pooling, file post, and more." -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, @@ -2825,7 +3029,7 @@ files = [ name = "wcwidth" version = "0.2.13" summary = "Measures the displayed width of unicode strings in a terminal" -groups = ["dev", "doc", "test"] +groups = ["dev", "doc"] files = [ {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, @@ -2836,7 +3040,7 @@ name = "webcolors" version = "1.13" requires_python = ">=3.7" summary = "A library for working with the color formats defined by HTML and CSS." -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, @@ -2846,7 +3050,7 @@ files = [ name = "webencodings" version = "0.5.1" summary = "Character encoding aliases for legacy web content" -groups = ["dev", "doc"] +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"}, @@ -2857,18 +3061,29 @@ name = "websocket-client" version = "1.7.0" requires_python = ">=3.8" summary = "WebSocket client for Python with low level API options" -groups = ["dev", "doc"] +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 = "wheel" +version = "0.42.0" +requires_python = ">=3.7" +summary = "A built-package format for Python" +groups = ["build"] +files = [ + {file = "wheel-0.42.0-py3-none-any.whl", hash = "sha256:177f9c9b0d45c47873b619f5b650346d632cdc35fb5e4d25058e09c9e581433d"}, + {file = "wheel-0.42.0.tar.gz", hash = "sha256:c45be39f7882c9d34243236f2d63cbd58039e360f85d0913425fbd7ceea617a8"}, +] + [[package]] name = "widgetsnbextension" version = "4.0.9" requires_python = ">=3.7" summary = "Jupyter interactive widgets for Jupyter Notebook" -groups = ["dev", "doc"] +groups = ["doc"] files = [ {file = "widgetsnbextension-4.0.9-py3-none-any.whl", hash = "sha256:91452ca8445beb805792f206e560c1769284267a30ceb1cec9f5bcc887d15175"}, {file = "widgetsnbextension-4.0.9.tar.gz", hash = "sha256:3c1f5e46dc1166dfd40a42d685e6a51396fd34ff878742a3e47c6f0cc4a2a385"}, @@ -2879,7 +3094,7 @@ name = "zipp" version = "3.17.0" requires_python = ">=3.8" summary = "Backport of pathlib-compatible object wrapper for zip files" -groups = ["default", "dev", "doc"] +groups = ["default", "doc"] marker = "python_version < \"3.10\"" files = [ {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, diff --git a/pylintrc b/pylintrc index 1616cdb..99d6527 100644 --- a/pylintrc +++ b/pylintrc @@ -1,10 +1,137 @@ +[MASTER] + +# Specify a configuration file. +#rcfile= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Profiled execution. +profile=no + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Pickle collected data for later comparisons. +persistent=yes + +# List of plugins (as comma separated values of python modules names) to load, +# usually to register additional checkers. +load-plugins= + +# DEPRECATED +# include-ids=no + +# DEPRECATED +# symbols=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED +confidence=HIGH, INFERENCE, INFERENCE_FAILURE + +# 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. See also the "--disable" option for examples. +#enable= + +# 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 reenable 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=C0103,W0621,W0212,W1202,W1203 + +[REPORTS] + +# Set the output format. Available formats are text, parseable, colorized, msvs +# (visual studio) and html. You can also give a reporter class, eg +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Put messages in a separate file for each module / package specified on the +# command line instead of printing them on stdout. Reports (if any) will be +# written in a file name "pylint_global.[txt|html]". +files-output=no + +# Tells whether to display a full report or only the messages +reports=yes + +# Python expression which should return a note less than 10 (10 is the highest +# note). You have access to the variables errors warning, statement which +# respectively contain the number of errors / warnings messages and the total +# number of statements analyzed. This is used by the global evaluation report +# (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Add a comment according to your evaluation note. This is used by the global +# evaluation report (RP0004). +comment=no + +# 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='{msg_id}:{line:3d},{column}: {obj}: {msg}' +msg-template='{C}:{line:3d},{column:2d}: {msg} ({symbol})' + +[TYPECHECK] + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# 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 +ignored-modules= + +# List of classes names for which member attributes should not be checked +# (useful for classes with attributes dynamically set). +ignored-classes=SQLObject + +# When zope mode is activated, add a predefined set of Zope acquired attributes +# to generated-members. +zope=no + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E0201 when accessed. Python regular +# expressions are accepted. +generated-members=REQUEST,acl_users,aq_parent + + [BASIC] -# Regular expression matching correct constant names -const-rgx=[a-z_][a-z0-9_]{1,30}$ +# Required attributes for module, separated by a comma +required-attributes= -# Naming hint for constant names -const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ +# List of builtins function names that should not be used, separated by a comma +bad-functions=map,filter,apply,input,file + +# Good variable names which should always be accepted, separated by a comma +good-names=i,j,k,ex,Run,_,f,ax + +# Bad variable names which should always be refused, separated by a comma +bad-names=foo,bar,baz,toto,tutu,tata + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Include a hint for the correct naming format with invalid-name +include-naming-hint=no + +# Regular expression matching correct function names +function-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for function names +function-name-hint=[a-z_][a-z0-9_]{2,30}$ # Regular expression matching correct variable names variable-rgx=[a-z_][a-z0-9_]{1,30}$ @@ -12,4 +139,222 @@ variable-rgx=[a-z_][a-z0-9_]{1,30}$ # Naming hint for variable names variable-name-hint=[a-z_][a-z0-9_]{1,30}$ -disable=C0103,W0621,W0212,C0330,W1202,W1203 +# Regular expression matching correct constant names +const-rgx=[a-z_][a-z0-9_]{1,30}$ + +# Naming hint for constant names +const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ + +# Regular expression matching correct attribute names +attr-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for attribute names +attr-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct argument names +argument-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for argument names +argument-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression matching correct class attribute names +class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Naming hint for class attribute names +class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ + +# Regular expression matching correct inline iteration names +inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ + +# Naming hint for inline iteration names +inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ + +# Regular expression matching correct class names +class-rgx=[A-Z_][a-zA-Z0-9]+$ + +# Naming hint for class names +class-name-hint=[A-Z_][a-zA-Z0-9]+$ + +# Regular expression matching correct module names +module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Naming hint for module names +module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ + +# Regular expression matching correct method names +method-rgx=[a-z_][a-z0-9_]{2,30}$ + +# Naming hint for method names +method-name-hint=[a-z_][a-z0-9_]{2,30}$ + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=__.*__ + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME,XXX,TODO + + +[LOGGING] + +# Logging modules to check that the string format arguments are in logging +# function parameter format +logging-modules=logging + + +[FORMAT] + +# Maximum number of characters on a single line. +max-line-length=80 + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# 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 + +# List of optional constructs for which whitespace checking is disabled +no-space-check=trailing-comma,dict-separator + +# Maximum number of lines in a module +max-module-lines=1000 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + + +[VARIABLES] + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# A regular expression matching the name of dummy variables (i.e. expectedly +# not used). +dummy-variables-rgx=_$|dummy + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid to define new builtins when possible. +additional-builtins= + + +[SPELLING] + +# Spelling dictionary name. Available dictionaries: en (aspell), en_CA +# (aspell), en_GB (aspell), en_US (aspell), fr (aspell), fr_CH (aspell), fr_FR +# (aspell), en_ZA (myspell), en_AU (myspell). +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to indicated private dictionary in +# --spelling-private-dict-file option instead of raising a message. +spelling-store-unknown-words=no + + +[SIMILARITIES] + +# Minimum lines number of a similarity. +min-similarity-lines=4 + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + + +[IMPORTS] + +# Deprecated modules which should not be used, separated by a comma +deprecated-modules=regsub,TERMIOS,Bastion,rexec + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled) +import-graph= + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled) +ext-import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled) +int-import-graph= + + +[DESIGN] + +# Maximum number of arguments for function / method +max-args=5 + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore +ignored-argument-names=_.* + +# Maximum number of locals for function / method body +max-locals=15 + +# Maximum number of return / yield for function / method body +max-returns=6 + +# Maximum number of branch for function / method body +max-branches=12 + +# Maximum number of statements in function / method body +max-statements=50 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + + +[CLASSES] + +# List of interface methods to ignore, separated by a comma. This is used for +# instance to not check methods defines in Zope's Interface base class. +ignore-iface-methods=isImplementedBy,deferred,extends,names,namesAndDescriptions,queryDescriptionFor,getBases,getDescriptionFor,getDoc,getName,getTaggedValue,getTaggedValueTags,isEqualOrExtendedBy,setTaggedValue,isImplementedByInstancesOf,adaptWith,is_implemented_by + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__,__new__,setUp + +# 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 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "Exception" +overgeneral-exceptions=builtins.Exception diff --git a/pyproject.toml b/pyproject.toml index 2643dde..ae3c80b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [build-system] -requires = ["pdm-backend"] -build-backend = "pdm.backend" +requires = ["setuptools", "transonic", "pythran", "jinja2", "cython"] +build-backend = "setuptools.build_meta" [project] name = "fluidfft" @@ -58,23 +58,17 @@ distribution = true package-dir = "src" [tool.pdm.dev-dependencies] +build = ["setuptools", "transonic", "pythran", "wheel", "jinja2", "cython"] + test = [ - "coverage", - "cython", # needed at run time for coverage - "ipython", - "pyfftw >= 0.10.4", "pytest", + "coverage", "pytest-cov", + "cython", # needed at run time for coverage ] dev = [ - "coverage", + "pip", "ipython", - "jupyter", - "mpi4py", - "nbsphinx", - "numpydoc", - "pandas", - "pyfftw >= 0.10.4", ] doc = [ "jupyter", @@ -86,3 +80,10 @@ doc = [ "sphinx_copybutton", "sphinx_rtd_theme", ] +lint = ["black", "pylint"] + +[tool.pdm.scripts] +black = 'black -l 82 src doc src_cy --exclude "/(__pythran__|__python__|__numba__|doc/_build|\.ipynb_checkpoints/*)/"' +lint = {shell="pylint -rn --rcfile=pylintrc --jobs=$(nproc) src --exit-zero"} +black_check = 'black --check -l 82 src doc src_cy --exclude "/(__pythran__|__python__|__numba__|doc/_build|\.ipynb_checkpoints/*)/"' +validate_code = {composite = ["black_check", "lint"]} diff --git a/setup_build.py b/setup_build.py index 115d9e1..1531cac 100644 --- a/setup_build.py +++ b/setup_build.py @@ -119,6 +119,7 @@ def base_names_from_config(config): try: # only works with old Numpy (<1.26.0) from numpy.__config__ import get_info + # see https://stackoverflow.com/a/68991641 except ImportError: use_mkl_intel = False diff --git a/src_cy/create_fake_mod_for_doc.py b/src_cy/create_fake_mod_for_doc.py index de2932d..afa8dbd 100644 --- a/src_cy/create_fake_mod_for_doc.py +++ b/src_cy/create_fake_mod_for_doc.py @@ -1,21 +1,19 @@ - - import os here = os.path.abspath(os.path.split(__file__)[0]) -def get_doc(lines, indent=' '): +def get_doc(lines, indent=" "): doc = None # find start doc for i, line in enumerate(lines): # search for end of code - if len(line) - len(line.lstrip(' ')) < len(indent): + if len(line) - len(line.lstrip(" ")) < len(indent): break if line.startswith(indent + '"""'): - lines_to_be_parsed = lines[i+1:] + lines_to_be_parsed = lines[i + 1 :] doc = line break @@ -24,58 +22,63 @@ def get_doc(lines, indent=' '): # find end doc for i, line in enumerate(lines_to_be_parsed): - doc += '\n' + line + doc += "\n" + line if '"""' in line: break return doc + strings_to_be_deleted = [ - ' int ', ' view3df_t ', ' view3dc_t ', - ' view2df_t ', ' view2dc_t ', 'const '] + " int ", + " view3df_t ", + " view3dc_t ", + " view2df_t ", + " view2dc_t ", + "const ", +] def get_function_code(lines): + signature = lines[0].replace(" cpdef ", " def ") - signature = lines[0].replace(' cpdef ', ' def ') - - if not signature.endswith('):'): + if not signature.endswith("):"): for i, line in enumerate(lines[1:]): - signature += ' ' + line.strip() - if line.endswith('):'): + signature += " " + line.strip() + if line.endswith("):"): break else: i = 0 - lines_to_be_parsed = lines[i+1:] + lines_to_be_parsed = lines[i + 1 :] for s in strings_to_be_deleted: - signature = signature.replace(s, ' ') + signature = signature.replace(s, " ") func_lines = [signature] - indent = ' ' * 8 + indent = " " * 8 doc = get_doc(lines_to_be_parsed, indent=indent) if doc is None: - doc = indent + 'pass' + doc = indent + "pass" func_lines.append(doc) - return '\n'.join(func_lines) + return "\n".join(func_lines) def create_fake_mod(dimension): - - with open(os.path.join( - here, 'template{dim}d_mako.pyx'.format(dim=dimension)), 'r') as f: + with open( + os.path.join(here, "template{dim}d_mako.pyx".format(dim=dimension)), "r" + ) as f: lines_text = f.read().splitlines() # find start class for i, line in enumerate(lines_text): - if 'cdef class ' in line: - lines_class = lines_text[i+1:] + if "cdef class " in line: + lines_class = lines_text[i + 1 :] break # get docstring of the class @@ -86,20 +89,26 @@ def create_fake_mod(dimension): # find functions functions_codes = [] for i, line in enumerate(lines_function_class): - if line.startswith(' def ') or line.startswith(' cpdef '): - if ' __dealloc__(' in line or '__cinit__' in line: + if line.startswith(" def ") or line.startswith(" cpdef "): + if " __dealloc__(" in line or "__cinit__" in line: continue functions_codes.append(get_function_code(lines_function_class[i:])) code = ( - 'class FFT{dim}dFakeForDoc(object):\n'.format(dim=dimension) + - doc_class + '\n\n' + '\n\n'.join(functions_codes) + '\n') - - name = '../src/fluidfft/fft{dim}d/fake_mod_fft{dim}d_for_doc.py'.format( - dim=dimension) - - with open(os.path.join(here, name), 'w') as f: + "class FFT{dim}dFakeForDoc(object):\n".format(dim=dimension) + + doc_class + + "\n\n" + + "\n\n".join(functions_codes) + + "\n" + ) + + name = "../src/fluidfft/fft{dim}d/fake_mod_fft{dim}d_for_doc.py".format( + dim=dimension + ) + + with open(os.path.join(here, name), "w") as f: f.write(code) + for dim in range(2, 4): create_fake_mod(dim) diff --git a/src_cy/make_files_with_mako.py b/src_cy/make_files_with_mako.py index 97094b7..7434711 100644 --- a/src_cy/make_files_with_mako.py +++ b/src_cy/make_files_with_mako.py @@ -68,7 +68,6 @@ def get_path_files(module_name): def make_file(module_name, class_name, numpy_api, templates): - if module_name.startswith("fft2d"): t_pyx = templates["fft2d_pyx"] t_pxd = templates["fft2d_pxd"] @@ -114,7 +113,6 @@ def make_file(module_name, class_name, numpy_api, templates): def make_pyx_files(): - templates = {} templates["fft2d_pyx"] = load_template("template2d_mako.pyx") diff --git a/src_cy/tmp_2dto3d.py b/src_cy/tmp_2dto3d.py index 12953e3..2caa4ca 100644 --- a/src_cy/tmp_2dto3d.py +++ b/src_cy/tmp_2dto3d.py @@ -1,23 +1,21 @@ - import numpy as np from fluidfft import import_fft_class -FFT3D = import_fft_class('fft3d.mpi_with_fftwmpi3d') -FFT2D = import_fft_class('fft2d.with_fftw2d') +FFT3D = import_fft_class("fft3d.mpi_with_fftwmpi3d") +FFT2D = import_fft_class("fft2d.with_fftw2d") def build_arrayX_from_2d_indices12(self, o2d, arr2d): - nX0, nX1, nX2 = self.get_shapeX_seq() nX0loc, nX1loc, nX2loc = self.get_shapeX_loc() if (nX1, nX2) != o2d.get_shapeX_seq(): - raise ValueError('Not the same physical shape...') + raise ValueError("Not the same physical shape...") # check that the 2d fft is not with distributed memory... if o2d.get_shapeX_loc() != o2d.get_shapeX_loc(): - raise ValueError('2d fft is with distributed memory...') + raise ValueError("2d fft is with distributed memory...") if (nX1loc, nX2loc) == o2d.get_shapeX_loc(): arr3d_loc_2dslice = arr2d @@ -32,18 +30,17 @@ def build_arrayX_from_2d_indices12(self, o2d, arr2d): def build_invariant_arrayK_from_2d_indices12X(self, o2d, arr2d): - nK0, nK1, nK2 = self.get_shapeK_seq() nK0loc, nK1loc, nK2loc = self.get_shapeK_loc() nX0, nX1, nX2 = self.get_shapeX_seq() if (nX1, nX2) != o2d.get_shapeX_seq(): - raise ValueError('Not the same physical shape...') + raise ValueError("Not the same physical shape...") # check that the 2d fft is not with distributed memory... if o2d.get_shapeX_loc() != o2d.get_shapeX_loc(): - raise ValueError('2d fft is with distributed memory...') + raise ValueError("2d fft is with distributed memory...") ind0seq_first, ind1seq_first = self.get_seq_indices_first_K() dimX_K = self.get_dimX_K() @@ -80,16 +77,19 @@ def build_invariant_arrayK_from_2d_indices12X(self, o2d, arr2d): n = 4 n0 = n -n1 = 10*n -n2 = 100*n +n1 = 10 * n +n2 = 100 * n o3d = FFT3D(n0, n1, n2) o2d = FFT2D(n1, n2) shapeK_loc_2d = o2d.get_shapeK_loc() -arr2d = np.arange(np.product(shapeK_loc_2d)).reshape( - shapeK_loc_2d).astype(np.complex128) +arr2d = ( + np.arange(np.product(shapeK_loc_2d)) + .reshape(shapeK_loc_2d) + .astype(np.complex128) +) arr3d = build_invariant_arrayK_from_2d_indices12X(o3d, o2d, arr2d) # arr3d = o3d.build_invariant_arrayK_from_2d_indices12X(o2d, arr2d)