diff --git a/.github/workflows/ci_cd.yml b/.github/workflows/ci_cd.yml index 180f10b94..d21b3c8f6 100644 --- a/.github/workflows/ci_cd.yml +++ b/.github/workflows/ci_cd.yml @@ -16,7 +16,7 @@ env: CONTAINER_TAG: 'latest' PACKAGE_NAME: 'ansys-dpf-composites' DOCUMENTATION_CNAME: 'composites.dpf.docs.pyansys.com' - PYDPF_COMPOSITES_DOCKER_CONTAINER_PORT: "21002" + PYDPF_COMPOSITES_DOCKER_CONTAINER_PORT: "50052" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -45,7 +45,7 @@ jobs: name: "Documentation style" runs-on: ubuntu-latest steps: - - uses: pyansys/actions/doc-style@v4 + - uses: ansys/actions/doc-style@v4 with: token: ${{ secrets.GITHUB_TOKEN }} @@ -58,7 +58,7 @@ jobs: # docker images on the windows agents. See the issue # https://github.com/actions/runner-images/issues/1143 os: [ubuntu-latest] - python-version: ['3.7', '3.8', '3.9', '3.10', '3.11'] + python-version: ['3.8', '3.9', '3.10', '3.11'] fail-fast: false steps: - name: "Login in Github Container registry" @@ -70,7 +70,7 @@ jobs: - name: "Pull and start dpf container" run: | - docker pull ghcr.io/pyansys/pydpf-composites:${{ env.CONTAINER_TAG }} + docker pull ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} - name: "Checkout the project" uses: actions/checkout@v3 @@ -115,12 +115,12 @@ jobs: password: ${{ secrets.GITHUB_TOKEN }} - name: "Pull and start DPF container" run: | - docker pull ghcr.io/pyansys/pydpf-composites:${{ env.CONTAINER_TAG }} + docker pull ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} - uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: - python-version: 3.7 + python-version: 3.8 - name: Install dependencies run: | python -m pip install --upgrade pip tox tox-gh-actions @@ -150,8 +150,8 @@ jobs: - name: "Pull and start dpf container" run: | - docker pull ghcr.io/pyansys/pydpf-composites:${{ env.CONTAINER_TAG }} - docker run -d --restart always -p 21002:50052 -e ANSYSLMD_LICENSE_FILE=1055@${{ secrets.LICENSE_SERVER }} -e ANSYS_DPF_ACCEPT_LA=Y ghcr.io/pyansys/pydpf-composites:${{ env.CONTAINER_TAG }} + docker pull ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} + docker run -d --restart always -p 50052:50052 -e ANSYSLMD_LICENSE_FILE=1055@${{ secrets.LICENSE_SERVER }} -e ANSYS_DPF_ACCEPT_LA=Y ghcr.io/ansys/pydpf-composites:${{ env.CONTAINER_TAG }} - name: "Checkout the project" uses: actions/checkout@v3 @@ -192,23 +192,40 @@ jobs: path: .tox/doc_out/latex/ansys-dpf-composites.pdf retention-days: 7 - build-package: + build-library: name: "Build package" runs-on: ubuntu-latest needs: [doc-style, doc-build, code-style, tests, tests_minimal_version] steps: - name: "Build library source and wheel artifacts" - uses: pyansys/actions/build-library@v4 + uses: ansys/actions/build-library@v4 with: library-name: ${{ env.PACKAGE_NAME }} + build-wheelhouse: + name: "Build wheelhouse for latest Python versions" + runs-on: ${{ matrix.os }} + needs: [doc-style, doc-build, code-style, tests, tests_minimal_version] + strategy: + matrix: + os: [ubuntu-latest, windows-latest] + python-version: ['3.8', '3.9', '3.10', '3.11'] + steps: + - name: "Build a wheelhouse of the Python library" + uses: ansys/actions/build-wheelhouse@v4 + with: + library-name: "ansys-dpf-composites" + library-namespace: "ansys.dpf.composites" + operating-system: ${{ matrix.os }} + python-version: ${{ matrix.python-version }} + doc-deploy-dev: name: "Deploy development documentation" if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest - needs: [build-package] + needs: [build-library, build-wheelhouse] steps: - - uses: pyansys/actions/doc-deploy-dev@v4 + - uses: ansys/actions/doc-deploy-dev@v4 with: cname: ${{ env.DOCUMENTATION_CNAME }} token: ${{ secrets.GITHUB_TOKEN }} @@ -217,19 +234,19 @@ jobs: release: name: "Release project" if: github.event_name == 'push' && contains(github.ref, 'refs/tags/v') - needs: [build-package] + needs: [build-library, build-wheelhouse] runs-on: ubuntu-latest steps: - name: "Release to the public PyPI repository" - uses: pyansys/actions/release-pypi-public@v4 + uses: ansys/actions/release-pypi-public@v4 with: library-name: ${{ env.PACKAGE_NAME }} twine-username: "__token__" twine-token: ${{ secrets.PYPI_TOKEN }} - name: "Release to GitHub" - uses: pyansys/actions/release-github@v4 + uses: ansys/actions/release-github@v4 with: library-name: ${{ env.PACKAGE_NAME }} @@ -239,7 +256,7 @@ jobs: needs: [release] if: github.event_name == 'push' && contains(github.ref, 'refs/tags/v') steps: - - uses: pyansys/actions/doc-deploy-stable@v4 + - uses: ansys/actions/doc-deploy-stable@v4 with: cname: ${{ env.DOCUMENTATION_CNAME }} token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/label.yml b/.github/workflows/label.yml index 68016578d..756737d65 100644 --- a/.github/workflows/label.yml +++ b/.github/workflows/label.yml @@ -40,7 +40,7 @@ jobs: # Label based on branch name - uses: actions-ecosystem/action-add-labels@v1 if: | - startsWith(github.event.pull_request.head.ref, 'doc') || + startsWith(github.event.pull_request.head.ref, 'doc') || startsWith(github.event.pull_request.head.ref, 'docs') with: labels: documentation @@ -70,16 +70,16 @@ jobs: runs-on: ubuntu-latest steps: - name: Suggest to add labels - uses: peter-evans/create-or-update-comment@v2 + uses: peter-evans/create-or-update-comment@v3 # Execute only when no labels have been applied to the pull request if: toJSON(github.event.pull_request.labels.*.name) == '{}' with: issue-number: ${{ github.event.pull_request.number }} body: | Please add one of the following labels to add this contribution to the Release Notes :point_down: - - [bug](https://github.com/pyansys/pydpf-composites/pulls?q=label%3Abug+) - - [documentation](https://github.com/pyansys/pydpf-composites/pulls?q=label%3Adocumentation+) - - [enhancement](https://github.com/pyansys/pydpf-composites/pulls?q=label%3Aenhancement+) - - [good first issue](https://github.com/pyansys/pydpf-composites/pulls?q=label%3Agood+first+issue) - - [maintenance](https://github.com/pyansys/pydpf-composites/pulls?q=label%3Amaintenance+) - - [release](https://github.com/pyansys/pydpf-composites/pulls?q=label%3Arelease+) + - [bug](https://github.com/ansys/pydpf-composites/pulls?q=label%3Abug+) + - [documentation](https://github.com/ansys/pydpf-composites/pulls?q=label%3Adocumentation+) + - [enhancement](https://github.com/ansys/pydpf-composites/pulls?q=label%3Aenhancement+) + - [good first issue](https://github.com/ansys/pydpf-composites/pulls?q=label%3Agood+first+issue) + - [maintenance](https://github.com/ansys/pydpf-composites/pulls?q=label%3Amaintenance+) + - [release](https://github.com/ansys/pydpf-composites/pulls?q=label%3Arelease+) diff --git a/.github/workflows/package_cleanup.yml b/.github/workflows/package_cleanup.yml index 66d704208..d32fe582f 100644 --- a/.github/workflows/package_cleanup.yml +++ b/.github/workflows/package_cleanup.yml @@ -14,7 +14,8 @@ jobs: runs-on: ubuntu-latest steps: - name: "Delete untagged package versions" - uses: pyansys/actions/hk-package-clean-untagged@v4 + uses: ansys/actions/hk-package-clean-untagged@v4 with: package-name: 'pydpf-composites' + allow-last-days: '14' token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index c64337753..f4da3724b 100644 --- a/.gitignore +++ b/.gitignore @@ -157,6 +157,9 @@ cython_debug/ # End of https://www.toptal.com/developers/gitignore/api/python +# VSCode +.vscode/ + # Generated sphinx gallery doc/source/examples/gallery_examples @@ -165,4 +168,7 @@ doc/source/api/_autosummary # testing server logs tests/logs/*_log_err*.txt -tests/logs/*_log_out*.txt \ No newline at end of file +tests/logs/*_log_out*.txt + +# Generated result_definitions in tests +tests/data/*/result_definition.json \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0cb4bdbee..a7e4870a0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ repos: - repo: https://github.com/psf/black - rev: 22.12.0 # IF VERSION CHANGES --> MODIFY "blacken-docs" MANUALLY AS WELL!! + rev: 23.3.0 # IF VERSION CHANGES --> MODIFY "blacken-docs" MANUALLY AS WELL!! hooks: - id: black @@ -9,7 +9,7 @@ repos: rev: 1.13.0 hooks: - id: blacken-docs - additional_dependencies: [black==22.12.0] + additional_dependencies: [black==23.3.0] exclude: "^tests/" - repo: https://github.com/pycqa/isort @@ -17,6 +17,12 @@ repos: hooks: - id: isort +- repo: https://github.com/asottile/pyupgrade + rev: v3.3.1 + hooks: + - id: pyupgrade + args: [--py38-plus] + - repo: https://github.com/PyCQA/flake8 rev: 6.0.0 hooks: @@ -30,10 +36,11 @@ repos: exclude: "^(tests/|examples/)" - repo: https://github.com/codespell-project/codespell - rev: v2.2.2 + rev: v2.2.4 hooks: - id: codespell additional_dependencies: ['tomli'] # needed to parse pyproject.toml + exclude: '^poetry\.lock$' - repo: local hooks: diff --git a/README.rst b/README.rst index 33f13a631..8301e4596 100644 --- a/README.rst +++ b/README.rst @@ -8,7 +8,7 @@ PyDPF Composites :target: https://docs.pyansys.com/ :alt: PyAnsys -.. |python| image:: https://img.shields.io/badge/Python-%3E%3D3.7-blue +.. |python| image:: https://img.shields.io/badge/Python-%3E%3D3.8-blue :target: https://pypi.org/project/ansys-dpf-composites/ :alt: Python @@ -16,12 +16,12 @@ PyDPF Composites :target: https://pypi.org/project/ansys-dpf-composites :alt: PyPI -.. |codecov| image:: https://codecov.io/gh/pyansys/pydpf-composites/branch/main/graph/badge.svg - :target: https://codecov.io/gh/pyansys/pydpf-composites +.. |codecov| image:: https://codecov.io/gh/ansys/pydpf-composites/branch/main/graph/badge.svg + :target: https://codecov.io/gh/ansys/pydpf-composites :alt: Codecov -.. |GH-CI| image:: https://github.com/pyansys/pydpf-composites/actions/workflows/ci_cd.yml/badge.svg - :target: https://github.com/pyansys/pydpf-composites/actions/workflows/ci_cd.yml +.. |GH-CI| image:: https://github.com/ansys/pydpf-composites/actions/workflows/ci_cd.yml/badge.svg + :target: https://github.com/ansys/pydpf-composites/actions/workflows/ci_cd.yml :alt: GH-CI .. |MIT| image:: https://img.shields.io/badge/License-MIT-yellow.svg @@ -37,8 +37,9 @@ PyDPF Composites is a Python wrapper for Ansys DPF composites. It implements classes on top of DPF Composites operators and data accessors for short fiber and layered composites (layered shell and solid elements). This module can be used to postprocess fiber reinforced plastics and layered composites and -to implement custom failure criteria and computation. For examples demonstrating -the behavior and usage of PyDPF Composites, see `PyDPF Composites - Examples`_. +to implement custom failure criteria and computation. For information demonstrating +the behavior and usage of PyDPF Composites, see `Examples`_ in the DPF Composite +documentation. .. START_MARKER_FOR_SPHINX_DOCS @@ -59,7 +60,7 @@ familiar with the `PyAnsys Developer's Guide`_. .. code:: bash - git clone https://github.com/pyansys/pydpf-composites + git clone https://github.com/ansys/pydpf-composites cd pydpf-composites @@ -75,10 +76,12 @@ familiar with the `PyAnsys Developer's Guide`_. pipx install tox -#. Create a virtual environment and install the package with development - dependencies. PyDPF Composites uses `Poetry `_ + PyDPF Composites uses `Poetry `_ to manage the development environment. +#. Create a virtual environment and install the package with the + development dependencies: + .. code:: bash poetry install --all-extras @@ -94,22 +97,17 @@ familiar with the `PyAnsys Developer's Guide`_. Test ==== -.. note:: - - The Docker container referenced in the first option is not yet publicly available. - -Set the environment variable `ANSYSLMD_LICENSE_FILE` to configure the licensing or pass it -as argument (`--license-server=1055@mylicenseserver`) to the pytest call. - -There are three ways to run the PyDPF Composites tests, depending on how the DPF +There are different ways to run the PyDPF Composites tests, depending on how the DPF server is started. -#. Run tests with a Docker container. +#. Run tests with a Docker container: + + Follow the steps in `Getting The DPF Server Docker Image`_ to get + and run the DPF docker image. Run the tests with the following command .. code:: bash - docker pull ghcr.io/pyansys/pydpf-composites:latest - pytest . + pytest . --port 50052 #. Run tests with a DPF server started from the Ansys installer. The Ansys version must @@ -120,43 +118,42 @@ server is started. pytest . --ansys-path "C:\Program Files\Ansys Inc\v232" -#. Run tests with a local gRPC server executable: +#. Run tests with a Docker container from Github (Ansys Internal only): .. code:: bash - pytest . --server-bin dpf_composites/bin/lib/deps/Ans.Dpf.Grpc.exe - - - This currently works only on Windows and with the directory structure of the Ansys internal - ``dpf_composites`` package. The runtime dependencies of the ``Ans.Dpf.Grpc.exe`` file must be - in its folder and the parent folder. + docker pull ghcr.io/ansys/pydpf-composites:latest + pytest . Build documentation =================== -.. note:: - - The Docker container referenced in this section is not yet publicly available. - +Follow the description in `Getting The DPF Server Docker Image`_ image to get +and run the dpf docker image. -On Windows, build documentation with this code: +On Windows, build the documentation with: .. code:: bash - docker pull ghcr.io/pyansys/pydpf-composites:latest - docker run -d -p 21002:50052 -e ANSYSLMD_LICENSE_FILE=10555@mylicserver -e ANSYS_DPF_ACCEPT_LA=Y ghcr.io/pyansys/pydpf-composites:latest tox -e doc-windows -On Linux, build documentation with this code: +On Linux, build the documentation with: .. code:: bash - docker pull ghcr.io/pyansys/pydpf-composites:latest - docker run -d -p 21002:50052 -e ANSYSLMD_LICENSE_FILE=10555@mylicserver -e ANSYS_DPF_ACCEPT_LA=Y ghcr.io/pyansys/pydpf-composites:latest tox -e doc-linux +Ansys internal only: Build the docs with the latest container from Github: + +.. code:: bash + + docker pull ghcr.io/ansys/pydpf-composites:latest + docker run -d -p 50052:50052 -e ANSYSLMD_LICENSE_FILE=1055@mylicserver -e ANSYS_DPF_ACCEPT_LA=Y ghcr.io/ansys/pydpf-composites:latest + tox -e doc-windows + + Run style checks ================ @@ -175,6 +172,18 @@ The style checks can also be configured to run automatically before each ``git c pre-commit install +View documentation +------------------- +Documentation for the latest stable release of PyDPF Composites is hosted at +`PyDPF Composites Documentation `_. + +In the upper right corner of the documentation's title bar, there is an option +for switching from viewing the documentation for the latest stable release +to viewing the documentation for the development version or previously +released versions. + + + .. LINKS AND REFERENCES .. _black: https://github.com/psf/black .. _flake8: https://flake8.pycqa.org/en/latest/ @@ -185,4 +194,5 @@ The style checks can also be configured to run automatically before each ``git c .. _pytest: https://docs.pytest.org/en/stable/ .. _Sphinx: https://www.sphinx-doc.org/en/master/ .. _tox: https://tox.wiki/ -.. _PyDPF Composites - Examples: https://composites.dpf.docs.pyansys.com/dev/examples/index.html +.. _Examples: https://composites.dpf.docs.pyansys.com/dev/examples/index.html +.. _Getting The DPF Server Docker Image: https://composites.dpf.docs.pyansys.com/version/stable/intro.html#getting-the-dpf-server-docker-image diff --git a/doc/source/api/server_helpers.rst b/doc/source/api/server_helpers.rst index 5286cc736..5d3622e34 100644 --- a/doc/source/api/server_helpers.rst +++ b/doc/source/api/server_helpers.rst @@ -8,3 +8,5 @@ Server helpers load_composites_plugin connect_to_or_start_server + upload_continuous_fiber_composite_files_to_server + upload_short_fiber_composite_files_to_server diff --git a/doc/source/conf.py b/doc/source/conf.py index 6dc61d64b..fc03d3c92 100644 --- a/doc/source/conf.py +++ b/doc/source/conf.py @@ -37,7 +37,7 @@ cname = os.environ.get("DOCUMENTATION_CNAME", "composites.dpf.docs.pyansys.com") html_theme_options = { - "github_url": "https://github.com/pyansys/pydpf-composites", + "github_url": "https://github.com/ansys/pydpf-composites", "show_prev_next": False, "show_breadcrumbs": True, "additional_breadcrumbs": [ @@ -80,7 +80,7 @@ ("py:class", "int64"), ] nitpick_ignore_regex = [ - ("py:class", "numpy\..*"), + ("py:class", r"numpy\..*"), ("py:class", ".*FailureCriterionBase"), # implementation detail, not documented ] diff --git a/doc/source/index.rst b/doc/source/index.rst index e7c67631e..81c39a88c 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -14,7 +14,7 @@ PyDPF Composites PyDPF Composites is a Python wrapper for Ansys DPF composites. It implements classes on top of DPF Composites operators and data accessors for short fiber and layered composites (layered shell and solid elements). This module -can be used to postprocess fiber reinforced plastics and layered composites, and +can be used to postprocess fiber reinforced plastics and layered composites and to implement custom failure criteria and computation. .. grid:: 1 1 2 2 @@ -31,7 +31,7 @@ to implement custom failure criteria and computation. :link: examples/index :link-type: doc - Demonstrate the use of PyDPF Composites for various workflows. + Demonstrates the use of PyDPF Composites for various workflows. .. grid-item-card:: :octicon:`file-code` API reference :link: api/index @@ -61,23 +61,15 @@ Here are some key features of PyDPF Composites: :ref:`Material properties and custom failure criterion `. * Postprocessing of homogeneous elements. -Prerequisites -''''''''''''' - -Here are some prerequisites for PyDPF Composites: - -- Installation of `Ansys Workbench`_ from Ansys 2023 R1 or later. For more information, - see `Compatibility`_ in the DPF help. -- ACP model or short fiber composite model. Limitations ''''''''''' - Layered elements (section data) that have not been preprocessed with ACP are not supported. - For information on converting legacy models, see `Import legacy models`_ - in the Ansys help. + For information on converting legacy models, see `Import of Legacy Mechanical APDL Composite Models`_ + in the Ansys Help. - Only the Mechanical APDL solver is supported. .. _Ansys Workbench: https://download.ansys.com/Current%20Release -.. _Import legacy models: https://ansyshelp.ansys.com/account/secured?returnurl=/Views/Secured/corp/v231/en/acp_ug/acp_import_legacy_APDL_comp.html -.. _Compatibility: https://dpf.docs.pyansys.com/getting_started/compatibility.html +.. _Import of Legacy Mechanical APDL Composite Models: https://ansyshelp.ansys.com/account/secured?returnurl=/Views/Secured/corp/v231/en/acp_ug/acp_import_legacy_APDL_comp.html +.. _Compatibility: https://dpf.docs.pyansys.com/version/stable/getting_started/compatibility.html diff --git a/doc/source/intro.rst b/doc/source/intro.rst index 2af6986dd..3d8d721bf 100644 --- a/doc/source/intro.rst +++ b/doc/source/intro.rst @@ -4,7 +4,8 @@ Getting started Installation ^^^^^^^^^^^^ -PyDPF Composites supports Ansys version 2023 R1 and later. Make sure you have a licensed copy of Ansys installed. +PyDPF Composites supports Ansys version 2023 R1 and later. Make sure you have a licensed copy of Ansys installed. See +:ref:`Compatibility` to understand which ``ansys-dpf-composites`` version corresponds to which Ansys version. Install the ``ansys-dpf-composites`` package with ``pip``: @@ -12,6 +13,12 @@ Install the ``ansys-dpf-composites`` package with ``pip``: pip install ansys-dpf-composites +Specific versions can be installed by specifying the version in the pip command. For example: Ansys 2023 R1 requires ansys-dpf-composites version 0.1.0: + +.. code:: + + pip install ansys-dpf-composites==0.1.0 + You should use a `virtual environment `_, because it keeps Python packages isolated from your system Python. @@ -79,7 +86,8 @@ detailed output for a sampling point: combined_criterion=combined_failure_criterion, element_id=element_id ) - sampling_point.get_result_plots() + plots = sampling_point.get_result_plots() + plots.figure.show() .. image:: _static/boat_irf.png @@ -89,3 +97,35 @@ detailed output for a sampling point: .. image:: _static/boat_sampling_point.png :width: 750 :alt: Sampling point on boat + +.. _Compatibility: + +Compatibility +""""""""""""" + +The following table shows which ``ansys-dpf-composites`` version is compatible with which server version (Ansys version). See :ref:`Get DPF Docker image` to get the pre-releases. +By default the DPF server is started from the latest Ansys installer. To choose a specific Ansys version or connect to an existing server, use the appropriate arguments for :func:`.connect_to_or_start_server` + +.. list-table:: + :widths: 20 20 + :header-rows: 1 + + * - Server version + - ansys.dpf.composites Python module version + * - 6.2 (Ansys 2023 R2) + - 0.2.0 and later + * - 6.1 (Ansys 2023 R2 pre1) + - 0.2.0 and later + * - 6.0 (Ansys 2023 R2 pre0) + - Not available. The composites plugin is not part of the Ansys 2023 R2 pre0 release. + * - 5.0 (Ansys 2023 R1) + - 0.1.0 + + +.. _Get DPF Docker image: + +Getting the DPF Server Docker Image +""""""""""""""""""""""""""""""""""" +Follow the steps described in the DPF documentation in the section `Run DPF Server in A Docker Container `_. +Make sure you also download the composites plugin (e.g ``ansys_dpf_composites_lin_v2023.2.pre1.zip``). +After following the steps above, you should have a running DPF docker container that listens to port 50052. diff --git a/examples/3_short_fiber_example.py b/examples/3_short_fiber_example.py index 4d9a1765e..a80822489 100644 --- a/examples/3_short_fiber_example.py +++ b/examples/3_short_fiber_example.py @@ -57,7 +57,7 @@ # Initialize DPF model # ~~~~~~~~~~~~~~~~~~~~ # Initialize the DPF model. -model = dpf.Model(composite_files_on_server.rst) +model = dpf.Model(data_sources=data_sources) mesh = model.metadata.meshed_region # %% diff --git a/examples/4_get_material_properties_example.py b/examples/4_get_material_properties_example.py index 8d8061d1d..2f67f996d 100644 --- a/examples/4_get_material_properties_example.py +++ b/examples/4_get_material_properties_example.py @@ -11,7 +11,7 @@ Note: Only constant material properties are currently supported. """ -#%% +# %% # Script # ~~~~~~ # @@ -32,11 +32,11 @@ server = connect_to_or_start_server() composite_files_on_server = get_continuous_fiber_example_files(server, "shell") -#%% +# %% # Set up the composite model composite_model = CompositeModel(composite_files_on_server, server) -#%% +# %% # Get dictionary that maps dpf_material_id to properties # The creation of the dictionary is currently quite slow and # should be done before using the properties in a loop. @@ -47,14 +47,14 @@ property_dict = composite_model.get_constant_property_dict([material_property]) -#%% +# %% # Get strain field strain_operator = composite_model.core_model.results.elastic_strain() strain_operator.inputs.bool_rotate_to_global(False) strain_field = strain_operator.get_output(pin=0, output_type=dpf.types.fields_container)[0] -#%% +# %% # Implement a custom failure criterion: basic max strain result_field = dpf.field.Field(location=dpf.locations.elemental, nature=dpf.natures.scalar) diff --git a/examples/5_get_layup_properties_example.py b/examples/5_get_layup_properties_example.py index b0cf3162e..87a41e8f0 100644 --- a/examples/5_get_layup_properties_example.py +++ b/examples/5_get_layup_properties_example.py @@ -11,7 +11,7 @@ To get the full layer information of an element, including results, consider using the :class:`SamplingPoint <.SamplingPoint>` class. """ -#%% +# %% # Set up analysis # ~~~~~~~~~~~~~~~ # Setting up the analysis consists of importing dependencies, connecting to the @@ -30,13 +30,13 @@ server = connect_to_or_start_server() composite_files_on_server = get_continuous_fiber_example_files(server, "shell") -#%% +# %% # Set up model # ~~~~~~~~~~~~ # Set up the composite model. composite_model = CompositeModel(composite_files_on_server, server) -#%% +# %% # Get lay-up properties # ~~~~~~~~~~~~~~~~~~~~~ # Get lay-up properties for all elements and show the first one as an example. @@ -48,7 +48,7 @@ analysis_plies = composite_model.get_analysis_plies(element_id) -#%% +# %% # Plot lay-up properties # ~~~~~~~~~~~~~~~~~~~~~~ # Plot basic layer properties (layer thicknesses, angles, and analysis ply names). diff --git a/examples/9_short_fiber_orientation_tensor.py b/examples/9_short_fiber_orientation_tensor.py new file mode 100644 index 000000000..930e3df88 --- /dev/null +++ b/examples/9_short_fiber_orientation_tensor.py @@ -0,0 +1,139 @@ +""" +.. _short_fiber_orientation_tensor: + +Plot of the orientation tensor for short fiber composites +--------------------------------------------------------- + +This example shows how to reconstruct and plot the components +of the fiber orientation tensor in the global coordinate system. + +For more details about the fiber orientation tensor, +refer to the Short Fiber Composites help. + +.. note:: + + To run this example you first need to install the SciPy package. + +""" +# %% +# Set up analysis +# ~~~~~~~~~~~~~~~ +# Setting up the analysis consists of loading Ansys libraries, connecting to the +# DPF server, and retrieving the example files. +# +# Load Ansys libraries. + +import ansys.dpf.core as dpf +import numpy as np +from scipy.spatial.transform import Rotation + +from ansys.dpf.composites.example_helper import get_short_fiber_example_files +from ansys.dpf.composites.server_helpers import connect_to_or_start_server + +# %% +# Start a DPF server and copy the example files into the current working directory. +# These files are needed: +# +# * Mechanical APDL result (RST) file containing the simulation results +# * Mechanical APDL input file (DS.DAT) containing the fiber orientation tensor data +server = connect_to_or_start_server() +composite_files_on_server = get_short_fiber_example_files(server, "short_fiber") + +# %% +# Set up data sources +# ~~~~~~~~~~~~~~~~~~~ +# Set up the data sources. +data_sources = dpf.DataSources() +data_sources.add_file_path(composite_files_on_server.dsdat, "dat") +data_sources.set_result_file_path(composite_files_on_server.rst) + +# %% +# Initialize DPF model +# ~~~~~~~~~~~~~~~~~~~~ +# Initialize the DPF model. +model = dpf.Model(data_sources=data_sources) +mesh = model.metadata.meshed_region + +# %% +# Should your mesh contain both solid and shell elements, for visualization purposes +# it can be useful to scope the mesh to the solid ones. + +# solid_scoping_op = dpf.operators.scoping.on_mesh_property( +# property_name='solid_elements', +# mesh=mesh, +# ) +# solid_mesh = dpf.operators.mesh.from_scoping( +# scoping=solid_scoping_op.outputs.mesh_scoping(), +# mesh=model.metadata.mesh_provider, +# ).outputs.mesh() + +# %% +# Plot input data +# ~~~~~~~~~~~~~~~ +# Plot the two largest eigenvalues (a11 and a22) of the fiber orientation tensor. +# Note that the plots reveal the presence of a weld line in the middle of the specimen. +field_variable_provider = dpf.Operator("composite::inistate_field_variables_provider") +field_variable_provider.inputs.data_sources(data_sources) +field_variable_provider.inputs.mesh(mesh) + +field_variable_dict = { + fv.name: fv for fv in field_variable_provider.outputs.fields_container.get_data() +} + +A11_NAME = "Orientation Tensor A11" +A22_NAME = "Orientation Tensor A22" + +a11 = field_variable_dict[A11_NAME] +a11.plot() + +a22 = field_variable_dict[A22_NAME] +a22.plot() + +# %% +# Compute results +# ~~~~~~~~~~~~~~~~~~~~~~~~ +# Reconstruct the fiber orientation tensor in the global coordinate system. + +element_ids = a11.scoping.ids +# Alternatively, you could for instance scope to a named selection with +# >>> element_ids = model.metadata.meshed_region.named_selection('CENTER').ids + +# Define the fiber orientation tensor in the global coordinate system +# as a symmetrical 3x3 tensor with components XX,YY,ZZ,XY,YZ,XZ. +fiber_orientation_tensor = dpf.fields_factory.create_tensor_field( + num_entities=len(element_ids), location=dpf.locations.elemental +) + +ele_orientation_op = dpf.operators.result.element_orientations( + data_sources=data_sources, requested_location="Elemental", bool_rotate_to_global=False +) + +euler_angles_field = ele_orientation_op.outputs.fields_container()[0] +for eid in element_ids: + V = Rotation.from_euler( + seq="ZXY", angles=euler_angles_field.get_entity_data_by_id(eid)[0], degrees=True + ).as_matrix() + d1 = a11.get_entity_data_by_id(eid)[0] + d2 = a22.get_entity_data_by_id(eid)[0] + D = np.diag([d1, d2, max(1.0 - d1 - d2, 0.0)]) + aRot = np.matmul(np.matmul(V, D), V.transpose()) + fiber_orientation_tensor.append( + [aRot[0, 0], aRot[1, 1], aRot[2, 2], aRot[0, 1], aRot[1, 2], aRot[0, 2]], eid + ) + +fiber_orientation_tensor_fc = dpf.operators.utility.field_to_fc( + field=fiber_orientation_tensor +).outputs.fields_container() + +# %% +# Plot results +# ~~~~~~~~~~~~~~~~~~~~~~~~ +# Plot some components of the fiber orientation tensor. + +aXX = fiber_orientation_tensor_fc.select_component(0)[0] +aYY = fiber_orientation_tensor_fc.select_component(1)[0] +aXZ = fiber_orientation_tensor_fc.select_component(5)[0] + +mesh.plot(aXX, title="Axx", text="Axx plot") +mesh.plot(aYY, title="Ayy", text="Ayy plot") +mesh.plot(aXZ, title="Axz", text="Axz plot") diff --git a/examples/dpf_composite_failure_workflow.py b/examples/dpf_composite_failure_workflow.py index 01d797823..ab344b707 100644 --- a/examples/dpf_composite_failure_workflow.py +++ b/examples/dpf_composite_failure_workflow.py @@ -19,7 +19,7 @@ """ -#%% +# %% # Set up analysis # ~~~~~~~~~~~~~~~ # Setting up the analysis consists of loading Ansys libraries, configuring @@ -44,7 +44,7 @@ ) from ansys.dpf.composites.server_helpers import connect_to_or_start_server -#%% +# %% # Configure the combined failure criterion. combined_fc = CombinedFailureCriterion( name="My Failure Criteria", diff --git a/minimum_requirements.txt b/minimum_requirements.txt index 23977f386..feb659833 100644 --- a/minimum_requirements.txt +++ b/minimum_requirements.txt @@ -1,4 +1,5 @@ # Contains minimum requirements that we support -numpy == 1.19.0 +numpy == 1.22.0 matplotlib == 3.5.0 -ansys-dpf-core == 0.7.3 \ No newline at end of file +ansys-dpf-core == 0.7.3 +pyvista == 0.36.1 diff --git a/poetry.lock b/poetry.lock index 797a77903..4b9540cc5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.4.0 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. [[package]] name = "accessible-pygments" @@ -29,14 +29,14 @@ files = [ [[package]] name = "ansys-dpf-core" -version = "0.8.0" +version = "0.8.1" description = "Data Processing Framework - Python Core" category = "main" optional = false python-versions = ">=3.7, <4" files = [ - {file = "ansys-dpf-core-0.8.0.tar.gz", hash = "sha256:324aea06034f577c3417d95fe45ba7f9a4eb02927d6ff349159fd3315210a2d1"}, - {file = "ansys_dpf_core-0.8.0-py3-none-any.whl", hash = "sha256:560460a360d27b595513611291eadb4bbb7addf2738586cd5d1f3a1262e403c9"}, + {file = "ansys-dpf-core-0.8.1.tar.gz", hash = "sha256:7e7d8a8459b7ee141bf09a2dc14551deb96dfe45427b73783da2c44987385593"}, + {file = "ansys_dpf_core-0.8.1-py3-none-any.whl", hash = "sha256:74c93a1232c799786c4fb2d078b1204ff78496549751da2d7d791046995a38f8"}, ] [package.dependencies] @@ -97,74 +97,44 @@ grpcio = "*" [[package]] name = "ansys-sphinx-theme" -version = "0.9.6" +version = "0.9.9" description = "A theme devised by ANSYS, Inc. for Sphinx documentation." category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "ansys-sphinx-theme-0.9.6.tar.gz", hash = "sha256:9154236b18c113ed0ff1c9644d009089fa696f816a375b6a394cd2a1dee23f81"}, - {file = "ansys_sphinx_theme-0.9.6-py3-none-any.whl", hash = "sha256:57e43a6560de75bd101b465823bec80a3c20f427b118809186233a255483735f"}, + {file = "ansys-sphinx-theme-0.9.9.tar.gz", hash = "sha256:1813e8d3d8d665512440911db91359dc850af6f359857aff6b80cb80a09b2f0c"}, + {file = "ansys_sphinx_theme-0.9.9-py3-none-any.whl", hash = "sha256:dd2f0344cc0aeda361a95ec4750eb29cb8c782eeb7701f0c34ea64d14660b315"}, ] [package.dependencies] Jinja2 = ">=3.1.2" pydata-sphinx-theme = "0.13.3" -Sphinx = ">=4.2.0,<6" +Sphinx = ">=4.2.0" [package.extras] -doc = ["Sphinx (==5.3.0)", "bs4 (==0.0.1)", "html5lib (==1.1)", "numpydoc (==1.5.0)", "requests (==2.28.2)", "sphinx-copybutton (==0.5.1)", "sphinx-design (==0.3.0)", "sphinx-jinja (==2.0.2)", "sphinx-notfound-page (==0.8.3)"] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] +doc = ["Sphinx (==6.1.3)", "bs4 (==0.0.1)", "html5lib (==1.1)", "numpydoc (==1.5.0)", "requests (==2.28.2)", "sphinx-copybutton (==0.5.2)", "sphinx-design (==0.4.1)", "sphinx-jinja (==2.0.2)", "sphinx-notfound-page (==0.8.3)"] [[package]] name = "astroid" -version = "2.11.7" +version = "2.15.5" description = "An abstract syntax tree for Python with inference support." category = "main" optional = true -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" files = [ - {file = "astroid-2.11.7-py3-none-any.whl", hash = "sha256:86b0a340a512c65abf4368b80252754cda17c02cdbbd3f587dddf98112233e7b"}, - {file = "astroid-2.11.7.tar.gz", hash = "sha256:bb24615c77f4837c707669d16907331374ae8a964650a66999da3f5ca68dc946"}, + {file = "astroid-2.15.5-py3-none-any.whl", hash = "sha256:078e5212f9885fa85fbb0cf0101978a336190aadea6e13305409d099f71b2324"}, + {file = "astroid-2.15.5.tar.gz", hash = "sha256:1039262575027b441137ab4a62a793a9b43defb42c32d5670f38686207cd780f"}, ] [package.dependencies] lazy-object-proxy = ">=1.4.0" -setuptools = ">=20.0" -typed-ast = {version = ">=1.4.0,<2.0", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -typing-extensions = {version = ">=3.10", markers = "python_version < \"3.10\""} -wrapt = ">=1.11,<2" - -[[package]] -name = "attrs" -version = "22.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = true -python-versions = ">=3.6" -files = [ - {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"}, - {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"}, +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, ] -[package.extras] -cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"] -tests = ["attrs[tests-no-zope]", "zope.interface"] -tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"] - [[package]] name = "babel" version = "2.12.1" @@ -182,14 +152,14 @@ pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "beautifulsoup4" -version = "4.12.0" +version = "4.12.2" description = "Screen-scraping library" category = "main" optional = true python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.0-py3-none-any.whl", hash = "sha256:2130a5ad7f513200fae61a17abb5e338ca980fa28c439c0571014bc0217e9591"}, - {file = "beautifulsoup4-4.12.0.tar.gz", hash = "sha256:c5fceeaec29d09c84970e47c65f2f0efe57872f7cff494c9691a26ec0ff13234"}, + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, ] [package.dependencies] @@ -232,7 +202,6 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "os_name == \"nt\""} -importlib-metadata = {version = ">=0.22", markers = "python_version < \"3.8\""} packaging = ">=19.0" pep517 = ">=0.9.1" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} @@ -257,14 +226,14 @@ files = [ [[package]] name = "certifi" -version = "2022.12.7" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"}, - {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"}, + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] [[package]] @@ -453,65 +422,140 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "contourpy" +version = "1.0.7" +description = "Python library for calculating contours of 2D quadrilateral grids" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:95c3acddf921944f241b6773b767f1cbce71d03307270e2d769fd584d5d1092d"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc1464c97579da9f3ab16763c32e5c5d5bb5fa1ec7ce509a4ca6108b61b84fab"}, + {file = "contourpy-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8acf74b5d383414401926c1598ed77825cd530ac7b463ebc2e4f46638f56cce6"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c71fdd8f1c0f84ffd58fca37d00ca4ebaa9e502fb49825484da075ac0b0b803"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99e9486bf1bb979d95d5cffed40689cb595abb2b841f2991fc894b3452290e8"}, + {file = "contourpy-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f4d8941a9564cda3f7fa6a6cd9b32ec575830780677932abdec7bcb61717b0"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9e20e5a1908e18aaa60d9077a6d8753090e3f85ca25da6e25d30dc0a9e84c2c6"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a877ada905f7d69b2a31796c4b66e31a8068b37aa9b78832d41c82fc3e056ddd"}, + {file = "contourpy-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6381fa66866b0ea35e15d197fc06ac3840a9b2643a6475c8fff267db8b9f1e69"}, + {file = "contourpy-1.0.7-cp310-cp310-win32.whl", hash = "sha256:3c184ad2433635f216645fdf0493011a4667e8d46b34082f5a3de702b6ec42e3"}, + {file = "contourpy-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:3caea6365b13119626ee996711ab63e0c9d7496f65641f4459c60a009a1f3e80"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed33433fc3820263a6368e532f19ddb4c5990855e4886088ad84fd7c4e561c71"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:38e2e577f0f092b8e6774459317c05a69935a1755ecfb621c0a98f0e3c09c9a5"}, + {file = "contourpy-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae90d5a8590e5310c32a7630b4b8618cef7563cebf649011da80874d0aa8f414"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:130230b7e49825c98edf0b428b7aa1125503d91732735ef897786fe5452b1ec2"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58569c491e7f7e874f11519ef46737cea1d6eda1b514e4eb5ac7dab6aa864d02"}, + {file = "contourpy-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54d43960d809c4c12508a60b66cb936e7ed57d51fb5e30b513934a4a23874fae"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:152fd8f730c31fd67fe0ffebe1df38ab6a669403da93df218801a893645c6ccc"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9056c5310eb1daa33fc234ef39ebfb8c8e2533f088bbf0bc7350f70a29bde1ac"}, + {file = "contourpy-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a9d7587d2fdc820cc9177139b56795c39fb8560f540bba9ceea215f1f66e1566"}, + {file = "contourpy-1.0.7-cp311-cp311-win32.whl", hash = "sha256:4ee3ee247f795a69e53cd91d927146fb16c4e803c7ac86c84104940c7d2cabf0"}, + {file = "contourpy-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:5caeacc68642e5f19d707471890f037a13007feba8427eb7f2a60811a1fc1350"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd7dc0e6812b799a34f6d12fcb1000539098c249c8da54f3566c6a6461d0dbad"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0f9d350b639db6c2c233d92c7f213d94d2e444d8e8fc5ca44c9706cf72193772"}, + {file = "contourpy-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e96a08b62bb8de960d3a6afbc5ed8421bf1a2d9c85cc4ea73f4bc81b4910500f"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:031154ed61f7328ad7f97662e48660a150ef84ee1bc8876b6472af88bf5a9b98"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e9ebb4425fc1b658e13bace354c48a933b842d53c458f02c86f371cecbedecc"}, + {file = "contourpy-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efb8f6d08ca7998cf59eaf50c9d60717f29a1a0a09caa46460d33b2924839dbd"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6c180d89a28787e4b73b07e9b0e2dac7741261dbdca95f2b489c4f8f887dd810"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b8d587cc39057d0afd4166083d289bdeff221ac6d3ee5046aef2d480dc4b503c"}, + {file = "contourpy-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:769eef00437edf115e24d87f8926955f00f7704bede656ce605097584f9966dc"}, + {file = "contourpy-1.0.7-cp38-cp38-win32.whl", hash = "sha256:62398c80ef57589bdbe1eb8537127321c1abcfdf8c5f14f479dbbe27d0322e66"}, + {file = "contourpy-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:57119b0116e3f408acbdccf9eb6ef19d7fe7baf0d1e9aaa5381489bc1aa56556"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30676ca45084ee61e9c3da589042c24a57592e375d4b138bd84d8709893a1ba4"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e927b3868bd1e12acee7cc8f3747d815b4ab3e445a28d2e5373a7f4a6e76ba1"}, + {file = "contourpy-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:366a0cf0fc079af5204801786ad7a1c007714ee3909e364dbac1729f5b0849e5"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89ba9bb365446a22411f0673abf6ee1fea3b2cf47b37533b970904880ceb72f3"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:71b0bf0c30d432278793d2141362ac853859e87de0a7dee24a1cea35231f0d50"}, + {file = "contourpy-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7281244c99fd7c6f27c1c6bfafba878517b0b62925a09b586d88ce750a016d2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b6d0f9e1d39dbfb3977f9dd79f156c86eb03e57a7face96f199e02b18e58d32a"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7f6979d20ee5693a1057ab53e043adffa1e7418d734c1532e2d9e915b08d8ec2"}, + {file = "contourpy-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5dd34c1ae752515318224cba7fc62b53130c45ac6a1040c8b7c1a223c46e8967"}, + {file = "contourpy-1.0.7-cp39-cp39-win32.whl", hash = "sha256:c5210e5d5117e9aec8c47d9156d1d3835570dd909a899171b9535cb4a3f32693"}, + {file = "contourpy-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:60835badb5ed5f4e194a6f21c09283dd6e007664a86101431bf870d9e86266c4"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ce41676b3d0dd16dbcfabcc1dc46090aaf4688fd6e819ef343dbda5a57ef0161"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a011cf354107b47c58ea932d13b04d93c6d1d69b8b6dce885e642531f847566"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31a55dccc8426e71817e3fe09b37d6d48ae40aae4ecbc8c7ad59d6893569c436"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:69f8ff4db108815addd900a74df665e135dbbd6547a8a69333a68e1f6e368ac2"}, + {file = "contourpy-1.0.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:efe99298ba37e37787f6a2ea868265465410822f7bea163edcc1bd3903354ea9"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a1e97b86f73715e8670ef45292d7cc033548266f07d54e2183ecb3c87598888f"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc331c13902d0f50845099434cd936d49d7a2ca76cb654b39691974cb1e4812d"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24847601071f740837aefb730e01bd169fbcaa610209779a78db7ebb6e6a7051"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abf298af1e7ad44eeb93501e40eb5a67abbf93b5d90e468d01fc0c4451971afa"}, + {file = "contourpy-1.0.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:64757f6460fc55d7e16ed4f1de193f362104285c667c112b50a804d482777edd"}, + {file = "contourpy-1.0.7.tar.gz", hash = "sha256:d8165a088d31798b59e91117d1f5fc3df8168d8b48c4acc10fc0df0d0bdbcc5e"}, +] + +[package.dependencies] +numpy = ">=1.16" + +[package.extras] +bokeh = ["bokeh", "chromedriver", "selenium"] +docs = ["furo", "sphinx-copybutton"] +mypy = ["contourpy[bokeh]", "docutils-stubs", "mypy (==0.991)", "types-Pillow"] +test = ["Pillow", "matplotlib", "pytest"] +test-no-images = ["pytest"] + [[package]] name = "coverage" -version = "7.2.2" +version = "7.2.5" description = "Code coverage measurement for Python" category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "coverage-7.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c90e73bdecb7b0d1cea65a08cb41e9d672ac6d7995603d6465ed4914b98b9ad7"}, - {file = "coverage-7.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2926b8abedf750c2ecf5035c07515770944acf02e1c46ab08f6348d24c5f94d"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57b77b9099f172804e695a40ebaa374f79e4fb8b92f3e167f66facbf92e8e7f5"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:efe1c0adad110bf0ad7fb59f833880e489a61e39d699d37249bdf42f80590169"}, - {file = "coverage-7.2.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2199988e0bc8325d941b209f4fd1c6fa007024b1442c5576f1a32ca2e48941e6"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:81f63e0fb74effd5be736cfe07d710307cc0a3ccb8f4741f7f053c057615a137"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:186e0fc9cf497365036d51d4d2ab76113fb74f729bd25da0975daab2e107fd90"}, - {file = "coverage-7.2.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:420f94a35e3e00a2b43ad5740f935358e24478354ce41c99407cddd283be00d2"}, - {file = "coverage-7.2.2-cp310-cp310-win32.whl", hash = "sha256:38004671848b5745bb05d4d621526fca30cee164db42a1f185615f39dc997292"}, - {file = "coverage-7.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:0ce383d5f56d0729d2dd40e53fe3afeb8f2237244b0975e1427bfb2cf0d32bab"}, - {file = "coverage-7.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3eb55b7b26389dd4f8ae911ba9bc8c027411163839dea4c8b8be54c4ee9ae10b"}, - {file = "coverage-7.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d2b96123a453a2d7f3995ddb9f28d01fd112319a7a4d5ca99796a7ff43f02af5"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:299bc75cb2a41e6741b5e470b8c9fb78d931edbd0cd009c58e5c84de57c06731"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e1df45c23d4230e3d56d04414f9057eba501f78db60d4eeecfcb940501b08fd"}, - {file = "coverage-7.2.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:006ed5582e9cbc8115d2e22d6d2144a0725db542f654d9d4fda86793832f873d"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d683d230b5774816e7d784d7ed8444f2a40e7a450e5720d58af593cb0b94a212"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8efb48fa743d1c1a65ee8787b5b552681610f06c40a40b7ef94a5b517d885c54"}, - {file = "coverage-7.2.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c752d5264053a7cf2fe81c9e14f8a4fb261370a7bb344c2a011836a96fb3f57"}, - {file = "coverage-7.2.2-cp311-cp311-win32.whl", hash = "sha256:55272f33da9a5d7cccd3774aeca7a01e500a614eaea2a77091e9be000ecd401d"}, - {file = "coverage-7.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:92ebc1619650409da324d001b3a36f14f63644c7f0a588e331f3b0f67491f512"}, - {file = "coverage-7.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5afdad4cc4cc199fdf3e18088812edcf8f4c5a3c8e6cb69127513ad4cb7471a9"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0484d9dd1e6f481b24070c87561c8d7151bdd8b044c93ac99faafd01f695c78e"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d530191aa9c66ab4f190be8ac8cc7cfd8f4f3217da379606f3dd4e3d83feba69"}, - {file = "coverage-7.2.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac0f522c3b6109c4b764ffec71bf04ebc0523e926ca7cbe6c5ac88f84faced0"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ba279aae162b20444881fc3ed4e4f934c1cf8620f3dab3b531480cf602c76b7f"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:53d0fd4c17175aded9c633e319360d41a1f3c6e352ba94edcb0fa5167e2bad67"}, - {file = "coverage-7.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c99cb7c26a3039a8a4ee3ca1efdde471e61b4837108847fb7d5be7789ed8fd9"}, - {file = "coverage-7.2.2-cp37-cp37m-win32.whl", hash = "sha256:5cc0783844c84af2522e3a99b9b761a979a3ef10fb87fc4048d1ee174e18a7d8"}, - {file = "coverage-7.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:817295f06eacdc8623dc4df7d8b49cea65925030d4e1e2a7c7218380c0072c25"}, - {file = "coverage-7.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6146910231ece63facfc5984234ad1b06a36cecc9fd0c028e59ac7c9b18c38c6"}, - {file = "coverage-7.2.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:387fb46cb8e53ba7304d80aadca5dca84a2fbf6fe3faf6951d8cf2d46485d1e5"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:046936ab032a2810dcaafd39cc4ef6dd295df1a7cbead08fe996d4765fca9fe4"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e627dee428a176ffb13697a2c4318d3f60b2ccdde3acdc9b3f304206ec130ccd"}, - {file = "coverage-7.2.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fa54fb483decc45f94011898727802309a109d89446a3c76387d016057d2c84"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3668291b50b69a0c1ef9f462c7df2c235da3c4073f49543b01e7eb1dee7dd540"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7c20b731211261dc9739bbe080c579a1835b0c2d9b274e5fcd903c3a7821cf88"}, - {file = "coverage-7.2.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5764e1f7471cb8f64b8cda0554f3d4c4085ae4b417bfeab236799863703e5de2"}, - {file = "coverage-7.2.2-cp38-cp38-win32.whl", hash = "sha256:4f01911c010122f49a3e9bdc730eccc66f9b72bd410a3a9d3cb8448bb50d65d3"}, - {file = "coverage-7.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:c448b5c9e3df5448a362208b8d4b9ed85305528313fca1b479f14f9fe0d873b8"}, - {file = "coverage-7.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfe7085783cda55e53510482fa7b5efc761fad1abe4d653b32710eb548ebdd2d"}, - {file = "coverage-7.2.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9d22e94e6dc86de981b1b684b342bec5e331401599ce652900ec59db52940005"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:507e4720791977934bba016101579b8c500fb21c5fa3cd4cf256477331ddd988"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4803779f0e4b06a2361f666e76f5c2e3715e8e379889d02251ec911befd149"}, - {file = "coverage-7.2.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db8c2c5ace167fd25ab5dd732714c51d4633f58bac21fb0ff63b0349f62755a8"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f68ee32d7c4164f1e2c8797535a6d0a3733355f5861e0f667e37df2d4b07140"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d52f0a114b6a58305b11a5cdecd42b2e7f1ec77eb20e2b33969d702feafdd016"}, - {file = "coverage-7.2.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:797aad79e7b6182cb49c08cc5d2f7aa7b2128133b0926060d0a8889ac43843be"}, - {file = "coverage-7.2.2-cp39-cp39-win32.whl", hash = "sha256:db45eec1dfccdadb179b0f9ca616872c6f700d23945ecc8f21bb105d74b1c5fc"}, - {file = "coverage-7.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:8dbe2647bf58d2c5a6c5bcc685f23b5f371909a5624e9f5cd51436d6a9f6c6ef"}, - {file = "coverage-7.2.2-pp37.pp38.pp39-none-any.whl", hash = "sha256:872d6ce1f5be73f05bea4df498c140b9e7ee5418bfa2cc8204e7f9b817caa968"}, - {file = "coverage-7.2.2.tar.gz", hash = "sha256:36dd42da34fe94ed98c39887b86db9d06777b1c8f860520e21126a75507024f2"}, + {file = "coverage-7.2.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:883123d0bbe1c136f76b56276074b0c79b5817dd4238097ffa64ac67257f4b6c"}, + {file = "coverage-7.2.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2fbc2a127e857d2f8898aaabcc34c37771bf78a4d5e17d3e1f5c30cd0cbc62a"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f3671662dc4b422b15776cdca89c041a6349b4864a43aa2350b6b0b03bbcc7f"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780551e47d62095e088f251f5db428473c26db7829884323e56d9c0c3118791a"}, + {file = "coverage-7.2.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:066b44897c493e0dcbc9e6a6d9f8bbb6607ef82367cf6810d387c09f0cd4fe9a"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9a4ee55174b04f6af539218f9f8083140f61a46eabcaa4234f3c2a452c4ed11"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:706ec567267c96717ab9363904d846ec009a48d5f832140b6ad08aad3791b1f5"}, + {file = "coverage-7.2.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ae453f655640157d76209f42c62c64c4d4f2c7f97256d3567e3b439bd5c9b06c"}, + {file = "coverage-7.2.5-cp310-cp310-win32.whl", hash = "sha256:f81c9b4bd8aa747d417407a7f6f0b1469a43b36a85748145e144ac4e8d303cb5"}, + {file = "coverage-7.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:dc945064a8783b86fcce9a0a705abd7db2117d95e340df8a4333f00be5efb64c"}, + {file = "coverage-7.2.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:40cc0f91c6cde033da493227797be2826cbf8f388eaa36a0271a97a332bfd7ce"}, + {file = "coverage-7.2.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a66e055254a26c82aead7ff420d9fa8dc2da10c82679ea850d8feebf11074d88"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c10fbc8a64aa0f3ed136b0b086b6b577bc64d67d5581acd7cc129af52654384e"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a22cbb5ede6fade0482111fa7f01115ff04039795d7092ed0db43522431b4f2"}, + {file = "coverage-7.2.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:292300f76440651529b8ceec283a9370532f4ecba9ad67d120617021bb5ef139"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7ff8f3fb38233035028dbc93715551d81eadc110199e14bbbfa01c5c4a43f8d8"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a08c7401d0b24e8c2982f4e307124b671c6736d40d1c39e09d7a8687bddf83ed"}, + {file = "coverage-7.2.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef9659d1cda9ce9ac9585c045aaa1e59223b143f2407db0eaee0b61a4f266fb6"}, + {file = "coverage-7.2.5-cp311-cp311-win32.whl", hash = "sha256:30dcaf05adfa69c2a7b9f7dfd9f60bc8e36b282d7ed25c308ef9e114de7fc23b"}, + {file = "coverage-7.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:97072cc90f1009386c8a5b7de9d4fc1a9f91ba5ef2146c55c1f005e7b5c5e068"}, + {file = "coverage-7.2.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bebea5f5ed41f618797ce3ffb4606c64a5de92e9c3f26d26c2e0aae292f015c1"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828189fcdda99aae0d6bf718ea766b2e715eabc1868670a0a07bf8404bf58c33"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e8a95f243d01ba572341c52f89f3acb98a3b6d1d5d830efba86033dd3687ade"}, + {file = "coverage-7.2.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8834e5f17d89e05697c3c043d3e58a8b19682bf365048837383abfe39adaed5"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d1f25ee9de21a39b3a8516f2c5feb8de248f17da7eead089c2e04aa097936b47"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1637253b11a18f453e34013c665d8bf15904c9e3c44fbda34c643fbdc9d452cd"}, + {file = "coverage-7.2.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8e575a59315a91ccd00c7757127f6b2488c2f914096077c745c2f1ba5b8c0969"}, + {file = "coverage-7.2.5-cp37-cp37m-win32.whl", hash = "sha256:509ecd8334c380000d259dc66feb191dd0a93b21f2453faa75f7f9cdcefc0718"}, + {file = "coverage-7.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:12580845917b1e59f8a1c2ffa6af6d0908cb39220f3019e36c110c943dc875b0"}, + {file = "coverage-7.2.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5016e331b75310610c2cf955d9f58a9749943ed5f7b8cfc0bb89c6134ab0a84"}, + {file = "coverage-7.2.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:373ea34dca98f2fdb3e5cb33d83b6d801007a8074f992b80311fc589d3e6b790"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a063aad9f7b4c9f9da7b2550eae0a582ffc7623dca1c925e50c3fbde7a579771"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38c0a497a000d50491055805313ed83ddba069353d102ece8aef5d11b5faf045"}, + {file = "coverage-7.2.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2b3b05e22a77bb0ae1a3125126a4e08535961c946b62f30985535ed40e26614"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0342a28617e63ad15d96dca0f7ae9479a37b7d8a295f749c14f3436ea59fdcb3"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf97ed82ca986e5c637ea286ba2793c85325b30f869bf64d3009ccc1a31ae3fd"}, + {file = "coverage-7.2.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c2c41c1b1866b670573657d584de413df701f482574bad7e28214a2362cb1fd1"}, + {file = "coverage-7.2.5-cp38-cp38-win32.whl", hash = "sha256:10b15394c13544fce02382360cab54e51a9e0fd1bd61ae9ce012c0d1e103c813"}, + {file = "coverage-7.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:a0b273fe6dc655b110e8dc89b8ec7f1a778d78c9fd9b4bda7c384c8906072212"}, + {file = "coverage-7.2.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c587f52c81211d4530fa6857884d37f514bcf9453bdeee0ff93eaaf906a5c1b"}, + {file = "coverage-7.2.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4436cc9ba5414c2c998eaedee5343f49c02ca93b21769c5fdfa4f9d799e84200"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6599bf92f33ab041e36e06d25890afbdf12078aacfe1f1d08c713906e49a3fe5"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:857abe2fa6a4973f8663e039ead8d22215d31db613ace76e4a98f52ec919068e"}, + {file = "coverage-7.2.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6f5cab2d7f0c12f8187a376cc6582c477d2df91d63f75341307fcdcb5d60303"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa387bd7489f3e1787ff82068b295bcaafbf6f79c3dad3cbc82ef88ce3f48ad3"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:156192e5fd3dbbcb11cd777cc469cf010a294f4c736a2b2c891c77618cb1379a"}, + {file = "coverage-7.2.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd3b4b8175c1db502adf209d06136c000df4d245105c8839e9d0be71c94aefe1"}, + {file = "coverage-7.2.5-cp39-cp39-win32.whl", hash = "sha256:ddc5a54edb653e9e215f75de377354e2455376f416c4378e1d43b08ec50acc31"}, + {file = "coverage-7.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:338aa9d9883aaaad53695cb14ccdeb36d4060485bb9388446330bef9c361c252"}, + {file = "coverage-7.2.5-pp37.pp38.pp39-none-any.whl", hash = "sha256:8877d9b437b35a85c18e3c6499b23674684bf690f5d96c1006a1ef61f9fdf0f3"}, + {file = "coverage-7.2.5.tar.gz", hash = "sha256:f99ef080288f09ffc687423b8d60978cf3a465d3f404a18d1a05474bd8575a47"}, ] [package.dependencies] @@ -522,31 +566,31 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "40.0.1" +version = "40.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = true python-versions = ">=3.6" files = [ - {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:918cb89086c7d98b1b86b9fdb70c712e5a9325ba6f7d7cfb509e784e0cfc6917"}, - {file = "cryptography-40.0.1-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:9618a87212cb5200500e304e43691111570e1f10ec3f35569fdfcd17e28fd797"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4805a4ca729d65570a1b7cac84eac1e431085d40387b7d3bbaa47e39890b88"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63dac2d25c47f12a7b8aa60e528bfb3c51c5a6c5a9f7c86987909c6c79765554"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0a4e3406cfed6b1f6d6e87ed243363652b2586b2d917b0609ca4f97072994405"}, - {file = "cryptography-40.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1e0af458515d5e4028aad75f3bb3fe7a31e46ad920648cd59b64d3da842e4356"}, - {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d8aa3609d337ad85e4eb9bb0f8bcf6e4409bfb86e706efa9a027912169e89122"}, - {file = "cryptography-40.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:cf91e428c51ef692b82ce786583e214f58392399cf65c341bc7301d096fa3ba2"}, - {file = "cryptography-40.0.1-cp36-abi3-win32.whl", hash = "sha256:650883cc064297ef3676b1db1b7b1df6081794c4ada96fa457253c4cc40f97db"}, - {file = "cryptography-40.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:a805a7bce4a77d51696410005b3e85ae2839bad9aa38894afc0aa99d8e0c3160"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd033d74067d8928ef00a6b1327c8ea0452523967ca4463666eeba65ca350d4c"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d36bbeb99704aabefdca5aee4eba04455d7a27ceabd16f3b3ba9bdcc31da86c4"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:32057d3d0ab7d4453778367ca43e99ddb711770477c4f072a51b3ca69602780a"}, - {file = "cryptography-40.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:f5d7b79fa56bc29580faafc2ff736ce05ba31feaa9d4735048b0de7d9ceb2b94"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7c872413353c70e0263a9368c4993710070e70ab3e5318d85510cc91cce77e7c"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:28d63d75bf7ae4045b10de5413fb1d6338616e79015999ad9cf6fc538f772d41"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6f2bbd72f717ce33100e6467572abaedc61f1acb87b8d546001328d7f466b778"}, - {file = "cryptography-40.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cc3a621076d824d75ab1e1e530e66e7e8564e357dd723f2533225d40fe35c60c"}, - {file = "cryptography-40.0.1.tar.gz", hash = "sha256:2803f2f8b1e95f614419926c7e6f55d828afc614ca5ed61543877ae668cc3472"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:8f79b5ff5ad9d3218afb1e7e20ea74da5f76943ee5edb7f76e56ec5161ec782b"}, + {file = "cryptography-40.0.2-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:05dc219433b14046c476f6f09d7636b92a1c3e5808b9a6536adf4932b3b2c440"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4df2af28d7bedc84fe45bd49bc35d710aede676e2a4cb7fc6d103a2adc8afe4d"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dcca15d3a19a66e63662dc8d30f8036b07be851a8680eda92d079868f106288"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a04386fb7bc85fab9cd51b6308633a3c271e3d0d3eae917eebab2fac6219b6d2"}, + {file = "cryptography-40.0.2-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:adc0d980fd2760c9e5de537c28935cc32b9353baaf28e0814df417619c6c8c3b"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d5a1bd0e9e2031465761dfa920c16b0065ad77321d8a8c1f5ee331021fda65e9"}, + {file = "cryptography-40.0.2-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:a95f4802d49faa6a674242e25bfeea6fc2acd915b5e5e29ac90a32b1139cae1c"}, + {file = "cryptography-40.0.2-cp36-abi3-win32.whl", hash = "sha256:aecbb1592b0188e030cb01f82d12556cf72e218280f621deed7d806afd2113f9"}, + {file = "cryptography-40.0.2-cp36-abi3-win_amd64.whl", hash = "sha256:b12794f01d4cacfbd3177b9042198f3af1c856eedd0a98f10f141385c809a14b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:142bae539ef28a1c76794cca7f49729e7c54423f615cfd9b0b1fa90ebe53244b"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:956ba8701b4ffe91ba59665ed170a2ebbdc6fc0e40de5f6059195d9f2b33ca0e"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4f01c9863da784558165f5d4d916093737a75203a5c5286fde60e503e4276c7a"}, + {file = "cryptography-40.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3daf9b114213f8ba460b829a02896789751626a2a4e7a43a28ee77c04b5e4958"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:48f388d0d153350f378c7f7b41497a54ff1513c816bcbbcafe5b829e59b9ce5b"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c0764e72b36a3dc065c155e5b22f93df465da9c39af65516fe04ed3c68c92636"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:cbaba590180cba88cb99a5f76f90808a624f18b169b90a4abb40c1fd8c19420e"}, + {file = "cryptography-40.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7a38250f433cd41df7fcb763caa3ee9362777fdb4dc642b9a349721d2bf47404"}, + {file = "cryptography-40.0.2.tar.gz", hash = "sha256:c33c0d32b8594fa647d2e01dbccc303478e16fdd7cf98652d5b3ed11aa5e5c99"}, ] [package.dependencies] @@ -630,34 +674,34 @@ test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.10.7" +version = "3.12.0" description = "A platform independent file lock." category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "filelock-3.10.7-py3-none-any.whl", hash = "sha256:bde48477b15fde2c7e5a0713cbe72721cb5a5ad32ee0b8f419907960b9d75536"}, - {file = "filelock-3.10.7.tar.gz", hash = "sha256:892be14aa8efc01673b5ed6589dbccb95f9a8596f0507e232626155495c18105"}, + {file = "filelock-3.12.0-py3-none-any.whl", hash = "sha256:ad98852315c2ab702aeb628412cbf7e95b7ce8c3bf9565670b4eaecf1db370a9"}, + {file = "filelock-3.12.0.tar.gz", hash = "sha256:fc03ae43288c013d2ea83c8597001b1129db351aad9c57fe2409327916b8e718"}, ] [package.extras] -docs = ["furo (>=2022.12.7)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.2)", "diff-cover (>=7.5)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "fonttools" -version = "4.38.0" +version = "4.39.4" description = "Tools to manipulate font files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fonttools-4.38.0-py3-none-any.whl", hash = "sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"}, - {file = "fonttools-4.38.0.zip", hash = "sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1"}, + {file = "fonttools-4.39.4-py3-none-any.whl", hash = "sha256:106caf6167c4597556b31a8d9175a3fdc0356fdcd70ab19973c3b0d4c893c461"}, + {file = "fonttools-4.39.4.zip", hash = "sha256:dba8d7cdb8e2bac1b3da28c5ed5960de09e59a2fe7e63bb73f5a59e57b0430d2"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=14.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres", "scipy"] lxml = ["lxml (>=4.0,<5)"] @@ -667,7 +711,7 @@ repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=14.0.0)"] +unicode = ["unicodedata2 (>=15.0.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] @@ -695,14 +739,14 @@ grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0dev)"] [[package]] name = "google-api-python-client" -version = "2.83.0" +version = "2.86.0" description = "Google API Client Library for Python" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "google-api-python-client-2.83.0.tar.gz", hash = "sha256:d07509f1b2d2b2427363b454db996f7a15e1751a48cfcaf28427050560dd51cf"}, - {file = "google_api_python_client-2.83.0-py2.py3-none-any.whl", hash = "sha256:afa7fe2a5d77e8f136cdb8f40a120dd6660c2292f791c1b22734dfe786bd1dac"}, + {file = "google-api-python-client-2.86.0.tar.gz", hash = "sha256:3ca4e93821f4e9ac29b91ab0d9df168b42c8ad0fb8bff65b8c2ccb2d462b0464"}, + {file = "google_api_python_client-2.86.0-py2.py3-none-any.whl", hash = "sha256:0f320190ab9d5bd2fdb0cb894e8e53bb5e17d4888ee8dc4d26ba65ce378409e2"}, ] [package.dependencies] @@ -714,14 +758,14 @@ uritemplate = ">=3.0.1,<5" [[package]] name = "google-auth" -version = "2.17.1" +version = "2.17.3" description = "Google Authentication Library" category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" files = [ - {file = "google-auth-2.17.1.tar.gz", hash = "sha256:8f379b46bad381ad2a0b989dfb0c13ad28d3c2a79f27348213f8946a1d15d55a"}, - {file = "google_auth-2.17.1-py2.py3-none-any.whl", hash = "sha256:357ff22a75b4c0f6093470f21816a825d2adee398177569824e37b6c10069e19"}, + {file = "google-auth-2.17.3.tar.gz", hash = "sha256:ce311e2bc58b130fddf316df57c9b3943c2a7b4f6ec31de9663a9333e4064efc"}, + {file = "google_auth-2.17.3-py2.py3-none-any.whl", hash = "sha256:f586b274d3eb7bd932ea424b1c702a30e0393a2e2bc4ca3eae8263ffd8be229f"}, ] [package.dependencies] @@ -774,61 +818,61 @@ grpc = ["grpcio (>=1.44.0,<2.0.0dev)"] [[package]] name = "grpcio" -version = "1.53.0" +version = "1.54.2" description = "HTTP/2-based RPC framework" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.53.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:752d2949b40e12e6ad3ed8cc552a65b54d226504f6b1fb67cab2ccee502cc06f"}, - {file = "grpcio-1.53.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:8a48fd3a7222be226bb86b7b413ad248f17f3101a524018cdc4562eeae1eb2a3"}, - {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:f3e837d29f0e1b9d6e7b29d569e2e9b0da61889e41879832ea15569c251c303a"}, - {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aef7d30242409c3aa5839b501e877e453a2c8d3759ca8230dd5a21cda029f046"}, - {file = "grpcio-1.53.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f90698b5d1c5dd7b3236cd1fa959d7b80e17923f918d5be020b65f1c78b173"}, - {file = "grpcio-1.53.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a96c3c7f564b263c5d7c0e49a337166c8611e89c4c919f66dba7b9a84abad137"}, - {file = "grpcio-1.53.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ee81349411648d1abc94095c68cd25e3c2812e4e0367f9a9355be1e804a5135c"}, - {file = "grpcio-1.53.0-cp310-cp310-win32.whl", hash = "sha256:fdc6191587de410a184550d4143e2b24a14df495c86ca15e59508710681690ac"}, - {file = "grpcio-1.53.0-cp310-cp310-win_amd64.whl", hash = "sha256:658ffe1e39171be00490db5bd3b966f79634ac4215a1eb9a85c6cd6783bf7f6e"}, - {file = "grpcio-1.53.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:1b172e6d497191940c4b8d75b53de82dc252e15b61de2951d577ec5b43316b29"}, - {file = "grpcio-1.53.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:82434ba3a5935e47908bc861ce1ebc43c2edfc1001d235d6e31e5d3ed55815f7"}, - {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:1c734a2d4843e4e14ececf5600c3c4750990ec319e1299db7e4f0d02c25c1467"}, - {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b6a2ead3de3b2d53119d473aa2f224030257ef33af1e4ddabd4afee1dea5f04c"}, - {file = "grpcio-1.53.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a34d6e905f071f9b945cabbcc776e2055de1fdb59cd13683d9aa0a8f265b5bf9"}, - {file = "grpcio-1.53.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eaf8e3b97caaf9415227a3c6ca5aa8d800fecadd526538d2bf8f11af783f1550"}, - {file = "grpcio-1.53.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:da95778d37be8e4e9afca771a83424f892296f5dfb2a100eda2571a1d8bbc0dc"}, - {file = "grpcio-1.53.0-cp311-cp311-win32.whl", hash = "sha256:e4f513d63df6336fd84b74b701f17d1bb3b64e9d78a6ed5b5e8a198bbbe8bbfa"}, - {file = "grpcio-1.53.0-cp311-cp311-win_amd64.whl", hash = "sha256:ddb2511fbbb440ed9e5c9a4b9b870f2ed649b7715859fd6f2ebc585ee85c0364"}, - {file = "grpcio-1.53.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:2a912397eb8d23c177d6d64e3c8bc46b8a1c7680b090d9f13a640b104aaec77c"}, - {file = "grpcio-1.53.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:55930c56b8f5b347d6c8c609cc341949a97e176c90f5cbb01d148d778f3bbd23"}, - {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:6601d812105583948ab9c6e403a7e2dba6e387cc678c010e74f2d6d589d1d1b3"}, - {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c705e0c21acb0e8478a00e7e773ad0ecdb34bd0e4adc282d3d2f51ba3961aac7"}, - {file = "grpcio-1.53.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba074af9ca268ad7b05d3fc2b920b5fb3c083da94ab63637aaf67f4f71ecb755"}, - {file = "grpcio-1.53.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:14817de09317dd7d3fbc8272864288320739973ef0f4b56bf2c0032349da8cdf"}, - {file = "grpcio-1.53.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c7ad9fbedb93f331c2e9054e202e95cf825b885811f1bcbbdfdc301e451442db"}, - {file = "grpcio-1.53.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dad5b302a4c21c604d88a5d441973f320134e6ff6a84ecef9c1139e5ffd466f6"}, - {file = "grpcio-1.53.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:fa8eaac75d3107e3f5465f2c9e3bbd13db21790c6e45b7de1756eba16b050aca"}, - {file = "grpcio-1.53.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:104a2210edd3776c38448b4f76c2f16e527adafbde171fc72a8a32976c20abc7"}, - {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:dbc1ba968639c1d23476f75c356e549e7bbf2d8d6688717dcab5290e88e8482b"}, - {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:95952d3fe795b06af29bb8ec7bbf3342cdd867fc17b77cc25e6733d23fa6c519"}, - {file = "grpcio-1.53.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f144a790f14c51b8a8e591eb5af40507ffee45ea6b818c2482f0457fec2e1a2e"}, - {file = "grpcio-1.53.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0698c094688a2dd4c7c2f2c0e3e142cac439a64d1cef6904c97f6cde38ba422f"}, - {file = "grpcio-1.53.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6b6d60b0958be711bab047e9f4df5dbbc40367955f8651232bfdcdd21450b9ab"}, - {file = "grpcio-1.53.0-cp38-cp38-win32.whl", hash = "sha256:1948539ce78805d4e6256ab0e048ec793956d54787dc9d6777df71c1d19c7f81"}, - {file = "grpcio-1.53.0-cp38-cp38-win_amd64.whl", hash = "sha256:df9ba1183b3f649210788cf80c239041dddcb375d6142d8bccafcfdf549522cd"}, - {file = "grpcio-1.53.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:19caa5b7282a89b799e63776ff602bb39604f7ca98db6df27e2de06756ae86c3"}, - {file = "grpcio-1.53.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:b5bd026ac928c96cc23149e6ef79183125542062eb6d1ccec34c0a37e02255e7"}, - {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:7dc8584ca6c015ad82e186e82f4c0fe977394588f66b8ecfc4ec873285314619"}, - {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2eddaae8af625e45b5c8500dcca1043264d751a6872cde2eda5022df8a336959"}, - {file = "grpcio-1.53.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c5fb6f3d7824696c1c9f2ad36ddb080ba5a86f2d929ef712d511b4d9972d3d27"}, - {file = "grpcio-1.53.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8270d1dc2c98ab57e6dbf36fa187db8df4c036f04a398e5d5e25b4e01a766d70"}, - {file = "grpcio-1.53.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:976a7f24eb213e8429cab78d5e120500dfcdeb01041f1f5a77b17b9101902615"}, - {file = "grpcio-1.53.0-cp39-cp39-win32.whl", hash = "sha256:9c84a481451e7174f3a764a44150f93b041ab51045aa33d7b5b68b6979114e48"}, - {file = "grpcio-1.53.0-cp39-cp39-win_amd64.whl", hash = "sha256:6beb84f83360ff29a3654f43f251ec11b809dcb5524b698d711550243debd289"}, - {file = "grpcio-1.53.0.tar.gz", hash = "sha256:a4952899b4931a6ba12951f9a141ef3e74ff8a6ec9aa2dc602afa40f63595e33"}, + {file = "grpcio-1.54.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:40e1cbf69d6741b40f750f3cccc64326f927ac6145a9914d33879e586002350c"}, + {file = "grpcio-1.54.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:2288d76e4d4aa7ef3fe7a73c1c470b66ea68e7969930e746a8cd8eca6ef2a2ea"}, + {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:c0e3155fc5335ec7b3b70f15230234e529ca3607b20a562b6c75fb1b1218874c"}, + {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bf88004fe086c786dc56ef8dd6cb49c026833fdd6f42cb853008bce3f907148"}, + {file = "grpcio-1.54.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be88c081e33f20630ac3343d8ad9f1125f32987968e9c8c75c051c9800896e8"}, + {file = "grpcio-1.54.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:33d40954199bddbb6a78f8f6f2b2082660f381cd2583ec860a6c2fa7c8400c08"}, + {file = "grpcio-1.54.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b52d00d1793d290c81ad6a27058f5224a7d5f527867e5b580742e1bd211afeee"}, + {file = "grpcio-1.54.2-cp310-cp310-win32.whl", hash = "sha256:881d058c5ccbea7cc2c92085a11947b572498a27ef37d3eef4887f499054dca8"}, + {file = "grpcio-1.54.2-cp310-cp310-win_amd64.whl", hash = "sha256:0212e2f7fdf7592e4b9d365087da30cb4d71e16a6f213120c89b4f8fb35a3ab3"}, + {file = "grpcio-1.54.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:1e623e0cf99a0ac114f091b3083a1848dbc64b0b99e181473b5a4a68d4f6f821"}, + {file = "grpcio-1.54.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:66233ccd2a9371158d96e05d082043d47dadb18cbb294dc5accfdafc2e6b02a7"}, + {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:4cb283f630624ebb16c834e5ac3d7880831b07cbe76cb08ab7a271eeaeb8943e"}, + {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a1e601ee31ef30a9e2c601d0867e236ac54c922d32ed9f727b70dd5d82600d5"}, + {file = "grpcio-1.54.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8da84bbc61a4e92af54dc96344f328e5822d574f767e9b08e1602bb5ddc254a"}, + {file = "grpcio-1.54.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5008964885e8d23313c8e5ea0d44433be9bfd7e24482574e8cc43c02c02fc796"}, + {file = "grpcio-1.54.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a2f5a1f1080ccdc7cbaf1171b2cf384d852496fe81ddedeb882d42b85727f610"}, + {file = "grpcio-1.54.2-cp311-cp311-win32.whl", hash = "sha256:b74ae837368cfffeb3f6b498688a123e6b960951be4dec0e869de77e7fa0439e"}, + {file = "grpcio-1.54.2-cp311-cp311-win_amd64.whl", hash = "sha256:8cdbcbd687e576d48f7886157c95052825ca9948c0ed2afdc0134305067be88b"}, + {file = "grpcio-1.54.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:782f4f8662a2157c4190d0f99eaaebc602899e84fb1e562a944e5025929e351c"}, + {file = "grpcio-1.54.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:714242ad0afa63a2e6dabd522ae22e1d76e07060b5af2ddda5474ba4f14c2c94"}, + {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:f900ed4ad7a0f1f05d35f955e0943944d5a75f607a836958c6b8ab2a81730ef2"}, + {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96a41817d2c763b1d0b32675abeb9179aa2371c72aefdf74b2d2b99a1b92417b"}, + {file = "grpcio-1.54.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70fcac7b94f4c904152809a050164650ac81c08e62c27aa9f156ac518029ebbe"}, + {file = "grpcio-1.54.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fd6c6c29717724acf9fc1847c4515d57e4dc12762452457b9cb37461f30a81bb"}, + {file = "grpcio-1.54.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c2392f5b5d84b71d853918687d806c1aa4308109e5ca158a16e16a6be71041eb"}, + {file = "grpcio-1.54.2-cp37-cp37m-win_amd64.whl", hash = "sha256:51630c92591d6d3fe488a7c706bd30a61594d144bac7dee20c8e1ce78294f474"}, + {file = "grpcio-1.54.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:b04202453941a63b36876a7172b45366dc0cde10d5fd7855c0f4a4e673c0357a"}, + {file = "grpcio-1.54.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:89dde0ac72a858a44a2feb8e43dc68c0c66f7857a23f806e81e1b7cc7044c9cf"}, + {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:09d4bfd84686cd36fd11fd45a0732c7628308d094b14d28ea74a81db0bce2ed3"}, + {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7fc2b4edb938c8faa4b3c3ea90ca0dd89b7565a049e8e4e11b77e60e4ed2cc05"}, + {file = "grpcio-1.54.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61f7203e2767800edee7a1e1040aaaf124a35ce0c7fe0883965c6b762defe598"}, + {file = "grpcio-1.54.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e416c8baf925b5a1aff31f7f5aecc0060b25d50cce3a5a7255dc5cf2f1d4e5eb"}, + {file = "grpcio-1.54.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dc80c9c6b608bf98066a038e0172013a49cfa9a08d53335aefefda2c64fc68f4"}, + {file = "grpcio-1.54.2-cp38-cp38-win32.whl", hash = "sha256:8d6192c37a30a115f4663592861f50e130caed33efc4eec24d92ec881c92d771"}, + {file = "grpcio-1.54.2-cp38-cp38-win_amd64.whl", hash = "sha256:46a057329938b08e5f0e12ea3d7aed3ecb20a0c34c4a324ef34e00cecdb88a12"}, + {file = "grpcio-1.54.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:2296356b5c9605b73ed6a52660b538787094dae13786ba53080595d52df13a98"}, + {file = "grpcio-1.54.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:c72956972e4b508dd39fdc7646637a791a9665b478e768ffa5f4fe42123d5de1"}, + {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:9bdbb7624d65dc0ed2ed8e954e79ab1724526f09b1efa88dcd9a1815bf28be5f"}, + {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c44e1a765b31e175c391f22e8fc73b2a2ece0e5e6ff042743d8109b5d2eff9f"}, + {file = "grpcio-1.54.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cc928cfe6c360c1df636cf7991ab96f059666ac7b40b75a769410cc6217df9c"}, + {file = "grpcio-1.54.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a08920fa1a97d4b8ee5db2f31195de4a9def1a91bc003544eb3c9e6b8977960a"}, + {file = "grpcio-1.54.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4864f99aac207e3e45c5e26c6cbb0ad82917869abc2f156283be86c05286485c"}, + {file = "grpcio-1.54.2-cp39-cp39-win32.whl", hash = "sha256:b38b3de8cff5bc70f8f9c615f51b48eff7313fc9aca354f09f81b73036e7ddfa"}, + {file = "grpcio-1.54.2-cp39-cp39-win_amd64.whl", hash = "sha256:be48496b0e00460717225e7680de57c38be1d8629dc09dadcd1b3389d70d942b"}, + {file = "grpcio-1.54.2.tar.gz", hash = "sha256:50a9f075eeda5097aa9a182bb3877fe1272875e45370368ac0ee16ab9e22d019"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.53.0)"] +protobuf = ["grpcio-tools (>=1.54.2)"] [[package]] name = "httplib2" @@ -847,14 +891,14 @@ pyparsing = {version = ">=2.4.2,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.0.2 || >3.0 [[package]] name = "identify" -version = "2.5.22" +version = "2.5.24" description = "File identification library for Python" category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "identify-2.5.22-py2.py3-none-any.whl", hash = "sha256:f0faad595a4687053669c112004178149f6c326db71ee999ae4636685753ad2f"}, - {file = "identify-2.5.22.tar.gz", hash = "sha256:f7a93d6cf98e29bd07663c60728e7a4057615068d7a639d132dc883b2d54d31e"}, + {file = "identify-2.5.24-py2.py3-none-any.whl", hash = "sha256:986dbfb38b1140e763e413e6feb44cd731faf72d1909543178aa79b0e258265d"}, + {file = "identify-2.5.24.tar.gz", hash = "sha256:0aac67d5b4812498056d28a9a512a483f5085cc28640b02b258a59dac34301d4"}, ] [package.extras] @@ -872,38 +916,6 @@ files = [ {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] -[[package]] -name = "imageio" -version = "2.27.0" -description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "imageio-2.27.0-py3-none-any.whl", hash = "sha256:24c6ad7d000e64eacc2861c402b6fb128f370cb0a6623cf796d83bca0d0d14d3"}, - {file = "imageio-2.27.0.tar.gz", hash = "sha256:ee269c957785ef0373cc7a7323185956d83ec05e6cdf20b42a03ba7b74ac58c6"}, -] - -[package.dependencies] -numpy = "*" -pillow = ">=8.3.2" - -[package.extras] -all-plugins = ["astropy", "av", "imageio-ffmpeg", "psutil", "tifffile"] -all-plugins-pypy = ["av", "imageio-ffmpeg", "psutil", "tifffile"] -build = ["wheel"] -dev = ["black", "flake8", "fsspec[github]", "invoke", "pytest", "pytest-cov"] -docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] -ffmpeg = ["imageio-ffmpeg", "psutil"] -fits = ["astropy"] -full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "invoke", "itk", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "sphinx (<6)", "tifffile", "wheel"] -gdal = ["gdal"] -itk = ["itk"] -linting = ["black", "flake8"] -pyav = ["av"] -test = ["fsspec[github]", "invoke", "pytest", "pytest-cov"] -tifffile = ["tifffile"] - [[package]] name = "imagesize" version = "1.4.1" @@ -918,22 +930,21 @@ files = [ [[package]] name = "importlib-metadata" -version = "4.13.0" +version = "6.6.0" description = "Read metadata from Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "importlib_metadata-4.13.0-py3-none-any.whl", hash = "sha256:8a8a81bcf996e74fee46f0d16bd3eaa382a7eb20fd82445c3ad11f4090334116"}, - {file = "importlib_metadata-4.13.0.tar.gz", hash = "sha256:dd0173e8f150d6815e098fd354f6414b0f079af4644ddfe90c71e2fc6174346d"}, + {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, + {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, ] [package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] @@ -942,7 +953,7 @@ name = "importlib-resources" version = "5.12.0" description = "Read resources from Python packages" category = "main" -optional = true +optional = false python-versions = ">=3.7" files = [ {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, @@ -970,18 +981,18 @@ files = [ [[package]] name = "isort" -version = "5.11.5" +version = "5.12.0" description = "A Python utility / library to sort Python imports." category = "main" optional = true -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "isort-5.11.5-py3-none-any.whl", hash = "sha256:ba1d72fb2595a01c7895a5128f9585a5cc4b6d395f1c8d514989b9a7eb2a8746"}, - {file = "isort-5.11.5.tar.gz", hash = "sha256:6be1f76a507cb2ecf16c7cf14a37e41609ca082330be4e3436a18ef74add55db"}, + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, ] [package.extras] -colors = ["colorama (>=0.4.3,<0.5.0)"] +colors = ["colorama (>=0.4.3)"] pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] plugins = ["setuptools"] requirements-deprecated-finder = ["pip-api", "pipreqs"] @@ -1142,9 +1153,6 @@ files = [ {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, ] -[package.dependencies] -typing-extensions = {version = "*", markers = "python_version < \"3.8\""} - [[package]] name = "lazy-object-proxy" version = "1.9.0" @@ -1205,7 +1213,6 @@ files = [ [package.dependencies] mdurl = ">=0.1,<1.0" -typing_extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [package.extras] benchmarking = ["psutil", "pytest", "pytest-benchmark"] @@ -1279,57 +1286,65 @@ files = [ [[package]] name = "matplotlib" -version = "3.5.3" +version = "3.7.1" description = "Python plotting package" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "matplotlib-3.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a206a1b762b39398efea838f528b3a6d60cdb26fe9d58b48265787e29cd1d693"}, - {file = "matplotlib-3.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd45a6f3e93a780185f70f05cf2a383daed13c3489233faad83e81720f7ede24"}, - {file = "matplotlib-3.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d62880e1f60e5a30a2a8484432bcb3a5056969dc97258d7326ad465feb7ae069"}, - {file = "matplotlib-3.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ab29589cef03bc88acfa3a1490359000c18186fc30374d8aa77d33cc4a51a4a"}, - {file = "matplotlib-3.5.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2886cc009f40e2984c083687251821f305d811d38e3df8ded414265e4583f0c5"}, - {file = "matplotlib-3.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c995f7d9568f18b5db131ab124c64e51b6820a92d10246d4f2b3f3a66698a15b"}, - {file = "matplotlib-3.5.3-cp310-cp310-win32.whl", hash = "sha256:6bb93a0492d68461bd458eba878f52fdc8ac7bdb6c4acdfe43dba684787838c2"}, - {file = "matplotlib-3.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:2e6d184ebe291b9e8f7e78bbab7987d269c38ea3e062eace1fe7d898042ef804"}, - {file = "matplotlib-3.5.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ea6aef5c4338e58d8d376068e28f80a24f54e69f09479d1c90b7172bad9f25b"}, - {file = "matplotlib-3.5.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:839d47b8ead7ad9669aaacdbc03f29656dc21f0d41a6fea2d473d856c39c8b1c"}, - {file = "matplotlib-3.5.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3b4fa56159dc3c7f9250df88f653f085068bcd32dcd38e479bba58909254af7f"}, - {file = "matplotlib-3.5.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:94ff86af56a3869a4ae26a9637a849effd7643858a1a04dd5ee50e9ab75069a7"}, - {file = "matplotlib-3.5.3-cp37-cp37m-win32.whl", hash = "sha256:35a8ad4dddebd51f94c5d24bec689ec0ec66173bf614374a1244c6241c1595e0"}, - {file = "matplotlib-3.5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:43e9d3fa077bf0cc95ded13d331d2156f9973dce17c6f0c8b49ccd57af94dbd9"}, - {file = "matplotlib-3.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:22227c976ad4dc8c5a5057540421f0d8708c6560744ad2ad638d48e2984e1dbc"}, - {file = "matplotlib-3.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf618a825deb6205f015df6dfe6167a5d9b351203b03fab82043ae1d30f16511"}, - {file = "matplotlib-3.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9befa5954cdbc085e37d974ff6053da269474177921dd61facdad8023c4aeb51"}, - {file = "matplotlib-3.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3840c280ebc87a48488a46f760ea1c0c0c83fcf7abbe2e6baf99d033fd35fd8"}, - {file = "matplotlib-3.5.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dacddf5bfcec60e3f26ec5c0ae3d0274853a258b6c3fc5ef2f06a8eb23e042be"}, - {file = "matplotlib-3.5.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b428076a55fb1c084c76cb93e68006f27d247169f056412607c5c88828d08f88"}, - {file = "matplotlib-3.5.3-cp38-cp38-win32.whl", hash = "sha256:874df7505ba820e0400e7091199decf3ff1fde0583652120c50cd60d5820ca9a"}, - {file = "matplotlib-3.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:b28de401d928890187c589036857a270a032961411934bdac4cf12dde3d43094"}, - {file = "matplotlib-3.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3211ba82b9f1518d346f6309df137b50c3dc4421b4ed4815d1d7eadc617f45a1"}, - {file = "matplotlib-3.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6fe807e8a22620b4cd95cfbc795ba310dc80151d43b037257250faf0bfcd82bc"}, - {file = "matplotlib-3.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5c096363b206a3caf43773abebdbb5a23ea13faef71d701b21a9c27fdcef72f4"}, - {file = "matplotlib-3.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bcdfcb0f976e1bac6721d7d457c17be23cf7501f977b6a38f9d38a3762841f7"}, - {file = "matplotlib-3.5.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e64ac9be9da6bfff0a732e62116484b93b02a0b4d4b19934fb4f8e7ad26ad6a"}, - {file = "matplotlib-3.5.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:73dd93dc35c85dece610cca8358003bf0760d7986f70b223e2306b4ea6d1406b"}, - {file = "matplotlib-3.5.3-cp39-cp39-win32.whl", hash = "sha256:879c7e5fce4939c6aa04581dfe08d57eb6102a71f2e202e3314d5fbc072fd5a0"}, - {file = "matplotlib-3.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:ab8d26f07fe64f6f6736d635cce7bfd7f625320490ed5bfc347f2cdb4fae0e56"}, - {file = "matplotlib-3.5.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:99482b83ebf4eb6d5fc6813d7aacdefdd480f0d9c0b52dcf9f1cc3b2c4b3361a"}, - {file = "matplotlib-3.5.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f814504e459c68118bf2246a530ed953ebd18213dc20e3da524174d84ed010b2"}, - {file = "matplotlib-3.5.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:57f1b4e69f438a99bb64d7f2c340db1b096b41ebaa515cf61ea72624279220ce"}, - {file = "matplotlib-3.5.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d2484b350bf3d32cae43f85dcfc89b3ed7bd2bcd781ef351f93eb6fb2cc483f9"}, - {file = "matplotlib-3.5.3.tar.gz", hash = "sha256:339cac48b80ddbc8bfd05daae0a3a73414651a8596904c2a881cfd1edb65f26c"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:95cbc13c1fc6844ab8812a525bbc237fa1470863ff3dace7352e910519e194b1"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:08308bae9e91aca1ec6fd6dda66237eef9f6294ddb17f0d0b3c863169bf82353"}, + {file = "matplotlib-3.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:544764ba51900da4639c0f983b323d288f94f65f4024dc40ecb1542d74dc0500"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56d94989191de3fcc4e002f93f7f1be5da476385dde410ddafbb70686acf00ea"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99bc9e65901bb9a7ce5e7bb24af03675cbd7c70b30ac670aa263240635999a4"}, + {file = "matplotlib-3.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb7d248c34a341cd4c31a06fd34d64306624c8cd8d0def7abb08792a5abfd556"}, + {file = "matplotlib-3.7.1-cp310-cp310-win32.whl", hash = "sha256:ce463ce590f3825b52e9fe5c19a3c6a69fd7675a39d589e8b5fbe772272b3a24"}, + {file = "matplotlib-3.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d7bc90727351fb841e4d8ae620d2d86d8ed92b50473cd2b42ce9186104ecbba"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:770a205966d641627fd5cf9d3cb4b6280a716522cd36b8b284a8eb1581310f61"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f67bfdb83a8232cb7a92b869f9355d677bce24485c460b19d01970b64b2ed476"}, + {file = "matplotlib-3.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2bf092f9210e105f414a043b92af583c98f50050559616930d884387d0772aba"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89768d84187f31717349c6bfadc0e0d8c321e8eb34522acec8a67b1236a66332"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:83111e6388dec67822e2534e13b243cc644c7494a4bb60584edbff91585a83c6"}, + {file = "matplotlib-3.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a867bf73a7eb808ef2afbca03bcdb785dae09595fbe550e1bab0cd023eba3de0"}, + {file = "matplotlib-3.7.1-cp311-cp311-win32.whl", hash = "sha256:fbdeeb58c0cf0595efe89c05c224e0a502d1aa6a8696e68a73c3efc6bc354304"}, + {file = "matplotlib-3.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c0bd19c72ae53e6ab979f0ac6a3fafceb02d2ecafa023c5cca47acd934d10be7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:6eb88d87cb2c49af00d3bbc33a003f89fd9f78d318848da029383bfc08ecfbfb"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:cf0e4f727534b7b1457898c4f4ae838af1ef87c359b76dcd5330fa31893a3ac7"}, + {file = "matplotlib-3.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:46a561d23b91f30bccfd25429c3c706afe7d73a5cc64ef2dfaf2b2ac47c1a5dc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8704726d33e9aa8a6d5215044b8d00804561971163563e6e6591f9dcf64340cc"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4cf327e98ecf08fcbb82685acaf1939d3338548620ab8dfa02828706402c34de"}, + {file = "matplotlib-3.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:617f14ae9d53292ece33f45cba8503494ee199a75b44de7717964f70637a36aa"}, + {file = "matplotlib-3.7.1-cp38-cp38-win32.whl", hash = "sha256:7c9a4b2da6fac77bcc41b1ea95fadb314e92508bf5493ceff058e727e7ecf5b0"}, + {file = "matplotlib-3.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:14645aad967684e92fc349493fa10c08a6da514b3d03a5931a1bac26e6792bd1"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:81a6b377ea444336538638d31fdb39af6be1a043ca5e343fe18d0f17e098770b"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:28506a03bd7f3fe59cd3cd4ceb2a8d8a2b1db41afede01f66c42561b9be7b4b7"}, + {file = "matplotlib-3.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8c587963b85ce41e0a8af53b9b2de8dddbf5ece4c34553f7bd9d066148dc719c"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8bf26ade3ff0f27668989d98c8435ce9327d24cffb7f07d24ef609e33d582439"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:def58098f96a05f90af7e92fd127d21a287068202aa43b2a93476170ebd99e87"}, + {file = "matplotlib-3.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f883a22a56a84dba3b588696a2b8a1ab0d2c3d41be53264115c71b0a942d8fdb"}, + {file = "matplotlib-3.7.1-cp39-cp39-win32.whl", hash = "sha256:4f99e1b234c30c1e9714610eb0c6d2f11809c9c78c984a613ae539ea2ad2eb4b"}, + {file = "matplotlib-3.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:3ba2af245e36990facf67fde840a760128ddd71210b2ab6406e640188d69d136"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3032884084f541163f295db8a6536e0abb0db464008fadca6c98aaf84ccf4717"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a2cb34336110e0ed8bb4f650e817eed61fa064acbefeb3591f1b33e3a84fd96"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b867e2f952ed592237a1828f027d332d8ee219ad722345b79a001f49df0936eb"}, + {file = "matplotlib-3.7.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:57bfb8c8ea253be947ccb2bc2d1bb3862c2bccc662ad1b4626e1f5e004557042"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:438196cdf5dc8d39b50a45cb6e3f6274edbcf2254f85fa9b895bf85851c3a613"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e9cff1a58d42e74d01153360de92b326708fb205250150018a52c70f43c290"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75d4725d70b7c03e082bbb8a34639ede17f333d7247f56caceb3801cb6ff703d"}, + {file = "matplotlib-3.7.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:97cc368a7268141afb5690760921765ed34867ffb9655dd325ed207af85c7529"}, + {file = "matplotlib-3.7.1.tar.gz", hash = "sha256:7b73305f25eab4541bd7ee0b96d87e53ae9c9f1823be5659b806cd85786fe882"}, ] [package.dependencies] +contourpy = ">=1.0.1" cycler = ">=0.10" fonttools = ">=4.22.0" +importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.17" +numpy = ">=1.20" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.2.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] @@ -1370,65 +1385,73 @@ files = [ [[package]] name = "mypy" -version = "0.931" +version = "1.3.0" description = "Optional static typing for Python" category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "mypy-0.931-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a"}, - {file = "mypy-0.931-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00"}, - {file = "mypy-0.931-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714"}, - {file = "mypy-0.931-cp310-cp310-win_amd64.whl", hash = "sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc"}, - {file = "mypy-0.931-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d"}, - {file = "mypy-0.931-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d"}, - {file = "mypy-0.931-cp36-cp36m-win_amd64.whl", hash = "sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c"}, - {file = "mypy-0.931-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0"}, - {file = "mypy-0.931-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05"}, - {file = "mypy-0.931-cp37-cp37m-win_amd64.whl", hash = "sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7"}, - {file = "mypy-0.931-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0"}, - {file = "mypy-0.931-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069"}, - {file = "mypy-0.931-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799"}, - {file = "mypy-0.931-cp38-cp38-win_amd64.whl", hash = "sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a"}, - {file = "mypy-0.931-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166"}, - {file = "mypy-0.931-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266"}, - {file = "mypy-0.931-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd"}, - {file = "mypy-0.931-cp39-cp39-win_amd64.whl", hash = "sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697"}, - {file = "mypy-0.931-py3-none-any.whl", hash = "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d"}, - {file = "mypy-0.931.tar.gz", hash = "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce"}, + {file = "mypy-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1eb485cea53f4f5284e5baf92902cd0088b24984f4209e25981cc359d64448d"}, + {file = "mypy-1.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c99c3ecf223cf2952638da9cd82793d8f3c0c5fa8b6ae2b2d9ed1e1ff51ba85"}, + {file = "mypy-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:550a8b3a19bb6589679a7c3c31f64312e7ff482a816c96e0cecec9ad3a7564dd"}, + {file = "mypy-1.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cbc07246253b9e3d7d74c9ff948cd0fd7a71afcc2b77c7f0a59c26e9395cb152"}, + {file = "mypy-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:a22435632710a4fcf8acf86cbd0d69f68ac389a3892cb23fbad176d1cddaf228"}, + {file = "mypy-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6e33bb8b2613614a33dff70565f4c803f889ebd2f859466e42b46e1df76018dd"}, + {file = "mypy-1.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7d23370d2a6b7a71dc65d1266f9a34e4cde9e8e21511322415db4b26f46f6b8c"}, + {file = "mypy-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:658fe7b674769a0770d4b26cb4d6f005e88a442fe82446f020be8e5f5efb2fae"}, + {file = "mypy-1.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e42d29e324cdda61daaec2336c42512e59c7c375340bd202efa1fe0f7b8f8ca"}, + {file = "mypy-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:d0b6c62206e04061e27009481cb0ec966f7d6172b5b936f3ead3d74f29fe3dcf"}, + {file = "mypy-1.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:76ec771e2342f1b558c36d49900dfe81d140361dd0d2df6cd71b3db1be155409"}, + {file = "mypy-1.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebc95f8386314272bbc817026f8ce8f4f0d2ef7ae44f947c4664efac9adec929"}, + {file = "mypy-1.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:faff86aa10c1aa4a10e1a301de160f3d8fc8703b88c7e98de46b531ff1276a9a"}, + {file = "mypy-1.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8c5979d0deb27e0f4479bee18ea0f83732a893e81b78e62e2dda3e7e518c92ee"}, + {file = "mypy-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c5d2cc54175bab47011b09688b418db71403aefad07cbcd62d44010543fc143f"}, + {file = "mypy-1.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:87df44954c31d86df96c8bd6e80dfcd773473e877ac6176a8e29898bfb3501cb"}, + {file = "mypy-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:473117e310febe632ddf10e745a355714e771ffe534f06db40702775056614c4"}, + {file = "mypy-1.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:74bc9b6e0e79808bf8678d7678b2ae3736ea72d56eede3820bd3849823e7f305"}, + {file = "mypy-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:44797d031a41516fcf5cbfa652265bb994e53e51994c1bd649ffcd0c3a7eccbf"}, + {file = "mypy-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ddae0f39ca146972ff6bb4399f3b2943884a774b8771ea0a8f50e971f5ea5ba8"}, + {file = "mypy-1.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1c4c42c60a8103ead4c1c060ac3cdd3ff01e18fddce6f1016e08939647a0e703"}, + {file = "mypy-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e86c2c6852f62f8f2b24cb7a613ebe8e0c7dc1402c61d36a609174f63e0ff017"}, + {file = "mypy-1.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f9dca1e257d4cc129517779226753dbefb4f2266c4eaad610fc15c6a7e14283e"}, + {file = "mypy-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:95d8d31a7713510685b05fbb18d6ac287a56c8f6554d88c19e73f724a445448a"}, + {file = "mypy-1.3.0-py3-none-any.whl", hash = "sha256:a8763e72d5d9574d45ce5881962bc8e9046bf7b375b0abf031f3e6811732a897"}, + {file = "mypy-1.3.0.tar.gz", hash = "sha256:e1f4d16e296f5135624b34e8fb741eb0eadedca90862405b1f1fde2040b9bd11"}, ] [package.dependencies] -mypy-extensions = ">=0.4.3" -tomli = ">=1.1.0" -typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=3.10" [package.extras] dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] python2 = ["typed-ast (>=1.4.0,<2)"] +reports = ["lxml"] [[package]] name = "mypy-extensions" -version = "0.4.4" -description = "Experimental type system extensions for programs checked with the mypy typechecker." +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." category = "main" optional = true -python-versions = ">=2.7" +python-versions = ">=3.5" files = [ - {file = "mypy_extensions-0.4.4.tar.gz", hash = "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd"}, + {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 = "nodeenv" -version = "1.7.0" +version = "1.8.0" description = "Node.js virtual environment builder" category = "main" optional = true python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ - {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"}, - {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"}, + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, ] [package.dependencies] @@ -1436,81 +1459,40 @@ setuptools = "*" [[package]] name = "numpy" -version = "1.21.6" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.7,<3.11" -files = [ - {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25"}, - {file = "numpy-1.21.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e"}, - {file = "numpy-1.21.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6"}, - {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb"}, - {file = "numpy-1.21.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1"}, - {file = "numpy-1.21.6-cp310-cp310-win32.whl", hash = "sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c"}, - {file = "numpy-1.21.6-cp310-cp310-win_amd64.whl", hash = "sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f"}, - {file = "numpy-1.21.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7"}, - {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46"}, - {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2"}, - {file = "numpy-1.21.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db"}, - {file = "numpy-1.21.6-cp37-cp37m-win32.whl", hash = "sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e"}, - {file = "numpy-1.21.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a"}, - {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552"}, - {file = "numpy-1.21.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab"}, - {file = "numpy-1.21.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3"}, - {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6"}, - {file = "numpy-1.21.6-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a"}, - {file = "numpy-1.21.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4"}, - {file = "numpy-1.21.6-cp38-cp38-win32.whl", hash = "sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470"}, - {file = "numpy-1.21.6-cp38-cp38-win_amd64.whl", hash = "sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf"}, - {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1"}, - {file = "numpy-1.21.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673"}, - {file = "numpy-1.21.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0"}, - {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac"}, - {file = "numpy-1.21.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b"}, - {file = "numpy-1.21.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b"}, - {file = "numpy-1.21.6-cp39-cp39-win32.whl", hash = "sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786"}, - {file = "numpy-1.21.6-cp39-cp39-win_amd64.whl", hash = "sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3"}, - {file = "numpy-1.21.6-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0"}, - {file = "numpy-1.21.6.zip", hash = "sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656"}, -] - -[[package]] -name = "numpy" -version = "1.24.2" +version = "1.24.3" description = "Fundamental package for array computing in Python" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "numpy-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eef70b4fc1e872ebddc38cddacc87c19a3709c0e3e5d20bf3954c147b1dd941d"}, - {file = "numpy-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8d2859428712785e8a8b7d2b3ef0a1d1565892367b32f915c4a4df44d0e64f5"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6524630f71631be2dabe0c541e7675db82651eb998496bbe16bc4f77f0772253"}, - {file = "numpy-1.24.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51725a815a6188c662fb66fb32077709a9ca38053f0274640293a14fdd22978"}, - {file = "numpy-1.24.2-cp310-cp310-win32.whl", hash = "sha256:2620e8592136e073bd12ee4536149380695fbe9ebeae845b81237f986479ffc9"}, - {file = "numpy-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:97cf27e51fa078078c649a51d7ade3c92d9e709ba2bfb97493007103c741f1d0"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7de8fdde0003f4294655aa5d5f0a89c26b9f22c0a58790c38fae1ed392d44a5a"}, - {file = "numpy-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4173bde9fa2a005c2c6e2ea8ac1618e2ed2c1c6ec8a7657237854d42094123a0"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cecaed30dc14123020f77b03601559fff3e6cd0c048f8b5289f4eeabb0eb281"}, - {file = "numpy-1.24.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a23f8440561a633204a67fb44617ce2a299beecf3295f0d13c495518908e910"}, - {file = "numpy-1.24.2-cp311-cp311-win32.whl", hash = "sha256:e428c4fbfa085f947b536706a2fc349245d7baa8334f0c5723c56a10595f9b95"}, - {file = "numpy-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:557d42778a6869c2162deb40ad82612645e21d79e11c1dc62c6e82a2220ffb04"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d0a2db9d20117bf523dde15858398e7c0858aadca7c0f088ac0d6edd360e9ad2"}, - {file = "numpy-1.24.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c72a6b2f4af1adfe193f7beb91ddf708ff867a3f977ef2ec53c0ffb8283ab9f5"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c29e6bd0ec49a44d7690ecb623a8eac5ab8a923bce0bea6293953992edf3a76a"}, - {file = "numpy-1.24.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2eabd64ddb96a1239791da78fa5f4e1693ae2dadc82a76bc76a14cbb2b966e96"}, - {file = "numpy-1.24.2-cp38-cp38-win32.whl", hash = "sha256:e3ab5d32784e843fc0dd3ab6dcafc67ef806e6b6828dc6af2f689be0eb4d781d"}, - {file = "numpy-1.24.2-cp38-cp38-win_amd64.whl", hash = "sha256:76807b4063f0002c8532cfeac47a3068a69561e9c8715efdad3c642eb27c0756"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4199e7cfc307a778f72d293372736223e39ec9ac096ff0a2e64853b866a8e18a"}, - {file = "numpy-1.24.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:adbdce121896fd3a17a77ab0b0b5eedf05a9834a18699db6829a64e1dfccca7f"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:889b2cc88b837d86eda1b17008ebeb679d82875022200c6e8e4ce6cf549b7acb"}, - {file = "numpy-1.24.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f64bb98ac59b3ea3bf74b02f13836eb2e24e48e0ab0145bbda646295769bd780"}, - {file = "numpy-1.24.2-cp39-cp39-win32.whl", hash = "sha256:63e45511ee4d9d976637d11e6c9864eae50e12dc9598f531c035265991910468"}, - {file = "numpy-1.24.2-cp39-cp39-win_amd64.whl", hash = "sha256:a77d3e1163a7770164404607b7ba3967fb49b24782a6ef85d9b5f54126cc39e5"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92011118955724465fb6853def593cf397b4a1367495e0b59a7e69d40c4eb71d"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9006288bcf4895917d02583cf3411f98631275bc67cce355a7f39f8c14338fa"}, - {file = "numpy-1.24.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:150947adbdfeceec4e5926d956a06865c1c690f2fd902efede4ca6fe2e657c3f"}, - {file = "numpy-1.24.2.tar.gz", hash = "sha256:003a9f530e880cb2cd177cba1af7220b9aa42def9c4afc2a2fc3ee6be7eb2b22"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, + {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, + {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6"}, + {file = "numpy-1.24.3-cp310-cp310-win32.whl", hash = "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b"}, + {file = "numpy-1.24.3-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3"}, + {file = "numpy-1.24.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385"}, + {file = "numpy-1.24.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950"}, + {file = "numpy-1.24.3-cp311-cp311-win32.whl", hash = "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096"}, + {file = "numpy-1.24.3-cp311-cp311-win_amd64.whl", hash = "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078"}, + {file = "numpy-1.24.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c"}, + {file = "numpy-1.24.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f"}, + {file = "numpy-1.24.3-cp38-cp38-win32.whl", hash = "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4"}, + {file = "numpy-1.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4"}, + {file = "numpy-1.24.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02"}, + {file = "numpy-1.24.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4"}, + {file = "numpy-1.24.3-cp39-cp39-win32.whl", hash = "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c"}, + {file = "numpy-1.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812"}, + {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, + {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] [[package]] @@ -1534,14 +1516,14 @@ testing = ["matplotlib", "pytest", "pytest-cov"] [[package]] name = "packaging" -version = "23.0" +version = "23.1" description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"}, - {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"}, + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] [[package]] @@ -1557,9 +1539,7 @@ files = [ ] [package.dependencies] -importlib_metadata = {version = "*", markers = "python_version < \"3.8\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -zipp = {version = "*", markers = "python_version < \"3.8\""} [[package]] name = "pillow" @@ -1658,22 +1638,19 @@ testing = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "3.2.0" +version = "3.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" -optional = true +optional = false python-versions = ">=3.7" files = [ - {file = "platformdirs-3.2.0-py3-none-any.whl", hash = "sha256:ebe11c0d7a805086e99506aa331612429a72ca7cd52a1f0d277dc4adc20cb10e"}, - {file = "platformdirs-3.2.0.tar.gz", hash = "sha256:d5b638ca397f25f979350ff789db335903d7ea010ab28903f57b27e1b16c2b08"}, + {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, + {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.5", markers = "python_version < \"3.8\""} - [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.2.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" @@ -1687,78 +1664,96 @@ files = [ {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - [package.extras] dev = ["pre-commit", "tox"] testing = ["pytest", "pytest-benchmark"] +[[package]] +name = "pooch" +version = "1.7.0" +description = "\"Pooch manages your Python library's sample data files: it automatically downloads and stores them in a local directory, with support for versioning and corruption checks.\"" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pooch-1.7.0-py3-none-any.whl", hash = "sha256:74258224fc33d58f53113cf955e8d51bf01386b91492927d0d1b6b341a765ad7"}, + {file = "pooch-1.7.0.tar.gz", hash = "sha256:f174a1041b6447f0eef8860f76d17f60ed2f857dc0efa387a7f08228af05d998"}, +] + +[package.dependencies] +packaging = ">=20.0" +platformdirs = ">=2.5.0" +requests = ">=2.19.0" + +[package.extras] +progress = ["tqdm (>=4.41.0,<5.0.0)"] +sftp = ["paramiko (>=2.7.0)"] +xxhash = ["xxhash (>=1.4.3)"] + [[package]] name = "pre-commit" -version = "2.21.0" +version = "3.3.1" description = "A framework for managing and maintaining multi-language pre-commit hooks." category = "main" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"}, - {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"}, + {file = "pre_commit-3.3.1-py2.py3-none-any.whl", hash = "sha256:218e9e3f7f7f3271ebc355a15598a4d3893ad9fc7b57fe446db75644543323b9"}, + {file = "pre_commit-3.3.1.tar.gz", hash = "sha256:733f78c9a056cdd169baa6cd4272d51ecfda95346ef8a89bf93712706021b907"}, ] [package.dependencies] cfgv = ">=2.0.0" identify = ">=1.0.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} nodeenv = ">=0.11.1" pyyaml = ">=5.1" virtualenv = ">=20.10.0" [[package]] name = "protobuf" -version = "4.22.1" +version = "4.23.0" description = "" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "protobuf-4.22.1-cp310-abi3-win32.whl", hash = "sha256:85aa9acc5a777adc0c21b449dafbc40d9a0b6413ff3a4f77ef9df194be7f975b"}, - {file = "protobuf-4.22.1-cp310-abi3-win_amd64.whl", hash = "sha256:8bc971d76c03f1dd49f18115b002254f2ddb2d4b143c583bb860b796bb0d399e"}, - {file = "protobuf-4.22.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:5917412347e1da08ce2939eb5cd60650dfb1a9ab4606a415b9278a1041fb4d19"}, - {file = "protobuf-4.22.1-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:9e12e2810e7d297dbce3c129ae5e912ffd94240b050d33f9ecf023f35563b14f"}, - {file = "protobuf-4.22.1-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:953fc7904ef46900262a26374b28c2864610b60cdc8b272f864e22143f8373c4"}, - {file = "protobuf-4.22.1-cp37-cp37m-win32.whl", hash = "sha256:6e100f7bc787cd0a0ae58dbf0ab8bbf1ee7953f862b89148b6cf5436d5e9eaa1"}, - {file = "protobuf-4.22.1-cp37-cp37m-win_amd64.whl", hash = "sha256:87a6393fa634f294bf24d1cfe9fdd6bb605cbc247af81b9b10c4c0f12dfce4b3"}, - {file = "protobuf-4.22.1-cp38-cp38-win32.whl", hash = "sha256:e3fb58076bdb550e75db06ace2a8b3879d4c4f7ec9dd86e4254656118f4a78d7"}, - {file = "protobuf-4.22.1-cp38-cp38-win_amd64.whl", hash = "sha256:651113695bc2e5678b799ee5d906b5d3613f4ccfa61b12252cfceb6404558af0"}, - {file = "protobuf-4.22.1-cp39-cp39-win32.whl", hash = "sha256:67b7d19da0fda2733702c2299fd1ef6cb4b3d99f09263eacaf1aa151d9d05f02"}, - {file = "protobuf-4.22.1-cp39-cp39-win_amd64.whl", hash = "sha256:b8700792f88e59ccecfa246fa48f689d6eee6900eddd486cdae908ff706c482b"}, - {file = "protobuf-4.22.1-py3-none-any.whl", hash = "sha256:3e19dcf4adbf608924d3486ece469dd4f4f2cf7d2649900f0efcd1a84e8fd3ba"}, - {file = "protobuf-4.22.1.tar.gz", hash = "sha256:dce7a55d501c31ecf688adb2f6c3f763cf11bc0be815d1946a84d74772ab07a7"}, + {file = "protobuf-4.23.0-cp310-abi3-win32.whl", hash = "sha256:6c16657d6717a0c62d5d740cb354fbad1b0d8cb811669e06fc1caa0ff4799ddd"}, + {file = "protobuf-4.23.0-cp310-abi3-win_amd64.whl", hash = "sha256:baca40d067dddd62141a129f244703160d278648b569e90bb0e3753067644711"}, + {file = "protobuf-4.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:2b94bd6df92d71bd1234a2ffe7ce96ddf6d10cf637a18d6b55ad0a89fbb7fc21"}, + {file = "protobuf-4.23.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:9f5a0fbfcdcc364f3986f9ed9f8bb1328fb84114fd790423ff3d7fdb0f85c2d1"}, + {file = "protobuf-4.23.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:ebde3a023b8e11bfa6c890ef34cd6a8b47d586f26135e86c21344fe433daf2e2"}, + {file = "protobuf-4.23.0-cp37-cp37m-win32.whl", hash = "sha256:7cb5b9a05ce52c6a782bb97de52679bd3438ff2b7460eff5da348db65650f227"}, + {file = "protobuf-4.23.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6fe180b56e1169d72ecc4acbd39186339aed20af5384531b8e8979b02bbee159"}, + {file = "protobuf-4.23.0-cp38-cp38-win32.whl", hash = "sha256:d5a35ff54e3f62e8fc7be02bb0d2fbc212bba1a5a9cc2748090690093996f07b"}, + {file = "protobuf-4.23.0-cp38-cp38-win_amd64.whl", hash = "sha256:e62fb869762b4ba18666370e2f8a18f17f8ab92dd4467295c6d38be6f8fef60b"}, + {file = "protobuf-4.23.0-cp39-cp39-win32.whl", hash = "sha256:03eee35b60317112a72d19c54d0bff7bc58ff12fea4cd7b018232bd99758ffdf"}, + {file = "protobuf-4.23.0-cp39-cp39-win_amd64.whl", hash = "sha256:36f5370a930cb77c8ad2f4135590c672d0d2c72d4a707c7d0058dce4b4b4a598"}, + {file = "protobuf-4.23.0-py3-none-any.whl", hash = "sha256:9744e934ea5855d12191040ea198eaf704ac78665d365a89d9572e3b627c2688"}, + {file = "protobuf-4.23.0.tar.gz", hash = "sha256:5f1eba1da2a2f3f7df469fccddef3cc060b8a16cfe3cc65961ad36b4dbcf59c5"}, ] [[package]] name = "psutil" -version = "5.9.4" +version = "5.9.5" description = "Cross-platform lib for process and system monitoring in Python." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "psutil-5.9.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:c1ca331af862803a42677c120aff8a814a804e09832f166f226bfd22b56feee8"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:68908971daf802203f3d37e78d3f8831b6d1014864d7a85937941bb35f09aefe"}, - {file = "psutil-5.9.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:3ff89f9b835100a825b14c2808a106b6fdcc4b15483141482a12c725e7f78549"}, - {file = "psutil-5.9.4-cp27-cp27m-win32.whl", hash = "sha256:852dd5d9f8a47169fe62fd4a971aa07859476c2ba22c2254d4a1baa4e10b95ad"}, - {file = "psutil-5.9.4-cp27-cp27m-win_amd64.whl", hash = "sha256:9120cd39dca5c5e1c54b59a41d205023d436799b1c8c4d3ff71af18535728e94"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6b92c532979bafc2df23ddc785ed116fced1f492ad90a6830cf24f4d1ea27d24"}, - {file = "psutil-5.9.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:efeae04f9516907be44904cc7ce08defb6b665128992a56957abc9b61dca94b7"}, - {file = "psutil-5.9.4-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:54d5b184728298f2ca8567bf83c422b706200bcbbfafdc06718264f9393cfeb7"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16653106f3b59386ffe10e0bad3bb6299e169d5327d3f187614b1cb8f24cf2e1"}, - {file = "psutil-5.9.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54c0d3d8e0078b7666984e11b12b88af2db11d11249a8ac8920dd5ef68a66e08"}, - {file = "psutil-5.9.4-cp36-abi3-win32.whl", hash = "sha256:149555f59a69b33f056ba1c4eb22bb7bf24332ce631c44a319cec09f876aaeff"}, - {file = "psutil-5.9.4-cp36-abi3-win_amd64.whl", hash = "sha256:fd8522436a6ada7b4aad6638662966de0d61d241cb821239b2ae7013d41a43d4"}, - {file = "psutil-5.9.4-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:6001c809253a29599bc0dfd5179d9f8a5779f9dffea1da0f13c53ee568115e1e"}, - {file = "psutil-5.9.4.tar.gz", hash = "sha256:3d7f9739eb435d4b1338944abe23f49584bde5395f27487d2ee25ad9a8774a62"}, + {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, + {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, + {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, + {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, + {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, + {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, + {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, + {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, + {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, + {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, + {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, ] [package.extras] @@ -1766,30 +1761,30 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, ] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" category = "main" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pycparser" @@ -1832,14 +1827,14 @@ test = ["codecov", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "pygments" -version = "2.14.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, - {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, ] [package.extras] @@ -1847,28 +1842,33 @@ plugins = ["importlib-metadata"] [[package]] name = "pylint" -version = "2.13.9" +version = "2.17.4" description = "python code static checker" category = "main" optional = true -python-versions = ">=3.6.2" +python-versions = ">=3.7.2" files = [ - {file = "pylint-2.13.9-py3-none-any.whl", hash = "sha256:705c620d388035bdd9ff8b44c5bcdd235bfb49d276d488dd2c8ff1736aa42526"}, - {file = "pylint-2.13.9.tar.gz", hash = "sha256:095567c96e19e6f57b5b907e67d265ff535e588fe26b12b5ebe1fc5645b2c731"}, + {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, + {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, ] [package.dependencies] -astroid = ">=2.11.5,<=2.12.0-dev0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -dill = ">=0.2" +astroid = ">=2.15.4,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] isort = ">=4.2.5,<6" mccabe = ">=0.6,<0.8" platformdirs = ">=2.2.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} [package.extras] -testutil = ["gitpython (>3)"] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] [[package]] name = "pypandoc" @@ -1899,28 +1899,26 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "7.2.2" +version = "7.3.1" description = "pytest: simple powerful testing with Python" category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"}, - {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"}, + {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, + {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] [package.dependencies] -attrs = ">=19.2.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] [[package]] name = "pytest-cov" @@ -1970,29 +1968,30 @@ files = [ [[package]] name = "pyvista" -version = "0.36.1" +version = "0.39.1" description = "Easier Pythonic interface to VTK" category = "main" optional = false -python-versions = ">=3.7.*" +python-versions = ">=3.8" files = [ - {file = "pyvista-0.36.1-py3-none-any.whl", hash = "sha256:6166fcdd16515e93d24acad490d121e6a251501dc929b178a0e06bab133c415e"}, - {file = "pyvista-0.36.1.tar.gz", hash = "sha256:b84460a9a33967d2e9a03555907d7883ff7c21ee957e4b95c096d796f6841bf9"}, + {file = "pyvista-0.39.1-py3-none-any.whl", hash = "sha256:d4c9c314d0a1151a950a7dba67505e3148385ae0f7974f614252700f48cc01f4"}, + {file = "pyvista-0.39.1.tar.gz", hash = "sha256:0023b7f6dc8a2ca4f79ec5c20a025b44910c1d1fbae9e00e13af73f3fda5d2d6"}, ] [package.dependencies] -appdirs = "*" -imageio = "*" +matplotlib = ">=3.0.1" numpy = "*" pillow = "*" +pooch = "*" scooby = ">=0.5.1" vtk = "*" [package.extras] -all = ["cmocean", "colorcet", "ipyvtklink", "matplotlib", "meshio (>=5.2)", "pythreejs"] -colormaps = ["cmocean", "colorcet", "matplotlib"] -io = ["meshio (>=5.2)"] -jupyter = ["ipyvtklink", "pythreejs"] +all = ["cmocean", "colorcet", "imageio", "ipyvtklink", "ipywidgets", "jupyter-server-proxy", "meshio (>=5.2)", "nest-asyncio", "panel", "pythreejs", "trame (>=2.2.6)", "trame-client (>=2.4.2)", "trame-server (>=2.8.0)", "trame-vtk (>=2.4.0)"] +colormaps = ["cmocean", "colorcet"] +io = ["imageio", "meshio (>=5.2)"] +jupyter = ["ipyvtklink", "ipywidgets", "jupyter-server-proxy", "nest-asyncio", "panel", "pythreejs", "trame (>=2.2.6)", "trame-client (>=2.4.2)", "trame-server (>=2.8.0)", "trame-vtk (>=2.4.0)"] +trame = ["trame (>=2.2.6)", "trame-client (>=2.4.2)", "trame-server (>=2.8.0)", "trame-vtk (>=2.4.0)"] [[package]] name = "pywin32-ctypes" @@ -2078,21 +2077,21 @@ md = ["cmarkgfm (>=0.8.0)"] [[package]] name = "requests" -version = "2.28.2" +version = "2.30.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" files = [ - {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, - {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, + {file = "requests-2.30.0-py3-none-any.whl", hash = "sha256:10e94cc4f3121ee6da529d358cdaeaff2f1c409cd377dbc72b825852f2f7e294"}, + {file = "requests-2.30.0.tar.gz", hash = "sha256:239d7d4458afcb28a692cdd298d87542235f4ca8d36d03a15bfc128a6559a2f4"}, ] [package.dependencies] certifi = ">=2017.4.17" charset-normalizer = ">=2,<4" idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" +urllib3 = ">=1.21.1,<3" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] @@ -2100,14 +2099,14 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.10.1" +version = "1.0.0" description = "A utility belt for advanced users of python-requests" category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "requests-toolbelt-0.10.1.tar.gz", hash = "sha256:62e09f7ff5ccbda92772a29f394a49c3ad6cb181d568b1337626b2abb628a63d"}, - {file = "requests_toolbelt-0.10.1-py2.py3-none-any.whl", hash = "sha256:18565aa58116d9951ac39baa288d3adb5b3ff975c4f25eee78555d89e8f247f7"}, + {file = "requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6"}, + {file = "requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06"}, ] [package.dependencies] @@ -2130,14 +2129,14 @@ idna2008 = ["idna"] [[package]] name = "rich" -version = "13.3.3" +version = "13.3.5" description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" category = "main" optional = true python-versions = ">=3.7.0" files = [ - {file = "rich-13.3.3-py3-none-any.whl", hash = "sha256:540c7d6d26a1178e8e8b37e9ba44573a3cd1464ff6348b99ee7061b95d1c6333"}, - {file = "rich-13.3.3.tar.gz", hash = "sha256:dc84400a9d842b3a9c5ff74addd8eb798d155f36c1c91303888e0a66850d2a15"}, + {file = "rich-13.3.5-py3-none-any.whl", hash = "sha256:69cdf53799e63f38b95b9bf9c875f8c90e78dd62b2f00c13a911c7a3b9fa4704"}, + {file = "rich-13.3.5.tar.gz", hash = "sha256:2d11b9b8dd03868f09b4fffadc84a6a8cda574e40dc90821bd845720ebb8e89c"}, ] [package.dependencies] @@ -2163,16 +2162,55 @@ files = [ [package.dependencies] pyasn1 = ">=0.1.3" +[[package]] +name = "scipy" +version = "1.9.3" +description = "Fundamental algorithms for scientific computing in Python" +category = "main" +optional = true +python-versions = ">=3.8" +files = [ + {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, + {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, + {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, + {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, + {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, + {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, + {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +] + +[package.dependencies] +numpy = ">=1.18.5,<1.26.0" + +[package.extras] +dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] +test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "scooby" -version = "0.7.1" +version = "0.7.2" description = "A Great Dane turned Python environment detective" category = "main" optional = false -python-versions = ">=3.7.*" +python-versions = ">=3.7" files = [ - {file = "scooby-0.7.1-py3-none-any.whl", hash = "sha256:1a567fb59ffe1b569f52485c660914f7720b583e2c4733ded6cca517934374a3"}, - {file = "scooby-0.7.1.tar.gz", hash = "sha256:52014f4681bcc3295932e0f3d94b69e40e6195a6965b34e68941312ce6b636de"}, + {file = "scooby-0.7.2-py3-none-any.whl", hash = "sha256:75b77d22ecc22a5578fb0bb2957e8d024fa863fe905cd43447a86860afe37978"}, + {file = "scooby-0.7.2.tar.gz", hash = "sha256:6ba082ede5a82952b42538f913b3dfe3581ab79f5628e6c6efd3481f6cb5756e"}, ] [package.extras] @@ -2196,14 +2234,14 @@ jeepney = ">=0.6" [[package]] name = "setuptools" -version = "67.6.1" +version = "67.7.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false python-versions = ">=3.7" files = [ - {file = "setuptools-67.6.1-py3-none-any.whl", hash = "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078"}, - {file = "setuptools-67.6.1.tar.gz", hash = "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a"}, + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, ] [package.extras] @@ -2237,14 +2275,14 @@ files = [ [[package]] name = "soupsieve" -version = "2.4" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "soupsieve-2.4-py3-none-any.whl", hash = "sha256:49e5368c2cda80ee7e84da9dbe3e110b70a4575f196efb74e51b94549d921955"}, - {file = "soupsieve-2.4.tar.gz", hash = "sha256:e28dba9ca6c7c00173e34e4ba57448f0688bb681b7c5e8bf4971daafc093d69a"}, + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, ] [[package]] @@ -2363,14 +2401,14 @@ sphinx = ">=3" [[package]] name = "sphinxcontrib-applehelp" -version = "1.0.2" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +version = "1.0.4" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" category = "main" optional = true -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, + {file = "sphinxcontrib-applehelp-1.0.4.tar.gz", hash = "sha256:828f867945bbe39817c210a1abfd1bc4895c8b73fcaade56d45357a348a07d7e"}, + {file = "sphinxcontrib_applehelp-1.0.4-py3-none-any.whl", hash = "sha256:29d341f67fb0f6f586b23ad80e072c8e6ad0b48417db2bde114a4c9746feb228"}, ] [package.extras] @@ -2395,14 +2433,14 @@ test = ["pytest"] [[package]] name = "sphinxcontrib-htmlhelp" -version = "2.0.0" +version = "2.0.1" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" category = "main" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, + {file = "sphinxcontrib-htmlhelp-2.0.1.tar.gz", hash = "sha256:0cbdd302815330058422b98a113195c9249825d681e18f11e8b1f78a2f11efff"}, + {file = "sphinxcontrib_htmlhelp-2.0.1-py3-none-any.whl", hash = "sha256:c38cb46dccf316c79de6e5515e1770414b797162b23cd3d06e67020e1d2a6903"}, ] [package.extras] @@ -2468,6 +2506,18 @@ files = [ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +category = "main" +optional = true +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, + {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, +] + [[package]] name = "tqdm" version = "4.65.0" @@ -2512,46 +2562,12 @@ rfc3986 = ">=1.4.0" rich = ">=12.0.0" urllib3 = ">=1.26.0" -[[package]] -name = "typed-ast" -version = "1.5.4" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "main" -optional = true -python-versions = ">=3.6" -files = [ - {file = "typed_ast-1.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:669dd0c4167f6f2cd9f57041e03c3c2ebf9063d0757dc89f79ba1daa2bfca9d4"}, - {file = "typed_ast-1.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:211260621ab1cd7324e0798d6be953d00b74e0428382991adfddb352252f1d62"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:267e3f78697a6c00c689c03db4876dd1efdfea2f251a5ad6555e82a26847b4ac"}, - {file = "typed_ast-1.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c542eeda69212fa10a7ada75e668876fdec5f856cd3d06829e6aa64ad17c8dfe"}, - {file = "typed_ast-1.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:a9916d2bb8865f973824fb47436fa45e1ebf2efd920f2b9f99342cb7fab93f72"}, - {file = "typed_ast-1.5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:79b1e0869db7c830ba6a981d58711c88b6677506e648496b1f64ac7d15633aec"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a94d55d142c9265f4ea46fab70977a1944ecae359ae867397757d836ea5a3f47"}, - {file = "typed_ast-1.5.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:183afdf0ec5b1b211724dfef3d2cad2d767cbefac291f24d69b00546c1837fb6"}, - {file = "typed_ast-1.5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:639c5f0b21776605dd6c9dbe592d5228f021404dafd377e2b7ac046b0349b1a1"}, - {file = "typed_ast-1.5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf4afcfac006ece570e32d6fa90ab74a17245b83dfd6655a6f68568098345ff6"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed855bbe3eb3715fca349c80174cfcfd699c2f9de574d40527b8429acae23a66"}, - {file = "typed_ast-1.5.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6778e1b2f81dfc7bc58e4b259363b83d2e509a65198e85d5700dfae4c6c8ff1c"}, - {file = "typed_ast-1.5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:0261195c2062caf107831e92a76764c81227dae162c4f75192c0d489faf751a2"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2efae9db7a8c05ad5547d522e7dbe62c83d838d3906a3716d1478b6c1d61388d"}, - {file = "typed_ast-1.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7d5d014b7daa8b0bf2eaef684295acae12b036d79f54178b92a2b6a56f92278f"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:370788a63915e82fd6f212865a596a0fefcbb7d408bbbb13dea723d971ed8bdc"}, - {file = "typed_ast-1.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4e964b4ff86550a7a7d56345c7864b18f403f5bd7380edf44a3c1fb4ee7ac6c6"}, - {file = "typed_ast-1.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:683407d92dc953c8a7347119596f0b0e6c55eb98ebebd9b23437501b28dcbb8e"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4879da6c9b73443f97e731b617184a596ac1235fe91f98d279a7af36c796da35"}, - {file = "typed_ast-1.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3e123d878ba170397916557d31c8f589951e353cc95fb7f24f6bb69adc1a8a97"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebd9d7f80ccf7a82ac5f88c521115cc55d84e35bf8b446fcd7836eb6b98929a3"}, - {file = "typed_ast-1.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98f80dee3c03455e92796b58b98ff6ca0b2a6f652120c263efdba4d6c5e58f72"}, - {file = "typed_ast-1.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:0fdbcf2fef0ca421a3f5912555804296f0b0960f0418c440f5d6d3abb549f3e1"}, - {file = "typed_ast-1.5.4.tar.gz", hash = "sha256:39e21ceb7388e4bb37f4c679d72707ed46c2fbf2a5609b8b8ebc4b067d977df2"}, -] - [[package]] name = "typing-extensions" version = "4.5.0" description = "Backported and Experimental Type Hints for Python 3.7+" category = "main" -optional = false +optional = true python-versions = ">=3.7" files = [ {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"}, @@ -2572,42 +2588,42 @@ files = [ [[package]] name = "urllib3" -version = "1.26.15" +version = "2.0.2" description = "HTTP library with thread-safe connection pooling, file post, and more." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7" files = [ - {file = "urllib3-1.26.15-py2.py3-none-any.whl", hash = "sha256:aa751d169e23c7479ce47a0cb0da579e3ede798f994f5816a74e4f4500dcea42"}, - {file = "urllib3-1.26.15.tar.gz", hash = "sha256:8a388717b9476f934a21484e8c8e61875ab60644d29b9b39e11e4b9dc1c6b305"}, + {file = "urllib3-2.0.2-py3-none-any.whl", hash = "sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"}, + {file = "urllib3-2.0.2.tar.gz", hash = "sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "virtualenv" -version = "20.21.0" +version = "20.23.0" description = "Virtual Python Environment builder" category = "main" optional = true python-versions = ">=3.7" files = [ - {file = "virtualenv-20.21.0-py3-none-any.whl", hash = "sha256:31712f8f2a17bd06234fa97fdf19609e789dd4e3e4bf108c3da71d710651adbc"}, - {file = "virtualenv-20.21.0.tar.gz", hash = "sha256:f50e3e60f990a0757c9b68333c9fdaa72d7188caa417f96af9e52407831a3b68"}, + {file = "virtualenv-20.23.0-py3-none-any.whl", hash = "sha256:6abec7670e5802a528357fdc75b26b9f57d5d92f29c5462ba0fbe45feacc685e"}, + {file = "virtualenv-20.23.0.tar.gz", hash = "sha256:a85caa554ced0c0afbd0d638e7e2d7b5f92d23478d05d17a76daeac8f279f924"}, ] [package.dependencies] distlib = ">=0.3.6,<1" -filelock = ">=3.4.1,<4" -importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.8\""} -platformdirs = ">=2.4,<4" +filelock = ">=3.11,<4" +platformdirs = ">=3.2,<4" [package.extras] -docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] -test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.3)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.7.1)", "time-machine (>=2.9)"] [[package]] name = "vtk" @@ -2761,13 +2777,13 @@ docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [extras] -all = ["Sphinx", "ansys-sphinx-theme", "build", "mypy", "mypy-extensions", "numpydoc", "pre-commit", "pylint", "pypandoc", "pytest", "pytest-cov", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery", "twine"] +all = ["Sphinx", "ansys-sphinx-theme", "build", "mypy", "mypy-extensions", "numpydoc", "pre-commit", "pylint", "pypandoc", "pytest", "pytest-cov", "scipy", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery", "twine"] build = ["build", "twine"] -docs = ["Sphinx", "ansys-sphinx-theme", "numpydoc", "pypandoc", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery"] +docs = ["Sphinx", "ansys-sphinx-theme", "numpydoc", "pypandoc", "scipy", "sphinx-autodoc-typehints", "sphinx-copybutton", "sphinx-design", "sphinx_gallery"] pre-commit = ["mypy", "mypy-extensions", "pre-commit", "pylint"] test = ["pytest", "pytest-cov"] [metadata] lock-version = "2.0" -python-versions = ">=3.7,<4.0" -content-hash = "eb10e800339b8daf40eeb9a065572b8db37fd8773c75424bfaaf92c71d78eacf" +python-versions = ">=3.8,<4.0" +content-hash = "e05fd2216b23e0048f906da73f5583fe6a9bac9e8d159df932ae0e4c202dda65" diff --git a/pyproject.toml b/pyproject.toml index e558a685c..11ec1f599 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ license = "MIT" authors = ["ANSYS, Inc. "] maintainers = ["PyAnsys developers "] readme = "README.rst" -repository = "https://github.com/pyansys/pydpf-composites" +repository = "https://github.com/ansys/pydpf-composites" documentation = "https://composites.dpf.docs.pyansys.com" classifiers = [ "Development Status :: 4 - Beta", @@ -24,12 +24,8 @@ packages = [ ] [tool.poetry.dependencies] -python = ">=3.7,<4.0" -numpy = [ - {version = ">=1.19,<1.22", python = ">=3.7,<3.8"}, - {version = "^1.22", python = ">=3.8"} -] -importlib-metadata = {version = "^4.0", python = "<3.8"} +python = ">=3.8,<4.0" +numpy = "^1.22" build = {version = "^0.8.0", optional = true} twine = {version = "^4.0.1", optional = true} Sphinx = {version = "^5.0.1", optional = true} @@ -41,18 +37,18 @@ sphinx-design = {version = "^0.3.0", optional = true} pypandoc = {version = "^1.8.1", optional = true} pytest = {version = "^7.1.2", optional = true} pytest-cov = {version = "^3.0.0", optional = true} -mypy = {version = "^0.931", optional = true} -mypy-extensions = {version = "^0.4.3", optional = true} +mypy = {version = "^1.2.0", optional = true} +mypy-extensions = {version = "^1.0.0", optional = true} # If this version changes also the link in doc/src/conf.py intersphinx-mapping has to change ansys-dpf-core = ">=0.8,<1" vtk = {version = "*"} matplotlib = {version = "^3.5.0"} -pyvista = {version = "^0.36.1"} +pyvista = {version = ">=0.36.1,<1"} pre-commit = {version = "*", optional = true} # Upper bound because there is a problem with examples in versions > 1.20.1 sphinx-autodoc-typehints = {version = "^1.19,<1.20.2", optional = true} pylint = {version = "^2.13", optional = true} - +scipy = {version = ">=1.9.0", optional = true} [tool.poetry.extras] all = [ @@ -71,10 +67,11 @@ all = [ "pylint", "pre-commit", "pypandoc", + "scipy", "sphinx-autodoc-typehints", ] docs = ["Sphinx", "ansys-sphinx-theme", "sphinx-copybutton", "numpydoc", "sphinx_gallery", - "pypandoc", "sphinx-autodoc-typehints", "sphinx-design"] + "pypandoc", "sphinx-autodoc-typehints", "sphinx-design", "scipy"] test = ["pytest", "pytest-cov"] build = ["build", "twine"] pre-commit = ["pre-commit", "mypy", "mypy-extensions", "pylint"] @@ -120,6 +117,6 @@ ignored-classes = [ ] [tool.mypy] -python_version = 3.7 +python_version = 3.8 mypy_path = "$MYPY_CONFIG_FILE_DIR/src:$MYPY_CONFIG_FILE_DIR/tests" ignore_missing_imports = true diff --git a/src/ansys/dpf/composites/_indexer.py b/src/ansys/dpf/composites/_indexer.py index 71df0f3be..84931c0a9 100644 --- a/src/ansys/dpf/composites/_indexer.py +++ b/src/ansys/dpf/composites/_indexer.py @@ -1,25 +1,17 @@ """Indexer helper classes.""" from dataclasses import dataclass -import sys -from typing import TYPE_CHECKING, Optional, cast - -if sys.version_info >= (3, 8): - from typing import Protocol -else: - from typing_extensions import Protocol +from typing import Optional, Protocol, cast from ansys.dpf.core import Field, PropertyField, Scoping import numpy as np - -if TYPE_CHECKING: - from numpy.typing import NDArray +from numpy.typing import NDArray @dataclass(frozen=True) class IndexToId: """Mapping maps id to index.""" - mapping: "NDArray[np.int64]" + mapping: NDArray[np.int64] max_id: int @@ -33,7 +25,7 @@ def setup_index_by_id(scoping: Scoping) -> IndexToId: scoping: DPF scoping """ - indices: "NDArray[np.int64]" = np.full(max(scoping.ids) + 1, -1, dtype=np.int64) + indices: NDArray[np.int64] = np.full(max(scoping.ids) + 1, -1, dtype=np.int64) indices[scoping.ids] = np.arange(len(scoping.ids)) return IndexToId(mapping=indices, max_id=len(indices) - 1) @@ -48,7 +40,7 @@ def by_id(self, entity_id: int) -> Optional[np.int64]: class PropertyFieldIndexerArrayValue(Protocol): """Protocol for array valued property field indexer.""" - def by_id(self, entity_id: int) -> Optional["NDArray[np.int64]"]: + def by_id(self, entity_id: int) -> Optional[NDArray[np.int64]]: """Get index by id.""" @@ -70,7 +62,7 @@ def __init__(self, field: PropertyField): index_by_id = setup_index_by_id(field.scoping) self._indices = index_by_id.mapping self._max_id = index_by_id.max_id - self._data: "NDArray[np.int64]" = np.array(field.data, dtype=np.int64) + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) def by_id(self, entity_id: int) -> Optional[np.int64]: """Get index by id. @@ -96,7 +88,7 @@ def __init__(self, field: Field): index_by_id = setup_index_by_id(field.scoping) self._indices = index_by_id.mapping self._max_id = index_by_id.max_id - self._data: "NDArray[np.double]" = np.array(field.data, dtype=np.double) + self._data: NDArray[np.double] = np.array(field.data, dtype=np.double) def by_id(self, entity_id: int) -> Optional[np.double]: """Get index by id. @@ -120,7 +112,7 @@ def __init__(self, field: PropertyField): """Create indexer and get data.""" index_by_id = setup_index_by_id(field.scoping) self._indices = index_by_id.mapping - self._data: "NDArray[np.int64]" = np.array(field.data, dtype=np.int64) + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) def by_id(self, entity_id: int) -> Optional[np.int64]: """Get index by id. @@ -141,14 +133,14 @@ def __init__(self, field: PropertyField): self._indices = index_by_id.mapping self._max_id = index_by_id.max_id - self._data: "NDArray[np.int64]" = np.array(field.data, dtype=np.int64) + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) self._n_components = field.component_count - self._data_pointer: "NDArray[np.int64]" = np.append( + self._data_pointer: NDArray[np.int64] = np.append( field._data_pointer, len(self._data) * self._n_components ) - def by_id(self, entity_id: int) -> Optional["NDArray[np.int64]"]: + def by_id(self, entity_id: int) -> Optional[NDArray[np.int64]]: """Get index by id. Parameters @@ -162,7 +154,7 @@ def by_id(self, entity_id: int) -> Optional["NDArray[np.int64]"]: if idx < 0: return None return cast( - "NDArray[np.int64]", + NDArray[np.int64], self._data[ self._data_pointer[idx] // self._n_components : self._data_pointer[idx + 1] @@ -180,14 +172,14 @@ def __init__(self, field: Field): self._indices = index_by_id.mapping self._max_id = index_by_id.max_id - self._data: "NDArray[np.double]" = np.array(field.data, dtype=np.double) + self._data: NDArray[np.double] = np.array(field.data, dtype=np.double) self._n_components = field.component_count - self._data_pointer: "NDArray[np.int64]" = np.append( + self._data_pointer: NDArray[np.int64] = np.append( field._data_pointer, len(self._data) * self._n_components ) - def by_id(self, entity_id: int) -> Optional["NDArray[np.double]"]: + def by_id(self, entity_id: int) -> Optional[NDArray[np.double]]: """Get index by id. Parameters @@ -201,7 +193,7 @@ def by_id(self, entity_id: int) -> Optional["NDArray[np.double]"]: if idx < 0: return None return cast( - "NDArray[np.double]", + NDArray[np.double], self._data[ self._data_pointer[idx] // self._n_components : self._data_pointer[idx + 1] @@ -218,15 +210,15 @@ def __init__(self, field: PropertyField): index_by_id = setup_index_by_id(field.scoping) self._indices = index_by_id.mapping - self._data: "NDArray[np.int64]" = np.array(field.data, dtype=np.int64) + self._data: NDArray[np.int64] = np.array(field.data, dtype=np.int64) self._n_components = field.component_count - self._data_pointer: "NDArray[np.int64]" = np.append( + self._data_pointer: NDArray[np.int64] = np.append( field._data_pointer, len(self._data) * self._n_components ) - def by_id(self, entity_id: int) -> Optional["NDArray[np.int64]"]: + def by_id(self, entity_id: int) -> Optional[NDArray[np.int64]]: """Get index by id. Parameters @@ -237,7 +229,7 @@ def by_id(self, entity_id: int) -> Optional["NDArray[np.int64]"]: if idx < 0: return None return cast( - "NDArray[np.int64]", + NDArray[np.int64], self._data[ self._data_pointer[idx] // self._n_components : self._data_pointer[idx + 1] diff --git a/src/ansys/dpf/composites/composite_model.py b/src/ansys/dpf/composites/composite_model.py index f43d1bf76..5dc6145cd 100644 --- a/src/ansys/dpf/composites/composite_model.py +++ b/src/ansys/dpf/composites/composite_model.py @@ -1,16 +1,12 @@ """Composite Model.""" from dataclasses import dataclass -from typing import TYPE_CHECKING, Collection, Dict, List, Optional, Sequence, cast +from typing import Collection, Dict, List, Optional, Sequence, cast import ansys.dpf.core as dpf from ansys.dpf.core import FieldsContainer, MeshedRegion, Operator, UnitSystem from ansys.dpf.core.server_types import BaseServer import numpy as np - -from .unit_system import UnitSystemProvider, get_unit_system - -if TYPE_CHECKING: - from numpy.typing import NDArray +from numpy.typing import NDArray from .data_sources import ( CompositeDataSources, @@ -29,6 +25,8 @@ from .layup_info.material_properties import MaterialProperty, get_constant_property_dict from .result_definition import FailureMeasure, ResultDefinition, ResultDefinitionScope from .sampling_point import SamplingPoint +from .server_helpers import upload_continuous_fiber_composite_files_to_server +from .unit_system import UnitSystemProvider, get_unit_system __all__ = ("CompositeScope", "CompositeInfo", "CompositeModel") @@ -106,7 +104,8 @@ class CompositeModel: On initialization, the ``CompositeModel`` class automatically adds composite lay-up information to the meshed regions. It prepares the providers for different lay-up properties - so that they can be efficiently evaluated. + so that they can be efficiently evaluated. The composite_files provided are automatically + uploaded to the server if needed. .. note:: @@ -148,11 +147,13 @@ def __init__( default_unit_system: Optional[UnitSystem] = None, ): """Initialize data providers and add composite information to meshed region.""" - self._core_model = dpf.Model(composite_files.rst, server=server) + self._composite_files = upload_continuous_fiber_composite_files_to_server( + composite_files, server + ) + self._core_model = dpf.Model(self._composite_files.rst, server=server) self._server = server - self._composite_files = composite_files - self._data_sources = get_composites_data_sources(composite_files) + self._data_sources = get_composites_data_sources(self._composite_files) self._unit_system = get_unit_system(self._data_sources.rst, default_unit_system) @@ -180,6 +181,11 @@ def composite_definition_labels(self) -> Sequence[str]: """ return list(self._composite_infos.keys()) + @property + def composite_files(self) -> ContinuousFiberCompositesFiles: + """Get the composite file paths on the server.""" + return self._composite_files + def get_mesh(self, composite_definition_label: Optional[str] = None) -> MeshedRegion: """Get the underlying DPF meshed region. @@ -397,7 +403,7 @@ def get_property_for_all_layers( layup_property: LayerProperty, element_id: int, composite_definition_label: Optional[str] = None, - ) -> Optional["NDArray[np.double]"]: + ) -> Optional[NDArray[np.double]]: """Get a layer property for an element ID. Returns a numpy array with the values of the property for all the layers. @@ -516,10 +522,10 @@ def get_constant_property_dict( mesh=self.get_mesh(composite_definition_label), ) - def get_result_times_or_frequencies(self) -> "NDArray[np.double]": + def get_result_times_or_frequencies(self) -> NDArray[np.double]: """Get the times or frequencies in the result file.""" return cast( - "NDArray[np.double]", self._core_model.metadata.time_freq_support.time_frequencies.data + NDArray[np.double], self._core_model.metadata.time_freq_support.time_frequencies.data ) def add_interlaminar_normal_stresses( diff --git a/src/ansys/dpf/composites/data_sources.py b/src/ansys/dpf/composites/data_sources.py index c500baf4d..fbc42add4 100644 --- a/src/ansys/dpf/composites/data_sources.py +++ b/src/ansys/dpf/composites/data_sources.py @@ -41,6 +41,9 @@ class ContinuousFiberCompositesFiles: rst: _PATH composite: Dict[str, CompositeDefinitionFiles] engineering_data: _PATH + # True if files are local and false if files + # have already been uploaded to the server + files_are_local: bool = True @dataclass @@ -50,6 +53,9 @@ class ShortFiberCompositesFiles: rst: _PATH dsdat: _PATH engineering_data: _PATH + # True if files are local and false if files + # have already been uploaded to the server + files_are_local: bool = True @dataclass(frozen=True) diff --git a/src/ansys/dpf/composites/example_helper/__init__.py b/src/ansys/dpf/composites/example_helper/__init__.py index 9d60a9ad9..57027f6ed 100644 --- a/src/ansys/dpf/composites/example_helper/__init__.py +++ b/src/ansys/dpf/composites/example_helper/__init__.py @@ -8,71 +8,13 @@ import ansys.dpf.core as dpf -from .._typing_helper import PATH as _PATH from ..data_sources import ( CompositeDefinitionFiles, ContinuousFiberCompositesFiles, ShortFiberCompositesFiles, ) -EXAMPLE_REPO = "https://github.com/pyansys/example-data/raw/master/pydpf-composites/" - - -def upload_short_fiber_composite_files_to_server( - data_files: ShortFiberCompositesFiles, server: dpf.server -) -> ShortFiberCompositesFiles: - """Upload short fiber composites files to server. - - Parameters - ---------- - data_files - server - """ - - def upload(filename: _PATH) -> str: - return cast(str, dpf.upload_file_in_tmp_folder(filename, server=server)) - - return ShortFiberCompositesFiles( - rst=upload(data_files.engineering_data), - dsdat=upload(data_files.dsdat), - engineering_data=upload(data_files.engineering_data), - ) - - -def upload_continuous_fiber_composite_files_to_server( - data_files: ContinuousFiberCompositesFiles, server: dpf.server -) -> ContinuousFiberCompositesFiles: - """Upload continuous fiber composites files to server. - - Note: If server.local_server == True the data_files are returned unmodified. - - Parameters - ---------- - data_files - server - """ - if server.local_server: - return data_files - - def upload(filename: _PATH) -> _PATH: - return cast(str, dpf.upload_file_in_tmp_folder(filename, server=server)) - - all_composite_files = {} - for key, composite_files_by_scope in data_files.composite.items(): - composite_definition_files = CompositeDefinitionFiles( - definition=upload(composite_files_by_scope.definition), - ) - - if composite_files_by_scope.mapping is not None: - composite_definition_files.mapping = upload(composite_files_by_scope.mapping) - - all_composite_files[key] = composite_definition_files - - return ContinuousFiberCompositesFiles( - rst=upload(data_files.rst), - engineering_data=upload(data_files.engineering_data), - composite=all_composite_files, - ) +EXAMPLE_REPO = "https://github.com/ansys/example-data/raw/master/pydpf-composites/" @dataclass @@ -220,6 +162,7 @@ def get_server_path(filename: str) -> str: rst=get_server_path(example_files.files.rst), dsdat=get_server_path(example_files.files.dsdat), engineering_data=get_server_path(example_files.files.engineering_data), + files_are_local=False, ) @@ -259,4 +202,5 @@ def get_server_path(filename: str) -> str: rst=get_server_path(example_files.files.rst), engineering_data=get_server_path(example_files.files.engineering_data), composite=all_composite_files, + files_are_local=False, ) diff --git a/src/ansys/dpf/composites/layup_info/_layup_info.py b/src/ansys/dpf/composites/layup_info/_layup_info.py index 0e90278cd..a1a641817 100644 --- a/src/ansys/dpf/composites/layup_info/_layup_info.py +++ b/src/ansys/dpf/composites/layup_info/_layup_info.py @@ -1,14 +1,12 @@ """Lay-up information provider.""" from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, Collection, Dict, List, Optional, Sequence, Union, cast +from typing import Any, Collection, Dict, List, Optional, Sequence, Union, cast import ansys.dpf.core as dpf from ansys.dpf.core import DataSources, MeshedRegion, Operator, PropertyField import numpy as np - -if TYPE_CHECKING: - from numpy.typing import NDArray +from numpy.typing import NDArray from .._indexer import ( FieldIndexerNoDataPointer, @@ -84,7 +82,7 @@ class ElementInfo: n_spots: int is_layered: bool element_type: int - dpf_material_ids: "NDArray[np.int64]" + dpf_material_ids: NDArray[np.int64] is_shell: bool number_of_nodes_per_spot_plane: int @@ -112,7 +110,6 @@ def _is_shell(apdl_element_type: np.int64) -> bool: def _get_n_spots(apdl_element_type: np.int64, keyopt_8: np.int64, keyopt_3: np.int64) -> int: - if keyopt_3 == 0: if apdl_element_type == 185 or apdl_element_type == 186: return 0 @@ -127,12 +124,12 @@ def _get_n_spots(apdl_element_type: np.int64, keyopt_8: np.int64, keyopt_3: np.i ) from exc -def _get_corner_nodes_by_element_type_array() -> "NDArray[np.int64]": +def _get_corner_nodes_by_element_type_array() -> NDArray[np.int64]: # Precompute n_corner_nodes for all element types # corner_nodes_by_element_type by can be indexed by element type to get the number of # corner nodes. If negative value is returned number of corner nodes is not available. all_element_types = [int(e.value) for e in dpf.element_types if e.value >= 0] - corner_nodes_by_element_type: "NDArray[np.int64]" = np.full( + corner_nodes_by_element_type: NDArray[np.int64] = np.full( np.amax(all_element_types) + 1, -1, dtype=np.int64 ) @@ -218,6 +215,9 @@ def get_dpf_material_id_by_analyis_ply_map( layer_index = analysis_ply_info_provider.get_layer_index_by_element_id( element_id_int ) + assert ( + layer_index is not None + ), f"No layer index found for element with id {element_id_int}." analysis_ply_to_material_map[analysis_ply_name] = element_info.dpf_material_ids[ layer_index ] @@ -241,7 +241,6 @@ def get_analysis_ply_index_to_name_map( """ analysis_ply_name_to_index_map = {} with mesh.property_field("layer_to_analysis_ply").as_local_field() as local_field: - for analysis_ply_name in get_all_analysis_ply_names(mesh): analysis_ply_property_field = _get_analysis_ply( mesh, analysis_ply_name, skip_check=True @@ -355,6 +354,8 @@ def get_element_info(self, element_id: int) -> Optional[ElementInfo]: n_spots = _get_n_spots(apdl_element_type, keyopt_8, keyopt_3) dpf_material_ids: Any = [] element_type = self.dpf_element_types.by_id(element_id) + if element_type is None: + raise IndexError(f"No DPF element type for element with id {element_id}.") layer_data = self.layer_indices.by_id(element_id) if layer_data is not None: @@ -366,7 +367,7 @@ def get_element_info(self, element_id: int) -> Optional[ElementInfo]: corner_nodes_dpf = self.corner_nodes_by_element_type[element_type] if corner_nodes_dpf < 0: - raise Exception(f"Invalid number of corner nodes for element with type {element_type}") + raise ValueError(f"Invalid number of corner nodes for element with type {element_type}") is_shell = _is_shell(apdl_element_type) number_of_nodes_per_spot_plane = -1 if is_layered: @@ -486,7 +487,7 @@ def __init__(self, layup_provider: Operator, mesh: MeshedRegion): mesh.property_field("layer_to_analysis_ply") ) - def get_layer_angles(self, element_id: int) -> Optional["NDArray[np.double]"]: + def get_layer_angles(self, element_id: int) -> Optional[NDArray[np.double]]: """Get angles for all layers. Returns None if element is not layered. Parameters @@ -496,7 +497,7 @@ def get_layer_angles(self, element_id: int) -> Optional["NDArray[np.double]"]: """ return self._angle_indexer.by_id(element_id) - def get_layer_thicknesses(self, element_id: int) -> Optional["NDArray[np.double]"]: + def get_layer_thicknesses(self, element_id: int) -> Optional[NDArray[np.double]]: """Get thicknesses for all layers. Returns None if element is not layered. Parameters @@ -507,7 +508,7 @@ def get_layer_thicknesses(self, element_id: int) -> Optional["NDArray[np.double] """ return self._thickness_indexer.by_id(element_id) - def get_layer_shear_angles(self, element_id: int) -> Optional["NDArray[np.double]"]: + def get_layer_shear_angles(self, element_id: int) -> Optional[NDArray[np.double]]: """Get shear angle for all layers. Returns None if element is not layered. Parameters diff --git a/src/ansys/dpf/composites/sampling_point.py b/src/ansys/dpf/composites/sampling_point.py index 84dea82c1..e69b6ea36 100644 --- a/src/ansys/dpf/composites/sampling_point.py +++ b/src/ansys/dpf/composites/sampling_point.py @@ -2,18 +2,15 @@ import dataclasses import hashlib import json -from typing import TYPE_CHECKING, Any, Collection, Dict, List, Sequence, Union, cast +from typing import Any, Collection, Dict, List, Sequence, Union, cast import ansys.dpf.core as dpf from ansys.dpf.core.server import get_or_create_server from ansys.dpf.core.server_types import BaseServer -from matplotlib.axes import SubplotBase from matplotlib.patches import Rectangle import matplotlib.pyplot as plt import numpy as np - -if TYPE_CHECKING: - import numpy.typing as npt +import numpy.typing as npt from .constants import Spot from .result_definition import FailureMeasure, ResultDefinition @@ -212,85 +209,85 @@ def analysis_plies(self) -> Sequence[Any]: return plies @property - def s1(self) -> "npt.NDArray[np.float64]": + def s1(self) -> npt.NDArray[np.float64]: """Stresses in the material 1 direction of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["stresses"]["s1"]) @property - def s2(self) -> "npt.NDArray[np.float64]": + def s2(self) -> npt.NDArray[np.float64]: """Stresses in the material 2 direction of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["stresses"]["s2"]) @property - def s3(self) -> "npt.NDArray[np.float64]": + def s3(self) -> npt.NDArray[np.float64]: """Stresses in the material 3 direction of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["stresses"]["s3"]) @property - def s12(self) -> "npt.NDArray[np.float64]": + def s12(self) -> npt.NDArray[np.float64]: """In-plane shear stresses s12 of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["stresses"]["s12"]) @property - def s13(self) -> "npt.NDArray[np.float64]": + def s13(self) -> npt.NDArray[np.float64]: """Out-of-plane shear stresses s13 of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["stresses"]["s13"]) @property - def s23(self) -> "npt.NDArray[np.float64]": + def s23(self) -> npt.NDArray[np.float64]: """Out-of-plane shear stresses s23 of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["stresses"]["s23"]) @property - def e1(self) -> "npt.NDArray[np.float64]": + def e1(self) -> npt.NDArray[np.float64]: """Strains in the material 1 direction of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["strains"]["e1"]) @property - def e2(self) -> "npt.NDArray[np.float64]": + def e2(self) -> npt.NDArray[np.float64]: """Strains in the material 2 direction of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["strains"]["e2"]) @property - def e3(self) -> "npt.NDArray[np.float64]": + def e3(self) -> npt.NDArray[np.float64]: """Strains in the material 3 direction of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["strains"]["e3"]) @property - def e12(self) -> "npt.NDArray[np.float64]": + def e12(self) -> npt.NDArray[np.float64]: """In-plane shear strains e12 of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["strains"]["e12"]) @property - def e13(self) -> "npt.NDArray[np.float64]": + def e13(self) -> npt.NDArray[np.float64]: """Out-of-plane shear strains e13 of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["strains"]["e13"]) @property - def e23(self) -> "npt.NDArray[np.float64]": + def e23(self) -> npt.NDArray[np.float64]: """Out-of-plane shear strains e23 of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["strains"]["e13"]) @property - def inverse_reserve_factor(self) -> "npt.NDArray[np.float64]": + def inverse_reserve_factor(self) -> npt.NDArray[np.float64]: """Critical inverse reserve factor of each ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["failures"]["inverse_reserve_factor"]) @property - def reserve_factor(self) -> "npt.NDArray[np.float64]": + def reserve_factor(self) -> npt.NDArray[np.float64]: """Lowest reserve factor of each ply. This attribute is equivalent to the safety factor. @@ -299,7 +296,7 @@ def reserve_factor(self) -> "npt.NDArray[np.float64]": return np.array(self._results[0]["results"]["failures"]["reserve_factor"]) @property - def margin_of_safety(self) -> "npt.NDArray[np.float64]": + def margin_of_safety(self) -> npt.NDArray[np.float64]: """Lowest margin of safety of each ply. This attribute is equivalent to the safety margin. @@ -314,19 +311,19 @@ def failure_modes(self) -> Sequence[str]: return cast(Sequence[str], self._results[0]["results"]["failures"]["failure_modes"]) @property - def offsets(self) -> "npt.NDArray[np.float64]": + def offsets(self) -> npt.NDArray[np.float64]: """Z coordinates for each interface and ply.""" self._update_and_check_results() return np.array(self._results[0]["results"]["offsets"]) @property - def polar_properties_E1(self) -> "npt.NDArray[np.float64]": + def polar_properties_E1(self) -> npt.NDArray[np.float64]: """Polar property E1 of the laminate.""" self._update_and_check_results() return np.array(self._results[0]["layup"]["polar_properties"]["E1"]) @property - def polar_properties_E2(self) -> "npt.NDArray[np.float64]": + def polar_properties_E2(self) -> npt.NDArray[np.float64]: """Polar property E2 of the laminate.""" if not self._isuptodate or not self._results: self.run() @@ -337,7 +334,7 @@ def polar_properties_E2(self) -> "npt.NDArray[np.float64]": return np.array(self._results[0]["layup"]["polar_properties"]["E2"]) @property - def polar_properties_G12(self) -> "npt.NDArray[np.float64]": + def polar_properties_G12(self) -> npt.NDArray[np.float64]: """Polar property G12 of the laminate.""" if not self._isuptodate or not self._results: self.run() @@ -392,7 +389,7 @@ def run(self) -> None: self._interface_indices = {Spot.BOTTOM: 0, Spot.TOP: 1} elif self._spots_per_ply == 1: raise RuntimeError( - "Result files that only have results at the middle of the ply are " "not supported." + "Result files that only have results at the middle of the ply are not supported." ) self._isuptodate = True @@ -423,7 +420,6 @@ def get_indices( ply_wise_indices.sort() indices = [] if self.analysis_plies: - for ply_index in range(0, self.number_of_plies): indices.extend( [ply_index * self._spots_per_ply + index for index in ply_wise_indices] @@ -435,7 +431,7 @@ def get_offsets_by_spots( self, spots: Collection[Spot] = (Spot.BOTTOM, Spot.MIDDLE, Spot.TOP), core_scale_factor: float = 1.0, - ) -> "npt.NDArray[np.float64]": + ) -> npt.NDArray[np.float64]: """Access the y coordinates of the selected spots (interfaces) for each ply. Parameters @@ -450,7 +446,7 @@ def get_offsets_by_spots( indices = self.get_indices(spots) if core_scale_factor == 1.0: - return cast("npt.NDArray[np.float64]", offsets[indices]) + return cast(npt.NDArray[np.float64], offsets[indices]) thicknesses = [] if not self.analysis_plies: @@ -477,7 +473,7 @@ def get_offsets_by_spots( for i in range(0, self._spots_per_ply): offsets[index * self._spots_per_ply + i] = top_of_previous_ply + step * i - return cast("npt.NDArray[np.float64]", offsets[indices]) + return cast(npt.NDArray[np.float64], offsets[indices]) def get_ply_wise_critical_failures(self) -> List[FailureResult]: """Get the critical failure value and modes per ply.""" @@ -690,15 +686,16 @@ def get_result_plots( axes = gs.subplots(sharex="col", sharey="row") def _get_subplot(axes_obj: Any, current_index: int) -> Any: - if issubclass(axes_obj.__class__, SubplotBase): + try: + return axes_obj[current_index] + except TypeError as exc: if current_index > 0: - raise RuntimeError("Axes plot cannot be indexed.") + raise RuntimeError( + f"{type(axes_obj).__name__} plot cannot be indexed." + ) from exc return axes_obj - else: - if current_index < len(axes_obj): - return axes_obj[current_index] - - raise RuntimeError("get_subplot: index exceeds limit.") + except IndexError as exc: + raise RuntimeError("get_subplot: index exceeds limit.") from exc if num_active_plots > 0: ticks = self.get_offsets_by_spots(spots=[Spot.TOP], core_scale_factor=core_scale_factor) @@ -753,7 +750,6 @@ def _get_subplot(axes_obj: Any, current_index: int) -> Any: ) if show_failure_modes: - middle_offsets = self.get_offsets_by_spots( spots=[Spot.MIDDLE], core_scale_factor=core_scale_factor ) diff --git a/src/ansys/dpf/composites/select_indices.py b/src/ansys/dpf/composites/select_indices.py index aa8eb198d..f05ef647f 100644 --- a/src/ansys/dpf/composites/select_indices.py +++ b/src/ansys/dpf/composites/select_indices.py @@ -1,10 +1,8 @@ """Functions to get elementary indices based on filter input.""" -from typing import TYPE_CHECKING, Collection, Optional +from typing import Collection, Optional import numpy as np - -if TYPE_CHECKING: - from numpy.typing import NDArray +from numpy.typing import NDArray from .constants import Spot from .layup_info import AnalysisPlyInfoProvider, ElementInfo @@ -30,7 +28,7 @@ def get_selected_indices( nodes: Optional[Collection[int]] = None, spots: Optional[Collection[Spot]] = None, disable_checks: bool = False, -) -> "NDArray[np.int64]": +) -> NDArray[np.int64]: """Get elementary indices based on element information, layers, nodes, and spots. Parameters @@ -127,7 +125,7 @@ def get_selected_indices( def get_selected_indices_by_dpf_material_ids( element_info: ElementInfo, dpf_material_ids: Collection[np.int64] -) -> "NDArray[np.int64]": +) -> NDArray[np.int64]: """Get selected indices by DPF material IDs. This method selects all indices that are in a layer with one of the selected materials. @@ -155,7 +153,7 @@ def get_selected_indices_by_dpf_material_ids( def get_selected_indices_by_analysis_ply( analysis_ply_info_provider: AnalysisPlyInfoProvider, element_info: ElementInfo -) -> "NDArray[np.int64]": +) -> NDArray[np.int64]: """Get selected indices by analysis ply. Selects all indices that are in a layer with the given analysis ply diff --git a/src/ansys/dpf/composites/server_helpers/__init__.py b/src/ansys/dpf/composites/server_helpers/__init__.py index febfec102..0a5408a26 100644 --- a/src/ansys/dpf/composites/server_helpers/__init__.py +++ b/src/ansys/dpf/composites/server_helpers/__init__.py @@ -6,5 +6,14 @@ from ._connect_to_or_start_server import connect_to_or_start_server from ._load_plugin import load_composites_plugin +from ._upload_files_to_server import ( + upload_continuous_fiber_composite_files_to_server, + upload_short_fiber_composite_files_to_server, +) -__all__ = ("load_composites_plugin", "connect_to_or_start_server") +__all__ = ( + "load_composites_plugin", + "connect_to_or_start_server", + "upload_short_fiber_composite_files_to_server", + "upload_continuous_fiber_composite_files_to_server", +) diff --git a/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py b/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py index 12bf0af10..a10327176 100644 --- a/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py +++ b/src/ansys/dpf/composites/server_helpers/_connect_to_or_start_server.py @@ -30,7 +30,7 @@ def _wait_until_server_is_up(server: _dpf_server) -> Any: # Small hack to check if the server is up. # The DPF server should check this in the ``connect_to_server`` function, but # that's currently not the case. - # https://github.com/pyansys/pydpf-core/issues/414 + # https://github.com/ansys/pydpf-core/issues/414 # We use the fact that server.version throws an error if the server # is not yet connected. _try_until_timeout( diff --git a/src/ansys/dpf/composites/server_helpers/_load_plugin.py b/src/ansys/dpf/composites/server_helpers/_load_plugin.py index 9a64f56f0..a63fa19c2 100644 --- a/src/ansys/dpf/composites/server_helpers/_load_plugin.py +++ b/src/ansys/dpf/composites/server_helpers/_load_plugin.py @@ -6,24 +6,14 @@ import ansys.dpf.core as dpf from ansys.dpf.core.misc import get_ansys_path from ansys.dpf.core.server_types import BaseServer +from ansys.dpf.gate.errors import DPFServerException -AWP_ROOT_DOCKER = "/ansys_inc/ansys/dpf/server_2023_2_pre1" - -def load_composites_plugin(server: BaseServer, ansys_path: Optional[str] = None) -> None: - r"""Load composites plugins and its dependencies. - - Parameters - ---------- - server: - ansys_path: - Ansys root path, for example C:\Program Files\ANSYS Inc\v232. - If None, it is assumed that all the plugins and their dependencies - are found in the PATH/LD_LIBRARY_PATH. If ansys_path - is set, the composite_operators and - Ans.Dpf.EngineeringData plugins are loaded from their location - in the installer. - """ +def _load_plugins( + server: BaseServer, + awp_root_docker: str, + ansys_path: Optional[str] = None, +) -> None: # The automatic load of the plug can be disabled by the user and so # all plugins which are required for dpf composites are loaded libs = [ @@ -49,17 +39,11 @@ def get_lib_from_name(name: str) -> str: }, } - # March 2023 R.Roos - # the dpf load_plugin method requires an absolute path because the dfp_composites - # plugin is not in the search path. The logic below should support all cases - # except a local gRPC sever on linux (local in-process server on Linux is supported) - # DPF core team thinks about to expose ANSYS_ROOT_FOLDER so that the absolute path - # can be easily constructed here. if not ansys_path: if server.ansys_path: ansys_path = server.ansys_path elif server.os == "posix": - ansys_path = AWP_ROOT_DOCKER + ansys_path = awp_root_docker else: ansys_path = get_ansys_path() @@ -75,3 +59,41 @@ def get_lib_from_name(name: str) -> str: else: library = get_lib_from_name(name) dpf.load_library(library, name, server=server) + + +def load_composites_plugin(server: BaseServer, ansys_path: Optional[str] = None) -> None: + r"""Load composites plugins and its dependencies. + + Parameters + ---------- + server: + ansys_path: + Ansys root path, for example C:\Program Files\ANSYS Inc\v232. + If None, it is assumed that all the plugins and their dependencies + are found in the PATH/LD_LIBRARY_PATH. If ansys_path + is set, the composite_operators and + Ans.Dpf.EngineeringData plugins are loaded from their location + in the installer. + """ + # March 2023 R.Roos + # the dpf load_plugin method requires an absolute path because the dpf_composites + # plugin is not in the search path. The logic below should support all cases + # except a local gRPC sever on linux (local in-process server on Linux is supported) + # DPF core team thinks about to expose ANSYS_ROOT_FOLDER so that the absolute path + # can be easily constructed here. + # Different versions have different awp roots. Here we just try to load the plugins + # from different roots. + possible_awp_roots = [ + "/ansys_inc/ansys/dpf/server_2023_2_pre1", + "/ansys_inc/ansys/dpf/server_2023_2_pre2", + "/ansys_inc/ansys/dpf/server_2024_1_pre0", + ] + + while True: + awp_root_docker = possible_awp_roots.pop() + try: + _load_plugins(server, ansys_path=ansys_path, awp_root_docker=awp_root_docker) + return + except DPFServerException: + if len(possible_awp_roots) == 0: + raise diff --git a/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py b/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py new file mode 100644 index 000000000..d31c8355e --- /dev/null +++ b/src/ansys/dpf/composites/server_helpers/_upload_files_to_server.py @@ -0,0 +1,76 @@ +from typing import cast + +import ansys.dpf.core as dpf +from ansys.dpf.core.server_types import BaseServer + +from .._typing_helper import PATH as _PATH +from ..data_sources import ( + CompositeDefinitionFiles, + ContinuousFiberCompositesFiles, + ShortFiberCompositesFiles, +) + + +def upload_short_fiber_composite_files_to_server( + data_files: ShortFiberCompositesFiles, server: BaseServer +) -> ShortFiberCompositesFiles: + """Upload short fiber composites files to server. + + Parameters + ---------- + data_files + server + """ + # If files are not local, it means they have already been + # uploaded to the server + if server.local_server or not data_files.files_are_local: + return data_files + + def upload(filename: _PATH) -> str: + return cast(str, dpf.upload_file_in_tmp_folder(filename, server=server)) + + return ShortFiberCompositesFiles( + rst=upload(data_files.engineering_data), + dsdat=upload(data_files.dsdat), + engineering_data=upload(data_files.engineering_data), + files_are_local=False, + ) + + +def upload_continuous_fiber_composite_files_to_server( + data_files: ContinuousFiberCompositesFiles, server: BaseServer +) -> ContinuousFiberCompositesFiles: + """Upload continuous fiber composites files to server. + + Note: If server.local_server == True the data_files are returned unmodified. + + Parameters + ---------- + data_files + server + """ + # If files are not local, it means they have already been + # uploaded to the server + if server.local_server or not data_files.files_are_local: + return data_files + + def upload(filename: _PATH) -> _PATH: + return cast(str, dpf.upload_file_in_tmp_folder(filename, server=server)) + + all_composite_files = {} + for key, composite_files_by_scope in data_files.composite.items(): + composite_definition_files = CompositeDefinitionFiles( + definition=upload(composite_files_by_scope.definition), + ) + + if composite_files_by_scope.mapping is not None: + composite_definition_files.mapping = upload(composite_files_by_scope.mapping) + + all_composite_files[key] = composite_definition_files + + return ContinuousFiberCompositesFiles( + rst=upload(data_files.rst), + engineering_data=upload(data_files.engineering_data), + composite=all_composite_files, + files_are_local=False, + ) diff --git a/tests/composite_model_test.py b/tests/composite_model_test.py index 261e7e2be..f84a6e58b 100644 --- a/tests/composite_model_test.py +++ b/tests/composite_model_test.py @@ -11,7 +11,6 @@ CompositeDefinitionFiles, get_composite_files_from_workbench_result_folder, ) -from ansys.dpf.composites.example_helper import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.failure_criteria import CombinedFailureCriterion, MaxStressCriterion from ansys.dpf.composites.layup_info import LayerProperty, get_analysis_ply_index_to_name_map from ansys.dpf.composites.layup_info.material_properties import MaterialProperty @@ -81,8 +80,6 @@ def test_basic_functionality_of_composite_model(dpf_server): timer = Timer() files = get_data_files() - files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) - timer.add("After Upload files") composite_model = CompositeModel(files, server=dpf_server) timer.add("After Setup model") @@ -154,9 +151,6 @@ def test_assembly_model(dpf_server): solid_label = "Setup 3_solid" shell_label = "Setup 4_shell" - files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) - timer.add("After Upload files") - composite_model = CompositeModel(files, server=dpf_server) timer.add("After Setup model") @@ -297,7 +291,6 @@ def test_assembly_model(dpf_server): def test_failure_measures(dpf_server): """Verify that all failure measure names are compatible with the backend""" files = get_data_files() - files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) composite_model = CompositeModel(files, server=dpf_server) combined_failure_criterion = CombinedFailureCriterion( @@ -316,8 +309,6 @@ def test_composite_model_element_scope(dpf_server): """Ensure that the element IDs of the scope can be of any type (e.g. np.int)""" files = get_data_files() - files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) - composite_model = CompositeModel(files, server=dpf_server) cfc = CombinedFailureCriterion("max stress", failure_criteria=[MaxStressCriterion()]) @@ -338,8 +329,6 @@ def test_composite_model_named_selection_scope(dpf_server): """Ensure that the scoping by Named Selection is supported""" files = get_data_files() - files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) - composite_model = CompositeModel(files, server=dpf_server) ns_name = "NS_ELEM" diff --git a/tests/conftest.py b/tests/conftest.py index 64060c0f5..ec7b1de1b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -22,7 +22,6 @@ TEST_ROOT_DIR = pathlib.Path(__file__).parent -SERVER_BIN_OPTION_KEY = "--server-bin" PORT_OPTION_KEY = "--port" ANSYS_PATH_OPTION_KEY = "--ansys-path" LICENSE_SERVER_OPTION_KEY = "--license-server" @@ -31,11 +30,6 @@ def pytest_addoption(parser: pytest.Parser) -> None: """Add command-line options to pytest.""" - parser.addoption( - SERVER_BIN_OPTION_KEY, - action="store", - help="Path of the dpf server executable", - ) parser.addoption( PORT_OPTION_KEY, @@ -107,7 +101,7 @@ def __init__( process_out_file: pathlib.Path, process_err_file: pathlib.Path, license_server: str = "", - image_name: str = "ghcr.io/pyansys/pydpf-composites:latest", + image_name: str = "ghcr.io/ansys/pydpf-composites:latest", mount_directories: Mapping[str, str] = MappingProxyType({}), ): """Initialize the wrapper @@ -167,64 +161,6 @@ def __exit__( self.process_stderr.close() -class LocalServerProcess: - """Context manager that wraps a local server executable""" - - def __init__( - self, - server_executable: str, - server_out_file: pathlib.Path, - server_err_file: pathlib.Path, - ): - """Initialize the wrapper - Parameters - ---------- - server_executable : - Path - server_out_file : - Path where the standard out of the server is - redirected. - server_err_file : - Path where the standard error of the server is - redirected. - """ - self.port = _find_free_port() - self.server_stdout = open(server_out_file, mode="w", encoding="utf-8") - self.server_stderr = open(server_err_file, mode="w", encoding="utf-8") - - self.server_executable = server_executable - - if sys.platform != "win32": - raise Exception( - "Local server currently not supported on linux. Please use the docker container" - ) - self.env = os.environ.copy() - # Add parent folder of deps to path which contains the composites operators - self.env["PATH"] = ( - self.env["PATH"] + ";" + str(pathlib.Path(self.server_executable).parent.parent) - ) - - def __enter__(self): - cmd = [self.server_executable, "--port", str(self.port), "--address", dpf.server.LOCALHOST] - self.server_process = subprocess.Popen( - cmd, stdout=self.server_stdout, stderr=self.server_stderr, text=True, env=self.env - ) - - return ServerContext(port=self.port, platform=sys.platform, server=None) - - def __exit__( - self, - type, - value, - traceback, - ): - self.server_process.kill() - self.server_process.communicate(timeout=5) - - self.server_stdout.close() - self.server_stderr.close() - - class RunningServer: """Context manager that wraps an already running dpf server that serves at a port""" @@ -270,9 +206,26 @@ def _find_free_port() -> int: return sock.getsockname()[1] # type: ignore +def prepend_port_if_needed(license_server): + if "@" not in license_server: + license_server = "1055@" + license_server + return license_server + + +def get_license_server_string(license_server_option: str) -> str | None: + if license_server_option: + return prepend_port_if_needed(license_server_option) + if ANSYSLMD_LICENSE_FILE_KEY in os.environ.keys(): + return prepend_port_if_needed(os.environ[ANSYSLMD_LICENSE_FILE_KEY]) + + raise RuntimeError( + "License server not set. Either run test with --license-server or " + f" set ENV {ANSYSLMD_LICENSE_FILE_KEY}." + ) + + @pytest.fixture(scope="session") def dpf_server(request: pytest.FixtureRequest): - # Use a unique session id so logs don't get overwritten # by tests that run in different sessions import uuid @@ -283,25 +236,12 @@ def dpf_server(request: pytest.FixtureRequest): server_log_stdout = TEST_ROOT_DIR / "logs" / f"server_log_out-{uid}.txt" server_log_stderr = TEST_ROOT_DIR / "logs" / f"server_log_err-{uid}.txt" - server_bin = request.config.getoption(SERVER_BIN_OPTION_KEY) running_server_port = request.config.getoption(PORT_OPTION_KEY) installer_path = request.config.getoption(ANSYS_PATH_OPTION_KEY) - license_server = request.config.getoption(LICENSE_SERVER_OPTION_KEY) - - if not license_server: - if ANSYSLMD_LICENSE_FILE_KEY in os.environ.keys(): - license_server = os.environ[ANSYSLMD_LICENSE_FILE_KEY] - else: - raise RuntimeError( - "License server not set. Either run test with --license-server of " - f" set ENV {ANSYSLMD_LICENSE_FILE_KEY}." - ) - - if "@" not in license_server: - license_server = "1055@" + license_server + license_server_config = request.config.getoption(LICENSE_SERVER_OPTION_KEY) active_options = [ - option for option in [installer_path, server_bin, running_server_port] if option is not None + option for option in [installer_path, running_server_port] if option is not None ] if len(active_options) > 1: @@ -310,14 +250,9 @@ def dpf_server(request: pytest.FixtureRequest): def start_server_process(): if running_server_port: return RunningServer(port=running_server_port) - if server_bin: - return LocalServerProcess( - server_bin, server_out_file=server_log_stdout, server_err_file=server_log_stderr - ) if installer_path: return InstalledServer(installer_path) else: - process_log_stdout = TEST_ROOT_DIR / "logs" / f"process_log_out-{uid}.txt" process_log_stderr = TEST_ROOT_DIR / "logs" / f"process_log_err-{uid}.txt" @@ -326,12 +261,12 @@ def start_server_process(): server_err_file=server_log_stderr, process_out_file=process_log_stdout, process_err_file=process_log_stderr, - license_server=license_server, + license_server=get_license_server_string(license_server_config), ) with start_server_process() as server_process: # Workaround for dpf bug. The timeout is not respected when connecting - # to a server:https://github.com/pyansys/pydpf-core/issues/638 + # to a server:https://github.com/ansys/pydpf-core/issues/638 # We just try until connect_to_server succeeds def start_server(): if server_process.port: diff --git a/tests/data/workflow_example/assembly/result_definition.json b/tests/data/workflow_example/assembly/result_definition.json deleted file mode 100644 index 7cfbd8302..000000000 --- a/tests/data/workflow_example/assembly/result_definition.json +++ /dev/null @@ -1,108 +0,0 @@ -{ - "accumulator" : "max", - "expression" : "composite_failure", - "failure_criteria_definition" : { - "criteria" : { - "core_failure" : { - "active" : true, - "include_ins" : false, - "wf" : 1 - }, - "face_sheet_wrinkling" : { - "active" : true, - "homogeneous_core_coeff" : 0.5, - "honeycomb_core_coeff" : 0.33000000000000002, - "wf" : 1 - }, - "max_stress" : { - "active" : true, - "s1" : true, - "s12" : true, - "s13" : false, - "s2" : true, - "s23" : false, - "s3" : false, - "wf_s1" : 1, - "wf_s12" : 1, - "wf_s13" : 1, - "wf_s2" : 1, - "wf_s23" : 1, - "wf_s3" : 1 - }, - "puck" : { - "M" : 0.5, - "active" : true, - "cfps" : false, - "dim" : 2, - "force_global_constants" : false, - "interface_weakening_factor" : 0.80000000000000004, - "p21_neg" : 0.27500000000000002, - "p21_pos" : 0.32500000000000001, - "p22_neg" : 0.22500000000000001, - "p22_pos" : 0.22500000000000001, - "pd" : false, - "pf" : true, - "pma" : true, - "pmb" : true, - "pmc" : true, - "s" : 0.5, - "wf_pd" : 1, - "wf_pf" : 1, - "wf_pma" : 1, - "wf_pmb" : 1, - "wf_pmc" : 1 - }, - "shear_crimping" : { - "active" : true, - "kc" : 1, - "kf" : 0, - "wf" : 1 - } - } - }, - "measures" : [ "inverse_reserve_factor" ], - "scopes" : [ - { - "datasources" : { - "acph5_file" : [ - "D:/ANSYSDev\\dpf_composites\\test_data\\workflow_example\\workflow_example_files\\dp0\\SYS-2\\MECH\\Setup 3\\ACP-Pre.acph5" - ], - "assembly_mapping_file" : [ - "D:/ANSYSDev/dpf_composites/test_data/workflow_example/workflow_example_files/dp0/SYS-2/MECH/Setup 3/ACPSolidModel_SM.mapping" - ], - "composite_definition" : [ - "D:/ANSYSDev\\dpf_composites\\test_data\\workflow_example\\workflow_example_files\\dp0\\SYS-2\\MECH\\Setup 3\\ACPSolidModel_SM.h5" - ], - "material_file" : [ - "D:/ANSYSDev/dpf_composites/test_data/workflow_example/workflow_example_files/dp0/SYS-2/MECH/MatML.xml" - ], - "rst_file" : [ - "D:/ANSYSDev/dpf_composites/test_data/workflow_example/workflow_example_files/dp0/SYS-2/MECH/file.rst" - ] - }, - "elements" : [ 5, 6, 7, 8, 9, 10 ] - }, - { - "datasources" : { - "acph5_file" : [ - "D:/ANSYSDev\\dpf_composites\\test_data\\workflow_example\\workflow_example_files\\dp0\\SYS-2\\MECH\\Setup 4\\ACP-Pre.acph5" - ], - "assembly_mapping_file" : [ - "D:/ANSYSDev/dpf_composites/test_data/workflow_example/workflow_example_files/dp0/SYS-2/MECH/Setup 4/ACPCompositeDefinitions.mapping" - ], - "composite_definition" : [ - "D:/ANSYSDev\\dpf_composites\\test_data\\workflow_example\\workflow_example_files\\dp0\\SYS-2\\MECH\\Setup 4\\ACPCompositeDefinitions.h5" - ], - "material_file" : [ - "D:/ANSYSDev/dpf_composites/test_data/workflow_example/workflow_example_files/dp0/SYS-2/MECH/MatML.xml" - ], - "rst_file" : [ - "D:/ANSYSDev/dpf_composites/test_data/workflow_example/workflow_example_files/dp0/SYS-2/MECH/file.rst" - ] - }, - "elements" : [ 1, 2 ] - } - ], - "stress_strain_eval_mode" : "rst_file", - "time" : 1 -} diff --git a/tests/failure_criteria/combined_failure_criterion_test.py b/tests/failure_criteria/combined_failure_criterion_test.py index 766d26893..8d7ee1ca2 100644 --- a/tests/failure_criteria/combined_failure_criterion_test.py +++ b/tests/failure_criteria/combined_failure_criterion_test.py @@ -6,7 +6,6 @@ def test_combined_failure_criterion(): - cfc = CombinedFailureCriterion("my name") assert cfc.name == "my name" diff --git a/tests/failure_criteria/core_failure_test.py b/tests/failure_criteria/core_failure_test.py index a322d11df..d98df5c40 100644 --- a/tests/failure_criteria/core_failure_test.py +++ b/tests/failure_criteria/core_failure_test.py @@ -7,7 +7,6 @@ def test_core_failure_criterion(): - cf_default = CoreFailureCriterion() assert cf_default.name == "Core Failure" diff --git a/tests/failure_criteria/cuntze_test.py b/tests/failure_criteria/cuntze_test.py index 2f5cb209b..7f3564260 100644 --- a/tests/failure_criteria/cuntze_test.py +++ b/tests/failure_criteria/cuntze_test.py @@ -11,7 +11,6 @@ def test_cuntze_criterion(): - cuntze_default = CuntzeCriterion() assert cuntze_default.name == "Cuntze" diff --git a/tests/failure_criteria/face_sheet_wrinkling_test.py b/tests/failure_criteria/face_sheet_wrinkling_test.py index 6c8863d4c..518b44b08 100644 --- a/tests/failure_criteria/face_sheet_wrinkling_test.py +++ b/tests/failure_criteria/face_sheet_wrinkling_test.py @@ -7,7 +7,6 @@ def test_face_sheet_wrinkling_criterion(): - wrinkling_default = FaceSheetWrinklingCriterion() assert wrinkling_default.name == "Face Sheet Wrinkling" diff --git a/tests/failure_criteria/hashin_test.py b/tests/failure_criteria/hashin_test.py index 8dc60f63c..55536b537 100644 --- a/tests/failure_criteria/hashin_test.py +++ b/tests/failure_criteria/hashin_test.py @@ -4,7 +4,6 @@ def test_hashin_criterion(): - hashin_default = HashinCriterion() assert hashin_default.name == "Hashin" diff --git a/tests/failure_criteria/hoffman_test.py b/tests/failure_criteria/hoffman_test.py index ca3d8be7a..b1b18c0e4 100644 --- a/tests/failure_criteria/hoffman_test.py +++ b/tests/failure_criteria/hoffman_test.py @@ -5,7 +5,6 @@ def test_hoffman_criterion(): - hoffman_default = HoffmanCriterion() assert hoffman_default.name == "Hoffman" diff --git a/tests/failure_criteria/larc_test.py b/tests/failure_criteria/larc_test.py index a4b1e6dae..14e9fc7b5 100644 --- a/tests/failure_criteria/larc_test.py +++ b/tests/failure_criteria/larc_test.py @@ -4,7 +4,6 @@ def test_larc_criterion(): - larc_default = LaRCCriterion() assert larc_default.name == "LaRC" diff --git a/tests/failure_criteria/max_strain_criterion_test.py b/tests/failure_criteria/max_strain_criterion_test.py index baef8ba17..cd638e705 100644 --- a/tests/failure_criteria/max_strain_criterion_test.py +++ b/tests/failure_criteria/max_strain_criterion_test.py @@ -32,7 +32,6 @@ def test_max_strain_criterion(): - ms_default = MaxStrainCriterion() assert ms_default.name == "Max Strain" diff --git a/tests/failure_criteria/max_stress_criterion_test.py b/tests/failure_criteria/max_stress_criterion_test.py index 6d0271c65..83b8ce1c4 100644 --- a/tests/failure_criteria/max_stress_criterion_test.py +++ b/tests/failure_criteria/max_stress_criterion_test.py @@ -6,7 +6,6 @@ def test_max_stress_criterion(): - ms_default = MaxStressCriterion() assert ms_default.name == "Max Stress" diff --git a/tests/failure_criteria/puck_test.py b/tests/failure_criteria/puck_test.py index 341f1bdfd..2ce67d35a 100644 --- a/tests/failure_criteria/puck_test.py +++ b/tests/failure_criteria/puck_test.py @@ -30,7 +30,6 @@ def test_puck_criterion(): - puck_default = PuckCriterion() assert puck_default.name == "Puck" diff --git a/tests/failure_criteria/shear_crimping_test.py b/tests/failure_criteria/shear_crimping_test.py index 72de7f956..b7b2918aa 100644 --- a/tests/failure_criteria/shear_crimping_test.py +++ b/tests/failure_criteria/shear_crimping_test.py @@ -7,7 +7,6 @@ def test_shear_crimping_criterion(): - sc_default = ShearCrimpingCriterion() assert sc_default.name == "Shear Crimping" diff --git a/tests/failure_criteria/tsai_hill_test.py b/tests/failure_criteria/tsai_hill_test.py index 15fad5e48..b0296992b 100644 --- a/tests/failure_criteria/tsai_hill_test.py +++ b/tests/failure_criteria/tsai_hill_test.py @@ -5,7 +5,6 @@ def test_tsai_hill_criterion(): - th_default = TsaiHillCriterion() assert th_default.name == "Tsai Hill" diff --git a/tests/failure_criteria/tsai_wu_test.py b/tests/failure_criteria/tsai_wu_test.py index 73bd3f561..df6fdec38 100644 --- a/tests/failure_criteria/tsai_wu_test.py +++ b/tests/failure_criteria/tsai_wu_test.py @@ -5,7 +5,6 @@ def test_tsai_wu_criterion(): - tw_default = TsaiWuCriterion() assert tw_default.name == "Tsai Wu" diff --git a/tests/failure_criteria/von_mises_test.py b/tests/failure_criteria/von_mises_test.py index 9c3257feb..1d875d18e 100644 --- a/tests/failure_criteria/von_mises_test.py +++ b/tests/failure_criteria/von_mises_test.py @@ -4,7 +4,6 @@ def test_von_mises_criterion(): - von_mises_default = VonMisesCriterion() assert von_mises_default.name == "Von Mises" diff --git a/tests/filter_layered_data_test.py b/tests/filter_layered_data_test.py index 5f56bba4d..e67955307 100644 --- a/tests/filter_layered_data_test.py +++ b/tests/filter_layered_data_test.py @@ -178,7 +178,6 @@ def test_access_to_invalid_analysis_ply(dpf_server): ) # try to get non existing analysis ply with pytest.raises(RuntimeError) as exc_info: - analysis_ply_info_provider = AnalysisPlyInfoProvider( mesh=setup_result.mesh, name="notexisting" ) diff --git a/tests/getting_started_test.py b/tests/getting_started_test.py index ac0a2982d..543fc3b91 100644 --- a/tests/getting_started_test.py +++ b/tests/getting_started_test.py @@ -2,8 +2,6 @@ import ansys.dpf.core as dpf -from ansys.dpf.composites.example_helper import upload_continuous_fiber_composite_files_to_server - def test_getting_started(dpf_server: dpf.server): """ " @@ -34,11 +32,10 @@ def test_getting_started(dpf_server: dpf.server): # Start the server. By default this will start # a new local server and load the composites plugin - # In the test we use the dpf server and upload the files to the server. - # For the getting started example comment the next two lines and - # uncomment serer = connect_to_or_start_server() + # In the test we use the dpf server from the fixture. + # For the getting started example comment the next line and + # uncomment server = connect_to_or_start_server() server = dpf_server - composite_files = upload_continuous_fiber_composite_files_to_server(composite_files, server) # server = connect_to_or_start_server() # Create a composite model @@ -50,7 +47,7 @@ def test_getting_started(dpf_server: dpf.server): irf_field = failure_result.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) # Commented because it blocks execution. Uncomment this - # line when you copy this code the getting started example + # line when you copy this code to the getting started example # irf_field.plot() # Show sampling point for element with id/label 1 @@ -59,4 +56,7 @@ def test_getting_started(dpf_server: dpf.server): combined_criterion=combined_failure_criterion, element_id=element_id ) - sampling_point.get_result_plots() + plots = sampling_point.get_result_plots() + # Commented because it blocks execution. Uncomment this + # line when you copy this code to the getting started example + # plots.figure.show() diff --git a/tests/helper.py b/tests/helper.py index 4d797df0c..9a4a75e7a 100644 --- a/tests/helper.py +++ b/tests/helper.py @@ -6,12 +6,10 @@ from ansys.dpf.core import DataSources, Field, MeshedRegion, Operator from ansys.dpf.composites.data_sources import CompositeDefinitionFiles, get_composites_data_sources -from ansys.dpf.composites.example_helper import ( - ContinuousFiberCompositesFiles, - upload_continuous_fiber_composite_files_to_server, -) +from ansys.dpf.composites.example_helper import ContinuousFiberCompositesFiles from ansys.dpf.composites.layup_info import add_layup_info_to_mesh from ansys.dpf.composites.layup_info.material_operators import get_material_operators +from ansys.dpf.composites.server_helpers import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.unit_system import get_unit_system @@ -23,7 +21,6 @@ def add(self, label): self.timings.append((label, time.time())) def summary(self): - diffs = self._get_diffs() print("") print("Timer summary") @@ -61,7 +58,6 @@ class SetupResult: def setup_operators(server, files: ContinuousFiberCompositesFiles): - timer = Timer() files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=server) diff --git a/tests/layup_properties_test.py b/tests/layup_properties_test.py index d06cd4e22..3511a3715 100644 --- a/tests/layup_properties_test.py +++ b/tests/layup_properties_test.py @@ -2,9 +2,9 @@ import pytest from ansys.dpf.composites.data_sources import get_composites_data_sources -from ansys.dpf.composites.example_helper import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.layup_info import LayupPropertiesProvider, add_layup_info_to_mesh from ansys.dpf.composites.layup_info.material_operators import get_material_operators +from ansys.dpf.composites.server_helpers import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.unit_system import get_unit_system from .helper import get_basic_shell_files diff --git a/tests/material_properties_test.py b/tests/material_properties_test.py index df0a32796..aa3b1896e 100644 --- a/tests/material_properties_test.py +++ b/tests/material_properties_test.py @@ -3,7 +3,6 @@ import pytest from ansys.dpf.composites.data_sources import get_composites_data_sources -from ansys.dpf.composites.example_helper import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.layup_info import ( AnalysisPlyInfoProvider, get_all_analysis_ply_names, @@ -17,6 +16,7 @@ get_constant_property_dict, ) from ansys.dpf.composites.select_indices import get_selected_indices +from ansys.dpf.composites.server_helpers import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.unit_system import get_unit_system from .helper import get_basic_shell_files, setup_operators @@ -102,7 +102,6 @@ def test_material_properties(dpf_server): def test_material_properties_fails_with_error_mesh_has_no_layup_info(dpf_server): - files = get_basic_shell_files() files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) diff --git a/tests/performance_test.py b/tests/performance_test.py index 856082666..824e1d7ab 100644 --- a/tests/performance_test.py +++ b/tests/performance_test.py @@ -7,7 +7,6 @@ from ansys.dpf.composites._indexer import FieldIndexerWithDataPointer from ansys.dpf.composites.data_sources import CompositeDefinitionFiles, get_composites_data_sources -from ansys.dpf.composites.example_helper import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.layup_info import ( LayupPropertiesProvider, add_layup_info_to_mesh, @@ -18,6 +17,7 @@ MaterialProperty, get_constant_property_dict, ) +from ansys.dpf.composites.server_helpers import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.unit_system import get_unit_system from .helper import ContinuousFiberCompositesFiles, Timer, setup_operators @@ -332,7 +332,6 @@ def test_performance_flat(dpf_server): timer.add("indexer") with setup_result.mesh.elements.connectivities_field.as_local_field() as local_connectivity: - timer.add("local connectivity") for element_id in scope: diff --git a/tests/sampling_point_test.py b/tests/sampling_point_test.py index 8748c8271..23f53d895 100644 --- a/tests/sampling_point_test.py +++ b/tests/sampling_point_test.py @@ -13,7 +13,6 @@ CompositeDefinitionFiles, ContinuousFiberCompositesFiles, ) -from ansys.dpf.composites.example_helper import upload_continuous_fiber_composite_files_to_server from ansys.dpf.composites.failure_criteria import ( CombinedFailureCriterion, MaxStrainCriterion, @@ -169,7 +168,6 @@ def test_sampling_point_result_plots(dpf_server): engineering_data=material_path, ) - files = upload_continuous_fiber_composite_files_to_server(data_files=files, server=dpf_server) cfc = CombinedFailureCriterion( "max strain & max stress", [MaxStrainCriterion(), MaxStressCriterion()] ) @@ -211,13 +209,10 @@ def test_sampling_point_with_numpy_types(dpf_server): engineering_data=material_path, ) - files = upload_continuous_fiber_composite_files_to_server( - data_files=composite_files, server=dpf_server - ) cfc = CombinedFailureCriterion( "max strain & max stress", [MaxStrainCriterion(), MaxStressCriterion()] ) - composite_model = CompositeModel(files, server=dpf_server) + composite_model = CompositeModel(composite_files, server=dpf_server) failure_container = composite_model.evaluate_failure_criteria(cfc) irfs = failure_container.get_field({"failure_label": FailureOutput.FAILURE_VALUE}) diff --git a/tox.ini b/tox.ini index 60576ba67..df43b2d4e 100644 --- a/tox.ini +++ b/tox.ini @@ -1,14 +1,13 @@ [tox] description = Default tox environments list envlist = - style,{py3.7,py3.8,py3.9,py3.10,py3.11}{,-coverage},doc-{windows,linux} + style,{py3.8,py3.9,py3.10,py3.11}{,-coverage},doc-{windows,linux} skip_missing_interpreters = false isolated_build = true [gh-actions] description = The tox environment to be executed in gh-actions for a given python version python = - 3.7: py3.7-coverage 3.8: py3.8-coverage 3.9: py3.9-coverage 3.10: py3.10-coverage @@ -17,7 +16,6 @@ python = [testenv] description = Checks for project unit tests and coverage (if desired) basepython = - py3.7: python3.7 py3.8: python3.8 py3.9: python3.9 py3.10: python3.10 @@ -36,7 +34,7 @@ commands = [testenv:test-minimal] description = Checks for project unit tests with minimal package versions basepython = - python3.7 + python3.8 skip_install = true allowlist_externals = poetry @@ -64,9 +62,9 @@ commands = description = Check if documentation generates properly setenv = REPO_ROOT = {toxinidir} # The example are created with the docker container - # that listens to port 21002. The container needs + # that listens to port 50052. The container needs # to be started manually. - PYDPF_COMPOSITES_DOCKER_CONTAINER_PORT = 21002 + PYDPF_COMPOSITES_DOCKER_CONTAINER_PORT = 50052 basepython = python3.9 allowlist_externals = @@ -104,4 +102,4 @@ allowlist_externals = poetry basepython = python3.9 -commands =poetry install -E all \ No newline at end of file +commands =poetry install -E all