diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8366c81c..3fbce2da 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,99 +2,410 @@ name: Publish Packages on: workflow_dispatch: inputs: + origen_metal_python_package: + description: Publish the Origen Metal python package + default: "false" + type: choice + options: + - true + - false + origen_python_package: + description: Publish the Origen python package + default: "false" + type: choice + options: + - true + - false # build_for_debug_target: # description: If 'true', does not use the '--release' switch when building Rust libraries # required: false # default: "false" - # publish_pypi: - # description: Publish built packages to PyPi - # required: true - # default: false + publish_pypi: + description: Publish built packages to PyPi + required: true + default: "false" + type: choice + options: + - true + - false publish_pypi_test: description: Publish To PyPI Test Server required: true default: "false" - # publish_github_release: - # description: Publish built packages to Github Release page - # required: true - # default: false + type: choice + options: + - true + - false + publish_github_release: + description: Publish built packages to Github Release page + required: true + default: "false" + type: choice + options: + - true + - false + prerelease: + description: Indicate that any release is a pre/dev release + required: true + default: "true" + type: choice + options: + - true + - false + # id: + # description: Set the run ID to a known value + # required: false + # type: number +env: + om_ver_file: om_version + origen_ver_file: origen_version jobs: - build: + precheck: + # Need to make sure that only one publish action is running at a time to avoid releases stepping on each other. + # GA's concurrency only allows for this job replacing previous jobs, but we want the opposite, otherwise we might end up + # with imcomplete or duplicate releases. + runs-on: ubuntu-latest + steps: + - name: Query Concurrency + id: query-concurrency + uses: fkirc/skip-duplicate-actions@v5 + with: + concurrent_skipping: 'always' + do_not_skip: '[]' + - name: Check Concurrency + uses: actions/github-script@v7 + if: ${{ steps.query-concurrency.outputs.should_skip == 'true' }} + with: + script: | + core.setFailed('Found existing publish workflow: ${{ steps.query-concurrency.outputs.skipped_by.htmlUrl }}') + + build_manylinux: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] - python-version: [3.6, 3.7, 3.8, 3.9] + python-version: ${{ fromJSON(vars.PYTHON_VERSIONS_FOR_RELEASE) }} + needs: [precheck] + runs-on: ubuntu-latest + container: + image: quay.io/pypa/manylinux2014_x86_64 + options: --user root + steps: + - name: Show Env + run: | + pwd + echo "ROOT_DIR=$PWD" >> $GITHUB_ENV + env + echo "HOME=/root" >> $GITHUB_ENV + + - uses: actions/checkout@v2 + + - name: Install Rust + run: | + curl https://sh.rustup.rs -sSf | sh -s -- -y + echo "$HOME/.cargo/bin" >> $GITHUB_PATH + + - name: Set Rust Version + run: | + rustup install ${{ fromJSON(vars.RUST_VERSION) }} + rustup default ${{ fromJSON(vars.RUST_VERSION) }} + + - name: Check Rust Version + run: | + rustc --version + cargo --version + + - name: Install Newer OpenSSL + run: | + curl -O https://www.openssl.org/source/openssl-1.1.1w.tar.gz + ls -al openssl-1.1.1w.tar.gz + tar zxf openssl-1.1.1w.tar.gz + cd openssl-1.1.1w + ./config + make + make install + + - name: Save Minor Python Version + run: | + IFS='.' read -r -a SPLIT_VER <<< ${{ matrix.python-version }} + M_VER=${SPLIT_VER[0]}.${SPLIT_VER[1]} + echo $M_VER + echo "PY_M_VER=$M_VER" >> $GITHUB_ENV + + - name: Install libffi for Python 3.12+ + if: ${{ fromJSON(env.PY_M_VER) >= 3.12 }} + run: | + yum install libffi-devel -y + ldconfig + + - name: Install Python + run: | + ls $ROOT_DIR/openssl-1.1.1w + curl -O https://www.python.org/ftp/python/${{ matrix.python-version }}/Python-${{ matrix.python-version }}.tgz + tar zxf Python-${{ matrix.python-version }}.tgz + cd Python-${{ matrix.python-version }} + ./configure --with-openssl=$ROOT_DIR/openssl-1.1.1w --prefix=/root/python --enable-optimizations --enable-shared + make altinstall + + - name: Copy Python Shared Library (Python 3.7) + if: ${{ matrix.python-version == '3.7.17' }} + run: | + echo $PY_M_VER + cd Python-${{ matrix.python-version }} + ls + cp libpython$PY_M_VER\m.so.1.0 /usr/local/lib64/ + - name: Copy Python Shared Library (Python 3.8+ Versions) + if: ${{ matrix.python-version != '3.7.17' }} + run: | + echo $PY_M_VER + cd Python-${{ matrix.python-version }} + ls + cp libpython$PY_M_VER.so.1.0 /usr/local/lib64/ + + # - name: Update LD_LIBRARY_PATH + # run: | + # echo $LD_LIBRARY_PATH + # echo "LD_LIBRARY_PATH=/Python-${{ matrix.python-version }}:$LD_LIBRARY_PATH" >> $GITHUB_ENV + + - name: Check LD_LIBRARY_PATH + run: | + echo $LD_LIBRARY_PATH + + - name: Alias Python and Pip binaries + run: | + echo $PY_M_VER + ls /root/python/bin + ln -s /root/python/bin/python$PY_M_VER /root/python/bin/python + ln -s /root/python/bin/pip$PY_M_VER /root/python/bin/pip + ls /root/python/bin + + - name: Update $PATH + run: | + echo /root/python/bin >> $GITHUB_PATH + + # # TODO: For now use pre-installed python version. + # # In future, will probably want to download latest version + # - name: Set Python Version (3.7 Path) + # if: ${{ matrix.python-version == 3.7 }} + # run: | + # PYVER=$(echo ${{ matrix.python-version }} | sed -e "s/\.//g") + # echo $PYVER + # PATH_TO_PY=/opt/python/cp$PYVER-cp$PYVER\m/bin + # echo $PATH_TO_PY + # echo "$PATH_TO_PY" >> $GITHUB_PATH + # - name: Set Python Version + # if: ${{ matrix.python-version != 3.7 }} + # run: | + # PYVER=$(echo ${{ matrix.python-version }} | sed -e "s/\.//g") + # echo $PYVER + # PATH_TO_PY=/opt/python/cp$PYVER-cp$PYVER/bin + # echo $PATH_TO_PY + # echo "$PATH_TO_PY" >> $GITHUB_PATH + + - name: Display Python Version + run: | + which python + which pip + python --version + pip --version + + - name: Install Poetry + run: | + pip install poetry==1.3.2 + poetry --version + + - name: Install Auditwheel + run: | + pip install setuptools + pip install auditwheel + auditwheel --version + + - name: Build Origen Metal Python Package + working-directory: python/origen_metal + run: poetry build --format wheel + + - name: Display OM Dist Directory + working-directory: python/origen_metal + run: ls dist + + - name: Repair OM Wheel + working-directory: python/origen_metal + run: | + auditwheel show dist/* + auditwheel repair dist/* + + - name: Display OM Wheelhouse Directory + working-directory: python/origen_metal + run: ls wheelhouse - runs-on: ${{ matrix.os }} + - name: Upload Origen Metal Python Package Artifact + uses: actions/upload-artifact@v3 + with: + name: om_wheels + path: python/origen_metal/wheelhouse/* + + - name: Get OM Python Package Version + working-directory: python/origen_metal + run: poetry version -s > ${{ env.om_ver_file }} + + - name: Upload OM Python Package Version + uses: actions/upload-artifact@v3 + with: + name: ${{ env.om_ver_file }} + path: python/origen_metal/${{ env.om_ver_file }} + + - name: Build Origen Python Package + working-directory: python/origen + run: poetry build --format wheel + + - name: Display Origen Dist Directory + working-directory: python/origen + run: ls dist + + - name: Repair Origen Wheel + working-directory: python/origen + run: | + auditwheel show dist/* + auditwheel repair dist/* + + - name: Display Origen Wheelhouse Directory + working-directory: python/origen + run: ls wheelhouse + + - name: Upload Origen Python Package Artifact + uses: actions/upload-artifact@v3 + with: + name: origen_wheels + path: python/origen/wheelhouse/* + + - name: Get Origen Python Package Version + working-directory: python/origen + run: poetry version -s > ${{ env.origen_ver_file }} + + - name: Upload Origen Python Package Version + uses: actions/upload-artifact@v3 + with: + name: ${{ env.origen_ver_file }} + path: python/origen/${{ env.origen_ver_file }} + + - name: Upload CLI as a standalone entity + uses: actions/upload-artifact@v3 + with: + name: cli + path: python\origen\origen\__bin__\bin\origen + + build_windows: + strategy: + fail-fast: false + matrix: + python-version: ${{ fromJSON(vars.PYTHON_VERSIONS) }} + needs: [precheck] + + runs-on: windows-latest steps: - uses: actions/checkout@v2 - name: Install Rust - uses: actions-rs/toolchain@v1 + uses: actions-rust-lang/setup-rust-toolchain@v1 with: - toolchain: "nightly-2020-11-01" - override: true - #components: rustfmt, clippy - + toolchain: ${{ fromJSON(vars.RUST_VERSION) }} + rustflags: + + - name: Override Project Rust Version + run: rustup override set ${{ fromJSON(vars.RUST_VERSION) }} + + - name: Check Rust Version + run: | + rustc --version + cargo --version + - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - # Needed to compile keyring library - # Install taken from keyring library: - # https://github.com/hwchen/keyring-rs/blob/v0.10.1/.github/workflows/ci.yaml#L80-L84 - - name: install libdbus + - name: Display Python Version + run: python -c "import sys; print(sys.version)" + + - name: Install Poetry run: | - sudo apt update - sudo apt install libdbus-1-dev - if: contains(matrix.os, 'ubuntu') + pip install poetry==1.3.2 + poetry --version - - name: Build Origen CLI - working-directory: rust/origen/cli - run: cargo build --bins --release + - name: Build Origen Metal Python Package + working-directory: python/origen_metal + run: poetry build --format wheel + + - name: Display Dist Directory + working-directory: python/origen_metal/dist + run: ls + + - name: Upload Origen Metal Python Package Artifact + uses: actions/upload-artifact@v3 + with: + name: om_wheels + path: python/origen_metal/dist/origen_metal* + + - name: Get OM Python Package Version + working-directory: python/origen_metal + run: poetry version -s > ${{ env.om_ver_file }} + + - name: Upload OM Python Package Version + uses: actions/upload-artifact@v3 + with: + name: ${{ env.om_ver_file }} + path: python/origen_metal/${{ env.om_ver_file }} + + # - name: Build Origen CLI + # working-directory: rust/origen/cli + # run: cargo build --bins --release - - name: Add Origen to PATH (Linux) - if: matrix.os == 'ubuntu-latest' - run: echo "${{ github.workspace }}/rust/origen/target/release" >> $GITHUB_PATH - - - name: Add Origen to PATH (Windows) - if: matrix.os == 'windows-latest' - run: echo "${{ github.workspace }}/rust/origen/target/release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - - - name: Display Python Version - run: python -c "import sys; print(sys.version)" + # - name: Add Origen to PATH (Linux) + # if: matrix.os == 'ubuntu-latest' + # run: echo "${{ github.workspace }}/rust/origen/target/release" >> $GITHUB_PATH + + # - name: Add Origen to PATH (Windows) + # if: matrix.os == 'windows-latest' + # run: echo "${{ github.workspace }}/rust/origen/target/release" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - - name: Display Origen CLI Version - run: origen -v + # - name: Display Origen CLI Version + # run: origen -v - - name: Build PyAPI - working-directory: rust/pyapi - run: cargo build --release + # - name: Build PyAPI + # working-directory: rust/pyapi + # run: cargo build --release - - name: Setup App Env - working-directory: python - run: origen env setup + # - name: Setup App Env + # working-directory: python + # run: origen env setup - - name: Display Origen App Version - working-directory: python - run: origen -v + # - name: Display Origen App Version + # working-directory: python + # run: origen -v - - name: Build The Package - working-directory: python + - name: Build Origen Python Package + working-directory: python/origen run: poetry build --format wheel - - name: Display Dist Directory (Windows) - if: matrix.os == 'windows-latest' - working-directory: python/dist + - name: Display Dist Directory + working-directory: python/origen/dist run: ls - - name: Display Dist Directory (Others) - if: matrix.os != 'windows-latest' - working-directory: python/dist - run: ls -al + - name: Upload Origen Python Package Artifact + uses: actions/upload-artifact@v3 + with: + name: origen_wheels + path: python/origen/dist/origen* + - name: Get Origen Python Package Version + working-directory: python/origen + run: poetry version -s > ${{ env.origen_ver_file }} + + - name: Upload Origen Python Package Version + uses: actions/upload-artifact@v3 + with: + name: ${{ env.origen_ver_file }} + path: python/origen/${{ env.origen_ver_file }} + # - name: "Publish To PyPi" # if: ${{ github.event.inputs.publish_pypi }} == true # working_directory: python @@ -102,14 +413,14 @@ jobs: # echo "Publishing to PyPi" # # poetry publish ... - - name: "Publish To PyPi Test Server" - if: ${{ github.event.inputs.publish_pypi_test == 'true' }} - working-directory: python - run: | - echo "Publishing to PyPi Test Server" - poetry config repositories.pypi-test https://test.pypi.org/legacy/ - poetry config pypi-token.pypi-test ${{ secrets.PYPI_TEST_SERVER_API_TOKEN }} - poetry publish -r pypi-test + # - name: "Publish To PyPi Test Server" + # if: ${{ github.event.inputs.publish_pypi_test == 'true' }} + # working-directory: python + # run: | + # echo "Publishing to PyPi Test Server" + # poetry config repositories.pypi-test https://test.pypi.org/legacy/ + # poetry config pypi-token.pypi-test ${{ secrets.PYPI_TEST_SERVER_API_TOKEN }} + # poetry publish -r pypi-test # - name: pypi-publish # if: ${{ github.event.inputs.publish_pypi_test == 'true' }} @@ -127,3 +438,208 @@ jobs: # run: | # echo "Publishing to Github Releases" # # ... + + show_wheels: + needs: [build_manylinux, build_windows] + runs-on: ubuntu-latest + steps: + - name: Retrieve OM Wheels + uses: actions/download-artifact@v3 + with: + name: om_wheels + path: om_wheels + + - name: List OM Wheels + run: ls -al ./om_wheels + + - name: Retrieve Origen Wheels + uses: actions/download-artifact@v3 + with: + name: origen_wheels + path: origen_wheels + + - name: List Origen Wheels + run: ls -al ./origen_wheels + + - name: Upload CLI as a standalone entity + uses: actions/upload-artifact@v3 + with: + name: cli + path: python\origen\origen\__bin__\bin\origen.exe + + publish_to_pypi_test: + needs: [build_manylinux, build_windows] + runs-on: ubuntu-latest + if: ${{ github.event.inputs.publish_pypi_test == 'true' }} + steps: + - name: Retrieve Wheels + uses: actions/download-artifact@v3 + with: + name: om_wheels + path: om_wheels + + - name: List OM Wheels + run: ls -al ./om_wheels + + - name: Push To PyPi Test Server + if: ${{ github.event.inputs.origen_metal_python_package == 'true' }} + uses: pypa/gh-action-pypi-publish@v1.8.10 + with: + packages-dir: om_wheels + password: ${{ secrets.PYPI_TEST_SERVER_API_TOKEN_OM }} + repository-url: https://test.pypi.org/legacy/ + verify-metadata: false + verbose: true + + - name: Retrieve Wheels + uses: actions/download-artifact@v3 + with: + name: origen_wheels + path: origen_wheels + + - name: List Origen Wheels + run: ls -al ./origen_wheels + + - name: Push To PyPi Test Server + if: ${{ github.event.inputs.origen_python_package == 'true' }} + uses: pypa/gh-action-pypi-publish@v1.8.10 + with: + packages-dir: origen_wheels + password: ${{ secrets.PYPI_TEST_SERVER_API_TOKEN }} + repository-url: https://test.pypi.org/legacy/ + verify-metadata: false + verbose: true + + publish_to_pypi: + needs: [build_manylinux, build_windows] + runs-on: ubuntu-latest + if: ${{ github.event.inputs.publish_pypi == 'true' }} + steps: + - name: Retrieve Wheels + uses: actions/download-artifact@v3 + with: + name: om_wheels + path: om_wheels + + - name: List OM Wheels + run: ls -al ./om_wheels + + - name: Push To PyPi Server + if: ${{ github.event.inputs.origen_metal_python_package == 'true' }} + uses: pypa/gh-action-pypi-publish@v1.8.10 + with: + packages-dir: om_wheels + password: ${{ secrets.PYPI_OM_API_TOKEN }} + verify-metadata: false + verbose: true + + - name: Retrieve Wheels + uses: actions/download-artifact@v3 + with: + name: origen_wheels + path: origen_wheels + + - name: List Origen Wheels + run: ls -al ./origen_wheels + + - name: Push To PyPi Server + if: ${{ github.event.inputs.origen_python_package == 'true' }} + uses: pypa/gh-action-pypi-publish@v1.8.10 + with: + packages-dir: origen_wheels + password: ${{ secrets.PYPI_ORIGEN_API_TOKEN }} + verify-metadata: false + verbose: true + + publish_github_release: + needs: [build_manylinux, build_windows] + runs-on: ubuntu-latest + if: ${{ github.event.inputs.publish_github_release == 'true' }} + steps: + - uses: actions/checkout@v2 + + - uses: actions/download-artifact@v3 + with: + name: om_wheels + path: origen_metal + + - uses: actions/download-artifact@v3 + with: + name: origen_wheels + path: origen + + - name: Check wheels directories + run: | + ls -al ./origen_metal + ls -al ./origen + + - uses: actions/download-artifact@v3 + with: + name: cli + path: cli + + - name: Show downloaded artifact directories + run: | + ls -al ./origen_metal + ls -al ./origen + ls -al ./cli + + - uses: actions/download-artifact@v3 + with: + name: ${{ env.om_ver_file }} + + - uses: actions/download-artifact@v3 + with: + name: ${{ env.origen_ver_file }} + + - uses: vimtor/action-zip@v1.1 + with: + files: origen_metal + dest: origen_metal.zip + + - uses: vimtor/action-zip@v1.1 + with: + files: origen + dest: origen.zip + + - uses: vimtor/action-zip@v1.1 + with: + files: cli + dest: cli.zip + + - name: Get OM/Origen Versions + run: | + ls -al + cat ./${{ env.om_ver_file }} + cat ./${{ env.origen_ver_file }} + echo "om_version=$(cat ./${{ env.om_ver_file }})" >> $GITHUB_ENV + echo "origen_version=$(cat ./${{ env.origen_ver_file }})" >> $GITHUB_ENV + + - name: Show Versions + run: | + echo ${{ env.om_version }} + echo ${{ env.origen_version }} + + - name: Figure Out Tag + run: | + echo "tag=commit-$(git rev-parse --short HEAD)" >> $GITHUB_ENV + + - name: Display Tag + run: echo ${{ env.tag }} + + - name: Generate Github Release + uses: ncipollo/release-action@v1 + with: + artifacts: ./origen_metal.zip, ./origen.zip, cli.zip + artifactErrorsFailBuild: true + prerelease: ${{ github.event.inputs.prerelease == 'true' }} + commit: ${{ github.sha }} + tag: ${{ env.tag }} + cleanup: + needs: [precheck, build_manylinux, build_windows, publish_to_pypi_test, publish_to_pypi, publish_github_release, show_wheels] + runs-on: ubuntu-latest + if: ${{ always() }} + steps: + - run: | + echo "Begin Clean Up..." + echo "No Clean Up Tasks!" diff --git a/.github/workflows/regression_test.yml b/.github/workflows/regression_test.yml index 95cd8a97..4af4d5a1 100644 --- a/.github/workflows/regression_test.yml +++ b/.github/workflows/regression_test.yml @@ -1,18 +1,27 @@ name: Regression Tests -on: [push] +on: + push: + paths-ignore: + # Ignore updates to just the publish action + - '.github/workflows/publish.yml' + # Ignore updates to just version files for Origen/OM/CLI + - 'rust/origen/cli/Cargo.toml' + - 'python/origen/pyproject.toml' + - 'python/origen_metal/pyproject.toml' + workflow_dispatch: jobs: build: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest] - python-version: [3.7, 3.8, 3.9, 3.10.5] + os: ${{ fromJSON(vars.SUPPORTED_OS) }} + python-version: ${{ fromJSON(vars.PYTHON_VERSIONS) }} runs-on: ${{ matrix.os }} env: RUST_BACKTRACE: full steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Show Git Version run : | @@ -22,14 +31,69 @@ jobs: uses: actions-rust-lang/setup-rust-toolchain@v1 with: toolchain: ${{ fromJSON(vars.RUST_VERSION) }} - #override: true - #components: rustfmt, clippy - + rustflags: + + - name: Override Project Rust Version + run: rustup override set ${{ fromJSON(vars.RUST_VERSION) }} + + - name: Check Rust Version + run: | + rustc --version + cargo --version + + # TODO Invocations: Currently some problem with poetry/pip on Windows where dependencies on drives/mounts separate + # from where the pyproject is located cannot be built. Can workaround this in Windows by updating the + # AGENT_TOOLSDIRECTORY/RUNNER_TOOL_CACHE environment variables, but I'm unable to get these to stick across steps + # in GA. Next few steps are all messiness to debug/work around that. + # Not an issue in Linux, so Windows only will be moved. linux will maintained across different drives. + - name: Pre-Python Install Setup (Windows-Only) + if: matrix.os == 'windows-latest' + run: | + $env:RUNNER_TOOL_CACHE = '${{ github.workspace }}' | Split-Path | Join-Path -ChildPath o2_GA_tools + $env:AGENT_TOOLSDIRECTORY = $env:RUNNER_TOOL_CACHE + mkdir $env:RUNNER_TOOL_CACHE + echo $env:AGENT_TOOLSDIRECTORY + echo $env:RUNNER_TOOL_CACHE + ls $env:AGENT_TOOLSDIRECTORY + echo "RUNNER_TOOL_CACHE=$env:RUNNER_TOOL_CACHE" + echo "AGENT_TOOLSDIRECTORY=$env:AGENT_TOOLSDIRECTORY" + echo "RUNNER_TOOL_CACHE=$env:RUNNER_TOOL_CACHE" >> $GITHUB_ENV + echo "AGENT_TOOLSDIRECTORY=$env:AGENT_TOOLSDIRECTORY" >> $GITHUB_ENV + + - name: Check ENV Variables (Windows-Only) + if: matrix.os == 'windows-latest' + run: | + echo $env:AGENT_TOOLSDIRECTORY + echo $env:RUNNER_TOOL_CACHE + echo $RUNNER_TOOL_CACHE + echo $AGENT_TOOLSDIRECTORY + + - name: Setup Python ${{ matrix.python-version }} + if: matrix.os != 'windows-latest' + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Setup Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + if: matrix.os == 'windows-latest' + uses: actions/setup-python@v4 + env: + RUNNER_TOOL_CACHE: D:\a\o2\o2_GA_tools + AGENT_TOOLSDIRECTORY: D:\a\o2\o2_GA_tools with: python-version: ${{ matrix.python-version }} + - name: Check Python Install (Windows-Only) + if: matrix.os == 'windows-latest' + run: | + echo $RUNNER_TOOL_CACHE + echo $AGENT_TOOLSDIRECTORY + echo $env:AGENT_TOOLSDIRECTORY + echo $env:RUNNER_TOOL_CACHE + ls $env:AGENT_TOOLSDIRECTORY + python -c "import os; [print(f'{v}: {k}') for v,k in os.environ.items()];" + python -c "import os, sys; print(os.path.dirname(sys.executable))" + # Needed to compile keyring library # Install taken from keyring library: # https://github.com/hwchen/keyring-rs/blob/v0.10.1/.github/workflows/ci.yaml#L80-L84 @@ -45,20 +109,26 @@ jobs: - name: Add Origen to PATH (Linux) if: matrix.os == 'ubuntu-latest' - run: echo "${{ github.workspace }}/rust/origen/target/debug" >> $GITHUB_PATH + run: | + echo "${{ github.workspace }}/rust/origen/target/debug" >> $GITHUB_PATH + export PATH="${{ github.workspace }}/rust/origen/target/debug:$PATH" - name: Add Origen to PATH (Windows) if: matrix.os == 'windows-latest' - run: echo "${{ github.workspace }}/rust/origen/target/debug" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append - + run: | + echo "${{ github.workspace }}/rust/origen/target/debug" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + $env:Path = "${{ github.workspace }}/rust/origen/target/debug;$env:Path" + - name: Display Python Version - run: python -c "import sys; print(sys.version)" + run: | + python -c "import sys; print(sys.version)" + pip --version - name: Display Origen CLI Version run: origen -v - name: Build PyAPI - run: origen build + run: origen origen build - name: Setup App Env working-directory: test_apps/python_app @@ -67,31 +137,140 @@ jobs: - name: Display Origen App Version working-directory: test_apps/python_app run: origen -v - + + - name: Show Origen Binary Location (Linux) + if: matrix.os == 'ubuntu-latest' + run: which origen + - name: Show Origen Binary Location (Windows) + if: matrix.os == 'windows-latest' + run: where.exe origen + - name: Display Poetry Version working-directory: test_apps/python_app run: poetry --version - - - name: Run Python Unit Tests + + # - name: Install importlib_metadata (Python 3.12) + # run: pip install importlib_metadata + + # - name: Cache Poetry Version (Linux) + # if: matrix.os == 'ubuntu-latest' + # working-directory: test_apps/python_app + # run: | + # POETRY_VER=$(python -c "import importlib_metadata; print(importlib_metadata.version('poetry'))") + # echo $POETRY_VER + # echo "poetry_version=$POETRY_VER" >> $GITHUB_ENV + # - name: Cache Poetry Version (Windows) + # if: matrix.os == 'windows-latest' + # working-directory: test_apps/python_app + # run: | + # $POETRY_VER = python -c "import importlib_metadata; print(importlib_metadata.version('poetry'))" + # echo $POETRY_VER + # echo "poetry_version=$POETRY_VER" >> $GITHUB_ENV + + - name: Show Origen Binary Location (Linux) + if: matrix.os == 'ubuntu-latest' working-directory: test_apps/python_app - run: origen exec pytest -vv - - - name: Run Diff Tests + run: | + which origen + poetry run which origen + - name: Show Origen Binary Location (Windows) + if: matrix.os == 'windows-latest' + working-directory: test_apps/python_app + run: | + where.exe origen + echo "" + poetry run where.exe origen + + # TODO GA: Add to build script? + - name: Move Origen executable (Linux) + if: matrix.os == 'ubuntu-latest' + run: cp rust/origen/target/debug/origen python/origen/origen/__bin__/bin + - name: Move Origen executable (Windows) + if: matrix.os == 'windows-latest' + run: cp rust/origen/target/debug/origen.exe python/origen/origen/__bin__/bin + + - name: Show Origen Binary Location (Linux) + if: matrix.os == 'ubuntu-latest' + working-directory: test_apps/python_app + run: | + which origen + poetry run which origen + - name: Show Origen Binary Location (Windows) + if: matrix.os == 'windows-latest' + working-directory: test_apps/python_app + run: | + where.exe origen + echo "" + poetry run where.exe origen + + - name: Run Python-App Unit Tests + uses: Wandalen/wretry.action@v1.3.0 + with: + attempt_limit: 2 + current_path: test_apps/python_app + command: origen exec pytest -vv + + - name: Run Python-App Diff Tests working-directory: test_apps/python_app run: origen examples - + + - name: Setup No-App Env + uses: Wandalen/wretry.action@v1.3.0 + with: + attempt_limit: 2 + current_path: test_apps/python_no_app + command: poetry install + + - name: Display Poetry Version (No-App) + working-directory: test_apps/python_no_app + run: poetry --version + + # Copy _origen + - name: Copy Origen Library (Windows) + if: matrix.os == 'windows-latest' + working-directory: .\rust\pyapi\ + run: cp .\target\debug\_origen.dll ..\..\python\origen\_origen.pyd + + # Copy _origen + - name: Copy Origen Library (Linux) + if: matrix.os == 'ubuntu-latest' + working-directory: rust/pyapi + run: cp target/debug/lib_origen.so ../../python/origen/_origen.so + + # Debug + - name: Display python/origen directory + working-directory: test_apps/python_no_app + run: ls ../../python/origen + + - name: Show Origen Binary Location (Linux) + if: matrix.os == 'ubuntu-latest' + working-directory: test_apps/python_no_app + run: | + which origen + poetry run which origen + - name: Show Origen Binary Location (Windows) + if: matrix.os == 'windows-latest' + working-directory: test_apps/python_no_app + run: | + where.exe origen + echo "" + poetry run where.exe origen + + - name: Display Origen No-App Version + working-directory: test_apps/python_no_app + run: poetry run origen -vvv + + - name: Run Python-No-App Unit Tests + working-directory: test_apps/python_no_app + run: poetry run pytest -vv + - name: Run Rust Tests if: matrix.python-version == 3.8 working-directory: rust/origen run: cargo test --workspace - name: Build PyAPI - Metal - run: origen build --metal - - - name: Install Poetry - uses: abatilo/actions-poetry@v2.0.0 - with: - poetry-version: 1.1.14 + run: origen origen build --metal - name: Setup Python Env - Metal working-directory: python/origen_metal @@ -102,7 +281,101 @@ jobs: run: poetry run pytest -vv - name: Run Rust Tests - Metal - if: matrix.python-version == 3.8 working-directory: rust/origen_metal run: cargo test + # Use a global pytest install for invocation tests + - name: Install Pytest + run: pip install pytest==7.2.1 jinja2==3.1.2 + + - name: Get Pytest Version (Check Install) + run: pytest --version + + # - name: Run User-Global Invocation Tests + # working-directory: test_apps/no_workspace + # run: pytest test_user_install.py::TestUserInstall -vv + + # TODO GA: Regressions: eventually want to move this into a poetry build step + # For now, manually move the binary. Also keeps us from having to mess with the path across OSs + # 'mv' command should be be fine for both linux & powershell + # Update: remove binary since it is being copied earlier. + - name: Remove Origen executable (Linux) + if: matrix.os == 'ubuntu-latest' + run: rm rust/origen/target/debug/origen +# run: rm rust/origen/target/debug/origen python/origen/origen/__bin__/bin + - name: Remove Origen executable (Windows) + if: matrix.os == 'windows-latest' + run: rm rust/origen/target/debug/origen.exe +# run: rm rust/origen/target/debug/origen.exe python/origen/origen/__bin__/bin + + # TODO GA: Regressions: not sure why, but the tmp directory in origen_metal causes some issues + # For now, just removing it. + - name: Remove origen_metal tmp Directory + run: rm python/origen_metal/tmp -r + + # TODO GA: Regressions: Need to better handle this + # Issue being that working on a newer Python version than what's released will not resolve + # Workaround by removing origen_metal package from origen dependencies and installing separately + - name: Hack origen pyproject + working-directory: python/origen + run: poetry remove origen_metal + + - name: Install Origen Packages + run: | + pip --version + poetry --version + pip install python/origen + pip install python/origen_metal + + - name: Show Origen Binary Location (Linux) + if: matrix.os == 'ubuntu-latest' + run: which origen + - name: Show Origen Binary Location (Windows) + if: matrix.os == 'windows-latest' + run: where.exe origen + + # - name: Reinstall Poetry Version + # run: | + # echo ${{ env.poetry_version }} + # poetry --version + # pip install poetry==${{ env.poetry_version }} + # poetry --version + + - name: Run User-Global Invocation Tests + working-directory: test_apps/no_workspace + run: pytest test_user_install.py::TestUserInstall -vv + + # Should be no pyprojects in the root so far. Start with no-workspace tests + - name: Run No-Workspace-No-Plugins Tests + working-directory: test_apps/no_workspace + run: pytest test_no_workspace.py::TestNoWorkspaceNoPlugins -vv + + - name: Install Plugins + run: | + pip install test_apps/test_apps_shared_test_helpers + pip install test_apps/python_plugin + pip install python/origen_metal + + - name: Run No-Workspace-With-Plugins Tests + working-directory: test_apps/no_workspace + run: pytest test_no_workspace.py::TestNoWorkspaceWithPlugins -vv + + # Leave the no-workspace setup. The global setup should override + - name: Run Global No-Plugins One Above Site-Packages Dir + working-directory: test_apps/no_workspace + run: pytest test_global_install.py::TestGlobalInstallNoPlugins -vv + + - name: Run Global With Plugins At Site-Packages Dir + working-directory: test_apps/no_workspace + run: pytest test_global_install.py::TestGlobalInstallWithPlugins -vv + + - name: Run Global No-Plugins At CLI Dir + working-directory: test_apps/no_workspace + run: pytest test_global_install.py::TestGlobalInstallAtCliDir -vv + + # With global origen available, test user install errors which fall back to the global install + - name: Run User Install Errors - Falling Back To Global Install + working-directory: test_apps/no_workspace + run: + poetry --version + pytest test_user_install.py::TestErrorCasesWithFallback -vv diff --git a/.gitignore b/.gitignore index f078ed88..a27c3f24 100755 --- a/.gitignore +++ b/.gitignore @@ -14,9 +14,8 @@ log/ .vscode /test_apps/python_app/example/templates/dut_info.txt /test_apps/**/.session -/python/origen/dist -/python/origen_metal/dist rls/ +.pytest_cache # pyenv .python-version @@ -35,9 +34,16 @@ rls/ # Output files from regressions python/origen/templates/dut_info.txt +test_apps/no_workspace/templates/output/ + +# Packaging artifacts +/python/origen/dist +/python/origen/1.0.0 +/python/origen_metal/dist +/python/origen_metal/build # Bin directory for packaging -python/origen/__bin__/bin/* -!python/origen/__bin__/bin/.keep +python/origen/origen/__bin__/bin/* +!python/origen/origen/__bin__/bin/.keep python/origen_metal/__bin__/bin/* !python/origen_metal/__bin__/bin/.keep diff --git a/python/origen/build_helpers/__init__.py b/python/origen/build_helpers/__init__.py new file mode 100644 index 00000000..1bcdf4cb --- /dev/null +++ b/python/origen/build_helpers/__init__.py @@ -0,0 +1,40 @@ +import platform, subprocess, sys, os + +windows = platform.system() == 'Windows' +origen_publish_step_env = os.getenv("ORIGEN_PUBLISH_STEP", None) +if origen_publish_step_env == 0: + publish_step = False +elif origen_publish_step_env == 1 : + publish_step = True +else: + publish_step = \ + os.getenv("GITHUB_WORKFLOW", "") == "Publish Packages" + # or "PEP517_BUILD_BACKEND" not in os.environ + +def compile_rust(dir, target=None, workspace=False): + cmd = ['cargo', 'build'] + if workspace: + cmd.append("--workspace") + if target: + cmd.append(f"--{target}") + print(f"Building Src At: {dir}: {(' ').join(cmd)}") + compile_result = subprocess.run( + cmd, + stderr=sys.stderr, + stdout=sys.stdout, + cwd=dir, + shell=windows, + ) + if compile_result.returncode != 0: + print(f"Failed to build target from {dir}. Received return code {compile_result.returncode}") + exit(1) + +def ls_dir(dir): + print(f"Showing directory: {dir}") + subprocess.run( + ["dir" if windows else "ls"], + stderr=sys.stderr, + stdout=sys.stdout, + cwd=dir, + shell=windows, + ) diff --git a/python/origen/origen/__bin__/__init__.py b/python/origen/origen/__bin__/__init__.py index b83e499f..cde91624 100644 --- a/python/origen/origen/__bin__/__init__.py +++ b/python/origen/origen/__bin__/__init__.py @@ -1,10 +1,12 @@ import sys import subprocess import pathlib - +import platform +on_windows = platform.system() == 'Windows' def run_origen(): - subprocess.run(str( - pathlib.Path(__file__).parent.absolute().joinpath("bin").joinpath( - "origen")) + " " + " ".join(sys.argv[1:]), - shell=True) + return subprocess.run([ + str(pathlib.Path(__file__).parent.absolute().joinpath("bin").joinpath("origen")), + *sys.argv[1:] + ], shell=on_windows, check=False).returncode + diff --git a/python/origen/origen/__init__.py b/python/origen/origen/__init__.py index 1a4c3591..547f5980 100644 --- a/python/origen/origen/__init__.py +++ b/python/origen/origen/__init__.py @@ -1,15 +1,21 @@ import sys import re -import os +import os, pathlib +import importlib_metadata + init_verbosity = 0 cli_path = None cli_ver = None vks = [] +pyproject_src = None +invoc = None regexp = re.compile(r'verbosity=(\d+)') cli_re = re.compile(r'origen_cli=(.+)') cli_ver_re = re.compile(r'origen_cli_version=(.+)') vk_re = re.compile(r'verbosity_keywords=(.+)') +pyproj_src_re = re.compile(r'pyproject_src=(.+)') +invoc_re = re.compile(r'invocation=(.+)') for arg in sys.argv: matches = regexp.search(arg) if matches: @@ -27,10 +33,43 @@ if matches: cli_ver = matches.group(1) next + matches = pyproj_src_re.search(arg) + if matches: + pyproject_src = matches.group(1) + next + matches = invoc_re.search(arg) + if matches: + invoc = matches.group(1) + next import _origen from _origen import _origen_metal +def __getattr__(name: str): + if name == "ldaps": + return _origen.utility.ldaps() + elif name == "current_user": + return users.current_user + elif name == "initial_user": + return users.initial_user + elif name == "is_app_present": + return status["is_app_present"] + elif name in ["command", "current_command", "cmd", "current_cmd"]: + return _origen._current_command_ + elif name == "core_app": + if not origen._core_app: + from origen import application + origen._core_app = application.Application(root=Path(os.path.abspath(application.__file__)).parent.parent, name="origen") + return origen._core_app + elif name == "plugins": + if origen._plugins is None: + from origen.core.plugins import collect_plugins + origen._plugins = collect_plugins() + return origen._plugins + else: + return _plugins + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") + # Replace origen_metal's native _origen_metal built library # with the one built from origen. sys.modules["origen_metal._origen_metal"] = _origen_metal @@ -39,7 +78,16 @@ om = origen_metal origen_metal.frontend.initialize() -_origen.initialize(init_verbosity, vks, cli_path, cli_ver) +_origen.initialize( + init_verbosity, + vks, + cli_path, + cli_ver, + pathlib.Path(__file__).parent, + sys.executable, + ((invoc, pyproject_src) if invoc else None) +) +del init_verbosity, vks, cli_path, cli_ver, invoc, pyproject_src from pathlib import Path import importlib @@ -50,8 +98,10 @@ from origen.tester import Tester, DummyTester from origen.producer import Producer +from origen_metal.utils.version import Version import origen.target +targets = origen.target config = _origen.config() ''' Dictionary of configurable workspace settings. @@ -66,6 +116,8 @@ :ref:`Configuring Origen ` ''' +__config_metadata__ = _origen.config_metadata() + status = _origen.status() ''' Dictionary of various application and workspace attributes Keys include: ``{{ list(origen.status.keys())|pprint }}`` @@ -90,6 +142,8 @@ root = Path(status["root"]) __console_history_file__ = root.joinpath(".origen").joinpath( "console_history") +else: + __console_history_file__ = om.users.current_user.__dot_origen_dir__.joinpath("console_history") __in_origen_core_app = status["in_origen_core_app"] ''' Indicates if the current application is the Origen core package @@ -98,17 +152,27 @@ bool ''' -version = _origen.version() -''' Returns the version of the Origen executable. +__version__ = importlib_metadata.version(__name__) +''' Returns the version of Origen. Returns: str: Origen executable version + >>> __origen__.version + '{{ origen_version }}' +''' + +version = Version(__version__) +''' Returns the version of Origen. + + Returns: + origen_metal.utils.version.Version: Origen version + >>> origen.version '{{ origen_version }}' ''' -logger = om.framework.logger +logger = om.framework.logger.Logger() ''' Direct access to the build-in logger module for logging and displaying user-friendly output. Also available as :data:`log` Returns: @@ -162,6 +226,8 @@ :ref:`The Application Workspace ` ''' +_core_app = None + dut = None ''' Pointer to the current DUT, or ``None``, if no DUT has been set. @@ -185,9 +251,8 @@ mode = "development" -_plugins = {} -''' Dictionary of Origen plugins (instances of :py:class:`origen.application.Application`) - that have been referenced and loaded. +_plugins = None +''' Dictionary of Origen plugins that have been referenced and loaded. It should never be access directly since a plugin not being present in this dict may only mean that it hasn't been loaded yet (via an official API) rather than it not existing. ''' @@ -233,7 +298,11 @@ sys.path.insert(0, status["root"]) a = importlib.import_module(f'{_origen.app_config()["name"]}.application') app = a.Application() - + in_app_context = True + in_global_context = False +else: + in_app_context = False + in_global_context = True def set_mode(val: str) -> None: """ Sets the current mode """ @@ -287,7 +356,7 @@ def has_plugin(name): ''' Returns true if an Origen plugin matching the given name is found in the current environment ''' - if name in _plugins: + if name in origen.plugins: return True else: try: @@ -295,7 +364,7 @@ def has_plugin(name): app = a.Application(root=Path(os.path.abspath( a.__file__)).parent.parent, name=name) - _plugins[name] = app + origen.plugins[name] = app return True except ModuleNotFoundError: return False @@ -308,7 +377,7 @@ def plugin(name): current environment. ''' if has_plugin(name): - return _plugins[name] + return origen.plugins[name] else: raise RuntimeError( f"The current Python environment does not contain a plugin named '{name}'" @@ -339,13 +408,3 @@ def __interactive_context__(): 'frontend_root', 'app', 'dut', 'tester', 'producer', 'has_plugin', 'plugin', 'current_user', 'users', 'mailer' ] - - -def __getattr__(name: str): - if name == "ldaps": - return _origen.utility.ldaps() - elif name == "current_user": - return users.current_user - elif name == "initial_user": - return users.initial_user - raise AttributeError(f"module {__name__!r} has no attribute {name!r}") diff --git a/python/origen/origen/application.py b/python/origen/origen/application.py index c1547657..9421b6b0 100644 --- a/python/origen/origen/application.py +++ b/python/origen/origen/application.py @@ -9,6 +9,7 @@ from origen.errors import * from origen.callbacks import _callbacks from types import ModuleType +from pathlib import Path import origen_metal @@ -78,6 +79,20 @@ def python_dir(self): ''' An alias for app_dir ''' return self._app_dir + # TEST_NEEDED app.config_dir + @property + def config_dir(self): + return self.root.joinpath("config") + + # TEST_NEEDED app.commands_dir + @property + def commands_dir(self): + d = self.app_dir.joinpath("commands") + if d.exists(): + return d + else: + return None + @property def session(self): ''' Return this app's session store''' @@ -112,10 +127,14 @@ def release_scribe(self): def mailer(self): return origen.mailer + @property + def is_plugin(self): + return self._plugin + def __init__(self, *args, **options): self._compiler = Compiler() self._translator = Translator() - if origen.app is None: + if (origen.app is None) and origen.is_app_present: self._plugin = False self._root = origen.root self._name = _origen.app_config()["name"] @@ -252,26 +271,36 @@ def instantiate_block(self, if r[0]: block_dir = r[1] + app_dir = None if block_dir is None: r = self.block_path_to_dir(path) if not r[0]: paths = path.split(".") - if len(paths) > 1 and origen.has_plugin(paths[0]): - return origen.plugin(paths[0]).instantiate_block( - ".".join(paths[1:]), - None, - class_name=class_name, - sb_options=sb_options) + if paths[0] == "origen": + return origen.core_app.instantiate_block( + ".".join(paths[1:]), + None, + class_name=class_name, + sb_options=sb_options) + elif path[0] == "origen_metal": + raise RuntimeError("origen_metal is not available as controller or application") else: - raise RuntimeError( - f"No block was found at path '{orig_path}'") + if len(paths) > 1 and origen.has_plugin(paths[0]): + return origen.plugin(paths[0]).instantiate_block( + ".".join(paths[1:]), + None, + class_name=class_name, + sb_options=sb_options) + else: + raise RuntimeError( + f"No block was found at path '{orig_path}'") else: block_dir = r[1] # If no controller class is defined then look up the nearest available parent controller_dir = block_dir controller_file = None - blocks_dir = self.app_dir.joinpath("blocks") + blocks_dir = app_dir or self.app_dir.joinpath("blocks") p = f"{path.split('.')[-1]}.py" if controller_dir.joinpath(p).exists(): controller_file = controller_dir.joinpath(p) diff --git a/python/origen/origen/boot.py b/python/origen/origen/boot.py index 275b30aa..02452585 100644 --- a/python/origen/origen/boot.py +++ b/python/origen/origen/boot.py @@ -1,20 +1,29 @@ -# These must come before all other imports. -from __future__ import print_function, unicode_literals, absolute_import - import pathlib -import importlib +from builtins import exit as exit_proc +from .core.commands import run_core_cmd + +dispatch_plugin_cmd = "_plugin_dispatch_" +dispatch_aux_cmd = "_dispatch_aux_cmd_" +dispatch_app_cmd = "_dispatch_app_cmd_" +exit = True def run_cmd(command, targets=None, verbosity=None, - verbosity_keywords="", + verbosity_keywords=None, mode=None, - files=None, - output_dir=None, - reference_dir=None, debug=False, args=None, + arg_indices=None, + ext_args=None, + ext_arg_indices=None, + extensions=None, + dispatch_root=None, + dispatch_src=None, + plugins=None, + subcmds=None, + exit=None, **kwargs): ''' Run an Origen command. This is the main entry method for the CLI, but it can also be used in application commands to invoke Origen commands within the same thread instead of @@ -32,223 +41,405 @@ def run_cmd(command, import origen.application import origen.target + if args is None: + args = {} + if arg_indices is None: + arg_indices = {} + + if command == dispatch_plugin_cmd: + cmd_src = "plugin" + elif command == dispatch_aux_cmd: + cmd_src = "aux_ns" + elif command == dispatch_app_cmd: + cmd_src = "app" + else: + cmd_src = "core" + dispatch = {} + + def wrap_mod_from_file(path): + try: + return origen.helpers.mod_from_file(path) + except Exception as e: + return [path, e] + + def mod_from_modulized_path(root, sub_parts): + root = pathlib.Path(root) + if not root.exists(): + return [f"Root directory '{root}' does not exists or is not accessible"] + path = pathlib.Path(f"{root.joinpath('.'.join(sub_parts))}.py") + if not path.exists(): + paths = [path] + if len(sub_parts) > 1: + modulized_path = pathlib.Path(root) + for i, sub in enumerate(sub_parts[:-1]): + modulized_path = modulized_path.joinpath(sub) + if modulized_path.exists(): + path = pathlib.Path(f"{modulized_path}/{'.'.join(sub_parts[(i+1):])}.py") + if path.exists(): + return wrap_mod_from_file(path) + else: + paths.append(path) + else: + return [f"From root '{root}', searched:", *[p.relative_to(root) for p in paths]] + return [f"From root '{root}', searched:", *[p.relative_to(root) for p in paths]] + else: + return [f"From root '{root}', searched:", *[p.relative_to(root) for p in paths]] + return wrap_mod_from_file(path) + + def call_user_cmd(cmd_type): + m = mod_from_modulized_path(dispatch_root, subcmds) + + if isinstance(m, list): + if isinstance(m[1], Exception): + origen.log.error(f"Could not load {cmd_type} command implementation from '{('.').join(subcmds)}' ({m[0]})") + origen.log.error(f"Received exception:\n{m[1]}") + else: + origen.log.error(f"Could not find implementation for {cmd_type} command '{('.').join(subcmds)}'") + for msg in m: + origen.log.error(f" {msg}") + exit_proc(1) + + if "run_func" in dispatch: + dispatch["run_func"](**(args or {})) + elif hasattr(m, 'run'): + m.run(**(args or {})) + else: + origen.logger.error(f"Could not find 'run' function in module '{m.__file__}'") + exit_proc(1) + if mode == None: - origen.set_mode(_origen.app_config()["mode"]) + if origen.is_app_present: + origen.set_mode(_origen.app_config()["mode"]) else: origen.set_mode(mode) + files = args.get("files", None) if files is not None: _origen.file_handler().init(files) if verbosity is not None: origen_metal.framework.logger.set_verbosity(verbosity) - origen_metal.framework.logger.set_verbosity_keywords(verbosity_keywords.split(",")) + if verbosity_keywords is not None: + origen_metal.framework.logger.set_verbosity_keywords(verbosity_keywords) + + output_dir = args.get("output_dir", None) if output_dir is not None: _origen.set_output_dir(output_dir) + reference_dir = args.get("reference_dir", None) if reference_dir is not None: _origen.set_reference_dir(reference_dir) if debug: _origen.enable_debug() - origen.target.setup(targets=targets) - - # The generate command handles patterns and flows. - # Future: Add options to generate patterns concurrently, or send them off to LSF. - # For now, just looping over the patterns. - if command == "generate": - origen.producer.generate(*[f for f in _origen.file_handler()]) - - # Alway print a summary when initiated from the CLI - origen.producer.summarize() - - elif command == "compile": - _origen.set_operation("compile") - for file in _origen.file_handler(): - origen.app.compile(pathlib.Path(file)) - - elif command == "interactive": - _origen.set_operation("interactive") - origen.logger.trace("Starting interactive session (on Python side)") - origen.target.load() - - from origen_metal._helpers import interactive - from origen import dut, tester - from origen.registers.actions import write, verify, write_transaction, verify_transaction - interactive.prep_shell(origen.__console_history_file__) - interactive.interact(banner=f"Origen {origen.version}", - context=origen.__interactive_context__()) - - elif command == "web:build": - _origen.set_operation("web") - from origen.web import run_cmd - return run_cmd("build", args) - - elif command == "web:view": - _origen.set_operation("web") - from origen.web import run_cmd - return run_cmd("view", args) - - elif command == "web:clean": - _origen.set_operation("web") - from origen.web import run_cmd - return run_cmd("clean", args) - - elif command == "app:publish": - _origen.set_operation("app") - origen.app.__publish__(**args).summarize_and_exit() - - elif command == "app:package": - _origen.set_operation("app") - origen.app.build_package(args) - - elif command == "app:run_publish_checks": - _origen.set_operation("app") - origen.app.__run_publish_checks__(args).summarize_and_exit() - - elif command == "app:init": - _origen.set_operation("app") - r = origen.app.__rc_init__() - r.summarize_and_exit() - - elif command == "app:status": - _origen.set_operation("app") - r = origen.app.__rc_status__() - r.summarize() - - elif command == "app:checkin": - _origen.set_operation("app") - checkin_all = args.pop("all", False) - args["dry_run"] = args.pop("dry-run", False) - if 'pathspecs' in args and not checkin_all: - r = origen.app.__rc_checkin__(**args) + from origen.core.plugins import from_origen_cli + from_origen_cli(plugins) + + if origen.is_app_present: + origen.target.setup(targets=([] if targets is False else targets)) + + if args is None: + args = {} + if subcmds is None: + subcmds = [] + if ext_args is None: + ext_args = {} + if ext_arg_indices is None: + ext_arg_indices = {} + if extensions is None: + extensions = [] + current_ext = None + + def before_cmd(func): + current_ext["before_cmd"] = func.__name__ + return func + setattr(origen.boot, "before_cmd", before_cmd) + + def after_cmd(func): + current_ext["after_cmd"] = func.__name__ + return func + setattr(origen.boot, "after_cmd", after_cmd) + + def clean_up(func): + current_ext["clean_up"] = func.__name__ + return func + setattr(origen.boot, "clean_up", clean_up) + + def on_load(func): + if current_ext: + current_ext["on_load"] = func.__name__ else: - r = origen.app.__rc_checkin__(pathspecs=None, **args) - r.gist() - - # TODO need to remove generic result - elif command == "mailer:test": - if origen.mailer is None: - from origen_metal.framework import Outcome - r = Outcome(succeeded=False, message="No mailer available!") + dispatch['on_load'] = func + return func + setattr(origen.boot, "on_load", on_load) + + def run(func): + dispatch['run_func'] = func + return func + setattr(origen.boot, "run", run) + + for ext in extensions: + current_ext = ext + if cmd_src == "core": + _dispatch_src = [command] + elif cmd_src == "app": + _dispatch_src = [] else: - r = origen.app.mailer.test(args.get("to", None)) - r.summarize_and_exit() - - # TODO need to remove generic result - elif command == "mailer:send": - if origen.mailer is None: - from origen_metal.framework import Outcome - r = Outcome(succeeded=False, message="No mailer available!") + _dispatch_src = [dispatch_src] + m = mod_from_modulized_path(ext['root'], [cmd_src, *_dispatch_src, *subcmds]) + if isinstance(m, list): + if len(m) == 2 and isinstance(m[1], Exception): + origen.log.error(f"Could not load {ext['source']} extension implementation from '{ext['name']}' ({m[0]})") + origen.log.error(f"Received exception:\n{m[1]}") + else: + if ext['source'] == "app": + n = '' + else: + n = f"'{ext['name']}'" + origen.log.error(f"Could not find implementation for {ext['source']} extension{n}") + for msg in m: + origen.log.error(f" {msg}") + ext['mod'] = None else: - r = origen.app.mailer.send(subject=args.get("subject", None), - to=args.get("to", None), - body=args["body"]) - r.summarize_and_exit() + ext['mod'] = m + + if "on_load" in ext: + getattr((ext["mod"]), ext["on_load"])(ext["mod"]) + current_ext = None + _origen.current_command.set_command(command, subcmds, args, ext_args, arg_indices, ext_arg_indices, extensions) + + def run_ext(phase, continue_on_fail=False): + for ext in extensions: + if phase in ext: + if ext['source'] == "app": + this_ext_args = ext_args["app"] + else: + this_ext_args = ext_args[ext['source']][ext['name']] + + try: + getattr(ext["mod"], ext[phase])(**this_ext_args) + except Exception as e: + if continue_on_fail: + origen.log.error(f"Error running {ext['source']} extension{'' if ext['source'] == 'app' else ' ' + ext['name']}") + origen.log.error(e) + else: + raise(e) + + try: + run_ext("before_cmd") + + # The generate command handles patterns and flows. + # Future: Add options to generate patterns concurrently, or send them off to LSF. + # For now, just looping over the patterns. + if command == "generate": + origen.producer.generate(*[f for f in _origen.file_handler()]) + + # Alway print a summary when initiated from the CLI + origen.producer.summarize() + + elif command == "compile": + _origen.set_operation("compile") + for file in _origen.file_handler(): + origen.app.compile(pathlib.Path(file)) + + elif command == "interactive": + _origen.set_operation("interactive") + origen.logger.trace("Starting interactive session (on Python side)") + if origen.is_app_present: + origen.target.load() + + from origen_metal._helpers import interactive + from origen import dut, tester + from origen.registers.actions import write, verify, write_transaction, verify_transaction + interactive.prep_shell(origen.__console_history_file__) + interactive.interact(banner=f"Origen {origen.version}", + context=origen.__interactive_context__()) + + elif command == "web:build": + _origen.set_operation("web") + from origen.web import run_cmd + return run_cmd("build", args) + + elif command == "web:view": + _origen.set_operation("web") + from origen.web import run_cmd + return run_cmd("view", args) + + elif command == "web:clean": + _origen.set_operation("web") + from origen.web import run_cmd + return run_cmd("clean", args) + + elif command == "app:publish": + _origen.set_operation("app") + origen.app.__publish__(**args).summarize_and_exit() + + elif command == "app:package": + _origen.set_operation("app") + origen.app.build_package(args) + + elif command == "app:run_publish_checks": + _origen.set_operation("app") + origen.app.__run_publish_checks__(args).summarize_and_exit() + + elif command == "app:init": + _origen.set_operation("app") + r = origen.app.__rc_init__() + r.summarize_and_exit() + + elif command == "app:status": + _origen.set_operation("app") + r = origen.app.__rc_status__() + r.summarize() + + elif command == "app:checkin": + _origen.set_operation("app") + checkin_all = args.pop("all", False) + args["dry_run"] = args.pop("dry-run", False) + if 'pathspecs' in args and not checkin_all: + r = origen.app.__rc_checkin__(**args) + else: + r = origen.app.__rc_checkin__(pathspecs=None, **args) + r.gist() + + # TODO need to remove generic result + elif command == "mailer:test": + if origen.mailer is None: + from origen_metal.framework import Outcome + r = Outcome(succeeded=False, message="No mailer available!") + else: + r = origen.app.mailer.test(args.get("to", None)) + r.summarize_and_exit() + + # TODO need to remove generic result + elif command == "mailer:send": + if origen.mailer is None: + from origen_metal.framework import Outcome + r = Outcome(succeeded=False, message="No mailer available!") + else: + r = origen.app.mailer.send(subject=args.get("subject", None), + to=args.get("to", None), + body=args["body"]) + r.summarize_and_exit() + + # Internal command to give the Origen version loaded by the application to the CLI + elif command == "_version_": + import importlib_metadata + + def tabify(message): + return "\n".join([f"\t{l}" for l in message.split("\n")]) + + if origen.__in_origen_core_app: + origen.logger.info("Running in Origen core application") + else: + print("Origen") + try: + print( + f"Success\n{tabify(importlib_metadata.version('origen'))}") + except Exception as e: + print("Error") + print(tabify(repr(e))) - # Internal command to give the Origen version loaded by the application to the CLI - elif command == "_version_": - import importlib_metadata + try: + if origen.app: + print(f"App\nSuccess\n{tabify(origen.app.version)}") + except Exception as e: + print("App") + print("Error") + print(tabify(repr(e))) - def tabify(message): - return "\n".join([f"\t{l}" for l in message.split("\n")]) + print("_ CLI") + try: + print(f"Success\n{tabify(origen.status['cli_version'])}") + except Exception as e: + print("Error") + print(tabify(repr(e))) - try: - if origen.app: - print(f"App\nSuccess\n{tabify(origen.app.version)}") - except Exception as e: - print("App") - print("Error") - print(tabify(repr(e))) + print("_ PyAPI") + try: + print( + f"Success\n{tabify(origen.status['other_build_info']['pyapi_version'])}" + ) + except Exception as e: + print("Error") + print(tabify(repr(e))) - if origen.__in_origen_core_app: - origen.logger.info("Running in Origen core application") - else: - print("Origen") + print("_ Origen (Rust Backend)") + try: + print(f"Success\n{tabify(origen.status['origen_version'])}") + except Exception as e: + print("Error") + print(tabify(repr(e))) + + print("_ Origen-Core-Support") try: print( - f"Success\n{tabify(importlib_metadata.version('origen'))}") + f"Success\n{tabify(origen.status['origen_core_support_version'])}" + ) except Exception as e: print("Error") print(tabify(repr(e))) - print("_ CLI") - try: - print(f"Success\n{tabify(origen.status['cli_version'])}") - except Exception as e: - print("Error") - print(tabify(repr(e))) + print("_ OrigenMetal (Rust Backend - Origen)") + try: + print( + f"Success\n{tabify(origen.status['origen_metal_backend_version'])}" + ) + except Exception as e: + print("Error") + print(tabify(repr(e))) - print("_ PyAPI") - try: - print( - f"Success\n{tabify(origen.status['other_build_info']['pyapi_version'])}" - ) - except Exception as e: - print("Error") - print(tabify(repr(e))) + print("_ origen_metal") + try: + print( + f"Success\n{tabify(importlib_metadata.version('origen_metal'))}" + ) + except Exception as e: + print("Error") + print(tabify(repr(e))) - print("_ Origen (Rust Backend)") - try: - print(f"Success\n{tabify(origen.status['origen_version'])}") - except Exception as e: - print("Error") - print(tabify(repr(e))) + print("_ _origen_metal (PyAPI Metal)") + try: + print(f"Success\n{tabify(origen_metal._origen_metal.__version__)}") + except Exception as e: + print("Error") + print(tabify(repr(e))) - print("_ Origen-Core-Support") - try: - print( - f"Success\n{tabify(origen.status['origen_core_support_version'])}" - ) - except Exception as e: - print("Error") - print(tabify(repr(e))) + print("_ OrigenMetal (Rust Backend - PyAPI Metal)") + try: + print( + f"Success\n{tabify(origen_metal._origen_metal.__origen_metal_backend_version__)}" + ) + except Exception as e: + print("Error") + print(tabify(repr(e))) - print("_ OrigenMetal (Rust Backend - Origen)") - try: - print( - f"Success\n{tabify(origen.status['origen_metal_backend_version'])}" - ) - except Exception as e: - print("Error") - print(tabify(repr(e))) - print("_ origen_metal") - try: - print( - f"Success\n{tabify(importlib_metadata.version('origen_metal'))}" - ) - except Exception as e: - print("Error") - print(tabify(repr(e))) + elif command == dispatch_app_cmd: + call_user_cmd("app") - print("_ _origen_metal (PyAPI Metal)") - try: - print(f"Success\n{tabify(origen_metal._origen_metal.__version__)}") - except Exception as e: - print("Error") - print(tabify(repr(e))) + elif command == dispatch_plugin_cmd: + call_user_cmd("plugin") - print("_ OrigenMetal (Rust Backend - PyAPI Metal)") - try: - print( - f"Success\n{tabify(origen_metal._origen_metal.__origen_metal_backend_version__)}" - ) - except Exception as e: - print("Error") - print(tabify(repr(e))) - - # Internal command to dispatch an app/plugin command - elif command == "_dispatch_": - path = f'{origen.app.name}.commands' - for cmd in kwargs["commands"]: - path += f'.{cmd}' - m = importlib.import_module(path) - m.run(**(args or {})) - exit(0) + elif command == dispatch_aux_cmd: + call_user_cmd("aux") + + elif run_core_cmd(command, subcmds, args): + pass + + else: + raise RuntimeError(f"Unsupported command '{command}'") + + run_ext("after_cmd") + finally: + run_ext("clean_up", continue_on_fail=True) + if exit is None: + if origen.boot.exit: + exit_proc(0) + elif exit is False: + pass else: - print(f"Unknown command: {command}") - exit(1) + exit_proc(0) diff --git a/python/origen/origen/core/commands/__init__.py b/python/origen/origen/core/commands/__init__.py new file mode 100644 index 00000000..6adf3d28 --- /dev/null +++ b/python/origen/origen/core/commands/__init__.py @@ -0,0 +1,37 @@ +import importlib, origen + +creds = "credentials" +eval = "eval" + +_subcmds = None +_base_cmd = None + +def import_cmd(cmd): + return importlib.import_module(f"origen.core.commands.{cmd}") + +def is_subcmd(*subcs): + return list(subcs) == _subcmds + +def unsupported_subcmd(subcmd=None): + if subcmd is None: + print(f"Unsupported sub-command '{(' -> ').join(_subcmds)}' for base command '{_base_cmd}'") + else: + print(f"Unsupported sub-command '{subcmd}' for '{_base_cmd}'") + exit(1) + +def run_core_cmd(base_cmd, sub_cmds, args): + origen.core.commands._base_cmd = base_cmd + origen.core.commands._subcmds = sub_cmds + try: + if base_cmd == creds: + import_cmd(creds).run(args) + elif base_cmd == eval: + import_cmd(eval).run(args) + else: + return False + return True + except Exception as e: + raise e + finally: + origen.core.commands._base_cmd = None + origen.core.commands._subcmds = None diff --git a/python/origen/origen/core/commands/credentials.py b/python/origen/origen/core/commands/credentials.py new file mode 100644 index 00000000..66d36f03 --- /dev/null +++ b/python/origen/origen/core/commands/credentials.py @@ -0,0 +1,35 @@ +import _origen, origen +from . import is_subcmd, unsupported_subcmd + +def run(args): + _origen.set_operation("credentials") + datasets = args.get("datasets", None) + all = args.get("all", False) + if is_subcmd("set"): + if all: + origen.logger.display("Setting passwords for all available datasets...") + for d in origen.current_user.datasets.values(): + d.password = None + d.password() + origen.logger.display("Done!") + elif datasets is None: + origen.current_user.password = None + origen.current_user.password + else: + for d in datasets: + d.password = None + d.password() + elif is_subcmd("clear"): + if all: + origen.logger.display("Clearing all cached passwords...") + origen.current_user.clear_cached_passwords() + elif datasets is None: + origen.logger.display("Clearing cached password for topmost dataset...") + origen.current_user.clear_cached_password() + else: + for d in datasets: + origen.logger.display(f"Clearing cached password for dataset '{d}'") + origen.current_user.datasets[d].clear_cached_password() + origen.logger.display("Done!") + else: + unsupported_subcmd() diff --git a/python/origen/origen/core/commands/eval.py b/python/origen/origen/core/commands/eval.py new file mode 100644 index 00000000..500fd066 --- /dev/null +++ b/python/origen/origen/core/commands/eval.py @@ -0,0 +1,63 @@ +import origen, pathlib + +def run(args): + code = list(args.get('code', [])) + files = list(args.get('scripts', [])) + code_indices = list(origen.current_command.arg_indices.get('code', [])) + file_indices = list(origen.current_command.arg_indices.get('scripts', [])) + if len(code_indices) > 0: + code_idx = code_indices.pop() + else: + code_idx = None + if len(file_indices) > 0: + files_idx = file_indices.pop() + else: + files_idx = None + + # Build the run order based on where the given code or script file appear in the command line + to_run = [] + while (code_idx is not None) or (files_idx is not None): + if (code_idx or -1) > (files_idx or -1): + to_run.append(code.pop()) + if len(code_indices) > 0: + code_idx = code_indices.pop() + else: + code_idx = None + else: + p = pathlib.Path(files.pop()) + if not p.exists(): + msg = f"Could not find script file '{p}'" + origen.logger.error(msg) + exit(1) + to_run.append(p) + if len(file_indices) > 0: + files_idx = file_indices.pop() + else: + files_idx = None + + # Decouple run environment from boot environment, but assume origen is already imported + eval_locals = {"origen": origen} + eval_globals = {} + + # Above is actually built with highest index first, so iterate through in reverse + for code in reversed(to_run): + if isinstance(code, pathlib.Path): + c = open(code).read() + else: + c = code + + try: + exec(c, eval_globals, eval_locals) + except Exception as e: + # Doctor the traceback to remove the references to boot.py + # Cleans up the traceback to just what the user should care about + import traceback, sys + tb = e.__traceback__ + exc = traceback.format_exception(None, e, tb) + exc = [exc[0]] + exc[2:-1] + [exc[-1].strip()] + if isinstance(code, pathlib.Path): + origen.logger.error(f"Exception occurred evaluating from script '{code}'") + else: + origen.logger.error(f"Exception occurred evaluating code:\n{c}") + print(''.join(exc), file=sys.stderr) + exit(1) diff --git a/python/origen/origen/core/plugins.py b/python/origen/origen/core/plugins.py new file mode 100644 index 00000000..718d6f3a --- /dev/null +++ b/python/origen/origen/core/plugins.py @@ -0,0 +1,44 @@ +import origen +from collections import UserDict +import importlib, os +from pathlib import Path +import _origen + +def collect_plugins(): + pls = Plugins() + for n, r in _origen.plugins.get_plugin_roots().items(): + pls.register(n) + origen._plugins = pls + return origen._plugins + +def from_origen_cli(plugins): + pls = Plugins() + if plugins: + for name in plugins.keys(): + pls.register(name) + origen._plugins = pls + return origen._plugins + +class Plugins(UserDict): + def __init__(self): + UserDict.__init__(self) + + @property + def plugins(self): + return self.data + + @property + def names(self): + return list(self.data.keys()) + + def register(self, name): + a = importlib.import_module(f'{name}.application') + app = a.Application(root=Path(os.path.abspath( + a.__file__)).parent.parent, + name=name) + self.data[name] = app + return app + + # def load_from_config(self): + # for pl in _origen.config['plugins']['load']: + # self._load_pl() diff --git a/python/origen/origen/helpers/__init__.py b/python/origen/origen/helpers/__init__.py index 94044e2d..808eddf1 100644 --- a/python/origen/origen/helpers/__init__.py +++ b/python/origen/origen/helpers/__init__.py @@ -1,4 +1,4 @@ -import importlib.util, pathlib +import importlib.util, pathlib, inspect import origen import origen.helpers.num @@ -11,6 +11,8 @@ def try_method(obj, m, args): def has_method(obj, m): return hasattr(obj, m) and callable(getattr(obj, m)) +def calling_filename(frame=1): + return pathlib.Path(inspect.stack()[frame].filename) # Import a module from a file, as described here: https://stackoverflow.com/questions/67631/how-to-import-a-module-given-the-full-path # The name can be whatever. If no name is given, then the file name is used diff --git a/python/origen/origen/helpers/env.py b/python/origen/origen/helpers/env.py new file mode 100644 index 00000000..716dd67e --- /dev/null +++ b/python/origen/origen/helpers/env.py @@ -0,0 +1,79 @@ +# TODO add tests and remove equivalents +import inspect, subprocess, pathlib, os +from origen_metal._helpers import in_new_proc +from origen import running_on_windows + +def in_new_origen_proc(func=None, mod=None, *, func_kwargs=None, with_configs=None, expect_fail=None, bypass_config_lookup=False): + if isinstance(with_configs, str) or isinstance(with_configs, pathlib.Path): + with_configs=[with_configs] + + if func is None: + func = getattr(mod, inspect.stack()[1].function) + return in_new_proc(func, mod, func_kwargs=func_kwargs, expect_fail=expect_fail) + +def run_cli_cmd(cmd, *, + with_env=None, + with_configs=None, + bypass_config_lookup=False, + input=None, + expect_fail=False, + return_details=False, + shell=None, + targets=None, + check=True, + poetry_run=False, + origen_exe=None +): + if isinstance(cmd, str): + cmd = [cmd] + else: + def to_cmd(c): + if isinstance(c, pathlib.Path): + return c.as_posix() + else: + return c + cmd = list(map(to_cmd, cmd)) + + if (origen_exe is None) or isinstance(origen_exe, str): + origen_exe = [origen_exe or 'origen'] + if poetry_run: + origen_exe = ["poetry", "run", *origen_exe] + cmd = [*origen_exe, *cmd] + + subp_env = os.environ.copy() + if isinstance(with_configs, str) or isinstance(with_configs, pathlib.Path): + with_configs=[with_configs] + if with_configs: + subp_env["origen_config_paths"] = os.pathsep.join([str(c) for c in with_configs]) + + if with_env: + subp_env.update(with_env) + + if bypass_config_lookup: + subp_env["origen_bypass_config_lookup"] = "1" + + if shell is None: + shell = running_on_windows + + if targets is False: + cmd.append("--no_targets") + elif targets: + if isinstance(targets, str): + targets = [targets] + cmd += ["-t", *targets] + + if expect_fail: + result = subprocess.run(cmd, shell=shell, capture_output=True, text=True, input=input, env=subp_env) + if result.returncode == 0: + cmd = ' '.join(cmd) + raise RuntimeError(f"Expected cmd '{cmd}' to fail but received return code 0") + else: + result = subprocess.run(cmd, shell=shell, check=check, capture_output=True, text=True, input=input, env=subp_env) + if return_details: + return { + "stderr": result.stderr, + "stdout": result.stdout, + "returncode": result.returncode + } + else: + return result.stdout diff --git a/python/origen/origen/helpers/regressions/__init__.py b/python/origen/origen/helpers/regressions/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/python/origen/origen/helpers/regressions/cli/__init__.py b/python/origen/origen/helpers/regressions/cli/__init__.py new file mode 100644 index 00000000..c782279a --- /dev/null +++ b/python/origen/origen/helpers/regressions/cli/__init__.py @@ -0,0 +1,87 @@ +'''Regression test helpers for testing/checking Origen CLI integration''' + +import re, abc +from .command import Cmd, CmdArg, CmdOpt, SrcTypes +from .help_msg import HelpMsg +from .origen import _CommonNames, GlobalCommands, InAppCommands, CoreOpts, CoreErrorMessages +from .... import origen as o + +cmd = command + +class CLIProperties(abc.ABCMeta, type): + @property + def app_sub_cmd_path(cls): + cmd = cls.in_app_cmds.app + return [cmd.name, cmd.commands.name] + +class CLI(metaclass=CLIProperties): + @classmethod + def run_cli_cmd(cls, *args, **kwargs): + return o.helpers.env.run_cli_cmd(*args, **kwargs) + + @classmethod + def gen_error(cls, *args, **kwargs): + return o.helpers.env.run_cli_cmd(*args, expect_fail=True, **kwargs) + + HelpMsg = HelpMsg + Cmd = Cmd + CmdOpt = CmdOpt + CmdArg = CmdArg + + opts = CoreOpts() + core_opts = opts + + global_commands = GlobalCommands() + global_cmds = global_commands + global_core_cmds = global_commands + global_core_commands = global_commands + + in_app_commands = InAppCommands() + in_app_cmds = in_app_commands + in_app_core_cmds = in_app_commands + in_app_core_commands = in_app_commands + + common_names = _CommonNames() + + @classmethod + def pl_cmd(cls, plugin, *args, **kwargs): + return cls.Cmd(plugin, cmd_path=[cls.common_names.pl], *args, **kwargs) + + @classmethod + def pl_sub_cmd(cls, plugin, name, *args, cmd_path=None, **kwargs): + return cls.Cmd(name, cmd_path=[cls.common_names.pl, plugin, *(cmd_path or [])], *args, **kwargs) + + @classmethod + def aux_cmd(cls, namespace, *args, from_config=None, **kwargs): + return cls.Cmd(namespace, cmd_path=[cls.common_names.aux_cmds], use_configs=from_config, *args, **kwargs) + + @classmethod + def aux_sub_cmd(cls, namespace, name, *args, cmd_path=None, from_config=None, **kwargs): + return cls.Cmd(name, cmd_path=[cls.common_names.aux_cmds, namespace, *(cmd_path or [])], use_configs=from_config, *args, **kwargs) + + @classmethod + def app_sub_cmd(cls, *args, cmd_path=None, **kwargs): + return cls.Cmd(cmd_path=[*cls.app_sub_cmd_path, *(cmd_path or [])], *args, **kwargs) + + @classmethod + def eval(cls, *code, **kwargs): + if o.app: + cmd = InAppCommands.eval + else: + cmd = GlobalCommands.eval + return cmd.run(*code, **kwargs) + + if o.in_app_context: + cmds = in_app_cmds + else: + cmds = global_cmds + + error_messages = CoreErrorMessages() + + @property + def err_msgs(self): + return self.error_messages + + @classmethod + def extract_logged_errors(cls, text): + return list(map(lambda l: re.split(r"\[ERROR\] \(..:..:..\....\): ", l, 1)[1], filter(lambda l: "[ERROR] (" in l, text.split("\n")))) \ No newline at end of file diff --git a/python/origen/origen/helpers/regressions/cli/_origen.py b/python/origen/origen/helpers/regressions/cli/_origen.py new file mode 100644 index 00000000..6265819b --- /dev/null +++ b/python/origen/origen/helpers/regressions/cli/_origen.py @@ -0,0 +1,50 @@ +from .command import CmdOpt + +def to_std_opt(opt): + if opt == "m": + return CmdOpt( + "mode", + help="Override the default mode currently set by the workspace for this command", + takes_value=True, + multi=False, + ln="mode", + ) + elif opt == "nt": + return CmdOpt( + "no_targets", + help="Clear any targets currently set by the workspace for this command", + takes_value=False, + ln_aliases=["no_target"], + ) + elif opt == "o": + return CmdOpt( + "output_dir", + help="Override the default output directory (/output)", + sn="o", + ln="output-dir", + takes_value=True, + ln_aliases=["output_dir"], + ) + elif opt == "r": + return CmdOpt( + "reference_dir", + help="Override the default reference directory (/.ref)", + sn="r", + ln="ref-dir", + takes_value=True, + ln_aliases=["reference_dir", "ref_dir", "reference-dir"], + value_name="REFERENCE_DIR", + ) + elif opt == "t": + return CmdOpt( + "targets", + help="Override the targets currently set by the workspace for this command", + takes_value=True, + multi=True, + use_delimiter=True, + ln="targets", + ln_aliases=["target"], + sn="t", + ) + else: + raise RuntimeError(f"Unknown std opt '{opt}'") diff --git a/python/origen/origen/helpers/regressions/cli/command.py b/python/origen/origen/helpers/regressions/cli/command.py new file mode 100644 index 00000000..f61a3a0d --- /dev/null +++ b/python/origen/origen/helpers/regressions/cli/command.py @@ -0,0 +1,415 @@ +import enum +from pathlib import Path +from origen.helpers.env import run_cli_cmd +from .help_msg import HelpMsg + +class CmdArgOpt: + def to_vn(self): + return self.value_name or self.name.upper() + +class CmdArg(CmdArgOpt): + def __init__( + self, + name, + help=None, + multi=False, + required=False, + value_name=None, + use_delimiter=None + ): + self.name = name + self.help = help + self.multi = multi + self.required = required + self.value_name = value_name + self.use_delimiter = use_delimiter + self.is_ext = False + self.is_opt = False + self.is_arg = True + +class CmdOpt(CmdArgOpt): + def __init__( + self, + name, + help=None, + takes_value=False, + multi=False, + required=False, + sn=None, + ln=None, + sn_aliases=None, + ln_aliases=None, + value_name=None, + hidden = False, + use_delimiter=None, + full_name=None, + access_with_full_name=False, + ): + self.name = name + self.help = help + self.takes_value = takes_value + self.multi = multi + self.required = required + self.sn = sn + self.ln = ln + self.sn_aliases = sn_aliases + self.ln_aliases = ln_aliases + self.value_name = value_name + self.hidden = hidden + self.use_delimiter = use_delimiter + self.full_name = full_name + self.access_with_full_name = access_with_full_name + self.is_ext = False + self.is_opt = True + self.is_arg = False + + def to_ln(self): + if self.access_with_full_name: + return self.full_name + else: + return self.ln or self.name + + def ln_to_cli(self): + return f"--{self.to_ln()}" + + def sn_to_cli(self): + return f"-{self.sn}" + + def sna_to_cli(self, a=0): + return f"-{self.sn_aliases[a]}" + + def to_cli(self): + if self.sn: + return self.sn_to_cli() + else: + return self.ln_to_cli() + +class SrcTypes(enum.Enum): + CORE = enum.auto() + APP = enum.auto() + PLUGIN = enum.auto() + AUX = enum.auto() + + def __str__(self) -> str: + if self == self.CORE: + return "origen" + elif self == self.APP: + return "app" + elif self == self.PLUGIN: + return "plugin" + elif self == self.AUX: + return "aux" + + def displayed(self, src_name=None): + if self == SrcTypes.APP: + return "the App" + elif self == SrcTypes.PLUGIN: + return f"plugin '{src_name}'" + elif self == SrcTypes.AUX: + return f"aux namespace '{src_name}'" + +class CmdExtOpt(CmdOpt): + @classmethod + def from_src(cls, src_name, src_type, *args): + for a in args: + a.src_name = src_name + a.src_type = src_type + if src_type == SrcTypes.APP: + src_n = "" + else: + src_n = f".{src_name}" + a.full_name = f"ext_opt.{src_type}{src_n}.{a.name}" + return args + + def __init__(self, *args, src_name=None, src_type=None, **kwargs): + CmdOpt.__init__(self, *args, **kwargs) + self.is_ext = True + self.src_name = src_name + self.src_type = src_type + + @property + def provided_by_app(self): + return self.src_type == SrcTypes.APP + + @property + def provided_by(self): + if self.provided_by_app: + return "the App" + else: + return self.src_name + + @property + def displayed(self): + return self.src_type.displayed(self.src_name) + +class CmdDemo: + def __init__(self, name, args=None, expected_output=None) -> None: + self.name = name + self.args = args + self.expected_output = [expected_output] if isinstance(expected_output, str) else expected_output + self.parent = None + + def copy(self): + return self.__class__( + self.name, + list(self.args), + (self.expected_output) if self.expected_output else None, + ) + + def run(self, add_args=None, **kwargs): + return self.parent.run(*(self.args + (add_args or [])), **kwargs) + + def gen_error(self, add_args=None, **kwargs): + return self.parent.gen_error(*(self.args + (add_args or [])), **kwargs) + + def assert_present(self, in_str): + for e in self.expected_output: + assert e in in_str + +class Cmd: + def __init__( + self, + name, + cmd_path=None, + help=None, + args=None, + opts=None, + subcmds=None, + use_configs=None, + with_env=None, + demos=None, + global_demos=None, + app_demos=None, + parent=None, + aliases=None, + src_type=None, + prefix_opts=False, + extendable=True, + h_opt_idx=None, + v_opt_idx=None, + vk_opt_idx=None, + help_subc_idx=None, + ): + from ._origen import to_std_opt + self.name = name + self.cmd_path = cmd_path or [] + self.help = help + self.args = dict([[arg.name, arg] for arg in (args or [])]) + opts = [(to_std_opt(o) if isinstance(o, str) else o) for o in (opts or [])] + self.opts = dict([[opt.name, opt] for opt in (opts or [])]) + self.subcmds = dict([[subcmd.name, subcmd] for subcmd in (subcmds or [])]) + self.aliases = aliases + self.exts = None + self.with_env = with_env + self.parent = parent + self.src_type = src_type + self.prefix_opts = prefix_opts + if use_configs: + if not isinstance(use_configs, list): + use_configs = [use_configs] + self.use_configs = [Path(c) for c in use_configs] + else: + self.use_configs = None + for subcmd in self.subcmds.values(): + subcmd.parent = self + subcmd.cmd_path = self.cmd_path + [self.name] + + if self.parent is None: + self.update_subc() + + self.demos = dict([[d.name, d] for d in (demos or [])]) + for d in self.demos.values(): d.parent = self + self.global_demos = dict([[d.name, d] for d in (global_demos or [])]) + for d in self.global_demos.values(): d.parent = self + self.app_demos = dict([[d.name, d] for d in (app_demos or [])]) + for d in self.app_demos.values(): d.parent = self + + self.extendable = extendable + self.h_opt_idx = h_opt_idx + self.v_opt_idx = v_opt_idx + self.vk_opt_idx = vk_opt_idx + self.help_subc_idx = help_subc_idx + + def replace_subcmds(self, *subcmds): + self.subcmds = dict([[subcmd.name, subcmd] for subcmd in (subcmds or [])]) + for subcmd in self.subcmds.values(): + subcmd.parent = self + subcmd.cmd_path = self.cmd_path + [self.name] + + if self.parent is None: + self.update_subc() + + def update_subc(self): + for subcmd in self.subcmds.values(): + subcmd.cmd_path = self.cmd_path + [self.name] + subcmd.use_configs = [ + *(self.use_configs or []), + *(subcmd.use_configs or []) + ] + subcmd.with_env = { + **(self.with_env or {}), + **(subcmd.with_env or {}) + } + subcmd.update_subc() + + def extend(self, exts, with_env=None, from_configs=None): + dup = self.__class__( + self.name, + self.cmd_path, + self.help, + self.args.values(), + self.opts.values(), + self.subcmds.values(), + [*self.use_configs] if self.use_configs else None, + dict(self.with_env) if self.with_env else None, + [d.copy() for d in self.demos.values()], + [d.copy() for d in self.global_demos.values()], + [d.copy() for d in self.app_demos.values()], + self.parent, + self.aliases, + self.src_type, + self.prefix_opts, + self.extendable, + self.h_opt_idx, + self.v_opt_idx, + self.vk_opt_idx, + self.help_subc_idx, + ) + dup.exts = dict(self.exts) if self.exts else {} + dup.exts.update(dict([[ext.name, ext] for ext in (exts or [])])) + if from_configs: + if isinstance(from_configs, str): + from_configs = [from_configs] + elif isinstance(from_configs, Path): + from_configs = [from_configs] + + if dup.use_configs: + dup.use_configs += from_configs + else: + dup.use_configs = from_configs + if with_env: + if dup.with_env: + dup.with_env.update(with_env) + else: + dup.with_env = with_env + return dup + + def _with_configs_(self, with_configs): + if self.use_configs: + if isinstance(with_configs, str): + with_configs = self.use_configs + [with_configs] + elif isinstance(with_configs, Path): + with_configs = self.use_configs + [with_configs] + else: + with_configs = self.use_configs + (with_configs or []) + return with_configs + + def get_help_msg_str(self, with_configs=None, run_opts=None, opts_pre_cmd=None): + return self.run("help" if self.prefix_opts else "-h", with_configs=with_configs, run_opts=run_opts, pre_cmd_opts=(opts_pre_cmd or self.prefix_opts)) + + def get_help_msg(self, with_configs=None, bypass_config_lookup=None, run_opts=None, opts_pre_cmd=None): + return HelpMsg(self.get_help_msg_str(with_configs=with_configs, run_opts=run_opts, opts_pre_cmd=opts_pre_cmd)) + + def run(self, *args, with_env=None, with_configs=None, expect_fail=False, run_opts=None, pre_cmd_opts=None): + run_opts = dict(run_opts) if run_opts else {} + a = [(a.to_cli() if isinstance(a, CmdOpt) else a) for a in args] + if pre_cmd_opts is None or pre_cmd_opts is False: + pre_cmd_opts = [] + elif pre_cmd_opts is True: + pre_cmd_opts = a + a = [] + + return run_cli_cmd( + [*pre_cmd_opts, *self.cmd_path, *([self.name] if self.name else []), *a], + with_env=run_opts.pop("with_env", None) or with_env or self.with_env, + with_configs=run_opts.pop("with_configs", None) or self._with_configs_(with_configs), + expect_fail=run_opts.pop("expect_fail", None) or expect_fail, + return_details=run_opts.pop("return_details", None) or expect_fail, + **(run_opts or {}), + ) + + def gen_error(self, *args, with_configs=None, return_stdout=False, return_full=False, run_opts=None, pre_cmd_opts=None): + out = self.run( + *args, + with_configs=with_configs, + expect_fail=True, + run_opts=run_opts, + pre_cmd_opts=pre_cmd_opts, + ) + if return_full: + return out + if return_stdout: + return out["stdout"] + else: + return out["stderr"] + + def __getattr__(self, name: str): + if hasattr(self, 'args') and (name in self.args): + return self.args[name] + elif hasattr(self, 'opts') and (name in self.opts): + return self.opts[name] + elif hasattr(self, 'subcmds') and (name in self.subcmds): + return self.subcmds[name] + elif hasattr(self, 'exts') and (name in (self.exts or [])): + return self.exts[name] + return object.__getattribute__(self, name) + + @property + def num_args(self): + return len(self.args) + + @property + def visible_opts(self): + return {n:opt for (n, opt) in self.opts.items() if not opt.hidden} + + @property + def num_opts(self): + return len(self.visible_opts) + 3 # 3 for standard opts (-h, -v, --vk) + + def global_demo(self, name): + if name in self.global_demos: + return self.global_demos[name] + elif name in self.demos: + return self.demos[name] + + @property + def is_app_cmd(self): + return (self.cmd_path[0] == "app") if len(self.cmd_path) > 0 else False + + @property + def is_pl_cmd(self): + return (self.cmd_path[0] == "plugin") if len(self.cmd_path) > 0 else False + + @property + def is_aux_cmd(self): + return (self.cmd_path[0] == "aux") if len(self.cmd_path) > 0 else False + + @property + def is_core_cmd(self): + return not (self.is_app_cmd or self.is_pl_cmd or self.is_aux_cmd) + + @property + def full_name(self): + if self.is_app_cmd: + cp = ('.' + '.'.join(self.cmd_path[2:])) if len(self.cmd_path) > 2 else '' + return f"app{cp}.{self.name}" + elif self.is_core_cmd: + return '.'.join(["origen", *self.cmd_path, self.name]) + else: + return f"{'.'.join(self.cmd_path)}.{self.name}" + + def reserved_opt_ln_conflict_msg(self, opt, name): + from .origen import CoreErrorMessages + return CoreErrorMessages.reserved_opt_ln_conflict_msg(self, opt, name) + + def reserved_opt_lna_conflict_msg(self, opt, name): + from .origen import CoreErrorMessages + return CoreErrorMessages.reserved_opt_lna_conflict_msg(self, opt, name) + + def reserved_opt_sn_conflict_msg(self, opt, name): + from .origen import CoreErrorMessages + return CoreErrorMessages.reserved_opt_sn_conflict_msg(self, opt, name) + + def reserved_opt_sna_conflict_msg(self, opt, name): + from .origen import CoreErrorMessages + return CoreErrorMessages.reserved_opt_sna_conflict_msg(self, opt, name) diff --git a/python/origen/origen/helpers/regressions/cli/help_msg.py b/python/origen/origen/helpers/regressions/cli/help_msg.py new file mode 100644 index 00000000..ab473312 --- /dev/null +++ b/python/origen/origen/helpers/regressions/cli/help_msg.py @@ -0,0 +1,448 @@ +class HelpMsg: + not_extendable_msg = "This command does not support extensions." + + def __init__(self, help_str): + self.text = help_str + sections = help_str.split("\n\n") + if "Origen, The Semiconductor Developer's Kit" in sections[0]: + self.version_str = sections.pop(1).strip() + self.root_cmd = True + else: + self.version_str = None + self.root_cmd = False + + header = sections[0].split("\n") + self.cmd = header[0] + if len(header) > 1: + self.help = "\n".join(header[1:]) + else: + self.help = None + + usage = sections[1].split("\n") + assert usage[0] == "USAGE:" + self.usage = usage[1] + self.after_help_msg = None + + sects = {} + for sect in sections[2:]: + subsects = sect.split("\n") + for (i, s) in enumerate(subsects): + if s == "ARGS:": + current = "args" + sects[current] = [] + elif s == "OPTIONS:": + current = "opts" + sects[current] = [] + elif s == "SUBCOMMANDS:": + current = "subcmds" + sects[current] = [] + elif s == "APP COMMAND SHORTCUTS:": + current = "app_cmd_shortcuts" + sects[current] = [] + elif s == "PLUGIN COMMAND SHORTCUTS:": + current = "pl_cmd_shortcuts" + sects[current] = [] + elif s == "AUX COMMAND SHORTCUTS:": + current = "aux_cmd_shortcuts" + sects[current] = [] + elif s == "This command is extended from:": + current = "extensions" + sects["extensions"] = [] + else: + if (i == len(subsects) - 1) and s == "": + next + elif current == "after_help_msg": + self.after_help_msg.append(s) + elif not s.startswith(" "): + if current not in ["app_cmd_shortcuts", "pl_cmd_shortcuts", "aux_cmd_shortcuts"]: + current = "after_help_msg" + self.after_help_msg = [s] + else: + sects[current].append(s) + + self.args = [] + if "args" in sects: + for line in sects["args"]: + arg = {} + if line.startswith(' <'): + s = line.strip().split('>', 1) + n = s[0][1:] + arg["value_name"] = n + if s[1].startswith("..."): + arg['multiple_values'] = True + s[1] = s[1][3:] + else: + arg['multiple_values'] = False + s[1] = s[1].strip() + arg['help'] = s[1] if len(s[1]) > 0 else None + else: + arg[n]['help'] += f" {line.strip()}" + self.args.append(arg) + + self.opts = [] + n = None + if "opts" in sects: + for line in sects["opts"]: + l = line.strip() + if l[0] == "-": + opt = {} + opt['long_aliases'] = None + opt['short_aliases'] = None + opt['extended_from'] = None + opt['ext_type'] = None + + s = l.split(" ", 1) + if len(s) > 1: + opt["help"] = s[1].strip() + else: + opt["help"] = None + + s = s[0].split(" <") + if len(s) > 1: + opt["value_name"] = s[1].split(">")[0] + opt["multiple_values"] = True if ">..." in s[1] else False + else: + opt["value_name"] = None + opt["multiple_values"] = False + + if l[1] == "-": + # Long name only + opt["short_name"] = None + opt["long_name"] = s[0][2:] + else: + names = s[0].split(", ") + if len(names) > 1: + # long name and short name + opt["short_name"] = names[0][1:] + opt["long_name"] = names[1][2:] + else: + # short name only + opt["short_name"] = names[0][1:] + opt["long_name"] = None + self.opts.append(opt) + else: + opt = self.opts[-1] + if "help" in opt: + if opt["help"] is None: + opt["help"] = l + else: + opt["help"] += f" {l}" + else: + opt["help"] = l.strip() + + opt = self.opts[-1] + if ('help' in opt) and (opt['help'] is not None): + import re + app_ext_substring = "[Extended from the app]" + + if re.search(r"\[Extended from aux namespace: .*\]", opt['help']): + split = opt['help'].split("[Extended from aux namespace: '", 1) + if len(split) == 2: + if ']' in split[1]: + inner_split = split[1].split("']", 1) + opt['extended_from'] = inner_split[0] + opt['help'] = (split[0] + inner_split[1]).strip() + from .command import SrcTypes + opt['ext_type'] = SrcTypes.AUX + elif re.search(r"\[Extended from plugin: .*\]", opt['help']): + split = opt['help'].split("[Extended from plugin: '", 1) + if len(split) == 2: + if ']' in split[1]: + inner_split = split[1].split("']", 1) + opt['extended_from'] = inner_split[0] + opt['help'] = (split[0] + inner_split[1]).strip() + from .command import SrcTypes + opt['ext_type'] = SrcTypes.PLUGIN + elif app_ext_substring in opt["help"]: + opt["help"] = opt["help"].replace(app_ext_substring, '').strip() + from .command import SrcTypes + opt['extended_from'] = SrcTypes.APP + opt['ext_type'] = SrcTypes.APP + + if re.search(r"\[aliases: .*\]", opt['help']): + split = opt['help'].split("[aliases: ", 1) + if len(split) == 2: + if ']' in split[1]: + opt['long_aliases'] = [a.strip() for a in split[1].split(']', 1)[0].split(',')] + opt['help'] = split[0] + split[1].split(']', 1)[1] + opt['help'] = opt['help'].strip() + + if re.search(r"\[short aliases: .*\]", opt['help']): + split = opt['help'].split("[short aliases: ", 1) + if len(split) == 2: + if ']' in split[1]: + opt['short_aliases'] = [a.strip() for a in split[1].split(']', 1)[0].split(',')] + opt['help'] = split[0].strip() + + self.subcmds = [] + n = None + if "subcmds" in sects: + for line in sects["subcmds"]: + if line.startswith(" "): + self.subcmds[-1]["help"] += f" {line.strip()}" + else: + s = line.strip().split(" ", 1) + n = s[0] + self.subcmds.append({ + "name": n, + "help": (s[1].strip() if len(s) > 1 else None) + }) + for subc in self.subcmds: + if subc["help"]: + if re.search(r"\[aliases: .*\]", subc['help']): + split = subc['help'].split("[aliases: ", 1) + subc['aliases'] = [a.strip() for a in split[1].split(']', 1)[0].split(',')] + subc['help'] = (split[0] + split[1].split(']', 1)[1]).strip() + continue + subc["aliases"] = None + + if "app_cmd_shortcuts" in sects: + self.app_cmd_shortcuts = {} + for l in sects["app_cmd_shortcuts"]: + cmd = l.split("=>") + for c in cmd[0].strip().split(", "): + self.app_cmd_shortcuts[c] = cmd[1].strip() + else: + self.app_cmd_shortcuts = None + + if "pl_cmd_shortcuts" in sects: + self.pl_cmd_shortcuts = {} + for l in sects["pl_cmd_shortcuts"]: + cmd = l.split("=>") + pln, subc = cmd[1].strip().split(" ") + for c in cmd[0].strip().split(", "): + self.pl_cmd_shortcuts[c] = (pln, subc) + else: + self.plugin_cmd_shortcuts = None + + if "aux_cmd_shortcuts" in sects: + self.aux_cmd_shortcuts = {} + for l in sects["aux_cmd_shortcuts"]: + cmd = l.split("=>") + ns, subc = cmd[1].strip().split(" ") + for c in cmd[0].strip().split(", "): + self.aux_cmd_shortcuts[c] = (ns, subc) + else: + self.aux_cmd_shortcuts = None + self.app_exts = False + self.aux_exts = None + self.pl_exts = None + if "extensions" in sects: + for l in sects["extensions"]: + if l.strip() == "- the App": + self.app_exts = True + next + + split = l.split("- Aux Namespaces: ", 1) + if len(split) == 2: + self.aux_exts = [s[1:-1] for s in split[1].split(", ")] + next + + split = l.split("- Plugins: ", 1) + if len(split) == 2: + self.pl_exts = [s[1:-1] for s in split[1].split(", ")] + next + + if self.after_help_msg is not None: + self.after_help_msg = ("\n").join(self.after_help_msg) + + @property + def subcmd_names(self): + if self.subcmds: + return [subc["name"] for subc in self.subcmds] + + def assert_num_args(self, expected): + assert len(self.args) == expected + return True + + def assert_num_opts(self, expected): + assert len(self.opts) == expected + return True + + def assert_arg_at(self, expected_index, arg): + a = self.args[expected_index] + if arg.value_name is not False: + if arg.value_name is None: + assert a["value_name"] == arg.name.upper() + else: + assert a["value_name"] == arg.value_name + if arg.multi is not False: + assert a["multiple_values"] == arg.multi + if arg.help is not False: + assert a["help"] == arg.help + return True + + def assert_args(self, *expected): + if expected == (None,): + expected = [] + elif len(expected) == 1 and isinstance(expected[0], dict): + expected = list(expected[0].values()) + self.assert_num_args(len(expected)) + for i, a in enumerate(expected): + self.assert_arg_at(i, a) + return True + + def _assert_opt_params_(self, o, opt): + if opt.sn is not False: + assert o["short_name"] == opt.sn + if opt.ln is not False: + if opt.sn is not None: + assert o["long_name"] == opt.ln + else: + assert o["long_name"] == opt.to_ln() + if opt.value_name is not False: + if opt.takes_value: + assert o["value_name"] == opt.to_vn() + assert o["multiple_values"] == opt.multi + if opt.help is not False: + assert o["help"] ==opt.help + if opt.sn_aliases is not False: + assert o['short_aliases'] == opt.sn_aliases + if opt.ln_aliases is not False: + assert o['long_aliases'] == opt.ln_aliases + + def assert_opt_at(self, expected_index, opt): + o = self.opts[expected_index] + self._assert_opt_params_(o, opt) + assert o["extended_from"] is None + assert o["ext_type"] is None + return True + + def assert_bare_opts(self): + return self.assert_opts("help", "v", 'vk') + + def assert_bare_app_opts(self): + return self.assert_opts("help", "mode", "no_targets", "targets", "v", 'vk') + + def assert_ext_at(self, expected_index, ext): + o = self.opts[expected_index] + self._assert_opt_params_(o, ext) + if ext.src_name is not False: + from .command import SrcTypes + if ext.src_type == SrcTypes.APP: + assert o["extended_from"] == SrcTypes.APP + else: + assert o["extended_from"] == ext.src_name + if ext.src_type is not False: + assert o["ext_type"] == ext.src_type + return True + + def assert_opts(self, *expected_opts): + assert self.assert_num_opts(len(expected_opts)) + for i, o in enumerate(expected_opts): + from .command import CmdExtOpt + if isinstance(o, CmdExtOpt): + self.assert_ext_at(i, o) + elif isinstance(o, str): + if o in ["help", 'h']: + self.assert_help_opt_at(i) + elif o == "vk": + self.assert_vk_opt_at(i) + elif o in ["mode", "m"]: + self.assert_mode_opt_at(i) + elif o in ["no_targets", "nt"]: + self.assert_no_targets_opt_at(i) + elif o in ["targets", "t"]: + self.assert_targets_opt_at(i) + elif o == "v": + self.assert_v_opt_at(i) + else: + raise RuntimeError(f"Unknown keyword opt: {o}") + else: + self.assert_opt_at(i, o) + return True + + def assert_subcmd_at(self, expected_index, subc): + s = self.subcmds[expected_index] + assert s['name'] == subc.name + if subc.help is not False: + assert s['help'] == subc.help + if subc.aliases is not False: + assert s['aliases'] == subc.aliases + return True + + def assert_subcmds(self, *expected_subcmds, help=None): + if expected_subcmds == (None,): + expected_subcmds = [] + elif len(expected_subcmds) == 1 and isinstance(expected_subcmds[0], dict): + expected_subcmds = expected_subcmds[0].values() + expected_subcmds = list(expected_subcmds) + if help is not None: + expected_subcmds.insert(help, "h") + assert len(expected_subcmds) == len(self.subcmds) + for i, o in enumerate(expected_subcmds): + if help is not None and help == i: + self.assert_help_subcmd_at(i) + elif isinstance(o, tuple): + self.assert_subcmd_at(i, o[1]) + elif isinstance(o, str): + if o == "help": + self.assert_help_subcmd_at(i) + else: + raise RuntimeError(f"Unknown subcmd keyword: {o}") + else: + self.assert_subcmd_at(i, o) + return True + + def assert_help_subcmd_at(self, expected_index): + from .origen import help_subcmd + return self.assert_subcmd_at(expected_index, help_subcmd()) + + def assert_help_opt_at(self, expected_index): + from .origen import CoreOpts + return self.assert_opt_at(expected_index, CoreOpts.help) + + def assert_v_opt_at(self, expected_index): + from .origen import CoreOpts + return self.assert_opt_at(expected_index, CoreOpts.verbosity) + + def assert_vk_opt_at(self, expected_index): + from .origen import CoreOpts + return self.assert_opt_at(expected_index, CoreOpts.vk) + + def assert_mode_opt_at(self, expected_index): + from .origen import InAppOpts + return self.assert_opt_at(expected_index, InAppOpts.mode) + + def assert_no_targets_opt_at(self, expected_index): + from .origen import InAppOpts + return self.assert_opt_at(expected_index, InAppOpts.no_targets) + + def assert_targets_opt_at(self, expected_index): + from .origen import InAppOpts + return self.assert_opt_at(expected_index, InAppOpts.targets) + + def assert_summary(self, msg): + assert self.help == msg + return True + + def assert_not_extendable(self): + assert self.after_help_msg is not None + assert self.not_extendable_msg == self.after_help_msg.split("\n")[-1] + + def assert_cmd(self, cmd): + self.assert_args(*(cmd.args.values() or [None])) + if cmd.opts: + l = list(cmd.opts.values()) + l.insert(cmd.h_opt_idx, "h") + l.insert(cmd.v_opt_idx, "v") + l.insert(cmd.vk_opt_idx, "vk") + self.assert_opts(*l) + else: + self.assert_bare_opts() + + if cmd.subcmds: + subcs = list(cmd.subcmds.values()) + subcs.insert(cmd.help_subc_idx, "help") + self.assert_subcmds(*subcs) + else: + self.assert_subcmds(None) + + if not cmd.extendable: + self.assert_not_extendable() + self.assert_summary(cmd.help) + + @property + def logged_errors(self): + from . import CLI + return CLI.extract_logged_errors(self.text) \ No newline at end of file diff --git a/python/origen/origen/helpers/regressions/cli/origen.py b/python/origen/origen/helpers/regressions/cli/origen.py new file mode 100644 index 00000000..ff812646 --- /dev/null +++ b/python/origen/origen/helpers/regressions/cli/origen.py @@ -0,0 +1,549 @@ +import origen +from .command import CmdOpt, Cmd, CmdArg, CmdArgOpt, CmdDemo, CmdExtOpt +from ._origen import to_std_opt + +def help_subcmd(): + return Cmd("help", help="Print this message or the help of the given subcommand(s)") + +class _CommonNames: + aux_cmds = "auxillary_commands" + pls = "plugins" + pl = "plugin" + build = "build" + creds = "credentials" + new = "new" + eval = "eval" + exec = "exec" + fmt = "fmt" + i = "interactive" + v = "-v" + + @classmethod + def aux_cmds_cmd(cls, add_opts=None): + return Cmd(cls.aux_cmds, help="Interface with auxillary commands") + + @classmethod + def eval_cmd(cls, add_opts=None): + return Cmd( + cls.eval, + help="Evaluates statements in an Origen context", + args=[ + CmdArg("code", "Statements to evaluate", multi=True, required=True) + ], + opts=(add_opts or []) + [ + CmdOpt( + "scripts", + help="Evaluate from script files", + ln="scripts", + sn="s", + ln_aliases=["files"], + sn_aliases=["f"], + multi=True, + required=False, + ) + ], + h_opt_idx=0, + v_opt_idx=2, + vk_opt_idx=3, + demos=[ + CmdDemo( + "minimal", + args=["print( 'hello from eval cmd!' )"], + expected_output="hello from eval cmd" + ), + CmdDemo( + "multi_statement_single_arg", + args=["h = 'hi!'; print( origen.version ); print( h ); print( h )"], + expected_output=f"{origen.version}\nhi!\nhi!" + ), + CmdDemo( + "multi_statement_multi_args", + args=[ + "h = 'hello!'", + "print( origen.version )", + "print( h )", + "print( h )" + ], + expected_output=f"{origen.version}\nhello!\nhello!" + ), + CmdDemo( + "gen_name_error", + args=["print( missing )"], + expected_output=["Traceback (most recent call last):", "NameError: name 'missing' is not defined"] + ) + ] + ) + + @classmethod + def exec_cmd(cls, add_opts=None): + return Cmd( + cls.exec, + help="Execute a command within your Origen/Python environment (e.g. origen exec pytest)", + args=[ + CmdArg("command", "The command to be run", required=True), + CmdArg("args", "Arguments to be passed to the command", multi=True, required=False) + ], + opts=add_opts, + prefix_opts=True, + ) + + @classmethod + def creds_cmd(cls, add_opts=None): + return Cmd( + cls.creds, + help="Set or clear user credentials", + subcmds=[ + Cmd( + "set", + help="Set the current user's password", + opts=(add_opts or []) + [ + CmdOpt( + "all", + help="Set the password for all datasets", + ln="all", + sn="a", + takes_value=False, + required=False, + ), + CmdOpt( + "datasets", + help="Specify the dataset to set the password for", + ln="datasets", + sn="d", + multi=True, + required=False, + ), + ] + ), + Cmd( + "clear", + help="Clear the user's password", + opts=(add_opts or []) + [ + CmdOpt( + "all", + help="Clear the password for all datasets", + ln="all", + sn="a", + takes_value=False, + required=False, + ), + CmdOpt( + "datasets", + help="Specify the dataset to clear the password for", + ln="datasets", + sn="d", + multi=True, + required=False, + ), + ] + ) + ] + ) + + @classmethod + def interactive_cmd(cls, add_opts=None): + return Cmd( + cls.i, + help="Start an Origen console to interact with the DUT", + aliases=['i'], + opts=add_opts, + ) + + @classmethod + def pl_cmd(cls, add_opts=None): + return Cmd( + cls.pl, + help="Access added commands from individual plugins", + aliases=["pl"], + opts=add_opts, + ) + + @classmethod + def pls_cmd(cls, add_opts=None): + return Cmd( + cls.pls, + help="Interface with the Origen plugin manager", + aliases=["pls", "plss"], + opts=add_opts, + subcmds=[ + Cmd( + "list", + help="List the available plugins", + aliases=["ls"], + ) + ] + ) + + @classmethod + def v_cmd(cls): + return Cmd(cls.v) + +# Use this to mimic: +# @classmethod +# @property +# Available in Python 3.9+ +class CoreCommandsProperties(type): + @property + def all_names(cls): + return [cmd.name for cmd in cls.cmds] + + @property + def all_names_add_help(cls): + return cls.all_names + ["help"] + +class CoreCommands(metaclass=CoreCommandsProperties): + # Use this to mimic: + # @classmethod + # @property + # Available in Python 3.9+ + def __getattr__(self, name=None): + if name == "all_names_add_help": + return self.__class__.all_names + ["help"] + elif name == "all_names": + return [cmd.name for cmd in self.__class__.cmds] + else: + self.__getattribute__(name) + +class GlobalCommands(CoreCommands): + class Names: + eval = _CommonNames.eval + exec = _CommonNames.exec + aux_cmds = _CommonNames.aux_cmds + pls = _CommonNames.pls + pl = _CommonNames.pl + + proj = "proj" + new = _CommonNames.new + creds = _CommonNames.creds + i = _CommonNames.i + fmt = _CommonNames.fmt + build = _CommonNames.build + names = Names() + + eval = _CommonNames.eval_cmd() + exec = _CommonNames.exec_cmd() + aux_cmds = _CommonNames.aux_cmds_cmd() + pls = _CommonNames.pls_cmd() + pl = _CommonNames.pl_cmd() + # proj = Cmd(names.proj) + new = Cmd( + names.new, + help="Create a new origen environment (e.g., app, workspace)", + ) + creds = _CommonNames.creds_cmd() + i = _CommonNames.interactive_cmd() + # fmt = Cmd(names.fmt) + # build = Cmd(names.build) + v = _CommonNames.v_cmd() + + commands = [ + # proj, fmt, build + creds, eval, exec, i, new, + pls, pl, aux_cmds, + ] + cmds = commands + + origen = Cmd("") + + +class InAppOpts: + + @classmethod + def all(cls): + return [cls.targets, cls.no_targets, cls.mode] + + @classmethod + def standard_opts(self): + return [CoreOpts.help, self.mode, self.no_targets, self.targets, CoreOpts.verbosity, CoreOpts.vk ] + + mode = to_std_opt("m") + no_targets = to_std_opt("nt") + targets = to_std_opt("t") + to_std_opt = to_std_opt + +class InAppCommands(CoreCommands): + in_app_opts = InAppOpts() + + @classmethod + def standard_opts(self): + return self.in_app_opts.standard_opts() + + class Names: + app = "app" + aux_cmds = _CommonNames.aux_cmds + # build = _CommonNames.build + # compile = "compile" + creds = _CommonNames.creds + env = "env" + eval = _CommonNames.eval + exec = _CommonNames.exec + # fmt = _CommonNames.fmt + generate = "generate" + i = _CommonNames.i + # mailer = "mailer" + # mode = "mode" + # new = _CommonNames.new + pl = _CommonNames.pl + pls = _CommonNames.pls + # save_ref = "save_ref" + target = "target" + # web = "web" + names = Names() + + class _TargetCmd_: + @classmethod + def full_path_opt(cls): + return CmdOpt( + "full_paths", + "Display targets' full paths", + ln="full-paths", + sn="f", + ln_aliases=["full_paths"] + ) + + @classmethod + def targets_arg(cls, help): + return CmdArg( + "targets", + help=help, + multi=True, + required=True, + use_delimiter=True + ) + + app = Cmd( + names.app, + help="Manage and interface with the application", + subcmds=[ + # Cmd( + # "checkin", + # help="Check in the given pathspecs", + # ), + Cmd( + "commands", + help="Interface with commands added by the application", + aliases=["cmds"], + ), + # Cmd( + # "init", + # help="Initialize the application's revision control", + # ), + # Cmd( + # "package", + # help="Build the app into publishable package (e.g., a 'python wheel')", + # ), + # Cmd( + # "publish", + # help="Publish (release) the app", + # ), + # Cmd( + # "run_publish_checks", + # help="Run production-ready and publish-ready checks", + # ), + # Cmd( + # "status", + # help="Show any local changes", + # ), + ], + help_subc_idx=2, + extendable=False, + ) + aux_cmds = _CommonNames.aux_cmds_cmd() + creds = _CommonNames.creds_cmd(add_opts=in_app_opts.all()) + env = Cmd( + names.env, + help="Manage your application's Origen/Python environment (dependencies, etc.)", + subcmds=[ + Cmd( + "setup", + help="Setup your application's Python environment for the first time in a new workspace, this will install dependencies per the poetry.lock file", + ), + Cmd( + "update", + help="Update your application's Python dependencies according to the latest pyproject.toml file", + ), + ], + help_subc_idx=0, + extendable=False + ) + eval = _CommonNames.eval_cmd(add_opts=in_app_opts.all()) + exec = _CommonNames.exec_cmd() + # fmt = Cmd(names.fmt) + generate = Cmd( + names.generate, + help="Generate patterns or test programs", + args=[CmdArg("files", help="The name of the file(s) to be generated", multi=True, required=True)], + opts=["m", "nt", "o", "r", "t"], + h_opt_idx=0, + vk_opt_idx=7, + v_opt_idx=6, + ) + i = _CommonNames.interactive_cmd(add_opts=in_app_opts.all()) + # mailer = Cmd(names.mailer) + # mode = Cmd(names.mode) + # new = Cmd(names.new) + pl = _CommonNames.pl_cmd() + pls = _CommonNames.pls_cmd() + # save_ref = Cmd(names.save_ref) + target = Cmd( + names.target, + help="Set/view the default target", + opts=[_TargetCmd_.full_path_opt()], + subcmds=[ + Cmd( + "add", + help="Activates the given target(s)", + args=[_TargetCmd_.targets_arg("Targets to be activated")], + opts=[_TargetCmd_.full_path_opt()], + aliases=["a"], + ), + Cmd( + "clear", + help="Deactivates any and all current targets", + aliases=["c"], + ), + Cmd( + "default", + help="Activates the default target(s) while deactivating all others", + opts=[_TargetCmd_.full_path_opt()], + aliases=["d"], + ), + Cmd( + "remove", + help="Deactivates the given target(s)", + args=[_TargetCmd_.targets_arg("Targets to be deactivated")], + opts=[_TargetCmd_.full_path_opt()], + aliases=["r"], + ), + Cmd( + "set", + help="Activates the given target(s) while deactivating all others", + args=[_TargetCmd_.targets_arg("Targets to be set")], + opts=[_TargetCmd_.full_path_opt()], + aliases=["s"], + ), + Cmd( + "view", + help="Views the currently activated target(s)", + opts=[_TargetCmd_.full_path_opt()], + aliases=["v"], + ), + ], + aliases=["w"], + ) + # web = Cmd(names.web) + v = _CommonNames.v_cmd() + + commands = [ + # app, aux_cmds, build, compile, creds, env, eval, exec, fmt, generate, i, mailer, mode, new, pl, pls, save_ref, target, web + app, aux_cmds, creds, env, eval, exec, generate, i, pl, pls, target + ] + cmds = commands + + origen = Cmd(None) + +class CoreOpts: + help = CmdOpt('help', "Print help information", sn="h", ln="help") + verbosity = CmdOpt('verbosity', "Terminal verbosity level e.g. -v, -vv, -vvv", ln="verbose", ln_aliases=["verbosity"], sn="v") + vk = CmdOpt("verbosity_keywords", "Keywords for verbose listeners", value_name= "verbosity_keywords", takes_value=True, use_delimiter=True, ln_aliases=["vk"]) + +class CoreErrorMessages: + @classmethod + def _invalid_arg_msg(cls, val): + return f"Found argument '{val}' which wasn't expected, or isn't valid in this context" + + @classmethod + def _missing_arg_val_msg(cls, arg, type, value_name=None): + if type == "ln": + prefix = '--' + elif type == "sn": + prefix = '-' + elif type == "arg": + prefix = '' + else: + raise RuntimeError(f"Cannot generate missing ar val msg for arg type '{type}") + if isinstance(arg, CmdArgOpt): + if value_name is None: + value_name = arg.to_vn() + arg = arg.name + return f"The argument '{prefix}{arg} <{value_name or arg}>' requires a value but none was supplied" + + @classmethod + def missing_arg_val_msg(cls, arg, value_name=None): + return cls._missing_arg_val_msg(arg, "arg", value_name=value_name) + + @classmethod + def missing_ln_val_msg(cls, arg, value_name=None): + return cls._missing_arg_val_msg(arg, "ln", value_name=value_name) + + @classmethod + def missing_sn_val_msg(cls, arg, value_name=None): + return cls._missing_arg_val_msg(arg, "sn", value_name=value_name) + + @classmethod + def too_many_args(cls, val): + return cls._invalid_arg_msg(val) + + @classmethod + def unknown_arg_msg(cls, arg): + return cls._invalid_arg_msg(arg) + + @classmethod + def unknown_opt_msg(cls, opt, ln=True): + if ln: + prefix = "--" + else: + prefix = "-" + + if isinstance(opt, CmdOpt): + n = f"{prefix}{opt.name}" + else: + n = f"{prefix}{opt}" + + return cls._invalid_arg_msg(n) + + @classmethod + def missing_required_arg(cls, *vals): + mapped_vals = [] + for v in vals: + if isinstance(v, CmdOpt): + mapped_vals.append(f"{v.ln_to_cli()} <{v.to_vn()}>") + else: + mapped_vals.append(f"<{v.to_vn()}>") + return "The following required arguments were not provided:" + "\n " + " \n".join(mapped_vals) + + @classmethod + def invalid_subc_msg(cls, subc): + return f"The subcommand '{subc}' wasn't recognized\n\nUSAGE:\n" + + @classmethod + def cmd_building_err_prefix(cls, cmd): + return f"When processing command '{cmd.full_name}':" + + @classmethod + def conflict_msg(cls, cmd, opt, conflict, conflict_type): + if conflict_type in ['long name', 'long name alias']: + hyphens = "--" + else: + hyphens = "-" + + if isinstance(opt, CmdExtOpt): + return f"{cls.cmd_building_err_prefix(cmd)} Option '{opt.name}' extended from {opt.provided_by} tried to use reserved option {conflict_type} '{conflict}' and will not be available as '{hyphens}{conflict}'" + else: + return f"{cls.cmd_building_err_prefix(cmd)} Option '{opt.name}' tried to use reserved option {conflict_type} '{conflict}' and will not be available as '{hyphens}{conflict}'" + + @classmethod + def reserved_opt_ln_conflict_msg(cls, cmd, opt, conflict): + return cls.conflict_msg(cmd, opt, conflict, "long name") + + @classmethod + def reserved_opt_sn_conflict_msg(cls, cmd, opt, conflict): + return cls.conflict_msg(cmd, opt, conflict, "short name") + + @classmethod + def reserved_opt_lna_conflict_msg(cls, cmd, opt, conflict): + return cls.conflict_msg(cmd, opt, conflict, "long name alias") + + @classmethod + def reserved_opt_sna_conflict_msg(cls, cmd, opt, conflict): + return cls.conflict_msg(cmd, opt, conflict, "short name alias") diff --git a/python/origen/origen/producer.py b/python/origen/origen/producer.py index 8f77e34d..ab15464a 100644 --- a/python/origen/origen/producer.py +++ b/python/origen/origen/producer.py @@ -62,17 +62,18 @@ def summarize(self): 'changed_program_files'] > 0 new_files = stats['new_pattern_files'] > 0 or stats[ 'new_program_files'] > 0 - if changes or new_files: - print("") - if changes: - print("To save all changed files run:") - print(" origen save_ref --changed") - if new_files: - print("To save all new files run:") - print(" origen save_ref --new") - if changes and new_files: - print("To save both run:") - print(" origen save_ref --new --changed") + # TODO add this back in when save_ref is re-added + # if changes or new_files: + # print("") + # if changes: + # print("To save all changed files run:") + # print(" origen save_ref --changed") + # if new_files: + # print("To save all new files run:") + # print(" origen save_ref --new") + # if changes and new_files: + # print("To save both run:") + # print(" origen save_ref --new --changed") @contextmanager def Pattern(self, **kwargs): diff --git a/python/origen/origen/target.py b/python/origen/origen/target.py index 852f1f4e..b5eb124b 100644 --- a/python/origen/origen/target.py +++ b/python/origen/origen/target.py @@ -1,41 +1,53 @@ import origen import _origen -current_targets = [] +current_targets = None first_load_done = False +setup_pending = False +def __getattr__(name: str): + if name == "current": + return current_targets + else: + raise AttributeError(f"module {__name__!r} has no attribute {name!r}") # Setup the targets to be applied at future calls to target.load, but without # actually loading them at this time def setup(targets=None): - global current_targets - if targets == None: + global current_targets, setup_pending + + if targets is None: targets = _origen.app_config()["target"] - if targets == None: + if targets is None: current_targets = [] return None - if not isinstance(targets, list): + if isinstance(targets, str): targets = [targets] + elif not isinstance(targets, list): + targets = list(targets) + setup_pending = True current_targets = targets - # Load the target(s) previously registered by setup or as given -def load(targets=None): - global first_load_done - if targets is not None: +def load(*targets): + global first_load_done, setup_pending, current_targets + + if len(targets) > 0: setup(targets) - first_load_done = True + if not first_load_done and not setup_pending: + setup(targets or None) origen.dut = None origen._target_loading = True _origen.prepare_for_target_load() - if current_targets != None: - for t in current_targets: - if callable(t): - t() - else: - if t is not None: - origen.load_file(_origen.target_file(t, "targets")) + for t in current_targets: + if callable(t): + t() + else: + if t is not None: + origen.load_file(_origen.target_file(t, "targets")) origen._target_loading = False + first_load_done = True + setup_pending = False # Load the target(s) previously registered by setup but only if they diff --git a/python/origen/poetry.lock b/python/origen/poetry.lock index fd689026..3520007b 100644 --- a/python/origen/poetry.lock +++ b/python/origen/poetry.lock @@ -1,10 +1,16 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "atomicwrites" @@ -13,31 +19,46 @@ description = "Atomic file writes." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" -version = "21.4.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "babel" -version = "2.10.3" +version = "2.12.1" description = "Internationalization utilities" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] [package.dependencies] -pytz = ">=2015.7" +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} [[package]] name = "beautifulsoup4" @@ -46,6 +67,11 @@ description = "Screen-scraping library" category = "main" optional = false python-versions = "*" +files = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] [package.dependencies] soupsieve = ">=1.2" @@ -61,17 +87,24 @@ description = "Dummy package for Beautiful Soup" category = "main" optional = false python-versions = "*" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] [package.dependencies] beautifulsoup4 = "*" [[package]] name = "cachecontrol" -version = "0.12.11" +version = "0.12.14" description = "httplib2 caching for requests" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "CacheControl-0.12.14-py2.py3-none-any.whl", hash = "sha256:1c2939be362a70c4e5f02c6249462b3b7a24441e4f1ced5e9ef028172edf356a"}, + {file = "CacheControl-0.12.14.tar.gz", hash = "sha256:d1087f45781c0e00616479bfd282c78504371ca71da017b49df9f5365a95feba"}, +] [package.dependencies] lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} @@ -89,19 +122,27 @@ description = "Cachy provides a simple yet effective caching library." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] [package.extras] -redis = ["redis (>=3.3.6,<4.0.0)"] memcached = ["python-memcached (>=1.59,<2.0)"] msgpack = ["msgpack-python (>=0.5,<0.6)"] +redis = ["redis (>=3.3.6,<4.0.0)"] [[package]] name = "certifi" -version = "2022.6.15" +version = "2023.5.7" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] [[package]] name = "cffi" @@ -110,20 +151,160 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.0" +version = "3.2.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] [[package]] name = "cleo" @@ -132,6 +313,10 @@ description = "Cleo allows you to create beautiful and testable command-line int category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] [package.dependencies] clikit = ">=0.6.0,<0.7.0" @@ -143,6 +328,10 @@ description = "CliKit is a group of utilities to build beautiful and testable co category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] [package.dependencies] crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} @@ -151,11 +340,15 @@ pylev = ">=1.3,<2.0" [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "commonmark" @@ -164,6 +357,10 @@ description = "Python parser for the CommonMark Markdown spec" category = "main" optional = false python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] @@ -175,53 +372,96 @@ description = "Manage Python errors with ease" category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] [[package]] name = "cryptography" -version = "37.0.4" +version = "41.0.2" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, + {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, + {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, + {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, + {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, + {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, + {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, + {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, + {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, + {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] [[package]] name = "distlib" -version = "0.3.5" +version = "0.3.7" description = "Distribution utilities" category = "main" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] [[package]] name = "docutils" -version = "0.19" +version = "0.20.1" description = "Docutils -- Python Documentation Utilities" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] [[package]] name = "filelock" -version = "3.7.1" +version = "3.12.2" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] [package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "html5lib" @@ -230,24 +470,32 @@ description = "HTML parser based on the WHATWG HTML specification" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] [package.dependencies] six = ">=1.9" webencodings = "*" [package.extras] -all = ["genshi", "chardet (>=2.2)", "lxml"] +all = ["chardet (>=2.2)", "genshi", "lxml"] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] lxml = ["lxml"] [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "imagesize" @@ -256,6 +504,10 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] name = "importlib-metadata" @@ -264,21 +516,29 @@ description = "Read metadata from Python packages" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +docs = ["rst.linker", "sphinx"] +testing = ["importlib-resources (>=1.3)", "packaging", "pep517"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "jeepney" @@ -287,10 +547,14 @@ description = "Low-level, pure Python DBus protocol wrapper." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] name = "jinja2" @@ -299,6 +563,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -313,6 +581,10 @@ description = "Store and access your passwords safely." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, +] [package.dependencies] importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} @@ -321,8 +593,8 @@ pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"] +testing = ["pytest (>=4.6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=1.2.3)", "pytest-cov", "pytest-enabler", "pytest-flake8", "pytest-mypy"] [[package]] name = "lockfile" @@ -331,6 +603,10 @@ description = "Platform-independent file locking module" category = "main" optional = false python-versions = "*" +files = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] [[package]] name = "mako" @@ -339,25 +615,145 @@ description = "A super-fast templating language that borrows the best ideas fro category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] [package.dependencies] MarkupSafe = ">=0.9.2" [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] [[package]] name = "msgpack" -version = "1.0.4" +version = "1.0.5" description = "MessagePack serializer" category = "main" optional = false python-versions = "*" +files = [ + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, + {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, + {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, + {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, + {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, + {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, + {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, + {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, + {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, + {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, + {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, + {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, + {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, + {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, + {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, + {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +] [[package]] name = "origen-autoapi" @@ -366,6 +762,10 @@ description = "Automatic API reference documentation generation for Sphinx inspi category = "main" optional = false python-versions = "*" +files = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] [package.dependencies] sphinx = "*" @@ -376,7 +776,8 @@ version = "0.4.0" description = "Bare metal APIs for the Origen SDK" category = "main" optional = false -python-versions = ">=3.7,<3.11" +python-versions = ">=3.7" +files = [] develop = true [package.dependencies] @@ -395,6 +796,10 @@ description = "Core utilities for Python packages" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] [package.dependencies] pyparsing = ">=2.0.2" @@ -406,6 +811,10 @@ description = "Bring colors to your terminal." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] [[package]] name = "pexpect" @@ -414,40 +823,59 @@ description = "Pexpect allows easy control of interactive console applications." category = "main" optional = false python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" [[package]] name = "pkginfo" -version = "1.8.3" -description = "Query metadatdata from sdists / bdists / installed packages." +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] [package.extras] -testing = ["nose", "coverage"] +testing = ["pytest", "pytest-cov"] [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "2.6.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.6.2-py3-none-any.whl", hash = "sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490"}, + {file = "platformdirs-2.6.2.tar.gz", hash = "sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.4", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] -test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] +docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -458,11 +886,15 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "poetry" -version = "1.1.14" +version = "1.1.15" description = "Python dependency management and packaging made easy." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "poetry-1.1.15-py2.py3-none-any.whl", hash = "sha256:2f8f68bc02006386dd640d08e0ae483231501c6e727842a8a799c9ee376b98c2"}, + {file = "poetry-1.1.15.tar.gz", hash = "sha256:a373848fd205f31b2f6bee6b87a201ea1e09ca573a2f40d0991539f564cedffd"}, +] [package.dependencies] cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} @@ -490,6 +922,10 @@ description = "Poetry PEP 517 Build Backend" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, +] [package.dependencies] importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} @@ -501,6 +937,10 @@ description = "Run a subprocess in a pseudo terminal" category = "main" optional = false python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] name = "py" @@ -509,6 +949,10 @@ description = "library with cross-python path, ini-parsing, io, code, log facili category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pycparser" @@ -517,14 +961,25 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pygments" -version = "2.12.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pylev" @@ -533,17 +988,25 @@ description = "A pure Python Levenshtein implementation that's not freaking GPL' category = "main" optional = false python-versions = "*" +files = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.0" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.0-py3-none-any.whl", hash = "sha256:d554a96d1a7d3ddaf7183104485bc19fd80543ad6ac5bdb6426719d766fb06c1"}, + {file = "pyparsing-3.1.0.tar.gz", hash = "sha256:edb662d6fe322d6e990b1594b5feaeadf806803359e3d4d42f11e295e588f0ea"}, +] [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyreadline3" @@ -552,6 +1015,10 @@ description = "A python implementation of GNU readline." category = "main" optional = false python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] [[package]] name = "pytest" @@ -560,6 +1027,10 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -577,19 +1048,27 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytz" -version = "2022.1" +version = "2023.3" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] [[package]] name = "pywin32-ctypes" -version = "0.2.0" -description = "" +version = "0.2.2" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.2.tar.gz", hash = "sha256:3426e063bdd5fd4df74a14fa3cf80a0b42845a87e1d1e81f6549f9daec593a60"}, + {file = "pywin32_ctypes-0.2.2-py3-none-any.whl", hash = "sha256:bf490a1a709baf35d688fe0ecf980ed4de11d2b3e37b51e5442587a75d9957e7"}, +] [[package]] name = "recommonmark" @@ -598,6 +1077,10 @@ description = "A docutils-compatibility bridge to CommonMark, enabling you to wr category = "main" optional = false python-versions = "*" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] [package.dependencies] commonmark = ">=0.8.1" @@ -606,21 +1089,25 @@ sphinx = ">=1.3.1" [[package]] name = "requests" -version = "2.28.1" +version = "2.31.0" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=3.7, <4" +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +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)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" @@ -629,29 +1116,58 @@ description = "A utility belt for advanced users of python-requests" category = "main" optional = false python-versions = "*" +files = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] [package.dependencies] requests = ">=2.0.1,<3.0.0" [[package]] name = "secretstorage" -version = "3.3.2" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] [package.dependencies] cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "shellingham" -version = "1.4.0" +version = "1.5.0.post1" description = "Tool to Detect Surrounding Shell" category = "main" optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.0.post1-py2.py3-none-any.whl", hash = "sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744"}, + {file = "shellingham-1.5.0.post1.tar.gz", hash = "sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28"}, +] [[package]] name = "six" @@ -660,6 +1176,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "snowballstemmer" @@ -668,14 +1188,22 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "main" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "soupsieve" -version = "2.3.2.post1" +version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] [[package]] name = "sphinx" @@ -684,6 +1212,10 @@ description = "Python documentation generator" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -695,6 +1227,7 @@ Jinja2 = ">=2.3" packaging = "*" Pygments = ">=2.0" requests = ">=2.5.0" +setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -705,8 +1238,8 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinxbootstrap4theme" @@ -715,6 +1248,9 @@ description = "Sphinx Bootstrap4 Theme" category = "main" optional = false python-versions = "*" +files = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] [[package]] name = "sphinxcontrib-applehelp" @@ -723,9 +1259,13 @@ description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple category = "main" optional = false python-versions = ">=3.5" +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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -735,9 +1275,13 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -747,10 +1291,14 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h category = "main" optional = false python-versions = ">=3.6" +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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" @@ -759,9 +1307,13 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] [package.extras] -test = ["pytest", "flake8", "mypy"] +test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" @@ -770,9 +1322,13 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -782,18 +1338,29 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "termcolor" -version = "1.1.0" -description = "ANSII Color formatting for output in terminal." +version = "2.3.0" +description = "ANSI color formatting for output in terminal" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] [[package]] name = "toml" @@ -802,46 +1369,74 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "tomlkit" -version = "0.11.1" +version = "0.11.8" description = "Style preserving TOML library" category = "main" optional = false -python-versions = ">=3.6,<4.0" +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 = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] [[package]] name = "urllib3" -version = "1.26.10" +version = "2.0.4" 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.*, <4" +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.4-py3-none-any.whl", hash = "sha256:de7df1803967d2c2a98e4b11bb7d6bd9210474c46e8a0401514e3a42a75ebde4"}, + {file = "urllib3-2.0.4.tar.gz", hash = "sha256:8d22f86aae8ef5e410d4f539fde9ce6b2113a001bb4d189e0aed70642d602b11"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +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.15.1" +version = "20.16.2" description = "Virtual Python Environment builder" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" +files = [ + {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, + {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, +] [package.dependencies] distlib = ">=0.3.1,<1" filelock = ">=3.2,<4" importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} platformdirs = ">=2,<3" -six = ">=1.9.0,<2" [package.extras] docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] +testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "packaging (>=20.0)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)"] [[package]] name = "webencodings" @@ -850,6 +1445,10 @@ description = "Character encoding aliases for legacy web content" category = "main" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] name = "yapf" @@ -858,489 +1457,28 @@ description = "A formatter for Python code." category = "main" optional = false python-versions = "*" +files = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] [[package]] name = "zipp" -version = "3.8.1" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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)"] [metadata] -lock-version = "1.1" -python-versions = ">=3.7,<3.11" -content-hash = "18baf3ee359431dbc5bd8bf887beae66316f67873dcef60c0a187819f81d188b" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -babel = [ - {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, - {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, - {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, - {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, -] -bs4 = [ - {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, -] -cachecontrol = [ - {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, - {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, -] -cachy = [ - {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, - {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, -] -certifi = [ - {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, - {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, - {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, -] -cleo = [ - {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, - {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, -] -clikit = [ - {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, - {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, -] -colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] -crashtest = [ - {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, - {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, -] -cryptography = [ - {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, - {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, - {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, - {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, - {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, - {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, - {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, - {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, - {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, -] -distlib = [ - {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, - {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] -filelock = [ - {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, - {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, -] -html5lib = [ - {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, - {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] -importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -keyring = [ - {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, - {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, -] -lockfile = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] -mako = [ - {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -msgpack = [ - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, - {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, - {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, - {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, - {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, - {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, - {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, - {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, - {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, - {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, - {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, - {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, - {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, - {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, -] -origen-autoapi = [ - {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, - {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, -] -origen-metal = [] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -pastel = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pkginfo = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -poetry = [ - {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, - {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, -] -poetry-core = [ - {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, - {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] -pylev = [ - {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, - {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyreadline3 = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -recommonmark = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, - {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, -] -shellingham = [ - {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, - {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] -sphinx = [ - {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, - {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, -] -sphinxbootstrap4theme = [ - {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -termcolor = [ - {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.1-py3-none-any.whl", hash = "sha256:1c5bebdf19d5051e2e1de6cf70adfc5948d47221f097fcff7a3ffc91e953eaf5"}, - {file = "tomlkit-0.11.1.tar.gz", hash = "sha256:61901f81ff4017951119cd0d1ed9b7af31c821d6845c8c477587bbdcd5e5854e"}, -] -urllib3 = [ - {file = "urllib3-1.26.10-py2.py3-none-any.whl", hash = "sha256:8298d6d56d39be0e3bc13c1c97d133f9b45d797169a0e11cdd0e0489d786f7ec"}, - {file = "urllib3-1.26.10.tar.gz", hash = "sha256:879ba4d1e89654d9769ce13121e0f94310ea32e8d2f8cf587b77c08bbcdb30d6"}, -] -virtualenv = [ - {file = "virtualenv-20.15.1-py2.py3-none-any.whl", hash = "sha256:b30aefac647e86af6d82bfc944c556f8f1a9c90427b2fb4e3bfbf338cb82becf"}, - {file = "virtualenv-20.15.1.tar.gz", hash = "sha256:288171134a2ff3bfb1a2f54f119e77cd1b81c29fc1265a2356f3e8d14c7d58c4"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -yapf = [ - {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, - {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, -] -zipp = [ - {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, - {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, -] +lock-version = "2.0" +python-versions = ">=3.7" +content-hash = "9a11375abf60489c9f422629fad1da5484c67b97c61e44435234ff58c0e8cda5" diff --git a/python/origen/poetry_build.py b/python/origen/poetry_build.py index bc16cd4d..3090ac45 100644 --- a/python/origen/poetry_build.py +++ b/python/origen/poetry_build.py @@ -1,54 +1,45 @@ import pathlib, shutil, os +from build_helpers import windows, compile_rust, publish_step, ls_dir if __name__ == '__main__': - # Not needed during regression testing - if os.getenv("GITHUB_WORKFLOW", "") == "publish": - current = pathlib.Path(__file__).parent.absolute() - rust_build_target = os.getenv("ORIGEN__BUILD_TARGET", "release") - copy_build_target = os.getenv("ORIGEN__COPY_BUILD_TARGET", True) - if copy_build_target == "0": - copy_build_target = False - - # Package the CLI - cli_src = current.joinpath(f"../rust/origen/target/{rust_build_target}") - if cli_src.joinpath("origen.exe").exists(): - # Windows - cli_src = cli_src.joinpath("origen.exe") - elif cli_src.joinpath("origen").exists(): - cli_src = cli_src.joinpath("origen") - else: - raise RuntimeError(f"Could not locate built CLI in {cli_src}") - cli_pkg_dir = current.joinpath("origen/__bin__/bin") - cli_pkg_dir.mkdir(parents=True, exist_ok=True) + if publish_step: + print("Building libraries for packaging...") + origen_pkg_root = pathlib.Path(__file__).parent.absolute() + origen_pkg_lib = origen_pkg_root.joinpath(f"_origen.{'pyd' if windows else 'so'}") - print(f"Copying CLI for packaging ({cli_src} to {cli_pkg_dir})") - shutil.copy2(cli_src, cli_pkg_dir) + rust_build_target = os.getenv("ORIGEN__BUILD_TARGET", "release") + build_lib = os.getenv("ORIGEN__BUILD_LIB", True) + copy_lib = os.getenv("ORIGEN__COPY_LIB", True) + if copy_lib == "0": + copy_lib = False + origen_lib_src = origen_pkg_root.joinpath("../../rust/pyapi") + origen_lib_target = origen_lib_src.joinpath(f"target/{rust_build_target}/{'' if windows else 'lib'}_origen.{'dll' if windows else 'so'}") + build_cli = os.getenv("ORIGEN__BUILD_CLI", True) + copy_cli = os.getenv("ORIGEN__COPY_CLI", True) + if copy_cli == "0": + copy_cli = False + origen_cli_src = origen_pkg_root.joinpath("../../rust/origen") + origen_cli_target = origen_cli_src.joinpath(f"target/{rust_build_target}/origen{'.exe' if windows else ''}") + origen_cli_pkg_dir = origen_pkg_root.joinpath("origen/__bin__/bin") - # Package the _origen compiled library - # For debugging the process locally, especially when we just want to make sure - # the process is more or less working, we can't override the running library - # with the target one. So, just assume all is well when running for debugging reasons, - # or run the poetry build command manually to build the package. - if copy_build_target: - _origen_src = current.joinpath( - f"../rust/pyapi/target/{rust_build_target}") - if _origen_src.joinpath("_origen.dll").exists(): - # Windows - _origen_pkg = current.joinpath("_origen.pyd") - _origen_src = _origen_src.joinpath("_origen.dll") - elif _origen_src.joinpath("lib_origen.so").exists(): - _origen_pkg = current.joinpath("_origen.so") - _origen_src = _origen_src.joinpath("lib_origen.so") - else: - raise RuntimeError( - f"Could not locate compiled library in {_origen_src}") - print( - f"Copying _origen library for packaging ({_origen_src} to {_origen_pkg})" - ) - shutil.copy2(_origen_src, _origen_pkg) - else: - print("Skipping copy of built library") + # Build and copy Origen CLI + if build_cli: + compile_rust(origen_cli_src, rust_build_target, True) + if copy_cli: + print(f"Copying CLI for packaging from ({origen_cli_target} to {origen_cli_pkg_dir})") + ls_dir(origen_cli_target.parent) + shutil.copy2(origen_cli_target, origen_cli_pkg_dir) + # Build and copy Origen library + if build_lib: + compile_rust(origen_lib_src, rust_build_target, False) + if copy_lib: + print(f"Copying CLI for packaging ({origen_lib_target} to {origen_pkg_lib})") + ls_dir(origen_lib_target.parent) + shutil.copy2(origen_lib_target, origen_pkg_lib) + print("Libraries built!") + else: + print("Skipping library build steps when run as a dependency") def build(arg): # This method is called during install. Very important this is defined and diff --git a/python/origen/pyproject.toml b/python/origen/pyproject.toml index a1465970..9ee13769 100644 --- a/python/origen/pyproject.toml +++ b/python/origen/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "origen" -version = "2.0.0.dev5" +version = "2.0.0.dev8" description = "Semiconductor Developer's Kit" homepage = "https://origen-sdk.org/o2" license = "MIT" @@ -18,11 +18,11 @@ script = "poetry_build.py" generate-setup-file = false [tool.poetry.scripts] -o2 = 'origen.__bin__:run_origen' +origen = 'origen.__bin__:run_origen' [tool.poetry.dependencies] -python = ">=3.7,<3.11" -origen_metal = "= 0.4.0" +python = ">=3.7.0,<3.13" +origen_metal = "~0.4.1.dev1" termcolor = ">= 1.1.0" colorama = "^0.4" bs4 = "0.0.1" diff --git a/python/origen_metal/origen_metal/__init__.py b/python/origen_metal/origen_metal/__init__.py index 0237747f..c8a81553 100644 --- a/python/origen_metal/origen_metal/__init__.py +++ b/python/origen_metal/origen_metal/__init__.py @@ -21,5 +21,11 @@ def __getattr__(name): if name == "current_user": return users.current_user + elif name == "version": + from origen_metal.utils.version import Version + return Version(__getattr__("__version__")) + elif name == "__version__": + import importlib_metadata + return importlib_metadata.version(__name__) else: raise AttributeError(f"module '{__name__}' has no attribute '{name}'") diff --git a/python/origen_metal/origen_metal/_helpers/__init__.py b/python/origen_metal/origen_metal/_helpers/__init__.py index e69de29b..cbd830e5 100644 --- a/python/origen_metal/origen_metal/_helpers/__init__.py +++ b/python/origen_metal/origen_metal/_helpers/__init__.py @@ -0,0 +1,54 @@ +import inspect +import multiprocessing as mp +import subprocess as sp +from typing import Any + +PACKAGE_NOT_FOUND_MESSAGE = "Package(s) not found:" + +# TODO pip_show: add some basic tests +class PipShowReturn: + def __init__(self, output): + self.fields = dict([l.strip().split(":", 1) for l in output.split("\n")[:-1]]) + self.fields = dict([k.strip(), v.strip()] for k, v in self.fields.items()) + self._field_names = dict([f.lower().replace('-', '_'), f] for f in self.fields.keys()) + + def __getattr__(self, name: str) -> Any: + if name in self._field_names: + return self.fields[self._field_names[name]] + return object.__getattribute__(self, name) + +def pip_show(package, *, no_parse=False, wrap_poetry=False): + if wrap_poetry: + cmd = ["poetry", "run"] + else: + cmd = [] + cmd += ["pip", "show", package] + result = sp.run(cmd, capture_output=True, text=True) + if no_parse: + return result + if PACKAGE_NOT_FOUND_MESSAGE in result.stderr: + return None + return PipShowReturn(result.stdout) + +# TODO swap out assert? + +def in_new_proc(func=None, mod=None, func_kwargs=None, expect_fail=False): + if func is None: + func = getattr(mod, inspect.stack()[1].function) + context = mp.get_context("spawn") + q = context.Queue() + + args=(q, func_kwargs) + proc = context.Process(target=func, args=args) + proc.start() + proc.join() + results = {} + while not q.empty(): + # Convert the populated Queue to a dictionary + obj = q.get() + results[obj[0]] = obj[1] + if expect_fail: + assert proc.exitcode == 1 + else: + assert proc.exitcode == 0 + return results diff --git a/python/origen_metal/origen_metal/utils/version.py b/python/origen_metal/origen_metal/utils/version.py new file mode 100644 index 00000000..793611ef --- /dev/null +++ b/python/origen_metal/origen_metal/utils/version.py @@ -0,0 +1,6 @@ +from origen_metal import _origen_metal +Version = _origen_metal.utils.Version +from_pyproject = _origen_metal.utils.Version.from_pyproject +from_cargo = _origen_metal.utils.Version.from_cargo +pep440 = _origen_metal.utils.Version.pep440 +semver = _origen_metal.utils.Version.semver \ No newline at end of file diff --git a/python/origen_metal/poetry.lock b/python/origen_metal/poetry.lock index dd4a5796..e5162a0f 100644 --- a/python/origen_metal/poetry.lock +++ b/python/origen_metal/poetry.lock @@ -1,3 +1,5 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "astunparse" version = "1.6.3" @@ -5,64 +7,92 @@ description = "An AST unparser for Python" category = "dev" optional = false python-versions = "*" +files = [ + {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, + {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, +] [package.dependencies] six = ">=1.6.1,<2.0" +wheel = ">=0.23.0,<1.0" [[package]] name = "atomicwrites" -version = "1.4.0" +version = "1.4.1" description = "Atomic file writes." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" -version = "21.4.0" +version = "23.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "importlib-metadata" -version = "4.11.4" +version = "6.7.0" description = "Read metadata from Python packages" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] [package.dependencies] typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "importlib-resources (>=1.3)"] +testing = ["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-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "jinja2" @@ -71,6 +101,10 @@ description = "A very fast and expressive template engine." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -80,22 +114,75 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "markupsafe" -version = "2.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] [[package]] name = "packaging" -version = "21.3" +version = "23.1" description = "Core utilities for Python packages" category = "dev" optional = false -python-versions = ">=3.6" - -[package.dependencies] -pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] [[package]] name = "pdoc" @@ -104,6 +191,9 @@ description = "API Documentation for Python Projects" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "pdoc-7.4.0-py3-none-any.whl", hash = "sha256:681a2f243e4ca51bedd0645c2d18275b8b83444e9b6e42b502882ec45369e679"}, +] [package.dependencies] astunparse = {version = "*", markers = "python_version < \"3.9\""} @@ -116,11 +206,15 @@ dev = ["flake8", "hypothesis", "mypy", "pytest", "pytest-cov", "pytest-timeout", [[package]] name = "pluggy" -version = "1.0.0" +version = "1.2.0" description = "plugin and hook calling mechanisms for python" category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -136,25 +230,25 @@ description = "library with cross-python path, ini-parsing, io, code, log facili category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "pygments" -version = "2.12.0" +version = "2.15.1" description = "Pygments is a syntax highlighting package written in Python." category = "dev" optional = false -python-versions = ">=3.6" - -[[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "dev" -optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +plugins = ["importlib-metadata"] [[package]] name = "pyreadline3" @@ -163,6 +257,10 @@ description = "A python implementation of GNU readline." category = "main" optional = false python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] [[package]] name = "pytest" @@ -171,6 +269,10 @@ description = "pytest: simple powerful testing with Python" category = "dev" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -193,14 +295,25 @@ description = "Python 2 and 3 compatibility utilities" category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "termcolor" -version = "1.1.0" -description = "ANSII Color formatting for output in terminal." +version = "2.3.0" +description = "ANSI color formatting for output in terminal" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] [[package]] name = "toml" @@ -209,149 +322,55 @@ description = "Python Library for Tom's Obvious, Minimal Language" category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] name = "typing-extensions" -version = "4.2.0" +version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "wheel" +version = "0.41.0" +description = "A built-package format for Python" category = "dev" optional = false python-versions = ">=3.7" +files = [ + {file = "wheel-0.41.0-py3-none-any.whl", hash = "sha256:7e9be3bbd0078f6147d82ed9ed957e323e7708f57e134743d2edef3a7b7972a9"}, + {file = "wheel-0.41.0.tar.gz", hash = "sha256:55a0f0a5a84869bce5ba775abfd9c462e3a6b1b7b7ec69d72c0b83d673a5114d"}, +] + +[package.extras] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "zipp" -version = "3.8.0" +version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" +category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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)"] [metadata] -lock-version = "1.1" -python-versions = ">=3.7,<3.11" -content-hash = "1360e7bccec2348e9d5b23ac7bd54505acc8555ad15cd81aeba3d1048d7fd5af" - -[metadata.files] -astunparse = [ - {file = "astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8"}, - {file = "astunparse-1.6.3.tar.gz", hash = "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.11.4-py3-none-any.whl", hash = "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec"}, - {file = "importlib_metadata-4.11.4.tar.gz", hash = "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pdoc = [ - {file = "pdoc-7.4.0-py3-none-any.whl", hash = "sha256:681a2f243e4ca51bedd0645c2d18275b8b83444e9b6e42b502882ec45369e679"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyreadline3 = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -termcolor = [ - {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -typing-extensions = [ - {file = "typing_extensions-4.2.0-py3-none-any.whl", hash = "sha256:6657594ee297170d19f67d55c05852a874e7eb634f4f753dbd667855e07c1708"}, - {file = "typing_extensions-4.2.0.tar.gz", hash = "sha256:f1c24655a0da0d1b67f07e17a5e6b2a105894e6824b92096378bb3668ef02376"}, -] -zipp = [ - {file = "zipp-3.8.0-py3-none-any.whl", hash = "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099"}, - {file = "zipp-3.8.0.tar.gz", hash = "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad"}, -] +lock-version = "2.0" +python-versions = ">=3.7.0,<3.13" +content-hash = "1972e64b2e47e1b12a5020124e331c949b64e0c1f39ebb56d228b88a065d15db" diff --git a/python/origen_metal/poetry_build.py b/python/origen_metal/poetry_build.py new file mode 100644 index 00000000..2be84c17 --- /dev/null +++ b/python/origen_metal/poetry_build.py @@ -0,0 +1,38 @@ +import pathlib, shutil, os, sys + +sys.path.insert(0, str(pathlib.Path(os.path.abspath(__file__)).parent.parent.joinpath("origen"))) +from build_helpers import windows, compile_rust, publish_step, ls_dir + +if __name__ == '__main__': + if publish_step: + print("Building libraries for packaging...") + om_pkg_root = pathlib.Path(__file__).parent.absolute() + om_lib = om_pkg_root.joinpath('origen_metal').joinpath(f"_origen_metal.{'pyd' if windows else 'so'}") + + rust_build_target = os.getenv("ORIGEN_METAL__BUILD_TARGET", "release") + copy_build_target = os.getenv("ORIGEN_METAL__COPY_BUILD_TARGET", True) + if copy_build_target == "0": + copy_build_target = False + om_lib_src = om_pkg_root.joinpath("../../rust/pyapi_metal") + om_lib_target = om_lib_src.joinpath(f"target/{rust_build_target}") + om_lib_target = om_lib_target.joinpath(f"{'' if windows else 'lib'}origen_metal.{'dll' if windows else 'so'}") + compile_lib = os.getenv("ORIGEN_METAL__COMPILE_LIB", True) + + if compile_lib: + compile_rust(om_lib_src, rust_build_target, False) + if copy_build_target: + print(f"Copying compiled library '{om_lib_target}' to '{om_lib}'") + ls_dir(om_lib_target.parent) + shutil.copy2(om_lib_target, om_lib) + + # Final check that compiled library is present + if not om_lib.exists(): + print(f"No OM library found. Expected: {om_lib}") + exit(1) + else: + print("Skipping library build steps when run as a dependency") + +def build(arg): + # This method is called during install. Very important this is defined and + # does nothing. + pass diff --git a/python/origen_metal/pyproject.toml b/python/origen_metal/pyproject.toml index 38d13a2a..89a5c84d 100644 --- a/python/origen_metal/pyproject.toml +++ b/python/origen_metal/pyproject.toml @@ -1,14 +1,22 @@ [tool.poetry] name = "origen_metal" -version = "0.4.0" +version = "0.4.1.dev1" description = "Bare metal APIs for the Origen SDK" +homepage = "https://origen-sdk.org/o2" +license = "MIT" +readme = "README.md" authors = ["Origen-SDK"] +include = [ + "origen_metal/_origen_metal.pyd", # Windows + "origen_metal/_origen_metal.so", # Linux +] [tool.poetry.dependencies] -python = ">=3.7,<3.11" +python = ">=3.7.0,<3.13" pyreadline3 = { version="^3.3", platform="win32" } termcolor = ">= 1.1.0" colorama = ">= 0.4.4" # Note: colorama is usually installed on the system already, but it isn't actually required (e.g. WSL won't have this by default) +importlib-metadata = ">= 6.7.0" # For use with Python pre-3.8 [tool.poetry.dev-dependencies] pytest = "^6.2.4" @@ -21,4 +29,12 @@ addopts = "--strict-markers" markers = [ "online: marks tests as requiring an internet connection", "ldap: marks tests requiring/using the external ldap", -] \ No newline at end of file +] + +[tool.poetry.build] +script = "poetry_build.py" +generate-setup-file = false + +# [build-system] +# requires = ["setuptools", "poetry-core>=1.0.0"] +# build-backend = "poetry.core.masonry.api" diff --git a/python/origen_metal/tests/__init__.py b/python/origen_metal/tests/__init__.py index ef0f0f4c..c1b370c3 100644 --- a/python/origen_metal/tests/__init__.py +++ b/python/origen_metal/tests/__init__.py @@ -1,6 +1,9 @@ import pytest +from pathlib import Path # Have pytest's assert rewriting take over: # https://docs.pytest.org/en/stable/writing_plugins.html#assertion-rewriting pytest.register_assert_rewrite("tests.shared") pytest.register_assert_rewrite("tests.framework.users") + +test_dir = Path(__file__).parent \ No newline at end of file diff --git a/python/origen_metal/tests/framework/users/in_new_proc_funcs.py b/python/origen_metal/tests/framework/users/in_new_proc_funcs.py new file mode 100644 index 00000000..4685f4db --- /dev/null +++ b/python/origen_metal/tests/framework/users/in_new_proc_funcs.py @@ -0,0 +1,8 @@ +def try_home_dir(q, options): + import os + os.environ.pop("HOME", None) + os.environ.pop("USERPROFILE", None) + + import origen_metal + origen_metal.users.lookup_current_id(update_current=True) + origen_metal.users.current_user.set_home_dir() diff --git a/python/origen_metal/tests/framework/users/shared.py b/python/origen_metal/tests/framework/users/shared.py index 6e0f45a2..a14976af 100644 --- a/python/origen_metal/tests/framework/users/shared.py +++ b/python/origen_metal/tests/framework/users/shared.py @@ -100,6 +100,12 @@ def user(self, id=None): def to_user_id(self, id): return f"{self.user_id_root}_{id}" + @pytest.fixture + def cu(self, users, u): + if users.current_user is None: + users.current_user = u + return users.current_user + @property def users_class(self): return om._origen_metal.framework.users.Users diff --git a/python/origen_metal/tests/framework/users/test_users.py b/python/origen_metal/tests/framework/users/test_users.py index 3740ec71..1929f2b4 100644 --- a/python/origen_metal/tests/framework/users/test_users.py +++ b/python/origen_metal/tests/framework/users/test_users.py @@ -1,6 +1,4 @@ -from typing import Dict -import pytest, pathlib -from pathlib import Path +import pytest import origen_metal as om from .shared import Base @@ -9,10 +7,10 @@ from .tests__datasets import T_Datasets from .tests__user_motives import T_UserMotives from .tests__populating import T_PopulatingUsers -from .tests__datasets import Base as DSBase from .tests__user_sessions import T_UserSessions from .tests__validating_passwords import T_ValidatingPasswords from .tests__user_roles import T_UserRoles +from .tests__home_dir import T_UserHomeDirectory class TestUsers(T_Users): pass @@ -57,131 +55,34 @@ class TestValidatingPasswords(T_ValidatingPasswords): class TestUserRoles(T_UserRoles): pass -class TestUserHomeDirectory(DSBase): - @pytest.fixture - def hd(self): - return Path("test/home/dir") - - @pytest.fixture - def hd1(self, hd): - return hd.joinpath("1") - - @pytest.fixture - def hd2(self, hd): - return hd.joinpath("2") - - @pytest.fixture - def hd3(self, hd): - return hd.joinpath("3") - - def test_home_dir_starts_as_none(self, unload_users, u, ddk): - assert u.home_dir is None - assert u.datasets[ddk].home_dir is None - - def test_home_dir_can_be_set(self, u, d, hd): - u.home_dir = hd - assert u.home_dir == hd - assert d.home_dir == hd - - hd_str = "home/dir/str" - u.home_dir = hd_str - assert u.home_dir == Path(hd_str) - assert d.home_dir == Path(hd_str) - - def test_home_dir_can_be_set_and_retrieved_per_dataset( - self, unload_users, u, d, d2, hd, hd2, hd3): - assert u.home_dir is None - assert d.home_dir is None - assert d2.home_dir is None - - u.home_dir = hd - assert u.home_dir == hd - assert d.home_dir == hd - assert d2.home_dir is None - - d2.home_dir = hd2 - assert u.home_dir == hd - assert d.home_dir == hd - assert d2.home_dir == hd2 - - d.home_dir = hd3 - assert u.home_dir == hd3 - assert d.home_dir == hd3 - assert d2.home_dir == hd2 - - hd_str = "home/dir/str" - d.home_dir = hd_str - assert u.home_dir == Path(hd_str) - assert d.home_dir == Path(hd_str) - assert d2.home_dir == hd2 - - def test_home_dir_obeys_hierarchy(self, unload_users, u, d, d2, ddk, - d2_name, hd1, hd2): - assert u.data_lookup_hierarchy == [ddk, d2_name] - assert u.home_dir is None - - d.home_dir = hd1 - d2.home_dir = hd2 - - assert u.home_dir == hd1 - - u.data_lookup_hierarchy = [d2_name, ddk] - assert u.home_dir == hd2 - - u.data_lookup_hierarchy = [] - with pytest.raises( - RuntimeError, - match= - "Dataset hierarchy is empty! Data lookups must explicitly name the dataset to query" - ): - u.home_dir - - def test_home_dir_iterates_through_hierarchy(self, unload_users, u, d, d2, - ddk, d2_name, hd1, hd2): - assert u.data_lookup_hierarchy == [ddk, d2_name] - assert u.home_dir is None - - d.home_dir is None - d2.home_dir = hd2 - assert u.home_dir == hd2 - - d.home_dir = hd1 - assert u.home_dir == hd1 - - def test_requiring_a_home_dir_is_set(self, unload_users, u, hd1): - assert u.home_dir is None - with pytest.raises( - RuntimeError, - match= - f"Required a home directory for user '{u.id}' but none has been set" - ): - u.require_home_dir - - u.home_dir = hd1 - assert u.require_home_dir == hd1 - - def test_requiring_a_home_dir_is_set_per_dataset(self, unload_users, u, d, - d2, ddk, hd1, hd2): - assert u.home_dir is None - d2.home_dir = hd2 - assert u.home_dir == hd2 - - with pytest.raises( - RuntimeError, - match= - f"Required a home directory for user '{u.id}' and dataset '{ddk}', but none has been set" - ): - d.require_home_dir - - d.home_dir = hd1 - assert d.require_home_dir == hd1 - - # TEST_NEEDED - @pytest.mark.skip - def test_auto_setting_home_dir(self): - raise NotImplementedError() - - # TEST_NEEDED - @pytest.mark.skip - def test_setting_home_dir_from_frontend(self): - raise NotImplementedError() +class TestUserHomeDirectory(T_UserHomeDirectory): + pass + +class TestDisablingPasswordPrompt(Base): + @property + def prompt_error_msg(self): + return f"Cannot prompt for passwords for user '{self.get_users.current_user.id}'. Passwords must be loaded by the config or set directly." + + def test_password_prompt_enabled_by_default(self, fresh_frontend, unload_users, cu): + assert cu.prompt_for_passwords == True + assert cu.__prompt_for_passwords__ == None + + def test_setting_password_prompt(self, cu): + assert cu.prompt_for_passwords == True + assert cu.__prompt_for_passwords__ == None + + cu.prompt_for_passwords = True + assert cu.prompt_for_passwords == True + assert cu.__prompt_for_passwords__ == True + + def test_disabling_password_prmopt(self, cu): + cu.prompt_for_passwords = False + assert cu.prompt_for_passwords == False + assert cu.__prompt_for_passwords__ == False + + with pytest.raises(RuntimeError, match=self.prompt_error_msg): + cu.password + + cu.add_dataset("test") + with pytest.raises(RuntimeError, match=self.prompt_error_msg): + cu.datasets['test'].password diff --git a/python/origen_metal/tests/framework/users/tests__home_dir.py b/python/origen_metal/tests/framework/users/tests__home_dir.py new file mode 100644 index 00000000..f9416e32 --- /dev/null +++ b/python/origen_metal/tests/framework/users/tests__home_dir.py @@ -0,0 +1,440 @@ +import pytest, pathlib +from pathlib import Path +import origen_metal as om +from origen_metal._helpers import in_new_proc +from .in_new_proc_funcs import try_home_dir + +from .tests__datasets import Base as DSBase + +class T_UserHomeDirectory(DSBase): + @pytest.fixture + def hd(self): + return Path("test/home/dir") + + @pytest.fixture + def hd1(self, hd): + return hd.joinpath("1") + + @pytest.fixture + def hd2(self, hd): + return hd.joinpath("2") + + @pytest.fixture + def hd3(self, hd): + return hd.joinpath("3") + + @property + def logged_in_user_home_dir(self): + return pathlib.Path.home() + + @property + def routed_user(self): + if not hasattr(self, "_routed_user"): + self._routed_user = False + return self._routed_user + + @property + def routed_dataset(self): + if not hasattr(self, "_routed_dataset"): + self._routed_dataset = False + return self._routed_dataset + + callback_home_dir = Path("/callback_home/") + + def lookup_home_dir_function(self, user, dataset, is_current): + if user.id == "return_str": + return str(self.callback_home_dir.joinpath("str/u_str")) + elif user.id == "return_error": + raise RuntimeError("Encountered user 'return_error'!") + elif user.id == "return_none": + return None + elif user.id == self.logged_in_id: + if dataset is None: + self._routed_user = True + else: + self._routed_dataset = True + return False + elif user.id == "return_true": + return True + else: + hd = self.callback_home_dir.joinpath(user.id) + if dataset is None: + return hd + else: + return hd.joinpath(f"dataset/{dataset.dataset_name}") + + def test_home_dir_starts_as_none(self, unload_users, u, ddk): + assert u.home_dir is None + assert u.datasets[ddk].home_dir is None + + def test_home_dir_can_be_set(self, u, d, hd): + u.home_dir = hd + assert u.home_dir == hd + assert d.home_dir == hd + + hd_str = "home/dir/str" + u.home_dir = hd_str + assert u.home_dir == Path(hd_str) + assert d.home_dir == Path(hd_str) + + def test_home_dir_can_be_set_and_retrieved_per_dataset( + self, unload_users, u, d, d2, hd, hd2, hd3): + assert u.home_dir is None + assert d.home_dir is None + assert d2.home_dir is None + + u.home_dir = hd + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir is None + + d2.home_dir = hd2 + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir == hd2 + + d.home_dir = hd3 + assert u.home_dir == hd3 + assert d.home_dir == hd3 + assert d2.home_dir == hd2 + + hd_str = "home/dir/str" + d.home_dir = hd_str + assert u.home_dir == Path(hd_str) + assert d.home_dir == Path(hd_str) + assert d2.home_dir == hd2 + + def test_set_method(self, unload_users, u, d, d2, ddk, d2_name, hd, hd2, hd3): + assert u.home_dir is None + assert d.home_dir is None + assert d2.home_dir is None + + u.set_home_dir(hd) + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir is None + + d2.set_home_dir(hd2) + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir == hd2 + + d.set_home_dir(hd3) + assert u.home_dir == hd3 + assert d.home_dir == hd3 + assert d2.home_dir == hd2 + + hd_str = "home/dir/str" + d.set_home_dir(hd_str) + assert u.home_dir == Path(hd_str) + assert d.home_dir == Path(hd_str) + assert d2.home_dir == hd2 + + def test_home_dir_obeys_hierarchy(self, unload_users, u, d, d2, ddk, + d2_name, hd1, hd2): + assert u.data_lookup_hierarchy == [ddk, d2_name] + assert u.home_dir is None + + d.home_dir = hd1 + d2.home_dir = hd2 + + assert u.home_dir == hd1 + + u.data_lookup_hierarchy = [d2_name, ddk] + assert u.home_dir == hd2 + + u.data_lookup_hierarchy = [] + with pytest.raises( + RuntimeError, + match= + "Dataset hierarchy is empty! Data lookups must explicitly name the dataset to query" + ): + u.home_dir + + def test_home_dir_iterates_through_hierarchy(self, unload_users, u, d, d2, + ddk, d2_name, hd1, hd2): + assert u.data_lookup_hierarchy == [ddk, d2_name] + assert u.home_dir is None + + d.home_dir is None + d2.home_dir = hd2 + assert u.home_dir == hd2 + + d.home_dir = hd1 + assert u.home_dir == hd1 + + def test_clearing_home_dir(self, unload_users, u, d, d2, hd, hd2, hd3): + # Add a 3rd dataset outside of the data lookup hierarchy + # TODO add option to not add to data lookup hierarchy? + old_hierarchy = u.data_lookup_hierarchy + d3 = u.add_dataset("ds3") + d3.home_dir = hd3 + u.data_lookup_hierarchy = old_hierarchy + + d.set_home_dir(hd) + d2.set_home_dir(hd2) + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir == hd2 + + # Clears all home directories in the hierarchy + # d3 (not in hierarchy) should remain + u.clear_home_dir() + assert u.home_dir is None + assert d.home_dir is None + assert d2.home_dir is None + assert d3.home_dir == hd3 + + d.set_home_dir(hd) + d2.set_home_dir(hd2) + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir == hd2 + assert d3.home_dir == hd3 + + # Clear a specific home dir + d.clear_home_dir() + assert u.home_dir == hd2 + assert d.home_dir is None + assert d2.home_dir == hd2 + assert d3.home_dir == hd3 + + # Use setter method to clear + u.home_dir = None + assert u.home_dir is None + assert d.home_dir is None + assert d2.home_dir is None + assert d3.home_dir == hd3 + + d3.home_dir = None + assert d3.home_dir is None + + def test_requiring_a_home_dir_is_set(self, unload_users, u, hd1): + assert u.home_dir is None + with pytest.raises( + RuntimeError, + match= + f"Required a home directory for user '{u.id}' but none has been set" + ): + u.require_home_dir + + u.home_dir = hd1 + assert u.require_home_dir == hd1 + + def test_requiring_a_home_dir_is_set_per_dataset(self, unload_users, u, d, + d2, ddk, hd1, hd2): + assert u.home_dir is None + d2.home_dir = hd2 + assert u.home_dir == hd2 + + with pytest.raises( + RuntimeError, + match= + f"Required a home directory for user '{u.id}' and dataset '{ddk}', but none has been set" + ): + d.require_home_dir + + d.home_dir = hd1 + assert d.require_home_dir == hd1 + + def test_looking_up_home_dir(self, unload_users, users, ddk): + u = users.add(self.logged_in_id) + assert u.home_dir is None + assert u.datasets[ddk].home_dir is None + + u.set_home_dir() + hd = self.logged_in_user_home_dir + assert u.home_dir == hd + assert u.datasets[ddk].home_dir == hd + + def test_looking_up_home_dir_from_callback(self, fresh_frontend, unload_users, users, u): + assert users.lookup_home_dir_function is None + users.lookup_home_dir_function = self.lookup_home_dir_function + assert users.lookup_home_dir_function == users.lookup_home_dir_function + + assert u.home_dir is None + u.set_home_dir() + assert u.home_dir == self.callback_home_dir.joinpath(u.id) + + u_str = users.add("return_str") + assert u_str.home_dir is None + u_str.set_home_dir() + assert u_str.home_dir == self.callback_home_dir.joinpath("str/u_str") + + def test_looking_up_home_dir_for_dataset(self, fresh_frontend, unload_users, users, ddk, hd): + u = users.add(self.logged_in_id) + d = u.datasets[ddk] + d2 = u.add_dataset("ds2", as_topmost=False) + assert u.home_dir is None + assert d.home_dir is None + + u.home_dir = hd + assert u.home_dir == hd + assert d.home_dir == hd + assert d2.home_dir is None + + d2.set_home_dir() + assert u.home_dir == hd + assert d2.home_dir == self.logged_in_user_home_dir + + def test_looking_up_home_dir_for_dataset_from_callback(self, fresh_frontend, users, unload_users, u, d, d2): + users.lookup_home_dir_function = self.lookup_home_dir_function + assert d.home_dir is None + assert d2.home_dir is None + + d.set_home_dir() + assert d.home_dir == self.callback_home_dir.joinpath(f"{u.id}/dataset/{d.dataset_name}") + assert d2.home_dir is None + + d2.set_home_dir() + assert d.home_dir == self.callback_home_dir.joinpath(f"{u.id}/dataset/{d.dataset_name}") + assert d2.home_dir == self.callback_home_dir.joinpath(f"{u.id}/dataset/{d2.dataset_name}") + + def test_lookup_home_dir_with_none_argument(self, fresh_frontend, users, unload_users, u, d, d2): + users.lookup_home_dir_function = self.lookup_home_dir_function + assert u.home_dir is None + assert d.home_dir is None + assert d2.home_dir is None + + u.set_home_dir(None) + assert u.home_dir == self.callback_home_dir.joinpath(u.id) + assert d.home_dir == self.callback_home_dir.joinpath(u.id) + assert d2.home_dir is None + + d2.set_home_dir(None) + assert d2.home_dir == self.callback_home_dir.joinpath(f"{u.id}/dataset/{d2.dataset_name}") + + def test_error_in_callback(self, fresh_frontend, unload_users, users, hd, hd2, hd3): + users.lookup_home_dir_function = self.lookup_home_dir_function + u = users.add("return_error") + d2 = u.add_dataset("ds2", as_topmost=False) + + err = "Encountered Exception 'RuntimeError' with message: Encountered user 'return_error'!" + + assert u.home_dir is None + with pytest.raises(RuntimeError, match=err): + u.set_home_dir() + assert u.home_dir is None + + u.home_dir = hd + with pytest.raises(RuntimeError, match=err): + u.set_home_dir() + assert u.home_dir == hd + + assert d2.home_dir is None + with pytest.raises(RuntimeError, match=err): + d2.set_home_dir() + assert d2.home_dir is None + + d2.home_dir = hd3 + with pytest.raises(RuntimeError, match=err): + d2.set_home_dir() + assert d2.home_dir == hd3 + + def test_callback_falls_back_to_default(self, fresh_frontend, unload_users, users): + assert self.routed_user is False + users.lookup_home_dir_function = self.lookup_home_dir_function + u = users.add(self.logged_in_id) + d = u.add_dataset("ds") + d2 = u.add_dataset("ds2", as_topmost=False) + assert u.home_dir is None + + u.set_home_dir() + assert u.home_dir == self.logged_in_user_home_dir + assert self.routed_user is True + + assert d2.home_dir is None + assert self.routed_dataset is False + d2.set_home_dir() + assert u.home_dir == self.logged_in_user_home_dir + assert self.routed_dataset is True + + def test_callback_returns_none(self, fresh_frontend, unload_users, users, hd, hd2): + users.lookup_home_dir_function = self.lookup_home_dir_function + u = users.add("return_none") + d = u.add_dataset("ds") + d2 = u.add_dataset("ds2", as_topmost=False) + + assert u.home_dir is None + u.set_home_dir() + assert u.home_dir is None + + u.home_dir = hd + assert u.home_dir == hd + u.set_home_dir() + assert u.home_dir is None + + u.home_dir = hd + assert d2.home_dir is None + d2.set_home_dir() + assert d2.home_dir is None + assert u.home_dir == hd + + d2.home_dir = hd2 + assert d2.home_dir == hd2 + d2.set_home_dir() + assert d2.home_dir is None + assert u.home_dir == hd + + def test_callback_returns_true(self, fresh_frontend, unload_users, users, hd, hd2): + users.lookup_home_dir_function = self.lookup_home_dir_function + u = users.add("return_true") + d = u.add_dataset("ds") + err = "'True' is not a valid return value when looking up a user's home directory" + + u.home_dir = hd + with pytest.raises(RuntimeError, match=err): + u.set_home_dir() + assert u.home_dir == hd + + d.home_dir = hd2 + with pytest.raises(RuntimeError, match=err): + d.set_home_dir() + assert u.home_dir == hd2 + + def test_inappropriate_home_dir_for_user(self, fresh_frontend, unload_users, users, u, hd): + assert u.home_dir is None + err = f"Home directory '.*' is not appropriate for current user with id '{u.id}'" + + with pytest.raises(RuntimeError, match=err): + u.set_home_dir() + assert u.home_dir is None + u.home_dir = hd + + d = u.add_dataset("ds") + with pytest.raises(RuntimeError, match=err): + d.set_home_dir() + assert d.home_dir is None + assert u.home_dir == hd + + def test_error_when_env_is_not_set(self, fresh_frontend, unload_users, users, capfd): + in_new_proc(func=try_home_dir, expect_fail=True) + if om.running_on_windows: + env = "USERPROFILE" + else: + env = "HOME" + assert f"RuntimeError: Please set environment variable {env} to point to your home directory, then try again" in capfd.readouterr().err + + # TEST_NEEDED + @pytest.mark.skip + def test_om_home_dir(self): + raise NotImplementedError() + assert om.home_dir == hd + assert om.home_dir == hd1 + assert om.home_dir == hd2 + + # TEST_NEEDED + @pytest.mark.skip + def test_error_on_om_home_dir_with_no_current_user(self): + raise NotImplementedError() + + # TEST_NEEDED + # TODO move elsewhere? + @pytest.mark.skip + def test_origen_dot_dir(self): + raise NotImplementedError() + + # TEST_NEEDED + @pytest.mark.skip + def test_setting_home_dir_from_frontend(self): + raise NotImplementedError() diff --git a/python/origen_metal/tests/utils/test_ldap.py b/python/origen_metal/tests/utils/test_ldap.py index 5f04bf43..a32ac5d8 100644 --- a/python/origen_metal/tests/utils/test_ldap.py +++ b/python/origen_metal/tests/utils/test_ldap.py @@ -700,4 +700,4 @@ def test_given_user_does_not_exists(self): }) with pytest.raises(RuntimeError, match=f"No user '{static_n}' has been added"): - ldap.auth \ No newline at end of file + ldap.auth diff --git a/python/origen_metal/tests/utils/test_mailer.py b/python/origen_metal/tests/utils/test_mailer.py index 3f0b6360..7d892873 100644 --- a/python/origen_metal/tests/utils/test_mailer.py +++ b/python/origen_metal/tests/utils/test_mailer.py @@ -414,8 +414,7 @@ def test_appending_domain_when_applicable(self): ] def test_invalid_recipient_resolution(self): - invalid_email_err_msg = "Missing domain or user" - invalid_domain_err_msg = "Invalid email domain" + invalid_email_err_msg = "Missing separator character '@'." r = ["u", "u2"] ml = self.new_ml("ml", recipients=r) assert ml.recipients == r @@ -430,22 +429,6 @@ def test_invalid_recipient_resolution(self): with pytest.raises(RuntimeError, match=invalid_email_err_msg): ml.resolve_recipients() - r = ["u", "u2@origen.org"] - domain= "blah!" - ml = self.new_ml("ml", recipients=r, domain=domain) - assert ml.recipients == r - assert ml.domain == domain - with pytest.raises(RuntimeError, match=invalid_domain_err_msg): - ml.resolve_recipients() - - r = ["u@origen!", "u2@origen.org"] - domain= "blah!" - ml = self.new_ml("ml", recipients=r, domain=domain) - assert ml.recipients == r - assert ml.domain == domain - with pytest.raises(RuntimeError, match=invalid_domain_err_msg): - ml.resolve_recipients() - def test_audience_resolution(self): ml = self.new_ml("t", [], audience="prod") assert ml.audience == "production" diff --git a/python/origen_metal/tests/utils/test_version.py b/python/origen_metal/tests/utils/test_version.py new file mode 100644 index 00000000..f85ac5db --- /dev/null +++ b/python/origen_metal/tests/utils/test_version.py @@ -0,0 +1,124 @@ +import origen_metal +import pytest +from origen_metal._helpers import pip_show +from origen_metal.utils import version +from origen_metal.utils.version import Version, semver, pep440 +from pathlib import Path +from tests import test_dir + +class TestVersion: + ''' + Only need to test the Python API. + Other tests of Version itself are handled on the Rust side + ''' + + pyproject_path = test_dir.parent.joinpath("pyproject.toml") + cargo_path = test_dir.parent.parent.parent.joinpath("rust/pyapi_metal/Cargo.toml") + pep440_str = "1.2.3.dev4" + semver_str = "1.2.3-dev.4" + + def test_version_form_string(self): + ver = Version(self.pep440_str) + assert isinstance(ver, Version) + assert str(ver) == self.pep440_str + + def test_version_as_pep440_is_default(self): + ver = Version(self.semver_str) + assert str(ver) == self.pep440_str + + def test_pep440_from_string(self): + ver = pep440(self.pep440_str) + assert str(ver) == self.pep440_str + ver = pep440(self.semver_str) + assert str(ver) == self.pep440_str + + def test_semver_from_string(self): + ver = semver(self.pep440_str) + assert str(ver) == self.semver_str + ver = semver(self.semver_str) + assert str(ver) == self.semver_str + + def test_invalid_version_from_string(self): + with pytest.raises(ValueError, match=r"unexpected character 'b' while parsing minor version number"): + Version("1.b.c") + + def test_version_from_pyproject(self): + # path as string + v = version.from_pyproject(str(self.pyproject_path)) + assert str(v) == current_version() + + # path as pathlib.Path + v = version.from_pyproject(self.pyproject_path) + assert str(v) == current_version() + + def test_invalid_pyproject_path(self): + f = "path/to/nowhere/pyproject.toml" + with pytest.raises(RuntimeError, match=f"Source file '{f}' does not exist!"): + version.from_pyproject(f) + + def test_version_from_cargo(self): + print(self.cargo_path) + # path as string + v = version.from_cargo(str(self.cargo_path)) + assert str(v) == origen_metal._origen_metal.__version__ + + # path as pathlib.Path + v = version.from_cargo(self.cargo_path) + assert str(v) == origen_metal._origen_metal.__version__ + + def test_invalid_cargo_path(self): + f = "path/to/nowhere/cargo.toml" + with pytest.raises(RuntimeError, match=f"Source file '{f}' does not exist!"): + version.from_cargo(f) + + def test_to_semver_string(self): + ver = Version(self.pep440_str) + assert(str(ver)) == self.pep440_str + assert(ver.semver_str) == self.semver_str + + def test_to_pep440_string(self): + ver = semver(self.semver_str) + assert(str(ver)) == self.semver_str + assert(ver.pep440_str) == self.pep440_str + + def test_switching_from_pep400_to_semver(self): + ver = pep440(self.pep440_str) + assert ver.is_pep440 is True + assert ver.is_semver is False + assert(str(ver)) == self.pep440_str + + assert ver.convert_to_pep440() is False + assert(str(ver)) == self.pep440_str + + assert ver.convert_to_semver() is True + assert ver.is_pep440 is False + assert ver.is_semver is True + assert(str(ver)) == self.semver_str + + def test_switching_from_semver_to_pep440(self): + ver = semver(self.semver_str) + assert ver.is_semver is True + assert ver.is_pep440 is False + assert(str(ver)) == self.semver_str + + assert ver.convert_to_semver() is False + assert(str(ver)) == self.semver_str + + assert ver.convert_to_pep440() is True + assert ver.is_semver is False + assert ver.is_pep440 is True + assert(str(ver)) == self.pep440_str + +_current_version = None +def current_version(): + global _current_version + if _current_version is None: + _current_version = pip_show('origen_metal', wrap_poetry=True).version + return _current_version + +def test_om_version(): + assert isinstance(origen_metal.version, Version) + assert str(origen_metal.version) == current_version() + +def test_om_version_str(): + assert origen_metal.__version__ == current_version() diff --git a/rust/origen/Cargo.lock b/rust/origen/Cargo.lock index 20763bae..cb4c392f 100644 --- a/rust/origen/Cargo.lock +++ b/rust/origen/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.21.0" +version = "0.22.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "6e4503c46a5c0c7844e948c9a4d6acd9f50cccb4de1c48eb9e291ea17470c678" dependencies = [ "gimli", ] @@ -133,7 +133,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -142,15 +142,9 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" dependencies = [ - "winapi 0.3.9", + "winapi", ] -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - [[package]] name = "arc-swap" version = "1.7.1" @@ -176,7 +170,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ "async-lock", - "autocfg 1.3.0", + "autocfg", "cfg-if 1.0.0", "concurrent-queue", "futures-lite", @@ -204,9 +198,9 @@ version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -217,16 +211,7 @@ checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" dependencies = [ "hermit-abi 0.1.19", "libc", - "winapi 0.3.9", -] - -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.3.0", + "winapi", ] [[package]] @@ -237,9 +222,9 @@ checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "backtrace" -version = "0.3.71" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" dependencies = [ "addr2line", "cc", @@ -389,17 +374,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" -[[package]] -name = "bytes" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" -dependencies = [ - "byteorder", - "either", - "iovec", -] - [[package]] name = "bytes" version = "1.6.0" @@ -415,7 +389,7 @@ dependencies = [ "atty", "onig", "prettyprint", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "serde", "structopt", @@ -437,7 +411,7 @@ dependencies = [ "semver 1.0.23", "serde", "toml", - "url 2.5.0", + "url", ] [[package]] @@ -480,9 +454,9 @@ dependencies = [ [[package]] name = "chrono-tz" -version = "0.8.6" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59ae0466b83e838b81a54256c39d5d7c20b9d7daa10510a242d9b75abd5936e" +checksum = "93698b29de5e97ad0ae26447b344c482a7284c737d9ddc5f9e52b74a336671bb" dependencies = [ "chrono", "chrono-tz-build", @@ -491,9 +465,9 @@ dependencies = [ [[package]] name = "chrono-tz-build" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433e39f13c9a060046954e0592a8d0a4bcb1040125cbf91cb8ee58964cfb350f" +checksum = "0c088aee841df9c3041febbb73934cfc39708749bf96dc827e3359cd39ef11b1" dependencies = [ "parse-zoneinfo", "phf 0.11.2", @@ -528,18 +502,42 @@ dependencies = [ "atty", "bitflags 1.3.2", "strsim 0.8.0", - "textwrap", + "textwrap 0.11.0", "unicode-width", "vec_map", ] +[[package]] +name = "clap" +version = "3.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +dependencies = [ + "atty", + "bitflags 1.3.2", + "clap_lex", + "indexmap 1.9.3", + "strsim 0.10.0", + "termcolor", + "textwrap 0.16.1", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + [[package]] name = "cli" -version = "2.0.0-dev.5" +version = "2.0.0-dev.7" dependencies = [ "base64-url", "built", - "clap", + "clap 3.2.25", "flate2", "indexmap 1.9.3", "lazy_static", @@ -549,13 +547,11 @@ dependencies = [ "pathdiff 0.1.0", "phf 0.8.0", "regex", - "reqwest 0.9.24", "semver 0.9.0", "serde", "sha2 0.9.9", "tar", "tempfile", - "tera", "time 0.1.45", "toml", "walkdir", @@ -570,16 +566,7 @@ dependencies = [ "atty", "lazy_static", "libc", - "winapi 0.3.9", -] - -[[package]] -name = "cloudabi" -version = "0.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -dependencies = [ - "bitflags 1.3.2", + "winapi", ] [[package]] @@ -588,7 +575,7 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "crossbeam-utils 0.8.20", + "crossbeam-utils", ] [[package]] @@ -621,11 +608,11 @@ dependencies = [ "encode_unicode", "lazy_static", "libc", - "parking_lot 0.12.2", + "parking_lot", "regex", "termios", "unicode-width", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -640,7 +627,7 @@ dependencies = [ "regex", "terminal_size", "unicode-width", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -658,34 +645,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "cookie" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" -dependencies = [ - "time 0.1.45", - "url 1.7.2", -] - -[[package]] -name = "cookie_store" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" -dependencies = [ - "cookie", - "failure", - "idna 0.1.5", - "log", - "publicsuffix", - "serde", - "serde_json", - "time 0.1.45", - "try_from", - "url 1.7.2", -] - [[package]] name = "core-foundation" version = "0.9.4" @@ -726,40 +685,14 @@ dependencies = [ "cfg-if 1.0.0", ] -[[package]] -name = "crossbeam-deque" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" -dependencies = [ - "crossbeam-epoch 0.8.2", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - [[package]] name = "crossbeam-deque" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "crossbeam-epoch 0.9.18", - "crossbeam-utils 0.8.20", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" -dependencies = [ - "autocfg 1.3.0", - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "lazy_static", - "maybe-uninit", - "memoffset 0.5.6", - "scopeguard", + "crossbeam-epoch", + "crossbeam-utils", ] [[package]] @@ -768,29 +701,7 @@ version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "crossbeam-utils 0.8.20", -] - -[[package]] -name = "crossbeam-queue" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" -dependencies = [ - "cfg-if 0.1.10", - "crossbeam-utils 0.7.2", - "maybe-uninit", -] - -[[package]] -name = "crossbeam-utils" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -dependencies = [ - "autocfg 1.3.0", - "cfg-if 0.1.10", - "lazy_static", + "crossbeam-utils", ] [[package]] @@ -878,7 +789,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -952,7 +863,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72d337a64190607d4fcca2cb78982c5dd57f4916e19696b48a575fa746b6cb0f" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -963,7 +874,7 @@ checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" dependencies = [ "libc", "redox_users 0.3.5", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -984,7 +895,7 @@ checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users 0.4.5", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -999,12 +910,6 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - [[package]] name = "either" version = "1.12.0" @@ -1026,6 +931,9 @@ name = "email_address" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112" +dependencies = [ + "serde", +] [[package]] name = "encode_unicode" @@ -1112,7 +1020,7 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f16ef37b2a9b242295d61a154ee91ae884afff6b8b933b486b12481cc58310ca" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -1125,7 +1033,7 @@ checksum = "ed327f716d0d351d86c9fd3398d20ee39ad8f681873cc081da2ca1c10fed398a" dependencies = [ "enum-utils-from-str", "failure", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "serde_derive_internals", "syn 1.0.109", @@ -1137,7 +1045,7 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49be08bad6e4ca87b2b8e74146987d4e5cb3b7512efa50ef505b51a22227ee1" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", ] @@ -1157,7 +1065,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -1212,19 +1120,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" dependencies = [ "backtrace", - "failure_derive", -] - -[[package]] -name = "failure_derive" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" -dependencies = [ - "proc-macro2 1.0.83", - "quote 1.0.36", - "syn 1.0.109", - "synstructure", ] [[package]] @@ -1291,37 +1186,9 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "percent-encoding 2.3.1", -] - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" - -[[package]] -name = "fuchsia-zircon" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" -dependencies = [ - "bitflags 1.3.2", - "fuchsia-zircon-sys", + "percent-encoding", ] -[[package]] -name = "fuchsia-zircon-sys" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" - -[[package]] -name = "futures" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" - [[package]] name = "futures" version = "0.3.30" @@ -1353,16 +1220,6 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-cpupool" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" -dependencies = [ - "futures 0.1.31", - "num_cpus", -] - [[package]] name = "futures-executor" version = "0.3.30" @@ -1401,9 +1258,9 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -1480,23 +1337,23 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.1" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +checksum = "40ecd4077b5ae9fd2e9e169b102c6c330d0605168eb0e8bf79952b256dbefffd" [[package]] name = "git2" -version = "0.16.1" +version = "0.18.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc" +checksum = "232e6a7bfe35766bf715e55a88b39a700596c0ccfd88cd3680b4cdb40d66ef70" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "libc", "libgit2-sys", "log", "openssl-probe", "openssl-sys", - "url 2.5.0", + "url", ] [[package]] @@ -1520,48 +1377,30 @@ dependencies = [ [[package]] name = "globwalk" -version = "0.8.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" +checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.5.0", "ignore", "walkdir", ] -[[package]] -name = "h2" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -dependencies = [ - "byteorder", - "bytes 0.4.12", - "fnv", - "futures 0.1.31", - "http 0.1.21", - "indexmap 1.9.3", - "log", - "slab", - "string", - "tokio-io", -] - [[package]] name = "h2" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" dependencies = [ - "bytes 1.6.0", + "bytes", "fnv", "futures-core", "futures-sink", "futures-util", - "http 0.2.12", + "http", "indexmap 2.2.6", "slab", - "tokio 1.37.0", + "tokio", "tokio-util", "tracing", ] @@ -1639,18 +1478,7 @@ checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" dependencies = [ "libc", "match_cfg", - "winapi 0.3.9", -] - -[[package]] -name = "http" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -dependencies = [ - "bytes 0.4.12", - "fnv", - "itoa 0.4.8", + "winapi", ] [[package]] @@ -1659,21 +1487,9 @@ version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ - "bytes 1.6.0", + "bytes", "fnv", - "itoa 1.0.11", -] - -[[package]] -name = "http-body" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "http 0.1.21", - "tokio-buf", + "itoa", ] [[package]] @@ -1682,11 +1498,17 @@ version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ - "bytes 1.6.0", - "http 0.2.12", + "bytes", + "http", "pin-project-lite", ] +[[package]] +name = "http-range-header" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" + [[package]] name = "httparse" version = "1.8.0" @@ -1717,71 +1539,56 @@ dependencies = [ "quick-error", ] -[[package]] -name = "hyper" -version = "0.12.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "futures-cpupool", - "h2 0.1.26", - "http 0.1.21", - "http-body 0.1.0", - "httparse", - "iovec", - "itoa 0.4.8", - "log", - "net2", - "rustc_version", - "time 0.1.45", - "tokio 0.1.22", - "tokio-buf", - "tokio-executor", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", - "want 0.2.0", -] - [[package]] name = "hyper" version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ - "bytes 1.6.0", + "bytes", "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", + "h2", + "http", + "http-body", "httparse", "httpdate", - "itoa 1.0.11", + "itoa", "pin-project-lite", "socket2 0.5.7", - "tokio 1.37.0", + "tokio", "tower-service", "tracing", - "want 0.3.1", + "want", ] [[package]] -name = "hyper-tls" -version = "0.3.2" +name = "hyper-rustls" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "hyper 0.12.36", - "native-tls", - "tokio-io", + "futures-util", + "http", + "hyper", + "log", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", ] [[package]] @@ -1790,10 +1597,10 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.6.0", - "hyper 0.14.28", + "bytes", + "hyper", "native-tls", - "tokio 1.37.0", + "tokio", "tokio-native-tls", ] @@ -1826,28 +1633,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" -[[package]] -name = "idna" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - [[package]] name = "idna" version = "0.3.0" @@ -1874,7 +1659,7 @@ version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" dependencies = [ - "crossbeam-deque 0.8.5", + "crossbeam-deque", "globset", "log", "memchr", @@ -1890,7 +1675,7 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "autocfg 1.3.0", + "autocfg", "hashbrown 0.12.3", "serde", ] @@ -1931,15 +1716,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "iovec" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" -dependencies = [ - "libc", -] - [[package]] name = "ipnet" version = "2.9.0" @@ -1952,12 +1728,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4" -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "itoa" version = "1.0.11" @@ -2001,22 +1771,12 @@ checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" dependencies = [ "base64 0.21.7", "pem", - "ring", + "ring 0.16.20", "serde", "serde_json", "simple_asn1", ] -[[package]] -name = "kernel32-sys" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "keyring" version = "1.2.1" @@ -2026,7 +1786,7 @@ dependencies = [ "byteorder", "secret-service", "security-framework", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2047,32 +1807,32 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2df7f9fd9f64cf8f59e1a4a0753fe7d575a5b38d3d7ac5758dcee9357d83ef0a" dependencies = [ - "bytes 1.6.0", + "bytes", "nom", ] [[package]] name = "ldap3" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dceb52eac140c8679326f619b963577ccf5a4ab025fe5e6db424d2fd3e4f400" +checksum = "80bf5392a64f3aa00af9866f059c0f77ddea0dcccf244ba93cb8e9c90a9fd3c7" dependencies = [ "async-trait", - "bytes 1.6.0", - "futures 0.3.30", + "bytes", + "futures", "futures-util", "lazy_static", "lber", "log", "native-tls", "nom", - "percent-encoding 2.3.1", + "percent-encoding", "thiserror", - "tokio 1.37.0", + "tokio", "tokio-native-tls", "tokio-stream", "tokio-util", - "url 2.5.0", + "url", ] [[package]] @@ -2095,7 +1855,7 @@ dependencies = [ "once_cell", "quoted_printable", "socket2 0.4.10", - "tokio 1.37.0", + "tokio", ] [[package]] @@ -2106,9 +1866,9 @@ checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] name = "libgit2-sys" -version = "0.14.2+1.5.1" +version = "0.16.2+1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" +checksum = "ee4126d8b4ee5c9d9ea891dd875cfdc1e9d0950437179104b183d7d8a74d24e8" dependencies = [ "cc", "libc", @@ -2136,9 +1896,9 @@ dependencies = [ [[package]] name = "libssh2-sys" -version = "0.2.23" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" +checksum = "2dc8a030b787e2119a731f1951d6a773e2280c660f8ec4b0f5e1505a386e71ee" dependencies = [ "cc", "libc", @@ -2150,9 +1910,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.16" +version = "1.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" +checksum = "c15da26e5af7e25c90b37a2d75cdbf940cf4a55316de9d84c679c9b8bfabf82e" dependencies = [ "cc", "libc", @@ -2187,22 +1947,13 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "lock_api" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" -dependencies = [ - "scopeguard", -] - [[package]] name = "lock_api" version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "autocfg 1.3.0", + "autocfg", "scopeguard", ] @@ -2218,18 +1969,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matches" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" - -[[package]] -name = "maybe-uninit" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" - [[package]] name = "md-5" version = "0.9.1" @@ -2249,20 +1988,20 @@ checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" [[package]] name = "memoffset" -version = "0.5.6" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "autocfg 1.3.0", + "autocfg", ] [[package]] name = "memoffset" -version = "0.6.5" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ - "autocfg 1.3.0", + "autocfg", ] [[package]] @@ -2272,18 +2011,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "mime_guess" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4192263c238a5f0d0c6bfd21f336a313a4ce1c450542449ca191bb657b4642ef" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" @@ -2296,25 +2025,6 @@ dependencies = [ "adler", ] -[[package]] -name = "mio" -version = "0.6.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" -dependencies = [ - "cfg-if 0.1.10", - "fuchsia-zircon", - "fuchsia-zircon-sys", - "iovec", - "kernel32-sys", - "libc", - "log", - "miow", - "net2", - "slab", - "winapi 0.2.8", -] - [[package]] name = "mio" version = "0.8.11" @@ -2326,25 +2036,12 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "miow" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" -dependencies = [ - "kernel32-sys", - "net2", - "winapi 0.2.8", - "ws2_32-sys", -] - [[package]] name = "native-tls" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "lazy_static", "libc", "log", "openssl", @@ -2366,17 +2063,6 @@ dependencies = [ "socket2 0.4.10", ] -[[package]] -name = "net2" -version = "0.2.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" -dependencies = [ - "cfg-if 0.1.10", - "libc", - "winapi 0.3.9", -] - [[package]] name = "nix" version = "0.22.3" @@ -2406,7 +2092,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a9da8c9922c35a1033d76f7272dfc2e7ee20392083d75aeea6ced23c6266578" dependencies = [ - "winapi 0.3.9", + "winapi", ] [[package]] @@ -2443,7 +2129,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" dependencies = [ - "autocfg 1.3.0", + "autocfg", "num-integer", "num-traits", ] @@ -2498,7 +2184,7 @@ version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ - "autocfg 1.3.0", + "autocfg", "num-integer", "num-traits", ] @@ -2509,7 +2195,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" dependencies = [ - "autocfg 1.3.0", + "autocfg", "num-bigint 0.3.3", "num-integer", "num-traits", @@ -2532,7 +2218,7 @@ version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "autocfg 1.3.0", + "autocfg", ] [[package]] @@ -2547,36 +2233,48 @@ dependencies = [ [[package]] name = "object" -version = "0.32.2" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" dependencies = [ "memchr", ] [[package]] name = "octocrab" -version = "0.19.0" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496442a5ec5ad38376a0c49bc0f31ba55dbda5276cf12757498c378c3bc2ea1c" +checksum = "0943920a77d028b66ebe4407813733ad4d0ebe7b12dafd608ddec8478e5fef0b" dependencies = [ "arc-swap", "async-trait", "base64 0.21.7", - "bytes 1.6.0", + "bytes", "cfg-if 1.0.0", "chrono", "either", + "futures", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-rustls", + "hyper-timeout", "jsonwebtoken", "once_cell", - "reqwest 0.11.27", + "percent-encoding", + "pin-project", "secrecy", "serde", "serde_json", "serde_path_to_error", + "serde_urlencoded", "snafu", + "tokio", + "tower", + "tower-http", "tracing", - "url 2.5.0", + "url", ] [[package]] @@ -2643,9 +2341,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -2688,18 +2386,15 @@ dependencies = [ [[package]] name = "origen" -version = "2.0.0-dev.5" +version = "2.0.0-dev7" dependencies = [ "built", "cargo-expand", "cfg-if 1.0.0", "chrono", - "dialoguer", "dirs 2.0.2", "enum-utils", "eval", - "futures 0.3.30", - "git2", "indexmap 1.9.3", "lazy_static", "md-5", @@ -2707,7 +2402,6 @@ dependencies = [ "num 0.3.1", "num-bigint 0.4.5", "num-traits", - "octocrab", "openssl", "origen-core-support", "origen_metal", @@ -2717,7 +2411,6 @@ dependencies = [ "phf 0.8.0", "pyo3", "regex", - "reqwest 0.11.27", "semver 1.0.23", "serde", "serde-pickle", @@ -2729,7 +2422,7 @@ dependencies = [ "tera", "termcolor", "time 0.1.45", - "tokio 1.37.0", + "tokio", "toml", "wait-timeout", "walkdir", @@ -2749,14 +2442,16 @@ name = "origen_metal" version = "0.5.0" dependencies = [ "aes-gcm", - "anyhow", "built", "cfg-if 1.0.0", "chrono", "config", + "dialoguer", "dirs 2.0.2", + "email_address", "enum-display-derive", "enum-utils", + "futures", "git2", "glob", "indexmap 1.9.3", @@ -2769,9 +2464,10 @@ dependencies = [ "octocrab", "pest", "pest_derive", + "pyo3", "rand 0.8.5", "regex", - "reqwest 0.11.27", + "reqwest", "rpassword", "semver 1.0.23", "serde", @@ -2779,53 +2475,35 @@ dependencies = [ "serde_json", "shellexpand", "tempfile", + "tera", "termcolor", "time 0.1.45", "toml", + "toml_edit 0.21.1", "wait-timeout", "whoami 1.5.1", ] [[package]] -name = "parking" -version = "2.2.0" +name = "os_str_bytes" +version = "6.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" +checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" [[package]] -name = "parking_lot" -version = "0.9.0" +name = "parking" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" -dependencies = [ - "lock_api 0.3.4", - "parking_lot_core 0.6.3", - "rustc_version", -] +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api 0.4.12", - "parking_lot_core 0.9.10", -] - -[[package]] -name = "parking_lot_core" -version = "0.6.3" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66b810a62be75176a80873726630147a5ca780cd33921e0b5709033e66b0a" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ - "cfg-if 0.1.10", - "cloudabi", - "libc", - "redox_syscall 0.1.57", - "rustc_version", - "smallvec 0.6.14", - "winapi 0.3.9", + "lock_api", + "parking_lot_core", ] [[package]] @@ -2837,7 +2515,7 @@ dependencies = [ "cfg-if 1.0.0", "libc", "redox_syscall 0.5.1", - "smallvec 1.13.2", + "smallvec", "windows-targets 0.52.5", ] @@ -2883,12 +2561,6 @@ dependencies = [ "base64 0.13.1", ] -[[package]] -name = "percent-encoding" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" - [[package]] name = "percent-encoding" version = "2.3.1" @@ -2924,9 +2596,9 @@ checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" dependencies = [ "pest", "pest_meta", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -2999,7 +2671,7 @@ dependencies = [ "phf_generator 0.8.0", "phf_shared 0.8.0", "proc-macro-hack", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -3022,6 +2694,26 @@ dependencies = [ "siphasher", ] +[[package]] +name = "pin-project" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2 1.0.84", + "quote 1.0.36", + "syn 2.0.66", +] + [[package]] name = "pin-project-lite" version = "0.2.14" @@ -3060,7 +2752,7 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ - "autocfg 1.3.0", + "autocfg", "bitflags 1.3.2", "cfg-if 1.0.0", "concurrent-queue", @@ -3102,7 +2794,7 @@ dependencies = [ "ansi_colours", "ansi_term 0.11.0", "atty", - "clap", + "clap 2.34.0", "console 0.7.7", "content_inspector", "derive_builder", @@ -3130,7 +2822,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.19.15", ] [[package]] @@ -3140,7 +2832,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", "version_check", @@ -3152,7 +2844,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "version_check", ] @@ -3169,38 +2861,29 @@ version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" dependencies = [ - "unicode-xid 0.1.0", + "unicode-xid", ] [[package]] name = "proc-macro2" -version = "1.0.83" +version = "1.0.84" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" +checksum = "ec96c6a92621310b51366f1e28d05ef11489516e93be030060e5fc12024a49d6" dependencies = [ "unicode-ident", ] -[[package]] -name = "publicsuffix" -version = "1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b4ce31ff0a27d93c8de1849cf58162283752f065a90d508f1105fa6c9a213f" -dependencies = [ - "idna 0.2.3", - "url 2.5.0", -] - [[package]] name = "pyo3" -version = "0.16.6" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0220c44442c9b239dd4357aa856ac468a4f5e1f0df19ddb89b2522952eb4c6ca" +checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38" dependencies = [ "cfg-if 1.0.0", "indoc", "libc", - "parking_lot 0.12.2", + "memoffset 0.9.1", + "parking_lot", "pyo3-build-config", "pyo3-ffi", "pyo3-macros", @@ -3209,9 +2892,9 @@ dependencies = [ [[package]] name = "pyo3-build-config" -version = "0.16.6" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c819d397859445928609d0ec5afc2da5204e0d0f73d6bf9e153b04e83c9cdc2" +checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5" dependencies = [ "once_cell", "target-lexicon", @@ -3219,9 +2902,9 @@ dependencies = [ [[package]] name = "pyo3-ffi" -version = "0.16.6" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca882703ab55f54702d7bfe1189b41b0af10272389f04cae38fe4cd56c65f75f" +checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9" dependencies = [ "libc", "pyo3-build-config", @@ -3229,11 +2912,11 @@ dependencies = [ [[package]] name = "pyo3-macros" -version = "0.16.6" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568749402955ad7be7bad9a09b8593851cd36e549ac90bfd44079cea500f3f21" +checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "pyo3-macros-backend", "quote 1.0.36", "syn 1.0.109", @@ -3241,11 +2924,11 @@ dependencies = [ [[package]] name = "pyo3-macros-backend" -version = "0.16.6" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611f64e82d98f447787e82b8e7b0ebc681e1eb78fc1252668b2c605ffb4e1eb8" +checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -3271,7 +2954,7 @@ version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", ] [[package]] @@ -3280,25 +2963,6 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg 0.1.2", - "rand_xorshift", - "winapi 0.3.9", -] - [[package]] name = "rand" version = "0.7.3" @@ -3309,8 +2973,8 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", - "rand_pcg 0.2.1", + "rand_hc", + "rand_pcg", ] [[package]] @@ -3324,16 +2988,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -3354,21 +3008,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_core" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -dependencies = [ - "rand_core 0.4.2", -] - -[[package]] -name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" - [[package]] name = "rand_core" version = "0.5.1" @@ -3387,15 +3026,6 @@ dependencies = [ "getrandom 0.2.15", ] -[[package]] -name = "rand_hc" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "rand_hc" version = "0.2.0" @@ -3405,50 +3035,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_isaac" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_jitter" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] - -[[package]] -name = "rand_os" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", -] - -[[package]] -name = "rand_pcg" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", -] - [[package]] name = "rand_pcg" version = "0.2.1" @@ -3458,24 +3044,6 @@ dependencies = [ "rand_core 0.5.1", ] -[[package]] -name = "rand_xorshift" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rdrand" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -dependencies = [ - "rand_core 0.3.1", -] - [[package]] name = "redox_syscall" version = "0.1.57" @@ -3557,40 +3125,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" -[[package]] -name = "reqwest" -version = "0.9.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" -dependencies = [ - "base64 0.10.1", - "bytes 0.4.12", - "cookie", - "cookie_store", - "encoding_rs", - "flate2", - "futures 0.1.31", - "http 0.1.21", - "hyper 0.12.36", - "hyper-tls 0.3.2", - "log", - "mime", - "mime_guess", - "native-tls", - "serde", - "serde_json", - "serde_urlencoded 0.5.5", - "time 0.1.45", - "tokio 0.1.22", - "tokio-executor", - "tokio-io", - "tokio-threadpool", - "tokio-timer", - "url 1.7.2", - "uuid", - "winreg 0.6.2", -] - [[package]] name = "reqwest" version = "0.11.27" @@ -3598,37 +3132,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "base64 0.21.7", - "bytes 1.6.0", + "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.28", - "hyper-tls 0.5.0", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", "ipnet", "js-sys", "log", "mime", "native-tls", "once_cell", - "percent-encoding 2.3.1", + "percent-encoding", "pin-project-lite", "rustls-pemfile", "serde", "serde_json", - "serde_urlencoded 0.7.1", + "serde_urlencoded", "sync_wrapper", "system-configuration", - "tokio 1.37.0", + "tokio", "tokio-native-tls", "tower-service", - "url 2.5.0", + "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "winreg 0.50.0", + "winreg", ] [[package]] @@ -3649,10 +3183,25 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", - "winapi 0.3.9", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if 1.0.0", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", ] [[package]] @@ -3673,7 +3222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -3685,7 +3234,7 @@ dependencies = [ "base64 0.13.1", "blake2b_simd", "constant_time_eq", - "crossbeam-utils 0.8.20", + "crossbeam-utils", ] [[package]] @@ -3704,15 +3253,6 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver 0.9.0", -] - [[package]] name = "rustix" version = "0.37.27" @@ -3740,6 +3280,30 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.8", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pemfile" version = "1.0.4" @@ -3749,6 +3313,16 @@ dependencies = [ "base64 0.21.7", ] +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + [[package]] name = "ryu" version = "1.0.18" @@ -3791,6 +3365,16 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.8", + "untrusted 0.9.0", +] + [[package]] name = "secrecy" version = "0.8.0" @@ -3869,9 +3453,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094" dependencies = [ "serde_derive", ] @@ -3891,13 +3475,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.202" +version = "1.0.203" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -3906,7 +3490,7 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -3917,7 +3501,7 @@ version = "1.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" dependencies = [ - "itoa 1.0.11", + "itoa", "ryu", "serde", ] @@ -3928,7 +3512,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" dependencies = [ - "itoa 1.0.11", + "itoa", "serde", ] @@ -3938,21 +3522,9 @@ version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", -] - -[[package]] -name = "serde_urlencoded" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" -dependencies = [ - "dtoa", - "itoa 0.4.8", - "serde", - "url 1.7.2", + "syn 2.0.66", ] [[package]] @@ -3962,7 +3534,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.11", + "itoa", "ryu", "serde", ] @@ -4045,7 +3617,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "autocfg 1.3.0", + "autocfg", ] [[package]] @@ -4058,15 +3630,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "smallvec" -version = "0.6.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" -dependencies = [ - "maybe-uninit", -] - [[package]] name = "smallvec" version = "1.13.2" @@ -4091,7 +3654,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -4103,7 +3666,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4123,19 +3686,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] -name = "static_assertions" -version = "1.1.0" +name = "spin" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] -name = "string" -version = "0.2.1" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" -dependencies = [ - "bytes 0.4.12", -] +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "strsim" @@ -4149,13 +3709,19 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + [[package]] name = "structopt" version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c6b5c64445ba8094a6ab0c3cd2ad323e07171012d9c98b0b15651daf1787a10" dependencies = [ - "clap", + "clap 2.34.0", "lazy_static", "structopt-derive", ] @@ -4168,7 +3734,7 @@ checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" dependencies = [ "heck 0.3.3", "proc-macro-error", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -4189,7 +3755,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" dependencies = [ "heck 0.3.3", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] @@ -4208,7 +3774,7 @@ checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" dependencies = [ "proc-macro2 0.4.30", "quote 0.6.13", - "unicode-xid 0.1.0", + "unicode-xid", ] [[package]] @@ -4217,18 +3783,18 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.65" +version = "2.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" +checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "unicode-ident", ] @@ -4248,18 +3814,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2 1.0.83", - "quote 1.0.36", - "syn 1.0.109", - "unicode-xid 0.2.4", -] - [[package]] name = "syntect" version = "3.2.0" @@ -4334,16 +3888,16 @@ dependencies = [ [[package]] name = "tera" -version = "1.19.1" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "970dff17c11e884a4a09bc76e3a17ef71e01bb13447a11e85226e254fe6d10b8" +checksum = "ab9d851b45e865f178319da0abdbfe6acbc4328759ff18dafc3a41c16b4cd2ee" dependencies = [ "chrono", "chrono-tz", "globwalk", "humansize", "lazy_static", - "percent-encoding 2.3.1", + "percent-encoding", "pest", "pest_derive", "rand 0.8.5", @@ -4370,7 +3924,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" dependencies = [ "libc", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4391,6 +3945,12 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "textwrap" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" + [[package]] name = "thiserror" version = "1.0.61" @@ -4406,9 +3966,9 @@ version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4419,7 +3979,7 @@ checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" dependencies = [ "libc", "wasi 0.10.0+wasi-snapshot-preview1", - "winapi 0.3.9", + "winapi", ] [[package]] @@ -4429,7 +3989,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", - "itoa 1.0.11", + "itoa", "num-conv", "powerfmt", "serde", @@ -4468,25 +4028,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" -[[package]] -name = "tokio" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "mio 0.6.23", - "num_cpus", - "tokio-current-thread", - "tokio-executor", - "tokio-io", - "tokio-reactor", - "tokio-tcp", - "tokio-threadpool", - "tokio-timer", -] - [[package]] name = "tokio" version = "1.37.0" @@ -4494,11 +4035,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" dependencies = [ "backtrace", - "bytes 1.6.0", + "bytes", "libc", - "mio 0.8.11", + "mio", "num_cpus", - "parking_lot 0.12.2", + "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2 0.5.7", @@ -4507,45 +4048,13 @@ dependencies = [ ] [[package]] -name = "tokio-buf" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" -dependencies = [ - "bytes 0.4.12", - "either", - "futures 0.1.31", -] - -[[package]] -name = "tokio-current-thread" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" -dependencies = [ - "futures 0.1.31", - "tokio-executor", -] - -[[package]] -name = "tokio-executor" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", -] - -[[package]] -name = "tokio-io" -version = "0.1.13" +name = "tokio-io-timeout" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "log", + "pin-project-lite", + "tokio", ] [[package]] @@ -4554,9 +4063,9 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4566,26 +4075,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", - "tokio 1.37.0", + "tokio", ] [[package]] -name = "tokio-reactor" -version = "0.1.12" +name = "tokio-rustls" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "lazy_static", - "log", - "mio 0.6.23", - "num_cpus", - "parking_lot 0.9.0", - "slab", - "tokio-executor", - "tokio-io", - "tokio-sync", + "rustls", + "tokio", ] [[package]] @@ -4596,60 +4096,7 @@ checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" dependencies = [ "futures-core", "pin-project-lite", - "tokio 1.37.0", -] - -[[package]] -name = "tokio-sync" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" -dependencies = [ - "fnv", - "futures 0.1.31", -] - -[[package]] -name = "tokio-tcp" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" -dependencies = [ - "bytes 0.4.12", - "futures 0.1.31", - "iovec", - "mio 0.6.23", - "tokio-io", - "tokio-reactor", -] - -[[package]] -name = "tokio-threadpool" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" -dependencies = [ - "crossbeam-deque 0.7.4", - "crossbeam-queue", - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "lazy_static", - "log", - "num_cpus", - "slab", - "tokio-executor", -] - -[[package]] -name = "tokio-timer" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" -dependencies = [ - "crossbeam-utils 0.7.2", - "futures 0.1.31", - "slab", - "tokio-executor", + "tokio", ] [[package]] @@ -4658,11 +4105,11 @@ version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" dependencies = [ - "bytes 1.6.0", + "bytes", "futures-core", "futures-sink", "pin-project-lite", - "tokio 1.37.0", + "tokio", ] [[package]] @@ -4691,6 +4138,17 @@ dependencies = [ "winnow", ] +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime", + "winnow", +] + [[package]] name = "toolchain_find" version = "0.1.4" @@ -4704,6 +4162,48 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +dependencies = [ + "bitflags 2.5.0", + "bytes", + "futures-core", + "futures-util", + "http", + "http-body", + "http-range-header", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -4716,6 +4216,7 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4727,9 +4228,9 @@ version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", ] [[package]] @@ -4747,15 +4248,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "try_from" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "283d3b89e1368717881a9d51dad843cc435380d8109c9e47d38780a324698d8b" -dependencies = [ - "cfg-if 0.1.10", -] - [[package]] name = "typenum" version = "1.17.0" @@ -4818,15 +4310,6 @@ dependencies = [ "unic-common", ] -[[package]] -name = "unicase" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-bidi" version = "0.3.15" @@ -4866,12 +4349,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" -[[package]] -name = "unicode-xid" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" - [[package]] name = "unindent" version = "0.1.11" @@ -4895,15 +4372,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] -name = "url" -version = "1.7.2" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd4e7c0d531266369519a4aa4f399d748bd37043b00bde1e4ff1f60a120b355a" -dependencies = [ - "idna 0.1.5", - "matches", - "percent-encoding 1.0.1", -] +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" @@ -4913,19 +4385,10 @@ checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna 0.5.0", - "percent-encoding 2.3.1", + "percent-encoding", "serde", ] -[[package]] -name = "uuid" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90dbc611eb48397705a6b0f6e917da23ae517e4d127123d2cf7674206627d32a" -dependencies = [ - "rand 0.6.5", -] - [[package]] name = "vcpkg" version = "0.2.15" @@ -4969,17 +4432,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "want" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" -dependencies = [ - "futures 0.1.31", - "log", - "try-lock", -] - [[package]] name = "want" version = "0.3.1" @@ -5032,9 +4484,9 @@ dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", "wasm-bindgen-shared", ] @@ -5066,9 +4518,9 @@ version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" dependencies = [ - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", - "syn 2.0.65", + "syn 2.0.66", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5106,12 +4558,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "winapi" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" - [[package]] name = "winapi" version = "0.3.9" @@ -5122,12 +4568,6 @@ dependencies = [ "winapi-x86_64-pc-windows-gnu", ] -[[package]] -name = "winapi-build" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" - [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" @@ -5306,15 +4746,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2986deb581c4fe11b621998a5e53361efe6b48a151178d0cd9eeffa4dc6acc9" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "winreg" version = "0.50.0" @@ -5325,16 +4756,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "ws2_32-sys" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" -dependencies = [ - "winapi 0.2.8", - "winapi-build", -] - [[package]] name = "xattr" version = "1.3.1" @@ -5372,7 +4793,7 @@ dependencies = [ "derivative", "enumflags2", "fastrand 1.9.0", - "futures 0.3.30", + "futures", "nb-connect", "nix", "once_cell", @@ -5391,16 +4812,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa3959a7847cf95e3d51e312856617c5b1b77191176c65a79a5f14d778bbe0a6" dependencies = [ "proc-macro-crate 0.1.5", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] [[package]] name = "zeroize" -version = "1.7.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" [[package]] name = "zvariant" @@ -5423,7 +4844,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.83", + "proc-macro2 1.0.84", "quote 1.0.36", "syn 1.0.109", ] diff --git a/rust/origen/Cargo.toml b/rust/origen/Cargo.toml index 5202620b..59c29778 100644 --- a/rust/origen/Cargo.toml +++ b/rust/origen/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "origen" -version = "2.0.0-dev.5" +version = "2.0.0-dev7" authors = ["Origen-SDK"] license = "MIT" edition = "2021" @@ -39,11 +39,12 @@ num-traits = "0.2.12" serde-pickle = "0.6" enum-utils = "0.1.2" shellexpand = "1.1.1" -git2 = "0.16.0" +# Need to be careful with this version, couldn't build on RHEL6 with versions greater +# than this. Can probably drop this constraint once NXP transitions to RHEL7. num-bigint = {version = "0.4.0", features = ["serde"]} # Enabling this feature stops the CLI from depending on libpython. PYO3 is only included # in origen to enable conversion of an Origen error to a PyErr. -pyo3 = {version = "0.16.5", features = ["extension-module", "auto-initialize"]} +pyo3 = {version = "0.19.1", features = ["extension-module", "auto-initialize"]} chrono = "0.4.11" origen-core-support = { version = "0.1.0-dev.1", path = "./origen-core-support" } whoami = "0.8" # TODO @@ -59,15 +60,11 @@ strum = { version = "0.20", features = ["derive"] } md-5 = "0.9" normpath = "0.2.0" cfg-if = "1" -dialoguer = "0.8.0" wait-timeout = "0.2.0" -octocrab = "^0.19" -futures = {version = "0.3.15", features = ["executor"]} -tokio = {version = "1.7", features = ["full"] } -reqwest = {version = "0.11.3", features = ["blocking", "json"]} +tokio = {version = "1.29", features = ["full"] } [build-dependencies] -built = "0.5.1" +built = "0.5.2" walkdir = "2" # Additional items required to build a full self-contained origen CLI binary for Linux diff --git a/rust/origen/cli/Cargo.toml b/rust/origen/cli/Cargo.toml index c4441c70..55d80c6a 100644 --- a/rust/origen/cli/Cargo.toml +++ b/rust/origen/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "cli" -version = "2.0.0-dev.5" +version = "2.0.0-dev.7" authors = ["Origen-SDK"] edition = "2021" workspace = ".." @@ -12,19 +12,17 @@ path = "src/bin.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = "2.33.0" +clap = {version = "3.2.23", features = ["unstable-replace"]} origen = { path = ".." } origen_metal = { path = "../../origen_metal" } pathdiff = "0.1" online = "0.2" -reqwest = "0.9" time = "0.1.42" semver = "0.9.0" lazy_static = "1.4.0" regex = "1" toml = "0.5" serde = {version = "1.0", features = ["derive"]} -tera = "1" indexmap = {version = "1.3.0", features = ["serde-1"]} flate2 = "1.0" tempfile = "3" @@ -35,4 +33,4 @@ phf = { version = "0.8.0", features = ["macros"] } [build-dependencies] walkdir = "2" -built = "0.5.1" +built = "0.5.2" diff --git a/rust/origen/cli/src/_generated/mod.rs b/rust/origen/cli/src/_generated/mod.rs new file mode 100644 index 00000000..91c47b7b --- /dev/null +++ b/rust/origen/cli/src/_generated/mod.rs @@ -0,0 +1 @@ +pub (crate) mod python; \ No newline at end of file diff --git a/rust/origen/cli/src/_generated/python.rs b/rust/origen/cli/src/_generated/python.rs new file mode 100644 index 00000000..d1edf698 --- /dev/null +++ b/rust/origen/cli/src/_generated/python.rs @@ -0,0 +1,12 @@ +// THIS IS AN AUTO GENERATED FILE FROM CMD update_supported_python +pub const MIN_PYTHON_VERSION: &str = "3.7.0"; +pub const PYTHONS: &[&str] = &[ + "python", + "python3", + "python3.7", + "python3.8", + "python3.9", + "python3.10", + "python3.11", + "python3.12", +]; diff --git a/rust/origen/cli/src/app_commands.rs b/rust/origen/cli/src/app_commands.rs deleted file mode 100644 index 2330e7df..00000000 --- a/rust/origen/cli/src/app_commands.rs +++ /dev/null @@ -1,201 +0,0 @@ -//! This module handles the parsing of commands defined by the current application - -use crate::python; -use crate::CommandHelp; -use clap::ArgMatches; -use std::collections::HashMap; -use std::fs; -use std::path::{Path, PathBuf}; -use std::process::exit; - -#[derive(Default, Clone)] -pub struct AppCommands { - root: PathBuf, - pub command_helps: Vec, - pub commands: Vec, -} - -#[derive(Debug, Deserialize)] -struct CommandsToml { - command: Option>, -} - -#[derive(Debug, Deserialize, Clone)] -pub struct Command { - pub name: String, - pub help: String, - pub alias: Option, - pub arg: Option>, - pub subcommand: Option>, -} - -#[derive(Debug, Deserialize, Clone)] -pub struct Arg { - pub name: String, - pub help: String, - pub short: Option, - pub long: Option, - pub takes_value: Option, - pub multiple: Option, - pub required: Option, - pub value_name: Option, - pub use_delimiter: Option, - pub hidden: Option, - pub switch: Option, - pub upcased_name: Option, -} - -impl AppCommands { - pub fn new(root: &Path) -> AppCommands { - AppCommands { - root: root.to_path_buf(), - command_helps: vec![], - commands: vec![], - } - } - - /// Parse the commands from config/commands.toml if found. - /// Will swallow any errors that occur and print an error message, but allowing the CLI - /// boot to continue. - pub fn parse_commands(&mut self) { - let commands_toml = self.root.join("config").join("commands.toml"); - if commands_toml.exists() { - let content = match fs::read_to_string(&commands_toml) { - Ok(x) => x, - Err(e) => { - log_error!("{}", e); - return; - } - }; - - let command_config: CommandsToml = match toml::from_str(&content) { - Ok(x) => x, - Err(e) => { - log_error!("Malformed config/commands.toml: {}", e); - return; - } - }; - - if let Some(commands) = command_config.command { - for mut command in commands { - self.command_helps.push(CommandHelp { - name: command.name.clone(), - help: command.help.clone(), - shortcut: command.alias.clone(), - }); - build_upcase_names(&mut command); - self.commands.push(command); - } - } - } - } - - pub fn max_name_width(&self) -> Option { - self.command_helps - .iter() - .map(|c| c.name.chars().count()) - .max() - } - - pub fn dispatch(&self, mut matches: &ArgMatches) { - let mut commands: Vec = vec![]; - let mut given_args: HashMap> = HashMap::new(); - let mut name; - let mut command: Option<&Command> = None; - - while matches.subcommand_name().is_some() { - // Don't need to worry about not finding here, clap has already pre-screened the given values - name = matches.subcommand_name().unwrap(); - - if let Some(cmd) = command { - command = cmd - .subcommand - .as_ref() - .unwrap() - .iter() - .find(|c| c.name == name); - } else { - command = self.commands.iter().find(|c| c.name == name); - } - - matches = matches.subcommand_matches(&name).unwrap(); - - if let Some(cmd) = command { - if let Some(args) = &cmd.arg { - for arg in args { - if arg.multiple.is_some() && arg.multiple.unwrap() { - if let Some(v) = matches.values_of(&arg.name) { - let vals: Vec = v.map(|v| v.to_string()).collect(); - given_args.insert(arg.name.to_string(), vals); - } - } else { - if let Some(v) = matches.value_of(&arg.name) { - given_args.insert(arg.name.to_string(), vec![v.to_string()]); - } - } - } - } - } - - commands.push(name.to_string()); - } - - let mut cmd = "from origen.boot import run_cmd; run_cmd('_dispatch_', ".to_string(); - - cmd += &format!( - "commands=[{}]", - &commands - .iter() - .map(|s| format!("r'{}'", s)) - .collect::>() - .join(",") - ); - - cmd += ", args={"; - let mut first = true; - for (k, v) in given_args { - if !first { - cmd += ", "; - } - cmd += &format!( - "r'{}': [{}]", - &k, - v.iter() - .map(|s| format!("r'{}'", s)) - .collect::>() - .join(",") - ); - first = false; - } - cmd += "});"; - - log_debug!("Launching Python: '{}'", &cmd); - - match python::run(&cmd) { - Err(e) => { - log_error!("{}", &e); - exit(1); - } - Ok(exit_status) => { - if exit_status.success() { - exit(0); - } else { - exit(exit_status.code().unwrap_or(1)); - } - } - } - } -} - -fn build_upcase_names(command: &mut Command) { - if let Some(args) = &mut command.arg { - for arg in args { - arg.upcased_name = Some(arg.name.to_uppercase()); - } - } - if let Some(subcommands) = &mut command.subcommand { - for mut subcmd in subcommands { - build_upcase_names(&mut subcmd); - } - } -} diff --git a/rust/origen/cli/src/bin.rs b/rust/origen/cli/src/bin.rs index b805adaa..ac341027 100644 --- a/rust/origen/cli/src/bin.rs +++ b/rust/origen/cli/src/bin.rs @@ -5,40 +5,32 @@ extern crate serde; #[macro_use] extern crate origen_metal; -mod app_commands; +mod framework; mod commands; mod python; +mod _generated; -use app_commands::AppCommands; -use clap::{App, AppSettings, Arg, SubCommand}; +use clap::Command; use indexmap::map::IndexMap; -use origen::{Result, LOGGER, STATUS}; -use origen_metal as om; +use origen::{Result, STATUS}; use std::iter::FromIterator; -use std::path::Path; use std::process::exit; - -static VERBOSITY_HELP_STR: &str = "Terminal verbosity level e.g. -v, -vv, -vvv"; -static VERBOSITY_KEYWORD_HELP_STR: &str = "Keywords for verbose listeners"; - -#[derive(Clone)] -pub struct CommandHelp { - name: String, - help: String, - shortcut: Option, -} - -impl CommandHelp { - fn render(&self, width: usize) -> String { - let mut msg = "".to_string(); - msg += &format!("{:width$} {}", self.name, self.help, width = width + 3); - if let Some(a) = &self.shortcut { - msg += &format!(" [aliases: {}]", a); - } - msg += "\n"; - msg - } -} +use framework::{Extensions, Plugins, AuxCmds, AppCmds, CmdHelps}; +use framework::{ + VERBOSITY_OPT_NAME, VERBOSITY_KEYWORDS_OPT_NAME, VOV_OPT_NAME, + add_verbosity_opts, +}; +use clap::error::ErrorKind as ClapErrorKind; + +use VERBOSITY_OPT_NAME as V_OPT_NAME; +use VERBOSITY_KEYWORDS_OPT_NAME as VKS_OPT_NAME; + +// #[derive(Clone)] +// pub struct CommandHelp { +// name: String, +// help: String, +// shortcut: Option, +// } pub mod built_info { // The file has been placed there by the build script. @@ -47,55 +39,28 @@ pub mod built_info { // This is the entry point for the Origen CLI tool fn main() -> Result<()> { - let verbosity_re = regex::Regex::new(r"-([vV]+)").unwrap(); - - // Intercept the 'origen exec' command immediately to prevent further parsing of it, this - // is so that something like 'origen exec pytest -v' will apply '-v' as an argument to pytest - // and not to origen - let mut args: Vec = std::env::args().collect(); - if args.len() > 1 && args[1] == "exec" { - args = args.drain(2..).collect(); - if args.len() > 0 && (args[0] == "-h" || args[0] == "--help" || args[0] == "help") { - // Just fall through to display the help in this case - } else { - // Apply any leading -vvv to origen, any -v later in the args will be applied to the - // 3rd party command - if args.len() > 0 && verbosity_re.is_match(&args[0]) { - let captures = verbosity_re.captures(&args[0]).unwrap(); - let x = captures.get(1).unwrap().as_str(); - let verbosity = x.chars().count() as u8; - origen::initialize( - Some(verbosity), - vec![], - None, - Some(built_info::PKG_VERSION.to_string()), - ); - args = args.drain(1..).collect(); - } - // Command is not actually available outside an app, so just fall through - // to generate the appropriate error - if STATUS.is_app_present { - if args.len() > 0 { - let cmd = args[0].clone(); - args = args.drain(1..).collect(); - let cmd_args: Vec<&str> = args.iter().map(|s| s.as_str()).collect(); - commands::exec::run(&cmd, cmd_args); - } else { - std::process::exit(0); - } - } - } + // Create a mini-app to handle verbose and verbosity keyword arguments and run any commands that should be run + // earlier in the flow (e.g.: exec). Call this the "pre-phase" app. + // Exits if a pre-phase command was handled, otherwise, set verbosity settings and continue with the main flow + // Note: pre-phase runs before plugins or extensions are available. By definition, commands executing during pre-phase are not extendable. + macro_rules! pre_phase_app { + () => {{ + add_verbosity_opts(Command::new("") + .disable_version_flag(true) + .allow_external_subcommands(true) + .disable_help_flag(true) + .allow_hyphen_values(true), + true + ) + }} } - // Set the verbosity immediately, this is to allow log statements to work in really - // low level stuff, e.g. when building the STATUS - let mut verbosity: u8 = 0; - for arg in std::env::args() { - if let Some(captures) = verbosity_re.captures(&arg) { - let x = captures.get(1).unwrap().as_str(); - verbosity = x.chars().count() as u8; - } - } + let mut pre_phase_app = pre_phase_app!(); + pre_phase_app = commands::exec::add_prephase_cmds(pre_phase_app); + + let mut print_help = false; + let mut verbosity; + let mut vks; let exe = match std::env::current_exe() { Ok(p) => Some(format!("{}", p.display())), Err(e) => { @@ -103,1440 +68,1290 @@ fn main() -> Result<()> { None } }; - origen::initialize( - Some(verbosity), - vec![], - exe, - Some(built_info::PKG_VERSION.to_string()), - ); + macro_rules! origen_init { + () => {{ + origen::initialize( + Some(verbosity), + vks, + exe, + Some(built_info::PKG_VERSION.to_string()), + None, + None, + ) + }} + } + + match pre_phase_app.try_get_matches() { + Ok(m) => { + verbosity = *m.get_one::(V_OPT_NAME).unwrap_or(&0); + verbosity += m.get_one::(VOV_OPT_NAME).unwrap_or(&0); + vks = match m.get_many::(VKS_OPT_NAME) { + Some(vks) => vks.map( |vk| vk.to_owned()).collect::>(), + None => vec!() + }; + + macro_rules! run_pre_phase_cmd { + ($cmd_mod:ident, $subc:expr) => {{ + origen_init!(); + exit(commands::$cmd_mod::run_pre_phase(&$subc)?); + }} + } + + match m.subcommand() { + Some((commands::exec::BASE_CMD, subc)) => { + run_pre_phase_cmd!(exec, subc); + }, + // "External subcommand" received, which in this case is either a non-pre-prephase or invalid command. + // Either way, let the main flow handle it. + Some((_ext, ext_args)) => { + // Args under "" are external subcommand args + match ext_args.get_many::("") { + Some(args) => { + // Need to repeatedly parse the args to overcome handling of corner cases. + // Use a dummy app that just accepts verbosity and keywords. Parse this until empty. + let mut dummy = pre_phase_app!().no_binary_name(true); + let mut reduced = args.map(|a| a.to_owned()).collect::>(); + loop { + match dummy.try_get_matches_from_mut(reduced.clone()) { + Ok(dm) => { + verbosity += dm.get_one::(V_OPT_NAME).unwrap_or(&0); + verbosity += dm.get_one::(VOV_OPT_NAME).unwrap_or(&0); + match dm.get_many::(VKS_OPT_NAME) { + Some(vkws) => vks.append(&mut vkws.map( |vk| vk.to_owned()).collect::>()), + None => {} + }; + + match dm.subcommand() { + Some((_ext, dm_args)) => { + match dm_args.get_many::("") { + Some(dm_args) => { + reduced = dm_args.map(|a| a.to_owned()).collect::>(); + } + None => { + break + } + } + }, + None => { + break + }, + } + }, + Err(e) => { + e.exit(); + }, + } + } + }, + None => {} + } + }, + _ => { + // No subcommand, or options only. Set the verbosity based on previous handling of options. + // The only options here will be verbosity and vks. Knock one of the -v flags off and set + // verbosity according to that. The version printout will be handled later on. + verbosity = *m.get_one::(V_OPT_NAME).unwrap_or(&0); + verbosity += m.get_one::(VOV_OPT_NAME).unwrap(); + + // version_or_verbosity will default to 0, even if not present on the invocation + match m.value_source(VOV_OPT_NAME) { + Some(clap::parser::ValueSource::DefaultValue) => { + // This would actually fal into a 'origen -v' invocation, but actually want to display help here + // E.g.: origen --verbose --vk blah + // should display help, not version + print_help = true; + }, + _ => { + // All other cases, it was given, so knock off a -v flag off + // origen -vvv => origen (version) -vv + verbosity -= 1; + } + } + } + } + origen_init!(); + }, + Err(_e) => { + // Any mis-use of pre-phase commands or unknown args/subcommands will be handled by the full app. + // Fallback to manually discerning the verbosity/keywords for the main phase + let mut dummy = pre_phase_app!().no_binary_name(true); + let mut reduced: Vec = std::env::args().skip(1).collect(); + verbosity = 0; + vks = vec!(); + loop { + match dummy.try_get_matches_from_mut(reduced.clone()) { + Ok(dm) => { + verbosity += dm.get_one::(V_OPT_NAME).unwrap_or(&0); + verbosity += dm.get_one::(VOV_OPT_NAME).unwrap_or(&0); + match dm.get_many::(VKS_OPT_NAME) { + Some(vkws) => vks.append(&mut vkws.map( |vk| vk.to_owned()).collect::>()), + None => {} + }; + + match dm.subcommand() { + Some((_ext, dm_args)) => { + match dm_args.get_many::("") { + Some(dm_args) => { + reduced = dm_args.map(|a| a.to_owned()).collect::>(); + } + None => { + break + } + } + }, + None => { + break + }, + } + }, + Err(e) => { + e.exit(); + }, + } + } + origen_init!(); + } + } let version = match STATUS.is_app_present { true => format!("Origen CLI: {}", STATUS.origen_version.to_string()), false => format!("Origen: {}", STATUS.origen_version.to_string()), }; - if STATUS.app.is_some() { - origen::core::application::config::Config::check_defaults( - &STATUS.app.as_ref().unwrap().root, - ); - } - - let mut app = App::new("") - .setting(AppSettings::ArgRequiredElseHelp) - .setting(AppSettings::VersionlessSubcommands) - .setting(AppSettings::DisableVersion) - .before_help("Origen, The Semiconductor Developer's Kit") - .after_help("See 'origen -h' for more information on a specific command.") - .version(&*version) - .arg( - Arg::with_name("verbose") - .short("v") - .multiple(true) - .global(true) - .help(VERBOSITY_HELP_STR), - ) - .arg( - Arg::with_name("verbosity_keywords") - .short("k") - .multiple(true) - .takes_value(true) - .global(true) - .help(VERBOSITY_KEYWORD_HELP_STR), - ); // The main help message is going to be automatically generated to allow us to handle and clearly // separate commands added by the app and plugins. // When a command is added below it must also be added to these vectors. - let mut origen_commands: Vec = vec![]; - let mut app_commands: Vec = vec![]; + // let mut origen_commands: Vec = vec![]; + let mut helps = CmdHelps::new(); + let app_cmds: Option; + let mut extensions = Extensions::new(); + let plugins = match Plugins::new(&mut extensions) { + Ok(pl) => pl, + Err(e) => { + if python::is_backend_origen_mod_missing_err(&e) { + // _origen is available but plugins failed to load + log_error!("Failed to collect plugins. Encountered error: {}", e); + None + } else { + // _origen isn't available. This could be an error is retrieving plugins. + // Print a warning instead of error, while logging the error + log_trace!("Failed to collect plugins. Encountered error: {}", e); + log_warning!("Failed to collect plugins: _origen module missing"); + None + } + } + }; + let aux_cmds = AuxCmds::new(&mut extensions)?; + + if let Some(app) = &STATUS.app.as_ref() { + app_cmds = Some(AppCmds::new(app, &mut extensions)?); + } else { + app_cmds = None; + } + + // Structures to hold command aliases and replacements + // Clap does not want to own the values and, in the case of replacements + // cannot be checked (easily) due to borrowing from one command to update another + // Easier to just store things here and have clap reference them. + let mut top_app_replacements: Vec<[&str; 3]> = vec![]; + let mut top_app_cmd_aliases: IndexMap> = IndexMap::new(); + let mut top_pl_replacements: Vec<[&str; 3]> = vec![]; + let mut top_pl_cmd_aliases: IndexMap>> = IndexMap::new(); + let mut top_aux_replacements: Vec<[&str; 3]> = vec![]; + let mut top_aux_cmd_aliases: IndexMap>> = IndexMap::new(); + let mut after_help_str = "".to_string(); + + let mut app = Command::new("") + .arg_required_else_help(true) + .disable_version_flag(true) + .before_help("Origen, The Semiconductor Developer's Kit") + .version(&*version); + app = add_verbosity_opts(app, false); /************************************************************************************/ /******************** Global only commands ******************************************/ /************************************************************************************/ - if !STATUS.is_app_present { + // if !STATUS.is_app_present { //************************************************************************************/ - let proj_help = "Manage multi-repository project areas and workspaces"; - origen_commands.push(CommandHelp { - name: "proj".to_string(), - help: proj_help.to_string(), - shortcut: None, - }); - - app = app - .subcommand( - SubCommand::with_name("proj") - .display_order(1) - .about(proj_help) - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand(SubCommand::with_name("init") - .display_order(5) - .about("Initialize a new project directory (create an initial project BOM)") - .arg(Arg::with_name("dir") - .takes_value(true) - .help("The path to the project directory to initialize (PWD will be used by default if not given)") - .value_name("DIR") - ) - ) - .subcommand(SubCommand::with_name("packages") - .display_order(7) - .about("Displays the IDs of all packages and package groups defined by the BOM") - ) - .subcommand(SubCommand::with_name("create") - .display_order(10) - .about("Create a new project workspace from the project BOM") - .arg(Arg::with_name("path") - .help("The path to the new workspace directory") - .takes_value(true) - .value_name("PATH") - .required(true) - ) - ) - .subcommand(SubCommand::with_name("update") - .display_order(15) - .about("Update an existing project workspace per its current BOM") - .arg(Arg::with_name("force") - .short("f") - .long("force") - .required(false) - .takes_value(false) - .help("Force the update and potentially lose any local modifications") - ) - .arg(Arg::with_name("links") - .short("l") - .long("links") - .required(false) - .takes_value(false) - .help("Update the workspace links") - ) - .arg(Arg::with_name("packages") - .value_name("PACKAGES") - .takes_value(true) - .multiple(true) - .help("Packages and/or groups to be updated, run 'origen proj packages' to see a list of possible package IDs") - .required_unless("links") - .required(true) - ) - ) - .subcommand(SubCommand::with_name("mods") - .display_order(20) - .about("Display a list of modified files within the given package(s)") - .arg(Arg::with_name("packages") - .help("Package(s) to look for modifications in, use 'all' to see the modification to all packages") - .multiple(true) - .value_name("PACKAGES") - .required(true) - ) - ) - .subcommand(SubCommand::with_name("clean") - .display_order(20) - .about("Revert all local modifications within the given package(s)") - .arg(Arg::with_name("packages") - .help("Package(s) to revert local modifications in, use 'all' to clean all packages") - .multiple(true) - .value_name("PACKAGES") - .required(true) - ) - ) - .subcommand(SubCommand::with_name("tag") - .display_order(20) - .about("Apply the given tag to the current view of the given package(s)") - .arg(Arg::with_name("name") - .help("Name of the tag to be applied") - .takes_value(true) - .value_name("NAME") - .required(true) - ) - .arg(Arg::with_name("packages") - .help("Package(s) to be tagged, use 'all' to tag all packages") - .multiple(true) - .takes_value(true) - .value_name("PACKAGES") - .required(true) - ) - .arg(Arg::with_name("force") - .short("f") - .long("force") - .required(false) - .takes_value(false) - .help("Force the application of the tag even if there are local modifications") - ) - .arg(Arg::with_name("message") - .short("m") - .long("message") - .required(false) - .takes_value(true) - .help("A message to be applied with the tag") - ) - ) - .subcommand(SubCommand::with_name("bom") - .display_order(25) - .about("View the active BOM in the current or given directory") - .arg(Arg::with_name("dir") - .takes_value(true) - .help("The path to a directory (PWD will be used by default if not given)") - .value_name("DIR") - ) - ) - ); + // let proj_help = "Manage multi-repository project areas and workspaces"; + // origen_commands.push(CommandHelp { + // name: "proj".to_string(), + // help: proj_help.to_string(), + // shortcut: None, + // }); + + // app = app + // .subcommand( + // Command::new("proj") + // .display_order(1) + // .about(proj_help) + // .arg_required_else_help(true) + // .subcommand(Command::new("init") + // .display_order(5) + // .about("Initialize a new project directory (create an initial project BOM)") + // .arg(Arg::new("dir") + // .action(SetArg) + // .help("The path to the project directory to initialize (PWD will be used by default if not given)") + // .value_name("DIR") + // ) + // ) + // .subcommand(Command::new("packages") + // .display_order(7) + // .about("Displays the IDs of all packages and package groups defined by the BOM") + // ) + // .subcommand(Command::new("create") + // .display_order(10) + // .about("Create a new project workspace from the project BOM") + // .arg(Arg::new("path") + // .help("The path to the new workspace directory") + // .action(SetArg) + // .value_name("PATH") + // .required(true) + // ) + // ) + // .subcommand(Command::new("update") + // .display_order(15) + // .about("Update an existing project workspace per its current BOM") + // .arg(Arg::new("force") + // .short('f') + // .long("force") + // .required(false) + // .action(SetArgTrue) + // .help("Force the update and potentially lose any local modifications") + // ) + // .arg(Arg::new("links") + // .short('l') + // .long("links") + // .required(false) + // .action(SetArgTrue) + // .help("Update the workspace links") + // ) + // .arg(Arg::new("packages") + // .value_name("PACKAGES") + // .action(AppendArgs) + // .multiple(true) + // .help("Packages and/or groups to be updated, run 'origen proj packages' to see a list of possible package IDs") + // .required_unless("links") + // .required(true) + // ) + // ) + // .subcommand(Command::new("mods") + // .display_order(20) + // .about("Display a list of modified files within the given package(s)") + // .arg(Arg::new("packages") + // .help("Package(s) to look for modifications in, use 'all' to see the modification to all packages") + // .action(AppendArgs) + // .multiple(true) + // .value_name("PACKAGES") + // .required(true) + // ) + // ) + // .subcommand(Command::new("clean") + // .display_order(20) + // .about("Revert all local modifications within the given package(s)") + // .arg(Arg::new("packages") + // .help("Package(s) to revert local modifications in, use 'all' to clean all packages") + // .action(AppendArgs) + // .multiple(true) + // .value_name("PACKAGES") + // .required(true) + // ) + // ) + // .subcommand(Command::new("tag") + // .display_order(20) + // .about("Apply the given tag to the current view of the given package(s)") + // .arg(Arg::new("name") + // .help("Name of the tag to be applied") + // .action(SetArg) + // .value_name("NAME") + // .required(true) + // ) + // .arg(Arg::new("packages") + // .help("Package(s) to be tagged, use 'all' to tag all packages") + // .multiple(true) + // .action(AppendArgs) + // .value_name("PACKAGES") + // .required(true) + // ) + // .arg(Arg::new("force") + // .short('f') + // .long("force") + // .required(false) + // .action(SetArgTrue) + // .help("Force the application of the tag even if there are local modifications") + // ) + // .arg(Arg::new("message") + // .short('m') + // .long("message") + // .required(false) + // .action(SetArg) + // .help("A message to be applied with the tag") + // ) + // ) + // .subcommand(Command::new("bom") + // .display_order(25) + // .about("View the active BOM in the current or given directory") + // .arg(Arg::new("dir") + // .action(SetArg) + // .help("The path to a directory (PWD will be used by default if not given)") + // .value_name("DIR") + // ) + // ) + // ); + + // //************************************************************************************/ + // let new_help = "Create a new Origen application"; + // origen_commands.push(CommandHelp { + // name: "new".to_string(), + // help: new_help.to_string(), + // shortcut: None, + // }); + // app = app.subcommand( + // Command::new("new").about(new_help).arg( + // Arg::new("name") + // .help("The lowercased and underscored name of the new application") + // .action(SetArg) + // .required(true) + // .number_of_values(1) + // .value_name("NAME"), + // ) + // .arg(Arg::new("setup") + // .help("Don't create the new app's virtual environment after building (need to manually run 'origen env setup' within the new app workspace before using it in that case)") + // .long("no-setup") + // .required(false) + // .action(SetArgTrue) + // ), + // ); + // } + + commands::plugin::add_helps(&mut helps, plugins.as_ref()); + commands::plugins::add_helps(&mut helps); + commands::aux_cmds::add_helps(&mut helps, &aux_cmds); + commands::eval::add_helps(&mut helps); + commands::exec::add_helps(&mut helps); + commands::credentials::add_helps(&mut helps); + commands::interactive::add_helps(&mut helps); - //************************************************************************************/ - let new_help = "Create a new Origen application"; - origen_commands.push(CommandHelp { - name: "new".to_string(), - help: new_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("new").about(new_help).arg( - Arg::with_name("name") - .help("The lowercased and underscored name of the new application") - .takes_value(true) - .required(true) - .number_of_values(1) - .value_name("NAME"), - ) - .arg(Arg::with_name("setup") - .help("Don't create the new app's virtual environment after building (need to manually run 'origen env setup' within the new app workspace before using it in that case)") - .long("no-setup") - .required(false) - .takes_value(false) - ), - ); + if STATUS.is_app_present { + commands::app::add_helps(&mut helps, app_cmds.as_ref().unwrap()); + commands::env::add_helps(&mut helps); + commands::generate::add_helps(&mut helps); + commands::target::add_helps(&mut helps); + } else { + commands::new::add_helps(&mut helps); + } + + if STATUS.is_origen_present { + commands::develop_origen::add_helps(&mut helps); } + helps.apply_exts(&extensions); + /************************************************************************************/ /******************** Global and app commands ***************************************/ /************************************************************************************/ + // app = mailer::add_commands(app, &mut origen_commands)?; + app = commands::credentials::add_commands(app, &helps, &extensions)?; + app = commands::eval::add_commands(app, &helps, &extensions)?; + app = commands::exec::add_commands(app, &helps, &extensions)?; + app = commands::interactive::add_commands(app, &helps, &extensions)?; + app = commands::plugin::add_commands(app, &helps, plugins.as_ref(), &extensions)?; + app = commands::plugins::add_commands(app, &helps, &extensions)?; + app = commands::aux_cmds::add_commands(app, &helps, &aux_cmds, &extensions)?; + /************************************************************************************/ /******************** Origen dev commands *******************************************/ /************************************************************************************/ - if STATUS.is_origen_present || STATUS.is_app_present { - let fmt_help = match STATUS.is_origen_present { - true => "Nicely format all Rust and Python files", - false => "Nicely format all of your application's Python files", - }; - - origen_commands.push(CommandHelp { - name: "fmt".to_string(), - help: fmt_help.to_string(), - shortcut: None, - }); - - app = app - //************************************************************************************/ - .subcommand(SubCommand::with_name("fmt").about(fmt_help)); - } - - if STATUS.is_origen_present || STATUS.is_app_in_origen_dev_mode { - let (app_, help) = commands::build::define(app); - app = app_; - origen_commands.push(help); + if STATUS.is_origen_present { + app = commands::develop_origen::add_commands(app, &helps, &extensions)?; } /************************************************************************************/ /******************** In application commands ***************************************/ /************************************************************************************/ if STATUS.is_app_present { - /************************************************************************************/ - let i_help = "Start an Origen console to interact with the DUT"; - origen_commands.push(CommandHelp { - name: "interactive".to_string(), - help: i_help.to_string(), - shortcut: Some("i".to_string()), - }); - app = app.subcommand( - SubCommand::with_name("interactive") - .about(i_help) - .visible_alias("i") - .arg( - Arg::with_name("target") - .short("t") - .long("target") - .help("Override the default target currently set by the workspace") - .takes_value(true) - .use_delimiter(true) - .multiple(true) - .number_of_values(1) - .value_name("TARGET"), - ) - .arg( - Arg::with_name("mode") - .short("m") - .long("mode") - .help("Override the default execution mode currently set by the workspace") - .takes_value(true) - .value_name("MODE"), - ), - ); - - /************************************************************************************/ - let new_help = "Generate a new block, flow, pattern, etc. for your application"; - origen_commands.push(CommandHelp { - name: "new".to_string(), - help: new_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("new") - .about(new_help) - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand(SubCommand::with_name("dut") - .display_order(5) - .about("Create a new top-level (DUT) block, see 'origen new dut -h' for more info") - .long_about( -"This generator creates a top-level (DUT) block and all of the associated resources for it, e.g. a -reg file, controller, target, timesets, pins, etc. - -The NAME of the DUT should be given in lower case, optionally prefixed by parent DUT name(s) separated -by a forward slash. - -Any parent DUT(s) will be created if they don't exist, but they will not be modified if they do. - -Examples: - origen new dut # Creates /blocks/dut/... - origen new dut falcon # Creates /blocks/dut/derivatives/falcon/... - origen new dut dsp/falcon # Creates /blocks/dut/derivatives/dsp/derivatives/falcon/...") - .arg(Arg::with_name("name") - .takes_value(true) - .required(false) - .help("The name of the new DUT") - .value_name("NAME") - ) - ) - .subcommand(SubCommand::with_name("block") - .display_order(5) - .about("Create a new block, see 'origen new block -h' for more info") - .long_about( -"This generator creates a block (e.g. to represent RAM, ATD, Flash, DAC, etc.) and all of the associated -resources for it, e.g. a reg file, controller, timesets, etc. - -The NAME should be given in lower case (e.g. flash/flash2kb, adc/adc16), optionally with -additional parent sub-block names after the initial type. - -Alternatively, a reference to an existing BLOCK can be added, in which case a nested block will be created -within that block's 'blocks/' directory, rather than a primary top-level block. - -Any parent block(s) will be created if they don't exist, but they will not be modified if they do. - -Examples: - origen new block dac # Creates /blocks/dac/... - origen new block adc/adc8bit # Creates /blocks/adc/derivatives/adc8bit/... - origen new block adc/adc16bit # Creates /blocks/adc/derivatives/adc16bit/... - origen new block nvm/flash/flash2kb # Creates /blocks/nvm/derivatives/flash/derivatives/flash2kb/... - - # Example of creating a nested sub-block - origen new block bist --parent nvm/flash # Creates /blocks/nvm/derivatives/flash/blocks/bist/...") - .arg(Arg::with_name("name") - .takes_value(true) - .required(true) - .help("The name of the new block, including its parents if applicable") - .value_name("NAME") - ) - .arg( - Arg::with_name("parent") - .short("p") - .long("parent") - .help("Create the new block nested within this existing block") - .takes_value(true) - .required(false) - .value_name("PARENT") - ) - ) - ); - - /************************************************************************************/ - let g_help = "Generate patterns or test programs"; - origen_commands.push(CommandHelp { - name: "generate".to_string(), - help: g_help.to_string(), - shortcut: Some("g".to_string()), - }); - app = app.subcommand( - SubCommand::with_name("generate") - .about(g_help) - .visible_alias("g") - .arg( - Arg::with_name("files") - .help("The name of the file(s) to be generated") - .takes_value(true) - .value_name("FILES") - .multiple(true) - .required(true), - ) - .arg( - Arg::with_name("target") - .short("t") - .long("target") - .help("Override the default target currently set by the workspace") - .takes_value(true) - .use_delimiter(true) - .multiple(true) - .number_of_values(1) - .value_name("TARGET"), - ) - .arg( - Arg::with_name("mode") - .short("m") - .long("mode") - .help("Override the default execution mode currently set by the workspace") - .takes_value(true) - .value_name("MODE"), - ) - .arg( - Arg::with_name("output_dir") - .short("o") - .long("output-dir") - .help("Override the default output directory (/output)") - .takes_value(true) - .value_name("OUTPUT_DIR"), - ) - .arg( - Arg::with_name("reference_dir") - .short("r") - .long("reference-dir") - .help("Override the default reference directory (/.ref)") - .takes_value(true) - .value_name("REFERENCE_DIR"), - ) - .arg( - Arg::with_name("debug") - .long("debug") - .short("d") - .help("Enable Python caller tracking for debug (takes longer to execute)") - .takes_value(false), - ), - ); - - /************************************************************************************/ - let c_help = "Compile templates"; - origen_commands.push(CommandHelp { - name: "compile".to_string(), - help: c_help.to_string(), - shortcut: Some("c".to_string()), - }); - app = app.subcommand( - SubCommand::with_name("compile") - .about(c_help) - .visible_alias("c") - .arg( - Arg::with_name("files") - .help("The name of the file(s) to be generated") - .takes_value(true) - .value_name("FILES") - .multiple(true) - .required(true), - ) - .arg( - Arg::with_name("target") - .short("t") - .long("target") - .help("Override the default target currently set by the workspace") - .takes_value(true) - .use_delimiter(true) - .multiple(true) - .number_of_values(1) - .value_name("TARGET"), - ) - .arg( - Arg::with_name("mode") - .short("m") - .long("mode") - .help("Override the default execution mode currently set by the workspace") - .takes_value(true) - .value_name("MODE"), - ), - ); - - /************************************************************************************/ - let t_help = "Set/view the default target"; - origen_commands.push(CommandHelp { - name: "target".to_string(), - help: t_help.to_string(), - shortcut: Some("t".to_string()), - }); - app = app.subcommand( - SubCommand::with_name("target") - .about(t_help) - .visible_alias("t") - .arg( - Arg::with_name("full-paths") - .long("full-paths") - .short("f") - .help("Display targets' full paths") - .takes_value(false), - ) - .subcommand( - SubCommand::with_name("add") - .about("Activates the given target(s)") - .visible_alias("a") - .arg( - Arg::with_name("targets") - .help("Targets to be activated") - .takes_value(true) - .value_name("TARGETS") - .multiple(true) - .required(true), - ) - .arg( - Arg::with_name("full-paths") - .long("full-paths") - .short("f") - .help("Display targets' full paths") - .takes_value(false), - ), - ) - .subcommand( - SubCommand::with_name("remove") - .about("Deactivates the given target(s)") - .visible_alias("r") - .arg( - Arg::with_name("targets") - .help("Targets to be deactivated") - .takes_value(true) - .value_name("TARGETS") - .multiple(true) - .required(true), - ) - .arg( - Arg::with_name("full-paths") - .long("full-paths") - .short("f") - .help("Display targets' full paths") - .takes_value(false), - ), - ) - .subcommand( - SubCommand::with_name("set") - .about("Activates the given target(s) while deactivating all others") - .visible_alias("s") - .arg( - Arg::with_name("targets") - .help("Targets to be set") - .takes_value(true) - .value_name("TARGETS") - .multiple(true) - .required(true), - ) - .arg( - Arg::with_name("full-paths") - .long("full-paths") - .short("f") - .help("Display targets' full paths") - .takes_value(false), - ), - ) - .subcommand( - SubCommand::with_name("default") - .about("Activates the default target(s) while deactivating all others") - .visible_alias("d") - .arg( - Arg::with_name("full-paths") - .long("full-paths") - .short("f") - .help("Display targets' full paths") - .takes_value(false), - ), - ) - .subcommand( - SubCommand::with_name("view") - .about("Views the currently activated target(s)") - .visible_alias("v") - .arg( - Arg::with_name("full-paths") - .long("full-paths") - .short("f") - .help("Display targets' full paths") - .takes_value(false), - ), - ), - ); - - /************************************************************************************/ - let t_help = "Create, Build, and View Web Documentation"; - origen_commands.push(CommandHelp { - name: "web".to_string(), - help: t_help.to_string(), - shortcut: Some("w".to_string()), - }); - app = app.subcommand( - SubCommand::with_name("web") - .about(t_help) - .setting(AppSettings::ArgRequiredElseHelp) - .visible_alias("w") - .subcommand( - SubCommand::with_name("build") // What I think this command should be called - .about("Builds the web documentation") - .visible_alias("b") - .visible_alias("compile") // If coming from O1 - .visible_alias("html") // If coming from Sphinx and using quickstart's Makefile - .arg( - Arg::with_name("view") - .long("view") - .help("Launch your web browser after the build") - .takes_value(false), - ) - .arg( - Arg::with_name("clean") - .long("clean") - .help( - "Clean up directories from previous builds and force a rebuild", - ) - .takes_value(false), - ) - .arg( - Arg::with_name("release") - .long("release") - .short("r") - .help("Release (deploy) the resulting web pages") - .takes_value(false), - ) - .arg( - Arg::with_name("archive") - .long("archive") - .short("a") - .help("Archive the resulting web pages after building") - .takes_value(true) - .multiple(false) - .min_values(0), - ) - .arg( - Arg::with_name("as-release") - .long("as-release") - .help("Build webpages with release checks") - .takes_value(false), - ) - .arg( - Arg::with_name("release-with-warnings") - .long("release-with-warnings") - .help("Release webpages even if warnings persists") - .takes_value(false), - ) - .arg( - Arg::with_name("no-api") - .long("no-api") - .help("Skip building the API") - .takes_value(false), - ) - .arg( - Arg::with_name("sphinx-args") - .long("sphinx-args") - .help( - "Additional arguments to pass to the 'sphinx-build' command - Argument will passed as a single string and appended to the build command - E.g.: 'origen web build --sphinx-args \"-q -D my_config_define=1\"' - -> 'sphinx-build -q -D my_config_define=1'", - ) - .takes_value(true) - .multiple(false) - .allow_hyphen_values(true), - ), // .arg(Arg::with_name("pdf") - // .long("pdf") - // .help("Create a PDF of resulting web pages") - // .takes_value(false) - // ) - ) - .subcommand( - SubCommand::with_name("view") - .about("Launches your web browser to view previously built documentation") - .visible_alias("v"), - ) - .subcommand( - SubCommand::with_name("clean") - .about("Cleans the output directory and all cached files"), - ), - ); - - /************************************************************************************/ - let mailer_help = - "Command-line-interface to Origen's mailer for quick emailing or shell-scripting"; - origen_commands.push(CommandHelp { - name: "mailer".to_string(), - help: mailer_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("mailer") - .about(mailer_help) - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand( - SubCommand::with_name("send") - .about("Quickly send an email") - .arg( - Arg::with_name("body") - .help("Email message body") - .long("body") - .takes_value(true) - .required(true) - .value_name("BODY") - .index(1), - ) - .arg( - Arg::with_name("subject") - .help("Email subject line") - .long("subject") - .short("s") - .takes_value(true) - .value_name("SUBJECT"), - ) - .arg( - Arg::with_name("to") - .help("Recipient list") - .long("to") - .short("t") - .takes_value(true) - .required(true) - .multiple(true) - .value_name("TO"), - ), - ) - .subcommand( - SubCommand::with_name("test") - .about("Send a test email") - .arg( - Arg::with_name("to") - .help( - "Recipient list. If omitted, will be sent to the current user", - ) - .long("to") - .short("t") - .takes_value(true) - .required(false) - .multiple(true) - .value_name("TO"), - ), - ), - ); - - /************************************************************************************/ - let credentials_help = "Set or clear user credentials"; - origen_commands.push(CommandHelp { - name: "credentials".to_string(), - help: credentials_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("credentials") - .about(credentials_help) - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand( - SubCommand::with_name("set") - .about("Set the current user's password") - .arg( - Arg::with_name("all") - .help("Set the password for all datasets") - .takes_value(false) - .required(false) - .long("all") - .short("a"), - ) - .arg( - Arg::with_name("dataset") - .help("Specify the dataset to set the password for") - .takes_value(true) - .required(false) - .value_name("DATASET") - .multiple(true) - .conflicts_with("all") - .long("dataset") - .short("d"), - ), - ) - .subcommand( - SubCommand::with_name("clear") - .about("Clear the user's password") - .arg( - Arg::with_name("all") - .help("Clear the password for all datasets") - .takes_value(false) - .required(false) - .conflicts_with("dataset") - .long("all") - .short("a"), - ) - .arg( - Arg::with_name("dataset") - .help("Specify the dataset to clear the password for") - .takes_value(true) - .required(false) - .value_name("DATASET") - .multiple(true) - .long("dataset") - .short("d"), - ), - ), - ); - - /************************************************************************************/ - let mode_help = "Set/view the default execution mode"; - origen_commands.push(CommandHelp { - name: "mode".to_string(), - help: mode_help.to_string(), - shortcut: Some("m".to_string()), - }); - app = app.subcommand( - SubCommand::with_name("mode") - .about(mode_help) - .visible_alias("m") - .arg( - Arg::with_name("mode") - .help("The name of the mode to be set as the default mode") - .takes_value(true) - .value_name("MODE"), - ), - ); - - /************************************************************************************/ - let app_help = "Commands for packaging and releasing your application"; - origen_commands.push(CommandHelp { - name: "app".to_string(), - help: app_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("app") - .about(app_help) - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand( - SubCommand::with_name("init") - .about("Initialize the application's revision control") - ) - .subcommand( - SubCommand::with_name("status") - .about("Show any local changes") - .arg(Arg::with_name("modified") - .long("modified") - .takes_value(false) - .help("Show tracked, modified files") - ) - .arg(Arg::with_name("untracked") - .long("untracked") - .takes_value(false) - .help("Show untracked files") - ) - ) - .subcommand( - SubCommand::with_name("checkin") - .about("Check in the given pathspecs") - .arg(Arg::with_name("pathspecs") - .help("The paths to be checked in") - .takes_value(true) - .value_name("PATHSPECS") - .multiple(true) - ) - .arg(Arg::with_name("all") - .long("all") - .short("a") - .takes_value(false) - .conflicts_with("pathspecs") - .help("Check in all changes in the workspace") - ) - .arg(Arg::with_name("dry-run") - .long("dry-run") - .takes_value(false) - .conflicts_with("pathspecs") - .help("Perform a dry-run only") - ) - .arg(Arg::with_name("message") - .long("message") - .short("m") - .takes_value(true) - .required(true) - .help("Message to provide with the check-in operation") - ) - ) - .subcommand( - SubCommand::with_name("package") - .about("Build the app into publishable package (e.g., a 'python wheel')"), - ) - .subcommand(SubCommand::with_name("run_publish_checks") - .about("Run production-ready and publish-ready checks") - ) - .subcommand(SubCommand::with_name("publish") - .about("Publish (release) the app") - .arg(Arg::with_name("dry-run") - .long("dry-run") - .takes_value(false) - .help("Runs through the entire process except the uploading and mailer steps") - ) - .arg(Arg::with_name("version") - .long("version") - .takes_value(true) - .value_name("VERSION") - .help("Publish with the given version increment") - ) - .arg(Arg::with_name("release-note") - .long("release-note") - .takes_value(true) - .value_name("NOTE") - .help("Publish with the given release note") - ) - .arg(Arg::with_name("release-title") - .long("release-title") - .takes_value(true) - .value_name("TITLE") - .help("Publish with the given release title") - ) - .arg(Arg::with_name("no-release-title") - .long("no-release-title") - .takes_value(false) - .help("Indicate no release title will be provided") - .conflicts_with("release-title") - ) - ), - ); - - /************************************************************************************/ - let env_help = "Manage your application's Origen/Python environment (dependencies, etc.)"; - origen_commands.push(CommandHelp { - name: "env".to_string(), - help: env_help.to_string(), - shortcut: None, - }); - app = app.subcommand(SubCommand::with_name("env").about(env_help) - .setting(AppSettings::ArgRequiredElseHelp) - .subcommand( - SubCommand::with_name("setup") - .about("Setup your application's Python environment for the first time in a new workspace, this will install dependencies per the poetry.lock file") - .arg(Arg::with_name("origen") - .long("origen") - .help("The path to a local version of Origen to use (to develop Origen)") - .takes_value(true), - ), - ) - .subcommand( - SubCommand::with_name("update") - .about("Update your application's Python dependencies according to the latest pyproject.toml file"), - ) - ); - - /************************************************************************************/ - let exec_help = "Execute a command within your application's Origen/Python environment (e.g. origen exec pytest)"; - origen_commands.push(CommandHelp { - name: "exec".to_string(), - help: exec_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("exec") - .about(exec_help) - .setting(AppSettings::ArgRequiredElseHelp) - .setting(AppSettings::DisableVersion) - .setting(AppSettings::AllowLeadingHyphen) - .arg( - Arg::with_name("cmd") - .help("The command to be run") - .takes_value(true) - .required(true) - .value_name("COMMAND"), - ) - .arg( - Arg::with_name("args") - .help("Arguments to be passed to the command") - .takes_value(true) - .allow_hyphen_values(true) - .multiple(true) - .number_of_values(1) - .required(false) - //.last(true) - .value_name("ARGS"), - ), - ); - - /************************************************************************************/ - let save_ref_help = "Save a reference version of the given file, this will be automatically checked for differences the next time it is generated"; - origen_commands.push(CommandHelp { - name: "save_ref".to_string(), - help: save_ref_help.to_string(), - shortcut: None, - }); - app = app.subcommand( - SubCommand::with_name("save_ref") - .about(save_ref_help) - .arg( - Arg::with_name("files") - .help("The name of the file(s) to be saved") - .takes_value(true) - .value_name("FILES") - .multiple(true) - .required_unless_one(&["new", "changed"]), - ) - .arg( - Arg::with_name("new") - .long("new") - .required(false) - .takes_value(false) - .help("Update all NEW file references from the last generate run"), - ) - .arg( - Arg::with_name("changed") - .long("changed") - .required(false) - .takes_value(false) - .help("Update all CHANGED file references from the last generate run"), - ), - ); + app = commands::app::add_commands(app, &helps, app_cmds.as_ref().unwrap(), &extensions)?; + app = commands::env::add_commands(app, &helps, &extensions)?; + app = commands::generate::add_commands(app, &helps, &extensions)?; + +// /************************************************************************************/ +// let new_help = "Generate a new block, flow, pattern, etc. for your application"; +// origen_commands.push(CommandHelp { +// name: "new".to_string(), +// help: new_help.to_string(), +// shortcut: None, +// }); +// app = app.subcommand( +// Command::new("new") +// .about(new_help) +// .arg_required_else_help(true) +// .subcommand(Command::new("dut") +// .display_order(5) +// .about("Create a new top-level (DUT) block, see 'origen new dut -h' for more info") +// .long_about( +// "This generator creates a top-level (DUT) block and all of the associated resources for it, e.g. a +// reg file, controller, target, timesets, pins, etc. + +// The NAME of the DUT should be given in lower case, optionally prefixed by parent DUT name(s) separated +// by a forward slash. + +// Any parent DUT(s) will be created if they don't exist, but they will not be modified if they do. + +// Examples: +// origen new dut # Creates /blocks/dut/... +// origen new dut falcon # Creates /blocks/dut/derivatives/falcon/... +// origen new dut dsp/falcon # Creates /blocks/dut/derivatives/dsp/derivatives/falcon/...") +// .arg(Arg::new("name") +// .action(SetArg) +// .required(false) +// .help("The name of the new DUT") +// .value_name("NAME") +// ) +// ) +// .subcommand(Command::new("block") +// .display_order(5) +// .about("Create a new block, see 'origen new block -h' for more info") +// .long_about( +// "This generator creates a block (e.g. to represent RAM, ATD, Flash, DAC, etc.) and all of the associated +// resources for it, e.g. a reg file, controller, timesets, etc. + +// The NAME should be given in lower case (e.g. flash/flash2kb, adc/adc16), optionally with +// additional parent sub-block names after the initial type. + +// Alternatively, a reference to an existing BLOCK can be added, in which case a nested block will be created +// within that block's 'blocks/' directory, rather than a primary top-level block. + +// Any parent block(s) will be created if they don't exist, but they will not be modified if they do. + +// Examples: +// origen new block dac # Creates /blocks/dac/... +// origen new block adc/adc8bit # Creates /blocks/adc/derivatives/adc8bit/... +// origen new block adc/adc16bit # Creates /blocks/adc/derivatives/adc16bit/... +// origen new block nvm/flash/flash2kb # Creates /blocks/nvm/derivatives/flash/derivatives/flash2kb/... + +// # Example of creating a nested sub-block +// origen new block bist --parent nvm/flash # Creates /blocks/nvm/derivatives/flash/blocks/bist/...") +// .arg(Arg::new("name") +// .action(SetArg) +// .required(true) +// .help("The name of the new block, including its parents if applicable") +// .value_name("NAME") +// ) +// .arg( +// Arg::new("parent") +// .short('p') +// .long("parent") +// .help("Create the new block nested within this existing block") +// .action(SetArg) +// .required(false) +// .value_name("PARENT") +// ) +// ) +// ); + +// /************************************************************************************/ +// let c_help = "Compile templates"; +// origen_commands.push(CommandHelp { +// name: "compile".to_string(), +// help: c_help.to_string(), +// shortcut: Some("c".to_string()), +// }); +// app = app.subcommand( +// Command::new("compile") +// .about(c_help) +// .visible_alias("c") +// .arg( +// Arg::new("files") +// .help("The name of the file(s) to be generated") +// .action(AppendArgs) +// .value_name("FILES") +// .multiple(true) +// .required(true), +// ) +// .arg( +// Arg::new("target") +// .short('t') +// .long("target") +// .help("Override the default target currently set by the workspace") +// .action(AppendArgs) +// .use_delimiter(true) +// .multiple(true) +// .number_of_values(1) +// .value_name("TARGET"), +// ) +// .arg( +// Arg::new("mode") +// .short('m') +// .long("mode") +// .help("Override the default execution mode currently set by the workspace") +// .action(SetArg) +// .value_name("MODE"), +// ), +// ); + + app = commands::target::add_commands(app, &helps, &extensions)?; + +// /************************************************************************************/ +// let t_help = "Create, Build, and View Web Documentation"; +// origen_commands.push(CommandHelp { +// name: "web".to_string(), +// help: t_help.to_string(), +// shortcut: Some("w".to_string()), +// }); +// app = app.subcommand( +// Command::new("web") +// .about(t_help) +// .arg_required_else_help(true) +// .visible_alias("w") +// .subcommand( +// Command::new("build") // What I think this command should be called +// .about("Builds the web documentation") +// .visible_alias("b") +// .visible_alias("compile") // If coming from O1 +// .visible_alias("html") // If coming from Sphinx and using quickstart's Makefile +// .arg( +// Arg::new("view") +// .long("view") +// .help("Launch your web browser after the build") +// .action(SetArgTrue), +// ) +// .arg( +// Arg::new("clean") +// .long("clean") +// .help( +// "Clean up directories from previous builds and force a rebuild", +// ) +// .action(SetArgTrue), +// ) +// .arg( +// Arg::new("release") +// .long("release") +// .short('r') +// .help("Release (deploy) the resulting web pages") +// .action(SetArgTrue), +// ) +// .arg( +// Arg::new("archive") +// .long("archive") +// .short('a') +// .help("Archive the resulting web pages after building") +// .action(SetArg) +// .multiple(false) +// .min_values(0), +// ) +// .arg( +// Arg::new("as-release") +// .long("as-release") +// .help("Build webpages with release checks") +// .action(SetArgTrue), +// ) +// .arg( +// Arg::new("release-with-warnings") +// .long("release-with-warnings") +// .help("Release webpages even if warnings persists") +// .action(SetArgTrue), +// ) +// .arg( +// Arg::new("no-api") +// .long("no-api") +// .help("Skip building the API") +// .action(SetArgTrue), +// ) +// .arg( +// Arg::new("sphinx-args") +// .long("sphinx-args") +// .help( +// "Additional arguments to pass to the 'sphinx-build' command +// Argument will passed as a single string and appended to the build command +// E.g.: 'origen web build --sphinx-args \"-q -D my_config_define=1\"' +// -> 'sphinx-build -q -D my_config_define=1'", +// ) +// .action(SetArg) +// .multiple(false) +// .allow_hyphen_values(true), +// ), // .arg(Arg::new("pdf") +// // .long("pdf") +// // .help("Create a PDF of resulting web pages") +// // .action(SetArgTrue) +// // ) +// ) +// .subcommand( +// Command::new("view") +// .about("Launches your web browser to view previously built documentation") +// .visible_alias("v"), +// ) +// .subcommand( +// Command::new("clean") +// .about("Cleans the output directory and all cached files"), +// ), +// ); + +// /************************************************************************************/ +// let mailer_help = +// "Command-line-interface to Origen's mailer for quick emailing or shell-scripting"; +// origen_commands.push(CommandHelp { +// name: "mailer".to_string(), +// help: mailer_help.to_string(), +// shortcut: None, +// }); +// app = app.subcommand( +// Command::new("mailer") +// .about(mailer_help) +// .arg_required_else_help(true) +// .subcommand( +// Command::new("send") +// .about("Quickly send an email") +// .arg( +// Arg::new("body") +// .help("Email message body") +// .long("body") +// .action(SetArg) +// .required(true) +// .value_name("BODY") +// .index(1), +// ) +// .arg( +// Arg::new("subject") +// .help("Email subject line") +// .long("subject") +// .short('s') +// .action(SetArg) +// .value_name("SUBJECT"), +// ) +// .arg( +// Arg::new("to") +// .help("Recipient list") +// .long("to") +// .short('t') +// .action(AppendArgs) +// .required(true) +// .multiple(true) +// .value_name("TO"), +// ), +// ) +// .subcommand( +// Command::new("test") +// .about("Send a test email") +// .arg( +// Arg::new("to") +// .help( +// "Recipient list. If omitted, will be sent to the current user", +// ) +// .long("to") +// .short('t') +// .action(AppendArgs) +// .required(false) +// .multiple(true) +// .value_name("TO"), +// ), +// ), +// ); + +// /************************************************************************************/ +// let mode_help = "Set/view the default execution mode"; +// origen_commands.push(CommandHelp { +// name: "mode".to_string(), +// help: mode_help.to_string(), +// shortcut: Some("m".to_string()), +// }); +// app = app.subcommand( +// Command::new("mode") +// .about(mode_help) +// .visible_alias("m") +// .arg( +// Arg::new("mode") +// .help("The name of the mode to be set as the default mode") +// .action(SetArg) +// .value_name("MODE"), +// ), +// ); + +// /************************************************************************************/ +// let save_ref_help = "Save a reference version of the given file, this will be automatically checked for differences the next time it is generated"; +// origen_commands.push(CommandHelp { +// name: "save_ref".to_string(), +// help: save_ref_help.to_string(), +// shortcut: None, +// }); +// app = app.subcommand( +// Command::new("save_ref") +// .about(save_ref_help) +// .arg( +// Arg::new("files") +// .help("The name of the file(s) to be saved") +// .action(SetArg) +// .value_name("FILES") +// .multiple(true) +// .required_unless_one(&["new", "changed"]), +// ) +// .arg( +// Arg::new("new") +// .long("new") +// .required(false) +// .action(SetArgTrue) +// .help("Update all NEW file references from the last generate run"), +// ) +// .arg( +// Arg::new("changed") +// .long("changed") +// .required(false) +// .action(SetArgTrue) +// .help("Update all CHANGED file references from the last generate run"), +// ), +// ); + } else { + app = commands::new::add_commands(app, &helps, &extensions)?; } - // This is used to justify the command names in the help - let mut name_width = origen_commands - .iter() - .map(|c| c.name.chars().count()) - .max() - .unwrap(); - - let mut app_command_defs = AppCommands::new(Path::new("/")); - let cmds; - if STATUS.is_app_present { - app_command_defs = AppCommands::new(&origen::app().unwrap().root); - app_command_defs.parse_commands(); - // Need to hold this in a long-lived immutable reference for referencing in clap args - cmds = app_command_defs.commands.clone(); - - if let Some(width) = app_command_defs.max_name_width() { - if width > name_width { - name_width = width; - } - } - for command in &app_command_defs.command_helps { - app_commands.push(command.clone()); - } - // This defines the application commands - // For each command - for i in 0..cmds.len() { - let cmd = build_command(&cmds[i]); - app = app.subcommand(cmd); + let mut all_cmds_and_aliases = vec![]; + for subc in app.get_subcommands() { + all_cmds_and_aliases.push(subc.get_name().to_string()); + for a in subc.get_all_aliases() { + all_cmds_and_aliases.push(a.to_string()); } } - // Clap is great, but its generated help doesn't give the flexibility needed to handle things - // like app and plugin command additions, so we make our own - - let mut help_message = format!( - "Origen, The Semiconductor Developer's Kit - -{} - -USAGE: - origen [FLAGS] [COMMAND] -FLAGS: - -h, --help Prints help information - -v {} - -vk, --verbosity_keywords {} - -CORE COMMANDS: -", - version, VERBOSITY_HELP_STR, VERBOSITY_KEYWORD_HELP_STR - ); + if let Some(a_cmds) = app_cmds.as_ref() { + for top_cmd in a_cmds.top_commands.iter() { + // TODO test that aliases vs. command names at the same level are safe (clap should fail earlier for this) + match app.try_get_matches_from_mut(["origen", top_cmd]) { + Ok(_) => { + top_app_cmd_aliases.insert(top_cmd.to_string(), vec!(top_cmd.to_string())); + top_app_replacements.push(["app", "commands", top_cmd]); + }, + Err(e) => { + match e.kind { + ClapErrorKind::DisplayHelp | + ClapErrorKind::DisplayHelpOnMissingArgumentOrSubcommand | + ClapErrorKind::DisplayVersion | + ClapErrorKind::UnknownArgument => { + top_app_cmd_aliases.insert(top_cmd.to_string(), vec!(top_cmd.to_string())); + top_app_replacements.push(["app", "commands", top_cmd]); + }, + _ => {} + } + }, + } + let current_top_cmd_aliases = app.find_subcommand("app").unwrap().find_subcommand("commands").unwrap().find_subcommand(top_cmd).unwrap().get_all_aliases().map( |a| a.to_string()).collect::>(); + for a in current_top_cmd_aliases.iter() { + match app.try_get_matches_from_mut(["origen", a]) { + Ok(_) => { + if let Some(aliases) = top_app_cmd_aliases.get_mut(top_cmd) { + aliases.push(a.to_string()); + } else { + top_app_cmd_aliases.insert(top_cmd.to_string(), vec!(a.to_string())); + } + }, + Err(e) => { + match e.kind { + ClapErrorKind::DisplayHelp | + ClapErrorKind::DisplayHelpOnMissingArgumentOrSubcommand | + ClapErrorKind::DisplayVersion | + ClapErrorKind::UnknownArgument => { + if let Some(aliases) = top_app_cmd_aliases.get_mut(top_cmd) { + aliases.push(a.to_string()); + } else { + top_app_cmd_aliases.insert(top_cmd.to_string(), vec!(a.to_string())); + } + }, + _ => {} + } + }, + } + } + } - for command in &origen_commands { - help_message += &command.render(name_width); - } + let mut strs = vec!(); + if !top_app_cmd_aliases.is_empty() { + let mut len = 0; + for (n, aliases) in top_app_cmd_aliases.iter() { + for a in aliases.iter() { + top_app_replacements.push(["app", "commands", a]); + } - if !app_commands.is_empty() { - help_message += "\nAPP COMMANDS:\n"; - for command in &app_commands { - help_message += &command.render(name_width); + let s = aliases.join(", "); + let l = s.len(); + if l > len { + len = l; + } + strs.push((s, l, n)) + } + for r in top_app_replacements.iter() { + app = app.replace(r[2], r); + } + after_help_str += "APP COMMAND SHORTCUTS:\nThe following shortcuts to application commands are available:\n"; + for s in strs.iter() { + after_help_str += &format!(" {s}{: {c}\n", "", w=(len - s.1), s=s.0, c=s.2); + } + after_help_str += "\n"; } } - help_message += "\nSee 'origen -h' for more information on a specific command."; + if let Some(pls) = plugins.as_ref() { + for (n, pl) in pls.plugins.iter() { + for top_cmd in pl.top_commands.iter() { + if !all_cmds_and_aliases.contains(top_cmd) { + if let Some(cmd_aliases) = top_pl_cmd_aliases.get_mut(n) { + cmd_aliases.insert(top_cmd.to_string(), vec!(top_cmd.to_string())); + } else { + let mut pl_aliases = IndexMap::new(); + pl_aliases.insert(top_cmd.to_string(), vec!(top_cmd.to_string())); + top_pl_cmd_aliases.insert(n.to_string(), pl_aliases); + all_cmds_and_aliases.push(top_cmd.to_string()); + } + } - app = app.help(help_message.as_str()); + let current_top_cmd_aliases = app.find_subcommand("plugin").unwrap().find_subcommand(n).unwrap().find_subcommand(top_cmd).unwrap().get_all_aliases().map( |a| a.to_string()).collect::>(); + for a in current_top_cmd_aliases.iter() { + if !all_cmds_and_aliases.contains(a) { + if let Some(pl_aliases) = top_pl_cmd_aliases.get_mut(n) { + if let Some(cmd_aliases) = pl_aliases.get_mut(top_cmd) { + cmd_aliases.push(a.to_string()); + } else { + pl_aliases.insert(top_cmd.to_string(), vec!(a.to_string())); + } + } else { + let mut pl_aliases = IndexMap::new(); + pl_aliases.insert(top_cmd.to_string(), vec!(a.to_string())); + top_pl_cmd_aliases.insert(n.to_string(), pl_aliases); + } + all_cmds_and_aliases.push(a.to_string()); + } + } + } + } - let matches = app.get_matches(); + let mut strs = vec!(); + if !top_pl_cmd_aliases.is_empty() { + let mut len = 0; + for (pln, pl_aliases) in top_pl_cmd_aliases.iter() { + for (cmdn, cmda) in pl_aliases { + top_pl_replacements.push(["plugin", pln, cmdn]); + + let s = cmda.join(", "); + let l = s.len(); + if l > len { + len = l; + } + strs.push((s, l, format!("{} {}", pln, cmdn))) + } + } - let _ = LOGGER.set_verbosity(matches.occurrences_of("verbose") as u8); - if let Some(keywords) = matches.values_of("verbosity_keywords") { - let _ = LOGGER.set_verbosity_keywords(keywords.map(|k| k.to_string()).collect()); - } + for r in top_pl_replacements.iter() { + app = app.replace(r[2], r); + } - match matches.subcommand_name() { - Some("app") => commands::app::run(matches.subcommand_matches("app").unwrap()), - Some("env") => commands::env::run(matches.subcommand_matches("env").unwrap()), - Some("fmt") => commands::fmt::run()?, - Some("new") => commands::new::run(matches.subcommand_matches("new").unwrap()), - Some("build") => commands::build::run(matches.subcommand_matches("build").unwrap())?, - Some("proj") => commands::proj::run(matches.subcommand_matches("proj").unwrap()), - Some("interactive") => { - log_trace!("Launching interactive session"); - let m = matches.subcommand_matches("interactive").unwrap(); - commands::interactive::run( - if let Some(targets) = m.values_of("target") { - Some(targets.collect()) - } else { - Option::None - }, - &m.value_of("mode"), - ); - } - Some("generate") => { - let m = matches.subcommand_matches("generate").unwrap(); - commands::launch( - "generate", - if let Some(targets) = m.values_of("target") { - Some(targets.collect()) - } else { - Option::None - }, - &m.value_of("mode"), - Some(m.values_of("files").unwrap().collect()), - m.value_of("output_dir"), - m.value_of("reference_dir"), - m.is_present("debug"), - None, - ); + after_help_str += "PLUGIN COMMAND SHORTCUTS:\nThe following shortcuts to plugin commands are available:\n"; + for s in strs.iter() { + after_help_str += &format!(" {s}{: {c}\n", "", w=(len - s.1), s=s.0, c=s.2); + } + after_help_str += "\n"; } - Some("compile") => { - let m = matches.subcommand_matches("compile").unwrap(); - commands::launch( - "compile", - if let Some(targets) = m.values_of("target") { - Some(targets.collect()) + } + + for (n, ns) in aux_cmds.namespaces.iter() { + for top_cmd in ns.top_commands.iter() { + if !all_cmds_and_aliases.contains(top_cmd) { + if let Some(cmd_aliases) = top_aux_cmd_aliases.get_mut(n) { + cmd_aliases.insert(top_cmd.to_string(), vec!(top_cmd.to_string())); } else { - Option::None - }, - &m.value_of("mode"), - Some(m.values_of("files").unwrap().collect()), - m.value_of("output_dir"), - m.value_of("reference_dir"), - false, - None, - ); - } - Some("target") => { - let m = matches.subcommand_matches("target").unwrap(); - let subm = m.subcommand(); - if let Some(s) = subm.1 { - commands::target::run( - Some(subm.0), - match s.values_of("targets") { - Some(targets) => Some(targets.collect()), - None => None, - }, - s.is_present("full-paths"), - ) - } else { - commands::target::run(None, None, m.is_present("full-paths")); + let mut ns_aliases = IndexMap::new(); + ns_aliases.insert(top_cmd.to_string(), vec!(top_cmd.to_string())); + top_aux_cmd_aliases.insert(n.to_string(), ns_aliases); + } + all_cmds_and_aliases.push(top_cmd.to_string()); } - } - Some("web") => { - let cmd = matches.subcommand_matches("web").unwrap(); - let subcmd = cmd.subcommand(); - let sub = subcmd.1.unwrap(); - match subcmd.0 { - "build" => { - let mut args = IndexMap::new(); - if sub.is_present("view") { - args.insert("view", "True".to_string()); - } - if sub.is_present("clean") { - args.insert("clean", "True".to_string()); - } - if sub.is_present("no-api") { - args.insert("no-api", "True".to_string()); - } - if sub.is_present("as-release") { - args.insert("as-release", "True".to_string()); - } - if sub.is_present("release-with-warnings") { - args.insert("release-with-warnings", "True".to_string()); - } - if sub.is_present("release") { - args.insert("release", "True".to_string()); - } - if sub.is_present("archive") { - if let Some(archive) = sub.value_of("archive") { - args.insert("archive", format!("'{}'", archive)); + + let current_top_cmd_aliases = app.find_subcommand("auxillary_commands").unwrap().find_subcommand(n).unwrap().find_subcommand(top_cmd).unwrap().get_all_aliases().map( |a| a.to_string()).collect::>(); + for a in current_top_cmd_aliases.iter() { + if !all_cmds_and_aliases.contains(a) { + if let Some(ns_aliases) = top_aux_cmd_aliases.get_mut(n) { + if let Some(cmd_aliases) = ns_aliases.get_mut(top_cmd) { + cmd_aliases.push(a.to_string()); } else { - args.insert("archive", "True".to_string()); + ns_aliases.insert(top_cmd.to_string(), vec!(a.to_string())); } + } else { + let mut ns_aliases = IndexMap::new(); + ns_aliases.insert(top_cmd.to_string(), vec!(a.to_string())); + top_aux_cmd_aliases.insert(n.to_string(), ns_aliases); } - if let Some(s_args) = sub.value_of("sphinx-args") { - // Recall that this comes in as a single argument, potentially quoted to mimic multiple, - // but a single argument from the perspective here nonetheless - args.insert("sphinx-args", format!("'{}'", s_args)); - } - commands::launch( - "web:build", - if let Some(targets) = cmd.values_of("target") { - Some(targets.collect()) - } else { - Option::None - }, - &None, - None, - None, - None, - false, - Some(args), - ) - } - "view" => commands::launch("web:view", None, &None, None, None, None, false, None), - "clean" => { - commands::launch("web:clean", None, &None, None, None, None, false, None) + all_cmds_and_aliases.push(a.to_string()); } - _ => {} } } - Some("mailer") => { - let cmd = matches.subcommand_matches("mailer").unwrap(); - let subcmd = cmd.subcommand(); - let sub = subcmd.1.unwrap(); - match subcmd.0 { - "send" => { - let mut args = IndexMap::new(); - if let Some(t) = sub.values_of("to") { - let r = t.map(|x| format!("\"{}\"", x)).collect::>(); - args.insert("to", format!("[{}]", r.join(","))); - } - if let Some(s) = sub.value_of("subject") { - args.insert("subject", format!("\"{}\"", s)); - } - if let Some(b) = sub.value_of("body") { - args.insert("body", format!("\"{}\"", b)); - } - - commands::launch( - "mailer:send", - if let Some(targets) = cmd.values_of("target") { - Some(targets.collect()) - } else { - Option::None - }, - &None, - None, - None, - None, - false, - Some(args), - ) - } - "test" => { - let mut args = IndexMap::new(); - if let Some(t) = sub.values_of("to") { - let r = t.map(|x| format!("\"{}\"", x)).collect::>(); - args.insert("to", format!("[{}]", r.join(","))); - } - commands::launch( - "mailer:test", - if let Some(targets) = cmd.values_of("target") { - Some(targets.collect()) - } else { - Option::None - }, - &None, - None, - None, - None, - false, - Some(args), - ) + } + if !top_aux_cmd_aliases.is_empty() { + let mut strs = vec!(); + let mut len = 0; + for (auxn, aux_aliases) in top_aux_cmd_aliases.iter() { + for (cmdn, cmda) in aux_aliases { + top_aux_replacements.push(["auxillary_commands", auxn, cmdn]); + + let s = cmda.join(", "); + let l = s.len(); + if l > len { + len = l; } - _ => {} + strs.push((s, l, format!("{} {}", auxn, cmdn))) } } - Some("credentials") => { - // TODO re-add support for this command - todo!(); - // let cmd = matches.subcommand_matches("credentials").unwrap(); - // let subcmd = cmd.subcommand(); - // let sub = subcmd.1.unwrap(); - // match subcmd.0 { - // "set" => { - // if sub.is_present("all") { - // match origen::core::user::set_all_passwords() { - // Ok(_) => {} - // Err(e) => { - // origen::display_redln!( - // "Could not set all passwords. Errors were encountered:\n{}", - // e.msg - // ); - // } - // } - // } else { - // if let Some(datasets) = sub.values_of("dataset") { - // match origen::core::user::set_passwords(Some(datasets.collect())) { - // Ok(_) => {} - // Err(e) => { - // origen::display_redln!("Could not set all requested passwords. Errors were encountered:\n{}", e.msg); - // } - // } - // } else { - // match origen::core::user::set_passwords(None) { - // Ok(_) => {} - // Err(e) => { - // origen::display_redln!("Could not clear all passwords. Errors were encountered:\n{}", e.msg); - // } - // } - // } - // } - // } - // "clear" => { - // if sub.is_present("all") { - // match origen::core::user::clear_all_passwords() { - // Ok(_) => {} - // Err(e) => { - // origen::display_redln!( - // "Could not clear all passwords. Errors were encountered:\n{}", - // e.msg - // ); - // } - // } - // } else { - // if let Some(datasets) = sub.values_of("dataset") { - // match origen::core::user::clear_passwords(Some(datasets.collect())) { - // Ok(_) => {} - // Err(e) => { - // origen::display_redln!("Could not clear all given passwords. Errors were encountered:\n{}", e.msg); - // } - // } - // } else { - // match origen::core::user::clear_passwords(None) { - // Ok(_) => {} - // Err(e) => { - // origen::display_redln!( - // "Could not clear password. Errors were encountered:\n{}", - // e.msg - // ); - // } - // } - // } - // } - // } - // _ => {} - // } + + for r in top_aux_replacements.iter() { + app = app.replace(r[2], r); } - Some("mode") => { - let matches = matches.subcommand_matches("mode").unwrap(); - commands::mode::run(matches.value_of("mode")); + + after_help_str += "AUX COMMAND SHORTCUTS:\nThe following shortcuts to auxillary commands are available:\n"; + for s in strs.iter() { + after_help_str += &format!(" {s}{: {c}\n", "", w=(len - s.1), s=s.0, c=s.2); } - Some("save_ref") => { - let matches = matches.subcommand_matches("save_ref").unwrap(); - commands::save_ref::run(matches); + after_help_str += "\n"; + } + + after_help_str += "See 'origen -h' for more information on a specific command."; + app = app.after_help(&*after_help_str); + + let matches = app.get_matches_mut(); + + macro_rules! run_cmd_match_case { + ($cmd:ident, $cmd_name:ident) => { + commands::$cmd::run(matches.subcommand_matches(commands::$cmd::$cmd_name).unwrap(), &app, &extensions, plugins.as_ref())? + }; + ($cmd:ident) => { + commands::$cmd::run(matches.subcommand_matches(commands::$cmd::BASE_CMD).unwrap(), &app, &extensions, plugins.as_ref())? + } + } + + macro_rules! run_non_ext_cmd_match_case { + ($cmd:ident, $cmd_name:ident) => { + commands::$cmd::run(matches.subcommand_matches(commands::$cmd::$cmd_name).unwrap())? + }; + ($cmd:ident) => { + commands::$cmd::run(matches.subcommand_matches(commands::$cmd::BASE_CMD).unwrap())? + } + } + + match matches.subcommand_name() { + Some(commands::app::BASE_CMD) => commands::app::run(matches.subcommand_matches(commands::app::BASE_CMD).unwrap(), &app, &extensions, plugins.as_ref(), &app_cmds.as_ref().unwrap())?, + Some(commands::new::BASE_CMD) => run_non_ext_cmd_match_case!(new), + // Some("proj") => commands::proj::run(matches.subcommand_matches("proj").unwrap()), + Some(commands::env::BASE_CMD) => run_non_ext_cmd_match_case!(env), + Some(commands::eval::BASE_CMD) => run_cmd_match_case!(eval), + Some(commands::develop_origen::BASE_CMD) => run_non_ext_cmd_match_case!(develop_origen), + Some(commands::interactive::BASE_CMD) => run_cmd_match_case!(interactive), + Some(commands::aux_cmds::BASE_CMD) => commands::aux_cmds::run(matches.subcommand_matches(commands::aux_cmds::BASE_CMD).unwrap(), &app, &extensions, plugins.as_ref(), &aux_cmds)?, + Some(commands::generate::BASE_CMD) => run_cmd_match_case!(generate), + // Some("compile") => { + // let m = matches.subcommand_matches("compile").unwrap(); + // commands::launch( + // "compile", + // if let Some(targets) = m.get_many::("target") { + // Some(targets.map(|t| t.as_str()).collect()) + // } else { + // Option::None + // }, + // &m.get_one::<&str>("mode").map(|s| *s), + // Some(m.get_many::("files").unwrap().map(|t| t.as_str()).collect()), + // m.get_one::<&str>("output_dir").map(|s| *s), + // m.get_one::<&str>("reference_dir").map(|s| *s), + // false, + // None, + // ); + // } + Some(commands::target::BASE_CMD) => run_non_ext_cmd_match_case!(target), + // Some("web") => { + // let cmd = matches.subcommand_matches("web").unwrap(); + // let subcmd = cmd.subcommand().unwrap(); + // let sub = subcmd.1; + // match subcmd.0 { + // "build" => { + // let mut args = IndexMap::new(); + // if sub.contains_id("view") { + // args.insert("view", "True".to_string()); + // } + // if sub.contains_id("clean") { + // args.insert("clean", "True".to_string()); + // } + // if sub.contains_id("no-api") { + // args.insert("no-api", "True".to_string()); + // } + // if sub.contains_id("as-release") { + // args.insert("as-release", "True".to_string()); + // } + // if sub.contains_id("release-with-warnings") { + // args.insert("release-with-warnings", "True".to_string()); + // } + // if sub.contains_id("release") { + // args.insert("release", "True".to_string()); + // } + // if sub.contains_id("archive") { + // if let Some(archive) = sub.get_one::<&str>("archive") { + // args.insert("archive", format!("'{}'", archive)); + // } else { + // args.insert("archive", "True".to_string()); + // } + // } + // if let Some(s_args) = sub.get_one::<&str>("sphinx-args") { + // // Recall that this comes in as a single argument, potentially quoted to mimic multiple, + // // but a single argument from the perspective here nonetheless + // args.insert("sphinx-args", format!("'{}'", s_args)); + // } + // commands::launch( + // "web:build", + // if let Some(targets) = cmd.get_many::("target") { + // Some(targets.map(|t| t.as_str()).collect()) + // } else { + // Option::None + // }, + // &None, + // None, + // None, + // None, + // false, + // Some(args), + // ) + // } + // "view" => commands::launch("web:view", None, &None, None, None, None, false, None), + // "clean" => { + // commands::launch("web:clean", None, &None, None, None, None, false, None) + // } + // _ => {} + // } + // } + // Some("mailer") => { + // let cmd = matches.subcommand_matches("mailer").unwrap(); + // let subcmd = cmd.subcommand().unwrap(); + // let sub = subcmd.1; + // match subcmd.0 { + // "send" => { + // let mut args = IndexMap::new(); + // if let Some(t) = sub.get_many::("to") { + // let r = t.map(|x| format!("\"{}\"", x)).collect::>(); + // args.insert("to", format!("[{}]", r.join(","))); + // } + // if let Some(s) = sub.get_one::<&str>("subject") { + // args.insert("subject", format!("\"{}\"", s)); + // } + // if let Some(b) = sub.get_one::<&str>("body") { + // args.insert("body", format!("\"{}\"", b)); + // } + + // commands::launch( + // "mailer:send", + // if let Some(targets) = cmd.get_many::("target") { + // Some(targets.map(|t| t.as_str()).collect()) + // } else { + // Option::None + // }, + // &None, + // None, + // None, + // None, + // false, + // Some(args), + // ) + // } + // "test" => { + // let mut args = IndexMap::new(); + // if let Some(t) = sub.get_many::("to") { + // let r = t.map(|x| format!("\"{}\"", x)).collect::>(); + // args.insert("to", format!("[{}]", r.join(","))); + // } + // commands::launch( + // "mailer:test", + // if let Some(targets) = cmd.get_many::("target") { + // Some(targets.map(|t| t.as_str()).collect()) + // } else { + // Option::None + // }, + // &None, + // None, + // None, + // None, + // false, + // Some(args), + // ) + // } + // _ => {} + // } + // } + Some(commands::credentials::BASE_CMD) => run_cmd_match_case!(credentials), + // Some("mode") => { + // let matches = matches.subcommand_matches("mode").unwrap(); + // commands::mode::run(matches.get_one::<&str>("mode").map(|s| *s)); + // } + // Some("save_ref") => { + // let matches = matches.subcommand_matches("save_ref").unwrap(); + // commands::save_ref::run(matches); + // } + Some(commands::plugin::BASE_CMD) => run_cmd_match_case!(plugin), + Some(commands::plugins::BASE_CMD) => commands::plugins::run(matches.subcommand_matches(commands::plugins::BASE_CMD).unwrap(), plugins.as_ref())?, + Some(invalid_cmd) => { + // This case shouldn't happen as clap should've previously kicked out on any invalid command + unreachable!("Uncaught invalid command encountered: '{}'", invalid_cmd); } - // To get here means the user has typed "origen -v", which officially means - // verbosity level 1 with no command, but this is what they really mean None => { - let mut max_len = 0; + if print_help { + // No subcommands or "-v" used, but verbose and/or vks used. + // This will register as no subcommand, but actually want to display help, not version + app.print_help()?; + return Ok(()) + } + // To get here means the user has typed "origen -v", which officially means + // verbosity level 1 with no command, but really want version with verbosity level 0 + let mut max_len = 6; //'Origen' by default let mut versions: IndexMap = IndexMap::new(); - if STATUS.is_app_present { - let cmd = "from origen.boot import run_cmd; run_cmd('_version_');"; - let mut output_lines = "".to_string(); - - let res = python::run_with_callbacks( - cmd, - Some(&mut |line| { - output_lines += &format!("{}\n", line); - }), - None, - ); - output_lines.pop(); - - match res { - Ok(_) => { - let lines = output_lines.split("\n").collect::>(); - if lines.len() == 0 || lines.len() == 1 { - log_error!( - "Unable to parse in-application version output. Expected newlines:" - ); - log_error!("{}", output_lines); - } else { - let mut phase = 0; - let mut current = "".to_string(); - let mut is_private = false; - let mut is_okay = false; - let mut ver_or_message = "".to_string(); - for l in lines { - if phase == 0 { - let ver = parse_version_token(l); - current = ver.0; - is_private = ver.1; - if !is_private && current.len() > max_len { - max_len = current.len(); - } - phase += 1; - } else if phase == 1 { - match origen::utility::status_to_bool(l) { - Ok(stat) => is_okay = stat, - Err(e) => { - log_error!("{}", e.msg); - log_error!("Unable to parse version information"); - break; - } + + let cmd = "from origen.boot import run_cmd; run_cmd('_version_');"; + let mut output_lines = "".to_string(); + let mut error_lines = "".to_string(); + + let res = python::run_with_callbacks( + cmd, + Some(&mut |line| { + output_lines += &format!("{}\n", line); + }), + Some(&mut |line| { + error_lines += &format!("{}\n", line); + }), + ); + output_lines.pop(); + match res { + Ok(_) => { + let lines = output_lines.split("\n").collect::>(); + if lines.len() == 0 || lines.len() == 1 { + log_error!( + "Unable to parse in-application version output. Expected newlines:" + ); + log_error!("{}", output_lines); + } else { + let mut phase = 0; + let mut current = "".to_string(); + let mut is_private = false; + let mut is_okay = false; + let mut ver_or_message = "".to_string(); + for l in lines { + if phase == 0 { + let ver = parse_version_token(l); + current = ver.0; + is_private = ver.1; + if !is_private && current.len() > max_len { + max_len = current.len(); + } + phase += 1; + } else if phase == 1 { + match origen::utility::status_to_bool(l) { + Ok(stat) => is_okay = stat, + Err(e) => { + log_error!("{}", e.msg); + log_error!("Unable to parse version information"); + break; } - phase += 1; - } else if phase == 2 { - match l.chars().next() { - Some(t) => { - if t == '\t' { - ver_or_message += &l[1..]; - } else { - versions.insert( - current.to_string(), - ( - is_okay, - is_private, - ver_or_message.to_string(), - ), - ); - let ver = parse_version_token(l); - current = ver.0; - is_private = ver.1; - if !is_private && current.len() > max_len { - max_len = current.len(); - } - ver_or_message = "".to_string(); - phase = 1; + } + phase += 1; + } else if phase == 2 { + match l.chars().next() { + Some(t) => { + if t == '\t' { + ver_or_message += &l[1..]; + } else { + versions.insert( + current.to_string(), + ( + is_okay, + is_private, + ver_or_message.to_string(), + ), + ); + let ver = parse_version_token(l); + current = ver.0; + is_private = ver.1; + if !is_private && current.len() > max_len { + max_len = current.len(); } - } - None => { - log_error!("Unable to parse in-application version output - unexpected empty line:"); - log_error!("{}", output_lines); + ver_or_message = "".to_string(); + phase = 1; } } - } else { - log_error!("Unable to parse in-application version output:"); - log_error!("{}", output_lines); + None => { + log_error!("Unable to parse in-application version output - unexpected empty line:"); + log_error!("{}", output_lines); + } } - } - - if phase == 2 { - versions.insert( - current.clone(), - (is_okay, is_private, ver_or_message.clone()), - ); } else { - log_error!("Unable to parse in-application version output - unexpected format:"); + log_error!("Unable to parse in-application version output:"); log_error!("{}", output_lines); } } + + if phase == 2 { + versions.insert( + current.clone(), + (is_okay, is_private, ver_or_message.clone()), + ); + } else { + log_error!("Unable to parse in-application version output - unexpected format:"); + log_error!("{}", output_lines); + } } - Err(e) => { - log_error!( - "Couldn't boot app to determine the in-application Origen version" + versions.insert( + "CLI".to_string(), + (true, STATUS.is_app_present, STATUS.cli_version().unwrap().to_pep440()?.to_string()), + ); + } + Err(_e) => { + if error_lines.contains(*python::NO_ORIGEN_BOOT_MODULE_ERROR) { + // Module not found error + if STATUS.is_app_present { + // Inside an app. This is problematic - origen should be available here + for err in error_lines.lines() { + log_error!("{}", err); + } + + versions.insert( + "Origen".to_string(), + (true, false, "No Origen Module Available".to_string()), + ); + versions.insert( + "App".to_string(), + (true, false, "Unable To Parse Version Information".to_string()), + ); + } else { + // Outside of an app + // If the CLI only is used, this will be expected. + // In this case, treat it as info, not an error. + // Log the error for verbose output though. + for err in error_lines.lines() { + log_debug!("{}", err); + } + + versions.insert( + "Origen".to_string(), + (true, false, "No Origen Module Available".to_string()), + ); + } + } else { + // Unrecognized error + for err in error_lines.lines() { + log_error!("{}", err); + } + versions.insert( + "Origen".to_string(), + (true, false, "Errors Encountered Retrieving Origen Version Info".to_string()), ); - log_error!("Received Error:"); - log_error!(""); - log_error!("{}", e); - if output_lines != "" { - log_error!(""); - log_error!("The following was also captured:"); - log_error!(""); - log_error!("{}", output_lines); + if STATUS.is_app_present { + versions.insert( + "App".to_string(), + (true, false, "Unable To Parse Version Information".to_string()), + ); } - exit(1); } + versions.insert( + "CLI".to_string(), + (true, STATUS.is_app_present, STATUS.cli_version().unwrap().to_pep440()?.to_string()), + ); } - } else { - versions.insert( - "Origen".to_string(), - (true, false, STATUS.origen_version.to_string()), - ); - versions.insert( - "CLI".to_string(), - (true, false, built_info::PKG_VERSION.to_string()), - ); - max_len = 6; // 'Origen' } for (n, v) in versions.iter() { @@ -1552,70 +1367,10 @@ CORE COMMANDS: } } } - _ => { - // To get here we must be dealing with a command added by an app/plugin - app_command_defs.dispatch(&matches); - } } Ok(()) } -fn build_command(cmd_def: &app_commands::Command) -> App { - let mut cmd = SubCommand::with_name(&cmd_def.name).about(cmd_def.help.as_str()); - if cmd_def.alias.is_some() { - cmd = cmd.visible_alias(cmd_def.alias.as_ref().unwrap().as_str()); - } - if cmd_def.arg.is_some() { - // For each arg - for j in 0..cmd_def.arg.as_ref().unwrap().len() { - let arg_def = &cmd_def.arg.as_ref().unwrap()[j]; - let mut arg = Arg::with_name(&arg_def.name).help(&arg_def.help); - // If this is an arg without a switch - if arg_def.switch.is_some() && !arg_def.switch.unwrap() { - // Do nothing? - } else { - if arg_def.long.is_some() { - arg = arg.long(&arg_def.long.as_ref().unwrap()); - } else { - arg = arg.long(&arg_def.name); - } - if arg_def.short.is_some() { - arg = arg.short(arg_def.short.as_ref().unwrap()) - } - } - if arg_def.takes_value.is_some() { - arg = arg.takes_value(arg_def.takes_value.unwrap()) - } - if arg_def.multiple.is_some() { - arg = arg.multiple(arg_def.multiple.unwrap()) - } - if arg_def.required.is_some() { - arg = arg.required(arg_def.required.unwrap()) - } - if arg_def.value_name.is_some() { - arg = arg.value_name(arg_def.value_name.as_ref().unwrap()) - } else { - arg = arg.value_name(arg_def.upcased_name.as_ref().unwrap()) - } - if arg_def.use_delimiter.is_some() { - arg = arg.use_delimiter(arg_def.use_delimiter.unwrap()) - } - if arg_def.hidden.is_some() { - arg = arg.hidden(arg_def.hidden.unwrap()) - } - - cmd = cmd.arg(arg); - } - } - if let Some(subcommands) = &cmd_def.subcommand { - for c in subcommands { - let subcmd = build_command(&c); - cmd = cmd.subcommand(subcmd); - } - } - cmd -} - fn parse_version_token(input: &str) -> (String, bool) { let chars = input.chars().collect::>(); if chars.len() > 2 { diff --git a/rust/origen/cli/src/commands/_prelude/clap_arg_actions.rs b/rust/origen/cli/src/commands/_prelude/clap_arg_actions.rs new file mode 100644 index 00000000..d052fa20 --- /dev/null +++ b/rust/origen/cli/src/commands/_prelude/clap_arg_actions.rs @@ -0,0 +1,5 @@ +pub use clap::builder::ArgAction::Set as SetArg; +pub use clap::builder::ArgAction::Append as AppendArgs; +pub use clap::builder::ArgAction::Count as CountArgs; +pub use clap::builder::ArgAction::SetTrue as SetArgTrue; +pub use clap::builder::ArgAction::SetFalse as SetArgFalse; diff --git a/rust/origen/cli/src/commands/_prelude/mod.rs b/rust/origen/cli/src/commands/_prelude/mod.rs new file mode 100644 index 00000000..ee9a17de --- /dev/null +++ b/rust/origen/cli/src/commands/_prelude/mod.rs @@ -0,0 +1,24 @@ +pub mod clap_arg_actions; + +pub use clap::{App, AppSettings, Arg, Command}; +pub use origen::Result; +pub use indexmap::IndexMap; +pub use super::launch_as; +pub use crate::framework::{ + Extensions, Plugins, add_verbosity_opts, + CmdHelps, CmdHelp, CmdSrc, +}; +pub use crate::framework::core_cmds::SubCmd; +pub use crate::{output_dir_opt, ref_dir_opt}; +pub use crate::{req_sv_arg, sv_opt}; + +// TODO clap4.0 remove after update to next clap version +pub type RunInput<'a> = &'a clap::ArgMatches; + +pub use clap_arg_actions::*; +pub use crate::{ + gen_core_cmd_funcs, gen_core_cmd_funcs__no_exts__no_app_opts, + core_subcmd, core_subcmd__no_exts__no_app_opts, + gen_simple_run_func, + print_subcmds_available_msg, unreachable_invalid_subc, +}; \ No newline at end of file diff --git a/rust/origen/cli/src/commands/app.rs b/rust/origen/cli/src/commands/app.rs index 7b8253a6..a26cfb9f 100644 --- a/rust/origen/cli/src/commands/app.rs +++ b/rust/origen/cli/src/commands/app.rs @@ -1,84 +1,220 @@ use clap::ArgMatches; use indexmap::IndexMap; +use crate::framework::AppCmds; +use crate::commands::_prelude::*; +use crate::framework::app_cmds::add_commands as add_app_user_commands; +use crate::framework::app_cmds::add_helps as add_app_cmd_helps; -fn _run(cmd: &str, proc_cmd: &ArgMatches, args: Option>) { - super::launch( - cmd, - if let Some(targets) = proc_cmd.values_of("target") { - Some(targets.collect()) - } else { - Option::None - }, - &None, - None, - None, - None, - false, - args, - ); +pub const BASE_CMD: &'static str = "app"; + +pub (crate) fn add_helps(helps: &mut CmdHelps, app_cmds: &AppCmds) { + helps.add_core_cmd(BASE_CMD).set_help_msg("Manage and interface with the application").set_as_not_extendable(); + add_app_cmd_helps(helps, app_cmds); +} + +pub (crate) fn add_commands<'a>(app: App<'a>, helps: &'a CmdHelps, app_cmds: &'a AppCmds, exts: &'a Extensions, ) -> Result> { + let mut app_subc = helps.core_cmd(BASE_CMD) + .arg_required_else_help(true); + // .subcommand( + // Command::new("init") + // .about("Initialize the application's revision control") + // ) + // .subcommand( + // Command::new("status") + // .about("Show any local changes") + // .arg(Arg::new("modified") + // .long("modified") + // .action(SetArgTrue) + // .help("Show tracked, modified files") + // ) + // .arg(Arg::new("untracked") + // .long("untracked") + // .action(SetArgTrue) + // .help("Show untracked files") + // ) + // ) + // .subcommand( + // Command::new("checkin") + // .about("Check in the given pathspecs") + // .arg(Arg::new("pathspecs") + // .help("The paths to be checked in") + // .action(AppendArgs) + // .value_name("PATHSPECS") + // .multiple(true) + // ) + // .arg(Arg::new("all") + // .long("all") + // .short('a') + // .action(SetArgTrue) + // .conflicts_with("pathspecs") + // .help("Check in all changes in the workspace") + // ) + // .arg(Arg::new("dry-run") + // .long("dry-run") + // .action(SetArgTrue) + // .conflicts_with("pathspecs") + // .help("Perform a dry-run only") + // ) + // .arg(Arg::new("message") + // .long("message") + // .short('m') + // .action(SetArg) + // .required(true) + // .help("Message to provide with the check-in operation") + // ) + // ) + // .subcommand( + // Command::new("package") + // .about("Build the app into publishable package (e.g., a 'python wheel')"), + // ) + // .subcommand(Command::new("run_publish_checks") + // .about("Run production-ready and publish-ready checks") + // ) + // .subcommand(Command::new("publish") + // .about("Publish (release) the app") + // .arg(Arg::new("dry-run") + // .long("dry-run") + // .action(SetArgTrue) + // .help("Runs through the entire process except the uploading and mailer steps") + // ) + // .arg(Arg::new("version") + // .long("version") + // .action(SetArg) + // .value_name("VERSION") + // .help("Publish with the given version increment") + // ) + // .arg(Arg::new("release-note") + // .long("release-note") + // .action(SetArg) + // .value_name("NOTE") + // .help("Publish with the given release note") + // ) + // .arg(Arg::new("release-title") + // .long("release-title") + // .action(SetArg) + // .value_name("TITLE") + // .help("Publish with the given release title") + // ) + // .arg(Arg::new("no-release-title") + // .long("no-release-title") + // .action(SetArgTrue) + // .help("Indicate no release title will be provided") + // .conflicts_with("release-title") + // ) + // ); + app_subc = add_app_user_commands(app_subc, helps, app_cmds, exts)?; + Ok(app.subcommand(app_subc)) } -pub fn run(cmd: &ArgMatches) { - let subcmd = cmd.subcommand(); - let sub = subcmd.1.unwrap(); +// fn _run(cmd: &str, proc_cmd: &ArgMatches, args: Option>) -> Result<()>{ +// super::launch( +// cmd, +// if let Some(targets) = proc_cmd.get_many::("target") { +// Some(targets.map(|t| t.as_str()).collect()) +// } else { +// Option::None +// }, +// &None, +// None, +// None, +// None, +// false, +// args, +// ); +// Ok(()) +// } + +pub(crate) fn run(invocation: &ArgMatches, mut app: &App, exts: &Extensions, plugins: Option<&Plugins>, app_cmds: &AppCmds) -> origen::Result<()> { + let subcmd = invocation.subcommand().unwrap(); + let sub = subcmd.1; match subcmd.0 { - "init" => { - _run("app:init", sub, None); - } - "status" => { - let mut args = IndexMap::new(); - if sub.is_present("modified") { - args.insert("modified", "True".to_string()); - } - if sub.is_present("untracked") { - args.insert("untracked", "True".to_string()); - } - _run("app:status", sub, Some(args)); - } - "checkin" => { - let mut args = IndexMap::new(); - if sub.is_present("all") { - args.insert("all", "True".to_string()); - } - if sub.is_present("dry-run") { - args.insert("dry-run", "True".to_string()); + // "init" => { + // _run("app:init", sub, None) + // } + // "status" => { + // let mut args = IndexMap::new(); + // if sub.contains_id("modified") { + // args.insert("modified", "True".to_string()); + // } + // if sub.contains_id("untracked") { + // args.insert("untracked", "True".to_string()); + // } + // _run("app:status", sub, Some(args)) + // } + // "checkin" => { + // let mut args = IndexMap::new(); + // if sub.contains_id("all") { + // args.insert("all", "True".to_string()); + // } + // if sub.contains_id("dry-run") { + // args.insert("dry-run", "True".to_string()); + // } + // if let Some(pathspecs) = sub.get_many::("pathspecs") { + // let p = pathspecs + // .map(|ps| format!("\"{}\"", ps)) + // .collect::>(); + // args.insert("pathspecs", format!("[{}]", p.join(","))); + // } + // args.insert( + // "msg", + // format!("\"{}\"", sub.get_one::("message").unwrap()), + // ); + // _run("app:checkin", sub, Some(args)) + // } + // "package" => { + // _run("app:package", sub, None) + // } + // "publish" => { + // let mut args = IndexMap::new(); + // if sub.contains_id("dry-run") { + // args.insert("dry-run", "True".to_string()); + // } + // if let Some(v) = sub.get_one::<&str>("version") { + // args.insert("version", format!("\"{}\"", v.to_string())); + // } + // if let Some(r) = sub.get_one::<&str>("release-note") { + // args.insert("release-note", format!("\"{}\"", r.to_string())); + // } + // if let Some(t) = sub.get_one::<&str>("release-title") { + // args.insert("release-title", format!("\"{}\"", t.to_string())); + // } + // if sub.contains_id("no-release-title") { + // args.insert("no-release-title", "True".to_string()); + // } + // _run("app:publish", sub, Some(args)) + // } + // "run_publish_checks" => { + // _run("app:run_publish_checks", sub, None) + // } + "commands" => { + if sub.subcommand().is_some() { // invocation.subcommand() { + let mut overrides = IndexMap::new(); + + let mut matches = sub; + let mut path_pieces: Vec = vec!(); + app = app.find_subcommand(BASE_CMD).unwrap(); + // matches = matches.subcommand_matches("commands").unwrap(); + app = app.find_subcommand("commands").unwrap(); + while matches.subcommand_name().is_some() { + let n = matches.subcommand_name().unwrap(); + matches = matches.subcommand_matches(&n).unwrap(); + app = app.find_subcommand(n).unwrap(); + path_pieces.push(n.to_string()); + } + let path = path_pieces.join("."); + launch_as("_dispatch_app_cmd_", Some(&path_pieces), matches, app, exts.get_app_ext(&path), plugins, Some( + { + overrides.insert("dispatch_root".to_string(), Some(format!("r'{}'", app_cmds.cmds_root()?.display()))); + overrides + } + )); + Ok(()) + } else { + // This case shouldn't happen as any non-valid command should be + // caught previously by clap and a non-command invocation should + // print the help message. + unreachable!("Expected an APP command but none was found!"); } - if let Some(pathspecs) = sub.values_of("pathspecs") { - let p = pathspecs - .map(|ps| format!("\"{}\"", ps)) - .collect::>(); - args.insert("pathspecs", format!("[{}]", p.join(","))); - } - args.insert( - "msg", - format!("\"{}\"", sub.value_of("message").unwrap().to_string()), - ); - _run("app:checkin", sub, Some(args)); - } - "package" => { - _run("app:package", sub, None); - } - "publish" => { - let mut args = IndexMap::new(); - if sub.is_present("dry-run") { - args.insert("dry-run", "True".to_string()); - } - if let Some(v) = sub.value_of("version") { - args.insert("version", format!("\"{}\"", v.to_string())); - } - if let Some(r) = sub.value_of("release-note") { - args.insert("release-note", format!("\"{}\"", r.to_string())); - } - if let Some(t) = sub.value_of("release-title") { - args.insert("release-title", format!("\"{}\"", t.to_string())); - } - if sub.is_present("no-release-title") { - args.insert("no-release-title", "True".to_string()); - } - _run("app:publish", sub, Some(args)); - } - "run_publish_checks" => { - _run("app:run_publish_checks", sub, None); } _ => unreachable!(), diff --git a/rust/origen/cli/src/commands/aux_cmds.rs b/rust/origen/cli/src/commands/aux_cmds.rs new file mode 100644 index 00000000..191989ea --- /dev/null +++ b/rust/origen/cli/src/commands/aux_cmds.rs @@ -0,0 +1,52 @@ +use super::launch_as; +use crate::framework::{AuxCmds, build_path}; +use crate::framework::aux_cmds::{aux_ns_subcmd, add_aux_ns_helps}; +use indexmap::IndexMap; +use super::_prelude::*; + +pub const BASE_CMD: &'static str = "auxillary_commands"; + +pub (crate) fn add_helps(helps: &mut CmdHelps, aux_cmds: &AuxCmds) { + helps.add_core_cmd(BASE_CMD).set_help_msg("Interface with auxillary commands").set_as_not_extendable(); + add_aux_ns_helps(helps, aux_cmds); +} + +pub (crate) fn add_commands<'a>(app: App<'a>, helps: &'a CmdHelps, aux_commands: &'a AuxCmds, exts: &'a Extensions) -> Result> { + let mut aux_sub = helps.core_cmd(BASE_CMD).visible_alias("aux_cmds").arg_required_else_help(true); + aux_sub = aux_ns_subcmd(aux_sub, helps, aux_commands, exts)?; + Ok(app.subcommand(aux_sub)) +} + +pub(crate) fn run(cmd: &clap::ArgMatches, mut app: &clap::App, exts: &crate::Extensions, plugins: Option<&crate::Plugins>, aux_cmds: &crate::AuxCmds) -> origen::Result<()> { + if let Some(subc) = cmd.subcommand() { + let ns_ins = aux_cmds.namespaces.get(subc.0).expect(&format!("Expected auxillary command namespace '{}' to be present, but was not found", subc.0)); + let path = build_path(&subc.1)?; + + let mut overrides = IndexMap::new(); + + let mut matches = subc.1; + let mut path_pieces: Vec = vec!(); + app = app.find_subcommand(BASE_CMD).unwrap(); + app = app.find_subcommand(subc.0).unwrap(); + while matches.subcommand_name().is_some() { + let n = matches.subcommand_name().unwrap(); + matches = matches.subcommand_matches(&n).unwrap(); + app = app.find_subcommand(n).unwrap(); + path_pieces.push(n.to_string()); + } + + launch_as("_dispatch_aux_cmd_", Some(&path_pieces), matches, app, exts.get_aux_ext(subc.0, &path), plugins, Some( + { + overrides.insert("dispatch_root".to_string(), Some(format!("r'{}'", ns_ins.root().display()))); + overrides.insert("dispatch_src".to_string(), Some(format!("r'{}'", subc.0))); + overrides + } + )); + Ok(()) + } else { + // This case shouldn't happen as any non-valid command should be + // caught previously by clap and a non-command invocation should + // print the help message. + unreachable!("Expected an AUX command but none was found!"); + } +} diff --git a/rust/origen/cli/src/commands/credentials.rs b/rust/origen/cli/src/commands/credentials.rs new file mode 100644 index 00000000..ed7719ab --- /dev/null +++ b/rust/origen/cli/src/commands/credentials.rs @@ -0,0 +1,49 @@ +use super::_prelude::*; + +pub const BASE_CMD: &'static str = "credentials"; + +gen_core_cmd_funcs!( + BASE_CMD, + "Set or clear user credentials", + { |cmd: App<'a>| { cmd.setting(AppSettings::ArgRequiredElseHelp) }}, + core_subcmd!("set", "Set the current user's password", { |cmd: App| { + cmd.arg( + Arg::new("all") + .help("Set the password for all datasets") + .action(SetArgTrue) + .required(false) + .long("all") + .short('a'), + ).arg( + Arg::new("datasets") + .help("Specify the dataset to set the password for") + .action(AppendArgs) + .required(false) + .multiple(true) + .conflicts_with("all") + .long("dataset") + .short('d'), + ) + }}), + core_subcmd!("clear", "Clear the user's password", { |cmd: App| { + cmd.arg( + Arg::new("all") + .help("Clear the password for all datasets") + .action(SetArgTrue) + .required(false) + .long("all") + .short('a'), + ).arg( + Arg::new("datasets") + .help("Specify the dataset to clear the password for") + .action(AppendArgs) + .required(false) + .conflicts_with("all") + .multiple(true) + .long("datasets") + .short('d'), + ) + }}) +); + +gen_simple_run_func!(); diff --git a/rust/origen/cli/src/commands/build.rs b/rust/origen/cli/src/commands/develop_origen/build.rs similarity index 88% rename from rust/origen/cli/src/commands/build.rs rename to rust/origen/cli/src/commands/develop_origen/build.rs index 36072431..aa8c54a7 100644 --- a/rust/origen/cli/src/commands/build.rs +++ b/rust/origen/cli/src/commands/develop_origen/build.rs @@ -1,7 +1,6 @@ -use crate::CommandHelp; -use clap::{App, Arg, ArgMatches, SubCommand}; +use clap::{App, Arg, ArgMatches}; use origen::core::file_handler::File; -use origen::utility::version::Version; +use origen_metal::utils::version::Version; use origen::{Result, STATUS}; use origen_metal::utils::file::with_dir; use origen_metal::utils::file::{cd, symlink}; @@ -10,84 +9,70 @@ use sha2::{Digest, Sha256}; use std::path::Path; use std::process::Command; -pub fn define<'a>(app: App<'a, 'a>) -> (App<'a, 'a>, CommandHelp) { - let help = match STATUS.is_origen_present { - true => "Build and publish Origen, builds the pyapi Rust package by default", - false => "Build Origen", - }; - - let mut cmd = SubCommand::with_name("build").about(help).arg( - Arg::with_name("cli") - .long("cli") - .required(false) - .takes_value(false) - .display_order(1) - .help("Build the CLI (instead of the Python API)"), - ); - - if STATUS.is_origen_present { - cmd = cmd +use crate::commands::_prelude::*; +pub const BASE_CMD: &'static str = "build"; + +pub (crate) fn build_cmd<'a>() -> SubCmd<'a> { + core_subcmd__no_exts__no_app_opts!( + BASE_CMD, + "Build and publish Origen, builds the pyapi Rust package by default", + { |cmd: App| { + cmd.visible_alias("b") + .arg( + Arg::new("cli") + .long("cli") + .required(false) + .action(SetArgTrue) + .help("Build the CLI (instead of the Python API)"), + ) .arg( - Arg::with_name("release") + Arg::new("release") .long("release") .required(false) - .takes_value(false) - .display_order(1) + .action(SetArgTrue) .help("Build a release version (applied by default with --publish and only applicable to Rust builds)"), ) .arg( - Arg::with_name("target") + Arg::new("target") .long("target") .required(false) - .takes_value(true) - .display_order(1) + .action(SetArg) .help("The Rust h/ware target (passed directly to Cargo build)"), ) .arg( - Arg::with_name("publish") + Arg::new("publish") .long("publish") .required(false) - .takes_value(false) - .display_order(1) + .action(SetArgTrue) .help("Publish packages (e.g. to PyPI) after building"), ) .arg( - Arg::with_name("dry_run") + Arg::new("dry_run") .long("dry-run") .required(false) - .takes_value(false) - .display_order(1) + .action(SetArgTrue) .help("Use with --publish to perform a full dry run of the publishable build without actually publishing it"), ) .arg( - Arg::with_name("version") + Arg::new("version") .long("version") .required(false) - .takes_value(true) + .action(SetArg) .value_name("VERSION") - .display_order(1) .help("Set the version (of all components) to the given value"), ) .arg( - Arg::with_name("metal") + Arg::new("metal") .long("metal") - .takes_value(false) - .display_order(1) + .action(SetArgTrue) .help("Build the metal_pyapi"), - ); - } - - let help = CommandHelp { - name: "build".to_string(), - help: help.to_string(), - shortcut: None, - }; - - (app.subcommand(cmd), help) + ) + }} + ) } -pub fn run(matches: &ArgMatches) -> Result<()> { - if let Some(v) = matches.value_of("version") { +pub(crate) fn run(invocation: &clap::ArgMatches) -> Result<()> { + if let Some(v) = invocation.get_one::<&str>("version") { let mut version_bad = false; let version; match Version::new_semver(v) { @@ -148,7 +133,7 @@ pub fn run(matches: &ArgMatches) -> Result<()> { // Build the latest CLI, this can be requested from an Origen workspace or an app workspace that is // locally referencing an Origen workspace - if matches.is_present("cli") { + if *invocation.get_one("cli").unwrap() { cd(&STATUS .origen_wksp_root .join("rust") @@ -156,7 +141,7 @@ pub fn run(matches: &ArgMatches) -> Result<()> { .join("cli"))?; display!(""); let mut args = vec!["build"]; - if matches.is_present("release") || matches.is_present("publish") { + if *invocation.get_one("release").unwrap() || *invocation.get_one("publish").unwrap() { args.push("--release"); } Command::new("cargo") @@ -166,13 +151,13 @@ pub fn run(matches: &ArgMatches) -> Result<()> { display!(""); // Build the metal_pyapi - } else if matches.is_present("metal") { - build_metal(matches)?; + } else if *invocation.get_one("metal").unwrap() { + build_metal(invocation)?; // Build the PyAPI by default } else { // A publish build will also build the origen_pyapi Python package and // publish it to PyPI, only available within an Origen workspace - if matches.is_present("publish") { + if *invocation.get_one("publish").unwrap() { let wheel_dir = &STATUS .origen_wksp_root .join("rust") @@ -212,7 +197,7 @@ pub fn run(matches: &ArgMatches) -> Result<()> { change_pyapi_wheel_version(&wheel_dir, &old, &new); } - if matches.is_present("publish") && !matches.is_present("dry_run") { + if *invocation.get_one("publish").unwrap() && !invocation.get_one::("dry_run").unwrap() { let pypi_token = std::env::var("ORIGEN_PYPI_TOKEN").expect("ORIGEN_PYPI_TOKEN is not defined"); @@ -237,7 +222,7 @@ pub fn run(matches: &ArgMatches) -> Result<()> { // A standard (non-published) build, this can be requested from an Origen workspace or an app workspace that // is locally referencing an Origen workspace } else { - build_metal(matches)?; + build_metal(invocation)?; let pyapi_dir = STATUS.origen_wksp_root.join("rust").join("pyapi"); cd(&pyapi_dir)?; display!(""); @@ -246,11 +231,11 @@ pub fn run(matches: &ArgMatches) -> Result<()> { let mut target = "debug"; let mut arch_target = None; - if matches.is_present("release") { + if *invocation.get_one("release").unwrap() { args.push("--release"); target = "release"; } - if let Some(t) = matches.value_of("target") { + if let Some(t) = invocation.get_one::<&str>("target") { args.push("--target"); args.push(t); arch_target = Some(t); @@ -311,7 +296,7 @@ pub fn run(matches: &ArgMatches) -> Result<()> { Ok(()) } -fn build_metal(matches: &ArgMatches) -> Result<()> { +fn build_metal(invocation: &ArgMatches) -> Result<()> { let pyapi_dir = &STATUS.origen_wksp_root.join("rust").join("pyapi_metal"); cd(&pyapi_dir)?; @@ -319,11 +304,11 @@ fn build_metal(matches: &ArgMatches) -> Result<()> { let mut target = "debug"; let mut arch_target = None; - if matches.is_present("release") { + if *invocation.get_one("release").unwrap() { args.push("--release"); target = "release"; } - if let Some(t) = matches.value_of("target") { + if let Some(t) = invocation.get_one::<&str>("target") { args.push("--target"); args.push(t); arch_target = Some(t); diff --git a/rust/origen/cli/src/commands/fmt.rs b/rust/origen/cli/src/commands/develop_origen/fmt.rs similarity index 88% rename from rust/origen/cli/src/commands/fmt.rs rename to rust/origen/cli/src/commands/develop_origen/fmt.rs index 76ed21b5..05716a4d 100644 --- a/rust/origen/cli/src/commands/fmt.rs +++ b/rust/origen/cli/src/commands/develop_origen/fmt.rs @@ -9,7 +9,18 @@ use std::io::Write; use std::path::Path; use std::process::Command; -pub fn run() -> Result<()> { +use crate::commands::_prelude::*; +pub const BASE_CMD: &'static str = "fmt"; + +pub (crate) fn fmt_cmd<'a>() -> SubCmd<'a> { + core_subcmd__no_exts__no_app_opts!( + BASE_CMD, + "Nicely format all Rust and Python files", + { |cmd| { cmd } } + ) +} + +pub(crate) fn run() -> Result<()> { let orig_dir = env::current_dir().expect("Couldn't read the PWD"); if STATUS.is_origen_present { diff --git a/rust/origen/cli/src/commands/develop_origen/mod.rs b/rust/origen/cli/src/commands/develop_origen/mod.rs new file mode 100644 index 00000000..32bc3073 --- /dev/null +++ b/rust/origen/cli/src/commands/develop_origen/mod.rs @@ -0,0 +1,46 @@ +mod build; +mod fmt; +mod update_supported_python; +mod publish; + +use origen::{Result, STATUS}; +use super::_prelude::*; +pub const BASE_CMD: &'static str = "develop_origen"; + +use std::path::PathBuf; + +lazy_static! { + static ref GH_OWNER: &'static str = "Origen-SDK"; + static ref GH_REPO: &'static str = "o2"; + static ref PUBLISH_BRANCH: &'static str = "master"; + static ref PUBLISH_WORKFLOW: &'static str = "publish.yml"; + static ref ORIGEN_OM_REQ_PATH: [&'static str; 4] = ["tool", "poetry", "dependencies", "origen_metal"]; + static ref OM_PYPI_PKG_NAME: &'static str = "origen-metal"; + static ref ORIGEN_PYPI_PKG_NAME: &'static str = "origen"; + static ref OM_PYPROJECT_PATH: PathBuf = STATUS.origen_wksp_root.join("python").join("origen_metal").join("pyproject.toml"); + static ref ORIGEN_PYPROJECT_PATH: PathBuf = STATUS.origen_wksp_root.join("python").join("origen").join("pyproject.toml"); + static ref CLI_TOML_LOC: PathBuf = STATUS.origen_wksp_root.join("rust").join("origen").join("cli").join("cargo.toml"); +} + +gen_core_cmd_funcs__no_exts__no_app_opts!( + BASE_CMD, + "Commands to assist with Origen core development", + { |cmd: App<'a>| { + cmd.arg_required_else_help(true).visible_alias("origen") + }}, + build::build_cmd(), + fmt::fmt_cmd(), + update_supported_python::update_supported_python_cmd(), + publish::publish_cmd() +); + +pub(crate) fn run(invocation: &clap::ArgMatches) -> Result<()> { + let (n, subcmd) = invocation.subcommand().unwrap(); + match n { + build::BASE_CMD => build::run(subcmd), + fmt::BASE_CMD => fmt::run(), + update_supported_python::BASE_CMD => update_supported_python::run(subcmd), + publish::BASE_CMD => publish::run(subcmd), + _ => unreachable_invalid_subc!(n) + } +} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/develop_origen/publish.rs b/rust/origen/cli/src/commands/develop_origen/publish.rs new file mode 100644 index 00000000..83f814f3 --- /dev/null +++ b/rust/origen/cli/src/commands/develop_origen/publish.rs @@ -0,0 +1,457 @@ +use crate::commands::_prelude::*; +use crate::STATUS; +use origen_metal::utils::version::{Version, ReleaseType, VersionWithTOML}; +use origen::utility::github::{dispatch_workflow, get_latest_workflow_dispatch, get_branch_protections, lock_branch, unlock_branch, BranchProtections}; +use origen_metal::utils::terminal::confirm_with_user; +use origen_metal::utils::revision_control::RevisionControlAPI; +use std::process::exit; +use origen_metal::utils::terminal::{redln, greenln, yellowln}; +use std::thread; +use std::time::Duration; +use super::{OM_PYPI_PKG_NAME, ORIGEN_PYPI_PKG_NAME}; +use origen_metal::utils::pypi::{is_package_version_available, is_package_version_available_on_test_server}; + +pub const BASE_CMD: &'static str = "publish"; + +pub const USE_CURRENT: &'static str = "current"; +pub const NO_RELEASE: &'static str = "none"; +const RELEASE_TYPES: [&str; 6] = [NO_RELEASE, USE_CURRENT, "major", "minor", "patch", "dev"]; + +pub (crate) fn publish_cmd<'a>() -> SubCmd<'a> { + let subc = core_subcmd__no_exts__no_app_opts!( + BASE_CMD, + "Release Origen and/or Origen Metal Rust Libraries and/or Python Packages", + { |cmd: App| { + // Release types/version updates + cmd.arg( + Arg::new("origen_release_type") + .long("origen_release_type") + .visible_alias("origen") + .value_parser(RELEASE_TYPES) + .takes_value(true) + .help("Specify Origen Python Package's release type") + ) + .arg( + Arg::new("om_release_type") + .long("origen_metal_release_type") + .visible_alias("om") + .visible_alias("metal") + .value_parser(RELEASE_TYPES) + .takes_value(true) + .help("Specify Origen Metal Python Package's release type") + ) + .arg( + Arg::new("cli_release_type") + .long("cli_release_type") + .visible_alias("cli") + .value_parser(RELEASE_TYPES) + .takes_value(true) + .help("Specify Origen's CLI release type") + ) + + // Release targets + .arg( + Arg::new("release_to_pypi_test") + .long("release_to_pypi_test") + .alias("pypi_test") + .action(SetArgTrue) + .help("Release to PyPi test instance (https://test.pypi.org/)") + ) + .arg( + Arg::new("no_pypi_release") + .long("no_pypi_release") + .action(SetArgTrue) + .help("Do NOT release to pypi, even if Origen or OM versions are updated") + ) + .arg( + Arg::new("github_release") + .long("github_release") + .visible_alias("gh_rel") + .action(SetArgTrue) + .help("Create a GitHub release (https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases)") + ) + + .arg( + Arg::new("no_bump_origen_om_req") + .long("no_bump_origen_om_req") + .visible_alias("no_bump_o_req") + .action(SetArgTrue) + .help("Do not bump Origen's OM requirement") + ) + + .arg( + Arg::new("version_update_only") + .long("version_update_only") + .visible_alias("version-update-only") + .visible_alias("versions_only") + .visible_alias("versions-only") + .action(SetArgTrue) + .help("Only updates the version files. Does not check in or launch publishing action.") + .conflicts_with("release_to_pypi_test") + .conflicts_with("no_pypi_release") + .conflicts_with("github_release") + ) + .arg( + Arg::new("allow_local_changes") + .long("allow_local_changes") + .alias("allow-local-changes") + .action(SetArgTrue) + .help("Allow publishing even with local changes") + ) + }}, + core_subcmd__no_exts__no_app_opts!( + "monitor", + "Monitor the most recent/running publishing workflow run", + { |cmd: App| { + cmd.visible_alias("m") + }} + ) + ); + subc +} + +pub(crate) fn run(invocation: &clap::ArgMatches) -> Result<()> { + displayln!("Retrieving most recent publish workflow run..."); + let last_pub_run = get_latest_workflow_dispatch(*super::GH_OWNER, *super::GH_REPO, Some(*super::PUBLISH_WORKFLOW))?; + if let Some((n, _subcmd)) = invocation.subcommand() { + match n { + "monitor" => { + displayln!("Most Recent Publish Workflow:"); + displayln!(" Status: {}{}", last_pub_run.status, { + if let Some(c) = last_pub_run.conclusion { + format!(" ({})", c) + } else { + "".to_string() + } + }); + displayln!(" Started On: {}", last_pub_run.run_started_at); + displayln!(" Started By: {}", last_pub_run.triggering_actor.login); + displayln!(" Webview: {}", last_pub_run.html_url); + return Ok(()); + } + _ => unreachable_invalid_subc!(n) + } + } + + displayln!("Checking that no publishing actions are currently running..."); + if !last_pub_run.completed() { + redln("A publish workflow is already running! Cannot start a new publish action."); + redln(&format!(" Running action started by {} at {}", last_pub_run.triggering_actor.login, last_pub_run.created_at)); + redln(&format!(" {}", last_pub_run.html_url)); + exit(1); + } else { + greenln("No publish workflows currently running!"); + } + + // Lock master branch + displayln!("Locking branch '{}' while publishing...", *super::PUBLISH_BRANCH); + lock_publish_branch(true)?; + + match 'checks: { + // Check currently on master branch with attached HEAD + displayln!("Checking workspace is on the master branch with attached HEAD..."); + let git = origen_metal::utils::revision_control::RevisionControl::git( + &STATUS.origen_wksp_root, + vec!("git@github.com:Origen-SDK/o2.git"), + None + ); + if !git.on_branch("master")? { + redln("Publishing must be done on the master branch!"); + break 'checks Ok(false) + } else { + greenln("On master branch with attached HEAD"); + } + + // Ensure no local changes + let status = git.status(None)?; + status.summarize(); + if *invocation.get_one::("allow_local_changes").unwrap() { + yellowln("Allowing releases with local changes..."); + } else { + if status.is_modified() { + redln("Changes found in workspace. Please check in your changes or stash them before rerunning"); + break 'checks Ok(false); + } + } + + // Ensure up-to-date with remote + git.fetch(None)?; + let latest = git.confirm_latest_ref(*super::PUBLISH_BRANCH)?; + if !latest.0 { + redln(&format!("Current ref does not match latest ref for master branch ({} vs. {})", latest.1[0], latest.1[1])); + break 'checks Ok(false); + } + + // TODO PublishO2 Ensure a regression test passed with this commit + + // Get current versions + let mut py_om_ver = Version::from_pyproject_with_toml_handle(super::OM_PYPROJECT_PATH.clone())?; + let mut py_origen_ver = Version::from_pyproject_with_toml_handle(super::ORIGEN_PYPROJECT_PATH.clone())?; + let mut cli_ver = Version::from_cargo_with_toml_handle(super::CLI_TOML_LOC.clone())?; + + // Extract release types + fn extract_release(invoc: &clap::ArgMatches, cli_name: &str, ver: &mut VersionWithTOML) -> Result { + if let Some(rel_type) = invoc.get_one::(cli_name) { + match rel_type.as_str() { + USE_CURRENT => Ok(true), + NO_RELEASE => Ok(false), + _ => { + ver.increment(ReleaseType::try_from(rel_type.as_str())?)?; + Ok(true) + } + } + } else { + Ok(false) + } + } + let release_py_om = extract_release(invocation, "om_release_type", &mut py_om_ver)?; + let release_py_origen = extract_release(invocation, "origen_release_type", &mut py_origen_ver)?; + let release_cli = extract_release(invocation, "cli_release_type", &mut cli_ver)?; + + // Bump releases if needed and summarize to user + fn summarize_release(name: &str, release: bool, ver: &VersionWithTOML) -> bool { + if release { + if ver.was_version_updated() { + displayln!( + "{}: Releasing '{}' Version: {} (from {})", + name, + ver.rel_type().expect("Expected version should have been updated"), + ver.version(), + ver.orig_version() + ); + true + } else { + displayln!("{}: Releasing Current Version: {}", ver.version(), name); + false + } + } else { + displayln!("{}: No release", name); + false + } + } + displayln!("Release Summary:"); + let update_om_package = summarize_release("Origen Metal Python Package", release_py_om, &py_om_ver); + let update_origen_package = summarize_release("Origen Python Package", release_py_origen, &py_origen_ver); + let update_cli = summarize_release("Origen CLI", release_cli, &cli_ver); + let new_req = { + if update_origen_package && !*invocation.get_one::("no_bump_origen_om_req").unwrap() { + Some(format!("~{}",py_om_ver.version().to_string())) + } else { + None + } + }; + if let Some(new) = new_req.as_ref() { + let old_req = py_origen_ver.get_other(&*super::ORIGEN_OM_REQ_PATH)?.to_string(); + displayln!("Origen's OM requirement: Updating to '{}' (from '{}')", new, old_req); + + // A new Origen version would be pushed, but no Origen version increment was found. + if !release_py_origen { + yellowln("Origen's OM version requirement would be updated but no Origen release was indicated"); + if !confirm_with_user(Some("Proceed without an Origen release?"))? { + displayln!("Exiting without sending release request..."); + break 'checks Ok(false); + } + } + } else { + displayln!("Origen's OM requirement: No update to Origen's OM minimum version"); + } + + // Check if the CLI was updated, but no Origen version update. + if !release_py_origen && update_cli { + yellowln("The CLI was updated but no Origen release was indicated"); + if !confirm_with_user(Some("Proceed without an Origen release?"))? { + displayln!("Exiting without sending release request..."); + break 'checks Ok(false); + } + } + + if !confirm_with_user(Some("Proceed with release?"))? { + displayln!("Exiting without sending release request..."); + break 'checks Ok(false); + } + + // Ensure the proposed versions are available to release + // let release_to_pypi = (!invocation.get_one::("no_pypi_release").unwrap() || invocation.get_one::("force_pypi_release").unwrap()) && (update_origen_package || update_om_package); + let release_to_pypi = (!invocation.get_one::("no_pypi_release").unwrap()) && (release_py_origen || release_py_om); + let release_to_pypi_test = *invocation.get_one::("release_to_pypi_test").unwrap() && (release_py_origen || release_py_om); + if release_to_pypi && release_py_om { + displayln!("Checking that OM version '{}' is available...", py_om_ver.version()); + if !is_package_version_available(*OM_PYPI_PKG_NAME, py_om_ver.version().to_string())? { + redln(&format!( + "Version '{}' is already in use for PyPi package '{}'. Cannot release duplicate version.", + py_om_ver.version(), + *OM_PYPI_PKG_NAME + )); + break 'checks Ok(false); + } + greenln(&format!("Version '{}' is available!", py_om_ver.version())); + } + if release_to_pypi_test && release_py_om { + displayln!("Checking that OM version '{}' is available on the test server...", py_om_ver.version()); + if !is_package_version_available_on_test_server(*OM_PYPI_PKG_NAME, py_om_ver.version().to_string())? { + redln(&format!( + "Version '{}' is already in use for PyPi test server package '{}'. Cannot release duplicate version.", + py_om_ver.version(), + *OM_PYPI_PKG_NAME + )); + } + greenln(&format!("Version '{}' is available on the test server!", py_om_ver.version())); + } + if release_to_pypi && release_py_origen { + displayln!("Checking that Origen version '{}' is available...", py_origen_ver.version()); + if !is_package_version_available(*ORIGEN_PYPI_PKG_NAME, py_origen_ver.version().to_string())? { + redln(&format!( + "Version '{}' is already in use for PyPi package '{}'. Cannot release duplicate version.", + py_origen_ver.version(), + *ORIGEN_PYPI_PKG_NAME + )); + break 'checks Ok(false); + } + greenln(&format!("Version '{}' is available!", py_origen_ver.version())); + } + if release_to_pypi_test && release_py_origen { + displayln!("Checking that Origen version '{}' is available on the test server...", py_origen_ver.version()); + if !is_package_version_available_on_test_server(*ORIGEN_PYPI_PKG_NAME, py_origen_ver.version().to_string())? { + redln(&format!( + "Version '{}' is already in use for PyPi test server package '{}'. Cannot release duplicate version.", + py_origen_ver.version(), + *ORIGEN_PYPI_PKG_NAME + )); + } + greenln(&format!("Version '{}' is available on the test server!", py_origen_ver.version())); + } + + // Update the TOMLs + // Make sure all versions updated successfully before any checking in + fn update_toml(should_update: bool, ver: &mut VersionWithTOML) -> Result<()> { + if should_update { + ver.write()?; + displayln!("Updated version in {}", ver.source().display()); + } + Ok(()) + } + displayln!("Updating versions in TOML files..."); + update_toml(update_om_package, &mut py_om_ver)?; + if let Some(new) = new_req.as_ref() { + py_origen_ver.set_other(&*super::ORIGEN_OM_REQ_PATH, new)?; + } + update_toml(update_origen_package, &mut py_origen_ver)?; + update_toml(update_cli, &mut cli_ver)?; + + if *invocation.get_one::("version_update_only").unwrap() { + displayln!("Stopping release after version update..."); + break 'checks Ok(false); + } else { + let mut to_checkin = vec!(); + if update_om_package { + displayln!("Checking in OM version at: '{}'", py_om_ver.source().display()); + to_checkin.push(py_om_ver.source().as_path()); + } + if update_origen_package { + displayln!("Checking in OM version at: '{}'", py_origen_ver.source().display()); + to_checkin.push(py_origen_ver.source().as_path()); + } + if update_cli { + displayln!("Checking in OM version at: '{}'", cli_ver.source().display()); + to_checkin.push(cli_ver.source().as_path()); + } + if to_checkin.is_empty() { + displayln!("No version files to check in..."); + } else { + displayln!("Committing and pushing new version files..."); + unlock_publish_branch(true)?; + git.checkin(Some(to_checkin), "Updated version files for next release", false)?; + lock_publish_branch(true)?; + } + } + + // Send Github actions request to build and release + let mut inputs = indexmap::IndexMap::new(); + inputs.insert("origen_metal_python_package", release_py_om.to_string()); + inputs.insert("origen_python_package", release_py_origen.to_string()); + inputs.insert("publish_pypi", release_to_pypi.to_string()); + inputs.insert("publish_pypi_test", invocation.get_one::("release_to_pypi_test").unwrap().to_string()); + inputs.insert("publish_github_release", invocation.get_one::("github_release").unwrap().to_string()); + displayln!("Request GitHub Actions to build and release with..."); + for (k, v) in &inputs { + displayln!(" {}: {}", k, v); + } + if !confirm_with_user(Some("Send publish workflow request?"))? { + displayln!("Exiting without sending release request..."); + break 'checks Ok(false); + } + dispatch_workflow(*super::GH_OWNER, *super::GH_REPO, *super::PUBLISH_WORKFLOW, *super::PUBLISH_BRANCH, Some(inputs))?; + + Ok::(true) + } { + Ok(publishing) => { + // Unlock branch + unlock_publish_branch(true)?; + if publishing { + // Publishing started. Try to find the job and provide the link + displayln!("Publishing workflow requested. Gathering link..."); + 'wait_for_publish_run: { + for i in 0..10 { + let pub_run = get_latest_workflow_dispatch(*super::GH_OWNER, *super::GH_REPO, Some(*super::PUBLISH_WORKFLOW))?; + if last_pub_run.id != pub_run.id { + displayln!("Publishing workflow started. Use 'origen develop_origen publish monitor' or this link to monitor the progression:\n{}", &pub_run.html_url); + break 'wait_for_publish_run; + } + displayln!("Found same job ID as previous run. Retrying in 5 seconds... ({} of 10)", i+1); + thread::sleep(Duration::from_secs(5)); + } + redln("Did not find an updated publish run. Please check the workflow run manually."); + } + } else { + displayln!("No publishing workflow initiated"); + } + Ok(()) + }, + Err(e) => { + // Log the error, unlock the branch, and return the error + redln("Encountered an error during publishing checks:"); + redln(&format!("{}", e)); + unlock_publish_branch(true)?; + bail!("{}", e); + } + } +} + +fn unlock_publish_branch(log_errors: bool) -> Result { + displayln!("Unlocking branch '{}'...", *super::PUBLISH_BRANCH); + match unlock_branch(*super::GH_OWNER, *super::GH_REPO, *super::PUBLISH_BRANCH) { + Ok(res) => { + greenln("Branch unlocked!"); + Ok(res) + }, + Err(e) => { + if log_errors { + redln("Error unlocking branch '{}'. Branch must be manually unlocked. Received Error:"); + redln(&format!("{}", e)); + } + Err(e) + } + } +} + +fn lock_publish_branch(log_errors: bool) -> Result { + match get_branch_protections(*super::GH_OWNER, *super::GH_REPO, *super::PUBLISH_BRANCH) { + Ok(res) => { + if res.is_locked() { + let m = format!("Branch '{}' is unexpectedly locked!", *super::PUBLISH_BRANCH); + redln(&m); + bail!(&m); + } + let retn = lock_branch(*super::GH_OWNER, *super::GH_REPO, *super::PUBLISH_BRANCH)?; + greenln("Branch locked!"); + Ok(retn) + }, + Err(e) => { + if log_errors { + redln(&format!("Error locking branch '{}':", *super::PUBLISH_BRANCH)); + redln(&format!("{}", e)); + } + Err(e) + } + } +} diff --git a/rust/origen/cli/src/commands/develop_origen/update_supported_python.rs b/rust/origen/cli/src/commands/develop_origen/update_supported_python.rs new file mode 100644 index 00000000..bbe33adf --- /dev/null +++ b/rust/origen/cli/src/commands/develop_origen/update_supported_python.rs @@ -0,0 +1,92 @@ +use std::path::Path; +use std::fs::File; +use std::io::Write; +use crate::STATUS; +use crate::commands::_prelude::*; +pub const BASE_CMD: &'static str = "update_supported_python"; + +pub (crate) fn update_supported_python_cmd<'a>() -> SubCmd<'a> { + core_subcmd__no_exts__no_app_opts!( + BASE_CMD, + "Update supported python versions in all pyproject files", + { |cmd| { + cmd.arg(Arg::new("min_version") + .takes_value(true) + .required(true) + ) + .arg(Arg::new("non_inclusive_max_version") + .takes_value(true) + .required(true) + ) + } } + ) +} + +pub(crate) fn run(invocation: &clap::ArgMatches) -> Result<()> { + let min = invocation.get_one::("min_version").unwrap(); + let max = invocation.get_one::("non_inclusive_max_version").unwrap(); + let version_str = format!("python = \">={min},<{max}\""); + let mv_min = min.split('.').collect::>()[1].parse::()?; + let max_parts = max.split('.').collect::>(); + let mv_max; + if max_parts.len() == 2 { + mv_max = max_parts[1].parse::()? - 1; + } else { + mv_max = max_parts[1].parse::()?; + } + + // Update pyprojects + // origen/metal pyproject + let p = &STATUS.origen_wksp_root.join("python"); + update_pyproject(&p.join("origen_metal"), &version_str)?; + update_pyproject(&p.join("origen"),&version_str)?; + + // Various app pyprojects, outside of no-workspace + let p = &STATUS.origen_wksp_root.join("test_apps"); + update_pyproject(&p.join("pl_ext_cmds"),&version_str)?; + update_pyproject(&p.join("python_app"),&version_str)?; + update_pyproject(&p.join("python_no_app"),&version_str)?; + update_pyproject(&p.join("python_plugin"),&version_str)?; + update_pyproject(&p.join("python_plugin_no_cmds"),&version_str)?; + update_pyproject(&p.join("python_plugin_the_second"),&version_str)?; + update_pyproject(&p.join("test_apps_shared_test_helpers"),&version_str)?; + + // No-workspace pyprojects + let p = &STATUS.origen_wksp_root.join("test_apps/no_workspace"); + update_pyproject(&p.join("user_install"),&version_str)?; + update_pyproject(&p.join("templates"),&version_str)?; + + // Write rust CLI python settings + let p = &STATUS.origen_wksp_root.join("rust/origen/cli/src/_generated/python.rs"); + println!("Creating python rs file {}", p.display()); + let mut f = File::create(p)?; + f.write_fmt(format_args!("// THIS IS AN AUTO GENERATED FILE FROM CMD {}\n", BASE_CMD))?; + f.write_fmt(format_args!("pub const MIN_PYTHON_VERSION: &str = \"{}\";\n", min))?; + f.write(b"pub const PYTHONS: &[&str] = &[\n")?; + f.write(b" \"python\",\n")?; + f.write(b" \"python3\",\n")?; + for v in mv_min..(mv_max+1) { + f.write_fmt(format_args!(" \"python3.{}\",\n", v))?; + } + f.write(b"];\n")?; + + // TODO O2DevScripts Need to add running 'poetry lock --no-update' in python_app, python_no_app, no_workspace/user_install to update Python versions in lock files. + + Ok(()) +} + +fn update_pyproject(path: &Path, version_str: &str) -> Result<()> { + let n = path.join("pyproject.toml"); + println!("Updating pyproject: {}", n.display()); + + let content = std::fs::read_to_string(&n)?; + let mut lines: Vec<&str> = content.split("\n").collect(); + let i = lines.iter().position( |l| l.starts_with("python = ")).unwrap(); + lines[i] = version_str; + + // Write out file + let mut f = File::create(n)?; + f.write_all(lines.join("\n").as_bytes())?; + + Ok(()) +} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/env.rs b/rust/origen/cli/src/commands/env.rs index 3514e662..df1cd557 100644 --- a/rust/origen/cli/src/commands/env.rs +++ b/rust/origen/cli/src/commands/env.rs @@ -1,10 +1,9 @@ //! Some notes on how Origen's Python environment is setup and invoked: //! - +use super::_prelude::*; extern crate time; use crate::python::{poetry_version, MIN_PYTHON_VERSION, PYTHON_CONFIG}; -use clap::ArgMatches; use online::online; use origen::core::status::search_for; use origen::core::term::*; @@ -13,11 +12,27 @@ use regex::Regex; use semver::VersionReq; use std::process::Command; -static MINIMUM_PIP_VERSION: &str = "22.0.4"; -static MINIMUM_POETRY_VERSION: &str = "1.1.14"; - -pub fn run(matches: &ArgMatches) { - match matches.subcommand_name() { +pub const BASE_CMD: &'static str = "env"; + +static MINIMUM_PIP_VERSION: &str = "23.1.2"; +static MINIMUM_POETRY_VERSION: &str = "1.3.2"; + +gen_core_cmd_funcs__no_exts__no_app_opts!( + BASE_CMD, + "Manage your application's Origen/Python environment (dependencies, etc.)", + { |cmd: App<'a>| {cmd.arg_required_else_help(true)}}, + core_subcmd__no_exts__no_app_opts!("setup", "Setup your application's Python environment for the first time in a new workspace, this will install dependencies per the poetry.lock file", { |cmd: App| { + cmd.arg(Arg::new("origen") + .long("origen") + .help("The path to a local version of Origen to use (to develop Origen)") + .action(SetArg) + ) + }}), + core_subcmd__no_exts__no_app_opts!("update", "Update your application's Python dependencies according to the latest pyproject.toml file", { |cmd: App| {cmd}}) +); + +pub fn run(invocation: &clap::ArgMatches) -> origen::Result<()> { + match invocation.subcommand_name() { Some("update") => { install_poetry(); let _ = PYTHON_CONFIG.poetry_command().arg("update").status(); @@ -30,10 +45,10 @@ pub fn run(matches: &ArgMatches) { let mut origen_source_changed = false; let mut run_origen_build = false; - let origen_root = match matches + let origen_root = match invocation .subcommand_matches("setup") .unwrap() - .value_of("origen") + .get_one::<&str>("origen") { None => None, Some(x) => { @@ -231,6 +246,7 @@ pub fn run(matches: &ArgMatches) { None => unreachable!(), _ => unreachable!(), } + Ok(()) } fn install_poetry() { diff --git a/rust/origen/cli/src/commands/eval.rs b/rust/origen/cli/src/commands/eval.rs new file mode 100644 index 00000000..7f3a2339 --- /dev/null +++ b/rust/origen/cli/src/commands/eval.rs @@ -0,0 +1,34 @@ +use super::_prelude::*; + +pub const BASE_CMD: &'static str = "eval"; + +gen_core_cmd_funcs!( + BASE_CMD, + "Evaluates statements in an Origen context", + { |cmd: App<'a>| { + cmd.visible_alias("e") + .arg( + Arg::new("code") + .help("Statements to evaluate") + .action(AppendArgs) + .value_name("CODE") + .multiple(true) + .required_unless_present("scripts") + ) + .arg( + Arg::new("scripts") + .help("Evaluate from script files") + .long("scripts") + .short('s') + .visible_alias("files") + .visible_short_alias('f') + .action(AppendArgs) + .value_name("SCRIPTS") + .multiple(true) + .use_value_delimiter(true) + .require_value_delimiter(true) + ) + }} +); + +gen_simple_run_func!(); diff --git a/rust/origen/cli/src/commands/exec.rs b/rust/origen/cli/src/commands/exec.rs index c0be71ff..c5a01d71 100644 --- a/rust/origen/cli/src/commands/exec.rs +++ b/rust/origen/cli/src/commands/exec.rs @@ -1,20 +1,54 @@ use crate::python::{add_origen_env, PYTHON_CONFIG}; +use super::_prelude::*; +use std::borrow::Cow; -pub fn run(cmd_name: &str, args: Vec<&str>) { +pub const BASE_CMD: &'static str = "exec"; +pub const EXEC_HELP: &'static str = "Execute a command within your Origen/Python environment (e.g. origen exec pytest)"; + +pub(crate) fn run_pre_phase(invocation: &clap::ArgMatches) -> Result { let mut cmd = PYTHON_CONFIG.poetry_command(); cmd.arg("run"); - cmd.arg(cmd_name); - cmd.args(&args); + let cmd_name = invocation.get_one::("cmd").unwrap(); + cmd.arg(cmd_name); + if let Some(args) = invocation.get_many::("args") { + cmd.args(args); + } + log_debug!("Running Command (from Exec): {} {}", cmd.get_program().to_string_lossy(), cmd.get_args().map( |a| a.to_string_lossy()).collect::>>().join(" ")); add_origen_env(&mut cmd); - let res = cmd - .status() - .expect("Something went wrong executing the command"); + let res = cmd.status()?; + Ok(if res.success() { 0 } else { 1 }) +} - if res.success() { - std::process::exit(0); - } else { - std::process::exit(1); - } +pub fn add_prephase_cmds<'a>(cmd: App<'a>) -> App<'a> { + cmd.subcommand(add_verbosity_opts(config_exec_cmd(Command::new(BASE_CMD)), false)) +} + +pub fn config_exec_cmd<'a>(cmd: App<'a>) -> App<'a> { + cmd + .arg( + Arg::new("cmd") + .help("The command to be run") + .action(SetArg) + .required(true) + .value_name("COMMAND") + ) + .arg( + Arg::new("args") + .help("Arguments to be passed to the command") + .action(AppendArgs) + .allow_hyphen_values(true) + .multiple(true) + .required(false) + .value_name("ARGS") + ) } + +gen_core_cmd_funcs__no_exts__no_app_opts!( + BASE_CMD, + EXEC_HELP, + { |cmd: App<'a>| { + config_exec_cmd(cmd) + }} +); diff --git a/rust/origen/cli/src/commands/generate.rs b/rust/origen/cli/src/commands/generate.rs new file mode 100644 index 00000000..4ed4a17e --- /dev/null +++ b/rust/origen/cli/src/commands/generate.rs @@ -0,0 +1,31 @@ +use crate::commands::_prelude::*; + +pub const BASE_CMD: &'static str = "generate"; + +gen_core_cmd_funcs!( + BASE_CMD, + "Generate patterns or test programs", + { |cmd: App<'a>| { + cmd.visible_alias("g") + .arg( + Arg::new("files") + .help("The name of the file(s) to be generated") + .action(AppendArgs) + .value_name("FILES") + .multiple(true) + .required(true), + ) + .arg(output_dir_opt!()) + .arg(ref_dir_opt!()) + // TODO re-add debug opt + // .arg( + // Arg::new("debug") + // .long("debug") + // .short('d') + // .help("Enable Python caller tracking for debug (takes longer to execute)") + // .action(SetArgTrue), + // ) + }} +); + +gen_simple_run_func!(); diff --git a/rust/origen/cli/src/commands/interactive.rs b/rust/origen/cli/src/commands/interactive.rs index f78f9a80..2b8f6d16 100644 --- a/rust/origen/cli/src/commands/interactive.rs +++ b/rust/origen/cli/src/commands/interactive.rs @@ -1,18 +1,13 @@ -use origen::app; -use std::fs; +use crate::commands::_prelude::*; -pub fn run(targets: Option>, mode: &Option<&str>) { - let dot_origen_dir = app().unwrap().root.join(".origen"); - if !dot_origen_dir.exists() { - let _ = fs::create_dir(&dot_origen_dir); - } - let history_file = dot_origen_dir.join("console_history"); - if !history_file.exists() { - let _ = fs::OpenOptions::new() - .create(true) - .write(true) - .open(&history_file); - } +pub const BASE_CMD: &'static str = "interactive"; - super::launch("interactive", targets, mode, None, None, None, false, None); -} +gen_core_cmd_funcs!( + BASE_CMD, + "Start an Origen console to interact with the DUT", + { |cmd: App<'a>| { + cmd.visible_alias("i") + }} +); + +gen_simple_run_func!(); diff --git a/rust/origen/cli/src/commands/mod.rs b/rust/origen/cli/src/commands/mod.rs index 7ddc96b5..2f487e46 100644 --- a/rust/origen/cli/src/commands/mod.rs +++ b/rust/origen/cli/src/commands/mod.rs @@ -1,74 +1,309 @@ pub mod app; -pub mod build; pub mod env; pub mod exec; -pub mod fmt; +// pub mod fmt; pub mod interactive; -pub mod mode; +// pub mod mode; pub mod new; -pub mod proj; -pub mod save_ref; +// pub mod proj; +// pub mod save_ref; pub mod target; +// pub mod mailer; +pub mod credentials; +pub mod develop_origen; +pub mod generate; +pub mod eval; +pub mod aux_cmds; +pub mod plugin; +pub mod plugins; +pub mod _prelude; use crate::python; +use crate::strs_to_cli_arr; + use indexmap::map::IndexMap; -use origen::{clean_mode, LOGGER}; +use origen::{LOGGER, STATUS}; // clean_mode # O1_MODE_SUPPORT clean_mode function available, or remove use std::process::exit; +use _prelude::{SetArgTrue, CountArgs}; + +use clap::{App, ArgMatches}; +use crate::framework::extensions::{Extension, ExtensionSource}; +use crate::Plugins; +use std::collections::HashMap; + +#[macro_export] +macro_rules! unreachable_invalid_subc { + ($subcmd:expr) => {{ + unreachable!("Uncaught Invalid Subcommand {} From {}", $subcmd, module_path!()) + }} +} + +#[macro_export] +macro_rules! print_subcmds_available_msg { + () => {{ + println!("Run with 'help' or '-h' to see available subcommands"); + }} +} -/// Launch the given command in Python -pub fn launch( - command: &str, - targets: Option>, - mode: &Option<&str>, - files: Option>, - output_dir: Option<&str>, - reference_dir: Option<&str>, - debug: bool, - cmd_args: Option>, -) { - let mut cmd = format!("from origen.boot import run_cmd; run_cmd('{}'", command); - - if let Some(t) = targets { - // added r prefix to the string to force python to interpret as a string literal - let _t: Vec = t.iter().map(|__t| format!("r'{}'", __t)).collect(); - cmd += &format!(", targets=[{}]", &_t.join(",")).to_string(); +#[macro_export] +macro_rules! gen_simple_run_func { + ($base_cmd: expr) => { + pub(crate) fn run(mut invocation: &clap::ArgMatches, mut cmd_def: &clap::App, exts: &crate::Extensions, plugins: Option<&crate::Plugins>) -> origen::Result<()> { + let mut path_pieces: Vec = vec!(); + cmd_def = cmd_def.find_subcommand($base_cmd).unwrap(); + if invocation.subcommand_name().is_some() { + while invocation.subcommand_name().is_some() { + let n = invocation.subcommand_name().unwrap(); + invocation = invocation.subcommand_matches(&n).unwrap(); + cmd_def = cmd_def.find_subcommand(n).unwrap(); + path_pieces.push(n.to_string()); + } + crate::commands::launch( + Some($base_cmd), + Some(&path_pieces), + invocation, + cmd_def, + exts.get_core_ext(&format!("{}.{}", $base_cmd, path_pieces.join("."))), + plugins, + None, + ); + } else { + crate::commands::launch_from_invocation( + invocation, + cmd_def, + exts.get_core_ext($base_cmd), + plugins, + ); + } + Ok(()) + } + }; + () => { + crate::gen_simple_run_func!(BASE_CMD); + } +} + +pub fn launch_as( + cmd: &str, + subcmds: Option<&Vec>, + invocation: &ArgMatches, + cmd_def: &App, + cmd_exts: Option<&Vec>, + plugins: Option<&Plugins>, + overrides: Option>>, +) -> () +{ + launch(Some(cmd), subcmds, invocation, cmd_def, cmd_exts, plugins, overrides) +} +pub fn launch_from_invocation(invocation: &ArgMatches, cmd_def: &App, cmd_exts: Option<&Vec>, plugins: Option<&Plugins>) { + launch(None, None, invocation, cmd_def, cmd_exts, plugins, None) +} + +pub fn launch(base_cmd: Option<&str>, subcmds: Option<&Vec>, invocation: &ArgMatches, cmd_def: &App, cmd_exts: Option<&Vec>, plugins: Option<&Plugins>, overrides: Option>>) { + macro_rules! as_name { + ($arg_name:expr) => {{ + if $arg_name.starts_with(crate::framework::extensions::EXT_BASE_NAME) { + $arg_name.splitn(4, ".").last().unwrap() + } else { + $arg_name + } + }} + } + + let mut args: Vec = vec!(); + let mut arg_indices: Vec = vec!(); + + let mut opt_names = HashMap::new(); + let mut ext_args: HashMap<&ExtensionSource, Vec> = HashMap::new(); + let mut ext_arg_indices: HashMap<&ExtensionSource, Vec> = HashMap::new(); + if let Some(exts) = cmd_exts { + for ext in exts { + if let Some(opts) = ext.opts.as_ref() { + for opt in opts { + opt_names.insert(opt.full_name.as_ref().unwrap().as_str(), &ext.source); + if !ext_args.contains_key(&ext.source) { + ext_args.insert(&ext.source, vec!()); + ext_arg_indices.insert(&ext.source, vec!()); + } + } + } + } } - if mode.is_some() { - let c = clean_mode(mode.unwrap()); - cmd += &format!(", mode='{}'", c).to_string(); + let mut targets = None; + + for arg in cmd_def.get_arguments() { + let arg_n= arg.get_id(); + if arg_n == "verbose" || arg_n == "verbosity_keywords" { + continue; + } + + if invocation.contains_id(arg_n) { + if arg_n == "targets" { + targets = Some(invocation.get_many::(arg_n).unwrap()); + continue; + } else if arg_n == "no_targets" { + if *invocation.get_one::(arg_n).unwrap() { + targets = Some(clap::parser::ValuesRef::default()); + } + continue; + } else if arg_n == "mode" { + // O1_MODE_SUPPORT + todo!("Mode argument is not currently supported!"); + } + + let arg_str: String; + if arg.is_takes_value_set() { + if arg.is_multiple_values_set() { + // Give to Python as an array of string values + let r = invocation.get_many::(arg_n).unwrap().map(|x| format!("\"{}\"", x)).collect::>(); + arg_str = format!("r'{}': [{}]", as_name!(arg_n), r.join(", ")); + } else { + // Give to Python a single string value + arg_str = format!("r'{}': r'{}'", as_name!(arg_n), invocation.get_one::(arg_n).unwrap()); + } + } else { + match arg.get_action() { + SetArgTrue => { + if *(invocation.get_one::(arg_n).unwrap()) { + arg_str = format!("r'{}': True", as_name!(arg_n)); + } else { + continue; + } + }, + CountArgs => { + let count = *(invocation.get_one::(arg_n).unwrap()); + if count > 0 { + arg_str = format!("r'{}': {}", as_name!(arg_n), count); + } else { + continue; + } + }, + _ => { + log_error!("Unsupported action '{:#?}' for arg '{}'", arg.get_action(), as_name!(arg_n)); //arg_str = format!("r'{}': True", arg_n) + exit(1); + } + } + } + let indices_str = format!( + "r'{}': [{}]", + as_name!(arg_n), + invocation.indices_of(arg_n).unwrap().map(|i| i.to_string()).collect::>().join(", ") + ); + if let Some(ext_src) = opt_names.get(arg_n) { + ext_args.get_mut(ext_src).unwrap().push(arg_str); + ext_arg_indices.get_mut(ext_src).unwrap().push(indices_str); + } else { + args.push(arg_str); + arg_indices.push(indices_str); + } + } } - if files.is_some() { - // added r prefix to the string to force python to interpret as a string literal - let f: Vec = files.unwrap().iter().map(|f| format!("r'{}'", f)).collect(); - cmd += &format!(", files=[{}]", f.join(",")).to_string(); + let mut cmd = format!("from origen.boot import run_cmd; run_cmd('{}'", base_cmd.unwrap_or_else(|| cmd_def.get_name())); + if let Some(subs) = subcmds.as_ref() { + cmd += &format!(", subcmds=[{}]", subs.iter().map( |s| format!("r'{}'", s) ).collect::>().join(", ")); } + cmd += &format!(", args={{{}}}, arg_indices={{{}}}", args.join(", "), arg_indices.join(", ")); - if let Some(args) = cmd_args { - cmd += ", args={"; - cmd += &args - .iter() - .map(|(arg, val)| format!("'{}': {}", arg, val)) - .collect::>() - .join(","); - cmd += "}"; + let mut app_ext_str = "".to_string(); + let mut pl_ext_str = "".to_string(); + let mut aux_ext_str = "".to_string(); + let mut app_ext_indices_str = "".to_string(); + let mut pl_ext_indices_str = "".to_string(); + let mut aux_ext_indices_str = "".to_string(); + if !ext_args.is_empty() { + for ext in ext_args { + match ext.0 { + ExtensionSource::App => { + app_ext_str = ext.1.join(", "); + app_ext_indices_str = ext_arg_indices[ext.0].join(", "); + }, + ExtensionSource::Plugin(ref pl_name) => { + pl_ext_str += &format!(", '{}': {{{}}}", pl_name, ext.1.join(", ")); + pl_ext_indices_str += &format!(", '{}': {{{}}}", pl_name, ext_arg_indices[ext.0].join(", ")); + }, + ExtensionSource::Aux(ref ns, _) => { + aux_ext_str += &format!(", '{}': {{{}}}", ns, ext.1.join(", ")); + aux_ext_indices_str += &format!(", '{}': {{{}}}", ns, ext_arg_indices[ext.0].join(", ")); + }, + } + } + if !pl_ext_str.is_empty() { + pl_ext_str = pl_ext_str[2..].to_string(); + pl_ext_indices_str = pl_ext_indices_str[2..].to_string(); + } + if !aux_ext_str.is_empty() { + aux_ext_str = aux_ext_str[2..].to_string(); + aux_ext_indices_str = aux_ext_indices_str[2..].to_string(); + } } + cmd += &format!( + concat!( + ", ext_args={{'app': {{{}}}, 'plugin': {{{}}}, 'aux': {{{}}}}}", + ", ext_arg_indices={{'app': {{{}}}, 'plugin': {{{}}}, 'aux': {{{}}}}}" + ), + app_ext_str, + pl_ext_str, + aux_ext_str, + app_ext_indices_str, + pl_ext_indices_str, + aux_ext_indices_str, + ); - if let Some(dir) = output_dir { - cmd += &format!(", output_dir='{}'", dir); + if let Some(exts) = cmd_exts { + let mut ext_setups: Vec = vec!(); + for ext in exts { + let mut ext_setup = "{".to_string(); + match ext.source { + ExtensionSource::App => { + ext_setup += &format!("'source': 'app', 'root': r'{}', 'name': None", origen::app().unwrap().root.join(format!("{}/commands/extensions/", STATUS.app.as_ref().unwrap().name())).display()); + }, + ExtensionSource::Plugin(ref pl_name) => { + ext_setup += &format!( + "'root': r'{}', 'name': r'{}', 'source': 'plugin'", + plugins.unwrap().plugins.get(pl_name).unwrap().root.as_path().join("commands/extensions/").display(), + pl_name, + ); + }, + ExtensionSource::Aux(ref ns, ref path) => { + ext_setup += &format!( + "'root': r'{}', 'name': r'{}', 'source': 'aux'", + path.display(), + ns, + ); + } + } + ext_setup += "}"; + ext_setups.push(ext_setup); + } + cmd += &format!(", extensions=[{}]", ext_setups.join(", ")); } - if let Some(dir) = reference_dir { - cmd += &format!(", reference_dir='{}'", dir); + if let Some(pls) = plugins { + cmd += &format!( + ", plugins={{{}}}", + pls.plugins.iter().map(|(n, pl)| format!("'{}': {{'root': r'{}'}}", n, pl.root.display())).collect::>().join(", ") + ); } - if debug { - cmd += ", debug=True"; + if let Some(top_overrides) = overrides { + for (name, val) in top_overrides.iter() { + if let Some(v) = val { + cmd += &format!(", {}={}", name, v); + } + } } + if let Some(targs) = targets { + if targs.clone().count() == 0 { + cmd += ", targets=False" + } else { + cmd += &format!(", {}", strs_to_cli_arr!("targets", targs)); + } + } cmd += &format!(", verbosity={}", LOGGER.verbosity()); - cmd += &format!(", verbosity_keywords=\"{}\"", LOGGER.keywords_to_cmd()); + cmd += &format!(", {}", strs_to_cli_arr!("verbosity_keywords", origen::LOGGER.data().keywords.iter())); cmd += ");"; log_debug!("Launching Python: '{}'", &cmd); diff --git a/rust/origen/cli/src/commands/new/mod.rs b/rust/origen/cli/src/commands/new/mod.rs index 5ea74db3..4a14b3cc 100644 --- a/rust/origen/cli/src/commands/new/mod.rs +++ b/rust/origen/cli/src/commands/new/mod.rs @@ -1,14 +1,16 @@ -// This implements the new application command, for the code generators, e.g. 'origen new dut' etc., -// see new_resource.rs +use crate::commands::_prelude::*; +use origen_metal::tera::{Context, Tera}; +use std::process::exit; +use std::env; +use std::fs::{create_dir, File}; +use std::path::PathBuf; +use crate::_generated::python::PYTHONS; -mod new_resource; +pub const BASE_CMD: &'static str = "new"; +pub const WS_CMD: &'static str = "workspace"; +pub const APP_CMD: &'static str = "application"; -use clap::ArgMatches; -use origen::STATUS; -use phf::map::Map; use phf::phf_map; -use std::path::PathBuf; -use tera::{Context, Tera}; // This includes a map of all template files, it is built by cli/build.rs at compile time. // All files in each sub-directory of commands/new/templates are accessible via a map named after the @@ -19,102 +21,116 @@ use tera::{Context, Tera}; // automatically be picked up and included in the new app. include!(concat!(env!("OUT_DIR"), "/new_app_templates.rs")); -struct App { - name: String, - dir: PathBuf, -} - -pub fn run(matches: &ArgMatches) { - if STATUS.is_app_present { - new_resource::run(matches); - return; - } - let name = matches.value_of("name").unwrap(); - if name.to_lowercase() != name { - display_red!("ERROR: "); - displayln!("The application name must be lowercased"); - std::process::exit(1); - } - let app_dir = std::env::current_dir().unwrap().join(name); - - if app_dir.exists() { - if !app_dir.read_dir().unwrap().next().is_none() { - display_red!("ERROR: "); - displayln!("A directory with that name already exists and is not empty, please delete it or use a new name and try again"); - std::process::exit(1); - } - } else { - std::fs::create_dir(&app_dir) - .expect("Could you create the new application directory, do you have permission?"); - } +gen_core_cmd_funcs__no_exts__no_app_opts!( + BASE_CMD, + "Create a new origen environment (e.g., app, workspace)", + { |cmd: App<'a>| { + cmd.arg_required_else_help(true) + }}, + core_subcmd__no_exts__no_app_opts!(WS_CMD, "Create a new workspace", { |cmd: App| { + cmd.visible_alias("ws") + .arg(req_sv_arg!("name", "NAME", "Workspace name")) + .arg(sv_opt!("desc", "DESC", "Description of the workspace").visible_alias("description")) + .arg(sv_opt!("path", "PATH", "Path to build the new workspace").short('p')) + }}) + // TODO origen new - support new app + // core_subcmd__no_exts__no_app_opts!(APP_CMD, "Create a new application", { |cmd: App| { + // cmd.visible_alias("app") + // }}) +); + +pub fn run(invocation: &clap::ArgMatches) -> origen::Result<()> { + if let Some((n, subcmd)) = invocation.subcommand() { + match n { + WS_CMD => { + let mut tera = match Tera::new("templates/workspace/*.tera") { + Ok(t) => t, + Err(e) => { + println!("Failed to parse workspace templates: {}", e); + exit(1); + } + }; + let mut context = Context::new(); + let name = subcmd.get_one::("name").unwrap(); + + let mut out_dir; + if let Some(p) = subcmd.get_one::("path") { + if p.is_relative() { + out_dir = env::current_dir()?; + out_dir.push(p); + } else { + out_dir = p.to_path_buf(); + } + } else { + out_dir = env::current_dir()?; + out_dir.push(&name); + } - let mut context = Context::new(); - //// Converting this to a vector here as the template was printing out the package list - //// in reverse order when given the index map - //let packages: Vec<&Package> = bom.packages.iter().map(|(_id, pkg)| pkg).collect(); - context.insert("app_name", name); - context.insert("origen_version", &origen::STATUS.origen_version.to_string()); - let mut user_info = "".to_string(); - let users = crate::om::users(); - if let Ok(u) = users.current_user() { - if let Ok(username) = u.username() { - user_info += &username; - match u.get_email() { - Ok(e) => { - if let Some(email) = e { - user_info += &format!(" <{}>", &email); + if out_dir.exists() { + // Check directory is empty + if !out_dir.read_dir()?.next().is_none() { + log_error!("Target directory {} is not empty!", &out_dir.display()); + exit(1); } + } else { + create_dir(&out_dir)?; } - Err(e) => { - display_redln!("{}", e.msg); + println!("Creating new workspace at {}", &out_dir.display()); + + context.insert("name", name); + context.insert("desc", subcmd.get_one::("desc").unwrap_or(&"".to_string())); + context.insert("app_gen", &false); + + let users = origen_metal::users(); + let mut author = "".to_string(); + context.insert("python_version", &format!( + ">={},<={}", + PYTHONS[2].strip_prefix("python").unwrap(), + PYTHONS.last().unwrap().strip_prefix("python").unwrap() + )); + if let Ok(u) = users.current_user() { + match u.username() { + Ok(username) => { + match u.get_email() { + Ok(e) => { + if let Some(email) = e { + author += &format!("{} <{}>", &username, &email); + } + } + Err(e) => { + log_warning!("Cannot retrieve current user's email: {}", e.msg); + } + } + }, + Err(e) => { + log_warning!("Cannot retrieve current user: {}", e.msg); + } + } + } else { + log_warning!("Cannot populate current user"); } - } - } - } - context.insert("user_info", &user_info); + context.insert("author", &author); + context.insert("origen_version", &origen::STATUS.origen_version.to_string()); + // TODO origen new - find a better way than hard-coding pytest version + context.insert("pytest_version", "^7"); - let new_app = App { - name: name.to_string(), - dir: app_dir, - }; - - new_app.apply_template(&PY_APP, &context); - - if !matches.is_present("no-setup") { - new_app.setup(); - } -} - -impl App { - fn apply_template(&self, template: &Map<&str, &str>, context: &Context) { - let mut tera = Tera::default(); - - for (file, content) in template.entries() { - let contents = tera.render_str(content, &context).unwrap(); - - let file = file.replace("app_namespace_dir", &self.name); - let path = self.dir.join(file.clone()); - - if !path.parent().unwrap().exists() { - std::fs::create_dir_all(&path.parent().unwrap()) - .expect("Couldn't create dir within the new app"); - } - - display_green!(" create "); - displayln!("{}", &file); + for (n, contents) in SHARED.entries() { + tera.add_raw_template(&format!("shared/{}", n), contents)?; + } + for (n, contents) in WORKSPACE.entries() { + tera.add_raw_template(&format!("workspace/{}", n), contents)?; + } - std::fs::write(&path, &contents).expect("Couldn't create a file within the new app"); + for (n, _) in WORKSPACE.entries() { + let f = File::create(out_dir.join(n))?; + tera.render_to(&format!("workspace/{}", n), &context, f)?; + } + Ok(()) + }, + APP_CMD => todo!(), // TODO origen enw - support new app + _ => unreachable_invalid_subc!(n) } + } else { + unreachable!() } - - fn setup(&self) { - std::env::set_current_dir(&self.dir).expect("Couldn't cd to the new app"); - - let _ = std::process::Command::new("origen") - .arg("env") - .arg("setup") - .spawn() - .expect("Couldn't execute origen setup") - .wait(); - } -} +} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/new/new_resource.rs b/rust/origen/cli/src/commands/new/new_resource.rs index 23546f48..0564d021 100644 --- a/rust/origen/cli/src/commands/new/new_resource.rs +++ b/rust/origen/cli/src/commands/new/new_resource.rs @@ -10,7 +10,7 @@ pub fn run(matches: &ArgMatches) { Some("dut") => { let name; - if let Some(n) = matches.subcommand_matches("dut").unwrap().value_of("name") { + if let Some(n) = matches.subcommand_matches("dut").unwrap().get_one::<&str>("name") { // Add the leading 'dut' to the fully qualified new DUT name if missing if !n.starts_with("dut/") { name = format!("dut/{}", n); @@ -63,9 +63,9 @@ pub fn run(matches: &ArgMatches) { } Some("block") => { let matches = matches.subcommand_matches("block").unwrap(); - let name = matches.value_of("name").unwrap().to_string(); + let name = matches.get_one::("name").unwrap(); let mut nested = false; - let parent = matches.value_of("parent"); + let parent = matches.get_one::<&str>("parent"); let mut block_name = clean_and_validate_resource_name(&name, "NAME"); if let Some(p) = parent { diff --git a/rust/origen/cli/src/commands/new/templates/shared/.gitignore b/rust/origen/cli/src/commands/new/templates/shared/.gitignore new file mode 100644 index 00000000..e54bd4e1 --- /dev/null +++ b/rust/origen/cli/src/commands/new/templates/shared/.gitignore @@ -0,0 +1,29 @@ +# Workspace directories +/.origen +/tmp +/.ref +/log +/.session + +# Output directories +/output +/web/source/_static/build +/web/source/interbuild +/dist + +{% if app_gen -%} +# Release scribe dry-run output and release notes +config/history.generated.dry_run.toml +release_note.txt +{% endif -%} + +# Cache directories +__pycache__ +.pytest_cache + +# Editor cruft +*.swp +*.swo +*~ +*.pylintrc +.vscode \ No newline at end of file diff --git a/rust/origen/cli/src/commands/new/templates/shared/origen.toml.tera b/rust/origen/cli/src/commands/new/templates/shared/origen.toml.tera new file mode 100644 index 00000000..eee0cdec --- /dev/null +++ b/rust/origen/cli/src/commands/new/templates/shared/origen.toml.tera @@ -0,0 +1,14 @@ +# Use this to define your application-specific Origen configuration +# Do not delete it even if you don't use it since it is also used by the Origen +# command line interface to determine when it is in an Origen application workspace + +# Specify what command should be used to invoke python, if not specified +# Origen will try python, python3, python3.8, etc. until one is found that +# satisfies the minimum Python version requirement +#python_cmd = "mypython" + +# If your company has an internal package server enter it here: +#pkg_server = "https://pkgs.company.net:9292" +# or here, if you need to use different urls for push and pull (write and read): +#pkg_server_push = "https://pkgs.company.net:9292" +#pkg_server_pull = "https://pkgs.company.net:9292" \ No newline at end of file diff --git a/rust/origen/cli/src/commands/new/templates/shared/pyproject.toml.tera b/rust/origen/cli/src/commands/new/templates/shared/pyproject.toml.tera new file mode 100644 index 00000000..3b54596a --- /dev/null +++ b/rust/origen/cli/src/commands/new/templates/shared/pyproject.toml.tera @@ -0,0 +1,16 @@ +[tool.poetry] +name = "{{name}}" +version = "0.1.0" +description = "{{desc}}" +authors = ["{{author}}"] + +[tool.poetry.dependencies] +python = "{{python_version}}" +origen = "{{origen_version}}" + +[tool.poetry.dev-dependencies] +pytest = "{{pytest_version}}" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/rust/origen/cli/src/commands/new/templates/workspace/.gitignore.tera b/rust/origen/cli/src/commands/new/templates/workspace/.gitignore.tera new file mode 100644 index 00000000..4f7b7da8 --- /dev/null +++ b/rust/origen/cli/src/commands/new/templates/workspace/.gitignore.tera @@ -0,0 +1 @@ +{% extends "shared/.gitignore" %} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/new/templates/workspace/origen.toml.tera b/rust/origen/cli/src/commands/new/templates/workspace/origen.toml.tera new file mode 100644 index 00000000..290d0f81 --- /dev/null +++ b/rust/origen/cli/src/commands/new/templates/workspace/origen.toml.tera @@ -0,0 +1 @@ +{% extends "shared/origen.toml" %} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/new/templates/workspace/pyproject.toml.tera b/rust/origen/cli/src/commands/new/templates/workspace/pyproject.toml.tera new file mode 100644 index 00000000..c8818d8b --- /dev/null +++ b/rust/origen/cli/src/commands/new/templates/workspace/pyproject.toml.tera @@ -0,0 +1 @@ +{% extends "shared/pyproject.toml" %} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/plugin.rs b/rust/origen/cli/src/commands/plugin.rs new file mode 100644 index 00000000..e152b09c --- /dev/null +++ b/rust/origen/cli/src/commands/plugin.rs @@ -0,0 +1,27 @@ +use super::_prelude::*; +use crate::framework::plugins::{add_pl_ns_helps, add_pl_ns_subcmds}; + +pub const BASE_CMD: &'static str = "plugin"; + +pub (crate) fn add_helps(helps: &mut CmdHelps, plugins: Option<&Plugins>) { + helps.add_core_cmd(BASE_CMD).set_help_msg("Access added commands from individual plugins").set_as_not_extendable(); + add_pl_ns_helps(helps, plugins); +} + +pub (crate) fn add_commands<'a>(app: App<'a>, helps: &'a CmdHelps, plugins: Option<&'a Plugins>, exts: &'a Extensions) -> Result> { + let mut pl_sub = Command::new(BASE_CMD).visible_alias("pl").arg_required_else_help(true); + pl_sub = helps.apply_core_cmd_helps(BASE_CMD, pl_sub); + if let Some(pls) = plugins { + pl_sub = add_pl_ns_subcmds(pl_sub, helps, pls, exts)?; + } + Ok(app.subcommand(pl_sub)) +} + +pub fn run(cmd: RunInput, app: &clap::App, exts: &crate::Extensions, plugins: Option<&Plugins>) -> Result<()> { + if let Some(subcmd) = cmd.subcommand() { + let sub = subcmd.1; + plugins.unwrap().plugins.get(subcmd.0).unwrap().dispatch(sub, app, exts, plugins) + } else { + Ok(()) + } +} \ No newline at end of file diff --git a/rust/origen/cli/src/commands/plugins.rs b/rust/origen/cli/src/commands/plugins.rs new file mode 100644 index 00000000..e9fa7039 --- /dev/null +++ b/rust/origen/cli/src/commands/plugins.rs @@ -0,0 +1,37 @@ +use super::_prelude::*; + +pub const BASE_CMD: &'static str = "plugins"; + +gen_core_cmd_funcs__no_exts__no_app_opts!( + BASE_CMD, + "Interface with the Origen plugin manager", + { |cmd: App<'a>| { + cmd.visible_alias("pl_mgr").visible_alias("pls").arg_required_else_help(true) + }}, + core_subcmd__no_exts__no_app_opts!("list", "List the available plugins", { |cmd: App| { + cmd.visible_alias("ls") + }}) +); + +pub fn run(cmd: RunInput, plugins: Option<&Plugins>) -> Result<()> { + if let Some(subcmd) = cmd.subcommand() { + match subcmd.0 { + "list" => { + if let Some(pls) = plugins { + if pls.is_empty() { + displayln!("There are no available plugins!"); + } else { + displayln!("Available plugins:\n"); + for (name, _) in pls.plugins.iter() { + displayln!("{}", name); + } + } + } else { + displayln!("The plugin manager is not available or there was an error populating plugins!"); + } + }, + _ => unreachable_invalid_subc!(subcmd.0) + } + } + Ok(()) +} diff --git a/rust/origen/cli/src/commands/proj/mod.rs b/rust/origen/cli/src/commands/proj/mod.rs index aa5ab1a7..2d1cc5d9 100644 --- a/rust/origen/cli/src/commands/proj/mod.rs +++ b/rust/origen/cli/src/commands/proj/mod.rs @@ -49,7 +49,7 @@ pub fn run(matches: &ArgMatches) { let path = matches .subcommand_matches("create") .unwrap() - .value_of("path") + .get_one::<&str>("path") .unwrap(); let mut path = PathBuf::from(path); if !path.is_absolute() { @@ -162,10 +162,10 @@ pub fn run(matches: &ArgMatches) { } Some("update") => { let matches = matches.subcommand_matches("update").unwrap(); - let force = matches.is_present("force"); - let mut links = matches.is_present("links"); - if let Some(packages) = matches.values_of("packages") { - if packages.map(|p| p).collect::>().contains(&"all") { + let force = matches.contains_id("force"); + let mut links = matches.contains_id("links"); + if let Some(packages) = matches.get_many::<&str>("packages") { + if packages.map(|p| *p).collect::>().contains(&"all") { links = true; } } @@ -370,9 +370,9 @@ pub fn run(matches: &ArgMatches) { } Some("tag") => { let matches = matches.subcommand_matches("tag").unwrap(); - let force = matches.is_present("force"); - let tagname = matches.value_of("name").unwrap(); - let message = matches.value_of("message"); + let force = matches.contains_id("force"); + let tagname = matches.get_one::<&str>("name").unwrap(); + let message = matches.get_one::<&str>("message"); let package_ids = get_package_ids_from_args(matches, true); let mut packages_with_existing_tag: Vec<&str> = vec![]; let bom = BOM::for_dir(&pwd()); @@ -384,7 +384,7 @@ pub fn run(matches: &ArgMatches) { if package.has_repo() { display!("{} ... ", package.id); let rc = package.rc(bom.root()).unwrap(); - match rc.tag(tagname, force, message) { + match rc.tag(tagname, force, message.map(|s| *s)) { Err(e) => { if e.to_string().contains("tag already exists") { packages_with_existing_tag.push(&package.id); @@ -430,8 +430,8 @@ pub fn run(matches: &ArgMatches) { /// If a given ID does not match a known package or group the process will be exited with an error. /// Optionally return all packages if no packages arg given. fn get_package_ids_from_args(matches: &ArgMatches, return_all_if_none: bool) -> Vec { - let mut package_args: Vec<&str> = match matches.values_of("packages") { - Some(pkgs) => pkgs.map(|p| p).collect(), + let mut package_args: Vec<&str> = match matches.get_many::("packages") { + Some(pkgs) => pkgs.map(|p| p.as_str()).collect(), None => vec![], }; if package_args.is_empty() && return_all_if_none { @@ -459,7 +459,7 @@ fn pwd() -> PathBuf { /// If validate is not true then the path returned may not be absolute and the caller /// is responsible for handling that (if required) after then have created it fn get_dir_or_pwd(matches: &ArgMatches, validate: bool) -> PathBuf { - let dir = match matches.value_of("dir") { + let dir = match matches.get_one::<&str>("dir") { Some(x) => PathBuf::from(x), None => pwd(), }; diff --git a/rust/origen/cli/src/commands/save_ref.rs b/rust/origen/cli/src/commands/save_ref.rs index c50c1c44..361c2831 100644 --- a/rust/origen/cli/src/commands/save_ref.rs +++ b/rust/origen/cli/src/commands/save_ref.rs @@ -4,9 +4,9 @@ use std::path::Path; pub fn run(matches: &clap::ArgMatches) { let mut exit_code = 0; - let new = matches.is_present("new"); - let changed = matches.is_present("changed"); - let files = matches.values_of("files"); + let new = matches.contains_id("new"); + let changed = matches.contains_id("changed"); + let files = matches.get_many::("files"); if new { if let Err(e) = reference_files::apply_all_new_refs() { diff --git a/rust/origen/cli/src/commands/target.rs b/rust/origen/cli/src/commands/target.rs index 0f62ae0c..2e47345c 100644 --- a/rust/origen/cli/src/commands/target.rs +++ b/rust/origen/cli/src/commands/target.rs @@ -1,43 +1,119 @@ use origen::core::application::target; +use super::_prelude::*; -pub fn run(subcmd: Option<&str>, tnames: Option>, full_paths: bool) { - if let Some(cmd) = subcmd { - match cmd { +pub const BASE_CMD: &'static str = "target"; +pub const FULL_PATHS_OPT: &'static str = "full-paths"; +pub const TARGETS_OPT: &'static str = "targets"; + +macro_rules! full_paths_opt { + () => { + Arg::new(FULL_PATHS_OPT) + .long(FULL_PATHS_OPT) + .visible_alias("full_paths") + .short('f') + .help("Display targets' full paths") + .action(SetArgTrue) + } +} + +macro_rules! targets_arg { + ($help:expr) => { + Arg::new(TARGETS_OPT) + .help($help) + .action(AppendArgs) + .value_name("TARGETS") + .multiple(true) + .required(true) + .use_delimiter(true) + } +} + +macro_rules! tnames { + ($cmd:expr) => { + $cmd.get_many::(TARGETS_OPT).unwrap().map(|t| t.as_str()).collect::>() + } +} + +gen_core_cmd_funcs__no_exts__no_app_opts!( + BASE_CMD, + "Set/view the default target", + { |cmd: App<'a>| { cmd.arg(full_paths_opt!()).visible_alias("t") }}, + core_subcmd__no_exts__no_app_opts!("add", "Activates the given target(s)", { |cmd: App| { + cmd.visible_alias("a") + .arg(targets_arg!("Targets to be activated")) + .arg(full_paths_opt!()) + }}), + core_subcmd__no_exts__no_app_opts!("clear", "Deactivates any and all current targets", { |cmd: App| { + cmd.visible_alias("c") + }}), + core_subcmd__no_exts__no_app_opts!("remove", "Deactivates the given target(s)", { |cmd: App| { + cmd.visible_alias("r") + .arg(targets_arg!("Targets to be deactivated")) + .arg(full_paths_opt!()) + }}), + core_subcmd__no_exts__no_app_opts!("set", "Activates the given target(s) while deactivating all others", { |cmd: App| { + cmd.visible_alias("s") + .arg(targets_arg!("Targets to be set")) + .arg(full_paths_opt!()) + }}), + core_subcmd__no_exts__no_app_opts!("default", "Activates the default target(s) while deactivating all others", { |cmd: App| { + cmd.visible_alias("d") + .arg(full_paths_opt!()) + }}), + core_subcmd__no_exts__no_app_opts!("view", "Views the currently activated target(s)", { |cmd: App| { + cmd.visible_alias("v") + .arg(full_paths_opt!()) + }}) +); + +macro_rules! view { + ($invocation:expr) => { + view_targets(*$invocation.get_one::(FULL_PATHS_OPT).unwrap()) + } +} + +fn view_targets(fp: bool) -> Result<()> { + if let Some(targets) = target::get(fp) { + println!("The targets currently enabled are:"); + println!("{}", targets.join("\n")) + } else { + println!("No targets have been enabled and this workspace does not enable any default targets") + } + Ok(()) +} + +pub(crate) fn run(invocation: &clap::ArgMatches) -> origen::Result<()> { + if let Some((n, subcmd)) = invocation.subcommand() { + match n { "add" => { - target::add(backend_expect!( - tnames, - "No targets given to 'target add' cmd!" - )); + target::add(tnames!(subcmd)); + } + "clear" => { + target::clear(); + view_targets(false)?; + return Ok(()) } "default" => { target::reset(); } "remove" => { - target::remove(backend_expect!( - tnames, - "No targets given to 'target add' cmd!" - )); + target::remove(tnames!(subcmd)); } "set" => { - target::set(backend_expect!( - tnames, - "No targets given to 'target set' cmd!" - )); + target::set(tnames!(subcmd)); } "view" => { - if let Some(targets) = target::get(full_paths) { - println!("The targets currently enabled are:"); - println!("{}", targets.join("\n")) - } else { - println!("No targets have been enabled and this workspace does not enable any default targets") - } - return (); - } - _ => { - // Shouldn't hit this. Should be caught by clap before getting here - backend_fail!("Unknown subcommand in target processor"); + view!(subcmd)?; + return Ok(()); } + _ => unreachable_invalid_subc!(n) } + // Show the effect after running the command + view!(subcmd) + } else { + view!(invocation)?; + println!(); + print_subcmds_available_msg!(); + Ok(()) } - run(Some("view"), None, full_paths) } diff --git a/rust/origen/cli/src/framework/app_cmds.rs b/rust/origen/cli/src/framework/app_cmds.rs new file mode 100644 index 00000000..c529b099 --- /dev/null +++ b/rust/origen/cli/src/framework/app_cmds.rs @@ -0,0 +1,119 @@ +use origen::{Result, STATUS}; +use indexmap::IndexMap; +use std::fs; +use std::path::PathBuf; +use crate::commands::_prelude::*; +use super::build_commands; +use origen::core::application::Application; + +use super::{Command, CommandsToml, CommandTOML, Extensions}; + +pub const APP_COMMANDS: [&'static str; 2] = [crate::commands::app::BASE_CMD, "commands"]; + +pub struct AppCmds { + pub root: PathBuf, + pub top_commands: Vec, + pub commands: IndexMap::, +} + +impl AppCmds { + fn _add_cmd(slf: &mut Self, current_path: String, current_cmd: &mut CommandTOML, parent_cmd: Option<&Command>) -> Result { + if let Some(c) = Command::from_toml_cmd(current_cmd, CmdSrc::App(current_path.to_string()), parent_cmd)? { + if let Some(ref mut sub_cmds) = current_cmd.subcommand { + for mut sub in sub_cmds { + Self::_add_cmd(slf, format!("{}.{}", current_path, &sub.name), &mut sub, Some(&c))?; + } + } + slf.commands.insert(current_path.clone(), c); + Ok(true) + } else { + Ok(false) + } + } + + pub fn new(app: &Application, exts: &mut Extensions) -> Result { + let mut slf = Self { + root: app.root.to_owned(), + top_commands: vec!(), + commands: IndexMap::new(), + }; + + for commands_toml in app.config().cmd_paths() { + let content = match fs::read_to_string(&commands_toml) { + Ok(x) => x, + Err(e) => { + bail!("{}", e); + } + }; + + let command_config: CommandsToml = match toml::from_str(&content) { + Ok(x) => x, + Err(e) => { + log_error!("Malformed Commands TOML '{}': {}", &commands_toml.display(), e); + continue; + } + }; + // FEATURE: help on cmd nspace (app) error on help given? + // slf.help = command_config.help.to_owned(); + // Help for the app-cmd namespace is not supported. Origen provides the help message. + // Display a warning saying this will have not effect + // if command_config.help.is_some() { + // log_warning!("Custom help messages from app commands are not supported and will be ignored (from '{}')", commands_toml.display()) + // } + + if let Some(commands) = command_config.command { + for mut cmd in commands { + if Self::_add_cmd(&mut slf, cmd.name.to_owned(), &mut cmd, None)? { + slf.top_commands.push(cmd.name.to_owned()); + } + } + } + + if let Some(extensions) = command_config.extension { + for ext in extensions { + match exts.add_from_app_toml(ext) { + Ok(_) => {}, + Err(e) => log_error!("Failed to add extensions from application from '{}': {}", &commands_toml.display(), e) + } + } + } + } + Ok(slf) + } + + pub fn cmds_root(&self) -> Result { + let mut r = self.root.to_owned(); + r.push(STATUS.app.as_ref().unwrap().name()); + r.push("commands"); + Ok(r) + } +} + +pub (crate) fn add_helps(helps: &mut CmdHelps, app_cmds: &AppCmds) { + helps.add_core_sub_cmd(&APP_COMMANDS).set_help_msg("Interface with commands added by the application").set_as_not_extendable(); + for (n, c) in app_cmds.commands.iter() { + helps.add_app_cmd(n).set_help_msg(&c.help); + } +} + +pub (crate) fn add_commands<'a>(app: App<'a>, helps: &'a CmdHelps, app_commands: &'a AppCmds, exts: &'a Extensions) -> Result> { + let mut app_cmds_cmd = helps.core_subc(&APP_COMMANDS) + .visible_alias("cmds") + .arg_required_else_help(true); + + for top_cmd_name in app_commands.top_commands.iter() { + app_cmds_cmd = app_cmds_cmd.subcommand(build_commands( + &app_commands.commands.get(top_cmd_name).unwrap(), + &|cmd, app, opt_cache| { + exts.apply_to_app_cmd(cmd, app, opt_cache) + }, + &|cmd| { + app_commands.commands.get(cmd).unwrap() + }, + &|cmd, app| { + helps.apply_helps(&CmdSrc::App(cmd.to_string()), app) + }, + )); + } + Ok(app.subcommand(app_cmds_cmd)) +} diff --git a/rust/origen/cli/src/framework/aux_cmds.rs b/rust/origen/cli/src/framework/aux_cmds.rs new file mode 100644 index 00000000..80f8948d --- /dev/null +++ b/rust/origen/cli/src/framework/aux_cmds.rs @@ -0,0 +1,182 @@ +use origen::{Result, ORIGEN_CONFIG, origen_config_metadata}; +use crate::commands::_prelude::*; +use super::{Command, build_commands}; +use std::fs; +use std::path::PathBuf; +use origen::core::config::AuxillaryCommandsTOML; +use super::extensions::ExtensionTOML; +use super::{CommandTOML}; +use clap::Command as ClapCommand; +use super::helps::NOT_EXTENDABLE_MSG; + +pub (crate) fn add_aux_ns_helps(helps: &mut CmdHelps, aux_cmds: &AuxCmds) { + for (ns, cmds) in aux_cmds.namespaces.iter() { + for (n, c) in cmds.commands.iter() { + helps.add_aux_cmd(ns, n).set_help_msg(&c.help); + } + } +} + +#[inline] +pub (crate) fn aux_ns_subcmd<'a>(mut aux_sub: App<'a>, helps: &'a CmdHelps, aux_commands: &'a AuxCmds, exts: &'a Extensions) -> Result> { + for (ns, cmds) in aux_commands.namespaces.iter() { + let mut aux_sub_sub = ClapCommand::new(ns).arg_required_else_help(true).after_help(NOT_EXTENDABLE_MSG); + if let Some(h) = cmds.help.as_ref() { + aux_sub_sub = aux_sub_sub.about(h.as_str()); + } + for top_cmd_name in cmds.top_commands.iter() { + aux_sub_sub = aux_sub_sub.subcommand(build_commands( + &cmds.commands.get(top_cmd_name).unwrap(), + &|cmd, app, opt_cache| { + exts.apply_to_aux_cmd(&ns, cmd, app, opt_cache) + }, + &|cmd| { + cmds.commands.get(cmd).unwrap() + }, + &|cmd, app| { + helps.apply_helps(&CmdSrc::Aux(ns.to_string(), cmd.to_string()), app) + } + )); + } + aux_sub = aux_sub.subcommand(aux_sub_sub); + } + Ok(aux_sub) +} + +#[derive(Debug, Deserialize)] +pub (crate) struct CommandsToml { + pub help: Option, + pub command: Option>, + pub extension: Option> +} + +#[derive(Default)] +pub struct AuxCmds { + pub namespaces: IndexMap, +} + +impl AuxCmds { + pub fn new(exts: &mut Extensions) -> Result { + let mut slf = Self::default(); + if let Some(aux_cmds_configs) = ORIGEN_CONFIG.auxillary_commands.as_ref() { + for (i, config) in aux_cmds_configs.iter().enumerate() { + match AuxCmdNamespace::new(i, config, exts) { + Ok(aux_ns) => { + let ns = aux_ns.namespace().to_string(); + if let Some(existing_ns) = slf.namespaces.get(&ns) { + log_error!("Auxillary commands namespaced '{}' already exists.", ns); + log_error!("Cannot add namespace from config '{}'", origen_config_metadata().aux_cmd_sources[i].display()); + log_error!("Namespace first defined in config '{}'", existing_ns.origin().display()); + } else { + slf.namespaces.insert(ns, aux_ns); + } + } + Err(e) => { + log_error!( + "Unable to add auxillary commands at '{}' from config '{}'. The following error was met:", + config.path().display(), + origen_config_metadata().aux_cmd_sources[i].display() + ); + log_error!("{}", e); + } + } + } + } + Ok(slf) + } +} + +pub struct AuxCmdNamespace { + commands: IndexMap, + pub top_commands: Vec, + index: usize, + help: Option, +} + +impl AuxCmdNamespace { + fn _add_cmd(slf: &mut Self, current_path: String, current_cmd: &mut CommandTOML, parent_cmd: Option<&Command>) -> Result { + if let Some(c) = Command::from_toml_cmd(current_cmd, CmdSrc::Aux(slf.namespace(), current_path.to_string()), parent_cmd)? { + if let Some(ref mut sub_cmds) = current_cmd.subcommand { + for mut sub in sub_cmds { + Self::_add_cmd(slf, format!("{}.{}", current_path, &sub.name), &mut sub, Some(&c))?; + } + } + slf.commands.insert(current_path.clone(), c); + Ok(true) + } else { + Ok(false) + } + } + + pub fn new(index: usize, config: &AuxillaryCommandsTOML, exts: &mut Extensions) -> Result { + let mut slf = Self { + commands: IndexMap::new(), + top_commands: vec!(), + index: index, + help: None, + }; + + let mut commands_toml = PathBuf::from(&config.path); + if commands_toml.extension().is_none() { + commands_toml.set_extension("toml"); + } + + if commands_toml.exists() { + let content = match fs::read_to_string(&commands_toml) { + Ok(x) => x, + Err(e) => { + bail!("{}", e); + } + }; + + let command_config: CommandsToml = match toml::from_str(&content) { + Ok(x) => x, + Err(e) => { + bail!("Malformed commands.toml: {}", e); + } + }; + slf.help = command_config.help.to_owned(); + + if let Some(commands) = command_config.command { + for mut cmd in commands { + if Self::_add_cmd(&mut slf, cmd.name.to_owned(), &mut cmd, None)? { + slf.top_commands.push(cmd.name.to_owned()); + } + } + } + + if let Some(extensions) = command_config.extension { + for ext in extensions { + match exts.add_from_aux_toml(&slf, ext) { + Ok(_) => {}, + Err(e) => log_error!("Failed to add extensions from aux commands '{}' ({}): {}", slf.namespace(), slf.path().display(), e) + } + } + } + } else { + bail!("Could not find auxillary commands file at '{}'", commands_toml.display()); + } + Ok(slf) + } + + pub fn namespace(&self) -> String { + let config = &ORIGEN_CONFIG.auxillary_commands.as_ref().unwrap()[self.index]; + if let Some(n) = config.name.as_ref() { + n.to_string() + } else { + format!("{}", PathBuf::from(&config.path).file_stem().unwrap().to_str().unwrap()) + } + } + + pub fn path(&self) -> PathBuf { + PathBuf::from(&ORIGEN_CONFIG.auxillary_commands.as_ref().unwrap()[self.index].path) + } + + pub fn root(&self) -> PathBuf { + self.path().with_extension("") + } + + pub fn origin(&self) -> PathBuf { + origen_config_metadata().aux_cmd_sources[self.index].to_path_buf() + } +} diff --git a/rust/origen/cli/src/framework/cmd_gen_helpers.rs b/rust/origen/cli/src/framework/cmd_gen_helpers.rs new file mode 100644 index 00000000..ebbf6a50 --- /dev/null +++ b/rust/origen/cli/src/framework/cmd_gen_helpers.rs @@ -0,0 +1,26 @@ +/// Generate a required, single-value arg +#[macro_export] +macro_rules! req_sv_arg { + ($name: expr, $value_name: expr, $help: expr) => {{ + clap::Arg::new($name) + .help($help) + .action(crate::commands::_prelude::clap_arg_actions::SetArg) + .value_name($value_name) + .multiple(false) + .required(true) + }} +} + +/// Generate an optional, single-value option +#[macro_export] +macro_rules! sv_opt { + ($name: expr, $value_name: expr, $help: expr) => {{ + clap::Arg::new($name) + .long($name) + .help($help) + .action(crate::commands::_prelude::clap_arg_actions::SetArg) + .value_name($value_name) + .multiple(false) + .required(false) + }} +} \ No newline at end of file diff --git a/rust/origen/cli/src/framework/core_cmds.rs b/rust/origen/cli/src/framework/core_cmds.rs new file mode 100644 index 00000000..7d8ca62e --- /dev/null +++ b/rust/origen/cli/src/framework/core_cmds.rs @@ -0,0 +1,173 @@ +use super::{CmdHelps, Extensions}; +use origen::Result; +use clap::Command; + +pub fn add_core_subc_helps(helps: &mut CmdHelps, base_name: &str, cmd: &str, cmd_help: &str, extendable: bool, subcmds: &[SubCmd]) { + let n = format!("{}.{}", base_name, cmd); + let h = helps.add_core_cmd(&n).set_help_msg(cmd_help); + if !extendable { + h.set_as_not_extendable(); + } + for subc in subcmds { + add_core_subc_helps(helps, &n, subc.name, subc.help, subc.extendable, subc.subcmds); + } +} + +pub fn add_core_subcs<'a>(helps: &'a CmdHelps, exts: Option<&'a Extensions>, cmd: Command<'a>, base: Vec<&str>, subcmd: &SubCmd) -> Result> { + let mut n = base.clone(); + n.push(subcmd.name); + let mut subc = helps.core_subc(&n); + for s in subcmd.subcmds { + subc = add_core_subcs(helps, exts, subc, n.clone(), s)?; + } + if let Some(setup) = subcmd.proc { + subc = setup(subc); + } + if subcmd.include_app_opts { + subc = super::add_all_app_opts(subc); + } + // add exts + if let Some(e) = exts { + subc = e.apply_to_core_cmd(&n.join("."), subc); + } + Ok(cmd.subcommand(subc)) +} + +pub struct SubCmd<'a> { + pub name: &'static str, + pub help: &'static str, + pub subcmds: &'a [SubCmd<'a>], + pub proc: Option<&'a dyn Fn(Command) -> Command>, + pub include_app_opts: bool, + pub extendable: bool, +} +#[macro_export] +macro_rules! core_subcmd { + ($($args:tt)+) => {{ + $crate::_core_subcmd!(true, true, $($args)*) + }} +} + +#[macro_export] +macro_rules! _core_subcmd { + ($include_app_opts:expr, $extendable:expr, $name:expr, $help:expr, $proc:tt) => {{ + $crate::framework::core_cmds::SubCmd { + name: $name, + help: $help, + subcmds: &[], + proc: Some(&$proc), + include_app_opts: $include_app_opts, + extendable: $extendable, + } + }}; + + ($include_app_opts:expr, $extendable:expr, $name:expr, $help:expr, $proc:tt, $($subcmd:expr ), *) => {{ + $crate::framework::core_cmds::SubCmd { + name: $name, + help: $help, + subcmds: &[$($subcmd),*], + proc: Some(&$proc), + include_app_opts: $include_app_opts, + extendable: $extendable, + } + }}; + + ($name:expr, $help:expr, $proc:tt, $($subcmd:expr ), *) => {{ + $crate::framework::core_cmds::SubCmd { + name: $name, + help: $help, + subcmds: &[$($subcmd),*], + proc: Some(&$proc), + include_app_opts: $include_app_opts, + extendable: true, + } + }}; + + ($name:expr, $help:expr) => {{ + $crate::framework::core_cmds::SubCmd { + name: $name, + help: $help, + subcmds: &[], + proc: None, + include_app_opts: $include_app_opts, + extendable: true, + } + }}; + + ($name:expr, $help:expr, $($subcmd:expr ), *) => {{ + $crate::framework::core_cmds::SubCmd { + name: $name, + help: $help, + subcmds: &[$($subcmd),*], + proc: None, + include_app_opts: $include_app_opts, + extendable: true, + } + }}; +} + +#[macro_export] +macro_rules! core_subcmd__no_exts__no_app_opts { + ($($args:tt)+) => {{ + $crate::_core_subcmd!(false, false, $($args)*) + }} +} + +#[macro_export] +macro_rules! gen_core_cmd_funcs { + ($base_name:expr, $cmd_help:expr, $proc:tt) => { + gen_core_cmd_funcs!($base_name, $cmd_help, $proc,); + }; + ($base_name:expr, $cmd_help:expr, $proc:tt, $($subcmd:expr ), *) => { + pub (crate) fn add_helps(helps: &mut $crate::CmdHelps) { + helps.add_core_cmd($base_name).set_help_msg($cmd_help); + $( + $crate::framework::core_cmds::add_core_subc_helps(helps, $base_name, $subcmd.name, $subcmd.help, $subcmd.extendable, $subcmd.subcmds); + )* + } + + pub (crate) fn add_commands<'a>(app: clap::Command<'a>, helps: &'a $crate::CmdHelps, exts: &'a $crate::Extensions) -> origen::Result> { + let mut cmd = helps.core_cmd($base_name); + cmd = $proc(cmd); + $( + cmd = $crate::framework::core_cmds::add_core_subcs(helps, Some(exts), cmd, vec!($base_name), &$subcmd)?; + )* + cmd = crate::framework::add_all_app_opts(cmd); + cmd = exts.apply_to_core_cmd($base_name, cmd); + Ok(app.subcommand(cmd)) + } + }; +} + +#[macro_export] +macro_rules! gen_core_cmd_funcs__no_exts__no_app_opts { + ($base_name:expr, $cmd_help:expr, $proc:tt, $($subcmd:expr ), *) => { + pub (crate) fn add_helps(helps: &mut $crate::CmdHelps) { + helps.add_core_cmd($base_name).set_help_msg($cmd_help).set_as_not_extendable(); + $( + $crate::framework::core_cmds::add_core_subc_helps(helps, $base_name, $subcmd.name, $subcmd.help, $subcmd.extendable, $subcmd.subcmds); + )* + } + + pub (crate) fn add_commands<'a>(app: clap::Command<'a>, helps: &'a $crate::CmdHelps, _exts: &'a $crate::Extensions) -> origen::Result> { + let mut cmd = helps.core_cmd($base_name); + cmd = $proc(cmd); + $( + cmd = $crate::framework::core_cmds::add_core_subcs(helps, None, cmd, vec!($base_name), &$subcmd)?; + )* + Ok(app.subcommand(cmd)) + } + }; + + ($base_name:expr, $cmd_help:expr, $proc:tt) => { + pub (crate) fn add_helps(helps: &mut $crate::CmdHelps) { + helps.add_core_cmd($base_name).set_help_msg($cmd_help).set_as_not_extendable(); + } + + pub (crate) fn add_commands<'a>(app: clap::Command<'a>, helps: &'a $crate::CmdHelps, _exts: &'a $crate::Extensions) -> origen::Result> { + let mut cmd = helps.core_cmd($base_name); + cmd = $proc(cmd); + Ok(app.subcommand(cmd)) + } + }; +} \ No newline at end of file diff --git a/rust/origen/cli/src/framework/extensions.rs b/rust/origen/cli/src/framework/extensions.rs new file mode 100644 index 00000000..2da0e3ef --- /dev/null +++ b/rust/origen/cli/src/framework/extensions.rs @@ -0,0 +1,214 @@ +use std::collections::HashMap; +use origen::Result; +use super::plugins::Plugin; +use super::aux_cmds::{AuxCmdNamespace}; +use clap::Command as ClapCommand; +use super::{OptTOML, Opt, CmdSrc, Applies, CmdOptCache}; +use crate::from_toml_opts; +use std::path::PathBuf; +use std::fmt; + +macro_rules! ext_opt { + () => { + "ext_opt" + } +} + +pub const EXT_BASE_NAME: &'static str = ext_opt!(); +pub const EXT_BASE_PREFIX: &'static str = concat!(ext_opt!(), "."); + +#[derive(Debug)] +pub struct Extensions { + extensions: HashMap>, +} + +impl Extensions { + pub fn new() -> Self { + Self { + extensions: HashMap::new(), + } + } + + pub fn exts(&self) -> &HashMap> { + &self.extensions + } + + fn add_ext(&mut self, t: ExtensionTOML, f: F) -> Result + where F: Fn(ExtensionTOML) -> Result> + { + let c = CmdSrc::new(&t.extend)?; + if let Some(e) = f(t)? { + self.extensions.entry(c).or_default().push(e); + Ok(true) + } else { + // Extension doesn't apply in this context/env. + Ok(false) + } + } + + pub fn add_from_app_toml(&mut self, ext_toml: ExtensionTOML) -> Result { + self.add_ext(ext_toml, |t| Extension::from_extension_toml(ExtensionSource::App, t)) + } + + pub fn add_from_pl_toml(&mut self, pl: &Plugin, ext_toml: ExtensionTOML) -> Result { + self.add_ext(ext_toml, |t| Extension::from_extension_toml(ExtensionSource::Plugin(pl.name.to_owned()), t)) + } + + pub fn add_from_aux_toml(&mut self, ns: &AuxCmdNamespace, ext_toml: ExtensionTOML) -> Result { + self.add_ext(ext_toml, |t| Extension::from_extension_toml(ExtensionSource::Aux(ns.namespace(), ns.root()), t)) + } + + pub fn apply_to_core_cmd<'a>(&'a self, cmd: &str, app: ClapCommand<'a>) -> ClapCommand<'a> { + let e = CmdSrc::Core(cmd.to_string()); + let mut cache = CmdOptCache::unchecked_populated(&app, e.to_string()); + self.apply_to(&e, app, &mut cache) + } + + pub fn apply_to_app_cmd<'a>(&'a self, cmd: &str, app: ClapCommand<'a>, cache: &mut CmdOptCache) -> ClapCommand<'a> { + self.apply_to(&CmdSrc::App(cmd.to_string()), app, cache) + } + + pub fn apply_to_pl_cmd<'a>(&'a self, pl: &str, cmd: &str, app: ClapCommand<'a>, cache: &mut CmdOptCache) -> ClapCommand<'a> { + self.apply_to(&CmdSrc::Plugin(pl.to_string(), cmd.to_string()), app, cache) + } + + pub fn apply_to_aux_cmd<'a>(&'a self, ns: &str, cmd: &str, app: ClapCommand<'a>, cache: &mut CmdOptCache) -> ClapCommand<'a> { + self.apply_to(&CmdSrc::Aux(ns.to_string(), cmd.to_string()), app, cache) + } + + // Apply any extensions, returning an unaltered command if no extensions are available for this command. + pub fn apply_to<'a>(&'a self, cmd: &CmdSrc, mut app: ClapCommand<'a>, cache: &mut CmdOptCache) -> ClapCommand<'a> { + if let Some(exts) = self.extensions.get(cmd) { + for ext in exts { + if let Some(opts) = ext.opts.as_ref() { + app = super::apply_opts(opts, app, cache, Some(ext)); + } + } + } + app + } + + pub fn get_core_ext(&self, cmd_path: &str) -> Option<&Vec> { + self.extensions.get(&CmdSrc::Core(cmd_path.to_string())) + } + + pub fn get_app_ext(&self, cmd_path: &str) -> Option<&Vec> { + self.extensions.get(&CmdSrc::App(cmd_path.to_string())) + } + + pub fn get_pl_ext(&self, pl: &str, cmd_path: &str) -> Option<&Vec> { + self.extensions.get(&CmdSrc::Plugin(pl.to_string(), cmd_path.to_string())) + } + + pub fn get_aux_ext(&self, ns: &str, cmd_path: &str) -> Option<&Vec> { + self.extensions.get(&CmdSrc::Aux(ns.to_string(), cmd_path.to_string())) + } +} + +#[derive(Debug, Deserialize)] +pub struct ExtensionTOML { + pub extend: String, // Command to extend + pub in_global_context: Option, // Extend in the global context + pub in_app_context: Option, // Extend in application context + pub on_env: Option>, + pub opt: Option>, + // TODO see about supporting some of these in the future? + // pub name: String, + // pub help: String, + // pub alias: Option, + // pub arg: Option>, + // pub subcommands: Option>, + // pub full_name: String, +} + +#[derive(Debug, Hash, Eq, PartialEq, Clone)] +pub enum ExtensionSource { + App, + Plugin(String), + Aux(String, PathBuf), +} + +impl ExtensionSource { + pub fn to_path(&self) -> String { + match self { + Self::App => "app".to_string(), + Self::Plugin(pl_name) => format!("plugin.{pl_name}"), + Self::Aux(ns, _) => format!("aux.{ns}") + } + } +} + +impl fmt::Display for ExtensionSource { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::App => write!(f, "the App"), + Self::Plugin(pl_name) => write!(f, "plugin '{}'", pl_name), + Self::Aux(ns, _) => write!(f, "aux namespace '{}'", ns) + } + } +} + +#[derive(Debug)] +pub struct Extension { + pub extends: CmdSrc, + pub in_global_context: Option, + pub in_app_context: Option, + pub on_env: Option>, + pub opts: Option>, + + pub source: ExtensionSource, +} + +impl Extension { + pub fn from_extension_toml(ext_source: ExtensionSource, ext: ExtensionTOML) -> Result> { + let mut slf = Self { + in_global_context: ext.in_global_context, + in_app_context: ext.in_app_context, + on_env: ext.on_env, + opts: None, + source: ext_source, + extends: CmdSrc::new(&ext.extend)?, + }; + if !slf.applies()? { + return Ok(None) + } + slf.opts = from_toml_opts!(ext.opt, &slf.extends.to_string(), Some(&slf.source.to_string())); + if let Some(opts) = slf.opts.as_mut() { + for opt in opts { + opt.help += &format!(" [Extended from {}]", + match slf.source { + ExtensionSource::App => { + "the app".to_string() + }, + ExtensionSource::Plugin(ref pl_name) => { + format!("plugin: '{}'", pl_name) + }, + ExtensionSource::Aux(ref ns, _) => { + format!("aux namespace: '{}'", ns) + } + } + ); + opt.full_name = Some(format!("{}.{}.{}", EXT_BASE_NAME, slf.source.to_path(), opt.name)); + } + } + Ok(Some(slf)) + } +} + +impl Applies for Extension { + fn in_global_context(&self) -> Option { + self.in_global_context + } + + fn in_app_context(&self) -> Option { + self.in_app_context + } + + fn on_env(&self) -> Option<&Vec> { + self.on_env.as_ref() + } + + fn on_env_error_msg(&self, e: &String) -> String { + format!("Failed to parse 'on_env' '{}', extending '{}', for {}", e, self.extends, self.source) + } +} diff --git a/rust/origen/cli/src/framework/helps.rs b/rust/origen/cli/src/framework/helps.rs new file mode 100644 index 00000000..2563d5c0 --- /dev/null +++ b/rust/origen/cli/src/framework/helps.rs @@ -0,0 +1,213 @@ +use std::collections::HashMap; +use crate::commands::_prelude::*; +use std::fmt; +use super::extensions::ExtensionSource; +use origen_metal::indexmap::IndexSet; + +pub const NOT_EXTENDABLE_MSG: &'static str = "This command does not support extensions."; + +#[derive(Debug)] +pub struct CmdHelps { + helps: HashMap +} + +impl CmdHelps { + pub fn new() -> Self { + Self { + helps: HashMap::new() + } + } + + pub fn core_cmd(&self, cmd: &str) -> Command { + self.apply_core_cmd_helps(cmd, Command::new(cmd)) + } + + pub fn core_subc(&self, cmd_path: &[&str]) -> Command { + self.apply_core_subc_helps(cmd_path, Command::new(*cmd_path.last().unwrap())) + } + + pub fn add_core_cmd(&mut self, cmd_name: &str) -> &mut CmdHelp { + self.helps.entry(CmdSrc::Core(cmd_name.to_string())).or_default() + } + + pub fn add_core_sub_cmd(&mut self, cmd_path: &[&str]) -> &mut CmdHelp { + self.helps.entry(CmdSrc::Core(cmd_path.join("."))).or_default() + } + + pub fn add_app_cmd(&mut self, cmd_name: &str) -> &mut CmdHelp { + self.helps.entry(CmdSrc::App(cmd_name.to_string())).or_default() + } + + pub fn add_pl_cmd(&mut self, pl_name: &str, cmd_name: &str) -> &mut CmdHelp { + self.helps.entry(CmdSrc::Plugin(pl_name.to_string(), cmd_name.to_string())).or_default() + } + + pub fn add_aux_cmd(&mut self, ns: &str, cmd_name: &str) -> &mut CmdHelp { + self.helps.entry(CmdSrc::Aux(ns.to_string(), cmd_name.to_string())).or_default() + } + + pub fn apply_core_cmd_helps<'a>(&'a self, cmd_name: &str, app: Command<'a>) -> Command<'a> { + self.apply_helps(&CmdSrc::Core(cmd_name.to_string()), app) + } + + pub fn apply_core_subc_helps<'a>(&'a self, cmd_path: &[&str], app: Command<'a>) -> Command<'a> { + self.apply_helps(&CmdSrc::Core(cmd_path.join(".")), app) + } + + pub fn apply_helps<'a>(&'a self, cmd_src: &CmdSrc, mut app: Command<'a>) -> Command<'a> { + if let Some(helps) = self.helps.get(cmd_src) { + if let Some(h) = helps.before_help.as_ref() { + app = app.before_help(h.as_str()); + } + if let Some(h) = helps.help.as_ref() { + app = app.about(h.as_str()); + } + if let Some(h) = helps.after_help.as_ref() { + app = app.after_help(h.as_str()); + } + } else { + log_error!("Could not apply help messages to {} - no such command found", cmd_src); + } + app + } + + pub fn apply_exts(&mut self, extensions: &Extensions) { + for (target, exts) in extensions.exts() { + if let Some(help) = self.helps.get_mut(&target) { + if !help.extendable { + log_error!("Command '{}' does not support extensions but an extension was attempted from:", target); + for ext in exts { + log_error!("\t{}", ext.source); + } + continue; + } + + let mut extended_from_app = false; + let mut pls: IndexSet<&str> = IndexSet::new(); + let mut nspaces: IndexSet<&str> = IndexSet::new(); + for ext in exts.iter() { + match ext.source { + ExtensionSource::App => extended_from_app = true, + ExtensionSource::Plugin(ref n) => { pls.insert(n); }, + ExtensionSource::Aux(ref n, _) => { nspaces.insert(n); }, + } + } + let mut msg = "This command is extended from:".to_string(); + if extended_from_app { + msg += "\n - the App"; + } + if !pls.is_empty() { + msg += &format!( + "\n - Plugins: {}", + pls.iter().map(|n| format!("'{}'", n)).collect::>().join(", ") + ); + } + if !nspaces.is_empty() { + msg += &format!( + "\n - Aux Namespaces: {}", + nspaces.iter().map(|n| format!("'{}'", n)).collect::>().join(", ") + ); + } + if let Some(after) = help.after_help.as_ref() { + help.after_help = Some(after.to_string() + "\n\n" + &msg); + } else { + help.after_help = Some(msg); + } + } else { + log_error!("Tried to extend unknown command '{}' from:", target); + for ext in exts { + log_error!("\t{}", ext.source); + } + } + } + } +} + +#[derive(Debug)] +pub struct CmdHelp { + help: Option, + after_help: Option, + before_help: Option, + extendable: bool, +} + +impl Default for CmdHelp { + fn default() -> Self { + Self { + help: None, + after_help: None, + before_help: None, + extendable: true, + } + } +} + +impl CmdHelp { + pub fn set_help_msg(&mut self, help_msg: &str) -> &mut Self { + self.help = Some(help_msg.to_string()); + self + } + + pub fn set_as_not_extendable(&mut self) -> &mut Self { + self.extendable = false; + if let Some(h) = self.after_help.as_mut() { + self.after_help = Some(format!("{h}\n\n{NOT_EXTENDABLE_MSG}")); + } else { + self.after_help = Some(NOT_EXTENDABLE_MSG.to_string()); + } + self + } +} + +#[derive(Debug, Hash, Eq, PartialEq)] +pub enum CmdSrc { + Core(String), // Core command + App(String), // App command + Plugin(String, String), // Plugin command + Aux(String, String), // Aux command +} + +impl CmdSrc { + pub fn new(target: &str) -> Result { + let (scope, t) = target.split_once('.').ok_or_else(|| format!("Could not discern scope from '{}'", target))?; + Ok(match scope { + "origen" => Self::Core(t.to_string()), + "app" => Self::App(t.to_string()), + "plugin" => { + let (pl_name, pl_t) = t.split_once('.').ok_or_else(|| format!("Could not discern plugin from '{}'", t))?; + Self::Plugin(pl_name.to_string(), pl_t.to_string()) + } + "aux" | "aux_ns" => { + let (ns_name, aux_t) = t.split_once('.').ok_or_else(|| format!("Could not discern auxillary command namespace from '{}'", t))?; + Self::Aux(ns_name.to_string(), aux_t.to_string()) + } + _ => bail!("Unknown target scope '{}'. Expected 'origen', 'app', 'aux', or 'plugin'", scope) + }) + } + + pub fn offset_path(&self) -> &str { + match self { + Self::Core(cmd) | Self::App(cmd) => &cmd, + Self::Plugin(_, cmd) | Self::Aux(_, cmd) => &cmd + } + } +} + +impl fmt::Display for CmdSrc { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + Self::Core(cmd) => { + write!(f, "origen.{}", cmd) + }, + Self::App(cmd) => { + write!(f, "app.{}", cmd) + }, + Self::Plugin(pl_name, cmd) => { + write!(f, "plugin.{}.{}", pl_name, cmd) + }, + Self::Aux(ns_name, cmd) => { + write!(f, "aux_ns.{}.{}", ns_name, cmd) + } + } + } +} \ No newline at end of file diff --git a/rust/origen/cli/src/framework/mod.rs b/rust/origen/cli/src/framework/mod.rs new file mode 100644 index 00000000..be694f1d --- /dev/null +++ b/rust/origen/cli/src/framework/mod.rs @@ -0,0 +1,1080 @@ +pub mod helps; +pub mod extensions; +pub mod plugins; +pub mod aux_cmds; +pub mod app_cmds; +pub mod core_cmds; +pub mod cmd_gen_helpers; + +use std::collections::HashMap; +use origen_metal::indexmap::IndexMap; + +pub use extensions::{Extensions, ExtensionTOML, Extension}; +pub use plugins::{Plugins, Plugin}; +pub use aux_cmds::AuxCmds; +pub use app_cmds::AppCmds; +pub use helps::{CmdHelps, CmdHelp, CmdSrc}; +use std::{env}; + +use clap::{App}; +use clap::Command as ClapCommand; +use clap::Arg as ClapArg; +use origen::{Result, in_app_invocation}; +use crate::commands::_prelude::clap_arg_actions::*; + +#[macro_export] +macro_rules! uses_reserved_prefix { + ($q:expr) => {{ + $q.starts_with(crate::framework::extensions::EXT_BASE_PREFIX) + }} +} + +#[macro_export] +macro_rules! err_processing_cmd_preface { + ($func:ident, $cmd_path:expr, $msg:expr, $($arg:expr),* $(,)?) => {{ + $func!(concat!("When processing command '{}': ", $msg), $cmd_path, $($arg),*) + }} +} + +#[macro_export] +macro_rules! log_err_processing_cmd { + ($cmd_path:expr, $msg:expr, $($arg:expr),* $(,)?) => {{ + crate::err_processing_cmd_preface!(log_error, $cmd_path, $msg, $($arg),*) + }}; +} + +#[macro_export] +macro_rules! from_toml_args { + ($toml_args: expr, $cmd_path: expr) => {{ + let mut current_names: Vec> = vec!(); + $toml_args.as_ref() + .map(|args| args.iter() + .filter_map( |a| { + if let Some(i) = current_names.iter().position( |n| *n == Some(&a.name)) { + crate::log_err_processing_cmd!( + $cmd_path, + "Argument '{}' is already present. Subsequent occurrences will be skipped (first occurrence at index {})", + &a.name, + i + ); + current_names.push(None); + None + } else if crate::uses_reserved_prefix!(a.name) { // a.name.starts_with(crate::framework::extensions::EXT_BASE_NAME) { + crate::log_err_processing_cmd!( + $cmd_path, + "Argument '{}' uses reserved prefix '{}'. This option will not be available.", + &a.name, + crate::framework::extensions::EXT_BASE_NAME + ); + current_names.push(None); + None + } else { + current_names.push(Some(&a.name)); + Some(crate::framework::Arg::from_toml(a)) + } + }) + .collect::>()) + }} +} + +#[macro_export] +macro_rules! from_toml_opts { + ($toml_opts: expr, $cmd_path: expr) => { + crate::from_toml_opts!($toml_opts, $cmd_path, None::<&str>) + }; + ($toml_opts: expr, $cmd_path: expr, $ext_from: expr) => {{ + let mut current_names: Vec> = vec!(); + $toml_opts.as_ref() + .map(|opts| opts.iter() + .filter_map( |o| { + if let Some(i) = current_names.iter().position( |n| *n == Some(&o.name)) { + if let Some(ext) = $ext_from { + crate::log_err_processing_cmd!( + $cmd_path, + "Option '{}' extended from {} is already present. Subsequent occurrences will be skipped (first occurrence at index {})", + &o.name, + ext, + i + ); + } else { + crate::log_err_processing_cmd!( + $cmd_path, + "Option '{}' is already present. Subsequent occurrences will be skipped (first occurrence at index {})", + &o.name, + i + ); + } + current_names.push(None); + None + } else if crate::uses_reserved_prefix!(o.name) { + if let Some(ext) = $ext_from { + crate::log_err_processing_cmd!( + $cmd_path, + "Option '{}' extended from {} uses reserved prefix '{}'. This option will not be available", + &o.name, + ext, + crate::framework::extensions::EXT_BASE_NAME + ); + } else { + crate::log_err_processing_cmd!( + $cmd_path, + "Option '{}' uses reserved prefix '{}'. This option will not be available", + &o.name, + crate::framework::extensions::EXT_BASE_NAME + ); + } + current_names.push(None); + None + } else { + current_names.push(Some(&o.name)); + Some(crate::framework::Opt::from_toml(o, $cmd_path, $ext_from)) + } + }) + .collect::>()) + }} +} + +pub trait Applies { + fn in_app_context(&self) -> Option; + fn in_global_context(&self) -> Option; + fn on_env(&self) -> Option<&Vec>; + fn on_env_error_msg(&self, e: &String) -> String; + + fn applies(&self) -> Result { + Ok(self.applies_with_env()? && self.applies_in_context()?) + } + + fn applies_in_app_context(&self) -> Result { + Ok(self.in_app_context().unwrap_or(true)) + } + + fn applies_in_global_context(&self) -> Result { + Ok(self.in_global_context().unwrap_or(true)) + } + + fn applies_in_context(&self) -> Result { + if in_app_invocation() { + self.applies_in_app_context() + } else { + self.applies_in_global_context() + } + } + + fn applies_with_env(&self) -> Result { + if let Some(envs) = self.on_env() { + for e in envs { + let mut s = e.splitn(1, '='); + let e_name= s.next().ok_or_else( || self.on_env_error_msg(e))?.trim(); + let e_val = s.next(); + match env::var(e_name) { + Ok(val) => { + if let Some(v) = e_val { + if v == val { + return Ok(true); + } + } else { + return Ok(true); + } + }, + Err(err) => match err { + env::VarError::NotPresent => {}, + _ => { + return Err(err.into()); + } + } + } + } + Ok(false) + } else { + Ok(true) + } + } +} + +#[derive(Debug, Deserialize)] +pub (crate) struct CommandsToml { + pub command: Option>, + pub extension: Option> +} + +#[derive(Debug, Deserialize, Clone)] +pub struct CommandTOML { + pub name: String, + pub help: String, + pub alias: Option, + pub arg: Option>, + pub opt: Option>, + pub subcommand: Option>, + pub add_target_opt: Option, + pub add_mode_opt: Option, + pub in_global_context: Option, + pub in_app_context: Option, + pub on_env: Option>, +} + +#[derive(Debug)] +pub struct Command { + pub name: String, + pub help: String, + pub alias: Option, + pub args: Option>, + pub opts: Option>, + pub subcommands: Option>, + pub add_mode_opt: Option, + pub add_target_opt: Option, + pub cmd_path: CmdSrc, + pub in_global_context: Option, + pub in_app_context: Option, + pub on_env: Option>, +} + +impl Command { + pub fn from_toml_cmd(cmd: &CommandTOML, cmd_path: CmdSrc, parent_cmd: Option<&Self>) -> Result> { + let mut slf = Self { + name: cmd.name.to_owned(), + help: cmd.help.to_owned(), + alias: cmd.alias.to_owned(), + args: None, + opts: None, + subcommands: None, + add_mode_opt: cmd.add_mode_opt.or_else(|| { + if let Some(p) = parent_cmd { + p.add_mode_opt.to_owned() + } else { + None + } + }), + add_target_opt: cmd.add_target_opt.or_else(|| { + if let Some(p) = parent_cmd { + p.add_target_opt.to_owned() + } else { + None + } + }), + cmd_path: cmd_path, + in_global_context: cmd.in_global_context, + in_app_context: cmd.in_app_context, + on_env: cmd.on_env.to_owned(), + }; + if !slf.applies()? { + return Ok(None) + } + let fp = slf.cmd_path.to_string(); + slf.args = from_toml_args!(cmd.arg, &fp); + slf.opts = from_toml_opts!(cmd.opt, &fp); + if let Some(args) = slf.args.as_ref() { + if let Some(opts) = slf.opts.as_mut() { + opts.retain(|o| { + if let Some(idx) = args.iter().position(|a| a.name == o.name) { + crate::log_err_processing_cmd!( + &fp, + "Option '{}' conflicts with Arg of the same name (Arg #{})", + o.name, + idx, + ); + false + } else { + true + } + }); + } + } + slf.subcommands = cmd.subcommand.as_ref().map(|sub_cmds| + sub_cmds.iter().map(|c| format!("{}.{}", &slf.offset_path(), &c.name.to_string())).collect::>() + ); + Ok(Some(slf)) + } + + pub fn add_mode_opt(&self) -> bool { + self.add_mode_opt.unwrap_or(true) + } + + pub fn add_target_opt(&self) -> bool { + self.add_target_opt.unwrap_or(true) + } + + pub fn offset_path(&self) -> &str { + self.cmd_path.offset_path() + } +} + +impl Applies for Command { + fn in_global_context(&self) -> Option { + self.in_global_context + } + + fn in_app_context(&self) -> Option { + self.in_app_context + } + + fn on_env(&self) -> Option<&Vec> { + self.on_env.as_ref() + } + + fn on_env_error_msg(&self, e: &String) -> String { + format!("Failed to parse 'on_env' '{}', for command {}", e, self.offset_path()) + } +} + +#[derive(Debug)] +pub struct CmdOptCache { + opt_names: Vec, + lns: HashMap, + ilns: HashMap, + ln_aliases: HashMap, + sns: HashMap, + sn_aliases: HashMap, + ext_opt_names: IndexMap, + exts: Vec, + cmd_path: String, + last_needs_visible_full_name: bool, + current: String, + +} + +macro_rules! processing_exts { + ($slf:expr) => {{ + $slf.exts.len() > 0 + }} +} + +macro_rules! conflict_err_msg { + ($self:expr, $conflict:expr, $name:expr, $conflict_type:expr, $with_type:expr) => {{ + if processing_exts!($self) { + if $conflict.0 { + // Conflict with the command itself + log_err_processing_cmd!( + $self.cmd_path, + concat!($conflict_type, " '{}' for extension option '{}', from {}, conflicts with ", $with_type, " from command option '{}'"), + $name, + $self.current, + $self.exts.last().unwrap(), + $self.opt_names[$conflict.1] + ); + } else { + // Conflict with an extension + let e = $self.ext_opt_names.get_index($conflict.1).unwrap(); + log_err_processing_cmd!( + $self.cmd_path, + concat!($conflict_type, " '{}' for extension option '{}', from {}, conflicts with ", $with_type, " for extension '{}' provided by {}"), + $name, + $self.current, + $self.exts.last().unwrap(), + e.0, + $self.exts[*e.1] + ); + } + } else { + log_err_processing_cmd!( + $self.cmd_path, + concat!($conflict_type, " '{}' for command option '{}' conflicts with ", $with_type, " from option '{}'"), + $name, + $self.current, + $self.opt_names[$conflict.1] + ); + } + }} +} + +macro_rules! cache { + ($slf:expr, $cache:ident, $to_cache:expr) => {{ + $slf.$cache.insert($to_cache, { + if processing_exts!($slf) { + (false, $slf.ext_opt_names.len() - 1) + } else { + (true, $slf.opt_names.len() - 1) + } + }); + }} +} + +impl CmdOptCache { + pub fn new(cmd_path: String) -> Self { + let slf = Self { + opt_names: Vec::new(), + lns: HashMap::new(), + ilns: HashMap::new(), + ln_aliases: HashMap::new(), + sns: HashMap::new(), + sn_aliases: HashMap::new(), + ext_opt_names: IndexMap::new(), + exts: Vec::new(), + cmd_path: cmd_path, + last_needs_visible_full_name: true, + current: "".to_string(), + }; + slf + } + + pub fn unchecked_populated(cmd: &App, cmd_path: String) -> Self { + let mut slf = Self::new(cmd_path); + for (i, arg) in cmd.get_arguments().enumerate() { + let mut push_arg = false; + if let Some(ln) = arg.get_long() { + slf.lns.insert(ln.to_string(), (true, i)); + push_arg = true; + } + if let Some(lns) = arg.get_all_aliases() { + slf.ln_aliases.extend(lns.iter().map( |ln| (ln.to_string(), (true, i))).collect::>()); + push_arg = true; + } + if let Some(sn) = arg.get_short() { + slf.sns.insert(sn, (true, i)); + push_arg = true; + } + if let Some(sns) = arg.get_all_short_aliases() { + slf.sn_aliases.extend(sns.iter().map( |sn| (*sn, (true, i))).collect::>()); + push_arg = true; + } + + if push_arg { + slf.opt_names.push(arg.get_id().to_string()); + } + } + slf + } + + pub fn register(&mut self, name: &String, ext: Option<&Extension>) -> bool { + // TODO name conflict. Probably a better way to deal with this but just skip for now + self.current = name.to_string(); + if let Some(e) = ext { + self.exts.push(e.source.to_string()); + if !self.ext_opt_names.contains_key(name) { + self.ext_opt_names.insert(name.to_string(), self.exts.len() - 1); + } + } else { + self.opt_names.push(name.to_string()); + } + true + } + + pub fn iln_conflicts(&mut self, iln: &String) -> bool { + if let Some(conflict) = self.ln_aliases.get(iln) { + conflict_err_msg!(self, conflict, iln, "Inferred long name", "long name alias"); + true + } else if let Some(conflict) = self.lns.get(iln) { + conflict_err_msg!(self, conflict, iln, "Inferred long name", "long name"); + true + } else if let Some(conflict) = self.ilns.get(iln) { + conflict_err_msg!(self, conflict, iln, "Inferred long name", "inferred long name"); + true + } else { + cache!(self, ilns, iln.to_owned()); + self.last_needs_visible_full_name = false; + false + } + } + + pub fn ln_conflicts(&mut self, ln: &String) -> bool { + if let Some(conflict) = self.ln_aliases.get(ln) { + conflict_err_msg!(self, conflict, ln, "Long name", "long name alias"); + true + } else if let Some(conflict) = self.lns.get(ln) { + conflict_err_msg!(self, conflict, ln, "Long name", "long name"); + true + } else if let Some(conflict) = self.ilns.get(ln) { + conflict_err_msg!(self, conflict, ln, "Long name", "inferred long name"); + true + } else { + cache!(self, lns, ln.to_owned()); + self.last_needs_visible_full_name = false; + false + } + } + + pub fn sn_conflicts(&mut self, sn: char) -> bool { + if let Some(conflict) = self.sn_aliases.get(&sn) { + conflict_err_msg!(self, conflict, sn, "Short name", "short name alias"); + true + } else if let Some(conflict) = self.sns.get(&sn) { + conflict_err_msg!(self, conflict, sn, "Short name", "short name"); + true + } else { + cache!(self, sns, sn); + self.last_needs_visible_full_name = false; + false + } + } + + pub fn non_conflicting_snas(&mut self, snas: &Vec) -> Vec { + snas.iter().filter_map( |sna| { + if let Some(conflict) = self.sn_aliases.get(sna) { + conflict_err_msg!(self, conflict, sna, "Short name alias", "short name alias"); + None + } else if let Some(conflict) = self.sns.get(sna) { + conflict_err_msg!(self, conflict, sna, "Short name alias", "short name"); + None + } else { + cache!(self, sn_aliases, *sna); + Some(*sna) + } + }).collect::>() + } + + pub fn non_conflicting_lnas<'a>(&mut self, lnas: &'a Vec) -> Vec<&'a str> { + lnas.iter().filter_map( |lna| { + if let Some(conflict) = self.ln_aliases.get(lna) { + conflict_err_msg!(self, conflict, lna, "Long name alias", "long name alias"); + None + } else if let Some(conflict) = self.lns.get(lna) { + conflict_err_msg!(self, conflict, lna, "Long name alias", "long name"); + None + } else if let Some(conflict) = self.ilns.get(lna) { + conflict_err_msg!(self, conflict, lna, "Long name alias", "inferred long name"); + None + } else { + cache!(self, ln_aliases, lna.to_owned()); + Some(lna.as_str()) + } + }).collect::>() + } + + pub fn needs_visible_full_name(&mut self) -> bool { + let retn = self.last_needs_visible_full_name; + self.last_needs_visible_full_name = true; + retn + } +} + +#[derive(Debug, Deserialize, Clone)] +pub struct ArgTOML { + pub name: String, + pub help: String, + pub multiple: Option, + pub required: Option, + pub value_name: Option, + pub use_delimiter: Option, +} + +#[derive(Debug)] +pub struct Arg { + pub name: String, + pub help: String, + pub multiple: Option, + pub required: Option, + pub value_name: Option, + pub use_delimiter: Option, + pub upcased_name: Option, +} + +impl Arg { + fn from_toml(arg: &ArgTOML) -> Self { + Self { + name: arg.name.to_owned(), + help: arg.help.to_owned(), + multiple: arg.multiple, + required: arg.required, + value_name: arg.value_name.to_owned(), + use_delimiter: arg.use_delimiter, + upcased_name: { + if arg.value_name.is_some() { + None + } else { + Some(arg.name.to_uppercase()) + } + }, + } + } +} + +#[derive(Debug, Deserialize, Clone)] +pub struct OptTOML { + pub name: String, + pub help: String, + pub short: Option, + pub long: Option, + pub takes_value: Option, + pub multiple: Option, + pub required: Option, + pub value_name: Option, + pub use_delimiter: Option, + pub short_aliases: Option>, + pub long_aliases: Option>, + pub hidden: Option, +} + +#[derive(Debug)] +pub struct Opt { + pub name: String, + pub help: String, + pub short: Option, + pub long: Option, + pub takes_value: Option, + pub multiple: Option, + pub required: Option, + pub value_name: Option, + pub use_delimiter: Option, + pub short_aliases: Option>, + pub long_aliases: Option>, + pub hidden: Option, + pub upcased_name: Option, + pub full_name: Option, +} + +impl Opt { + fn from_toml(opt: &OptTOML, cmd_path: &str, ext_from: Option<&str>) -> Self { + macro_rules! gen_err { + ($msg:tt $(,)? $($arg:expr),*) => {{ + if let Some(ext) = ext_from { + log_err_processing_cmd!(cmd_path, concat!("Option '{}' extended from {} ", $msg), opt.name, ext, $($arg),*); + } else { + log_err_processing_cmd!(cmd_path, concat!("Option '{}' ", $msg), opt.name, $($arg),*); + } + }} + } + + macro_rules! res_opt_ln_msg { + ($conflict:expr, $name:expr) => { + gen_err!( + "tried to use reserved option {} '{}' and will not be available as '--{}'", + $conflict, + $name, + $name + ); + } + } + macro_rules! res_opt_sn_msg { + ($conflict:expr, $name:expr) => { + gen_err!( + "tried to use reserved option {} '{}' and will not be available as '-{}'", + $conflict, + $name, + $name + ) + } + } + macro_rules! res_prefix_msg { + ($conflict:expr, $name:expr) => { + gen_err!( + "uses reserved prefix '{}' in {} '{}' and will not be available as '--{}'", + crate::framework::extensions::EXT_BASE_NAME, + $conflict, + $name, + $name + ) + } + } + + let ln = opt.long.as_ref().and_then ( |ln| { + if RESERVED_OPT_NAMES.contains(&ln.as_str()) { + res_opt_ln_msg!("long name", ln); + None + } else if uses_reserved_prefix!(ln) { + res_prefix_msg!("long name", ln); + None + } else { + Some(ln.to_owned()) + } + }); + + let sn = opt.short.as_ref().and_then ( |sn| { + if RESERVED_OPT_SHORT_NAMES.contains(sn) { + res_opt_sn_msg!("short name", sn); + None + } else { + Some(*sn) + } + }); + + Self { + name: opt.name.to_owned(), + help: opt.help.to_owned(), + takes_value: opt.takes_value, + multiple: opt.multiple, + required: opt.required, + value_name: opt.value_name.to_owned(), + use_delimiter: opt.use_delimiter, + short_aliases: { + let mut snas: HashMap<&char, usize> = HashMap::new(); + opt.short_aliases.as_ref().map( |sns| sns.iter().enumerate().filter_map( |(i, sna)| { + if RESERVED_OPT_SHORT_NAMES.contains(sna) { + res_opt_sn_msg!("short name alias", sna); + return None; + } else if sn.is_some() && (sn.as_ref().unwrap() == sna) { + gen_err!("specifies short name alias '{}' but it conflicts with the option's short name", sna); + return None; + } else if let Some(idx) = snas.get(sna) { + gen_err!("repeats short name alias '{}' (first occurrence at index {})", sna, idx); + return None; + } + snas.insert(sna, i); + Some(*sna) + }).collect()) + }, + short: sn, + long_aliases: { + let mut lnas: HashMap<&String, usize> = HashMap::new(); + opt.long_aliases.as_ref().map( |lns| lns.iter().enumerate().filter_map( |(i, lna)| { + if RESERVED_OPT_NAMES.contains(&lna.as_str()) { + res_opt_ln_msg!("long name alias", lna); + return None + } else if uses_reserved_prefix!(lna) { + res_prefix_msg!("long name alias", lna); + return None + } else if ln.is_some() && (ln.as_ref().unwrap() == lna) { + gen_err!("specifies long name alias '{}' but it conflicts with the option's long name", lna); + return None + } else if (&opt.name == lna) && ln.is_none() { + gen_err!("specifies long name alias '{}' but it conflicts with the option's inferred long name. If this is intentional, please set this as the option's long name", lna); + return None + } else if let Some(idx) = lnas.get(lna) { + gen_err!("repeats long name alias '{}' (first occurrence at index {})", lna, idx); + return None + } + lnas.insert(lna, i); + Some(lna.to_owned()) + }).collect()) + }, + long: ln, + hidden: opt.hidden, + upcased_name: { + if opt.value_name.is_some() { + None + } else { + Some(opt.name.to_uppercase()) + } + }, + full_name: None, + } + } + + pub fn id(&self) -> &str { + if let Some(fname) = self.full_name.as_ref() { + fname.as_str() + } else { + self.name.as_str() + } + } +} + +pub (crate) fn build_commands<'a, F, G, H>(cmd_def: &'a Command, exts: &G, cmd_container: &F, apply_helps: &H) -> App<'a> +where + F: Fn(&str) -> &'a Command, + G: Fn(&str, App<'a>, &mut CmdOptCache) -> App<'a>, + H: Fn(&str, App<'a>) -> App<'a> +{ + let mut cmd = ClapCommand::new(&cmd_def.name); + + cmd = add_app_opts(cmd, cmd_def.add_mode_opt(), cmd_def.add_target_opt()); + + // TODO need test case for cmd alias + if cmd_def.alias.is_some() { + cmd = cmd.visible_alias(cmd_def.alias.as_ref().unwrap().as_str()); + } + + if let Some(args) = cmd_def.args.as_ref() { + cmd = apply_args(args, cmd); + } + + let mut cache = CmdOptCache::new(cmd_def.cmd_path.to_string()); + if let Some(opts) = cmd_def.opts.as_ref() { + cmd = apply_opts(opts, cmd, &mut cache, None); + } + + if let Some(subcommands) = &cmd_def.subcommands { + for c in subcommands { + let subcmd = build_commands( + cmd_container(c), + exts, + cmd_container, + apply_helps, + ); + cmd = cmd.subcommand(subcmd); + } + cmd = cmd.subcommand_negates_reqs(true); + } + cmd = exts(&cmd_def.offset_path(), cmd, &mut cache); + cmd = apply_helps(&cmd_def.offset_path(), cmd); + + cmd +} + +pub (crate) fn apply_args<'a>(args: &'a Vec, mut cmd: App<'a>) -> App<'a> { + for arg_def in args { + let mut arg = clap::Arg::new(arg_def.name.as_str()) + .action(SetArg) + .help(arg_def.help.as_str()); + + if let Some(vn) = arg_def.value_name.as_ref() { + arg = arg.value_name(vn); + } else { + arg = arg.value_name(arg_def.upcased_name.as_ref().unwrap()); + } + + if let Some(d) = arg_def.use_delimiter { + arg = arg.use_value_delimiter(d); + arg = arg.multiple_values(true).action(AppendArgs); + } + if let Some(m) = arg_def.multiple { + arg = arg.multiple_values(m).action(AppendArgs); + } + + if let Some(r) = arg_def.required { + arg = arg.required(r); + } + cmd = cmd.arg(arg); + } + cmd +} + +pub (crate) fn apply_opts<'a>(opts: &'a Vec, mut cmd: App<'a>, cache: &mut CmdOptCache, from_ext: Option<&Extension>) -> App<'a> { + for opt_def in opts { + cache.register(&opt_def.name, from_ext); + let mut opt = clap::Arg::new(opt_def.id()).action(CountArgs).help(opt_def.help.as_str()); + + if let Some(val_name) = opt_def.value_name.as_ref() { + opt = opt.value_name(val_name).action(SetArg); + } + if let Some(tv) = opt_def.takes_value { + if tv { + opt = opt.action(AppendArgs); + } + } + if let Some(ud) = opt_def.use_delimiter { + if ud { + opt = opt.use_value_delimiter(ud); + } + opt = opt.multiple_values(true); + opt = opt.action(AppendArgs); + } + if let Some(m) = opt_def.multiple { + if m { + opt = opt.multiple(m).action(AppendArgs); + } else { + opt = opt.multiple(m).action(SetArg); + } + } + + if let Some(ln) = opt_def.long.as_ref() { + if cache.ln_conflicts(ln) { + // long name clashes - try inferred long name + if !cache.iln_conflicts(&opt_def.name) { + opt = opt.long(&opt_def.name); + } + } else { + opt = opt.long(ln); + } + } else { + if !opt_def.short.is_some() { + if !cache.iln_conflicts(&opt_def.name) { + opt = opt.long(&opt_def.name); + } + } + } + if let Some(sn) = opt_def.short { + if !cache.sn_conflicts(sn) { + opt = opt.short(sn); + } else { + if !opt.get_long().is_some() { + if !cache.iln_conflicts(&opt_def.name) { + opt = opt.long(&opt_def.name); + } + } + } + } + + if let Some(r) = opt_def.required { + opt = opt.required(r); + } + + if let Some(h) = opt_def.hidden { + opt = opt.hidden(h); + } + + if opt.get_action().takes_values() && opt_def.value_name.is_none() { + opt = opt.value_name(opt_def.upcased_name.as_ref().unwrap().as_str()); + } + + if let Some(lns) = opt_def.long_aliases.as_ref() { + let v; + v = cache.non_conflicting_lnas(lns); + opt = opt.visible_aliases(&v[..]); + } + + if let Some(sns) = opt_def.short_aliases.as_ref() { + let to_add; + to_add = cache.non_conflicting_snas(sns); + opt = opt.visible_short_aliases(&to_add[..]); + } + + if from_ext.is_some() { + let full_name = opt_def.full_name.as_ref().unwrap(); + if cache.needs_visible_full_name() { + opt = opt.long(full_name); + } else { + opt = opt.alias(full_name.as_str()); + } + } else { + if cache.needs_visible_full_name() { + log_err_processing_cmd!( + cache.cmd_path, + "Unable to place unique long name, short name, or inferred long name for command option '{}'. Please resolve any previous conflicts regarding this option or add/update this option's name, long name, or short name", + opt_def.name + ); + continue; + } + } + + cmd = cmd.arg(opt); + } + cmd +} + +pub fn build_path<'a>(mut matches: &'a clap::ArgMatches) -> Result { + let mut path_pieces = vec!(); + while matches.subcommand_name().is_some() { + let n = matches.subcommand_name().unwrap(); + matches = matches.subcommand_matches(&n).unwrap(); + path_pieces.push(n); + } + Ok(path_pieces.join(".")) +} + +pub const HELP_OPT_NAME: &str = "help"; +pub const HELP_OPT_SHORT_NAME: char = 'h'; +pub const VERBOSITY_KEYWORDS_OPT_NAME: &str = "verbosity_keywords"; +pub const VERBOSITY_KEYWORDS_OPT_LONG_NAME: &str = "vk"; +pub const VERBOSITY_OPT_NAME: &str = "verbose"; +pub const VERBOSITY_OPT_SHORT_NAME: char = 'v'; +pub const VERBOSITY_OPT_LNA: &str = "verbosity"; +pub const TARGET_OPT_NAME: &str = "targets"; +pub const TARGET_OPT_ALIAS: &str = "target"; +pub const TARGET_OPT_SN: char = 't'; +pub const NO_TARGET_OPT_NAME: &str = "no_targets"; +pub const NO_TARGET_OPT_ALIAS: &str = "no_target"; +pub const MODE_OPT_NAME: &str = "mode"; + +pub const RESERVED_OPT_NAMES: &[&str] = &[ + HELP_OPT_NAME, + VERBOSITY_KEYWORDS_OPT_NAME, VERBOSITY_KEYWORDS_OPT_LONG_NAME, + TARGET_OPT_NAME, TARGET_OPT_ALIAS, + NO_TARGET_OPT_NAME, NO_TARGET_OPT_ALIAS, + MODE_OPT_NAME, + VERBOSITY_OPT_NAME, VERBOSITY_OPT_LNA, +]; + +pub const RESERVED_OPT_SHORT_NAMES: &[char] = &[ + HELP_OPT_SHORT_NAME, TARGET_OPT_SN, VERBOSITY_OPT_SHORT_NAME +]; + +static VERBOSITY_HELP_STR: &str = "Terminal verbosity level e.g. -v, -vv, -vvv"; +static VERBOSITY_KEYWORD_HELP_STR: &str = "Keywords for verbose listeners"; + +pub const VOV_OPT_NAME: &str = "version_or_verbosity"; + +pub fn add_verbosity_opts<'a>(cmd: ClapCommand<'a>, split_v: bool) -> ClapCommand<'a> { + if split_v { + cmd.arg( + ClapArg::new(VERBOSITY_OPT_NAME) + .long(VERBOSITY_OPT_NAME) + .visible_alias(VERBOSITY_OPT_LNA) + .action(CountArgs) + ) + .arg( + ClapArg::new(VOV_OPT_NAME) + .short(VERBOSITY_OPT_SHORT_NAME) + .action(CountArgs) + ) + } else { + cmd.arg( + ClapArg::new(VERBOSITY_OPT_NAME) + .long(VERBOSITY_OPT_NAME) + .visible_alias(VERBOSITY_OPT_LNA) + .short(VERBOSITY_OPT_SHORT_NAME) + .action(CountArgs) + .global(true) + .help(VERBOSITY_HELP_STR), + ) + } + .arg( + ClapArg::new(VERBOSITY_KEYWORDS_OPT_NAME) + .long(VERBOSITY_KEYWORDS_OPT_NAME) + .visible_alias(VERBOSITY_KEYWORDS_OPT_LONG_NAME) + .multiple(true) + .action(AppendArgs) + .global(true) + .help(VERBOSITY_KEYWORD_HELP_STR) + .number_of_values(1) + .use_value_delimiter(true) + ) +} + +macro_rules! add_mode_opt { + ($cmd:expr) => { + $cmd.arg(clap::Arg::new(crate::framework::MODE_OPT_NAME) + .long("mode") + .value_name("MODE") + .help("Override the default mode currently set by the workspace for this command") + .action(crate::framework::SetArg) + ) + } +} + +macro_rules! add_target_opt { + ($cmd:expr) => { + $cmd.arg(clap::Arg::new(crate::framework::TARGET_OPT_NAME) + .short('t') + .long(crate::framework::TARGET_OPT_NAME) + .visible_alias(TARGET_OPT_ALIAS) + .help("Override the targets currently set by the workspace for this command") + .action(crate::commands::_prelude::AppendArgs) + .use_value_delimiter(true) + .multiple_values(true) + .value_name("TARGETS") + .conflicts_with(crate::framework::NO_TARGET_OPT_NAME) + ).arg(clap::Arg::new(crate::framework::NO_TARGET_OPT_NAME) + .long(crate::framework::NO_TARGET_OPT_NAME) + .visible_alias(NO_TARGET_OPT_ALIAS) + .help("Clear any targets currently set by the workspace for this command") + .action(crate::commands::_prelude::SetArgTrue) + ) + } +} + +pub fn add_app_opts(mut cmd: ClapCommand, add_mode_opt: bool, add_target_opt: bool) -> ClapCommand { + if in_app_invocation() { + if add_target_opt { + cmd = add_target_opt!(cmd); + } + if add_mode_opt { + cmd = add_mode_opt!(cmd); + } + } + cmd +} + +pub fn add_all_app_opts(cmd: ClapCommand) -> ClapCommand { + if in_app_invocation() { + add_mode_opt!(add_target_opt!(cmd)) + } else { + cmd + } +} + +#[macro_export] +macro_rules! output_dir_opt { + () => {{ + Arg::new("output_dir") + .short('o') + .long("output-dir") + .visible_alias("output_dir") + .help("Override the default output directory (/output)") + .action(SetArg) + .value_name("OUTPUT_DIR") + }} +} + +pub const REF_DIR_OPT_LNAS: &[&str] = &["reference_dir", "ref_dir", "reference-dir"]; + +#[macro_export] +macro_rules! ref_dir_opt { + () => {{ + Arg::new("reference_dir") + .short('r') + .long("ref-dir") + .visible_aliases(&crate::framework::REF_DIR_OPT_LNAS) + .help("Override the default reference directory (/.ref)") + .action(SetArg) + .value_name("REFERENCE_DIR") + }} +} diff --git a/rust/origen/cli/src/framework/plugins.rs b/rust/origen/cli/src/framework/plugins.rs new file mode 100644 index 00000000..f6278130 --- /dev/null +++ b/rust/origen/cli/src/framework/plugins.rs @@ -0,0 +1,195 @@ +use origen::{Result, ORIGEN_CONFIG}; +use crate::python; +use std::path::PathBuf; +use indexmap::IndexMap; +use std::fs; +use crate::commands::_prelude::*; +use super::{ClapCommand, Command, CommandsToml, CommandTOML, Extensions, build_path}; +use super::helps::NOT_EXTENDABLE_MSG; + +pub (crate) fn add_pl_ns_helps(helps: &mut CmdHelps, plugins: Option<&Plugins>) { + if let Some(pls) = plugins { + for (pl_name, pl) in pls.plugins.iter() { + for (n, c) in pl.commands.iter() { + helps.add_pl_cmd(pl_name, n).set_help_msg(&c.help); + } + } + } +} + +pub (crate) fn add_pl_ns_subcmds<'a>(mut pl_sub: App<'a>, helps: &'a CmdHelps, plugins: &'a Plugins, exts: &'a Extensions) -> Result> { + for (pl_name, pl) in plugins.plugins.iter() { + let mut pl_sub_sub = ClapCommand::new(pl_name.as_str()).setting(AppSettings::ArgRequiredElseHelp).after_help(NOT_EXTENDABLE_MSG); + for n in pl.top_commands.iter() { + pl_sub_sub = pl_sub_sub.subcommand( + super::build_commands( + &pl.commands.get(n).unwrap(), + &|cmd, app, opt_cache| { + exts.apply_to_pl_cmd(&pl_name, cmd, app, opt_cache) + }, + &|cmd| { + plugins.plugins.get(pl_name).unwrap().commands.get(cmd).unwrap() + }, + &|cmd, app| { + helps.apply_helps(&CmdSrc::Plugin(pl_name.to_string(), cmd.to_string()), app) + } + ) + ); + } + pl_sub = pl_sub.subcommand(pl_sub_sub) + } + Ok(pl_sub) +} + +pub struct Plugins { + pub plugins: IndexMap +} + +impl Plugins { + pub fn new(exts: &mut Extensions) -> Result> { + if ORIGEN_CONFIG.should_collect_plugins() { + let mut slf = Self { + plugins: IndexMap::new(), + }; + + python::run_with_callbacks( + "import _origen; _origen.plugins.display_plugin_roots()", + Some(&mut |line| { + if let Some((status, result)) = line.split_once('|') { + match status { + "success" => { + if let Some((name, path)) = result.split_once('|') { + match Plugin::new(name, PathBuf::from(path), exts) { + Ok(pl) => { + slf.plugins.insert(name.to_string(), pl); + }, + Err(e) => { + log_trace!("Error collecting plugins: Unable to collect plugin {}: {}", path, e); + } + } + } else { + log_trace!("Error collecting plugins: Malformed output when collecting plugin roots (post status): {}", result) + } + }, + _ => log_trace!("Error collecting plugins: Unknown status when collecting plugin roots: {}", status) + } + } else { + log_trace!("Error collecting plugins: Malformed output encountered when collecting plugin roots: {}", line); + } + }), + Some(&mut |line| { + log_trace!("Error when collecting plugins: {}", line); + }), + )?; + Ok(Some(slf)) + } else { + Ok(None) + } + } + + pub fn is_empty(&self) -> bool { + self.plugins.is_empty() + } +} + +pub struct Plugin { + pub name: String, + pub root: PathBuf, + // TODO see about making this indices instead of duplicating string + pub top_commands: Vec, + pub commands: IndexMap::, +} + +impl Plugin { + fn _add_cmd(slf: &mut Self, current_path: String, current_cmd: &mut CommandTOML, parent_cmd: Option<&Command>) -> Result { + if let Some(c) = Command::from_toml_cmd(current_cmd, CmdSrc::Plugin(slf.name.to_owned(), current_path.to_string()), parent_cmd)? { + if let Some(ref mut sub_cmds) = current_cmd.subcommand { + for mut sub in sub_cmds { + Self::_add_cmd(slf, format!("{}.{}", current_path, &sub.name), &mut sub, Some(&c))?; + } + } + slf.commands.insert(current_path.clone(), c); + Ok(true) + } else { + Ok(false) + } + } + + pub fn new(name: &str, path: PathBuf, exts: &mut Extensions) -> Result { + let mut slf = Self { + name: name.to_string(), + root: path, + top_commands: vec!(), + commands: IndexMap::new(), + }; + + let commands_toml = slf.root.join("commands.toml"); + + if commands_toml.exists() { + let content = match fs::read_to_string(&commands_toml) { + Ok(x) => x, + Err(e) => { + bail!("{}", e); + } + }; + + let command_config: CommandsToml = match toml::from_str(&content) { + Ok(x) => x, + Err(e) => { + bail!("Malformed commands.toml: {}", e); + } + }; + + if let Some(commands) = command_config.command { + for mut cmd in commands { + if Self::_add_cmd(&mut slf, cmd.name.to_owned(), &mut cmd, None)? { + slf.top_commands.push(cmd.name.to_owned()); + } + } + } + + if let Some(extensions) = command_config.extension { + for ext in extensions { + match exts.add_from_pl_toml(&slf, ext) { + Ok(_) => {}, + Err(e) => log_error!("Failed to add extensions from plugin '{}': {}", slf.name, e) + } + } + } + } + + Ok(slf) + } + + pub fn dispatch(&self, cmd: &clap::ArgMatches, mut app: &clap::App, exts: &crate::Extensions, plugins: Option<&crate::Plugins>) -> Result<()> { + if cmd.subcommand().is_some() { + let path = build_path(&cmd)?; + + let mut matches = cmd; + let mut path_pieces: Vec = vec!(); + let mut overrides = IndexMap::new(); + app = app.find_subcommand("plugin").unwrap().find_subcommand(&self.name).unwrap(); + while matches.subcommand_name().is_some() { + let n = matches.subcommand_name().unwrap(); + matches = matches.subcommand_matches(&n).unwrap(); + app = app.find_subcommand(n).unwrap(); + path_pieces.push(n.to_string()); + } + + launch_as("_plugin_dispatch_", Some(&path_pieces), matches, app, exts.get_pl_ext(&self.name, &path), plugins, Some( + { + overrides.insert("dispatch_root".to_string(), Some(format!("r'{}/commands'", &self.root.display()))); + overrides.insert("dispatch_src".to_string(), Some(format!("r'{}'", &self.name))); + overrides + } + )); + + Ok(()) + } else { + // This case shouldn't happen as any non-valid command should be + // caught previously by clap and a non-command invocation should + // print the help message. + unreachable!("Expected a plugin name but none was found!"); + } + } +} diff --git a/rust/origen/cli/src/python.rs b/rust/origen/cli/src/python.rs index 3fc51adc..683a2489 100644 --- a/rust/origen/cli/src/python.rs +++ b/rust/origen/cli/src/python.rs @@ -1,26 +1,45 @@ // Responsible for managing Python execution - use crate::built_info; -use origen::Result; +use origen::{Result, STATUS}; +use origen::core::status::DependencySrc; +use origen_metal::utils::file::search_backwards_for_first; +use origen_metal::new_cmd; use semver::Version; +use std::env; use std::path::PathBuf; use std::process::{Command, ExitStatus, Stdio}; +use crate::_generated::python::PYTHONS; +pub use crate::_generated::python::MIN_PYTHON_VERSION; -const PYTHONS: &[&str] = &[ - "python", - "python3", - "python3.10", - "python3.9", - "python3.8", - "python3.7", - "python3.6", -]; -pub const MIN_PYTHON_VERSION: &str = "3.6.0"; +#[macro_export] +macro_rules! strs_to_cli_arr { + ($name:expr, $strs:expr) => {{ + format!( + "{}=[{}]", + $name, + $strs.map(|t| format!("r'{}'", t)).collect::>().join(", ") + ) + }} +} lazy_static! { pub static ref PYTHON_CONFIG: Config = Config::default(); } +macro_rules! pyproject_str { + () => { "pyproject.toml" } +} +macro_rules! user_env_str { + () => { "ORIGEN_PYPROJECT" } +} + +const PYPROJECT: &'static str = pyproject_str!(); +const USER_ENV: &'static str = user_env_str!(); + +lazy_static! { + pub static ref NO_ORIGEN_BOOT_MODULE_ERROR: &'static str = "ModuleNotFoundError: No module named 'origen.boot'"; +} + pub struct Config { pub available: bool, pub command: String, @@ -28,23 +47,177 @@ pub struct Config { pub error: String, } +pub fn resolve_pyproject() -> Result { + // TODO allow a .origen offset when looking for pyprojects? + // let offset = ".origen"; + if let Some(app) = STATUS.app.as_ref() { + let path = app.root.join(PYPROJECT); + log_trace!("Found app pyproject: {}", path.display()); + return Ok(DependencySrc::App(path)); + } + + if let Some(p) = search_backwards_for_first(env::current_dir()?, |p| { + let f = p.join(PYPROJECT); + log_trace!("Searching for workspace project from {}", p.display()); + if f.exists() { + log_trace!("Found workspace pyproject: {}", f.display()); + Ok(Some(f)) + } else { + Ok(None) + } + })? { + return Ok(DependencySrc::Workspace(p.to_path_buf())) + } + + if let Some(p) = env::var_os(USER_ENV) { + log_trace!("Attempting to find user-given pyproject: {}", p.to_string_lossy()); + let mut f = PathBuf::from(p); + if f.exists() { + f = f.join(PYPROJECT); + if f.exists() { + log_trace!("Found user-given pyproject: {}", f.display()); + return Ok(DependencySrc::UserGlobal(f)); + } else { + bail!(concat!("Could not locate ", pyproject_str!(), " from ", user_env_str!(), " {}"), f.display()); + } + } else { + bail!(concat!(user_env_str!(), " '{}' does not exists!"), f.display()); + } + } + + // Try the python package installation directory + let path = std::env::current_exe()?; + log_trace!("Searching CLI installation directories for pyproject: {}", path.display()); + if let Some(p) = search_backwards_for_first(path, |p| { + let f = p.join(PYPROJECT); + log_trace!("Searching for workspace project from {}", p.display()); + if f.exists() { + log_trace!("Found workspace pyproject: {}", f.display()); + Ok(Some(f)) + } else { + Ok(None) + } + })? { + return Ok(DependencySrc::Global(p.to_path_buf())) + } + + log_trace!("No pyproject found. Skipping Poetry invocations..."); + Ok(DependencySrc::NoneFound) +} + impl Config { + pub fn base_cmd(&self) -> Command { + let dep_src = STATUS.dependency_src(); + let mut c = new_cmd!(&self.command); + + if let Some(dep_src) = dep_src.as_ref() { + match dep_src { + DependencySrc::App(_path) | DependencySrc::Workspace(_path) => { + c.arg("-m"); + c.arg("poetry"); + }, + DependencySrc::UserGlobal(path) | DependencySrc::Global(path) => { + c.arg("-m"); + c.arg("poetry"); + c.arg("-C"); + c.arg(path); + } + DependencySrc::NoneFound => {} + } + } else { + log_error!("Dependency source has not been set - defaulting to global Python installation"); + } + c + } + + pub fn run_cmd(&self, code: &str) -> Command { + let mut c = self.base_cmd(); + if let Some(d) = STATUS.dependency_src().as_ref() { + if d.src_available() { + c.arg("run"); + c.arg(&self.command); + } + } + c.arg("-c"); + c.arg(code); + if let Some(d) = STATUS.dependency_src().as_ref() { + c.arg(format!("invocation={}", d)); + if let Some(path) = d.src_file() { + c.arg(format!("pyproject_src={}", path.display())); + } + } + c + } + pub fn poetry_command(&self) -> Command { let mut c = Command::new(&self.command); c.arg("-m"); c.arg("poetry"); + if let Some(d) = STATUS.dependency_src().as_ref() { + if let Some(path) = d.src_file() { + c.arg("-C"); + c.arg(path); + } + } c } + + // TODO Invocation see if these are needed or can be cleaned up + // fn get_origen_pkg_path(&self) -> Result { + // let mut c = Command::new("pip"); + // c.arg("show"); + // c.arg("origen"); + // let output = exec_and_capture_cmd(c)?; + // if let Some(loc) = output.1.iter().find_map( |line| line.strip_prefix("Location: ")) { + // Ok(PathBuf::from(loc)) + // } else { + // bail!( + // "Error locating origen package information from pip.\nReceived stdout:\n{}\nReceived stderr:\n{}", + // output.1.join("\n"), + // output.2.join("\n") + // ); + // } + // } + + // fn in_workspace(&self) -> Result { + // let mut c = Command::new(&self.command); + // c.arg("-m"); + // c.arg("poetry"); + // c.arg("env"); + // c.arg("info"); + // let output = exec_and_capture_cmd(c)?; + // if !output.0.success() { + // if let Some(l) = output.2.last() { + // if l.starts_with("Poetry could not find a pyproject.toml file in ") { + // return Ok(false); + // } + // } + // bail!( + // "Unexpected response when querying poetry environment:\nReceived stdout:\n{}Received stderr:\n{}", + // output.1.join("\n"), + // output.2.join("\n") + // ); + // } + // Ok(true) + // } } impl Default for Config { fn default() -> Config { let mut available = false; + match resolve_pyproject() { + Ok(deps) => { + STATUS.set_dependency_src(Some(deps)) + }, + Err(e) => log_error!("Errors encountered resolving pyproject: {}", e) + } for cmd in PYTHONS.iter() { + log_trace!("Searching for installed python at '{}'", cmd); match get_version(cmd) { Some(version) => { available = true; if version >= Version::parse(MIN_PYTHON_VERSION).unwrap() { + log_trace!("Found python version '{}'", cmd); return Config { available: true, command: cmd.to_string(), @@ -62,7 +235,7 @@ impl Default for Config { } Config { available: false, - command: String::new(), + command: String::from("python"), version: Version::parse("0.0.0").unwrap(), error: msg, } @@ -92,7 +265,7 @@ pub fn virtual_env() -> Result { /// Get the Python version from the given command fn get_version(command: &str) -> Option { - match Command::new(command).arg("--version").output() { + match new_cmd!(command).arg("--version").output() { Ok(output) => return extract_version(std::str::from_utf8(&output.stdout).unwrap()), Err(_e) => return None, } @@ -100,8 +273,6 @@ fn get_version(command: &str) -> Option { /// Returns the version of poetry (obtained from running "poetry --version") pub fn poetry_version() -> Option { - //log_trace!("Executing command: {} --version", &PYTHON_CONFIG.poetry_command); - //match Command::new(&PYTHON_CONFIG.poetry_command) match &PYTHON_CONFIG.poetry_command().arg("--version").output() { Ok(output) => { let text = std::str::from_utf8(&output.stdout).unwrap(); @@ -153,17 +324,7 @@ fn extract_version(text: &str) -> Option { /// Execute the given Python code pub fn run(code: &str) -> Result { - let mut cmd = PYTHON_CONFIG.poetry_command(); - cmd.arg("run"); - cmd.arg(&PYTHON_CONFIG.command); - cmd.arg("-c"); - cmd.arg(&code); - cmd.arg("-"); - cmd.arg(&format!("verbosity={}", origen::LOGGER.verbosity())); - cmd.arg(&format!( - "verbosity_keywords={}", - origen::LOGGER.keywords_to_cmd() - )); + let mut cmd = PYTHON_CONFIG.run_cmd(code); // current_exe returns the Python process once it gets underway, so pass in the CLI // location for Origen to use (used to resolve Origen config files) if let Ok(p) = std::env::current_exe() { @@ -186,15 +347,7 @@ pub fn run_with_callbacks( ) -> Result<()> { use origen::utility::command_helpers::log_stdout_and_stderr; - let mut cmd = PYTHON_CONFIG.poetry_command(); - cmd.arg("run"); - cmd.arg(&PYTHON_CONFIG.command); - cmd.arg("-c"); - cmd.arg(&code); - cmd.arg("-"); - // Force logger to be silent, use case for this is parsing output data so keep - // noise to a minimum - cmd.arg("verbosity=0"); + let mut cmd = PYTHON_CONFIG.run_cmd(code); // current_exe returns the Python process once it gets underway, so pass in the CLI // location for Origen to use (used to resolve Origen config files) if let Ok(p) = std::env::current_exe() { @@ -240,6 +393,10 @@ pub fn add_origen_env(cmd: &mut Command) { } } +pub fn is_backend_origen_mod_missing_err(err: &origen::Error) -> bool { + err.to_string().contains("ModuleNotFoundError: No module named '_origen'") +} + #[cfg(test)] mod tests { use super::*; diff --git a/rust/origen/src/core/application.rs b/rust/origen/src/core/application.rs index b2ab2cf9..57f21886 100644 --- a/rust/origen/src/core/application.rs +++ b/rust/origen/src/core/application.rs @@ -2,7 +2,7 @@ pub mod config; pub mod target; use super::application::config::Config; -use crate::utility::version::{set_version_in_toml, Version}; +use origen_metal::utils::version::Version; use crate::Result; use indexmap::IndexMap; use origen_metal::framework::reference_files; @@ -75,7 +75,10 @@ impl Application { "Updating version file: '{}'", self.version_file().into_os_string().into_string()? ); - set_version_in_toml(&self.version_file(), version) + let mut v = Version::from_pyproject_with_toml_handle(self.version_file())?; + v.set_new_version(version.clone())?; + v.write()?; + Ok(()) } /// Execute the given function with a reference to the application config. @@ -445,7 +448,7 @@ impl ProductionStatus { #[cfg(test)] mod tests { use crate::core::application::Application; - use crate::utility::version::Version; + use origen_metal::utils::version::Version; use crate::STATUS; #[test] diff --git a/rust/origen/src/core/application/config.rs b/rust/origen/src/core/application/config.rs index 05c33358..77c9b4c3 100644 --- a/rust/origen/src/core/application/config.rs +++ b/rust/origen/src/core/application/config.rs @@ -1,12 +1,58 @@ -use crate::core::application::target::matches; use crate::utility::location::Location; use crate::exit_on_bad_config; -use origen_metal::config; +use origen_metal::{config, scrub_path}; use origen_metal::config::{Environment, File}; use std::collections::HashMap; use std::path::{Path, PathBuf}; +use crate::om::glob::glob; +use std::process::exit; +use super::target; const PUBLISHER_OPTIONS: &[&str] = &["system", "package_app", "upload_app"]; +const BYPASS_APP_CONFIG_ENV_VAR: &str = "origen_app_bypass_config_lookup"; +const APP_CONFIG_PATHS: &str = "origen_app_config_paths"; + +macro_rules! use_app_config { + () => {{ + !std::env::var_os($crate::core::application::config::BYPASS_APP_CONFIG_ENV_VAR).is_some() + }} +} + +#[derive(Debug, Deserialize)] +pub struct CurrentState { + pub target: Option> +} + +impl CurrentState { + pub fn build(root: &PathBuf) -> Self { + let file = root.join(".origen").join("application.toml"); + let mut s = config::Config::builder().set_default("target", None::>).unwrap(); + if file.exists() { + s = s.add_source(File::with_name(&format!("{}", file.display()))); + } + let cb = exit_on_bad_config!(s.build()); + let slf: Self = exit_on_bad_config!(cb.try_deserialize()); + slf + } + + pub fn apply_to(&mut self, config: &mut Config) { + if let Some(t) = self.target.as_ref() { + config.target = Some(t.to_owned()) + } else { + if let Some(t) = &config.target { + let clean_defaults = target::set_at_root(t.iter().map( |s| s.as_str() ).collect(), config.root.as_ref().unwrap()); + self.target = Some(clean_defaults); + } + } + } + + pub fn build_and_apply(config: &mut Config) { + if use_app_config!() { + let mut slf = Self::build(config.root.as_ref().unwrap()); + slf.apply_to(config); + } + } +} #[derive(Debug, Deserialize)] // If you add an attribute to this you must also update: @@ -34,6 +80,7 @@ pub struct Config { pub linter: Option>, pub release_scribe: Option>, pub app_session_root: Option, + pub commands: Option>, } impl Config { @@ -53,27 +100,7 @@ impl Config { self.linter = latest.linter; self.release_scribe = latest.release_scribe; self.app_session_root = latest.app_session_root; - } - - pub fn check_defaults(root: &Path) { - let defaults = Self::build(root, true); - - // Do some quick default checks here: - // * Target - tl;dr: have a better error message on invalid default targets. - // If the default target moves or is otherwise invalid, the app won't boot. - // This isn't necessarily bad (having an invalid default target is bad) but it may not be obvious, - // especially to newer users, as to why the app all of a sudden doesn't boot. - // This can be overcome by setting the target (or fixing the default), but add, remove, etc., the commands - // users will probably go to when encountering target problems, won't work. - // * Stack up others as needed. - if let Some(targets) = defaults.target { - for t in targets.iter() { - let m = matches(t, "targets"); - if m.len() != 1 { - log_error!("Error present in default target '{}' (in config/application.toml)", t); - } - } - } + self.commands = latest.commands; } /// Builds a new config from all application.toml files found at the given app root @@ -95,20 +122,60 @@ impl Config { .set_default("release_scribe", None::>) .unwrap() .set_default("app_session_root", None::) + .unwrap() + .set_default("commands", None::>) .unwrap(); - let file = root.join("config").join("application.toml"); - if file.exists() { - s = s.add_source(File::with_name(&format!("{}", file.display()))); - } + let mut files: Vec = Vec::new(); + if let Some(paths) = std::env::var_os(APP_CONFIG_PATHS) { + log_trace!("Found custom config paths: {:?}", paths); + for path in std::env::split_paths(&paths) { + log_trace!("Looking for Origen app config file at '{}'", path.display()); + if path.is_file() { + if let Some(ext) = path.extension() { + if ext == "toml" { + files.push(path); + } else { + log_error!( + "Expected file {} to have extension '.toml'. Found '{}'", + path.display(), + ext.to_string_lossy() + ) + } + } else { + // accept a file without an extension. will be interpreted as a .toml + files.push(path); + } + } else if path.is_dir() { + let f = path.join("application.toml"); + if f.exists() { + files.push(f); + } + } else { + log_error!( + "Config path {} either does not exists or is not accessible", + path.display() + ); + exit(1); + } + } + } - if !default_only { - let file = root.join(".origen").join("application.toml"); + if use_app_config!() { + let file = root.join("config").join("application.toml"); if file.exists() { - s = s.add_source(File::with_name(&format!("{}", file.display()))); + files.push(file); } + } else { + // Bypass Origen's default configuration lookup - use only the enumerated configs + log_trace!("Bypassing Origen's App Config Lookup"); + } + + for f in files.iter().rev() { + log_trace!("Loading Origen config file from '{}'", f.display()); + s = s.add_source(File::with_name(&format!("{}", f.display()))); } - s = s.add_source(Environment::with_prefix("origen_app")); + s = s.add_source(Environment::with_prefix("origen_app").list_separator(",").with_list_parse_key("target").with_list_parse_key("commands").try_parsing(true)); let cb = exit_on_bad_config!(s.build()); let mut c: Self = exit_on_bad_config!(cb.try_deserialize()); @@ -119,12 +186,24 @@ impl Config { // } log_trace!("Completed building app config"); c.validate_options(); + if !default_only { + CurrentState::build_and_apply(&mut c); + } c } pub fn validate_options(&self) { log_trace!("Validating available options..."); + + if let Some(targets) = self.target.as_ref() { + log_trace!("\tValidating default target..."); + for t in targets { + target::clean_name(t, "targets", true, self.root.as_ref().unwrap()); + } + log_trace!("\tValidating default target!"); + } + log_trace!("\tValidating publisher options..."); for unknown in self.validate_publisher_options() { log_warning!("Unknown Publisher Option '{}'", unknown); @@ -144,4 +223,39 @@ impl Config { } unknowns } + + pub fn cmd_paths(&self) -> Vec { + let mut retn = vec!(); + if let Some(cmds) = self.commands.as_ref() { + // Load in only the commands explicitly given + for cmds_toml in cmds { + let ct = self.root.as_ref().unwrap().join("config").join(cmds_toml); + if ct.exists() { + retn.push(ct.to_owned()); + } else { + log_error!("Can not locate app commands file '{}'", scrub_path!(ct).display()) + } + } + } else { + // Load in any commands from: + // 1) app_root/commands.toml + // 2) app_root/commands/*/**.toml + let commands_toml = self.root.as_ref().unwrap().join("config").join("commands.toml"); + // println!("commands toml: {}", commands_toml.display()); + if commands_toml.exists() { + retn.push(commands_toml); + } + let mut commands_dir = self.root.as_ref().unwrap().join("config/commands"); + if commands_dir.exists() { + commands_dir = commands_dir.join("**/*.toml"); + for entry in glob(commands_dir.to_str().unwrap()).unwrap() { + match entry { + Ok(e) => retn.push(e), + Err(e) => log_error!("Error processing commands toml: {}", e) + } + } + } + } + retn + } } diff --git a/rust/origen/src/core/application/target.rs b/rust/origen/src/core/application/target.rs index 71143114..8f3d8fba 100644 --- a/rust/origen/src/core/application/target.rs +++ b/rust/origen/src/core/application/target.rs @@ -15,12 +15,27 @@ use walkdir::WalkDir; use pathdiff::diff_paths; use regex::{escape, Regex}; use std::fs; +use std::process::exit; +use std::collections::HashSet; + +#[macro_export] +macro_rules! clean_target { + ($name:expr, $dir:expr, $return_file:expr) => {{ + $crate::core::application::target::clean_name($name, $dir, $return_file, &$crate::app().unwrap().root) + }} +} + +macro_rules! toml { + ($root:expr) => {{ + $root.join(".origen").join("application.toml") + }} +} /// Sanitizes the given target/env name and returns it, but will exit the process if it does /// not uniquely identify a single target/env file. /// Set the last arg to true to return the path to the matching target instead. -pub fn clean_name(name: &str, dir: &str, return_file: bool) -> String { - let matches = matches(name, dir); +pub fn clean_name(name: &str, dir: &str, return_file: bool, root: &PathBuf) -> String { + let matches = matches(name, dir, root); let t = dir.trim_end_matches("s"); if matches.len() == 0 { @@ -28,10 +43,10 @@ pub fn clean_name(name: &str, dir: &str, return_file: bool) -> String { "No matching {} '{}' found, here are the available {}s:", t, name, t ); - for file in all(dir).iter() { + for file in all(&root.join(dir)).iter() { println!( " {}", - diff_paths(&file, &app().unwrap().root.join(dir)) + diff_paths(&file, &root.join(dir)) .unwrap() .display() ); @@ -44,7 +59,7 @@ pub fn clean_name(name: &str, dir: &str, return_file: bool) -> String { for file in matches.iter() { println!( " {}", - diff_paths(&file, &app().unwrap().root.join(dir)) + diff_paths(&file, &root.join(dir)) .unwrap() .display() ); @@ -55,27 +70,27 @@ pub fn clean_name(name: &str, dir: &str, return_file: bool) -> String { } else { let clean = format!( "{}", - diff_paths(&matches[0], &app().unwrap().root.join(dir)) + diff_paths(&matches[0], &root.join(dir)) .unwrap() .display() ); return clean; } } - std::process::exit(1); + exit(1); } /// Returns an array of possible target/environment files that match the given name/snippet // TODO: look into updating this to use the PathBuf PartialEq Trait to compare instead string compare which is prone to bugs due to OS differences -pub fn matches(name: &str, dir: &str) -> Vec { +pub fn matches(name: &str, dir: &str, root: &PathBuf) -> Vec { let mut files: Vec = Vec::new(); - for file in WalkDir::new(format!("{}", app().unwrap().root.join(dir).display())) { + for file in WalkDir::new(format!("{}", root.join(dir).display())) { let path = file.unwrap().into_path(); if path.is_file() { let mut path_str = format!( "{}", - diff_paths(&path, &app().unwrap().root.join(dir)) + diff_paths(&path, &root.join(dir)) .unwrap() .display() ); @@ -118,7 +133,7 @@ pub fn get(full_paths: bool) -> Option> { Some(targets) => Ok(Some( targets .iter() - .map(|t| clean_name(t, "targets", full_paths)) + .map(|t| clean_target!(t, "targets", full_paths)) .collect::>() .clone(), )), @@ -129,12 +144,22 @@ pub fn get(full_paths: bool) -> Option> { } /// Sets the targets, overriding any that may be present -pub fn set(targets: Vec<&str>) { - let clean_targets: Vec = targets - .iter() - .map(|t| clean_name(t, "targets", true)) - .collect(); - set_workspace_array("target", clean_targets) +pub fn set(targets: Vec<&str>) -> Vec { + set_at_root(targets, &app().unwrap().root) +} + +pub fn set_at_root(targets: Vec<&str>, root: &PathBuf) -> Vec { + let mut to_set = vec!(); + for t in targets.iter() { + let cn = clean_name(t, "targets", true, root); + if to_set.contains(&cn) { + log_error!("Target '{}' appears multiple times in the TARGETS list ({})", t, cn); + exit(1); + } + to_set.push(cn.clone()); + } + set_workspace_array_at_root("target", to_set.clone(), root); + to_set } /// Resets (deletes) the target back to its default value @@ -142,6 +167,11 @@ pub fn reset() { delete_val("target") } +pub fn clear() { + delete_val("target"); + set_workspace_array("target", vec!()) +} + /// Enables additional targets in the workspace pub fn add(targets: Vec<&str>) { let mut current: Vec = app() @@ -152,21 +182,28 @@ pub fn add(targets: Vec<&str>) { None => vec![], } .iter() - .map(|t| clean_name(t, "targets", true)) + .map(|t| clean_target!(t, "targets", true)) .collect(); Ok(c) }) .unwrap(); + let mut added = Vec::new(); for t in targets.iter() { // Check that the targets to add are valid - let clean_t = clean_name(t, "targets", true); + let clean_t = clean_target!(t, "targets", true); // If the target is already added, remove it from its current position and reapply it in the order // given here current.retain(|c| *c != clean_t); - current.push(clean_t); + + if added.contains(&clean_t) { + log_error!("Target '{}' appears multiple times in the TARGETS list ({})", t, clean_t); + exit(1); + } + added.push(clean_t); } + current.extend(added); set_workspace_array("target", current); } @@ -181,17 +218,30 @@ pub fn remove(targets: Vec<&str>) { None => vec![], } .iter() - .map(|t| clean_name(t, "targets", true)) + .map(|t| clean_target!(t, "targets", true)) .collect(); Ok(c) }) .unwrap(); + let mut removed = HashSet::new(); + let mut len = current.len(); for t in targets.iter() { - let clean_t = clean_name(t, "targets", true); + let clean_t = clean_target!(t, "targets", true); + + if removed.contains(&clean_t) { + log_error!("Target '{}' appears multiple times in the TARGETS list ({})", t, clean_t); + exit(1); + } - // Remove the target, if present current.retain(|c| *c != clean_t); + let new_len = current.len(); + if new_len == len { + log_error!("Tried to remove non-activated target '{}' ({})", t, clean_t); + exit(1); + } + len = new_len; + removed.insert(clean_t); } if current.len() == 0 { @@ -203,12 +253,12 @@ pub fn remove(targets: Vec<&str>) { } /// Returns all files from the given directory -pub fn all(dir: &str) -> Vec { +pub fn all(dir: &PathBuf) -> Vec { let mut files: Vec = Vec::new(); - for file in WalkDir::new(format!("{}", app().unwrap().root.join(dir).display())) { + for file in WalkDir::new(dir).sort_by_file_name() { let path = file.unwrap().into_path(); - if path.is_file() { + if path.is_file() && path.extension().unwrap_or("".as_ref()) == "py" { files.push(path); } } @@ -225,22 +275,26 @@ pub fn set_workspace(key: &str, val: &str) { /// Sets an Array-of-Strings workspace variable pub fn set_workspace_array(key: &str, vals: Vec) { - ensure_app_dot_toml(); - delete_val(key); - add_val_array(key, vals); + set_workspace_array_at_root(key, vals, &app().unwrap().root) +} + +pub fn set_workspace_array_at_root(key: &str, vals: Vec, root: &PathBuf) { + ensure_app_dot_toml_at_root(root); + delete_val_at_root(key, root); + add_val_array_at_root(key, vals, root); } /// Deletes the given key (and its val) from .origen/application.toml if it exists pub fn delete_val(key: &str) { - let path = app().unwrap().root.join(".origen").join("application.toml"); - let data = fs::read_to_string(path).expect("Unable to read file .origen/application.toml"); + delete_val_at_root(key, &app().unwrap().root); +} + +pub fn delete_val_at_root(key: &str, root: &PathBuf) { + let path = toml!(root); + let data = fs::read_to_string(&path).expect(&format!("Unable to read file {}", &path.display())); let re = Regex::new(format!(r#"{}\s?=.*(\r\n|\n)?"#, escape(key)).as_str()).unwrap(); let new_data: String = re.replace_all(&data, "").into(); - fs::write( - app().unwrap().root.join(".origen").join("application.toml"), - new_data, - ) - .expect("Unable to write file .origen/application.toml!"); + fs::write(&path, new_data).expect(&format!("Unable to write file {}", &path.display())); } /// Appends the given key/val pair to the end of .origen/application.toml @@ -256,9 +310,13 @@ fn add_val(key: &str, val: &str) { } /// Appends the given key/val pair to the end of .origen/application.toml -fn add_val_array(key: &str, vals: Vec) { - let path = app().unwrap().root.join(".origen").join("application.toml"); - let data = fs::read_to_string(path).expect("Unable to read file .origen/application.toml"); +// fn add_val_array(key: &str, vals: Vec) { +// add_val_array_at_root(key, vals, &app().unwrap().root); +// } + +fn add_val_array_at_root(key: &str, vals: Vec, root: &PathBuf) { + let path = toml!(root); + let data = fs::read_to_string(&path).expect(&format!("Unable to read file {}", &path.display())); // Note: use string literals here to account for Windows paths let new_data = format!( @@ -270,16 +328,16 @@ fn add_val_array(key: &str, vals: Vec) { .collect::>() .join(", ") ); - fs::write( - app().unwrap().root.join(".origen").join("application.toml"), - new_data, - ) - .expect("Unable to write file .origen/application.toml!"); + fs::write(&path, new_data).expect(&format!("Unable to write file {}", &path.display())); } /// Verifies that .origen/application.toml exists and if not creates one fn ensure_app_dot_toml() { - let path = app().unwrap().root.join(".origen"); + ensure_app_dot_toml_at_root( &app().unwrap().root) +} + +fn ensure_app_dot_toml_at_root(root: &PathBuf) { + let path = root.join(".origen"); if !path.exists() { fs::create_dir(&path).expect("Unable to create directory .origen!"); } @@ -287,10 +345,6 @@ fn ensure_app_dot_toml() { if !path.exists() { let data = "# This file is generated by Origen and should not be checked into revision control"; - fs::write( - app().unwrap().root.join(".origen").join("application.toml"), - data, - ) - .expect("Unable to write file .origen/application.toml!"); + fs::write(&path, data).expect(&format!("Unable to write file {}", &path.display())); } } diff --git a/rust/origen/src/core/config.rs b/rust/origen/src/core/config.rs index 9b88130e..42e28b24 100644 --- a/rust/origen/src/core/config.rs +++ b/rust/origen/src/core/config.rs @@ -21,10 +21,6 @@ use std::process::exit; use crate::om; use om::framework::users::DatasetConfig as OMDatasetConfig; -lazy_static! { - pub static ref CONFIG: Config = Config::default(); -} - #[derive(Debug, Deserialize)] pub struct LDAPConfig { pub server: String, @@ -91,6 +87,7 @@ impl std::convert::From for config::ValueKind { #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct InitialUserConfig { pub initialize: Option, + pub init_home_dir: Option, } impl std::convert::From for config::ValueKind { @@ -117,6 +114,65 @@ impl std::convert::From for config::ValueKind { // pub session__user_root: Option, // } +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct PluginConfig { + pub name: String, +} + +impl std::convert::From for config::ValueKind { + fn from(_value: PluginConfig) -> Self { + Self::Nil + } +} + +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +pub struct PluginsConfig { + pub collect: Option, + pub load: Option>, +} + +impl PluginsConfig { + pub fn collect(&self) -> bool { + self.collect.unwrap_or(true) + } + + pub fn should_collect_any(&self) -> bool { + self.collect() || self.load.is_some() + } +} + +impl std::convert::From for config::ValueKind { + fn from(_value: PluginsConfig) -> Self { + Self::Nil + } +} + +#[derive(Serialize, Deserialize, Debug, Clone)] +pub struct AuxillaryCommandsTOML { + pub name: Option, + pub path: String, +} + +impl AuxillaryCommandsTOML { + pub fn set_override(&self, mut config: config::ConfigBuilder, i: usize) -> config::ConfigBuilder { + config = config.set_override(format!("auxillary_commands[{}].path", i), self.path.to_string()).unwrap(); + config = config.set_override(format!("auxillary_commands[{}].name", i), self.name.to_owned()).unwrap(); + config + } + + pub fn path(&self) -> PathBuf { + let mut path = PathBuf::from(&self.path); + path.set_extension("toml"); + path + } +} + +impl std::convert::From for config::ValueKind { + fn from(_value: AuxillaryCommandsTOML) -> Self { + Self::Nil + } +} + #[macro_export] macro_rules! exit_on_bad_config { ($result: expr) => { @@ -131,6 +187,12 @@ macro_rules! exit_on_bad_config { } } +#[derive(Default)] +pub struct ConfigMetadata { + pub files: Vec, + pub aux_cmd_sources: Vec, +} + #[allow(non_snake_case)] #[derive(Debug, Deserialize)] // If you add an attribute to this you must also update: @@ -144,6 +206,9 @@ pub struct Config { pub pkg_server_pull: String, pub some_val: u32, + // Plugins + pub plugins: Option, + // Mailer pub maillists: Option, pub mailer: Option, @@ -160,7 +225,7 @@ pub struct Config { pub user__data_lookup_hierarchy: Option>, pub user__datasets: Option>, pub user__password_auth_attempts: u8, - pub user__password_cache_option: String, + pub user__password_cache_option: Option, pub user__current_user_lookup_function: Option, // pub user__password_reasons: HashMap, pub user__dataset_motives: HashMap, @@ -173,6 +238,32 @@ pub struct Config { pub initial_user: Option, // User session root path pub session__user_root: Option, + + pub additional_config_dirs: Option>, + pub additional_configs: Option>, + pub auxillary_commands: Option>, +} + +impl Config { + fn append_configs(mut starting_path: PathBuf, file_list: &mut Vec) { + let f = starting_path.join("origen.toml"); + log_trace!("Looking for Origen config file at '{}'", f.display()); + if f.exists() { + file_list.push(f); + } + + while starting_path.pop() { + let f = starting_path.join("origen.toml"); + log_trace!("Looking for Origen config file at '{}'", f.display()); + if f.exists() { + file_list.push(f); + } + } + } + + pub fn should_collect_plugins(&self) -> bool { + self.plugins.as_ref().map_or(true, |pl_config| pl_config.should_collect_any()) + } } impl Default for Config { @@ -187,6 +278,7 @@ impl Default for Config { s = s.set_default("pkg_server_push", "").unwrap(); s = s.set_default("pkg_server_pull", "").unwrap(); s = s.set_default("some_val", 3).unwrap(); + s = s.set_default("plugins", None::).unwrap(); s = s.set_default("maillists", None::).unwrap(); s = s.set_default("mailer", None::).unwrap(); s = s @@ -200,7 +292,7 @@ impl Default for Config { .unwrap(); s = s.set_default("user__password_auth_attempts", 3).unwrap(); s = s - .set_default("user__password_cache_option", "keyring") + .set_default("user__password_cache_option", None::) .unwrap(); s = s .set_default("user__datasets", { @@ -247,6 +339,7 @@ impl Default for Config { // Session setup s = s.set_default("session__user_root", None::).unwrap(); + s = s.set_default("auxillary_commands", None::>).unwrap(); // Find all the origen.toml files let mut files: Vec = Vec::new(); @@ -309,26 +402,52 @@ impl Default for Config { files.push(f); } } - } - - // TODO: Should this be the Python installation dir? - if let Some(mut path) = STATUS.cli_location() { - let f = path.join("origen.toml"); - log_trace!("Looking for Origen config file at '{}'", f.display()); - if f.exists() { - files.push(f); - } + } else { + match std::env::current_dir() { + Ok(mut path) => { + let f = path.join("origen.toml"); + log_trace!("Looking for Origen config file in current working directory at '{}'", f.display()); + if f.exists() { + files.push(f); + } - while path.pop() { - let f = path.join("origen.toml"); - log_trace!("Looking for Origen config file at '{}'", f.display()); - if f.exists() { - files.push(f); + while path.pop() { + let f = path.join("origen.toml"); + log_trace!("Looking for Origen config file at '{}'", f.display()); + if f.exists() { + files.push(f); + } + } + } + Err(e) => { + log_error!("Failed to lookup current working directory: {}", e.to_string()) } } } + + + // Check for configs in the Python install directory and its parents + if let Some(path) = STATUS.fe_exe_loc().as_ref() { + log_trace!("Looking for Origen config files from frontend install directory: '{}'", path.display()); + Self::append_configs(path.to_owned(), &mut files); + } + + // Check for configs in the Origen package directory and its parents + // Depending on the virtual env setups, this could be different + if let Some(path) = STATUS.fe_pkg_loc().as_ref() { + log_trace!("Looking for Origen config files from frontend package directory: '{}'", path.display()); + Self::append_configs(path.to_owned(), &mut files); + } + + // Check for configs in the CLI directory and its parents + if let Some(path) = STATUS.cli_location() { + log_trace!("Looking for Origen config files from the CLI directory: '{}'", path.display()); + Self::append_configs(path, &mut files); + } } + let mut all_cmds: Vec = vec!(); + let mut aux_cmd_sources: Vec = vec!(); // Now add in the files, with the last one found taking lowest priority for f in files.iter().rev() { log_trace!("Loading Origen config file from '{}'", f.display()); @@ -390,11 +509,40 @@ impl Default for Config { } }, } + + match built.get::>>("auxillary_commands") { + Ok(r) => { + if let Some(cmds) = r { + for cmd in cmds.iter() { + let mut cmd_clone = cmd.clone(); + cmd_clone.path = om::_utility::file_utils::to_abs_path(&cmd.path, &f.parent().unwrap().to_path_buf()).display().to_string(); + aux_cmd_sources.push(f.to_path_buf()); + all_cmds.push(cmd_clone); + } + } + } + Err(e) => match e { + config::ConfigError::NotFound(_) => {} + _ => { + log_error!("Malformed config file: {}", f.display()); + log_error!("{}", e); + exit(1); + } + }, + } } // Add in settings from the environment (with a prefix of ORIGEN) s = s.add_source(Environment::with_prefix("origen")); - + crate::set_origen_config_metadata(ConfigMetadata { + files: files, + aux_cmd_sources: aux_cmd_sources, + }); + if !all_cmds.is_empty() { + for (i, cmd) in all_cmds.iter().enumerate() { + s = cmd.set_override(s, i); + } + } exit_on_bad_config!(exit_on_bad_config!(s.build()).try_deserialize()) } } diff --git a/rust/origen/src/core/frontend/mod.rs b/rust/origen/src/core/frontend/mod.rs index 966cbf34..569cdd47 100644 --- a/rust/origen/src/core/frontend/mod.rs +++ b/rust/origen/src/core/frontend/mod.rs @@ -1,7 +1,7 @@ use crate::Result; pub mod callbacks; -use crate::utility::version::Version; +use origen_metal::utils::version::Version; use std::path::PathBuf; use origen_metal::{Outcome, TypedValueVec, TypedValueMap}; diff --git a/rust/origen/src/core/status.rs b/rust/origen/src/core/status.rs index 90627131..bf8b8c61 100644 --- a/rust/origen/src/core/status.rs +++ b/rust/origen/src/core/status.rs @@ -2,7 +2,7 @@ extern crate time; use crate::built_info; use crate::core::application::Application; use crate::testers::SupportedTester; -use crate::utility::version::Version; +use origen_metal::utils::version::Version; use crate::Result as OrigenResult; use origen_metal::utils::file::with_dir; use regex::Regex; @@ -11,7 +11,7 @@ use std::env; use std::path::Path; use std::path::PathBuf; use std::str::FromStr; -use std::sync::RwLock; +use std::sync::{RwLock, RwLockReadGuard}; // Trait for extending std::path::PathBuf use path_slash::PathBufExt; @@ -26,6 +26,7 @@ pub enum Operation { Compile, Interactive, Web, + Credentials, App, AppCommand, } @@ -45,6 +46,7 @@ impl FromStr for Operation { "compile" => Ok(Operation::Compile), "interactive" => Ok(Operation::Interactive), "web" => Ok(Operation::Web), + "credentials" => Ok(Operation::Credentials), "app" => Ok(Operation::App), "appcommand" => Ok(Operation::AppCommand), _ => Err(format!("Unknown Operation: '{}'", &s)), @@ -52,6 +54,66 @@ impl FromStr for Operation { } } +#[derive(Debug, Display)] +pub enum DependencySrc { + // Dependencies resolve from... + App(PathBuf), // the application + Workspace(PathBuf), // current directory tree (in workspace) + UserGlobal(PathBuf), // explicitly given by user, no workspace + Global(PathBuf), // the origen CLI installation directory, no workspace + NoneFound, // None available. Use whatever is available in the same install environment as Origen itself +} + +impl DependencySrc { + pub fn src_available(&self) -> bool { + match self { + Self::NoneFound => false, + _ => true, + } + } + + pub fn src_file(&self) -> Option<&PathBuf> { + match self { + Self::App(path) | Self::Workspace(path) | Self::UserGlobal(path) | Self::Global(path) => Some(path), + Self::NoneFound => None, + } + } +} + +impl TryFrom<(S, Option)> for DependencySrc +where S: AsRef { + type Error = crate::Error; + + fn try_from(value: (S, Option)) -> Result { + macro_rules! gen_case { + ($t: ident) => { + if let Some(path) = value.1 { + Self::$t(path) + } else { + bail!(concat!("A path is required with dependency src type '", stringify!($t), "'")); + } + } + } + Ok(match value.0.as_ref() { + "App" => gen_case!(App), + "Workspace" => gen_case!(Workspace), + "UserGlobal" => gen_case!(UserGlobal), + "Global" => gen_case!(Global), + "NoneFound" => Self::NoneFound, + _ => bail!("Cannot convert value '{}' to dependency src type", value.0.as_ref()) + }) + } +} + +// FEATURE Backend Current Command. Either store some basics here, or use a frontend wrapper +// use crate::TypedValueMap; +// #[derive(Debug)] +// pub struct CurrentCommand { +// pub top_cmd: String, +// pub subcmds: Vec, +// pub args: TypedValueMap, +// } + /// Exposes some status information about the runtime environment, e.g. whether an /// application workspace is present // @@ -92,6 +154,8 @@ pub struct Status { reference_dir: RwLock>, cli_location: RwLock>, cli_version: RwLock>, + fe_pkg_loc: RwLock>, + fe_exe_loc: RwLock>, pub origen_core_support_version: Version, pub origen_metal_backend_version: Version, other_build_info: RwLock>, @@ -101,6 +165,8 @@ pub struct Status { unique_id: RwLock, debug_enabled: RwLock, _operation: RwLock, + dependency_src: RwLock>, + // command: RwLock>, // FEATURE Backend Current Command } impl Default for Status { @@ -167,6 +233,8 @@ impl Default for Status { reference_dir: RwLock::new(None), cli_location: RwLock::new(None), cli_version: RwLock::new(None), + fe_pkg_loc: RwLock::new(None), + fe_exe_loc: RwLock::new(None), origen_core_support_version: Version::new_semver({ let mut v: &str = ""; for d in built_info::DEPENDENCIES.iter() { @@ -191,6 +259,8 @@ impl Default for Status { unique_id: RwLock::new(0), debug_enabled: RwLock::new(false), _operation: RwLock::new(Operation::None), + dependency_src: RwLock::new(None), + // command: RwLock::new(None), // FEATURE Backend Current Command }; log_trace!("Status built successfully"); s @@ -326,6 +396,25 @@ impl Status { *self.debug_enabled.read().unwrap() } + // FEATURE Backend Current Command + // pub fn set_command(&self, top_cmd: String, subcommands: Vec, args: TypedValueMap) { + // let mut cmd = self.command.write().unwrap(); + // *cmd = Some(CurrentCommand { + // top_cmd: top_cmd, + // subcmds: subcommands, + // args: args + // }); + // } + + // pub fn clear_command(&self) { + // let mut cmd = self.command.write().unwrap(); + // *cmd = None; + // } + + // pub fn command(&self) -> RwLockReadGuard> { + // self.command.read().unwrap() + // } + pub fn set_operation(&self, val: Operation) { let mut operation = self._operation.write().unwrap(); *operation = val; @@ -357,6 +446,24 @@ impl Status { self.cli_version.read().unwrap().to_owned() } + pub fn set_fe_pkg_loc(&self, loc: Option) { + let mut fe_pkg_loc = self.fe_pkg_loc.write().unwrap(); + *fe_pkg_loc = loc; + } + + pub fn fe_pkg_loc(&self) -> RwLockReadGuard> { + self.fe_pkg_loc.read().unwrap() + } + + pub fn set_fe_exe_loc(&self, loc: Option) { + let mut fe_exe_loc = self.fe_exe_loc.write().unwrap(); + *fe_exe_loc = loc; + } + + pub fn fe_exe_loc(&self) -> RwLockReadGuard> { + self.fe_exe_loc.read().unwrap() + } + pub fn update_other_build_info(&self, key: &str, item: &str) -> OrigenResult<()> { self.other_build_info .write() @@ -390,6 +497,15 @@ impl Status { *s = stat; } + pub fn set_dependency_src(&self, src: Option) { + let mut dependency_src = self.dependency_src.write().unwrap(); + *dependency_src = src; + } + + pub fn dependency_src(&self) -> RwLockReadGuard> { + self.dependency_src.read().unwrap() + } + /// This is the main method to get the current output directory, accounting for all /// possible ways to set it, from current command, the app, default, etc. /// If nothing has been set (only possible when running globally), then it will default @@ -476,10 +592,6 @@ impl Status { f(dir.as_ref()) } } - - // pub fn current_user(&self) -> &User { - // &self._current_user.read().unwrap() - // } } pub fn search_for_from_pwd(paths: Vec<&str>, searching_for_app: bool) -> (bool, PathBuf) { @@ -549,3 +661,15 @@ fn clean_path(path: &Path) -> PathBuf { } clean_path } + +pub fn app_present() -> bool { + crate::STATUS.is_app_present +} + +pub fn in_app_invocation() -> bool { + app_present() +} + +pub fn in_global_invocation() -> bool { + !app_present() +} diff --git a/rust/origen/src/lib.rs b/rust/origen/src/lib.rs index 674a3621..25ef6079 100644 --- a/rust/origen/src/lib.rs +++ b/rust/origen/src/lib.rs @@ -28,11 +28,13 @@ pub use origen_metal::Error; use self::core::application::Application; use self::core::config::Config as OrigenConfig; +use self::core::config::ConfigMetadata as OrigenConfigMetadata; pub use self::core::dut::Dut; use self::core::frontend::Handle; use self::core::model::registers::BitCollection; pub use self::core::producer::Producer; use self::core::status::Status; +pub use self::core::status::{app_present, in_app_invocation, in_global_invocation}; pub use self::core::tester::{Capture, Overlay, Tester}; pub use self::services::Services; pub use self::utility::sessions::{setup_sessions, with_app_session, with_app_session_group}; @@ -41,8 +43,9 @@ pub use om::prelude::frontend::*; pub use om::{TypedValue, LOGGER}; pub use origen_metal as om; use std::fmt; +use std::path::PathBuf; use std::sync::{Mutex, MutexGuard}; -use std::sync::RwLock; +use std::sync::{RwLock, RwLockReadGuard}; use generator::PAT; use origen_metal::ast::{Attrs, Node, AST}; @@ -72,6 +75,7 @@ lazy_static! { /// Provides configuration information derived from origen.toml files found in the Origen /// installation and application file system paths pub static ref ORIGEN_CONFIG: OrigenConfig = OrigenConfig::default(); + pub static ref ORIGEN_CONFIG_METADATA: RwLock = RwLock::new(OrigenConfigMetadata::default()); /// The current device model, containing all metadata about hierarchy, regs, pins, specs, /// timing, etc. and responsible for maintaining the current state of the DUT (regs, pins, /// etc.) @@ -154,6 +158,8 @@ pub fn initialize( verbosity_keywords: Vec, cli_location: Option, cli_version: Option, + fe_pkg_loc: Option, + fe_exe_loc: Option, ) { if let Some(v) = verbosity { let _ = LOGGER.set_verbosity(v); @@ -161,6 +167,8 @@ pub fn initialize( } STATUS.set_cli_location(cli_location); STATUS.set_cli_version(cli_version); + STATUS.set_fe_pkg_loc(fe_pkg_loc); + STATUS.set_fe_exe_loc(fe_exe_loc); log_debug!("Initialized Origen {}", STATUS.origen_version); } @@ -208,6 +216,15 @@ pub fn services() -> MutexGuard<'static, Services> { SERVICES.lock().unwrap() } +pub fn origen_config_metadata<'a>() -> RwLockReadGuard<'a, OrigenConfigMetadata> { + ORIGEN_CONFIG_METADATA.read().unwrap() +} + +pub (crate) fn set_origen_config_metadata(new: OrigenConfigMetadata) { + let mut m = ORIGEN_CONFIG_METADATA.write().unwrap(); + *m = new; +} + /// Sanitizes the given mode string and returns it, but will exit the process if it is invalid pub fn clean_mode(name: &str) -> String { let mut matches: Vec = Vec::new(); diff --git a/rust/origen/src/testers/smt/v93k/smt7/mod.rs b/rust/origen/src/testers/smt/v93k/smt7/mod.rs index 0506029f..66b9270e 100644 --- a/rust/origen/src/testers/smt/v93k/smt7/mod.rs +++ b/rust/origen/src/testers/smt/v93k/smt7/mod.rs @@ -101,4 +101,4 @@ impl VectorBased for SMT7 { } } -impl Interceptor for SMT7 {} \ No newline at end of file +impl Interceptor for SMT7 {} diff --git a/rust/origen/src/utility/github.rs b/rust/origen/src/utility/github.rs index 89808f78..00796fb2 100644 --- a/rust/origen/src/utility/github.rs +++ b/rust/origen/src/utility/github.rs @@ -1,65 +1,288 @@ -use origen_metal::{Result, Outcome}; -use octocrab; +use origen_metal::{Result, Outcome, octocrab, futures}; use std::collections::HashMap; -pub fn lookup_pat() -> Result { - // Tie this back to the user object at some point. - Ok(std::env::var("github_pat")?) +pub fn with_blocking_calls(mut f: F) -> Result +where + F: FnMut() -> Result, +{ + let r = tokio::runtime::Runtime::new().unwrap(); + let _guard = r.enter(); + f() } -#[derive(Serialize)] -pub struct DispatchWorkflowRequest { - r#ref: String, - inputs: HashMap, +macro_rules! block_on { + ($call:expr) => { + futures::executor::block_on($call) + } } -impl DispatchWorkflowRequest { - pub fn new(git_ref: &str, inputs: Option>) -> Self { - Self { - r#ref: git_ref.to_string(), - inputs: { - if let Some(ins) = inputs { - ins - } else { - let h: HashMap = HashMap::new(); - h - } +pub fn lookup_pat() -> Result { + // TODO Publishing Tie this back to the user object at some point. + match std::env::var("github_pat") { + Ok(v) => Ok(v), + Err(e) => match e { + std::env::VarError::NotPresent => { + bail!("Environment variable 'github_pat' was not found") }, + _ => return Err(e.into()) + } + } +} + +#[derive(Deserialize, Debug)] +pub struct Actor { + pub login: String, + pub id: usize, + pub r#type: String, +} + +#[derive(Deserialize, Debug)] +pub struct WorkflowRuns { + pub total_count: usize, + workflow_runs: Vec +} + +impl WorkflowRuns { + pub fn get_only(mut self) -> Result { + let l = self.workflow_runs.len(); + if l != 1 { + bail!("Expected a single workflow run but found {}", l) + } + Ok(self.workflow_runs.pop().unwrap()) + } +} + +#[derive(Deserialize, Debug)] +pub struct WorkflowRun { + pub id: u64, + pub name: String, + pub head_branch: String, + pub head_sha: String, + pub status: String, + pub conclusion: Option, + pub url: String, + pub html_url: String, + pub run_attempt: u8, + pub path: String, + pub event: String, + // TODO parse these as DATETIMEs? use time::PrimitiveDateTime as DateTime; + pub created_at: String, + pub updated_at: String, + pub run_started_at: String, + pub triggering_actor: Actor, + pub cancel_url: String, + pub rerun_url: String, +} + +impl WorkflowRun { + pub fn was_cancelled(&self) -> bool { + self.conclusion.as_ref().map_or( false, |c| c == "cancelled") + } + + pub fn cancel(&self) -> Result<()> { + send_post_request(|| { Ok(octocrab::OctocrabBuilder::new().personal_token(lookup_pat()?).build()?) }, &self.cancel_url, None::<()>)?; + Ok(()) + } + + pub fn completed(&self) -> bool { + self.status == "completed" + } + + pub fn refresh(&self) -> Result { + Ok(serde_json::from_str(&send_get_request(|| new_crab(None), &self.url)?)?) + } +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct Enabled { + pub enabled: bool, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct BranchProtections { + pub url: String, + // pub required_signatures: ?, + // pub enforce_admins + pub required_linear_history: Enabled, + pub allow_force_pushes: Enabled, + pub allow_deletions: Enabled, + pub required_conversation_resolution: Enabled, + pub lock_branch: Enabled, + pub allow_fork_syncing: Enabled, +} + +impl BranchProtections { + pub fn is_locked(&self) -> bool { + self.lock_branch.enabled + } +} + +pub fn send_get_request(crab: F, uri: &str) -> Result +where + F: Fn() -> Result, +{ + with_blocking_calls( || { + let c = crab()?; + log_trace!("Sending GET request to GA: {}", uri); + let response = futures::executor::block_on(c._get(uri))?; + let body = futures::executor::block_on(c.body_to_string(response))?; + log_trace!("Received pre-processed body:\n{}", body); + Ok(body) + }) +} + +pub fn send_post_request(crab: F, uri: &str, inputs: Option) -> Result +where + F: Fn() -> Result, + H: serde::Serialize + Sized +{ + with_blocking_calls( || { + let c = crab()?; + log_trace!("Sending POST request to GA: {}", uri); + let response = block_on!(c._post(uri, inputs.as_ref()))?; + let body = block_on!(c.body_to_string(response))?; + log_trace!("Received pre-processed body:\n{}", body); + Ok(body) + }) +} + +pub fn send_put_request(crab: F, uri: &str, inputs: Option) -> Result +where + F: Fn() -> Result, + H: serde::Serialize + Sized +{ + with_blocking_calls( || { + let c = crab()?; + log_trace!("Sending POST request to GA: {}", uri); + let response = block_on!(c._put(uri, inputs.as_ref()))?; + let body = block_on!(c.body_to_string(response))?; + log_trace!("Received pre-processed body:\n{}", body); + Ok(body) + }) +} + +pub enum GithubAuth { + PersonalAccessToken +} + +pub fn new_crab(auth: Option) -> Result { + Ok(if let Some(a) = auth { + match a { + GithubAuth::PersonalAccessToken => octocrab::Octocrab::builder().personal_token(lookup_pat()?).build()? } + } else { + octocrab::OctocrabBuilder::new().build()? + }) +} + +pub fn get_latest_workflow_dispatch(owner: &str, repo: &str, workflow: Option<&str>) -> Result { + let mut uri = "https://api.github.com/repos".to_string(); + if let Some(w) = workflow { + uri = format!("{}/{}/{}/actions/workflows/{}/runs", uri, owner, repo, w); + } else { + uri = format!("{}/{}/{}/actions/runs", uri, owner, repo); } + uri += "?per_page=1"; + let body = send_get_request(|| new_crab(None), &uri)?; + let runs = serde_json::from_str::(&body)?; + runs.get_only() } -pub fn dispatch_workflow( +pub fn get_workflow_run_by_id(owner: &str, repo: &str, run_id: u64) -> Result { + Ok(serde_json::from_str(&send_get_request( + || new_crab(None), + &format!("https://api.github.com/repos/{}/{}/actions/runs/{}", owner, repo, run_id) + )?)?) +} + +pub fn dispatch_workflow( owner: &str, repo: &str, workflow: &str, git_ref: &str, - inputs: Option>, -) -> Result { - let o = octocrab::OctocrabBuilder::new() - .personal_token(lookup_pat()?) - .add_header( - reqwest::header::ACCEPT, - "application/vnd.github.v3+json".to_string(), - ) - .build()?; - let r = tokio::runtime::Runtime::new().unwrap(); - let _guard = r.enter(); - - let response = futures::executor::block_on(o._post( - format!( - "https://api.github.com/repos/{}/{}/actions/workflows/{}/dispatches", - owner, repo, workflow - ), - Some(&DispatchWorkflowRequest::new(git_ref, inputs)), - ))?; - let headers = response.headers().clone(); - let status = response.status().as_u16() as usize; - let body = futures::executor::block_on(response.text())?; - - let mut res = Outcome::new_success_or_fail(body.is_empty()); - res.set_msg(body); - res.add_metadata("header", format!("{:?}", headers)); - res.add_metadata("status", status); + inputs: Option, +) -> Result +where + H: serde::Serialize + Sized +{ + with_blocking_calls(|| { + let crab = new_crab(Some(GithubAuth::PersonalAccessToken))?; + let actions = crab.actions(); + let mut workflow = actions.create_workflow_dispatch(owner, repo, workflow, git_ref); + if let Some(ins) = inputs.as_ref() { + workflow = workflow.inputs(serde_json::json!(ins)); + } + // TODO PublishingO2 Add checks for errors in response + block_on!(workflow.send())?; + Ok(()) + })?; + let res = Outcome::new_success(); Ok(res) } + +pub fn get_branch_protections(owner: &str, repo: &str, branch: &str) -> Result { + let resp = &send_get_request( + || new_crab(Some(GithubAuth::PersonalAccessToken)), + &format!("https://api.github.com/repos/{owner}/{repo}/branches/{branch}/protection") + )?; + match serde_json::from_str(resp) { + Ok(retn) => Ok(retn), + Err(e) => { + bail!("Error building branch protection struct: {}\nUnexpected response:\n{}", e, resp); + } + } +} + +#[derive(Serialize, Debug)] +pub struct UpdateBranchProtectionRule { + pub lock_branch: bool, + pub enforce_admins: bool, + pub required_pull_request_reviews: Option>, + pub required_status_checks: Option>, + pub restrictions: Option>, +} + +impl UpdateBranchProtectionRule { + pub fn lock_branch() -> Self { + Self { + lock_branch: true, + enforce_admins: true, + required_pull_request_reviews: None, + required_status_checks: None, + restrictions: None, + } + } + + pub fn unlock_branch() -> Self { + Self { + lock_branch: false, + enforce_admins: false, + required_pull_request_reviews: None, + required_status_checks: None, + restrictions: None, + } + } +} + +pub fn update_branch_protection(owner: &str, repo: &str, branch: &str, new_protections: UpdateBranchProtectionRule) -> Result { + let url = format!("https://api.github.com/repos/{owner}/{repo}/branches/{branch}/protection"); + let res = send_put_request( + || new_crab(Some(GithubAuth::PersonalAccessToken)), + &url, + Some(new_protections), + )?; + match serde_json::from_str(&res) { + Ok(retn) => Ok(retn), + Err(e) => { + bail!("Error building branch protection struct: {}\nUnexpected response:\n{}", e, res); + } + } +} + +pub fn lock_branch(owner: &str, repo: &str, branch: &str) -> Result { + update_branch_protection(owner, repo, branch, UpdateBranchProtectionRule::lock_branch()) +} + +pub fn unlock_branch(owner: &str, repo: &str, branch: &str) -> Result { + update_branch_protection(owner, repo, branch, UpdateBranchProtectionRule::unlock_branch()) +} \ No newline at end of file diff --git a/rust/origen/src/utility/mod.rs b/rust/origen/src/utility/mod.rs index 0ead029f..72e8ba80 100644 --- a/rust/origen/src/utility/mod.rs +++ b/rust/origen/src/utility/mod.rs @@ -7,7 +7,6 @@ pub mod github; pub mod num_helpers; pub mod release_scribe; pub mod sessions; -pub mod version; use crate::{Result, STATUS}; use std::path::{Path, PathBuf}; diff --git a/rust/origen/src/utility/release_scribe.rs b/rust/origen/src/utility/release_scribe.rs index 30782204..d1380459 100644 --- a/rust/origen/src/utility/release_scribe.rs +++ b/rust/origen/src/utility/release_scribe.rs @@ -1,6 +1,6 @@ -use crate::utility::version::Version; +use origen_metal::utils::version::Version; use crate::{Result, STATUS}; -use dialoguer::{Input, Select}; +use origen_metal::dialoguer::{Input, Select}; use std::collections::HashMap; use std::fs::File; use std::io::prelude::*; diff --git a/rust/origen_metal/Cargo.lock b/rust/origen_metal/Cargo.lock deleted file mode 100644 index 61b94b8b..00000000 --- a/rust/origen_metal/Cargo.lock +++ /dev/null @@ -1,3176 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher 0.2.5", -] - -[[package]] -name = "aes" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" -dependencies = [ - "cfg-if 1.0.0", - "cipher 0.3.0", - "cpufeatures", - "opaque-debug", -] - -[[package]] -name = "aes-gcm" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" -dependencies = [ - "aead", - "aes 0.6.0", - "cipher 0.2.5", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher 0.2.5", - "opaque-debug", -] - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" -dependencies = [ - "memchr", -] - -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.86" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" - -[[package]] -name = "arc-swap" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" - -[[package]] -name = "async-io" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" -dependencies = [ - "async-lock", - "autocfg", - "cfg-if 1.0.0", - "concurrent-queue", - "futures-lite", - "log", - "parking", - "polling", - "rustix 0.37.27", - "slab", - "socket2 0.4.10", - "waker-fn", -] - -[[package]] -name = "async-lock" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" -dependencies = [ - "event-listener", -] - -[[package]] -name = "async-trait" -version = "0.1.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "autocfg" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" - -[[package]] -name = "backtrace" -version = "0.3.71" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "block-modes" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb03d1bed155d89dce0f845b7899b18a9a163e148fd004e1c28421a783e2d8e" -dependencies = [ - "block-padding", - "cipher 0.3.0", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "built" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9c056b9ed43aee5e064b683aa1ec783e19c6acec7559e3ae931b7490472fbe" -dependencies = [ - "cargo-lock", -] - -[[package]] -name = "bumpalo" -version = "3.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" - -[[package]] -name = "cargo-lock" -version = "8.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "031718ddb8f78aa5def78a09e90defe30151d1f6c672f937af4dd916429ed996" -dependencies = [ - "semver", - "serde", - "toml", - "url", -] - -[[package]] -name = "cc" -version = "1.0.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f" -dependencies = [ - "jobserver", - "libc", - "once_cell", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" -dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-targets 0.52.5", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array", -] - -[[package]] -name = "cipher" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" -dependencies = [ - "generic-array", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "config" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23738e11972c7643e4ec947840fc463b6a571afcd3e735bdfce7d03c7a784aca" -dependencies = [ - "async-trait", - "json5", - "lazy_static", - "nom", - "pathdiff", - "ron", - "rust-ini", - "serde", - "serde_json", - "toml", - "yaml-rust", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "cpufeatures" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" -dependencies = [ - "libc", -] - -[[package]] -name = "cpuid-bool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" - -[[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher 0.2.5", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "crypto-common", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "either" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" - -[[package]] -name = "email-encoding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a87260449b06739ee78d6281c68d2a0ff3e3af64a78df63d3a1aeb3c06997c8a" -dependencies = [ - "base64 0.22.1", - "memchr", -] - -[[package]] -name = "email_address" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112" - -[[package]] -name = "encoding_rs" -version = "0.8.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-display-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ef37b2a9b242295d61a154ee91ae884afff6b8b933b486b12481cc58310ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "enum-utils" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed327f716d0d351d86c9fd3398d20ee39ad8f681873cc081da2ca1c10fed398a" -dependencies = [ - "enum-utils-from-str", - "failure", - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.109", -] - -[[package]] -name = "enum-utils-from-str" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49be08bad6e4ca87b2b8e74146987d4e5cb3b7512efa50ef505b51a22227ee1" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", -] - -[[package]] -name = "fastrand" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-executor" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" -dependencies = [ - "opaque-debug", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "git2" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc" -dependencies = [ - "bitflags 1.3.2", - "libc", - "libgit2-sys", - "log", - "openssl-probe", - "openssl-sys", - "url", -] - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "h2" -version = "0.3.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap 2.2.6", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" - -[[package]] -name = "hkdf" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01706d578d5c281058480e673ae4086a9f4710d8df1ad80a5b03e39ece5f886b" -dependencies = [ - "digest 0.9.0", - "hmac", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - -[[package]] -name = "http" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.7", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" -dependencies = [ - "equivalent", - "hashbrown 0.14.5", -] - -[[package]] -name = "indoc" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "io-lifetimes" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" -dependencies = [ - "hermit-abi", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "iter-read" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4" - -[[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[package]] -name = "jobserver" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.7", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "keyring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba264b266563c1363dcce004776cbf198d7422a4262f77f4ca285bf26ae30955" -dependencies = [ - "byteorder", - "secret-service", - "security-framework", - "winapi", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lber" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2df7f9fd9f64cf8f59e1a4a0753fe7d575a5b38d3d7ac5758dcee9357d83ef0a" -dependencies = [ - "bytes", - "nom", -] - -[[package]] -name = "ldap3" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dceb52eac140c8679326f619b963577ccf5a4ab025fe5e6db424d2fd3e4f400" -dependencies = [ - "async-trait", - "bytes", - "futures", - "futures-util", - "lazy_static", - "lber", - "log", - "native-tls", - "nom", - "percent-encoding", - "thiserror", - "tokio", - "tokio-native-tls", - "tokio-stream", - "tokio-util", - "url", -] - -[[package]] -name = "lettre" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bd09637ae3ec7bd605b8e135e757980b3968430ff2b1a4a94fb7769e50166d" -dependencies = [ - "base64 0.21.7", - "email-encoding", - "email_address", - "fastrand 1.9.0", - "futures-util", - "hostname", - "httpdate", - "idna 0.3.0", - "mime", - "native-tls", - "nom", - "once_cell", - "quoted_printable", - "socket2 0.4.10", - "tokio", -] - -[[package]] -name = "libc" -version = "0.2.155" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" - -[[package]] -name = "libgit2-sys" -version = "0.14.2+1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" -dependencies = [ - "cc", - "libc", - "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -] - -[[package]] -name = "libredox" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" -dependencies = [ - "bitflags 2.5.0", - "libc", -] - -[[package]] -name = "libssh2-sys" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e143b5e666b2695d28f6bca6497720813f699c9602dd7f5cac91008b8ada7f9" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[package]] -name = "lock_api" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] -name = "memchr" -version = "2.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" - -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nb-connect" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" -dependencies = [ - "libc", - "socket2 0.4.10", -] - -[[package]] -name = "nix" -version = "0.22.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4916f159ed8e5de0082076562152a76b7a1f64a01fd9d1e0fea002c37624faf" -dependencies = [ - "bitflags 1.3.2", - "cc", - "cfg-if 1.0.0", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" -dependencies = [ - "num-bigint 0.4.5", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" -dependencies = [ - "num-integer", - "num-traits", - "serde", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" -dependencies = [ - "num-bigint 0.4.5", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "octocrab" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496442a5ec5ad38376a0c49bc0f31ba55dbda5276cf12757498c378c3bc2ea1c" -dependencies = [ - "arc-swap", - "async-trait", - "base64 0.21.7", - "bytes", - "cfg-if 1.0.0", - "chrono", - "either", - "jsonwebtoken", - "once_cell", - "reqwest", - "secrecy", - "serde", - "serde_json", - "serde_path_to_error", - "snafu", - "tracing", - "url", -] - -[[package]] -name = "once_cell" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl" -version = "0.10.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.5.0", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.102" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.3", -] - -[[package]] -name = "origen_metal" -version = "0.5.0" -dependencies = [ - "aes-gcm", - "anyhow", - "built", - "cfg-if 1.0.0", - "chrono", - "config", - "dirs", - "enum-display-derive", - "enum-utils", - "git2", - "glob", - "indexmap 1.9.3", - "keyring", - "lazy_static", - "ldap3", - "lettre", - "num-bigint 0.4.5", - "num-traits", - "octocrab", - "pest", - "pest_derive", - "pyo3", - "rand", - "regex", - "reqwest", - "rpassword", - "semver", - "serde", - "serde-pickle", - "serde_json", - "shellexpand", - "tempfile", - "termcolor", - "time 0.1.45", - "toml", - "wait-timeout", - "whoami", -] - -[[package]] -name = "parking" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" - -[[package]] -name = "parking_lot" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.5.1", - "smallvec", - "windows-targets 0.52.5", -] - -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.1", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pest" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "560131c633294438da9f7c4b08189194b20946c8274c6b9e38881a7874dc8ee8" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26293c9193fbca7b1a3bf9b79dc1e388e927e6cacaa78b4a3ab705a1d3d41459" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ec22af7d3fb470a85dd2ca96b7c577a1eb4ef6f1683a9fe9a8c16e136c04687" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "pest_meta" -version = "2.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a240022f37c361ec1878d646fc5b7d7c4d28d5946e1a80ad5a7a4f4ca0bdcd" -dependencies = [ - "once_cell", - "pest", - "sha2 0.10.8", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - -[[package]] -name = "polling" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" -dependencies = [ - "autocfg", - "bitflags 1.3.2", - "cfg-if 1.0.0", - "concurrent-queue", - "libc", - "log", - "pin-project-lite", - "windows-sys 0.48.0", -] - -[[package]] -name = "polyval" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" -dependencies = [ - "once_cell", - "toml_edit", -] - -[[package]] -name = "proc-macro2" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pyo3" -version = "0.16.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0220c44442c9b239dd4357aa856ac468a4f5e1f0df19ddb89b2522952eb4c6ca" -dependencies = [ - "cfg-if 1.0.0", - "indoc", - "libc", - "parking_lot", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.16.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c819d397859445928609d0ec5afc2da5204e0d0f73d6bf9e153b04e83c9cdc2" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.16.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca882703ab55f54702d7bfe1189b41b0af10272389f04cae38fe4cd56c65f75f" -dependencies = [ - "libc", - "pyo3-build-config", -] - -[[package]] -name = "pyo3-macros" -version = "0.16.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568749402955ad7be7bad9a09b8593851cd36e549ac90bfd44079cea500f3f21" -dependencies = [ - "proc-macro2", - "pyo3-macros-backend", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.16.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "611f64e82d98f447787e82b8e7b0ebc681e1eb78fc1252668b2c605ffb4e1eb8" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quote" -version = "1.0.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "quoted_printable" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.5.0", -] - -[[package]] -name = "redox_users" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" -dependencies = [ - "getrandom", - "libredox", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls-pemfile", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ron" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88073939a61e5b7680558e6be56b419e208420c2adb92be54921fa6b72283f1a" -dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", - "serde", -] - -[[package]] -name = "rpassword" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if 1.0.0", - "ordered-multimap", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" - -[[package]] -name = "rustix" -version = "0.37.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" -dependencies = [ - "bitflags 1.3.2", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys 0.3.8", - "windows-sys 0.48.0", -] - -[[package]] -name = "rustix" -version = "0.38.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" -dependencies = [ - "bitflags 2.5.0", - "errno", - "libc", - "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustls-pemfile" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" -dependencies = [ - "base64 0.21.7", -] - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "zeroize", -] - -[[package]] -name = "secret-service" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1da5c423b8783185fd3fecd1c8796c267d2c089d894ce5a93c280a5d3f780a2" -dependencies = [ - "aes 0.7.5", - "block-modes", - "hkdf", - "lazy_static", - "num", - "rand", - "serde", - "sha2 0.9.9", - "zbus", - "zbus_macros", - "zvariant", - "zvariant_derive", -] - -[[package]] -name = "security-framework" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c627723fd09706bacdb5cf41499e95098555af3c3c29d014dc3c458ef6be11c0" -dependencies = [ - "bitflags 2.5.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317936bbbd05227752583946b9e66d7ce3b489f84e11a94a510b4437fef407d7" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.202" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-pickle" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b88454094f5ba5b2149722f41e42395b39556632c3abb068540c0b04d27017a" -dependencies = [ - "byteorder", - "iter-read", - "num-bigint 0.3.3", - "num-traits", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.202" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "serde_derive_internals" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "serde_json" -version = "1.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af99884400da37c88f5e9146b7f1fd0fbcae8f6eec4e9da38b67d05486f814a6" -dependencies = [ - "itoa", - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "shellexpand" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7e79eddc7b411f9beeaaf2d421de7e7cb3b1ab9eaf1b79704c0e4130cba6b5" -dependencies = [ - "dirs", -] - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint 0.4.5", - "num-traits", - "thiserror", - "time 0.3.36", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "snafu" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4de37ad025c587a29e8f3f5605c00f70b98715ef90b9061a815b9e59e9042d6" -dependencies = [ - "backtrace", - "doc-comment", - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990079665f075b699031e9c08fd3ab99be5029b96f3b78dc0709e8f77e4efebf" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "socket2" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" - -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "target-lexicon" -version = "0.12.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" - -[[package]] -name = "tempfile" -version = "3.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" -dependencies = [ - "cfg-if 1.0.0", - "fastrand 2.1.0", - "rustix 0.38.34", - "windows-sys 0.52.0", -] - -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2 0.5.7", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" - -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.2.6", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ucd-trie" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" - -[[package]] -name = "unicode-bidi" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" - -[[package]] -name = "unicode-ident" -version = "1.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" - -[[package]] -name = "unicode-normalization" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unindent" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna 0.5.0", - "percent-encoding", - "serde", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasite" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" - -[[package]] -name = "wasm-bindgen" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.65", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.65", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.92" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" - -[[package]] -name = "web-sys" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "whoami" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9" -dependencies = [ - "redox_syscall 0.4.1", - "wasite", - "web-sys", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-core" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.5", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm 0.52.5", - "windows_aarch64_msvc 0.52.5", - "windows_i686_gnu 0.52.5", - "windows_i686_gnullvm", - "windows_i686_msvc 0.52.5", - "windows_x86_64_gnu 0.52.5", - "windows_x86_64_gnullvm 0.52.5", - "windows_x86_64_msvc 0.52.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" - -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if 1.0.0", - "windows-sys 0.48.0", -] - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zbus" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cbeb2291cd7267a94489b71376eda33496c1b9881adf6b36f26cc2779f3fc49" -dependencies = [ - "async-io", - "byteorder", - "derivative", - "enumflags2", - "fastrand 1.9.0", - "futures", - "nb-connect", - "nix", - "once_cell", - "polling", - "scoped-tls", - "serde", - "serde_repr", - "zbus_macros", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa3959a7847cf95e3d51e312856617c5b1b77191176c65a79a5f14d778bbe0a6" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "zeroize" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" - -[[package]] -name = "zvariant" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68c7b55f2074489b7e8e07d2d0a6ee6b4f233867a653c664d8020ba53692525" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" -dependencies = [ - "proc-macro-crate 1.3.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] diff --git a/rust/origen_metal/Cargo.toml b/rust/origen_metal/Cargo.toml index ec0c17d4..b254708a 100644 --- a/rust/origen_metal/Cargo.toml +++ b/rust/origen_metal/Cargo.toml @@ -13,27 +13,24 @@ categories = ["embedded", "science"] # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html -[features] -# Enables the Python API, when not enabled (the default) origen_metal is a pure Rust library that -# can only be used from Rust -python = ["dep:pyo3"] - [dependencies] lazy_static = "1" time = "0.1" termcolor = "1" regex = "1" tempfile = "3" -pyo3 = {version = "0.16.5", features = ["extension-module"], optional = true} +pyo3 = {version = "0.19.1", features = ["extension-module"]} serde = {version = "1.0", features = ["derive"]} toml = "0.5" -git2 = "0.16.0" +toml_edit = "0.21.0" +dialoguer = "0.8.0" +git2 = "0.18.1" dirs = "2.0" wait-timeout = "0.2.0" chrono = "0.4.11" indexmap = { version = "1.6.0", features = ["serde-1"] } config = "0.13.1" -ldap3 = "^0.11" +ldap3 = "0.11.3" cfg-if = "1" enum-display-derive = "0.1.1" whoami = "1.2.1" @@ -48,13 +45,15 @@ keyring = "1" num-bigint = {version = "0.4.0", features = ["serde"]} num-traits = "0.2.15" serde_json = "1.0" -octocrab = "^0.19" +octocrab = "0.28.0" reqwest = {version = "0.11.3", features = ["blocking", "json"]} -lettre = {version = "^0.10", features = ["builder"]} +futures = {version = "0.3.15", features = ["executor"]} +lettre = {version = "=0.10.4", features = ["builder"]} aes-gcm = "0.8" semver = "1.0.1" glob = "0.3.0" -anyhow = "^1" +email_address = "0.2.4" +tera = "1" [build-dependencies] -built = "0.5.1" +built = "0.5.2" diff --git a/rust/origen_metal/src/_utility/mod.rs b/rust/origen_metal/src/_utility/mod.rs index b3408b5f..109a21dd 100644 --- a/rust/origen_metal/src/_utility/mod.rs +++ b/rust/origen_metal/src/_utility/mod.rs @@ -4,8 +4,8 @@ pub mod file_utils; /// (directly) wrapped by any frontend utility. use crate::Result; use std::collections::HashSet; -use std::ffi::OsStr; use std::iter::FromIterator; +use std::ffi::OsStr; /// Checks the given values of a vector against an enumerated set of accepted values. /// Optionally, check for duplicate items as well. diff --git a/rust/origen_metal/src/error.rs b/rust/origen_metal/src/error.rs index 9b8000b7..b68cf68d 100644 --- a/rust/origen_metal/src/error.rs +++ b/rust/origen_metal/src/error.rs @@ -28,38 +28,36 @@ impl BaseError for Error { // To add a conversion from other type of errors -#[cfg(feature = "python")] impl std::convert::From for pyo3::PyErr { fn from(err: Error) -> pyo3::PyErr { pyo3::exceptions::PyRuntimeError::new_err(err.to_string()) } } -#[cfg(feature = "python")] impl std::convert::From for Error { fn from(err: pyo3::PyErr) -> Self { - let gil = pyo3::Python::acquire_gil(); - let py = gil.python(); - Error::new(&format!( - "Encountered Exception '{}' with message: {}{}", - err.get_type(py).name().unwrap(), - { - let r = err.value(py).call_method0("__str__").unwrap(); - r.extract::().unwrap() - }, - { - let tb = err.traceback(py); - let m = py.import("traceback").unwrap(); - let temp = pyo3::types::PyTuple::new(py, &[tb]); - let et = m.call_method1("extract_tb", temp).unwrap(); - - let temp = pyo3::types::PyTuple::new(py, &[et]); - let text_list = m.call_method1("format_list", temp).unwrap(); - let text = text_list.extract::>().unwrap(); - - format!("\nWith traceback:\n{}", text.join("")) - } - )) + pyo3::Python::with_gil(|py| { + Error::new(&format!( + "Encountered Exception '{}' with message: {}{}", + err.get_type(py).name().unwrap(), + { + let r = err.value(py).call_method0("__str__").unwrap(); + r.extract::().unwrap() + }, + { + let tb = err.traceback(py); + let m = py.import("traceback").unwrap(); + let temp = pyo3::types::PyTuple::new(py, &[tb]); + let et = m.call_method1("extract_tb", temp).unwrap(); + + let temp = pyo3::types::PyTuple::new(py, &[et]); + let text_list = m.call_method1("format_list", temp).unwrap(); + let text = text_list.extract::>().unwrap(); + + format!("\nWith traceback:\n{}", text.join("")) + } + )) + }) } } @@ -117,12 +115,24 @@ impl std::convert::From for Error { } } +impl std::convert::From<&str> for Error { + fn from(err: &str) -> Self { + Error::new(err) + } +} + impl std::convert::From for Error { fn from(err: lettre::address::AddressError) -> Self { Error::new(&err.to_string()) } } +impl std::convert::From for Error { + fn from(err: email_address::Error) -> Self { + Error::new(&err.to_string()) + } +} + impl std::convert::From for Error { fn from(err: toml::de::Error) -> Self { Error::new(&err.to_string()) @@ -171,11 +181,11 @@ impl std::convert::From for Error { } } -impl std::convert::From for Error { - fn from(err: anyhow::Error) -> Self { - Error::new(&err.to_string()) - } -} +//impl std::convert::From for Error { +// fn from(err: anyhow::Error) -> Self { +// Error::new(&err.to_string()) +// } +//} // On failure, the original OS string is returned // https://doc.rust-lang.org/std/ffi/struct.OsString.html#method.into_string @@ -223,3 +233,9 @@ impl std::convert::From for Error { Error::new(&err.to_string()) } } + +impl std::convert::From for Error { + fn from(err: tera::Error) -> Self { + Error::new(&err.to_string()) + } +} diff --git a/rust/origen_metal/src/framework/logger.rs b/rust/origen_metal/src/framework/logger.rs index 0453a7de..ab88a60a 100644 --- a/rust/origen_metal/src/framework/logger.rs +++ b/rust/origen_metal/src/framework/logger.rs @@ -60,7 +60,7 @@ use std::cell::RefCell; use std::fs; use std::io::Write; use std::path::{Path, PathBuf}; -use std::sync::RwLock; +use std::sync::{RwLock, RwLockReadGuard}; // Thread specific files, a log request will write to the last log in this vector, if // none are present then it will fall back to the global/shared files in Logger.inner.files @@ -75,7 +75,7 @@ pub struct Logger { #[derive(Default)] pub struct Inner { level: u8, - keywords: Vec, + pub keywords: Vec, // The currently open log files, the last one is the one that will be written to // (unless there is an open thread-specific log file) files: Vec<(PathBuf, fs::File)>, @@ -88,14 +88,21 @@ pub struct Inner { } impl Logger { + pub fn data(&self) -> RwLockReadGuard { + self.inner.read().unwrap() + } + pub fn verbosity(&self) -> u8 { self.inner.read().unwrap().level } pub fn set_verbosity(&self, level: u8) -> Result<()> { - log_debug!("Setting logger verbosity to '{}'", level); - let mut inner = self.inner.write().unwrap(); - inner.level = level; + log_debug!("Setting Logger Verbosity: {}", level); + { + let mut inner = self.inner.write().unwrap(); + inner.level = level; + } + log_debug!("Logger Verbosity: {}", level); Ok(()) } @@ -491,20 +498,14 @@ impl Logger { } pub fn set_verbosity_keywords(&self, keywords: Vec) -> Result<()> { - log_debug!("Setting verbosity keywords: {:?}", keywords); + log_debug!("Setting Verbosity Keywords: {:?}", keywords); let mut inner = self.inner.write().unwrap(); inner.keywords = keywords; Ok(()) } - pub fn keywords_to_cmd(&self) -> String { - let keywords; - { - let inner = self.inner.read().unwrap(); - keywords = inner.keywords.join(","); - } - log_debug!("Converted Verbosity Keywords to: {}", keywords); - keywords + pub fn keywords(&self) -> Vec { + self.inner.read().unwrap().keywords.to_owned() } pub fn has_keyword(&self, keyword: &str) -> bool { diff --git a/rust/origen_metal/src/framework/users/password_cache_options.rs b/rust/origen_metal/src/framework/users/password_cache_options.rs index 5a386bd6..330a6e99 100644 --- a/rust/origen_metal/src/framework/users/password_cache_options.rs +++ b/rust/origen_metal/src/framework/users/password_cache_options.rs @@ -5,6 +5,7 @@ use crate::_utility::{bytes_from_str_of_bytes, str_from_byte_array}; use crate::utils::encryption::{decrypt_with, encrypt_with}; #[cfg(feature = "password-cache")] use keyring::Keyring; +use std::fmt; pub const PASSWORD_KEY: &str = "user_password__"; @@ -12,7 +13,7 @@ fn to_session_password<'a>(dataset: &str) -> String { format!("{}{}", PASSWORD_KEY, dataset) } -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum PasswordCacheOptions { Session, Keyring, @@ -137,3 +138,45 @@ impl PasswordCacheOptions { } } } + +impl fmt::Display for PasswordCacheOptions { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{}", match self { + Self::Session => "session", + Self::Keyring => "keyring", + Self::None => "none", + }) + } +} + +impl From<&PasswordCacheOptions> for Option { + fn from(value: &PasswordCacheOptions) -> Option { + match value { + PasswordCacheOptions::None => None, + _ => Some(value.to_string()) + } + } +} + +impl From for Option { + fn from(value: PasswordCacheOptions) -> Option { + PasswordCacheOptions::into(value) + } +} + +impl TryFrom> for PasswordCacheOptions { + type Error = crate::Error; + + fn try_from(value: Option<&str>) -> Result { + if let Some(v) = value { + Ok(match v.to_lowercase().as_str() { + "session" | "session_store" => PasswordCacheOptions::Session, + "keyring" => PasswordCacheOptions::Keyring, + "none" => PasswordCacheOptions::None, + _ => bail!("Invalid password cache option: '{}'", v) + }) + } else { + Ok(PasswordCacheOptions::None) + } + } +} diff --git a/rust/origen_metal/src/framework/users/user.rs b/rust/origen_metal/src/framework/users/user.rs index b4e21642..ecd15751 100644 --- a/rust/origen_metal/src/framework/users/user.rs +++ b/rust/origen_metal/src/framework/users/user.rs @@ -1,8 +1,6 @@ use super::data::{Data, DatasetConfig}; use super::password_cache_options::PasswordCacheOptions; use crate::_utility::{unsorted_dedup, validate_input_list}; -use crate::frontend::FeatureReturn; -use crate::log_error; use crate::prelude::session_store::*; use crate::utils::file::FilePermissions; use crate::{Outcome, OutcomeState, Result}; @@ -10,6 +8,9 @@ use indexmap::IndexMap; use std::collections::{HashMap, HashSet}; use std::path::PathBuf; use std::sync::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard}; +use crate::{log_error}; +use crate::frontend::FeatureReturn; +use std::env; pub const DEFAULT_DATASET_KEY: &str = "__origen__default__"; pub const DEFAULT_USER_SESSION_PATH_OFFSET: &str = "./.o2/.session"; @@ -256,6 +257,101 @@ impl PopulateUserReturn { } } +pub fn try_default_home_dir(user: Option<&str>, dataset: Option<&str>) -> Result> { + let u_id: String; + let is_current; + match user { + Some(id) => { + if let Some(cid) = super::users::get_current_user_id()? { + is_current = cid == id; + } else { + is_current = false; + } + u_id = id.to_owned(); + }, + None => { + if let Some(id) = super::users::get_current_user_id()? { + u_id = id; + is_current = true; + } else { + bail!("Cannot attempt to lookup home directory when no current user has been set!") + } + } + } + + // TODO see about wrapping function calls like this (optional frontend functions) + let fe_res = crate::with_optional_frontend(|f| { + if let Some(fe) = f { + if let Some(result) = fe.lookup_home_dir(&u_id, dataset, is_current) { + return Ok(Some(result?)) + } + } + Ok(None) + })?; + + if let Some(r) = fe_res { + Ok(r) + } else { + let hd: PathBuf; + if cfg!(windows) { + match env::var("USERPROFILE") { + Ok(path) => hd = PathBuf::from(path), + Err(e) => { + match e { + env::VarError::NotPresent => bail!("Please set environment variable USERPROFILE to point to your home directory, then try again"), + _ => bail!(&e.to_string()) + } + } + } + } else { + match env::var("HOME") { + Ok(path) => hd = PathBuf::from(path), + Err(e) => { + match e { + env::VarError::NotPresent => bail!("Please set environment variable HOME to point to your home directory, then try again"), + _ => bail!(&e.to_string()) + } + } + } + } + + if !hd.ends_with(&u_id) { + bail!("Home directory '{}' is not appropriate for current user with id '{}'", hd.display(), &u_id) + } else { + Ok(Some(hd)) + } + // try_default_home_dir_lookup() // super::whoami() + } +} + +// pub fn try_default_home_dir_lookup() -> Result { +// let hd; +// if cfg!(windows) { +// match env::var("USERPROFILE") { +// Some(path) => hd = PathBuf::from(path), +// None => bail!("Please set environment variable USERPROFILE to point to your home directory, then try again") +// } +// } else { +// match env::var("HOME") { +// Some(path) => hd = PathBuf::from(path), +// None => bail!("Please set environment variable HOME to point to your home directory, then try again") +// } +// } + +// // Confirm that this directory is suitable for the current user +// super::users::with_current_user( |user| { // get_current_user_id +// if let Some(u) = user { +// if !hd.ends_with(u.id) { +// bail!("Home directory '{}' is not appropriate for current user with id '{}'", hd.display(), u.id) +// } +// } else { +// bail!("Cannot attempt to lookup home directory when no current user has been set!") +// } +// Ok(hd) +// }) +// } + + #[derive(Debug, Default)] struct PopulateStatus { populating: RwLock, @@ -362,6 +458,7 @@ pub struct User { // User-level overrides for dataset configuration auto_populate: Option, should_validate_passwords: Option, + prompt_for_passwords: Option, } impl User { @@ -526,6 +623,9 @@ impl User { roles: RwLock::new(HashSet::new()), auto_populate: auto_populate, should_validate_passwords: users.default_should_validate_passwords().to_owned(), + + // TODO add a users option to inherit from? + prompt_for_passwords: None, }; for (ds, config) in users.default_datasets().iter() { @@ -714,17 +814,30 @@ impl User { } pub fn set_home_dir(&self, new_dir: Option) -> Result<()> { - let mut data = self.write_data(None).unwrap(); - data.home_dir = new_dir; + if new_dir.is_some() { + let mut data = self.write_data(None)?; + data.home_dir = new_dir; + } else { + self.for_datasets_in_hierarchy_mut( |d| { d.home_dir = None; Ok(()) })?; + } Ok(()) } + pub fn dot_origen_dir(&self) -> Result { + let mut dot = self.require_home_dir()?; + dot.push(".origen"); + Ok(dot) + } + pub fn _cache_password(&self, password: &str, dataset: &str) -> Result { self.password_cache_option .cache_password(self, password, dataset) } pub fn _password_dialog(&self, dataset: &str, motive: Option<&str>) -> Result { + if !self.prompt_for_passwords() { + bail!("Cannot prompt for passwords for user '{}'. Passwords must be loaded by the config or set directly.", &self.id); + } // TODO add attempts back in // for _attempt in 0..ORIGEN_CONFIG.user__password_auth_attempts { let msg; @@ -739,11 +852,15 @@ impl User { None => format!("\nPlease enter your password ({}): ", dataset), }; } - let pass = rpassword::read_password_from_tty(Some(&msg)).unwrap(); + let pass = match rpassword::read_password_from_tty(Some(&msg)) { + Ok(pw) => pw, + Err(e) => bail!("Error encountered prompting for password: {}", e) + }; let attempt = self._try_password(&pass, Some(dataset))?; + if attempt.0 { self._cache_password(&pass, dataset)?; - let mut data = self.write_data(Some(dataset)).unwrap(); + let mut data = self.write_data(Some(dataset))?; data.password = Some(pass.clone()); return Ok(pass); } else { @@ -887,6 +1004,18 @@ impl User { self.should_validate_passwords = new; } + pub fn prompt_for_passwords(&self) -> bool { + self.prompt_for_passwords.unwrap_or(true) + } + + pub fn prompt_for_passwords_value(&self) -> &Option { + &self.prompt_for_passwords + } + + pub fn set_prompt_for_passwords(&mut self, new: Option) -> () { + self.prompt_for_passwords = new; + } + pub fn password( &self, motive_or_dataset: Option<&str>, @@ -1003,7 +1132,11 @@ impl User { let _unused = crate::sessions(); } } - self.write_data(dataset)?.clear_cached_password(self) + if dataset.is_some() { + self.write_data(dataset)?.clear_cached_password(self) + } else { + self.for_datasets_in_hierarchy_mut(|d| d.clear_cached_password(self)) + } } pub fn should_auto_populate(&self) -> bool { @@ -1208,6 +1341,30 @@ impl User { } Ok(()) } + + pub fn for_datasets_in_hierarchy(&self, mut func: F) -> Result<()> + where + F: FnMut(&Data) -> Result, + { + for n in self.data_lookup_hierarchy.iter() { + self.with_dataset(&n, |d| { + func(d) + })?; + }; + Ok(()) + } + + pub fn for_datasets_in_hierarchy_mut(&self, mut func: F) -> Result<()> + where + F: FnMut(&mut Data) -> Result, + { + for n in self.data_lookup_hierarchy.iter() { + self.with_dataset_mut(&n, |d| { + func(d) + })?; + }; + Ok(()) + } } impl PartialEq for User { diff --git a/rust/origen_metal/src/framework/users/users.rs b/rust/origen_metal/src/framework/users/users.rs index e1148513..29bf1a46 100644 --- a/rust/origen_metal/src/framework/users/users.rs +++ b/rust/origen_metal/src/framework/users/users.rs @@ -1,5 +1,6 @@ use super::data::DatasetConfig; use super::user::{PopulateUserReturn, SessionConfig, User}; +use super::password_cache_options::PasswordCacheOptions; use crate::{Outcome, Result, USERS}; use indexmap::IndexMap; use std::sync::{RwLockReadGuard, RwLockWriteGuard}; @@ -7,8 +8,8 @@ use std::sync::{RwLockReadGuard, RwLockWriteGuard}; use crate::_utility::validate_input_list; use crate::prelude::session_store::*; use crate::utils::encryption; -use std::collections::HashMap; use std::path::PathBuf; +use std::collections::HashMap; lazy_static! { pub static ref DEFAULT_DATASET_KEY: &'static str = "__origen__default__"; @@ -271,6 +272,7 @@ pub struct Users { default_session_config: SessionConfig, default_auto_populate: Option, default_should_validate_passwords: Option, + default_password_cache_option: Option, default_roles: Vec, uid_cnt: usize, password_encryption_key__byte_str: String, @@ -435,7 +437,7 @@ impl Users { id, &self, // TODO support password cache option - None, + self.default_password_cache_option.clone(), self.uid_cnt, auto_populate .map_or_else(|| self.default_auto_populate.to_owned(), |ap| Some(ap)), @@ -517,7 +519,8 @@ impl Users { self.default_session_config = SessionConfig::new(); self.default_auto_populate = None; self.default_should_validate_passwords = None; - self.default_roles = vec![]; + self.default_password_cache_option = None; + self.default_roles = vec!(); self.password_encryption_key__byte_str = encryption::default_encryption_key__byte_str().to_string(); self.password_encryption_nonce__byte_str = @@ -701,6 +704,20 @@ impl Users { self.default_should_validate_passwords = set_to; } + pub fn default_password_cache_option(&self) -> &Option { + &self.default_password_cache_option + } + + // pub fn set_default_password_cache_option(&mut self, set_to: Option<&str>) -> Result<()> { + // self.default_password_cache_option = Some(set_to.try_into()?); + // Ok(()) + // } + + pub fn set_default_password_cache_option>(&mut self, set_to: P) -> Result<()> { + self.default_password_cache_option = Some(set_to.try_into()?); + Ok(()) + } + pub fn default_roles(&self) -> Result<&Vec> { Ok(&self.default_roles) } @@ -761,7 +778,8 @@ impl Default for Users { default_session_config: SessionConfig::new(), default_auto_populate: None, default_should_validate_passwords: None, - default_roles: vec![], + default_password_cache_option: None, + default_roles: vec!(), uid_cnt: 0, password_encryption_key__byte_str: encryption::default_encryption_key__byte_str() .to_string(), diff --git a/rust/origen_metal/src/frontend/mod.rs b/rust/origen_metal/src/frontend/mod.rs index 5a521024..52e7e274 100644 --- a/rust/origen_metal/src/frontend/mod.rs +++ b/rust/origen_metal/src/frontend/mod.rs @@ -5,6 +5,7 @@ use crate::{Result, TypedValue}; use indexmap::IndexMap; use std::any::Any; use std::sync::RwLockReadGuard; +use std::path::PathBuf; pub use crate::utils::revision_control::frontend::RevisionControlFrontendAPI; pub use data_store::{DataStoreFeature, DataStoreFrontendAPI, FeatureReturn}; @@ -199,5 +200,9 @@ pub trait FrontendAPI { None } + fn lookup_home_dir(&self, _user_id: &str, _dataset: Option<&str>, _current_user: bool) -> Option>> { + None + } + fn as_any(&self) -> &dyn Any; } diff --git a/rust/origen_metal/src/lib.rs b/rust/origen_metal/src/lib.rs index 6dcf1e2c..77aab535 100644 --- a/rust/origen_metal/src/lib.rs +++ b/rust/origen_metal/src/lib.rs @@ -1,6 +1,15 @@ #[macro_use] pub extern crate lazy_static; pub extern crate config; +pub extern crate indexmap; +pub extern crate glob; +pub extern crate octocrab; +pub extern crate tera; +pub extern crate toml_edit; +pub extern crate dialoguer; +pub extern crate reqwest; +pub extern crate futures; +pub extern crate serde_json; #[macro_use] extern crate serde; #[macro_use] @@ -38,13 +47,12 @@ pub use framework::users::users::{ get_current_user_id, get_initial_user_id, require_current_user_email, require_current_user_home_dir, require_current_user_id, set_current_user, try_lookup_and_set_current_user, try_lookup_current_user, users, users_mut, with_current_user, - with_current_user_session, with_user, with_user_mut, with_user_or_current, with_users, - with_users_mut, + with_current_user_session, with_user, with_user_mut, with_users, with_users_mut, with_user_or_current, }; // TODO and this? pub use framework::users::user::{ add_dataset_to_user, register_dataset_with_user, with_user_dataset, with_user_dataset_mut, - with_user_hierarchy, with_user_motive_or_default, + with_user_hierarchy, with_user_motive_or_default }; pub use framework::users::users::unload as unload_users; pub use utils::os::on_linux as running_on_linux; @@ -101,7 +109,7 @@ where mod tests { #[cfg(all(test, not(origen_skip_frontend_tests)))] pub fn run_python(code: &str) -> crate::Result<()> { - let mut c = std::process::Command::new("poetry"); + let mut c = crate::new_cmd!("poetry"); c.arg("run"); c.arg("python"); c.arg("-c"); diff --git a/rust/origen_metal/src/macros.rs b/rust/origen_metal/src/macros.rs index 158e550a..76cea665 100644 --- a/rust/origen_metal/src/macros.rs +++ b/rust/origen_metal/src/macros.rs @@ -339,3 +339,12 @@ macro_rules! hashmap { h }}; } + +/// Create a new pathbuf, rebuilt from components to resolve OS path differences +/// when displaying paths possibly built from "/", "\", or "\\" used interchangeably +#[macro_export] +macro_rules! scrub_path { + ($path:expr) => {{ + std::path::PathBuf::from_iter($path.components()) + }} +} \ No newline at end of file diff --git a/rust/origen_metal/src/utils/command.rs b/rust/origen_metal/src/utils/command.rs index 2560bdaf..7347a057 100644 --- a/rust/origen_metal/src/utils/command.rs +++ b/rust/origen_metal/src/utils/command.rs @@ -6,18 +6,7 @@ use std::process::{Command, Stdio}; use std::time::Duration; use wait_timeout::ChildExt; -/// Executes the given command/args, returning all captured stdout and stderr lines and -/// the exit code of the process. -pub fn exec_and_capture( - cmd: &str, - args: Option>, -) -> Result<(std::process::ExitStatus, Vec, Vec)> { - let mut command = Command::new(cmd); - if let Some(args) = args { - for arg in args { - command.arg(arg); - } - } +pub fn exec_and_capture_cmd(mut command: Command) -> Result<(std::process::ExitStatus, Vec, Vec)> { let mut process = command .stdout(Stdio::piped()) .stderr(Stdio::piped()) @@ -39,6 +28,21 @@ pub fn exec_and_capture( Ok((exit_code, stdout_lines, stderr_lines)) } +/// Executes the given command/args, returning all captured stdout and stderr lines and +/// the exit code of the process. +pub fn exec_and_capture( + cmd: &str, + args: Option>, +) -> Result<(std::process::ExitStatus, Vec, Vec)> { + let mut command = Command::new(cmd); + if let Some(args) = args { + for arg in args { + command.arg(arg); + } + } + exec_and_capture_cmd(command) +} + /// Log both stdout and stderr to the debug and error logs respectively, optionally /// calling a callback function for each line captured. /// If no callbacks are given then any captures lines will be sent to the debug and @@ -90,6 +94,19 @@ pub fn log_stderr(process: &mut std::process::Child, mut callback: Option<&mut d }); } +#[macro_export] +macro_rules! new_cmd { + ($base_cmd:expr) => {{ + if cfg!(windows) { + let mut c = std::process::Command::new("cmd"); + c.arg(r"/c").arg($base_cmd); + c + } else { + std::process::Command::new($base_cmd) + } + }}; +} + pub fn exec + Clone>( cmd: Vec, capture: bool, diff --git a/rust/origen_metal/src/utils/file.rs b/rust/origen_metal/src/utils/file.rs index 1bb1c729..17a70fb3 100644 --- a/rust/origen_metal/src/utils/file.rs +++ b/rust/origen_metal/src/utils/file.rs @@ -60,6 +60,24 @@ pub fn search_backwards_for(files: Vec<&str>, base: &Path) -> (bool, PathBuf) { } } +/// Similar to search_backwards_for but takes a func returning Result> if found, None otherwise. +/// Returns Ok(Some) for the first result and ceases running. If no results are found, returns Ok(None) +pub fn search_backwards_for_first(mut start_path: PathBuf, mut func: F) -> Result> +where + F: FnMut(&Path) -> Result> +{ + if let Some(res) = func(&start_path)? { + return Ok(Some(res)); + } + + while start_path.pop() { + if let Some(res) = func(&start_path)? { + return Ok(Some(res)); + } + } + Ok(None) +} + /// Change the current directory to the given one pub fn cd(dir: &Path) -> Result<()> { env::set_current_dir(&dir).context(&format!("When cd'ing to '{}'", dir.display()))?; diff --git a/rust/origen_metal/src/utils/mailer/maillist.rs b/rust/origen_metal/src/utils/mailer/maillist.rs index 1bb8e720..9030915a 100644 --- a/rust/origen_metal/src/utils/mailer/maillist.rs +++ b/rust/origen_metal/src/utils/mailer/maillist.rs @@ -241,6 +241,8 @@ impl Maillist { email_str = r.to_string(); } } + use std::str::FromStr; + let _em = email_address::EmailAddress::from_str(&email_str)?; retn.push(email_str.parse()?); } Ok(retn) diff --git a/rust/origen_metal/src/utils/mod.rs b/rust/origen_metal/src/utils/mod.rs index 71134ad3..5e29da73 100644 --- a/rust/origen_metal/src/utils/mod.rs +++ b/rust/origen_metal/src/utils/mod.rs @@ -5,8 +5,10 @@ pub mod encryption; pub mod file; // TODO move outcome to framework pub mod ldap; -pub mod mailer; pub mod os; pub mod outcome; pub mod revision_control; pub mod terminal; +pub mod mailer; +pub mod version; +pub mod pypi; \ No newline at end of file diff --git a/rust/origen_metal/src/utils/pypi.rs b/rust/origen_metal/src/utils/pypi.rs new file mode 100644 index 00000000..138a1fe3 --- /dev/null +++ b/rust/origen_metal/src/utils/pypi.rs @@ -0,0 +1,48 @@ +/// Wrappers around the PyPi JSON API instead of pip +/// https://warehouse.pypa.io/api-reference/json.html + +use crate::Result; + +lazy_static! { + pub static ref PYPI_URL_BASE: &'static str = "https://pypi.org"; + pub static ref PYPI_TEST_URL_BASE: &'static str = "https://test.pypi.org"; +} + +pub fn get_package_details>(package_name: S) -> Result { + get_package_details_from(package_name, *PYPI_URL_BASE) +} + +pub fn get_package_details_from_test_server>(package_name: S) -> Result { + get_package_details_from(package_name, *PYPI_TEST_URL_BASE) +} + +pub fn get_package_details_from, S2: AsRef>(package_name: S1, url: S2) -> Result +{ + let url = format!("{}/pypi/{}/json", url.as_ref(), package_name.as_ref()); + let response = reqwest::blocking::get(&url)?; + Ok(response.json::()?) +} + +pub fn get_package_versions>(package_name: S) -> Result> { + get_package_versions_from(package_name, *PYPI_URL_BASE) +} + +pub fn get_package_versions_from_test_server>(package_name: S) -> Result> { + get_package_versions_from(package_name, *PYPI_TEST_URL_BASE) +} + +pub fn get_package_versions_from, S2: AsRef>(package_name: S1, url: S2) -> Result> { + let res = get_package_details_from(package_name.as_ref(), url)?; + let versions = res["releases"].as_object().unwrap().keys().map( |k| k.to_string()).collect::>(); + Ok(versions) +} + +pub fn is_package_version_available, S2: AsRef>(package_name: S1, version: S2) -> Result { + let pkgs = get_package_versions(package_name)?; + Ok(pkgs.iter().find(|v| v == &version.as_ref()).is_none()) +} + +pub fn is_package_version_available_on_test_server, S2: AsRef>(package_name: S1, version: S2) -> Result { + let pkgs = get_package_versions_from_test_server(package_name)?; + Ok(pkgs.iter().find(|v| v == &version.as_ref()).is_none()) +} diff --git a/rust/origen_metal/src/utils/revision_control/supported/git.rs b/rust/origen_metal/src/utils/revision_control/supported/git.rs index 1505d163..533f673a 100644 --- a/rust/origen_metal/src/utils/revision_control/supported/git.rs +++ b/rust/origen_metal/src/utils/revision_control/supported/git.rs @@ -394,6 +394,7 @@ impl RevisionControlAPI for Git { cb.credentials(|url, username_from_url, allowed_types| { self.credentials_callback(url, username_from_url, allowed_types) }); + self.reset_temps(); log_trace!("Cleaning up after push..."); repo.checkout_index(None, None)?; Ok(Outcome::new_success_with_msg(commit_id)) @@ -441,6 +442,7 @@ impl Git { } self.checkout(true, None, version)?; + self.reset_temps(); Ok(()) } @@ -868,6 +870,7 @@ impl Git { // Disconnect the underlying connection to prevent from idling. remote.disconnect()?; + self.reset_temps(); // Update the references in the remote's namespace to point to the right // commits. This may be needed even if there was no packfile to download, @@ -891,7 +894,6 @@ impl Git { // let cfg = Config::open_default()?; let repo = Repository::open(&self.local)?; let cfg = repo.config()?; - // changed this to be compatiple with newer versions of git2 let mut entries = cfg.entries(Some("user*"))?; while let Some(entry) = entries.next() { let entry = entry?; @@ -928,6 +930,48 @@ impl Git { } Ok(Outcome::new_success()) } + + pub fn on_branch(&self, query: &str) -> Result { + let repo = Repository::open(&self.local)?; + let head = repo.head()?; + if let Some(n) = head.shorthand() { + Ok(head.is_branch() && (n == query) && !repo.head_detached()?) + } else { + Ok(false) + } + } + + pub fn list_refs(&self, remote_name: Option<&str>) -> Result> { + let repo = Repository::open(&self.local)?; + let mut remote = repo.find_remote(remote_name.unwrap_or("origin"))?; + let mut cb = RemoteCallbacks::new(); + cb.credentials(|url, username_from_url, allowed_types| { + self.credentials_callback(url, username_from_url, allowed_types) + }); + remote.connect_auth(Direction::Fetch, Some(cb), None)?; + self.reset_temps(); + Ok(remote.list()?.iter().map( |r| [r.name().to_string(), r.oid().to_string()]).collect::>()) + } + + pub fn confirm_latest_ref(&self, branch: &str) -> Result<(bool, [String; 2])> { + let refs = self.list_refs(None)?; + let b; + if branch.starts_with("refs/") { + b = branch.to_string(); + } else { + b = format!("refs/heads/{}", branch); + } + if let Some(latest) = refs.iter().find( |r| { r[0] == b }) { + // first ref should be HEAD, but double check + if refs[0][0] == "HEAD" { + Ok((refs[0][1] == latest[1], [refs[0][1].to_string(), latest[1].to_string()])) + } else { + bail!("Expected HEAD ref to be first in list. Found: {}", refs[0][0]); + } + } else { + bail!("Could not find Git ref: {}", b); + } + } } fn ssh_keys() -> Vec { diff --git a/rust/origen_metal/src/utils/terminal.rs b/rust/origen_metal/src/utils/terminal.rs index bfd4cf6b..511182e8 100644 --- a/rust/origen_metal/src/utils/terminal.rs +++ b/rust/origen_metal/src/utils/terminal.rs @@ -3,6 +3,9 @@ use std::io::Write; use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; +use std::process::exit; +use crate::Result; +use dialoguer::Select; pub fn green(msg: &str) { print(msg, Color::Green); @@ -90,3 +93,28 @@ fn print(msg: &str, color: Color) { let _ = stdout.reset(); print!("{}", msg); } + +pub fn confirm_with_user(prompt: Option) -> Result +where S: Into +{ + let mut dialogue = Select::new(); + dialogue.item("Yes").item("No").default(1); + if let Some(p) = prompt { + dialogue.with_prompt(p); + } + Ok(dialogue.interact()? == 0) +} + +pub fn confirm_or_exit(prompt: Option, exit_dialogue: Option, exit_code: Option) -> Result<()> +where + S: Into, + D: std::fmt::Display +{ + if !confirm_with_user(prompt)? { + if let Some(d) = exit_dialogue { + println!("{}", d); + } + exit(exit_code.unwrap_or(0)); + } + Ok(()) +} \ No newline at end of file diff --git a/rust/origen/src/utility/version.rs b/rust/origen_metal/src/utils/version.rs similarity index 77% rename from rust/origen/src/utility/version.rs rename to rust/origen_metal/src/utils/version.rs index 858de8de..b0492be1 100644 --- a/rust/origen/src/utility/version.rs +++ b/rust/origen_metal/src/utils/version.rs @@ -1,11 +1,17 @@ //! Utility functions for dealing with app/Origen version numbers -use crate::utility::file_actions as fa; use crate::Result; -use regex::Regex; use semver; use std::fmt; +use std::fs; use std::path::PathBuf; +use crate::{toml_edit, dialoguer}; +use crate::toml_edit::Document; + +lazy_static! { + static ref PYPROJECT_PATH: [&'static str; 3] = ["tool", "poetry", "version"]; + static ref CARGO_PATH: [&'static str; 2] = ["package", "version"]; +} const BETA: &str = "beta"; const ALPHA: &str = "alpha"; @@ -63,6 +69,26 @@ impl Version { Self::new(ver, VersionSpec::Pep440) } + pub fn is_pep440(&self) -> bool { + self.spec == VersionSpec::Pep440 + } + + pub fn is_semver(&self) -> bool { + self.spec == VersionSpec::Semver + } + + pub fn convert_to_pep440(&mut self) -> bool { + let retn = !(self.spec == VersionSpec::Pep440); + self.spec = VersionSpec::Pep440; + retn + } + + pub fn convert_to_semver(&mut self) -> bool { + let retn = !(self.spec == VersionSpec::Semver); + self.spec = VersionSpec::Semver; + retn + } + fn split_prerelease(pre: &str) -> Result<(&str, usize)> { match pre.find(|c: char| c.is_digit(10)) { Some(i) => { @@ -298,6 +324,20 @@ impl Version { Ok(self) } + pub fn increment(&self, release_type: &ReleaseType) -> Result { + Ok(match release_type { + ReleaseType::Major => self.next_major(), + ReleaseType::Minor => self.next_minor(), + ReleaseType::Patch => self.next_patch(), + ReleaseType::Beta => self.next_beta()?, + ReleaseType::Alpha => self.next_alpha()?, + ReleaseType::Dev => self.next_dev()?, + ReleaseType::DevCustom | ReleaseType::AlphaCustom | ReleaseType::BetaCustom => { + return Err("Error: Cannot use custom release: dialogue unavailable".into()) + } + }) + } + pub fn update_dialogue(&self) -> Result { let release_type = ReleaseType::from_idx( dialoguer::Select::new() @@ -350,28 +390,46 @@ impl Version { .interact()?, )) } + + pub fn from_pyproject_with_toml_handle(pyproject: PathBuf) -> Result { + VersionWithTOML::new(pyproject, &*PYPROJECT_PATH) + } + + pub fn from_cargo_with_toml_handle(cargo_toml: PathBuf) -> Result { + let mut ver = VersionWithTOML::new(cargo_toml, &*CARGO_PATH)?; + ver.convert_to_semver(); + Ok(ver) + } + + pub fn to_pep440(&self) -> Result { + Self::new_pep440(&self.to_string()) + } + + pub fn to_pep440_string(&self) -> String { + let v = &self.semver; + if v.pre.is_empty() { + format!("{}.{}.{}", v.major, v.minor, v.patch) + } else { + format!( + "{}.{}.{}.{}", + v.major, + v.minor, + v.patch, + v.pre.replace(".", "") + ) + } + } + + pub fn to_semver_string(&self) -> String { + self.semver.to_string() + } } impl fmt::Display for Version { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - // Customize so only `x` and `y` are denoted. match self.spec { - VersionSpec::Semver => self.semver.fmt(f), - VersionSpec::Pep440 => { - let v = &self.semver; - if v.pre.is_empty() { - write!(f, "{}.{}.{}", v.major, v.minor, v.patch) - } else { - write!( - f, - "{}.{}.{}.{}", - v.major, - v.minor, - v.patch, - v.pre.replace(".", "") - ) - } - } + VersionSpec::Semver => write!(f, "{}", self.to_semver_string()), + VersionSpec::Pep440 => write!(f, "{}", self.to_pep440_string()), } } } @@ -446,14 +504,169 @@ impl ReleaseType { } } -pub fn set_version_in_toml(toml_file: &PathBuf, version: &Version) -> Result<()> { - let r = Regex::new(r#"^\s*version\s*=\s*['"]"#).unwrap(); - fa::remove_line(&toml_file, &r)?; +impl fmt::Display for ReleaseType { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", self.to_string()) + } +} + +impl TryFrom<&str> for ReleaseType { + type Error = String; + + fn try_from(value: &str) -> std::result::Result { + Ok(match value.to_lowercase().as_str() { + "major" => Self::Major, + "minor" => Self::Minor, + "patch" => Self::Patch, + "beta" => Self::Beta, + "alpha" => Self::Alpha, + "dev" => Self::Dev, + // Self::BetaCustom => "Beta (Custom)", + // Self::AlphaCustom => "Alpha (Custom)", + // Self::DevCustom => "Dev (Custom)", + _ => return Err(format!("Unrecognized Release Type '{}'", value)) + }) + } +} + +pub struct VersionWithTOML { + pub toml: Document, + source: PathBuf, + orig_version: Version, + new_version: Option, + rel_type: Option, + written: bool, + version_path: &'static [&'static str], +} - let r = Regex::new(r#"^\s*name\s*=\s+['"].*$"#).unwrap(); - let line = format!("\nversion = \"{}\"", version.to_string()); - fa::insert_after(&toml_file, &r, &line)?; - Ok(()) +impl VersionWithTOML { + pub fn new(source: PathBuf, version_path: &'static [&'static str]) -> Result { + if version_path.is_empty() { + bail!("Version path should not be empty!"); + } + if !source.is_file() { + bail!("Source file '{}' does not exist!", source.display()); + } + + let content = std::fs::read_to_string(&source)?; + let toml = content.parse::().unwrap(); + let mut i: &toml_edit::Item = &toml[version_path[0]]; + for p in version_path[1..].iter() { + i = &i[p]; + } + let current = Version::new_pep440({ + match i.as_str() { + Some(v) => v, + None => bail!("Failed to parse version from TOML '{}'. 'version' not found or could not be parsed as a string", source.display()) + } + })?; + + Ok(Self { + orig_version: current, + toml: toml, + source: source, + new_version: None, + rel_type: None, + written: false, + version_path: version_path, + }) + } + + pub fn increment(&mut self, increment: ReleaseType) -> Result<()> { + self.new_version = Some(self.orig_version.increment(&increment)?); + self.rel_type = Some(increment); + Ok(()) + } + + pub fn was_version_updated(&self) -> bool { + self.new_version.is_some() + } + + pub fn orig_version(&self) -> &Version { + &self.orig_version + } + + pub fn new_version(&self) -> Option<&Version> { + self.new_version.as_ref() + } + + pub fn rel_type(&self) -> Option<&ReleaseType> { + self.rel_type.as_ref() + } + + pub fn source(&self) -> &PathBuf { + &self.source + } + + pub fn is_pep440(&self) -> bool { + self.orig_version.is_pep440() + } + + pub fn is_semver(&self) -> bool { + self.orig_version.is_semver() + } + + pub fn convert_to_pep440(&mut self) -> bool { + if let Some(v) = &mut self.new_version { + v.convert_to_pep440(); + } + self.orig_version.convert_to_pep440() + } + + pub fn convert_to_semver(&mut self) -> bool { + if let Some(v) = &mut self.new_version { + v.convert_to_semver(); + } + self.orig_version.convert_to_semver() + } + + pub fn version(&self) -> &Version { + if let Some(v) = self.new_version.as_ref() { + v + } else { + &self.orig_version + } + } + + pub fn set_new_version(&mut self, new: Version) -> Result<()> { + self.new_version = Some(new); + Ok(()) + } + + pub fn get_other(&self, path: &'static [&'static str]) -> Result<&toml_edit::Item> { + let mut i: &toml_edit::Item = &self.toml[path[0]]; + for p in path[1..].iter() { + i = &i[p]; + } + Ok(i) + } + + pub fn set_other(&mut self, path: &'static [&'static str], value: impl Into) -> Result { + let mut i: &mut toml_edit::Item = &mut self.toml[path[0]]; + for p in path[1..].iter() { + i = &mut i[p]; + } + let retn = i.clone(); + *i = toml_edit::value(value); + Ok(retn) + } + + pub fn write(&mut self) -> Result<()> { + if let Some(v) = self.new_version() { + let ver = v.to_string(); + let mut i: &mut toml_edit::Item = &mut self.toml[self.version_path[0]]; + for p in self.version_path[1..].iter() { + i = &mut i[p]; + } + + *i = toml_edit::value(ver); + fs::write(&self.source, self.toml.to_string())?; + self.written = true; + Ok(()) + } else { + bail!("Version has not been updated! Nothing to update!"); + } + } } #[cfg(test)] diff --git a/rust/pyapi/Cargo.lock b/rust/pyapi/Cargo.lock deleted file mode 100644 index d060762f..00000000 --- a/rust/pyapi/Cargo.lock +++ /dev/null @@ -1,4269 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.15.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a2e47a1fbe209ee101dd6d61285226744c6c8d3c21c8dc878ba6cb9f467f3a" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher", -] - -[[package]] -name = "aes-gcm" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom 0.2.3", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "0.7.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" -dependencies = [ - "memchr", -] - -[[package]] -name = "ansi_colours" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60e2fb6138a49ad9f1cb3c6d8f8ccbdd5e62b4dab317c1b435a47ecd7da1d28f" -dependencies = [ - "cc", -] - -[[package]] -name = "ansi_term" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b" -dependencies = [ - "winapi", -] - -[[package]] -name = "arc-swap" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e906254e445520903e7fc9da4f709886c84ae4bc4ddaf0e093188d66df4dc820" - -[[package]] -name = "arrayref" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" - -[[package]] -name = "arrayvec" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-trait" -version = "0.1.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4717cfcbfaa661a0fd48f8453951837ae7e8f81e481fbb136e3202d72805a744" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" -dependencies = [ - "byteorder", -] - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "blake2b_simd" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afa748e348ad3be8263be728124b24a24f268266f6f5d58af9d75f6a40b5c587" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding 0.2.1", - "cipher", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "bstr" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a40b47ad93e1a5404e6c18dec46b628214fee441c70f4ab5d6942142cc268a3d" -dependencies = [ - "memchr", -] - -[[package]] -name = "built" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f346b6890a0dfa7266974910e7df2d5088120dd54721b9b0e5aae1ae5e05715" -dependencies = [ - "cargo-lock", -] - -[[package]] -name = "bumpalo" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c59e7af012c713f529e7a3ee57ce9b31ddd858d4b512923602f74608b009631" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - -[[package]] -name = "cargo-expand" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a455cb292125e338d04c82c47c8bbbf21ec3860882b245893d3ade260487ac8" -dependencies = [ - "atty", - "onig", - "prettyprint", - "proc-macro2 1.0.58", - "quote 1.0.27", - "serde", - "structopt", - "syn 1.0.74", - "syn-select", - "syntect", - "tempfile", - "termcolor", - "toml", - "toolchain_find", -] - -[[package]] -name = "cargo-lock" -version = "7.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb04b88bd5b2036e30704f95c6ee16f3b5ca3b4ca307da2889d9006648e5c88" -dependencies = [ - "semver 1.0.4", - "serde", - "toml", - "url", -] - -[[package]] -name = "cc" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "serde", - "time 0.1.44", - "winapi", -] - -[[package]] -name = "chrono-tz" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2554a3155fec064362507487171dcc4edc3df60cb10f3a1fb10ed8094822b120" -dependencies = [ - "chrono", - "parse-zoneinfo", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "clap" -version = "2.33.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e58ac78573c40708d45522f0d80fa2f01cc4f9b4e2bf749807255454312002" -dependencies = [ - "ansi_term", - "atty", - "bitflags", - "strsim 0.8.0", - "textwrap", - "unicode-width", - "vec_map", -] - -[[package]] -name = "clicolors-control" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" -dependencies = [ - "atty", - "lazy_static", - "libc", - "winapi", -] - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "config" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea917b74b6edfb5024e3b55d3c8f710b5f4ed92646429601a42e96f0812b31b" -dependencies = [ - "async-trait", - "json5", - "lazy_static", - "nom", - "pathdiff 0.2.1", - "ron", - "rust-ini", - "serde", - "serde_json", - "toml", - "yaml-rust", -] - -[[package]] -name = "console" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca57c2c14b8a2bf3105bc9d15574aad80babf6a9c44b1058034cdf8bd169628" -dependencies = [ - "atty", - "clicolors-control", - "encode_unicode", - "lazy_static", - "libc", - "parking_lot 0.11.1", - "regex", - "termios", - "unicode-width", - "winapi", -] - -[[package]] -name = "console" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "regex", - "terminal_size", - "unicode-width", - "winapi", -] - -[[package]] -name = "constant_time_eq" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" - -[[package]] -name = "content_inspector" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7bda66e858c683005a53a9a60c69a4aca7eeaa45d124526e389f7aec8e62f38" -dependencies = [ - "memchr", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "cpufeatures" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c99696f6c9dd7f35d486b9d04d7e6e202aa3e8c40d553f2fdf5e7e0c6a71ef" -dependencies = [ - "libc", -] - -[[package]] -name = "cpuid-bool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" - -[[package]] -name = "crc32fast" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", -] - -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "generic-array 0.14.4", - "subtle", -] - -[[package]] -name = "ctor" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" -dependencies = [ - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher", -] - -[[package]] -name = "curl-sys" -version = "0.4.45+curl-7.78.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de9e5a72b1c744eb5dd20b2be4d7eb84625070bb5c4ab9b347b70464ab1e62eb" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "winapi", -] - -[[package]] -name = "darling" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcfbcb0c5961907597a7d1148e3af036268f2b773886b8bb3eeb1e1281d3d3d6" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afc018370c3bff3eb51f89256a6bdb18b4fdcda72d577982a14954a7a0b402c" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2 0.4.30", - "quote 0.6.13", - "strsim 0.7.0", - "syn 0.15.44", -] - -[[package]] -name = "darling_macro" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d8dac1c6f1d29a41c4712b4400f878cb4fcc4c7628f298dd75038e024998d1" -dependencies = [ - "darling_core", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "derive_builder" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac53fa6a3cda160df823a9346442525dcaf1e171999a1cf23e67067e4fd64d4" -dependencies = [ - "darling", - "derive_builder_core", - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "derive_builder_core" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0288a23da9333c246bb18c143426074a6ae96747995c5819d2947b64cd942b37" -dependencies = [ - "darling", - "proc-macro2 0.4.30", - "quote 0.6.13", - "syn 0.15.44", -] - -[[package]] -name = "deunicode" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "850878694b7933ca4c9569d30a34b55031b9b139ee1fc7b94a527c4ef960d690" - -[[package]] -name = "dialoguer" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9dd058f8b65922819fabb4a41e7d1964e56344042c26efbccd465202c23fa0c" -dependencies = [ - "console 0.14.1", - "lazy_static", - "tempfile", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.4", -] - -[[package]] -name = "directories" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d337a64190607d4fcca2cb78982c5dd57f4916e19696b48a575fa746b6cb0f" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "dirs" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd78930633bd1c6e35c4b42b1df7b0cbc6bc191146e512bb3bedf243fcc3901" -dependencies = [ - "libc", - "redox_users 0.3.5", - "winapi", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" -dependencies = [ - "libc", - "redox_users 0.4.0", - "winapi", -] - -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "email-encoding" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfb21b9878cf7a348dcb8559109aabc0ec40d69924bd706fa5149846c4fef75" -dependencies = [ - "base64 0.21.0", - "memchr", -] - -[[package]] -name = "email_address" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112" - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "encoding" -version = "0.2.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" -dependencies = [ - "encoding-index-japanese", - "encoding-index-korean", - "encoding-index-simpchinese", - "encoding-index-singlebyte", - "encoding-index-tradchinese", -] - -[[package]] -name = "encoding-index-japanese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-korean" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-simpchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-singlebyte" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding-index-tradchinese" -version = "1.20141219.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" -dependencies = [ - "encoding_index_tests", -] - -[[package]] -name = "encoding_index_tests" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" - -[[package]] -name = "encoding_rs" -version = "0.8.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-display-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ef37b2a9b242295d61a154ee91ae884afff6b8b933b486b12481cc58310ca" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "enum-utils" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed327f716d0d351d86c9fd3398d20ee39ad8f681873cc081da2ca1c10fed398a" -dependencies = [ - "enum-utils-from-str", - "failure", - "proc-macro2 1.0.58", - "quote 1.0.27", - "serde_derive_internals", - "syn 1.0.74", -] - -[[package]] -name = "enum-utils-from-str" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49be08bad6e4ca87b2b8e74146987d4e5cb3b7512efa50ef505b51a22227ee1" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", -] - -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "error-chain" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" -dependencies = [ - "backtrace", - "version_check", -] - -[[package]] -name = "eval" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba90c19bed0c67afb0a24340b42d13ddddcb5413c4c17a04c11871bd6b572c42" -dependencies = [ - "quick-error", - "serde", - "serde_json", -] - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fastrand" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" -dependencies = [ - "instant", -] - -[[package]] -name = "flate2" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3aec53de10fe96d7d8c565eb17f2c687bb5518a2ec453b5b1252964526abe0" -dependencies = [ - "cfg-if 1.0.0", - "crc32fast", - "libc", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" -dependencies = [ - "opaque-debug 0.3.0", - "polyval", -] - -[[package]] -name = "ghost" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76c813ffb63e8fd3df6f1ac3cc1ea392c7612ac2de4d0b44dcbfe03e5c4bf94a" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "gimli" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" - -[[package]] -name = "git2" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc" -dependencies = [ - "bitflags", - "libc", - "libgit2-sys", - "log", - "openssl-probe", - "openssl-sys", - "url", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "globset" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" -dependencies = [ - "aho-corasick", - "bstr", - "fnv", - "log", - "regex", -] - -[[package]] -name = "globwalk" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93e3af942408868f6934a7b85134a3230832b9977cf66125df2f9edcfce4ddcc" -dependencies = [ - "bitflags", - "ignore", - "walkdir", -] - -[[package]] -name = "h2" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d357c7ae988e7d2182f7d7871d0b963962420b0678b0997ce7de72001aeab782" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "hashbrown" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c21d40587b92fa6a6c6e3c1bdbf87d75511db5672f9c93175574b3a00df1758" -dependencies = [ - "ahash", -] - -[[package]] -name = "heck" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hkdf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" -dependencies = [ - "digest 0.9.0", - "hmac", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - -[[package]] -name = "http" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" -dependencies = [ - "bytes", - "fnv", - "itoa 0.4.7", -] - -[[package]] -name = "http-body" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "humansize" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" - -[[package]] -name = "humantime" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" -dependencies = [ - "quick-error", -] - -[[package]] -name = "hyper" -version = "0.14.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa 1.0.6", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "ignore" -version = "0.4.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d" -dependencies = [ - "crossbeam-utils", - "globset", - "lazy_static", - "log", - "memchr", - "regex", - "same-file", - "thread_local", - "walkdir", - "winapi-util", -] - -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown 0.11.2", - "serde", -] - -[[package]] -name = "indoc" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a0bd019339e5d968b37855180087b7b9d512c5046fbd244cf8c95687927d6e" - -[[package]] -name = "instant" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee0328b1209d157ef001c94dd85b4f8f64139adb0eac2659f4b08382b2f474d" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "inventory" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84344c6e0b90a9e2b6f3f9abe5cc74402684e348df7b32adca28747e0cef091a" -dependencies = [ - "ctor", - "ghost", -] - -[[package]] -name = "ipnet" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" - -[[package]] -name = "iter-read" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea34c173b290f2449bb0489ae1024c2cf8b1c1dd1cc58a2e105df7f5d759f5d" - -[[package]] -name = "itertools" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f56a2d0bc861f9165be4eb3442afd3c236d8a98afd426f65d92324ae1091a484" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" - -[[package]] -name = "itoa" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" - -[[package]] -name = "jobserver" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5ca711fd837261e14ec9e674f092cbb931d3fa1482b017ae59328ddc6f3212b" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce791b7ca6638aae45be056e068fc756d871eb3b3b10b8efa62d1c9cec616752" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.0", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "keyring" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "894a58932447ecc241a3545135bdfd26ac0e611295b391904ce0b085310ab38c" -dependencies = [ - "byteorder", - "secret-service", - "security-framework", - "winapi", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[package]] -name = "lber" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5d85f5e00e12cb50c70c3b1c1f0daff6546eb4c608b44d0a990e38a539e0446" -dependencies = [ - "bytes", - "nom", -] - -[[package]] -name = "ldap3" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5cfbd3c59ca16d6671b002b8b3dd013cd825d9c77a1664a3135194d3270511e" -dependencies = [ - "async-trait", - "bytes", - "futures", - "futures-util", - "lazy_static", - "lber", - "log", - "native-tls", - "nom", - "percent-encoding", - "thiserror", - "tokio", - "tokio-native-tls", - "tokio-stream", - "tokio-util", - "url", -] - -[[package]] -name = "lettre" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bd09637ae3ec7bd605b8e135e757980b3968430ff2b1a4a94fb7769e50166d" -dependencies = [ - "base64 0.21.0", - "email-encoding", - "email_address", - "fastrand", - "futures-util", - "hostname", - "httpdate", - "idna", - "mime", - "native-tls", - "nom", - "once_cell", - "quoted_printable", - "socket2", - "tokio", -] - -[[package]] -name = "libc" -version = "0.2.144" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" - -[[package]] -name = "libgit2-sys" -version = "0.14.2+1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" -dependencies = [ - "cc", - "libc", - "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -] - -[[package]] -name = "libssh2-sys" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0186af0d8f171ae6b9c4c90ec51898bad5d08a2d5e470903a50d9ad8959cbee" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" - -[[package]] -name = "lock_api" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] -name = "md-5" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "memchr" -version = "2.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" -dependencies = [ - "adler", - "autocfg", -] - -[[package]] -name = "mio" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.45.0", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nb-connect" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" -dependencies = [ - "libc", - "socket2", -] - -[[package]] -name = "nix" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "nom" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "normpath" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a9da8c9922c35a1033d76f7272dfc2e7ee20392083d75aeea6ced23c6266578" -dependencies = [ - "winapi", -] - -[[package]] -name = "num" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" -dependencies = [ - "num-bigint 0.2.6", - "num-complex 0.2.4", - "num-integer", - "num-iter", - "num-rational 0.2.4", - "num-traits", -] - -[[package]] -name = "num" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" -dependencies = [ - "num-bigint 0.3.2", - "num-complex 0.3.1", - "num-integer", - "num-iter", - "num-rational 0.3.2", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e0d047c1062aa51e256408c560894e5251f08925980e53cf1aa5bd00eec6512" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", - "serde", -] - -[[package]] -name = "num-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg", - "num-bigint 0.2.6", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-bigint 0.3.2", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" - -[[package]] -name = "octocrab" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496442a5ec5ad38376a0c49bc0f31ba55dbda5276cf12757498c378c3bc2ea1c" -dependencies = [ - "arc-swap", - "async-trait", - "base64 0.21.0", - "bytes", - "cfg-if 1.0.0", - "chrono", - "either", - "jsonwebtoken", - "once_cell", - "reqwest", - "secrecy", - "serde", - "serde_json", - "serde_path_to_error", - "snafu", - "tracing", - "url", -] - -[[package]] -name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "onig" -version = "4.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8518fcb2b1b8c2f45f0ad499df4fda6087fc3475ca69a185c173b8315d2fb383" -dependencies = [ - "bitflags", - "lazy_static", - "libc", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388410bf5fa341f10e58e6db3975f4bea1ac30247dd79d37a9e5ced3cb4cc3b0" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl" -version = "0.10.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549430950c79ae24e6d02e0b7404534ecf311d94cc9f861e9e4020187d13d885" -dependencies = [ - "bitflags", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-sys", -] - -[[package]] -name = "openssl-probe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" - -[[package]] -name = "openssl-src" -version = "111.15.0+1.1.1k" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a5f6ae2ac04393b217ea9f700cd04fa9bf3d93fae2872069f3d15d908af70a" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" -dependencies = [ - "autocfg", - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.0", -] - -[[package]] -name = "origen" -version = "2.0.0-dev.5" -dependencies = [ - "built", - "cargo-expand", - "cfg-if 1.0.0", - "chrono", - "dialoguer", - "dirs 2.0.2", - "enum-utils", - "eval", - "futures", - "git2", - "indexmap", - "lazy_static", - "md-5", - "normpath", - "num 0.3.1", - "num-bigint 0.4.0", - "num-traits", - "octocrab", - "openssl", - "origen-core-support", - "origen_metal", - "path-clean", - "path-slash", - "pathdiff 0.1.0", - "phf", - "pyo3", - "regex", - "reqwest", - "semver 1.0.4", - "serde", - "serde-pickle", - "serde_json", - "shellexpand", - "strum", - "strum_macros", - "tempfile", - "tera", - "termcolor", - "time 0.1.44", - "tokio", - "toml", - "wait-timeout", - "walkdir", - "whoami 0.8.2", -] - -[[package]] -name = "origen-core-support" -version = "0.1.0-dev.1" -dependencies = [ - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "origen_metal" -version = "0.5.0" -dependencies = [ - "aes-gcm", - "built", - "cfg-if 1.0.0", - "chrono", - "config", - "dirs 2.0.2", - "enum-display-derive", - "enum-utils", - "git2", - "glob", - "indexmap", - "keyring", - "lazy_static", - "ldap3", - "lettre", - "num-bigint 0.4.0", - "num-traits", - "octocrab", - "pest", - "pest_derive", - "pyo3", - "rand 0.8.4", - "regex", - "reqwest", - "rpassword", - "semver 1.0.4", - "serde", - "serde-pickle", - "serde_json", - "shellexpand", - "tempfile", - "termcolor", - "time 0.1.44", - "toml", - "wait-timeout", - "whoami 1.2.1", -] - -[[package]] -name = "origen_pyapi" -version = "2.0.0-dev.5" -dependencies = [ - "built", - "curl-sys", - "indexmap", - "itertools", - "libz-sys", - "num 0.2.1", - "num-bigint 0.4.0", - "num-traits", - "openssl", - "origen", - "origen_metal", - "paste", - "pyapi_metal", - "pyo3", - "regex", -] - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[package]] -name = "parking_lot" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.3", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core 0.9.7", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall 0.2.10", - "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "redox_syscall 0.2.10", - "smallvec", - "windows-sys 0.45.0", -] - -[[package]] -name = "parse-zoneinfo" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c705f256449c60da65e11ff6626e0c16a0a0b96aaa348de61376b249bc340f41" -dependencies = [ - "regex", -] - -[[package]] -name = "paste" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc" - -[[package]] -name = "path-clean" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" - -[[package]] -name = "path-slash" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cacbb3c4ff353b534a67fb8d7524d00229da4cb1dc8c79f4db96e375ab5b619" - -[[package]] -name = "pathdiff" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3bf70094d203e07844da868b634207e71bfab254fe713171fae9a6e751ccf31" - -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.0", -] - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - -[[package]] -name = "phf" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" -dependencies = [ - "phf_macros", - "phf_shared", - "proc-macro-hack", -] - -[[package]] -name = "phf_generator" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" -dependencies = [ - "phf_shared", - "rand 0.7.3", -] - -[[package]] -name = "phf_macros" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro-hack", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "phf_shared" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" - -[[package]] -name = "plist" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f2a9f075f6394100e7c105ed1af73fb1859d6fd14e49d4290d578120beb167f" -dependencies = [ - "base64 0.10.1", - "byteorder", - "humantime", - "line-wrap", - "serde", - "xml-rs", -] - -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "polyval" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug 0.3.0", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" - -[[package]] -name = "prettyprint" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32f02328f651d5283173c7a9b2ef354b079fa535706547dde16d61ae23ecded" -dependencies = [ - "ansi_colours", - "ansi_term", - "atty", - "clap", - "console 0.7.7", - "content_inspector", - "derive_builder", - "directories", - "encoding", - "error-chain", - "lazy_static", - "shell-words", - "syntect", -] - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" -dependencies = [ - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "version_check", -] - -[[package]] -name = "proc-macro-hack" -version = "0.5.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" - -[[package]] -name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pyapi_metal" -version = "0.4.0" -dependencies = [ - "built", - "curl-sys", - "indexmap", - "libz-sys", - "num-bigint 0.4.0", - "openssl", - "origen_metal", - "pyo3", -] - -[[package]] -name = "pyo3" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6302e85060011447471887705bb7838f14aba43fcb06957d823739a496b3dc" -dependencies = [ - "cfg-if 1.0.0", - "indoc", - "inventory", - "libc", - "num-bigint 0.4.0", - "parking_lot 0.11.1", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b65b546c35d8a3b1b2f0ddbac7c6a569d759f357f2b9df884f5d6b719152c8" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c275a07127c1aca33031a563e384ffdd485aee34ef131116fcd58e3430d1742b" -dependencies = [ - "libc", - "pyo3-build-config", -] - -[[package]] -name = "pyo3-macros" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284fc4485bfbcc9850a6d661d627783f18d19c2ab55880b021671c4ba83e90f7" -dependencies = [ - "proc-macro2 1.0.58", - "pyo3-macros-backend", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53bda0f58f73f5c5429693c96ed57f7abdb38fdfc28ae06da4101a257adb7faf" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" -dependencies = [ - "proc-macro2 1.0.58", -] - -[[package]] -name = "quoted_printable" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", - "rand_pcg", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom 0.2.3", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", -] - -[[package]] -name = "rand_pcg" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0737333e7a9502c789a36d7c7fa6092a49895d4faa31ca5df163857ded2e9d" -dependencies = [ - "getrandom 0.1.16", - "redox_syscall 0.1.57", - "rust-argon2", -] - -[[package]] -name = "redox_users" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" -dependencies = [ - "getrandom 0.2.3", - "redox_syscall 0.2.10", -] - -[[package]] -name = "regex" -version = "1.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a26af418b574bd56588335b3a3659a65725d4e636eb1016c2f9e3b38c7cc759" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "reqwest" -version = "0.11.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" -dependencies = [ - "base64 0.21.0", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ron" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678" -dependencies = [ - "base64 0.13.0", - "bitflags", - "serde", -] - -[[package]] -name = "rpassword" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "rust-argon2" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b18820d944b33caa75a71378964ac46f58517c92b6ae5f762636247c09e78fb" -dependencies = [ - "base64 0.13.0", - "blake2b_simd", - "constant_time_eq", - "crossbeam-utils", -] - -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if 1.0.0", - "ordered-multimap", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dead70b0b5e03e9c814bcb6b01e03e68f7c57a80aa48c72ec92152ab3e818d49" - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "safemem" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "zeroize", -] - -[[package]] -name = "secret-service" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2400fb1bf2a87b303ada204946294f932ade4929477e9e2bf66d7b49a66656ec" -dependencies = [ - "aes", - "block-modes", - "hkdf", - "lazy_static", - "num 0.3.1", - "rand 0.8.4", - "serde", - "sha2", - "zbus", - "zbus_macros", - "zvariant", - "zvariant_derive", -] - -[[package]] -name = "security-framework" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" -dependencies = [ - "serde", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - -[[package]] -name = "serde" -version = "1.0.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03b9878abf6d14e6779d3f24f07b2cfa90352cfec4acc5aab8f1ac7f146fae8" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-pickle" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a3410b41f23f051f4176d1e08765ae2d10ea8e8f596bf21ca53c7a084a4566" -dependencies = [ - "byteorder", - "iter-read", - "num-bigint 0.3.2", - "num-traits", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.127" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a024926d3432516606328597e0f224a51355a493b49fdd67e9209187cbe55ecc" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "serde_derive_internals" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "serde_json" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "336b10da19a12ad094b59d870ebde26a45402e5b470add4b5fd03c5048a32127" -dependencies = [ - "itoa 0.4.7", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f6109f0506e20f7e0f910e51a0079acf41da8e0694e6442527c4ddf5a2b158" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa 1.0.6", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "shell-words" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39acde55a154c4cd3ae048ac78cc21c25f3a0145e44111b523279113dce0d94a" - -[[package]] -name = "shellexpand" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7e79eddc7b411f9beeaaf2d421de7e7cb3b1ab9eaf1b79704c0e4130cba6b5" -dependencies = [ - "dirs 2.0.2", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" -dependencies = [ - "libc", -] - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint 0.4.0", - "num-traits", - "thiserror", - "time 0.3.21", -] - -[[package]] -name = "siphasher" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1" - -[[package]] -name = "slab" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" - -[[package]] -name = "slug" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3bc762e6a4b6c6fcaade73e77f9ebc6991b676f88bb2358bddb56560f073373" -dependencies = [ - "deunicode", -] - -[[package]] -name = "smallvec" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" - -[[package]] -name = "snafu" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0656e7e3ffb70f6c39b3c2a86332bb74aa3c679da781642590f3c1118c5045" -dependencies = [ - "backtrace", - "doc-comment", - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475b3bbe5245c26f2d8a6f62d67c1f30eb9fffeccee721c45d162c3ebbdf81b2" -dependencies = [ - "heck 0.4.1", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "socket2" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4f380125926a99e52bc279241539c018323fab05ad6368b56f93d9369ff550" - -[[package]] -name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b041cdcb67226aca307e6e7be44c8806423d83e018bd662360a93dabce4d71" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] - -[[package]] -name = "structopt-derive" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7813934aecf5f51a54775e00068c237de98489463968231a51746bbbc03f9c10" -dependencies = [ - "heck 0.3.3", - "proc-macro-error", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "strum" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7318c509b5ba57f18533982607f24070a55d353e90d4cae30c467cdb2ad5ac5c" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.20.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee8bc6b87a5112aeeab1f4a9f7ab634fe6cbefc4850006df31267f4cfb9e3149" -dependencies = [ - "heck 0.3.3", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "0.15.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", -] - -[[package]] -name = "syn" -version = "1.0.74" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1873d832550d4588c3dbc20f01361ab00bfe741048f71e3fecf145a7cc18b29c" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "unicode-xid 0.2.2", -] - -[[package]] -name = "syn" -version = "2.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "unicode-ident", -] - -[[package]] -name = "syn-select" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3918c65ff56396f0fb70664637e183410d273d93721bca514221ae3566dca0e" -dependencies = [ - "syn 1.0.74", -] - -[[package]] -name = "syntect" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e80b8831c5a543192ffc3727f01cf0e57579c6ac15558e3048bfb5708892167b" -dependencies = [ - "bincode", - "bitflags", - "flate2", - "fnv", - "lazy_static", - "lazycell", - "onig", - "plist", - "regex-syntax", - "serde", - "serde_derive", - "serde_json", - "walkdir", - "yaml-rust", -] - -[[package]] -name = "target-lexicon" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" - -[[package]] -name = "tempfile" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "rand 0.8.4", - "redox_syscall 0.2.10", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "tera" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf95b0d8a46da5fe3ea119394a6c7f1e745f9de359081641c99946e2bf55d4f2" -dependencies = [ - "chrono", - "chrono-tz", - "globwalk", - "humansize", - "lazy_static", - "percent-encoding", - "pest", - "pest_derive", - "rand 0.8.4", - "regex", - "serde", - "serde_json", - "slug", - "unic-segment", -] - -[[package]] -name = "termcolor" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "terminal_size" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "termios" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411c5bf740737c7918b8b1fe232dca4dc9f8e754b8ad5e20966814001ed0ac6b" -dependencies = [ - "libc", -] - -[[package]] -name = "textwrap" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "thiserror" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "thread_local" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" -dependencies = [ - "once_cell", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" -dependencies = [ - "itoa 1.0.6", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "848a1e1181b9f6753b5e96a092749e29b11d19ede67dfbbd6c7dc7e0f49b5338" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa32867d44e6f2ce3385e89dceb990188b8bb0fb25b0cf576647a6f98ac5105" -dependencies = [ - "autocfg", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot 0.12.1", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" -dependencies = [ - "serde", -] - -[[package]] -name = "toolchain_find" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e458af37ead6107144c2e3bb892f605ddfad20251f12143cda8b9c9072b1ca45" -dependencies = [ - "dirs 1.0.5", - "lazy_static", - "regex", - "semver 0.9.0", - "walkdir", -] - -[[package]] -name = "tower-service" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" -dependencies = [ - "cfg-if 1.0.0", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 2.0.16", -] - -[[package]] -name = "tracing-core" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "typenum" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "unic-char-property" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" -dependencies = [ - "unic-char-range", -] - -[[package]] -name = "unic-char-range" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" - -[[package]] -name = "unic-common" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" - -[[package]] -name = "unic-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ed5d26be57f84f176157270c112ef57b86debac9cd21daaabbe56db0f88f23" -dependencies = [ - "unic-ucd-segment", -] - -[[package]] -name = "unic-ucd-segment" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2079c122a62205b421f499da10f3ee0f7697f012f55b675e002483c73ea34700" -dependencies = [ - "unic-char-property", - "unic-char-range", - "unic-ucd-version", -] - -[[package]] -name = "unic-ucd-version" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" -dependencies = [ - "unic-common", -] - -[[package]] -name = "unicode-bidi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" - -[[package]] -name = "unicode-ident" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - -[[package]] -name = "unicode-width" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9337591893a19b88d8d87f2cec1e73fad5cdfd10e5a6f349f498ad6ea2ffb1e3" - -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - -[[package]] -name = "unicode-xid" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" - -[[package]] -name = "unindent" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array 0.14.4", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - -[[package]] -name = "version_check" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b608ecc8f4198fe8680e2ed18eccab5f0cd4caaf3d83516fa5fb2e927fda2586" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "580aa3a91a63d23aac5b6b267e2d13cb4f363e31dce6c352fca4752ae12e479f" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16646b21c3add8e13fdb8f20172f8a28c3dbf62f45406bcff0233188226cfe0c" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171ebf0ed9e1458810dfcb31f2e766ad6b3a89dbda42d8901f2b268277e5f09c" -dependencies = [ - "quote 1.0.27", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2657dd393f03aa2a659c25c6ae18a13a4048cebd220e147933ea837efc589f" -dependencies = [ - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0c4a743a309662d45f4ede961d7afa4ba4131a59a639f29b0069c3798bbcc2" - -[[package]] -name = "web-sys" -version = "0.3.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01c70a82d842c9979078c772d4a1344685045f1a5628f677c2b2eab4dd7d2696" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - -[[package]] -name = "whoami" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18bb55566f6f3f8440914233cf63df1eb60b801b5007d376cc46212cb8a9287c" - -[[package]] -name = "whoami" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" -dependencies = [ - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.0", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" -dependencies = [ - "windows_aarch64_gnullvm 0.48.0", - "windows_aarch64_msvc 0.48.0", - "windows_i686_gnu 0.48.0", - "windows_i686_msvc 0.48.0", - "windows_x86_64_gnu 0.48.0", - "windows_x86_64_gnullvm 0.48.0", - "windows_x86_64_msvc 0.48.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "xml-rs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zbus" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" -dependencies = [ - "async-io", - "byteorder", - "derivative", - "enumflags2", - "fastrand", - "futures", - "nb-connect", - "nix", - "once_cell", - "polling", - "scoped-tls", - "serde", - "serde_repr", - "zbus_macros", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] - -[[package]] -name = "zeroize" -version = "1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20b578acffd8516a6c3f2a1bdefc1ec37e547bb4e0fb8b6b01a4cafc886b4442" - -[[package]] -name = "zvariant" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68c7b55f2074489b7e8e07d2d0a6ee6b4f233867a653c664d8020ba53692525" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2 1.0.58", - "quote 1.0.27", - "syn 1.0.74", -] diff --git a/rust/pyapi/Cargo.toml b/rust/pyapi/Cargo.toml index c161acc1..2b1fce66 100644 --- a/rust/pyapi/Cargo.toml +++ b/rust/pyapi/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "origen_pyapi" -version = "2.0.0-dev.5" +version = "2.0.0-dev7" authors = ["Origen-SDK"] edition = "2021" @@ -14,7 +14,7 @@ crate-type = ["cdylib"] [dependencies] origen = { path = "../origen" } -origen_metal = { path = "../origen_metal", features = ["python"] } +origen_metal = { path = "../origen_metal" } pyapi_metal = { path = "../pyapi_metal", package = "pyapi_metal" } num-bigint = "0.4.0" num-traits = "0.2.0" @@ -32,8 +32,8 @@ curl-sys = { version = "0.4.34", features = ["static-curl"] } openssl = { version = "0.10", features = ["vendored"] } [dependencies.pyo3] -version = "0.16.5" +version = "0.19.1" features = ["extension-module", "num-bigint", "multiple-pymethods", "auto-initialize"] [build-dependencies] -built = "0.5.1" \ No newline at end of file +built = "0.5.2" \ No newline at end of file diff --git a/rust/pyapi/src/application/_frontend.rs b/rust/pyapi/src/application/_frontend.rs index 88084fdb..05040d58 100644 --- a/rust/pyapi/src/application/_frontend.rs +++ b/rust/pyapi/src/application/_frontend.rs @@ -31,11 +31,11 @@ impl App { impl origen::core::frontend::App for App { fn check_production_status(&self) -> origen::Result { - let gil = Python::acquire_gil(); - let py = gil.python(); - let pyapp = get_pyapp(py)?; - let app = pyapp.borrow(py); - Ok(app.check_production_status()?) + Python::with_gil(|py| { + let pyapp = get_pyapp(py)?; + let app = pyapp.borrow(py); + Ok(app.check_production_status()?) + }) } fn publish(&self) -> origen::Result<()> { diff --git a/rust/pyapi/src/application/mod.rs b/rust/pyapi/src/application/mod.rs index 08b1a11c..c59cd783 100644 --- a/rust/pyapi/src/application/mod.rs +++ b/rust/pyapi/src/application/mod.rs @@ -2,16 +2,17 @@ pub mod _frontend; use crate::runtime_error; use crate::utility::results::{BuildResult}; -use origen::utility::version::Version as OVersion; +use origen_metal::utils::version::Version as OVersion; use pyapi_metal::prelude::*; use pyapi_metal::utils::revision_control::status::Status; use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; use std::path::{Path, PathBuf}; -#[pymodule] -pub fn application(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "application")?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } @@ -22,7 +23,8 @@ pub struct PyApplication {} #[pymethods] impl PyApplication { #[new] - fn new() -> Self { + #[pyo3(signature=(**_kwargs))] + fn new(_kwargs: Option<&PyDict>) -> Self { PyApplication {} } @@ -31,7 +33,7 @@ impl PyApplication { let v = origen::app().unwrap().version()?.to_string(); Ok(format!( "{}", - origen::utility::version::Version::new_pep440(&v)?.to_string() + OVersion::new_pep440(&v)?.to_string() )) } @@ -40,7 +42,7 @@ impl PyApplication { Ok(r.passed()) } - #[args(kwargs = "**")] + #[pyo3(signature=(**kwargs))] fn __publish__(&self, kwargs: Option<&PyDict>) -> PyResult { let mut dry_run = false; let mut rn: Option<&str> = None; @@ -82,6 +84,7 @@ impl PyApplication { Ok(Status::from_origen(origen::app().unwrap().rc_status()?)) } + #[pyo3(signature=(pathspecs, msg, dry_run))] fn __rc_checkin__( &self, pathspecs: Option>, @@ -106,14 +109,14 @@ impl PyApplication { )?)) } - #[args(_args = "*")] + #[pyo3(signature=(*_args))] fn __build_package__(&self, _args: &PyTuple) -> PyResult { Ok(BuildResult { build_result: Some(origen::app().unwrap().build_package()?), }) } - #[args(_args = "*")] + #[pyo3(signature=(*_args))] fn __run_publish_checks__(&self, _args: &PyTuple) -> PyResult { let r = origen::app().unwrap().run_publish_checks(false)?; Ok(r.passed()) @@ -234,18 +237,18 @@ pub fn get_pyapp<'py>(py: Python<'py>) -> PyResult> { /// Note: this could have several methods overridden. Just check that the aforementioned /// class is one of the object's ancestors pub fn is_base_app(query: &PyAny) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let locals = PyDict::new(py); - locals.set_item("origen", py.import("origen")?.to_object(py))?; - locals.set_item("builtins", py.import("builtins")?.to_object(py))?; - locals.set_item("query", query.to_object(py))?; - let result = py.eval( - "builtins.isinstance(query, origen.application.Base)", - Some(locals), - None, - )?; - Ok(result.extract::()?) + Python::with_gil(|py| { + let locals = PyDict::new(py); + locals.set_item("origen", py.import("origen")?.to_object(py))?; + locals.set_item("builtins", py.import("builtins")?.to_object(py))?; + locals.set_item("query", query.to_object(py))?; + let result = py.eval( + "builtins.isinstance(query, origen.application.Base)", + Some(locals), + None, + )?; + Ok(result.extract::()?) + }) } /// Return the name of the given app. Equivalent to `app.name` in Python diff --git a/rust/pyapi/src/current_command.rs b/rust/pyapi/src/current_command.rs new file mode 100644 index 00000000..4636ce3f --- /dev/null +++ b/rust/pyapi/src/current_command.rs @@ -0,0 +1,93 @@ +use pyo3::prelude::*; +use pyo3::types::{PyDict, PyList}; +use super::extensions::Extensions; + +pub const ATTR_NAME: &str = "_current_command_"; + +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "current_command")?; + subm.add_wrapped(wrap_pyfunction!(get_command))?; + subm.add_wrapped(wrap_pyfunction!(set_command))?; + // subm.add_wrapped(wrap_pyfunction!(clear_command))?; FEATURE CLI Clearing Current Command + subm.add_class::()?; + m.add_submodule(subm)?; + Ok(()) +} + +#[pyfunction] +pub fn get_command(py: Python) -> PyResult> { + _origen!(py).getattr(ATTR_NAME)?.extract::>() +} + +#[pyfunction] +fn set_command( + py: Python, + base_cmd: String, + subcmds: Vec, + args: Py, + ext_args: Py, + arg_indices: Py, + ext_arg_indices: Py, + exts: &PyList +) -> PyResult<()> { + let cmd = CurrentCommand { + base: base_cmd, + subcmds: subcmds, + args: args, + arg_indices: arg_indices, + exts: Py::new(py, Extensions::new(py, exts, ext_args, ext_arg_indices)?)?, + }; + _origen!(py).setattr(ATTR_NAME, Py::new(py, cmd)?) +} + +// FEATURE CLI Clearing Current Command +// #[pyfunction] +// fn clear_command() -> PyResult<()> { +// todo!() +// } + +#[pyclass] +pub struct CurrentCommand { + base: String, + subcmds: Vec, + args: Py, + arg_indices: Py, + exts: Py, +} + +#[pymethods] +impl CurrentCommand { + #[getter] + pub fn cmd(&self) -> PyResult { + Ok(if self.subcmds.is_empty() { + self.base.to_string() + } else { + format!("{}.{}", self.base, self.subcmds.join(".")) + }) + } + + #[getter] + pub fn base_cmd(&self) -> PyResult<&str> { + Ok(&self.base) + } + + #[getter] + pub fn subcmds(&self) -> PyResult> { + Ok(self.subcmds.clone()) + } + + #[getter] + pub fn exts(&self) -> PyResult<&Py> { + Ok(&self.exts) + } + + #[getter] + pub fn args<'py>(&'py self, py: Python<'py>) -> PyResult<&'py PyDict> { + Ok(self.args.as_ref(py)) + } + + #[getter] + pub fn arg_indices<'py>(&'py self, py: Python<'py>) -> PyResult<&'py PyDict> { + Ok(self.arg_indices.as_ref(py)) + } +} \ No newline at end of file diff --git a/rust/pyapi/src/dut.rs b/rust/pyapi/src/dut.rs index 4184344f..a00eb5ed 100644 --- a/rust/pyapi/src/dut.rs +++ b/rust/pyapi/src/dut.rs @@ -4,12 +4,8 @@ use origen::Error; use pyo3::prelude::*; #[allow(unused_imports)] use pyo3::types::{PyAny, PyBytes, PyDict, PyIterator, PyList, PySlice, PyTuple}; -use pyo3::wrap_pymodule; - -use crate::pins::__PYO3_PYMODULE_DEF_PINS; -use crate::registers::__PYO3_PYMODULE_DEF_REGISTERS; -use crate::timesets::__PYO3_PYMODULE_DEF_TIMESETS; +//TODO is this needed/used? #[allow(dead_code)] pub fn get_pydut(py: Python) -> PyResult<&PyAny> { let locals = PyDict::new(py); @@ -17,14 +13,13 @@ pub fn get_pydut(py: Python) -> PyResult<&PyAny> { Ok(py.eval("origen.dut", Some(locals), None)?) } -/// Implements the module _origen.dut in Python which exposes all -/// DUT-related APIs -#[pymodule] -pub fn dut(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_wrapped(wrap_pymodule!(pins))?; - m.add_wrapped(wrap_pymodule!(registers))?; - m.add_wrapped(wrap_pymodule!(timesets))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "dut")?; + subm.add_class::()?; + crate::pins::define(py, subm)?; + crate::registers::define(py, subm)?; + crate::timesets::define(py, subm)?; + m.add_submodule(subm)?; Ok(()) } @@ -46,6 +41,7 @@ impl PyDUT { } /// Creates a new model at the given path + #[pyo3(signature=(parent_id, name, offset=None))] fn create_model( &self, parent_id: Option, @@ -63,17 +59,12 @@ impl PyDUT { /// push_metadata(self, item) /// Pushes metadata object onto the current DUT - pub fn push_metadata(&mut self, item: &PyAny) -> usize { - let gil = Python::acquire_gil(); - let py = gil.python(); - + pub fn push_metadata(&mut self, py: Python, item: &PyAny) -> usize { self.metadata.push(item.to_object(py)); self.metadata.len() - 1 } - pub fn override_metadata_at(&mut self, idx: usize, item: &PyAny) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); + pub fn override_metadata_at(&mut self, py: Python, idx: usize, item: &PyAny) -> PyResult<()> { if self.metadata.len() > idx { self.metadata[idx] = item.to_object(py); Ok(()) @@ -100,11 +91,11 @@ impl PyDUT { impl PyDUT { pub fn ensure_pins(model_path: &str) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let locals = PyDict::new(py); - locals.set_item("origen", py.import("origen")?.to_object(py))?; - py.eval(&format!("origen.{}.pins", model_path), Some(locals), None)?; - Ok(()) + Python::with_gil(|py| { + let locals = PyDict::new(py); + locals.set_item("origen", py.import("origen")?.to_object(py))?; + py.eval(&format!("origen.{}.pins", model_path), Some(locals), None)?; + Ok(()) + }) } } diff --git a/rust/pyapi/src/extensions.rs b/rust/pyapi/src/extensions.rs new file mode 100644 index 00000000..fa18ff75 --- /dev/null +++ b/rust/pyapi/src/extensions.rs @@ -0,0 +1,188 @@ +use pyo3::prelude::*; +use pyo3::types::{PyAny, PyDict, PyList}; +use origen_metal::indexmap::IndexMap; +use crate::current_command::get_command; + +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "extensions")?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; + Ok(()) +} + +#[pyclass] +pub struct Extension { + name: String, + args: Py, + arg_indices: Py, + source: String, + ext_mod: Option>, +} + +#[pymethods] +impl Extension { + #[getter] + pub fn name(&self) -> PyResult<&str> { + Ok(&self.name) + } + + #[getter] + pub fn args<'py>(&'py self, py: Python<'py>) -> PyResult<&'py PyDict> { + Ok(self.args.as_ref(py)) + } + + #[getter] + pub fn arg_indices<'py>(&'py self, py: Python<'py>) -> PyResult<&'py PyDict> { + Ok(self.arg_indices.as_ref(py)) + } + + #[getter] + pub fn source(&self, py: Python) -> PyResult { + Ok(pyapi_metal::pypath!(py, &self.source)) + } + + #[getter] + pub fn r#mod(&self) -> PyResult>> { + Ok(self.ext_mod.as_ref()) + } + + #[getter] + pub fn module(&self) -> PyResult>> { + Ok(self.ext_mod.as_ref()) + } +} + +#[pyclass] +pub struct Extensions { + exts: IndexMap> +} + +#[pymethods] +impl Extensions { + fn get(&self, ext_name: &str) -> PyResult>> { + Ok(match self.exts.get(ext_name) { + Some(ext) => Some(ext), + None => None, + }) + } + + fn keys(&self) -> PyResult> { + Ok(self.exts.keys().map(|k| k.to_string()).collect()) + } + + fn values(&self) -> PyResult>> { + let mut retn: Vec<&Py> = vec![]; + for (_, ext) in self.exts.iter() { + retn.push(ext); + } + Ok(retn) + } + + fn items(&self) -> PyResult)>> { + let mut retn: Vec<(String, &Py)> = vec![]; + for (n, ext) in self.exts.iter() { + retn.push((n.to_string(), ext)); + } + Ok(retn) + } + + fn __getitem__(&self, py: Python, key: &str) -> PyResult<&Py> { + if let Some(s) = self.get(key)? { + Ok(s) + } else { + Err(pyo3::exceptions::PyKeyError::new_err(format!( + "No extension '{}' available for command '{}'", + key, + get_command(py)?.cmd()? + ))) + } + } + + fn __len__(&self) -> PyResult { + Ok(self.exts.len()) + } + + fn __iter__(slf: PyRefMut) -> PyResult { + Ok(ExtensionsIter { + keys: slf.keys().unwrap(), + i: 0, + }) + } +} + +#[pyclass] +pub struct ExtensionsIter { + pub keys: Vec, + pub i: usize, +} + +#[pymethods] +impl ExtensionsIter { + fn __iter__(slf: PyRefMut) -> PyResult> { + Ok(slf.into()) + } + + fn __next__(mut slf: PyRefMut) -> PyResult> { + if slf.i >= slf.keys.len() { + return Ok(None); + } + let name = slf.keys[slf.i].clone(); + slf.i += 1; + Ok(Some(name)) + } +} + +impl Extensions { + pub fn new<'py>(py: Python<'py>, exts: &PyList, ext_args: Py, ext_arg_indices: Py) -> PyResult { + let mut slf = Self { + exts: IndexMap::new(), + }; + + for ext in exts.iter() { + let ext_cfg = ext.extract::<&PyDict>()?; + let source = PyAny::get_item(ext_cfg, "source")?.extract::()?; + let ext_name; + let ext_path; + if source == "app" { + ext_name = "app".to_string(); + ext_path = "app".to_string(); + } else { + ext_name = PyAny::get_item(ext_cfg, "name")?.extract::()?; + ext_path = format!("{}.{}", source, ext_name); + } + let src_ext_args = PyAny::get_item(ext_args.as_ref(py), &source)?.extract::<&PyDict>()?; + let src_ext_args_indices = PyAny::get_item(ext_arg_indices.as_ref(py), &source)?.extract::<&PyDict>()?; + + let py_ext = Extension { + args: { + if source == "app" { + src_ext_args.into() + } else { + PyAny::get_item(src_ext_args, &ext_name)?.extract::>()? + } + }, + arg_indices: { + if source == "app" { + src_ext_args_indices.into() + } else { + PyAny::get_item(src_ext_args_indices, &ext_name)?.extract::>()? + } + }, + name: ext_name, + source: ext_path.clone(), + ext_mod: { + let m = PyAny::get_item(ext_cfg, "mod")?; + if m.is_none() { + None + } else { + Some(m.extract::<&PyModule>()?.into_py(py)) + } + } + }; + slf.exts.insert(ext_path, Py::new(py, py_ext)?); + } + + Ok(slf) + } +} \ No newline at end of file diff --git a/rust/pyapi/src/file_handler.rs b/rust/pyapi/src/file_handler.rs index edb0447a..436b0541 100644 --- a/rust/pyapi/src/file_handler.rs +++ b/rust/pyapi/src/file_handler.rs @@ -2,7 +2,7 @@ use origen::core::file_handler::FileHandler as CoreFileHandler; use pyo3::prelude::*; use pyo3::wrap_pyfunction; -pub fn define(m: &PyModule) -> PyResult<()> { +pub fn define(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(file_handler))?; Ok(()) } diff --git a/rust/pyapi/src/infrastructure/mod.rs b/rust/pyapi/src/infrastructure/mod.rs new file mode 100644 index 00000000..5ca25963 --- /dev/null +++ b/rust/pyapi/src/infrastructure/mod.rs @@ -0,0 +1,10 @@ +pub mod pyproject; + +use pyo3::prelude::*; + +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "infrastructure")?; + pyproject::define(py, subm)?; + m.add_submodule(subm)?; + Ok(()) +} diff --git a/rust/pyapi/src/infrastructure/pyproject.rs b/rust/pyapi/src/infrastructure/pyproject.rs new file mode 100644 index 00000000..876bdd34 --- /dev/null +++ b/rust/pyapi/src/infrastructure/pyproject.rs @@ -0,0 +1,53 @@ +use origen::STATUS; +use pyo3::prelude::*; +use pyo3::types::PyDict; +use origen::core::status::DependencySrc; + +pub fn populate_status(py: Python, status: &PyDict) -> PyResult<()> { + if let Some(d) = STATUS.dependency_src().as_ref() { + if let Some(pyproject) = d.src_file() { + status.set_item("pyproject", pyapi_metal::pypath!(py, pyproject.display()))?; + } else { + status.set_item("pyproject", py.None())?; + } + status.set_item("invocation", PyProjectSrc::from(d).to_py(py)?)?; + } else { + status.set_item("pyproject", py.None())?; + status.set_item("invocation", py.None())?; + } + Ok(()) +} + +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "pyproject")?; + subm.add_class::()?; + m.add_submodule(subm)?; + Ok(()) +} + +#[pyclass] +pub enum PyProjectSrc { + App, + Workspace, + UserGlobal, + Global, + NoneFound, +} + +impl PyProjectSrc { + pub fn to_py(self, py: Python) -> PyResult> { + Py::new(py, self) + } +} + +impl From<&DependencySrc> for PyProjectSrc { + fn from(src: &DependencySrc) -> Self { + match src { + DependencySrc::App(_) => Self::App, + DependencySrc::Workspace(_) => Self::Workspace, + DependencySrc::UserGlobal(_) => Self::UserGlobal, + DependencySrc::Global(_) => Self::Global, + DependencySrc::NoneFound => Self::NoneFound, + } + } +} \ No newline at end of file diff --git a/rust/pyapi/src/lib.rs b/rust/pyapi/src/lib.rs index 3c99706e..29a765cb 100644 --- a/rust/pyapi/src/lib.rs +++ b/rust/pyapi/src/lib.rs @@ -6,8 +6,14 @@ extern crate origen_metal; use pyapi_metal; +#[macro_use] +mod macros; + +mod current_command; mod dut; +mod extensions; mod file_handler; +mod infrastructure; mod meta; mod model; #[macro_use] @@ -22,39 +28,28 @@ mod application; mod producer; mod prog_gen; mod standard_sub_blocks; -mod tester; +pub mod tester; mod tester_apis; #[macro_use] mod utility; +mod plugins; use crate::registers::bit_collection::BitCollection; use num_bigint::BigUint; use om::lazy_static::lazy_static; -use origen::{Dut, Error, Operation, Result, Value, FLOW, ORIGEN_CONFIG, STATUS, TEST}; +use origen::{Dut, Error, Operation, Result, Value, FLOW, ORIGEN_CONFIG, STATUS, TEST, clean_target}; use origen_metal as om; -use pyapi_metal::pypath; +use pyapi_metal::{runtime_error, pypath}; use pyo3::conversion::AsPyPointer; use pyo3::prelude::*; use pyo3::types::{PyAny, PyBytes, PyDict}; -use pyo3::{wrap_pyfunction, wrap_pymodule}; +use pyo3::wrap_pyfunction; use std::path::{Path, PathBuf}; use std::str::FromStr; use std::sync::MutexGuard; use utility::location::Location; use paste::paste; - -use crate::dut::__PYO3_PYMODULE_DEF_DUT; -use crate::tester::__PYO3_PYMODULE_DEF_TESTER; -use crate::tester_apis::__PYO3_PYMODULE_DEF_TESTER_APIS; -use crate::application::__PYO3_PYMODULE_DEF_APPLICATION; -use crate::prog_gen::interface::__PYO3_PYMODULE_DEF_INTERFACE; -use crate::producer::__PYO3_PYMODULE_DEF_PRODUCER; -use crate::services::__PYO3_PYMODULE_DEF_SERVICES; -use crate::utility::__PYO3_PYMODULE_DEF_UTILITY; -use crate::standard_sub_blocks::__PYO3_PYMODULE_DEF_STANDARD_SUB_BLOCKS; -use crate::prog_gen::__PYO3_PYMODULE_DEF_PROG_GEN; - -use pyapi_metal::__PYO3_PYMODULE_DEF__ORIGEN_METAL; +use origen::core::status::DependencySrc; pub mod built_info { // The file has been placed there by the build script. @@ -63,12 +58,14 @@ pub mod built_info { #[pymodule] /// This is the top-level _origen module which can be imported by Python -fn _origen(_py: Python, m: &PyModule) -> PyResult<()> { +fn _origen(py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(initialize))?; m.add_wrapped(wrap_pyfunction!(status))?; m.add_wrapped(wrap_pyfunction!(version))?; m.add_wrapped(wrap_pyfunction!(config))?; + m.add_wrapped(wrap_pyfunction!(config_metadata))?; m.add_wrapped(wrap_pyfunction!(app_config))?; + m.add_wrapped(wrap_pyfunction!(is_app_present))?; m.add_wrapped(wrap_pyfunction!(clean_mode))?; m.add_wrapped(wrap_pyfunction!(target_file))?; m.add_wrapped(wrap_pyfunction!(test))?; @@ -89,22 +86,26 @@ fn _origen(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(set_operation))?; m.add_wrapped(wrap_pyfunction!(boot_users))?; - m.add_wrapped(wrap_pymodule!(dut))?; - m.add_wrapped(wrap_pymodule!(tester))?; - m.add_wrapped(wrap_pymodule!(application))?; - m.add_wrapped(wrap_pymodule!(interface))?; - m.add_wrapped(wrap_pymodule!(producer))?; - m.add_wrapped(wrap_pymodule!(services))?; - m.add_wrapped(wrap_pymodule!(utility))?; - m.add_wrapped(wrap_pymodule!(tester_apis))?; - m.add_wrapped(wrap_pymodule!(standard_sub_blocks))?; - m.add_wrapped(wrap_pymodule!(prog_gen))?; - - file_handler::define(m)?; + dut::define(py, m)?; + tester::define(py, m)?; + application::define(py, m)?; + prog_gen::interface::define(py, m)?; + producer::define(py, m)?; + services::define(py, m)?; + utility::define(py, m)?; + tester_apis::define(py, m)?; + standard_sub_blocks::define(py, m)?; + prog_gen::define(py, m)?; + file_handler::define(py, m)?; + plugins::define(py, m)?; + extensions::define(py, m)?; + current_command::define(py, m)?; + infrastructure::define(py, m)?; // Compile the _origen_metal library along with this one // to allow re-use from that library - m.add_wrapped(wrap_pymodule!(_origen_metal))?; + pyapi_metal::define(py, m)?; + m.setattr(current_command::ATTR_NAME, py.None())?; Ok(()) } @@ -342,32 +343,42 @@ fn exit_pass() -> PyResult<()> { } fn origen_mod_path() -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let locals = PyDict::new(py); - locals.set_item("importlib", py.import("importlib")?)?; - let p = PathBuf::from( - py.eval( - "importlib.util.find_spec('_origen').origin", - None, - Some(&locals), - )? - .extract::()?, - ); - Ok(p.parent().unwrap().to_path_buf()) + Python::with_gil(|py| { + let locals = PyDict::new(py); + locals.set_item("importlib", py.import("importlib")?)?; + let p = PathBuf::from( + py.eval( + "importlib.util.find_spec('_origen').origin", + None, + Some(&locals), + )? + .extract::()?, + ); + Ok(p.parent().unwrap().to_path_buf()) + }) } /// Called automatically when Origen is first loaded #[pyfunction] +#[pyo3(signature=(log_verbosity, verbosity_keywords, cli_location, cli_version, fe_pkg_loc, fe_exe_loc, invocation))] fn initialize( py: Python, log_verbosity: Option, verbosity_keywords: Vec, cli_location: Option, cli_version: Option, + fe_pkg_loc: Option, + fe_exe_loc: Option, + invocation: Option<(String, Option)>, ) -> PyResult<()> { - origen::initialize(log_verbosity, verbosity_keywords, cli_location, cli_version); + origen::initialize(log_verbosity, verbosity_keywords, cli_location, cli_version, fe_pkg_loc, fe_exe_loc); origen::STATUS.update_other_build_info("pyapi_version", built_info::PKG_VERSION)?; + if let Some(invoc) = invocation { + match DependencySrc::try_from(invoc) { + Ok(d) => origen::STATUS.set_dependency_src(Some(d)), + Err(e) => log_error!("{}", e.to_string()) + } + } origen::FRONTEND .write() .unwrap() @@ -502,11 +513,21 @@ fn status(py: Python) -> PyResult { None => py.None(), }, )?; + ret.set_item( + "cli_location", + match STATUS.cli_location() { + Some(path) => pypath!(py, path.display()), + None => py.None(), + }, + )?; ret.set_item( "is_app_in_origen_dev_mode", STATUS.is_app_in_origen_dev_mode, )?; ret.set_item("in_origen_core_app", STATUS.in_origen_core_app())?; + + // Invocation details + infrastructure::pyproject::populate_status(py, ret)?; Ok(ret.into()) } @@ -514,7 +535,7 @@ fn status(py: Python) -> PyResult { #[pyfunction] fn version() -> PyResult { Ok( - origen::utility::version::Version::new_pep440(&STATUS.origen_version.to_string())? + origen_metal::utils::version::Version::new_pep440(&STATUS.origen_version.to_string())? .to_string(), ) } @@ -532,41 +553,58 @@ fn config(py: Python) -> PyResult { Ok(ret.into()) } +#[pyfunction] +fn config_metadata<'py>(py: Python<'py>) -> PyResult<&'py PyDict> { + let m = origen::origen_config_metadata(); + let retn = PyDict::new(py); + retn.set_item("files", m.files.iter().map( |p| Ok(pypath!(py, p.display()))).collect::>>()?)?; + Ok(retn) +} + +#[pyfunction] +fn is_app_present() -> PyResult { + Ok(STATUS.is_app_present) +} + /// Returns the Origen application configuration (as defined in application.toml) #[pyfunction] -fn app_config(py: Python) -> PyResult { - let ret = PyDict::new(py); - let _ = origen::app().unwrap().with_config(|config| { - let _ = ret.set_item("name", &config.name); - let _ = ret.set_item("target", &config.target); - let _ = ret.set_item("mode", &config.mode); - let _ = ret.set_item("__output_directory__", &config.output_directory); - let _ = ret.set_item( - "__website_output_directory__", - &config.website_output_directory, - ); - let _ = ret.set_item( - "__website_source_directory__", - &config.website_source_directory, - ); - let _ = ret.set_item( - "website_release_location", - match &config.website_release_location { - Some(loc) => Py::new( - py, - Location { - location: (*loc).clone(), - }, - ) - .unwrap() - .to_object(py), - None => py.None(), - }, - ); - let _ = ret.set_item("website_release_name", &config.website_release_name); - Ok(()) - }); - Ok(ret.into()) +fn app_config(py: Python) -> PyResult> { + if let Some(app) = origen::app() { + let ret = PyDict::new(py); + let _ = app.with_config(|config| { + let _ = ret.set_item("name", &config.name); + let _ = ret.set_item("target", &config.target); + let _ = ret.set_item("mode", &config.mode); + let _ = ret.set_item("__output_directory__", &config.output_directory); + let _ = ret.set_item( + "__website_output_directory__", + &config.website_output_directory, + ); + let _ = ret.set_item( + "__website_source_directory__", + &config.website_source_directory, + ); + let _ = ret.set_item( + "website_release_location", + match &config.website_release_location { + Some(loc) => Py::new( + py, + Location { + location: (*loc).clone(), + }, + ) + .unwrap() + .to_object(py), + None => py.None(), + }, + ); + let _ = ret.set_item("website_release_name", &config.website_release_name); + Ok(()) + }); + Ok(Some(ret.into())) + } else { + Ok(None) + } } /// clean_mode(name) @@ -582,7 +620,7 @@ fn clean_mode(name: &str) -> PyResult { /// Sanitizes the given target/env name and returns the matching file, but will exit the process /// if it does not uniquely identify a single target/env file. fn target_file(name: &str, dir: &str) -> PyResult { - let c = origen::core::application::target::clean_name(name, dir, true); + let c = clean_target!(name, dir, true); Ok(c) } @@ -618,13 +656,6 @@ fn start_new_test(name: Option) -> PyResult<()> { Ok(()) } -#[macro_export] -macro_rules! runtime_error { - ($message:expr) => {{ - Err(PyErr::new::($message)) - }}; -} - pub fn pickle(py: Python, object: &impl AsPyPointer) -> PyResult> { let pickle = PyModule::import(py, "pickle")?; pickle @@ -643,11 +674,10 @@ pub fn with_pycallbacks(mut func: F) -> PyResult where F: FnMut(Python, &PyAny) -> PyResult, { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let pycallbacks = py.import("origen.callbacks")?; - func(py, pycallbacks) + Python::with_gil(|py| { + let pycallbacks = py.import("origen.callbacks")?; + func(py, pycallbacks) + }) } pub fn get_full_class_name(obj: &PyAny) -> PyResult { @@ -677,6 +707,16 @@ pub fn boot_users(py: Python) -> PyResult let users = pyapi_metal::framework::users::users()?; + if let Some(pw_cache_option) = &crate::ORIGEN_CONFIG.user__password_cache_option { + match users.set_default_password_cache_option(Some(pw_cache_option)) { + Ok(_) => {}, + Err(e) => { + om::log_error!("{}: Error encountered updating default password cache option", *BASE_MSG); + om::log_error!("{}", e); + } + } + } + if let Some(dsets) = &crate::ORIGEN_CONFIG.user__datasets { let mut replace_default = true; for (dn, config) in dsets { @@ -748,7 +788,7 @@ pub fn boot_users(py: Python) -> PyResult // Set the data lookup hierarchy if let Some(hierarchy) = &crate::ORIGEN_CONFIG.user__data_lookup_hierarchy { - match users.set_data_lookup_hierarchy(hierarchy.to_owned()) { + match users.apply_data_lookup_hierarchy(hierarchy.to_owned()) { Ok(_) => {} Err(e) => { om::log_error!( @@ -757,7 +797,7 @@ pub fn boot_users(py: Python) -> PyResult ); om::log_error!("{}", e); om::log_error!("Forcing empty dataset lookup hierarchy..."); - users.set_data_lookup_hierarchy(vec![])?; + users.apply_data_lookup_hierarchy(vec![])?; } } } else { @@ -766,7 +806,7 @@ pub fn boot_users(py: Python) -> PyResult { // The config can only be read as an unordered hashmap. If multiple datasets are given, // clear the hierarchy if not explicitly given, otherwise will get non-deterministic behavior - users.set_data_lookup_hierarchy(vec![])?; + users.apply_data_lookup_hierarchy(vec![])?; } } @@ -841,9 +881,34 @@ pub fn boot_users(py: Python) -> PyResult // Initialize the current user if ORIGEN_CONFIG.initial_user.as_ref().map_or(true, |u| u.initialize.unwrap_or(true)) { match users.lookup_current_id(true) { - Ok(_) => {} + Ok(_) => { + if ORIGEN_CONFIG.initial_user.as_ref().map_or(true, |u| u.init_home_dir.unwrap_or(true)) { + match users.current_user() { + Ok(usr) => { + match usr { + Some(u) => { + match u.set_home_dir(None) { + Ok(_) => {}, + Err(e) => { + log_error!("{}: Failed to lookup current user's home directory", *BASE_MSG); + log_error!("{}", e); + } + } + }, + None => { + log_error!("{}: Failed to lookup current user", *BASE_MSG); + } + } + }, + Err(e) => { + log_error!("{}: Failed to lookup current user", *BASE_MSG); + log_error!("{}", e); + } + } + } + }, Err(e) => { - om::log_error!("{}: Failed to lookup current user", *BASE_MSG); + log_error!("{}: Failed to lookup current user", *BASE_MSG); log_error!("{}", e); } } diff --git a/rust/pyapi/src/macros.rs b/rust/pyapi/src/macros.rs new file mode 100644 index 00000000..73931a4d --- /dev/null +++ b/rust/pyapi/src/macros.rs @@ -0,0 +1,5 @@ +macro_rules! _origen { + ($py: expr) => { + pyo3::types::PyModule::import($py, "_origen")? + }; +} diff --git a/rust/pyapi/src/meta/py_like_apis/dict_like_api.rs b/rust/pyapi/src/meta/py_like_apis/dict_like_api.rs index ecece431..81e06c5a 100644 --- a/rust/pyapi/src/meta/py_like_apis/dict_like_api.rs +++ b/rust/pyapi/src/meta/py_like_apis/dict_like_api.rs @@ -65,13 +65,13 @@ pub trait DictLikeAPI { items = self.lookup_table(&dut); } - let gil = Python::acquire_gil(); - let py = gil.python(); - let mut v: Vec = Vec::new(); - for (n, _item) in items { - v.push(self.new_pyitem(py, &n, self.model_id())?); - } - Ok(v) + Python::with_gil(|py| { + let mut v: Vec = Vec::new(); + for (n, _item) in items { + v.push(self.new_pyitem(py, &n, self.model_id())?); + } + Ok(v) + }) } fn items(&self) -> PyResult> { @@ -81,43 +81,43 @@ pub trait DictLikeAPI { items = self.lookup_table(&dut); } - let gil = Python::acquire_gil(); - let py = gil.python(); - let mut _items: Vec<(String, PyObject)> = Vec::new(); - for (n, _item) in items.iter() { - _items.push((n.clone(), self.new_pyitem(py, &n, self.model_id())?)); - } - Ok(_items) + Python::with_gil(|py| { + let mut _items: Vec<(String, PyObject)> = Vec::new(); + for (n, _item) in items.iter() { + _items.push((n.clone(), self.new_pyitem(py, &n, self.model_id())?)); + } + Ok(_items) + }) } fn get(&self, name: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - { - let dut = DUT.lock().unwrap(); - let items = self.lookup_table(&dut); - if items.get(name).is_none() { - return Ok(py.None()); + Python::with_gil(|py| { + { + let dut = DUT.lock().unwrap(); + let items = self.lookup_table(&dut); + if items.get(name).is_none() { + return Ok(py.None()); + } } - } - Ok(self.new_pyitem(py, name, self.model_id())?) + Ok(self.new_pyitem(py, name, self.model_id())?) + }) } // Functions for PyMappingProtocol fn __getitem__(&self, name: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - { - let dut = DUT.lock().unwrap(); - let items = self.lookup_table(&dut); - if items.get(name).is_none() { - return Err(pyo3::exceptions::PyKeyError::new_err(format!( - "No item found for {}", - name - ))); + Python::with_gil(|py| { + { + let dut = DUT.lock().unwrap(); + let items = self.lookup_table(&dut); + if items.get(name).is_none() { + return Err(pyo3::exceptions::PyKeyError::new_err(format!( + "No item found for {}", + name + ))); + } } - } - Ok(self.new_pyitem(py, name, self.model_id())?) + Ok(self.new_pyitem(py, name, self.model_id())?) + }) } fn __len__(&self) -> PyResult { diff --git a/rust/pyapi/src/meta/py_like_apis/list_like_api.rs b/rust/pyapi/src/meta/py_like_apis/list_like_api.rs index 75fc2b95..fcf3cb17 100644 --- a/rust/pyapi/src/meta/py_like_apis/list_like_api.rs +++ b/rust/pyapi/src/meta/py_like_apis/list_like_api.rs @@ -8,7 +8,7 @@ pub trait ListLikeAPI { fn __iter__(&self) -> PyResult; fn __getitem__(&self, idx: &PyAny) -> PyResult { - if let Ok(slice) = idx.cast_as::() { + if let Ok(slice) = idx.downcast::() { self.___getslice__(slice) } else { let i = idx.extract::()?; @@ -42,9 +42,9 @@ pub trait ListLikeAPI { _idx = ((item_ids.len() as isize) + idx) as usize; } - let gil = Python::acquire_gil(); - let py = gil.python(); - Ok(self.new_pyitem(py, _idx)?) + Python::with_gil(|py| { + Ok(self.new_pyitem(py, _idx)?) + }) } fn ___getslice__(&self, slice: &PySlice) -> PyResult { @@ -55,22 +55,22 @@ pub trait ListLikeAPI { indices = slice.indices((item_ids.len() as i32).into())?; } - let gil = Python::acquire_gil(); - let py = gil.python(); - let mut rtn: Vec = vec![]; - let mut i = indices.start; - if indices.step > 0 { - while i < indices.stop { - rtn.push(self.new_pyitem(py, i as usize)?); - i += indices.step; + Python::with_gil(|py| { + let mut rtn: Vec = vec![]; + let mut i = indices.start; + if indices.step > 0 { + while i < indices.stop { + rtn.push(self.new_pyitem(py, i as usize)?); + i += indices.step; + } + } else if indices.step < 0 { + while i > indices.stop { + rtn.push(self.new_pyitem(py, i as usize)?); + i += indices.step; + } } - } else if indices.step < 0 { - while i > indices.stop { - rtn.push(self.new_pyitem(py, i as usize)?); - i += indices.step; - } - } - Ok(rtn.to_object(py)) + Ok(rtn.to_object(py)) + }) } fn __len__(&self) -> PyResult { @@ -109,7 +109,7 @@ pub trait GeneralizedListLikeAPI { // fn __iter__(&self) -> PyResult; fn __getitem__(&self, idx: &PyAny) -> PyResult { - if let Ok(slice) = idx.cast_as::() { + if let Ok(slice) = idx.downcast::() { self.___getslice__(slice) } else { let i = idx.extract::()?; @@ -138,29 +138,29 @@ pub trait GeneralizedListLikeAPI { _idx = ((self.items().len() as isize) + idx) as usize; } - let gil = Python::acquire_gil(); - let py = gil.python(); - Ok(self.new_pyitem(py, &self.items()[_idx], _idx)?) + Python::with_gil(|py| { + Ok(self.new_pyitem(py, &self.items()[_idx], _idx)?) + }) } fn ___getslice__(&self, slice: &PySlice) -> PyResult { let indices = slice.indices((self.items().len() as i32).into())?; - let gil = Python::acquire_gil(); - let py = gil.python(); - let mut rtn: Vec = vec![]; - let mut i = indices.start; - if indices.step > 0 { - while i < indices.stop { - rtn.push(self.new_pyitem(py, &self.items()[i as usize], i as usize)?); - i += indices.step; + Python::with_gil(|py| { + let mut rtn: Vec = vec![]; + let mut i = indices.start; + if indices.step > 0 { + while i < indices.stop { + rtn.push(self.new_pyitem(py, &self.items()[i as usize], i as usize)?); + i += indices.step; + } + } else if indices.step < 0 { + while i > indices.stop { + rtn.push(self.new_pyitem(py, &self.items()[i as usize], i as usize)?); + i += indices.step; + } } - } else if indices.step < 0 { - while i > indices.stop { - rtn.push(self.new_pyitem(py, &self.items()[i as usize], i as usize)?); - i += indices.step; - } - } - Ok(rtn.to_object(py)) + Ok(rtn.to_object(py)) + }) } fn __len__(&self) -> PyResult { diff --git a/rust/pyapi/src/pins.rs b/rust/pyapi/src/pins.rs index 227a72ed..7d58c210 100644 --- a/rust/pyapi/src/pins.rs +++ b/rust/pyapi/src/pins.rs @@ -28,16 +28,19 @@ use pin_header::{PinHeader, PinHeaderContainer}; #[allow(unused_imports)] use pyo3::types::{PyAny, PyBytes, PyDict, PyIterator, PyList, PyTuple}; -#[pymodule] -/// Implements the module _origen.pins in Python -pub fn pins(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "pins")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + + pyapi_metal::alias_method_apply_to_set!(subm, "PinGroup", "actions"); + pyapi_metal::alias_method_apply_to_set!(subm, "PinCollection", "actions"); + m.add_submodule(subm)?; Ok(()) } @@ -144,12 +147,12 @@ pub fn pins_to_backend_lookup_fields( } pub fn vec_to_ppin_ids(dut: &origen::Dut, pins: Vec<&PyAny>) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let t = PyTuple::new(py, pins); - let pin_lookups = pins_to_backend_lookup_fields(py, t)?; - let flat_pins = dut._resolve_to_flattened_pins(&pin_lookups)?; - Ok(flat_pins.iter().map(|p| p.id).collect::>()) + Python::with_gil(|py| { + let t = PyTuple::new(py, pins); + let pin_lookups = pins_to_backend_lookup_fields(py, t)?; + let flat_pins = dut._resolve_to_flattened_pins(&pin_lookups)?; + Ok(flat_pins.iter().map(|p| p.id).collect::>()) + }) } // /// Similar to pins_to_backend_lookup_fields (and actually uses that) but goes @@ -167,8 +170,8 @@ pub fn vec_to_ppin_ids(dut: &origen::Dut, pins: Vec<&PyAny>) -> PyResult) -> PyResult { + #[pyo3(signature=(model_id, name, **kwargs))] + fn add_pin(&self, py: Python, model_id: usize, name: &str, kwargs: Option<&PyDict>) -> PyResult { let mut dut = DUT.lock().unwrap(); let (mut reset_action, mut width, mut offset, mut endianness): ( Option>, @@ -199,8 +202,6 @@ impl PyDUT { } dut.add_pin(model_id, name, width, offset, reset_action, endianness)?; - let gil = Python::acquire_gil(); - let py = gil.python(); match dut.get_pin_group(model_id, name) { Some(_p) => Ok(Py::new( py, @@ -215,11 +216,8 @@ impl PyDUT { } } - fn pin(&self, model_id: usize, name: &str) -> PyResult { + fn pin(&self, py: Python, model_id: usize, name: &str) -> PyResult { let dut = DUT.lock().unwrap(); - - let gil = Python::acquire_gil(); - let py = gil.python(); match dut.get_pin_group(model_id, name) { Some(_p) => Ok(Py::new( py, @@ -234,7 +232,7 @@ impl PyDUT { } } - #[args(aliases = "*")] + #[pyo3(signature=(model_id, name, *aliases))] fn add_pin_alias(&self, model_id: usize, name: &str, aliases: &PyTuple) -> PyResult<()> { let mut dut = DUT.lock().unwrap(); for alias in aliases { @@ -244,15 +242,14 @@ impl PyDUT { Ok(()) } - fn pins(&self, model_id: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn pins(&self, py: Python, model_id: usize) -> PyResult> { Ok(Py::new(py, PinContainer { model_id: model_id }).unwrap()) } - #[args(pins = "*", options = "**")] + #[pyo3(signature=(model_id, name, *pins, **options))] fn group_pins( &self, + py: Python, model_id: usize, name: &str, pins: &PyTuple, @@ -285,8 +282,6 @@ impl PyDUT { let mut dut = DUT.lock().unwrap(); dut.group_pins_by_name(model_id, name, name_strs, endianness)?; - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(Py::new( py, PinGroup { @@ -298,17 +293,12 @@ impl PyDUT { .to_object(py)) } - fn physical_pins(&self, model_id: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn physical_pins(&self, py: Python, model_id: usize) -> PyResult> { Ok(Py::new(py, PhysicalPinContainer { model_id: model_id }).unwrap()) } - fn physical_pin(&self, model_id: usize, name: &str) -> PyResult { + fn physical_pin(&self, py: Python, model_id: usize, name: &str) -> PyResult { let dut = DUT.lock().unwrap(); - - let gil = Python::acquire_gil(); - let py = gil.python(); match dut.get_pin(model_id, name) { Some(_p) => Ok(Py::new( py, @@ -323,9 +313,10 @@ impl PyDUT { } } - #[args(pins = "*")] + #[pyo3(signature=(model_id, name, *pins))] fn add_pin_header( &self, + py: Python, model_id: usize, name: &str, pins: &PyTuple, @@ -333,8 +324,6 @@ impl PyDUT { let mut dut = DUT.lock().unwrap(); dut.create_pin_header(model_id, name, pins.extract::>()?)?; - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(Py::new( py, PinHeader { @@ -345,17 +334,12 @@ impl PyDUT { .unwrap()) } - fn pin_headers(&self, model_id: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn pin_headers(&self, py: Python, model_id: usize) -> PyResult> { Ok(Py::new(py, PinHeaderContainer { model_id: model_id }).unwrap()) } - fn pin_header(&self, model_id: usize, name: &str) -> PyResult { + fn pin_header(&self, py: Python, model_id: usize, name: &str) -> PyResult { let dut = DUT.lock().unwrap(); - - let gil = Python::acquire_gil(); - let py = gil.python(); match dut.get_pin_header(model_id, name) { Some(_p) => Ok(Py::new( py, diff --git a/rust/pyapi/src/pins/pin.rs b/rust/pyapi/src/pins/pin.rs index 4ce2a4de..db0562a5 100644 --- a/rust/pyapi/src/pins/pin.rs +++ b/rust/pyapi/src/pins/pin.rs @@ -27,30 +27,26 @@ pub struct Pin { #[pymethods] impl Pin { - fn add_metadata(&self, id_str: &str, obj: &PyAny) -> PyResult<()> { + fn add_metadata(&self, py: Python, id_str: &str, obj: &PyAny) -> PyResult<()> { let mut dut = DUT.lock().unwrap(); let pin = dut._get_mut_pin(self.model_id, &self.name)?; - let gil = Python::acquire_gil(); - let py = gil.python(); let locals = [("origen", py.import("origen")?)].into_py_dict(py); let mut dut = py .eval("origen.dut.db", None, Some(&locals)) .unwrap() .extract::>()?; - let idx = dut.push_metadata(obj); + let idx = dut.push_metadata(py, obj); // Store the index of this object, returning an error if the pin.add_metadata_id(id_str, idx)?; Ok(()) } - fn set_metadata(&self, id_str: &str, obj: &PyAny) -> PyResult { + fn set_metadata(&self, py: Python, id_str: &str, obj: &PyAny) -> PyResult { let mut dut = DUT.lock().unwrap(); let pin = dut._get_mut_pin(self.model_id, &self.name)?; - let gil = Python::acquire_gil(); - let py = gil.python(); let locals = [("origen", py.import("origen")?)].into_py_dict(py); let mut dut = py .eval("origen.dut.db", None, Some(&locals)) @@ -58,22 +54,21 @@ impl Pin { .extract::>()?; match pin.get_metadata_id(id_str) { Some(idx) => { - dut.override_metadata_at(idx, obj)?; + dut.override_metadata_at(py, idx, obj)?; Ok(true) } None => { - let idx = dut.push_metadata(obj); + let idx = dut.push_metadata(py, obj); pin.add_metadata_id(id_str, idx)?; Ok(false) } } } - fn get_metadata(&self, id_str: &str) -> PyResult { + fn get_metadata(&self, py: Python, id_str: &str) -> PyResult { let dut = DUT.lock().unwrap(); let pin = dut._get_pin(self.model_id, &self.name)?; - let gil = Python::acquire_gil(); - let py = gil.python(); + match pin.metadata.get(id_str) { Some(idx) => { let locals = [("origen", py.import("origen")?)].into_py_dict(py); @@ -130,12 +125,9 @@ impl Pin { } #[getter] - fn get_reset_data(&self) -> PyResult { + fn get_reset_data(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let pin = dut._get_pin(self.model_id, &self.name)?; - - let gil = Python::acquire_gil(); - let py = gil.python(); match &pin.reset_action { Some(d) => Ok(d.to_logic()?.to_object(py)), None => Ok(py.None()), @@ -143,12 +135,9 @@ impl Pin { } #[getter] - fn get_reset_action(&self) -> PyResult { + fn get_reset_action(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let pin = dut._get_pin(self.model_id, &self.name)?; - - let gil = Python::acquire_gil(); - let py = gil.python(); match pin.reset_action.as_ref() { Some(a) => Ok(a.to_string().into_py(py)), None => Ok(py.None()), diff --git a/rust/pyapi/src/pins/pin_actions.rs b/rust/pyapi/src/pins/pin_actions.rs index 687d1d53..66e5a472 100644 --- a/rust/pyapi/src/pins/pin_actions.rs +++ b/rust/pyapi/src/pins/pin_actions.rs @@ -69,9 +69,7 @@ pub struct PinActions { impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn DriveHigh(_cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn DriveHigh(_cls: &PyType, py: Python) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::drive_high()], } @@ -80,9 +78,7 @@ impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn DriveLow(_cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn DriveLow(_cls: &PyType, py: Python) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::drive_low()], } @@ -91,9 +87,7 @@ impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn VerifyHigh(_cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn VerifyHigh(_cls: &PyType, py: Python) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::verify_high()], } @@ -102,9 +96,7 @@ impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn VerifyLow(_cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn VerifyLow(_cls: &PyType, py: Python) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::verify_low()], } @@ -113,9 +105,7 @@ impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn Capture(_cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn Capture(_cls: &PyType, py: Python) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::capture()], } @@ -124,9 +114,7 @@ impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn HighZ(_cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn HighZ(_cls: &PyType, py: Python) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::highz()], } @@ -135,9 +123,7 @@ impl PinActions { #[allow(non_snake_case)] #[classmethod] - fn Multichar(_cls: &PyType, symbol: String) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn Multichar(_cls: &PyType, py: Python, symbol: String) -> PyResult { Ok(PinActions { actions: vec![OrigenPinAction::new(&symbol)], } @@ -145,21 +131,19 @@ impl PinActions { } #[classmethod] - fn standard_actions(cls: &PyType) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn standard_actions(cls: &PyType, py: Python) -> PyResult { let retn = PyDict::new(py); - retn.set_item("DriveHigh", Self::DriveHigh(cls)?)?; - retn.set_item("DriveLow", Self::DriveLow(cls)?)?; - retn.set_item("VerifyHigh", Self::VerifyHigh(cls)?)?; - retn.set_item("VerifyLow", Self::VerifyLow(cls)?)?; - retn.set_item("Capture", Self::Capture(cls)?)?; - retn.set_item("HighZ", Self::HighZ(cls)?)?; + retn.set_item("DriveHigh", Self::DriveHigh(cls, py)?)?; + retn.set_item("DriveLow", Self::DriveLow(cls, py)?)?; + retn.set_item("VerifyHigh", Self::VerifyHigh(cls, py)?)?; + retn.set_item("VerifyLow", Self::VerifyLow(cls, py)?)?; + retn.set_item("Capture", Self::Capture(cls, py)?)?; + retn.set_item("HighZ", Self::HighZ(cls, py)?)?; Ok(retn.into()) } #[new] - #[args(actions = "*", _kwargs = "**")] + #[pyo3(signature=(*actions, **_kwargs))] fn new(actions: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { let mut temp: Vec = vec![]; // if let Some(actions_) = actions { @@ -198,10 +182,7 @@ impl PinActions { /// Comparisons are only valid for *equal* and *not equal*. Can't compare if one /// pin action is *greater than* or *less than* another. /// Example of richcmp: https://github.com/PyO3/pyo3/blob/a5e3d4e7c8d80f7020510cf630ab01001612c6a7/tests/test_arithmetics.rs#L358-L373 - fn __richcmp__(&self, other: &PyAny, op: CompareOp) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - + fn __richcmp__(&self, py: Python, other: &PyAny, op: CompareOp) -> PyResult { // Support comparing either to a str or another Actions object let other_string; if let Ok(s) = other.extract::() { @@ -283,9 +264,9 @@ impl GeneralizedListLikeAPI for PinActions { _idx = ((self.items().len() as isize) + idx) as usize; } - let gil = Python::acquire_gil(); - let py = gil.python(); - Ok(self.new_pyitem(py, &self.items()[_idx], _idx)?) + Python::with_gil(|py| { + self.new_pyitem(py, &self.items()[_idx], _idx) + }) } fn ___getslice__(&self, slice: &PySlice) -> PyResult { @@ -305,9 +286,9 @@ impl GeneralizedListLikeAPI for PinActions { } } } - let gil = Python::acquire_gil(); - let py = gil.python(); - Ok(PinActions { actions: actions }.into_py(py)) + Ok(Python::with_gil(|py| { + PinActions { actions: actions }.into_py(py) + })) } } diff --git a/rust/pyapi/src/pins/pin_collection.rs b/rust/pyapi/src/pins/pin_collection.rs index 22940d7e..c8f3b7c0 100644 --- a/rust/pyapi/src/pins/pin_collection.rs +++ b/rust/pyapi/src/pins/pin_collection.rs @@ -46,12 +46,12 @@ impl PinCollection { impl PinCollection { #[setter] fn actions(slf: PyRefMut, actions: &PyAny) -> PyResult<()> { - Self::set_actions(slf, actions, None)?; + Self::apply_actions(slf, actions, None)?; Ok(()) } - #[args(kwargs = "**")] - fn set_actions( + #[pyo3(signature=(actions, **kwargs))] + fn apply_actions( slf: PyRefMut, actions: &PyAny, kwargs: Option<&PyDict>, @@ -65,11 +65,8 @@ impl PinCollection { } #[getter] - fn get_actions(&self) -> PyResult { + fn get_actions(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); - let gil = Python::acquire_gil(); - let py = gil.python(); - let pin_actions = self.pin_collection.get_actions(&dut)?; Ok(PinActions { actions: pin_actions, @@ -102,7 +99,7 @@ impl PinCollection { Ok(()) } - #[args(label = "None", symbol = "None", cycles = "None", mask = "None")] + #[pyo3(signature=(label=None, symbol=None, cycles=None, mask=None))] fn overlay( slf: PyRef, label: Option, @@ -117,7 +114,7 @@ impl PinCollection { Ok(slf.into()) } - #[args(symbol = "None", cycles = "None", mask = "None")] + #[pyo3(signature=(symbol=None, cycles=None, mask=None))] fn capture( slf: PyRef, symbol: Option, @@ -147,10 +144,8 @@ impl PinCollection { } #[getter] - fn get_reset_actions(&self) -> PyResult { + fn get_reset_actions(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); - let gil = Python::acquire_gil(); - let py = gil.python(); let pin_actions = self.pin_collection.get_reset_actions(&dut)?; Ok(PinActions { actions: pin_actions, @@ -168,11 +163,8 @@ impl PinCollection { Ok(self.pin_collection.is_little_endian()) } - #[args(kwargs = "**")] - fn cycle(slf: PyRef, kwargs: Option<&PyDict>) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); - + #[pyo3(signature=(**kwargs))] + fn cycle(slf: PyRef, py: Python, kwargs: Option<&PyDict>) -> PyResult> { let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?)?; locals.set_item("kwargs", kwargs.to_object(py))?; @@ -185,10 +177,7 @@ impl PinCollection { Ok(slf.into()) } - fn repeat(slf: PyRef, count: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); - + fn repeat(slf: PyRef, py: Python, count: usize) -> PyResult> { let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?)?; py.eval( @@ -271,15 +260,15 @@ impl ListLikeAPI for PinCollection { } } } - let gil = Python::acquire_gil(); - let py = gil.python(); - Ok(Py::new( - py, - PinCollection { - pin_collection: OrigenPinCollection::new(ids, None), - }, - )? - .to_object(py)) + Python::with_gil(|py| { + Ok(Py::new( + py, + PinCollection { + pin_collection: OrigenPinCollection::new(ids, None), + }, + )? + .to_object(py)) + }) } } diff --git a/rust/pyapi/src/pins/pin_container.rs b/rust/pyapi/src/pins/pin_container.rs index 681c9165..ffe4a9f1 100644 --- a/rust/pyapi/src/pins/pin_container.rs +++ b/rust/pyapi/src/pins/pin_container.rs @@ -35,10 +35,8 @@ impl PinContainer { self.keys() } - #[args(names = "*", options = "**")] - fn collect(&self, names: &PyTuple, options: Option<&PyDict>) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + #[pyo3(signature=(*names, **options))] + fn collect(&self, py: Python, names: &PyTuple, options: Option<&PyDict>) -> PyResult> { let mut endianness = Option::None; match options { Some(options) => { diff --git a/rust/pyapi/src/pins/pin_group.rs b/rust/pyapi/src/pins/pin_group.rs index a4b2d5c3..5e667ace 100644 --- a/rust/pyapi/src/pins/pin_group.rs +++ b/rust/pyapi/src/pins/pin_group.rs @@ -33,11 +33,8 @@ impl PinGroup { } #[getter] - fn get_actions(&self) -> PyResult { + fn get_actions(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); - let gil = Python::acquire_gil(); - let py = gil.python(); - let grp = dut._get_pin_group(self.model_id, &self.name)?; let pin_actions = grp.get_actions(&dut)?; Ok(PinActions { @@ -46,7 +43,7 @@ impl PinGroup { .into_py(py)) } - #[args(kwargs = "**")] + #[pyo3(signature=(data, **kwargs))] fn drive(slf: PyRef, data: BigUint, kwargs: Option<&PyDict>) -> PyResult> { let dut = DUT.lock().unwrap(); let grp = dut._get_pin_group(slf.model_id, &slf.name)?; @@ -56,7 +53,7 @@ impl PinGroup { Ok(slf.into()) } - #[args(kwargs = "**")] + #[pyo3(signature=(data, **kwargs))] fn verify(slf: PyRef, data: BigUint, kwargs: Option<&PyDict>) -> PyResult> { let dut = DUT.lock().unwrap(); let grp = dut._get_pin_group(slf.model_id, &slf.name)?; @@ -75,12 +72,12 @@ impl PinGroup { #[setter] fn actions(slf: PyRef, actions: &PyAny) -> PyResult<()> { - Self::set_actions(slf, actions, None)?; + Self::apply_actions(slf, actions, None)?; Ok(()) } - #[args(kwargs = "**")] - fn set_actions( + #[pyo3(signature=(actions, **kwargs))] + fn apply_actions( slf: PyRef, actions: &PyAny, kwargs: Option<&PyDict>, @@ -109,10 +106,8 @@ impl PinGroup { } #[getter] - fn get_reset_actions(&self) -> PyResult { + fn get_reset_actions(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); - let gil = Python::acquire_gil(); - let py = gil.python(); let grp = dut._get_pin_group(self.model_id, &self.name)?; let pin_actions = grp.get_reset_actions(&dut)?; Ok(PinActions { @@ -134,11 +129,8 @@ impl PinGroup { Ok(grp.is_little_endian()) } - #[args(kwargs = "**")] - fn cycle(slf: PyRef, kwargs: Option<&PyDict>) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); - + #[pyo3(signature=(**kwargs))] + fn cycle(slf: PyRef, py: Python, kwargs: Option<&PyDict>) -> PyResult> { let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?)?; locals.set_item("kwargs", kwargs.to_object(py))?; @@ -151,10 +143,7 @@ impl PinGroup { Ok(slf.into()) } - fn repeat(slf: PyRef, count: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); - + fn repeat(slf: PyRef, py: Python, count: usize) -> PyResult> { let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?)?; py.eval( @@ -165,7 +154,7 @@ impl PinGroup { Ok(slf.into()) } - #[args(label = "None", symbol = "None", cycles = "None", mask = "None")] + #[pyo3(signature=(label=None, symbol=None, cycles=None, mask=None))] fn overlay( slf: PyRef, label: Option, @@ -181,7 +170,7 @@ impl PinGroup { Ok(slf.into()) } - #[args(symbol = "None", cycles = "None", mask = "None")] + #[pyo3(signature=(symbol=None, cycles=None, mask=None))] fn capture( slf: PyRef, symbol: Option, @@ -276,8 +265,8 @@ impl ListLikeAPI for PinGroup { } } } - let gil = Python::acquire_gil(); - let py = gil.python(); - Ok(Py::new(py, PinCollection::from_ids_unchecked(ids, None))?.to_object(py)) + Python::with_gil(|py| { + Ok(Py::new(py, PinCollection::from_ids_unchecked(ids, None))?.to_object(py)) + }) } } diff --git a/rust/pyapi/src/plugins.rs b/rust/pyapi/src/plugins.rs new file mode 100644 index 00000000..148ffdba --- /dev/null +++ b/rust/pyapi/src/plugins.rs @@ -0,0 +1,102 @@ +use pyo3::prelude::*; +use pyo3::types::PyDict; +use pyo3::wrap_pyfunction; +use pyapi_metal::key_exception; +use origen::ORIGEN_CONFIG; +use std::path::PathBuf; + +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "plugins")?; + subm.add_wrapped(wrap_pyfunction!(get_plugin_roots))?; + subm.add_wrapped(wrap_pyfunction!(display_plugin_roots))?; + subm.add_wrapped(wrap_pyfunction!(find_plugin_roots))?; + subm.add_wrapped(wrap_pyfunction!(collect_plugin_roots))?; + m.add_submodule(subm)?; + Ok(()) +} + +#[pyfunction] +fn get_plugin_roots<'py>(py: Python<'py>) -> PyResult<&'py PyDict> { + let pl_roots; + if let Some(plugins) = ORIGEN_CONFIG.plugins.as_ref() { + if plugins.collect() { + pl_roots = collect_plugin_roots(py)?; + } else { + pl_roots = PyDict::new(py); + } + + if let Some(plugins_to_load) = plugins.load.as_ref() { + for (n, r) in find_plugin_roots(py, plugins_to_load.iter().map( |pl| pl.name.as_str()).collect::>())?.iter() { + pl_roots.set_item(n, r)?; + } + } + } else { + pl_roots = collect_plugin_roots(py)?; + } + Ok(pl_roots) +} + +#[pyfunction] +fn display_plugin_roots(py: Python) -> PyResult<()> { + for (pl, path) in get_plugin_roots(py)?.iter() { + println!("success|{}|{}", pl.extract::()?, path.extract::()?.display()); + } + Ok(()) +} + +#[pyfunction] +fn find_plugin_roots<'py>(py: Python<'py>, plugins: Vec<&str>) -> PyResult<&'py PyDict> { + let l = PyDict::new(py); + l.set_item("plugin_paths", PyDict::new(py))?; + py.run(&format!( +r#" +from pathlib import Path +import importlib, importlib_metadata + +for to_load in [{}]: + s = importlib.util.find_spec(to_load) + if s.origin: + root = Path(s.origin).parent + if root.joinpath("origen.plugin.toml").exists(): + plugin_paths[to_load] = root + elif s.submodule_search_locations: + for root in s.submodule_search_locations: + root = Path(root) + if root.joinpath("origen.plugin.toml").exists(): + plugin_paths[to_load] = root +"#, + plugins.iter().map( |n| format!("'{}'", n)).collect::>().join(",")), + None, + Some(l) + )?; + Ok(l.get_item("plugin_paths").ok_or_else( || key_exception!("Error finding plugin roots: expected 'plugin_paths' key."))?.extract()?) +} + +#[pyfunction] +fn collect_plugin_roots<'py>(py: Python<'py>) -> PyResult<&'py PyDict> { + let l = PyDict::new(py); + l.set_item("plugin_paths", PyDict::new(py))?; + py.run( +r#" +from pathlib import Path +import importlib, importlib_metadata + +for dist in importlib_metadata.distributions(): + n = str(Path(dist._path).name).split('-')[0].lower() + s = importlib.util.find_spec(n) + if s: + if s.origin: + root = Path(s.origin).parent + if root.joinpath("origen.plugin.toml").exists(): + plugin_paths[n] = root + elif s.submodule_search_locations: + for root in s.submodule_search_locations: + root = Path(root) + if root.joinpath("origen.plugin.toml").exists(): + plugin_paths[n] = root +"#, + None, + Some(l) + )?; + Ok(l.get_item("plugin_paths").ok_or_else( || key_exception!("Error collecting plugin roots: expected 'plugin_paths' key."))?.extract()?) +} diff --git a/rust/pyapi/src/producer.rs b/rust/pyapi/src/producer.rs index 52feaca8..04c822b3 100644 --- a/rust/pyapi/src/producer.rs +++ b/rust/pyapi/src/producer.rs @@ -1,12 +1,12 @@ use pyo3::prelude::*; use std::path::{Path, PathBuf}; -#[pymodule] -pub fn producer(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "producer")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/prog_gen/flow_options.rs b/rust/pyapi/src/prog_gen/flow_options.rs index 52e9c42f..490a91c3 100644 --- a/rust/pyapi/src/prog_gen/flow_options.rs +++ b/rust/pyapi/src/prog_gen/flow_options.rs @@ -228,7 +228,7 @@ pub fn on_fail(fid: &FlowID, kwargs: Option<&PyDict>) -> Result<()> { if cont { flow_api::continue_on_fail(None)?; } - if let Ok(on_fail) = on_fail.cast_as::() { + if let Ok(on_fail) = on_fail.downcast::() { for (k, v) in on_fail { if let Ok(k) = k.extract::() { match k.as_str() { @@ -273,7 +273,7 @@ pub fn on_pass(fid: &FlowID, kwargs: Option<&PyDict>) -> Result<()> { if let Some(kwargs) = kwargs { if let Some(on_pass) = kwargs.get_item("on_pass") { let ref_id = flow_api::start_on_failed(fid.to_owned(), None)?; - if let Ok(on_pass) = on_pass.cast_as::() { + if let Ok(on_pass) = on_pass.downcast::() { for (k, v) in on_pass { if let Ok(k) = k.extract::() { match k.as_str() { diff --git a/rust/pyapi/src/prog_gen/interface.rs b/rust/pyapi/src/prog_gen/interface.rs index 7f236367..53fdaf6c 100644 --- a/rust/pyapi/src/prog_gen/interface.rs +++ b/rust/pyapi/src/prog_gen/interface.rs @@ -12,9 +12,10 @@ use regex::Regex; use std::path::PathBuf; use std::str::FromStr; -#[pymodule] -pub fn interface(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "interface")?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } @@ -76,7 +77,7 @@ impl PyInterface { } /// Add a test to the flow - #[args(kwargs = "**")] + #[pyo3(signature=(test_obj, **kwargs))] fn add_test(&self, test_obj: &PyAny, kwargs: Option<&PyDict>) -> PyResult<()> { let id = flow_options::get_flow_id(kwargs)?; let bin = flow_options::get_bin(kwargs)?; @@ -126,7 +127,7 @@ impl PyInterface { } /// Add a cz test to the flow - #[args(kwargs = "**")] + #[pyo3(signature=(test_obj, cz_setup, **kwargs))] fn add_cz_test( &self, test_obj: &PyAny, @@ -159,7 +160,7 @@ impl PyInterface { Ok(()) } - #[args(id = "None", kwargs = "**")] + #[pyo3(signature=(name, **kwargs))] fn group(&mut self, name: String, kwargs: Option<&PyDict>) -> PyResult { let id = flow_options::get_flow_id(kwargs)?; let (mut g, ref_ids) = flow_options::wrap_in_conditions(kwargs, true, || { @@ -175,7 +176,7 @@ impl PyInterface { Ok(r) } - #[args(jobs = "*", _kwargs = "**")] + #[pyo3(signature=(*jobs, **_kwargs))] fn if_job(&mut self, jobs: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(jobs) { Ok(v) => Ok(Condition::new(FlowCondition::IfJob(v))), @@ -183,7 +184,7 @@ impl PyInterface { } } - #[args(jobs = "*", _kwargs = "**")] + #[pyo3(signature=(*jobs, **_kwargs))] fn unless_job(&mut self, jobs: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(jobs) { Ok(v) => Ok(Condition::new(FlowCondition::UnlessJob(v))), @@ -191,7 +192,7 @@ impl PyInterface { } } - #[args(flags = "*", _kwargs = "**")] + #[pyo3(signature=(*flags, **_kwargs))] fn if_enable(&mut self, flags: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(flags) { Ok(v) => Ok(Condition::new(FlowCondition::IfEnable(v))), @@ -199,7 +200,7 @@ impl PyInterface { } } - #[args(flags = "*", _kwargs = "**")] + #[pyo3(signature=(*flags, **_kwargs))] fn unless_enable(&mut self, flags: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(flags) { Ok(v) => Ok(Condition::new(FlowCondition::UnlessEnable(v))), @@ -207,7 +208,7 @@ impl PyInterface { } } - #[args(flags = "*", _kwargs = "**")] + #[pyo3(signature=(*flags, **_kwargs))] fn if_enabled(&mut self, flags: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(flags) { Ok(v) => Ok(Condition::new(FlowCondition::IfEnable(v))), @@ -215,7 +216,7 @@ impl PyInterface { } } - #[args(flags = "*", _kwargs = "**")] + #[pyo3(signature=(*flags, **_kwargs))] fn unless_enabled(&mut self, flags: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(flags) { Ok(v) => Ok(Condition::new(FlowCondition::UnlessEnable(v))), @@ -223,7 +224,7 @@ impl PyInterface { } } - #[args(ids = "*", _kwargs = "**")] + #[pyo3(signature=(*ids, **_kwargs))] fn if_passed(&mut self, ids: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(ids) { Ok(v) => Ok(Condition::new(FlowCondition::IfPassed( @@ -233,7 +234,7 @@ impl PyInterface { } } - #[args(ids = "*", _kwargs = "**")] + #[pyo3(signature=(*ids, **_kwargs))] fn unless_passed(&mut self, ids: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(ids) { Ok(v) => Ok(Condition::new(FlowCondition::IfFailed( @@ -243,7 +244,7 @@ impl PyInterface { } } - #[args(ids = "*", _kwargs = "**")] + #[pyo3(signature=(*ids, **_kwargs))] fn if_failed(&mut self, ids: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(ids) { Ok(v) => Ok(Condition::new(FlowCondition::IfFailed( @@ -253,7 +254,7 @@ impl PyInterface { } } - #[args(ids = "*", _kwargs = "**")] + #[pyo3(signature=(*ids, **_kwargs))] fn unless_failed(&mut self, ids: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(ids) { Ok(v) => Ok(Condition::new(FlowCondition::IfPassed( @@ -263,7 +264,7 @@ impl PyInterface { } } - #[args(ids = "*", _kwargs = "**")] + #[pyo3(signature=(*ids, **_kwargs))] fn if_ran(&mut self, ids: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(ids) { Ok(v) => Ok(Condition::new(FlowCondition::IfRan( @@ -273,7 +274,7 @@ impl PyInterface { } } - #[args(ids = "*", _kwargs = "**")] + #[pyo3(signature=(*ids, **_kwargs))] fn unless_ran(&mut self, ids: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult { match extract_to_string_vec(ids) { Ok(v) => Ok(Condition::new(FlowCondition::UnlessRan( @@ -284,7 +285,7 @@ impl PyInterface { } /// Bin out - #[args(soft_bin = "None", softbin = "None", good = "false", kwargs = "**")] + #[pyo3(signature=(hard_bin, soft_bin=None, softbin=None, good=false, description=None, priority=None, **kwargs))] fn bin( &self, hard_bin: usize, @@ -326,7 +327,7 @@ impl PyInterface { .0) } - #[args(soft_bin = "None", softbin = "None", kwargs = "**")] + #[pyo3(signature=(hard_bin, soft_bin=None, softbin=None, description=None, priority=None, **kwargs))] fn good_die( &self, hard_bin: usize, @@ -347,7 +348,7 @@ impl PyInterface { ) } - #[args(soft_bin = "None", softbin = "None", kwargs = "**")] + #[pyo3(signature=(hard_bin, soft_bin=None, softbin=None, description=None, priority=None, **kwargs))] fn bad_die( &self, hard_bin: usize, diff --git a/rust/pyapi/src/prog_gen/mod.rs b/rust/pyapi/src/prog_gen/mod.rs index a125c1aa..76582093 100644 --- a/rust/pyapi/src/prog_gen/mod.rs +++ b/rust/pyapi/src/prog_gen/mod.rs @@ -25,12 +25,12 @@ use std::thread; pub use test::Test; pub use test_invocation::TestInvocation; -#[pymodule] -/// Implements the module _origen.prog_gen in Python -pub fn prog_gen(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_wrapped(wrap_pyfunction!(start_new_flow))?; - m.add_wrapped(wrap_pyfunction!(end_flow))?; - m.add_wrapped(wrap_pyfunction!(render))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "prog_gen")?; + subm.add_wrapped(wrap_pyfunction!(start_new_flow))?; + subm.add_wrapped(wrap_pyfunction!(end_flow))?; + subm.add_wrapped(wrap_pyfunction!(render))?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/registers.rs b/rust/pyapi/src/registers.rs index 2e5264e8..30f85a2f 100644 --- a/rust/pyapi/src/registers.rs +++ b/rust/pyapi/src/registers.rs @@ -11,20 +11,32 @@ use register::{Field, FieldEnum, ResetVal}; use origen::core::model::registers::register::Register; pub use register_collection::RegisterCollection; -#[pymodule] -/// Implements the module _origen.registers in Python -pub fn registers(_py: Python, m: &PyModule) -> PyResult<()> { - // Used to pass register field info from Python to Rust when defining regs - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - - m.add_wrapped(wrap_pyfunction!(create))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "registers")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_wrapped(wrap_pyfunction!(create))?; + m.add_submodule(subm)?; Ok(()) } /// Create a new register, returning its ID #[pyfunction] +#[pyo3(signature=( + address_block_id, + register_file_id, + name, + offset, + size, + bit_order, + fields, + filename=None, + lineno=None, + description=None, + resets=None, + access=None, +))] fn create( address_block_id: usize, register_file_id: Option, diff --git a/rust/pyapi/src/registers/address_block.rs b/rust/pyapi/src/registers/address_block.rs index 9d3118e8..ffa6ff07 100644 --- a/rust/pyapi/src/registers/address_block.rs +++ b/rust/pyapi/src/registers/address_block.rs @@ -245,9 +245,7 @@ impl AddressBlock { } } - fn __getattr__(&self, query: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn __getattr__(&self, py: Python, query: &str) -> PyResult { let dut = origen::dut(); if query == "regs" || query == "registers" { diff --git a/rust/pyapi/src/registers/bit_collection.rs b/rust/pyapi/src/registers/bit_collection.rs index b27d6d67..5ee68ccf 100644 --- a/rust/pyapi/src/registers/bit_collection.rs +++ b/rust/pyapi/src/registers/bit_collection.rs @@ -99,7 +99,7 @@ impl BitCollection { } /// Returns a bit collection containing the given bit indices - #[args(args = "*")] + #[pyo3(signature=(*args))] fn subset(&self, args: &PyTuple) -> PyResult { let mut bc = self.clone(); let mut bit_ids: Vec = Vec::new(); @@ -250,13 +250,13 @@ impl BitCollection { Ok(self.clone()) } - #[args(shift_in = "0")] + #[pyo3(signature=(shift_in=0))] fn shift_left(&self, shift_in: u8) -> PyResult { let dut = origen::dut(); Ok(self.materialize(&dut)?.shift_left(shift_in)?) } - #[args(shift_in = "0")] + #[pyo3(signature=(shift_in=0))] fn shift_right(&self, shift_in: u8) -> PyResult { let dut = origen::dut(); Ok(self.materialize(&dut)?.shift_right(shift_in)?) @@ -296,7 +296,7 @@ impl BitCollection { Ok(self.clone()) } - #[args(label = "None", symbol = "None", mask = "None")] + #[pyo3(signature=(label=None, symbol=None, mask=None))] fn set_overlay( &self, label: Option, @@ -315,7 +315,6 @@ impl BitCollection { Ok(self.clone()) } - // #[args(kwargs = "**")] fn set_capture(&self) -> PyResult { self.materialize(&origen::dut())?.capture(); Ok(self.clone()) @@ -359,7 +358,7 @@ impl BitCollection { } } - #[args(enable = "None", preset = "false")] + #[pyo3(signature=(enable=None, preset=false))] /// Trigger a verify transaction on the register pub fn _internal_verify( &self, @@ -381,7 +380,7 @@ impl BitCollection { Ok(()) } - #[args(enable = "None")] + #[pyo3(signature=(enable=None))] /// Equivalent to calling verify() but without invoking a register transaction at the end, /// i.e. it will set the verify flag on the bits and optionally apply an enable mask when /// deciding what bit flags to set. @@ -539,7 +538,7 @@ impl BitCollection { } } - #[args(args = "*")] + #[pyo3(signature=(*args))] fn try_fields(&self, args: &PyTuple) -> PyResult { let dut = origen::dut(); @@ -703,21 +702,20 @@ impl BitCollection { /// Locates the "closest" controller to this bitcollection. /// "Closest" being defined as the first subblock (or the DUT) which implements a "verify/write_register" /// that owns the memory map -> address block -> register -> bit collection <- self - fn controller_for(slf: &PyCell, operation: Option<&str>) -> PyResult { + fn controller_for(slf: &PyCell, py: Python, operation: Option<&str>) -> PyResult { let bc = slf.extract::>()?; - match bc._controller_for(operation)? { + match bc._controller_for(py, operation)? { Some(c) => Ok(c), None => { - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(py.None()) } } } - #[args(_kwargs = "**")] + #[pyo3(signature=(data=None, **_kwargs))] fn write( slf: &PyCell, + py: Python, data: Option, _kwargs: Option<&PyDict>, ) -> PyResult> { @@ -730,11 +728,9 @@ impl BitCollection { } // Attempt to find a controller which implements "write_register" - match bc._controller_for(Some("write_register"))? { + match bc._controller_for(py, Some("write_register"))? { Some(c) => { // If we've found a matching controller, write the register - let gil = Python::acquire_gil(); - let py = gil.python(); let args = PyTuple::new(py, &[slf.to_object(py)]); c.call_method(py, "write_register", args, None)?; }, @@ -746,9 +742,10 @@ impl BitCollection { Ok(slf.into()) } - #[args(_kwargs = "**")] + #[pyo3(signature=(data=None, **_kwargs))] fn verify( slf: &PyCell, + py: Python, data: Option, _kwargs: Option<&PyDict>, ) -> PyResult> { @@ -762,11 +759,9 @@ impl BitCollection { bc.set_verify_flag(None)?; // Attempt to find a controller which implements "verify_register" - match bc._controller_for(Some("verify_register"))? { + match bc._controller_for(py, Some("verify_register"))? { Some(c) => { // If we've found a matching controller, verify the register - let gil = Python::acquire_gil(); - let py = gil.python(); let args = PyTuple::new(py, &[slf.to_object(py)]); c.call_method(py, "verify_register", args, None)?; }, @@ -778,8 +773,8 @@ impl BitCollection { Ok(slf.into()) } - #[args(kwargs = "**")] - fn capture(slf: &PyCell, kwargs: Option<&PyDict>) -> PyResult> { + #[pyo3(signature=(**kwargs))] + fn capture(slf: &PyCell, py: Python, kwargs: Option<&PyDict>) -> PyResult> { // let bc = slf.extract::>()?; // bc.capture(); //slf.materialize(&origen::dut())?.capture(); @@ -790,11 +785,9 @@ impl BitCollection { let bc = slf.extract::>()?; // Attempt to find a controller which implements "capture_register" - match bc._controller_for(Some("capture_register"))? { + match bc._controller_for(py, Some("capture_register"))? { Some(c) => { // If we've found a matching controller, capture the register - let gil = Python::acquire_gil(); - let py = gil.python(); let args = PyTuple::new(py, &[slf.to_object(py)]); c.call_method(py, "capture_register", args, kwargs)?; } @@ -802,10 +795,8 @@ impl BitCollection { // No controller specifies a "capture_register" method, so fall back to // using verify with the capture bits set and no additional arguments which // may change its state. - match bc._controller_for(Some("verify_register"))? { + match bc._controller_for(py, Some("verify_register"))? { Some(c) => { - let gil = Python::acquire_gil(); - let py = gil.python(); let args = PyTuple::new(py, &[slf.to_object(py)]); c.call_method(py, "verify_register", args, None)?; } @@ -816,30 +807,6 @@ impl BitCollection { ))); } } - // match Self::verify(slf, None, None) { - // Ok(c) => {}, - // Err(e) => { - // let err = &e.pvalue; - // match err { - // pyo3::PyErrValue::Value(obj) =>{ - // let gil = Python::acquire_gil(); - // let py = gil.python(); - // let message = obj.extract::(py)?; - // if message.contains("No controller in the path") && message.contains("implements a 'verify_register'. Cannot verify this register.") { - // // Change the error message slightly as "capture_register" is also applicable - // return Err(PyErr::new::(format!( - // "No controller in the path {} implements a 'capture_register' or a 'verify_register'. Cannot capture this register.", - // bc.model_path()? - // ))); - // } else { - // // Some other error - // return Err(e); - // } - // }, - // _ => return Err(e) - // } - // } - // } } } @@ -939,9 +906,7 @@ impl BitCollection { } } - fn __getattr__(&self, query: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn __getattr__(&self, py: Python, query: &str) -> PyResult { let dut = origen::dut(); // .bits returns a Python list containing individual bit objects wrapped in BCs if query == "bits" { @@ -1000,7 +965,7 @@ impl BitCollection { Some(x) => Some(x.to_string()), None => None, }; - if let Ok(slice) = idx.cast_as::() { + if let Ok(slice) = idx.downcast::() { // Indices requires (what I think is) a max size. Should be plenty. let indices = slice.indices(8192)?; // TODO: Should this support step size? @@ -1025,7 +990,7 @@ impl BitCollection { let mut bc = self.smart_clone(bit_ids); bc.field = field; Ok(bc) - } else if let Ok(_int) = idx.cast_as::() { + } else if let Ok(_int) = idx.downcast::() { let i = idx.extract::().unwrap(); if i < self.bit_ids.len() { let mut bit_ids: Vec = Vec::new(); @@ -1042,7 +1007,7 @@ impl BitCollection { "The given bit index is out of range", )) } - } else if let Ok(_name) = idx.cast_as::() { + } else if let Ok(_name) = idx.downcast::() { if self.whole_reg { let name = idx.extract::<&str>().unwrap(); self.field(name) @@ -1134,7 +1099,7 @@ impl BitCollection { } } - fn _controller_for(&self, operation: Option<&str>) -> PyResult> { + fn _controller_for(&self, py: Python, operation: Option<&str>) -> PyResult> { let mut ops: Vec = vec![]; if let Some(s) = operation { ops.push(s.to_string()); @@ -1143,8 +1108,6 @@ impl BitCollection { ops.push("read_register".to_string()); } let mut mp = self.model_path()?; - let gil = Python::acquire_gil(); - let py = gil.python(); let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?.to_object(py))?; locals.set_item("dut", py.eval("origen.dut", Some(locals.clone()), None)?)?; @@ -1155,7 +1118,7 @@ impl BitCollection { if mp == "dut" { dut_checked = true; } - if ops.iter().all(|op| m.hasattr(op).unwrap()) { + if ops.iter().all(|op| m.hasattr(op.as_str()).unwrap()) { // Found the controller. Return this. return Ok(Some(m.to_object(py))); } else { diff --git a/rust/pyapi/src/registers/memory_map.rs b/rust/pyapi/src/registers/memory_map.rs index 204f79bd..b215612a 100644 --- a/rust/pyapi/src/registers/memory_map.rs +++ b/rust/pyapi/src/registers/memory_map.rs @@ -220,9 +220,7 @@ pub struct MemoryMap { #[pymethods] impl MemoryMap { - fn __getattr__(&self, query: &str) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn __getattr__(&self, py: Python, query: &str) -> PyResult { let dut = origen::dut(); // Calling .regs on an individual memory map returns the regs in its default diff --git a/rust/pyapi/src/registers/register.rs b/rust/pyapi/src/registers/register.rs index d9a4b0cd..4335c880 100644 --- a/rust/pyapi/src/registers/register.rs +++ b/rust/pyapi/src/registers/register.rs @@ -21,6 +21,17 @@ pub struct Field { #[pymethods] impl Field { #[new] + #[pyo3(signature=( + name, + description, + offset, + width, + access, + resets, + enums, + filename=None, + lineno=None, + ))] fn new( name: String, description: Option, diff --git a/rust/pyapi/src/services.rs b/rust/pyapi/src/services.rs index 7265562f..56046443 100644 --- a/rust/pyapi/src/services.rs +++ b/rust/pyapi/src/services.rs @@ -5,13 +5,11 @@ pub mod swd; use pyo3::prelude::*; -#[pymodule] -/// Implements the module _origen.services in Python -pub fn services(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - // m.add_class::()?; - +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "services")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/services/jtag.rs b/rust/pyapi/src/services/jtag.rs index 7cfa89a7..b6e2d13a 100644 --- a/rust/pyapi/src/services/jtag.rs +++ b/rust/pyapi/src/services/jtag.rs @@ -51,7 +51,7 @@ impl JTAG { Ok(()) } - #[args(width = "None", kwargs = "**")] + #[pyo3(signature=(bits_or_val, width=None, **kwargs))] fn write_dr( &self, bits_or_val: &PyAny, @@ -70,7 +70,7 @@ impl JTAG { Ok(self.clone()) } - #[args(width = "None", kwargs = "**")] + #[pyo3(signature=(bits_or_val, width=None, **kwargs))] fn verify_dr( &self, bits_or_val: &PyAny, @@ -89,7 +89,7 @@ impl JTAG { Ok(self.clone()) } - #[args(width = "None", kwargs = "**")] + #[pyo3(signature=(bits_or_val, width=None, **kwargs))] fn write_ir( &self, bits_or_val: &PyAny, @@ -108,7 +108,7 @@ impl JTAG { Ok(self.clone()) } - #[args(width = "None", kwargs = "**")] + #[pyo3(signature=(bits_or_val, width=None, **kwargs))] fn verify_ir( &self, bits_or_val: &PyAny, diff --git a/rust/pyapi/src/services/simple.rs b/rust/pyapi/src/services/simple.rs index da7d80f1..adad53c5 100644 --- a/rust/pyapi/src/services/simple.rs +++ b/rust/pyapi/src/services/simple.rs @@ -67,7 +67,7 @@ impl Simple { Ok(slf.into()) } - #[args(write_opts = "**")] + #[pyo3(signature=(bits_or_val, **write_opts))] fn write_register( slf: PyRef, bits_or_val: &PyAny, @@ -87,7 +87,7 @@ impl Simple { Ok(slf.into()) } - #[args(verify_opts = "**")] + #[pyo3(signature=(bits_or_val, **verify_opts))] fn verify_register( slf: PyRef, bits_or_val: &PyAny, diff --git a/rust/pyapi/src/services/swd.rs b/rust/pyapi/src/services/swd.rs index 862bc1c6..63a29584 100644 --- a/rust/pyapi/src/services/swd.rs +++ b/rust/pyapi/src/services/swd.rs @@ -32,7 +32,7 @@ impl SWD { Ok(self.clone()) } - #[args(kwargs = "**")] + #[pyo3(signature=(bits_or_val, **kwargs))] fn write_ap(&self, bits_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); let mut services = origen::services(); @@ -52,7 +52,7 @@ impl SWD { Ok(self.clone()) } - #[args(kwargs = "**")] + #[pyo3(signature=(bits_or_val, **kwargs))] fn verify_ap(&self, bits_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); let mut services = origen::services(); @@ -75,7 +75,7 @@ impl SWD { Ok(self.clone()) } - #[args(kwargs = "**")] + #[pyo3(signature=(bits_or_val, **kwargs))] fn write_dp(&self, bits_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); let mut services = origen::services(); @@ -95,7 +95,7 @@ impl SWD { Ok(self.clone()) } - #[args(kwargs = "**")] + #[pyo3(signature=(bits_or_val, **kwargs))] fn verify_dp(&self, bits_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); let mut services = origen::services(); diff --git a/rust/pyapi/src/standard_sub_blocks/arm_debug.rs b/rust/pyapi/src/standard_sub_blocks/arm_debug.rs index 23bb9313..c0b6150c 100644 --- a/rust/pyapi/src/standard_sub_blocks/arm_debug.rs +++ b/rust/pyapi/src/standard_sub_blocks/arm_debug.rs @@ -12,23 +12,19 @@ use pyo3::prelude::*; use pyo3::types::{PyAny, PyDict, PyTuple, PyType}; use pyo3::ToPyObject; -#[pymodule] -/// Implements the module _origen.standard_sub_blocks in Python and ties together -/// the PyAPI with the Rust backend. -/// Put another way, this is the Python-side controller for the backend-side model/controller. -pub fn arm_debug(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "arm_debug")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } /// Checks for an SWD attribute on the DUT /// Note: this must be run after the DUT has loaded or else it'll cause a lockup -fn check_for_swd() -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); +fn check_for_swd(py: Python) -> PyResult> { let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?.to_object(py))?; locals.set_item("builtins", py.import("builtins")?.to_object(py))?; @@ -47,9 +43,7 @@ fn check_for_swd() -> PyResult> { } } -fn check_for_jtag() -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); +fn check_for_jtag(py: Python) -> PyResult> { let locals = PyDict::new(py); locals.set_item("origen", py.import("origen")?.to_object(py))?; locals.set_item("builtins", py.import("builtins")?.to_object(py))?; @@ -90,14 +84,12 @@ impl ArmDebug { } #[classmethod] - fn model_init(_cls: &PyType, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { + fn model_init(_cls: &PyType, py: Python, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { crate::dut::PyDUT::ensure_pins("dut")?; - let swd_id = check_for_swd()?; - let jtag_id = check_for_jtag()?; + let swd_id = check_for_swd(py)?; + let jtag_id = check_for_jtag(py)?; // Create the Arm Debug instance - let gil = Python::acquire_gil(); - let py = gil.python(); let arm_debug_id; { let model_id = instance.getattr("model_id")?.extract::()?; @@ -168,6 +160,7 @@ impl ArmDebug { let ap_opts_dict = ap_opts.downcast::()?; Self::add_mem_ap( instance.downcast::>()?, + py, &ap_name.extract::()?, { if let Some(ap_addr) = ap_opts_dict.get_item("ap") { @@ -192,13 +185,11 @@ impl ArmDebug { fn add_mem_ap( slf: &PyCell, + py: Python, name: &str, ap: Option, csw_reset: Option, ) -> PyResult<()> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let args = PyTuple::new( py, &[name.to_object(py), "origen.arm_debug.mem_ap".to_object(py)], @@ -229,7 +220,6 @@ impl ArmDebug { } #[pyclass(subclass)] -#[pyo3(text_signature = "()")] #[allow(dead_code)] // Suppress the false dead-code warning for the "clone" derive #[derive(Clone)] struct DP { @@ -254,8 +244,8 @@ impl DP { } #[classmethod] - #[args(_block_options = "**")] - fn model_init(_cls: &PyType, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { + #[pyo3(signature=(instance, block_options=None))] + fn model_init(_cls: &PyType, py: Python, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { // Require an ArmDebug ID to tie this DP to an ArmDebug instance let arm_debug_id; if let Some(opts) = block_options { @@ -278,8 +268,6 @@ impl DP { )); } - let gil = Python::acquire_gil(); - let py = gil.python(); let obj = instance.to_object(py); let args = PyTuple::new(py, &["default".to_object(py), "default".to_object(py)]); let dp_id; @@ -295,7 +283,7 @@ impl DP { Ok(()) } - #[args(write_opts = "**")] + #[pyo3(signature=(bits, **_write_opts))] fn write_register(&self, bits: &PyAny, _write_opts: Option<&PyDict>) -> PyResult<()> { let bc = bits.extract::>()?; let dut = origen::dut(); @@ -305,7 +293,7 @@ impl DP { Ok(()) } - #[args(verify_opts = "**")] + #[pyo3(signature=(bits, **_verify_opts))] fn verify_register(&self, bits: &PyAny, _verify_opts: Option<&PyDict>) -> PyResult<()> { let bc = bits.extract::>()?; let dut = origen::dut(); @@ -333,7 +321,6 @@ impl DP { } #[pyclass(subclass)] -#[pyo3(text_signature = "()")] #[allow(dead_code)] // Suppress the false dead-code warning for the "clone" derive #[derive(Clone)] struct JtagDP { @@ -358,8 +345,8 @@ impl JtagDP { } #[classmethod] - #[args(_block_options = "**")] - fn model_init(_cls: &PyType, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { + #[pyo3(signature=(instance, block_options=None))] + fn model_init(_cls: &PyType, py: Python, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { // Require an ArmDebug ID to tie this DP to an ArmDebug instance let arm_debug_id; if let Some(opts) = block_options { @@ -368,22 +355,20 @@ impl JtagDP { arm_debug_id = id; } else { return Err(PyErr::new::( - "Subblock arm_debug.dp was given an arm_debug _id block option but could not extract it as an integer" + "Subblock jtagdp was given an arm_debug _id block option but could not extract it as an integer" )); } } else { return Err(PyErr::new::( - "Subblock arm_debug.dp was not given required block option 'arm_debug_id'", + "Subblock jtagdp was not given required block option 'arm_debug_id'", )); } } else { return Err(PyErr::new::( - "Subblock arm_debug.dp requires an arm_debug_id block option, but no block options were given." + "Subblock jtagdp requires an arm_debug_id block option, but no block options were given." )); } - let gil = Python::acquire_gil(); - let py = gil.python(); let obj = instance.to_object(py); let args = PyTuple::new(py, &["default".to_object(py), "default".to_object(py)]); let id; @@ -472,7 +457,7 @@ impl JtagDP { Ok(()) } - #[args(write_opts = "**")] + #[pyo3(signature=(bits, **write_opts))] fn write_register(&self, bits: &PyAny, write_opts: Option<&PyDict>) -> PyResult<()> { let dut = origen::dut(); let services = origen::services(); @@ -485,7 +470,7 @@ impl JtagDP { Ok(()) } - #[args(verify_opts = "**")] + #[pyo3(signature=(bits, **verify_opts))] fn verify_register(&self, bits: &PyAny, verify_opts: Option<&PyDict>) -> PyResult<()> { let dut = origen::dut(); let services = origen::services(); @@ -517,7 +502,7 @@ impl MemAP { } #[classmethod] - fn model_init(_cls: &PyType, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { + fn model_init(_cls: &PyType, py: Python, instance: &PyAny, block_options: Option<&PyDict>) -> PyResult<()> { // Require an ArmDebug ID to tie this DP to an ArmDebug instance let arm_debug_id; if let Some(opts) = block_options { @@ -552,8 +537,6 @@ impl MemAP { addr = 0; } - let gil = Python::acquire_gil(); - let py = gil.python(); let obj = instance.to_object(py); let args = PyTuple::new(py, &["default".to_object(py), "default".to_object(py)]); let mem_ap_id; @@ -574,7 +557,7 @@ impl MemAP { /// a BitCollection). /// Assumes that all posturing has been completed - that is, the bits' data, overlay /// status, etc. is current. - #[args(write_opts = "**")] + #[pyo3(signature=(bits, **write_opts))] fn write_register(&self, bits: &PyAny, write_opts: Option<&PyDict>) -> PyResult<()> { let dut = origen::dut(); let services = origen::services(); @@ -589,7 +572,7 @@ impl MemAP { Ok(()) } - #[args(verify_opts = "**")] + #[pyo3(signature=(bits, **verify_opts))] fn verify_register(&self, bits: &PyAny, verify_opts: Option<&PyDict>) -> PyResult<()> { let dut = origen::dut(); let services = origen::services(); @@ -604,7 +587,7 @@ impl MemAP { Ok(()) } - #[args(capture_opts = "**")] + #[pyo3(signature=(bits, **capture_opts))] fn capture_register(&self, bits: &PyAny, capture_opts: Option<&PyDict>) -> PyResult<()> { let dut = origen::dut(); let services = origen::services(); diff --git a/rust/pyapi/src/standard_sub_blocks/mod.rs b/rust/pyapi/src/standard_sub_blocks/mod.rs index a34dacea..c153c487 100644 --- a/rust/pyapi/src/standard_sub_blocks/mod.rs +++ b/rust/pyapi/src/standard_sub_blocks/mod.rs @@ -1,14 +1,10 @@ mod arm_debug; use pyo3::prelude::*; -use pyo3::wrap_pymodule; - -use crate::standard_sub_blocks::arm_debug::__PYO3_PYMODULE_DEF_ARM_DEBUG; - -#[pymodule] -/// Implements the module _origen.standard_sub_blocks in Python -pub fn standard_sub_blocks(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_wrapped(wrap_pymodule!(arm_debug))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "standard_sub_blocks")?; + arm_debug::define(py, subm)?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/tester.rs b/rust/pyapi/src/tester.rs index e7afbd3b..0ad6b680 100644 --- a/rust/pyapi/src/tester.rs +++ b/rust/pyapi/src/tester.rs @@ -9,9 +9,13 @@ use pyo3::prelude::*; use pyo3::types::{PyAny, PyDict, PyTuple}; use std::collections::HashMap; -#[pymodule] -pub fn tester(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "tester")?; + subm.add_class::()?; + pyapi_metal::alias_method_apply_to_set!(subm, "PyTester", "timeset"); + pyapi_metal::alias_method_apply_to_set!(subm, "PyTester", "pin_header"); + + m.add_submodule(subm)?; Ok(()) } @@ -138,11 +142,9 @@ impl PyTester { /// * :meth:`set_timeset` /// * :class:`_origen.dut.timesets.Timeset` /// * :ref:`Timing ` - fn get_timeset(&self) -> PyResult { + fn get_timeset(&self, py: Python) -> PyResult { let tester = origen::tester(); let dut = origen::dut(); - let gil = Python::acquire_gil(); - let py = gil.python(); if let Some(t) = tester.get_timeset(&dut) { Ok(Py::new( py, @@ -160,7 +162,7 @@ impl PyTester { #[setter] // Note - do not add doc strings here. Add to get_timeset above. - fn timeset(&self, timeset: &PyAny) -> PyResult<()> { + fn timeset(&self, py: Python, timeset: &PyAny) -> PyResult<()> { let (model_id, timeset_name); // If the timeset is a string, assume its a timeset name on the DUT. @@ -175,11 +177,9 @@ impl PyTester { let mut tester = origen::TESTER.lock().unwrap(); tester.clear_timeset()?; } - self.issue_callbacks("clear_timeset")?; + self.issue_callbacks(py, "clear_timeset")?; return Ok(()); } else if timeset.get_type().name()?.to_string() == "Timeset" { - let gil = Python::acquire_gil(); - let py = gil.python(); let obj = timeset.to_object(py); model_id = obj .getattr(py, "__origen__model_id__")? @@ -196,7 +196,7 @@ impl PyTester { let dut = origen::DUT.lock().unwrap(); tester.set_timeset(&dut, model_id, ×et_name)?; } - self.issue_callbacks("set_timeset")?; + self.issue_callbacks(py, "set_timeset")?; } Ok(()) } @@ -216,17 +216,15 @@ impl PyTester { /// * :meth:`timeset` /// * :class:`_origen.dut.timesets.Timeset` /// * :ref:`Timing ` - fn set_timeset(&self, timeset: &PyAny) -> PyResult { - self.timeset(timeset)?; - self.get_timeset() + fn apply_timeset(&self, py: Python, timeset: &PyAny) -> PyResult { + self.timeset(py, timeset)?; + self.get_timeset(py) } #[getter] - fn get_pin_header(&self) -> PyResult { + fn get_pin_header(&self, py: Python) -> PyResult { let tester = origen::tester(); let dut = origen::dut(); - let gil = Python::acquire_gil(); - let py = gil.python(); if let Some(header) = tester.get_pin_header(&dut) { Ok(Py::new( @@ -244,7 +242,7 @@ impl PyTester { } #[setter] - fn pin_header(&self, pin_header: &PyAny) -> PyResult<()> { + fn pin_header(&self, py: Python, pin_header: &PyAny) -> PyResult<()> { let (model_id, pin_header_name); if pin_header.get_type().name()?.to_string() == "NoneType" { @@ -252,11 +250,9 @@ impl PyTester { let mut tester = origen::TESTER.lock().unwrap(); tester.clear_pin_header()?; } - self.issue_callbacks("clear_pin_header")?; + self.issue_callbacks(py, "clear_pin_header")?; return Ok(()); } else if pin_header.get_type().name()?.to_string() == "PinHeader" { - let gil = Python::acquire_gil(); - let py = gil.python(); let obj = pin_header.to_object(py); model_id = obj .getattr(py, "__origen__model_id__")? @@ -272,14 +268,14 @@ impl PyTester { let dut = origen::DUT.lock().unwrap(); tester.set_pin_header(&dut, model_id, &pin_header_name)?; } - self.issue_callbacks("set_pin_header")?; + self.issue_callbacks(py, "set_pin_header")?; } Ok(()) } - fn set_pin_header(&self, pin_header: &PyAny) -> PyResult { - self.pin_header(pin_header)?; - self.get_pin_header() + fn apply_pin_header(&self, py: Python, pin_header: &PyAny) -> PyResult { + self.pin_header(py, pin_header)?; + self.get_pin_header(py) } /// cc(comment: str) -> self @@ -295,12 +291,12 @@ impl PyTester { /// -------- /// * {{ link_to('prog-gen:comments', 'Commenting pattern source') }} /// * {{ link_to('pat-gen:comments', 'Commenting program source') }} - fn cc(slf: PyRef, comment: &str) -> PyResult> { + fn cc(slf: PyRef, py: Python, comment: &str) -> PyResult> { { let mut tester = origen::tester(); tester.cc(&comment)?; } - slf.issue_callbacks("cc")?; + slf.issue_callbacks(py, "cc")?; Ok(slf.into()) } @@ -324,7 +320,7 @@ impl PyTester { Ok(tester.end_pattern()?) } - fn issue_callbacks(&self, func: &str) -> PyResult<()> { + fn issue_callbacks(&self, py: Python, func: &str) -> PyResult<()> { // Get the current targeted testers let targets; { @@ -341,8 +337,6 @@ impl PyTester { Some(inst) => { // The tester here is a PyObject - a handle on the class itself. // Instantiate it and call its render method with the AST. - let gil = Python::acquire_gil(); - let py = gil.python(); let last_node = TEST.get(0).unwrap().to_pickle(); let args = PyTuple::new(py, &[func.to_object(py), last_node.to_object(py)]); @@ -370,8 +364,8 @@ impl PyTester { } /// cycle(**kwargs) -> self - #[args(kwargs = "**")] - fn cycle(slf: PyRef, kwargs: Option<&PyDict>) -> PyResult> { + #[pyo3(signature=(**kwargs))] + fn cycle(slf: PyRef, py: Python, kwargs: Option<&PyDict>) -> PyResult> { { let mut tester = origen::tester(); let mut repeat = None; @@ -382,28 +376,27 @@ impl PyTester { } tester.cycle(repeat)?; } - slf.issue_callbacks("cycle")?; + slf.issue_callbacks(py, "cycle")?; Ok(slf.into()) } - fn repeat(slf: PyRef, count: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn repeat(slf: PyRef, py: Python, count: usize) -> PyResult> { let kwargs = PyDict::new(py); kwargs.set_item("repeat", count)?; - Self::cycle(slf, Some(&kwargs)) + Self::cycle(slf, py, Some(&kwargs)) } - #[args( - label = "None", - symbol = "None", - cycles = "None", - mask = "None", - pins = "None" - )] + #[pyo3(signature=( + label = None, + symbol = None, + pins = None, + cycles = None, + mask = None, + ))] fn overlay( slf: PyRef, + py: Python, label: Option, symbol: Option, pins: Option>, @@ -424,13 +417,14 @@ impl PyTester { let tester = origen::tester(); tester.overlay(&origen::Overlay::new(label, symbol, cycles, mask, pin_ids)?)?; } - slf.issue_callbacks("overlay")?; + slf.issue_callbacks(py, "overlay")?; Ok(slf.into()) } - #[args(symbol = "None", cycles = "None", mask = "None", pins = "None")] + #[pyo3(signature=(symbol=None, cycles=None, mask=None, pins=None))] fn capture( slf: PyRef, + py: Python, symbol: Option, cycles: Option, mask: Option, @@ -450,14 +444,12 @@ impl PyTester { let tester = origen::tester(); tester.capture(&origen::Capture::new(symbol, cycles, mask, pin_ids)?)?; } - slf.issue_callbacks("capture")?; + slf.issue_callbacks(py, "capture")?; Ok(slf.into()) } - fn register_tester(&mut self, g: &PyAny) -> PyResult<()> { + fn register_tester(&mut self, py: Python, g: &PyAny) -> PyResult<()> { let mut tester = origen::tester(); - let gil = Python::acquire_gil(); - let py = gil.python(); let obj = g.to_object(py); let mut n = obj.getattr(py, "__module__")?.extract::(py)?; @@ -471,8 +463,8 @@ impl PyTester { Ok(()) } - #[args(testers = "*")] - fn target(&mut self, testers: &PyTuple) -> PyResult> { + #[pyo3(signature=(*testers))] + fn target(&mut self, py: Python, testers: &PyTuple) -> PyResult> { if testers.len() > 0 { let mut tester = origen::tester(); for g in testers.iter() { @@ -480,9 +472,6 @@ impl PyTester { if let Ok(name) = g.extract::() { tester.target(SupportedTester::new(&name)?)?; } else { - let gil = Python::acquire_gil(); - let py = gil.python(); - let obj = g.to_object(py); let mut n = obj.getattr(py, "__module__")?.extract::(py)?; n.push_str(&format!( @@ -517,8 +506,8 @@ impl PyTester { /// in case they are useful in future. /// Continue on fail means that any errors will be logged but Origen will continue, if false /// it will blow up and immediately return an error to Python. - #[args(continue_on_fail = false)] - fn render_pattern(&self, continue_on_fail: bool) -> PyResult> { + #[pyo3(signature=(continue_on_fail=false))] + fn render_pattern(&self, py: Python, continue_on_fail: bool) -> PyResult> { if origen::LOGGER.has_keyword("show_unprocessed_ast") { origen::LOGGER.info("Showing Unprocessed AST"); origen::LOGGER.info(&format!("{:?}", origen::TEST)); @@ -537,8 +526,6 @@ impl PyTester { Some(inst) => { // The tester here is a PyObject - a handle on the class itself. // Instantiate it and call its render method with the AST. - let gil = Python::acquire_gil(); - let py = gil.python(); let _pat = inst.call_method0(py, "render_pattern")?; // TODO - How do we convert this to a path to do the diffing? } diff --git a/rust/pyapi/src/tester_apis/igxl/prog_gen_api.rs b/rust/pyapi/src/tester_apis/igxl/prog_gen_api.rs index 87526eae..9294182e 100644 --- a/rust/pyapi/src/tester_apis/igxl/prog_gen_api.rs +++ b/rust/pyapi/src/tester_apis/igxl/prog_gen_api.rs @@ -17,7 +17,7 @@ pub struct Patset { #[pymethods] impl IGXL { - #[args(library = "None", kwargs = "**")] + #[pyo3(signature=(name, template, library=None, **kwargs))] fn new_test_instance( &mut self, name: String, @@ -43,13 +43,13 @@ impl IGXL { Ok(t) } - #[args(kwargs = "**")] + #[pyo3(signature=(**kwargs))] pub fn new_flow_line(&mut self, kwargs: Option<&PyDict>) -> PyResult { let t = TestInvocation::new("_".to_owned(), self.tester.to_owned(), kwargs)?; Ok(t) } - #[args(pattern = "None", patterns = "None")] + #[pyo3(signature=(name, pattern=None, patterns=None))] fn new_patset( &mut self, name: String, @@ -71,7 +71,7 @@ impl IGXL { } // Set the cpu wait flags for the given test instance - #[args(flags = "*")] + #[pyo3(signature=(test_instance, *flags))] fn set_wait_flags(&mut self, test_instance: &Test, flags: &PyTuple) -> PyResult<()> { let mut clean_flags: Vec = vec![]; for fl in flags { diff --git a/rust/pyapi/src/tester_apis/mod.rs b/rust/pyapi/src/tester_apis/mod.rs index 01bc4df3..fb8494bc 100644 --- a/rust/pyapi/src/tester_apis/mod.rs +++ b/rust/pyapi/src/tester_apis/mod.rs @@ -7,9 +7,10 @@ pub use v93k::V93K; use pyo3::prelude::*; -#[pymodule] -pub fn tester_apis(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "tester_apis")?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/tester_apis/v93k/prog_gen_api.rs b/rust/pyapi/src/tester_apis/v93k/prog_gen_api.rs index dca09fda..bd1894d8 100644 --- a/rust/pyapi/src/tester_apis/v93k/prog_gen_api.rs +++ b/rust/pyapi/src/tester_apis/v93k/prog_gen_api.rs @@ -6,7 +6,7 @@ use pyo3::types::PyDict; #[pymethods] impl V93K { - #[args(kwargs = "**")] + #[pyo3(signature=(name, library, **kwargs))] fn new_test_method( &mut self, name: String, @@ -17,7 +17,7 @@ impl V93K { Ok(t) } - #[args(kwargs = "**")] + #[pyo3(signature=(name, **kwargs))] fn new_test_suite( &mut self, name: String, diff --git a/rust/pyapi/src/timesets.rs b/rust/pyapi/src/timesets.rs index 652b242c..340e61a4 100644 --- a/rust/pyapi/src/timesets.rs +++ b/rust/pyapi/src/timesets.rs @@ -24,27 +24,29 @@ use timeset_container::{ EventContainer, TimesetContainer, WaveContainer, WaveGroupContainer, WavetableContainer, }; -#[pymodule] -pub fn timesets(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "timesets")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } #[pymethods] impl PyDUT { - #[args(kwargs = "**")] + #[pyo3(signature=(model_id, name, period, **kwargs))] fn add_timeset( &self, + py: Python, model_id: usize, name: &str, period: &PyAny, @@ -88,23 +90,17 @@ impl PyDUT { }, )?; - let gil = Python::acquire_gil(); - let py = gil.python(); let model = dut.get_mut_model(model_id)?; Ok(pytimeset!(py, model, model_id, name)?) } - fn timeset(&self, model_id: usize, name: &str) -> PyResult { + fn timeset(&self, py: Python, model_id: usize, name: &str) -> PyResult { let mut dut = DUT.lock().unwrap(); let model = dut.get_mut_model(model_id)?; - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(pytimeset_or_pynone!(py, model, model_id, name)) } - fn timesets(&self, model_id: usize) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn timesets(&self, py: Python, model_id: usize) -> PyResult> { Ok(pytimeset_container!(py, model_id)) } } diff --git a/rust/pyapi/src/timesets/timeset.rs b/rust/pyapi/src/timesets/timeset.rs index 7d9b6eba..1525467e 100644 --- a/rust/pyapi/src/timesets/timeset.rs +++ b/rust/pyapi/src/timesets/timeset.rs @@ -188,12 +188,10 @@ impl Timeset { } #[getter] - fn get_default_period(&self) -> PyResult { + fn get_default_period(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let timeset = dut._get_timeset(self.model_id, &self.name)?; - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(match timeset.default_period { Some(p) => p.to_object(py), None => py.None(), @@ -210,11 +208,9 @@ impl Timeset { #[allow(non_snake_case)] #[getter] - fn get___period__(&self) -> PyResult { + fn get___period__(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let timeset = dut._get_timeset(self.model_id, &self.name)?; - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(match ×et.period_as_string { Some(p) => p.clone().to_object(py), None => py.None(), @@ -222,18 +218,16 @@ impl Timeset { } #[getter] - fn wavetables(&self) -> PyResult> { + fn wavetables(&self, py: Python) -> PyResult> { let t_id; { t_id = self.get_origen_id()?; } - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(pywavetable_container!(py, self.model_id, t_id, &self.name)) } - #[args(_kwargs = "**")] - fn add_wavetable(&self, name: &str, _kwargs: Option<&PyDict>) -> PyResult { + #[pyo3(signature=(name, **_kwargs))] + fn add_wavetable(&self, py: Python, name: &str, _kwargs: Option<&PyDict>) -> PyResult { let mut dut = DUT.lock().unwrap(); let t_id; { @@ -241,14 +235,12 @@ impl Timeset { } dut.create_wavetable(t_id, name)?; - let gil = Python::acquire_gil(); - let py = gil.python(); let tset = dut._get_timeset(self.model_id, &self.name).unwrap(); Ok(pywavetable!(py, tset, t_id, name)?) } #[getter] - fn symbol_map(&self) -> PyResult { + fn symbol_map(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let t_id; { @@ -256,8 +248,6 @@ impl Timeset { } let tester = origen::tester(); - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(Py::new( py, crate::timesets::timeset::SymbolMap { @@ -275,7 +265,7 @@ impl Timeset { } #[getter] - fn symbol_maps(&self) -> PyResult> { + fn symbol_maps(&self, py: Python) -> PyResult> { let dut = DUT.lock().unwrap(); let t = dut._get_timeset(self.model_id, &self.name).unwrap(); let t_id; @@ -283,8 +273,6 @@ impl Timeset { t_id = t.id; } - let gil = Python::acquire_gil(); - let py = gil.python(); let retn = t .pin_action_resolvers .keys() @@ -330,8 +318,8 @@ pub struct Wavetable { #[pymethods] impl Wavetable { - #[args(_kwargs = "**")] - fn add_waves(&self, name: &str, _kwargs: Option<&PyDict>) -> PyResult { + #[pyo3(signature=(name, **_kwargs))] + fn add_waves(&self, py: Python, name: &str, _kwargs: Option<&PyDict>) -> PyResult { let mut dut = DUT.lock().unwrap(); let w_id; { @@ -339,25 +327,21 @@ impl Wavetable { } dut.create_wave_group(w_id, name, Option::None)?; - let gil = Python::acquire_gil(); - let py = gil.python(); let wt = dut.get_wavetable(self.timeset_id, &self.name).unwrap(); Ok(pywave_group!(py, wt, name)?) } - #[args(_kwargs = "**")] - fn add_wave(&self, name: &str, _kwargs: Option<&PyDict>) -> PyResult { - self.add_waves(name, _kwargs) + #[pyo3(signature=(name, **_kwargs))] + fn add_wave(&self, py: Python, name: &str, _kwargs: Option<&PyDict>) -> PyResult { + self.add_waves(py, name, _kwargs) } #[getter] - fn get_waves(&self) -> PyResult> { + fn get_waves(&self, py: Python) -> PyResult> { let w_id; { w_id = self.get_origen_id()?; } - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(pywave_group_container!( py, self.model_id, @@ -391,24 +375,20 @@ impl Wavetable { /// } /// } /// - fn applied_waves(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn applied_waves(&self, py: Python) -> PyResult { let empty: [PyObject; 0] = []; let t = PyTuple::new(py, &empty); - self.applied_waves_for(t, None) + self.applied_waves_for(py, t, None) } /// Same as :meth:`applied_waves` but supports internal filtering of the return values. - #[args(pins = "*")] + #[pyo3(signature=(*pins, indicators))] fn applied_waves_for( &self, + py: Python, pins: &PyTuple, indicators: Option>, ) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let dut = DUT.lock().unwrap(); let wt = dut._get_wavetable(self.timeset_id, &self.name)?; let waves = wt.applied_waves( @@ -420,9 +400,7 @@ impl Wavetable { } #[getter] - fn get_symbol_map(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn get_symbol_map(&self, py: Python) -> PyResult { let tester = origen::tester(); match tester.focused_tester_name() { Some(name) => Ok(Py::new(py, SymbolMap::new(self.timeset_id, name)) @@ -442,13 +420,11 @@ impl Wavetable { // Evaluates and returns the period. // Returns None if no period was specified or an error if it could not be evaluated. #[getter] - pub fn get_period(&self) -> PyResult { + pub fn get_period(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let wt = dut.get_wavetable(self.timeset_id, &self.name); let p = wt.unwrap().eval(Option::None)?; - let gil = Python::acquire_gil(); - let py = gil.python(); match p { Some(_p) => Ok(_p.to_object(py)), None => Ok(py.None()), @@ -476,13 +452,11 @@ impl Wavetable { // Returns the period as a string before evaluation. #[allow(non_snake_case)] #[getter] - pub fn get___period__(&self) -> PyResult { + pub fn get___period__(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let wt = dut.get_wavetable(self.timeset_id, &self.name); let p = &wt.unwrap().period; - let gil = Python::acquire_gil(); - let py = gil.python(); match p { Some(_p) => Ok(_p.to_object(py)), None => Ok(py.None()), @@ -517,8 +491,8 @@ pub struct WaveGroup { #[pymethods] impl WaveGroup { - #[args(_kwargs = "**")] - fn add_wave(&self, name: &str, _kwargs: Option<&PyDict>) -> PyResult { + #[pyo3(signature=(name, **_kwargs))] + fn add_wave(&self, py: Python, name: &str, _kwargs: Option<&PyDict>) -> PyResult { let mut dut = DUT.lock().unwrap(); let wgrp_id; { @@ -541,20 +515,16 @@ impl WaveGroup { } dut.create_wave(wgrp_id, name, derived_from)?; - let gil = Python::acquire_gil(); - let py = gil.python(); let wgrp = dut.get_wave_group(self.wavetable_id, &self.name).unwrap(); Ok(pywave!(py, wgrp, name)?) } #[getter] - fn get_waves(&self) -> PyResult> { + fn get_waves(&self, py: Python) -> PyResult> { let wgrp_id; { wgrp_id = self.get_origen_id()?; } - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(pywave_container!( py, self.model_id, @@ -603,9 +573,7 @@ pub struct Wave { #[pymethods] impl Wave { #[getter] - fn get_events(&self) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn get_events(&self, py: Python) -> PyResult> { let wave_id; { wave_id = self.get_origen_id()?; @@ -621,8 +589,8 @@ impl Wave { )) } - #[args(event = "**")] - fn push_event(&self, event: Option<&PyDict>) -> PyResult { + #[pyo3(signature=(**event))] + fn push_event(&self, py: Python, event: Option<&PyDict>) -> PyResult { let mut dut = DUT.lock().unwrap(); let (w_id, e_index); { @@ -697,9 +665,6 @@ impl Wave { } // Return the newly created event - let gil = Python::acquire_gil(); - let py = gil.python(); - let w = dut.get_wave(self.wave_group_id, &self.name).unwrap(); Ok(pyevent!(py, w, e_index)?) } @@ -720,11 +685,9 @@ impl Wave { } #[getter] - fn get_applied_to(&self) -> PyResult> { + fn get_applied_to(&self, py: Python) -> PyResult> { let dut = DUT.lock().unwrap(); let w = dut.get_wave(self.wave_group_id, &self.name).unwrap(); - let gil = Python::acquire_gil(); - let py = gil.python(); let mut pins: Vec = vec![]; for p in w.applied_pin_ids.iter() { @@ -740,8 +703,8 @@ impl Wave { Ok(pins) } - #[args(pins = "*")] - fn apply_to(&self, pins: Vec) -> PyResult { + #[pyo3(signature=(*pins))] + fn apply_to(&self, py: Python, pins: Vec) -> PyResult { let mut dut = DUT.lock().unwrap(); let wid; { @@ -754,8 +717,6 @@ impl Wave { pins.iter().map(|pin| (0, pin.clone())).collect(); dut.apply_wave_id_to_pins(wid, &pins_with_model_id)?; - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(Py::new( py, crate::timesets::timeset::Wave { @@ -873,12 +834,10 @@ impl Event { } #[getter] - pub fn unit(&self) -> PyResult { + pub fn unit(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let e = dut.get_event(self.wave_id, self.index).unwrap(); - let gil = Python::acquire_gil(); - let py = gil.python(); match &e.unit { Some(unit) => Ok(unit.clone().to_object(py)), None => Ok(py.None()), @@ -886,12 +845,9 @@ impl Event { } #[getter] - pub fn at(&self) -> PyResult { + pub fn at(&self, py: Python) -> PyResult { let dut = DUT.lock().unwrap(); let e = dut.get_event(self.wave_id, self.index).unwrap(); - - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(e.eval(&dut, Option::None)?.to_object(py)) } @@ -1004,9 +960,7 @@ impl SymbolMap { .collect::>()) } - fn get(&self, action: &PyAny) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn get(&self, py: Python, action: &PyAny) -> PyResult { match self.__getitem__(action) { Ok(a) => Ok(a.into_py(py)), Err(_) => Ok(py.None()), @@ -1037,7 +991,7 @@ impl SymbolMap { } } - fn for_target(&self, target: String) -> PyResult { + fn for_target(&self, py: Python, target: String) -> PyResult { let dut = DUT.lock().unwrap(); { let t = &dut.timesets[self.timeset_id]; @@ -1050,8 +1004,6 @@ impl SymbolMap { } } - let gil = Python::acquire_gil(); - let py = gil.python(); Ok(Py::new( py, crate::timesets::timeset::SymbolMap { diff --git a/rust/pyapi/src/utility/caller.rs b/rust/pyapi/src/utility/caller.rs index cde24b1d..85a04b94 100644 --- a/rust/pyapi/src/utility/caller.rs +++ b/rust/pyapi/src/utility/caller.rs @@ -1,3 +1,4 @@ +// TODO any of this used/needed? //! Provides helper functions to get the caller information from Python #![allow(dead_code)] @@ -114,33 +115,33 @@ pub fn stack() -> Option> { } fn _get_stack(max_depth: Option, filter: Filter) -> Result, PyErr> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let inspect = PyModule::import(py, "inspect")?; - let stack: Vec> = inspect.getattr("stack")?.call0()?.extract()?; - let mut frames: Vec = vec![]; - for f in stack { - let filename: String = f[1].extract()?; - let include = match filter { - Filter::None => true, - Filter::StartsWith(s) => filename.starts_with(s), - Filter::Contains(s) => filename.contains(s), - }; - if include { - frames.push(FrameInfo { - filename: filename, - lineno: f[2].extract()?, - function: f[3].extract()?, - code_context: f[4].extract()?, - index: f[5].extract()?, - }); + Python::with_gil(|py| { + let inspect = PyModule::import(py, "inspect")?; + let stack: Vec> = inspect.getattr("stack")?.call0()?.extract()?; + let mut frames: Vec = vec![]; + for f in stack { + let filename: String = f[1].extract()?; + let include = match filter { + Filter::None => true, + Filter::StartsWith(s) => filename.starts_with(s), + Filter::Contains(s) => filename.contains(s), + }; + if include { + frames.push(FrameInfo { + filename: filename, + lineno: f[2].extract()?, + function: f[3].extract()?, + code_context: f[4].extract()?, + index: f[5].extract()?, + }); - if let Some(x) = max_depth { - if x == frames.len() { - break; + if let Some(x) = max_depth { + if x == frames.len() { + break; + } } } } - } - Ok(frames) + Ok(frames) + }) } diff --git a/rust/pyapi/src/utility/ldaps.rs b/rust/pyapi/src/utility/ldaps.rs index 403d4ad6..f9c9e42f 100644 --- a/rust/pyapi/src/utility/ldaps.rs +++ b/rust/pyapi/src/utility/ldaps.rs @@ -4,7 +4,7 @@ use pyapi_metal::utils::ldap::import_frontend_ldap; use pyo3::prelude::*; use pyo3::wrap_pyfunction; -pub fn define(m: &PyModule) -> PyResult<()> { +pub fn define(_py: Python, m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(ldaps))?; m.add_wrapped(wrap_pyfunction!(boot_ldaps))?; Ok(()) diff --git a/rust/pyapi/src/utility/linter/mod.rs b/rust/pyapi/src/utility/linter/mod.rs index 18f75a8c..2924302f 100644 --- a/rust/pyapi/src/utility/linter/mod.rs +++ b/rust/pyapi/src/utility/linter/mod.rs @@ -2,7 +2,8 @@ pub mod _frontend; use pyo3::prelude::*; -#[pymodule] -pub fn linter(_py: Python, _m: &PyModule) -> PyResult<()> { +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "linter")?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/utility/location.rs b/rust/pyapi/src/utility/location.rs index 9f0ccdeb..16e804c7 100644 --- a/rust/pyapi/src/utility/location.rs +++ b/rust/pyapi/src/utility/location.rs @@ -26,9 +26,7 @@ impl Location { /// str: URL as a ``str``, if the Location points to a URL /// None: Otherwise #[getter] - fn url(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn url(&self, py: Python) -> PyResult { Ok(match self.location.url() { Some(url) => url.to_object(py), None => py.None(), @@ -45,9 +43,7 @@ impl Location { /// str: Repo URL as a ``str``, if the Location points to a Git repo /// None: Otherwise #[getter] - fn git(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn git(&self, py: Python) -> PyResult { Ok(match self.location.git() { Some(git) => git.to_object(py), None => py.None(), @@ -60,9 +56,7 @@ impl Location { /// str: Repo URL as a ``str``, if the Location points to a Git repo via HTTPS /// None: Otherwise #[getter] - fn git_https(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn git_https(&self, py: Python) -> PyResult { Ok(match self.location.git_https() { Some(git) => git.to_object(py), None => py.None(), @@ -75,9 +69,7 @@ impl Location { /// str: Repo URL as a ``str``, if the Location points to a Git repo via SSH /// None: Otherwise #[getter] - fn git_ssh(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn git_ssh(&self, py: Python) -> PyResult { Ok(match self.location.git_ssh() { Some(git) => git.to_object(py), None => py.None(), @@ -90,9 +82,7 @@ impl Location { /// pathlib.Path: Repo URL as a |pathlib.Path| object, if the Location points to a local path. /// None: Otherwise #[getter] - fn path(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn path(&self, py: Python) -> PyResult { Ok(match self.location.path() { Some(_path) => pypath!(py, self.location.location), None => py.None(), diff --git a/rust/pyapi/src/utility/mod.rs b/rust/pyapi/src/utility/mod.rs index e8668ba2..d87ad95e 100644 --- a/rust/pyapi/src/utility/mod.rs +++ b/rust/pyapi/src/utility/mod.rs @@ -11,14 +11,12 @@ pub mod revision_control; pub mod sessions; pub mod transaction; pub mod unit_testers; -pub mod version; pub mod website; use location::Location; use pyo3::prelude::*; -use pyo3::{wrap_pyfunction, wrap_pymodule}; +use pyo3::wrap_pyfunction; use transaction::Transaction; -use version::Version; use crate::runtime_error; use num_bigint::BigUint; @@ -28,33 +26,24 @@ use std::collections::HashMap; use std::path::PathBuf; use pyapi_metal::PyOutcome; -use crate::utility::revision_control::__PYO3_PYMODULE_DEF_REVISION_CONTROL; -use crate::utility::unit_testers::__PYO3_PYMODULE_DEF_UNIT_TESTERS; -use crate::utility::publisher::__PYO3_PYMODULE_DEF_PUBLISHER; -use crate::utility::linter::__PYO3_PYMODULE_DEF_LINTER; -use crate::utility::release_scribe::__PYO3_PYMODULE_DEF_RELEASE_SCRIBE; -use crate::utility::results::__PYO3_PYMODULE_DEF_RESULTS; -use crate::utility::website::__PYO3_PYMODULE_DEF_WEBSITE; -use crate::utility::sessions::__PYO3_PYMODULE_DEF_SESSIONS; - -#[pymodule] -pub fn utility(py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; - m.add_wrapped(wrap_pyfunction!(reverse_bits))?; - m.add_wrapped(wrap_pymodule!(sessions))?; - m.add_wrapped(wrap_pymodule!(revision_control))?; - m.add_wrapped(wrap_pymodule!(unit_testers))?; - m.add_wrapped(wrap_pymodule!(publisher))?; - m.add_wrapped(wrap_pymodule!(linter))?; - m.add_wrapped(wrap_pymodule!(release_scribe))?; - m.add_wrapped(wrap_pymodule!(results))?; - m.add_wrapped(wrap_pymodule!(website))?; - m.add_wrapped(wrap_pyfunction!(exec))?; - m.add_wrapped(wrap_pyfunction!(dispatch_workflow))?; - ldaps::define(m)?; - mailer::define(py, m)?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "utility")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_wrapped(wrap_pyfunction!(reverse_bits))?; + subm.add_wrapped(wrap_pyfunction!(exec))?; + subm.add_wrapped(wrap_pyfunction!(dispatch_workflow))?; + sessions::define(py, subm)?; + revision_control::define(py, subm)?; + unit_testers::define(py, subm)?; + publisher::define(py, subm)?; + linter::define(py, subm)?; + release_scribe::define(py, subm)?; + results::define(py, subm)?; + website::define(py, subm)?; + ldaps::define(py, subm)?; + mailer::define(py, subm)?; + m.add_submodule(subm)?; Ok(()) } @@ -63,14 +52,8 @@ pub fn reverse_bits(_py: Python, num: BigUint, width: Option) -> PyResult, @@ -114,7 +97,7 @@ fn new_obj(py: Python, class: &str, kwargs: &PyDict) -> PyResult { locals.set_item("kwargs", kwargs)?; let mut class_mod = ""; if let Some(m) = split.get(1) { - locals.set_item("mod", py.import(m)?.to_object(py))?; + locals.set_item("mod", py.import(*m)?.to_object(py))?; class_mod = "mod." } @@ -132,9 +115,6 @@ fn app_utility( default: Option<&str>, use_by_default: bool, ) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); - let system: &str; let conf_t: HashMap; let conf_; @@ -175,8 +155,10 @@ fn app_utility( let split = system.rsplitn(2, "."); if split.count() == 2 { // Have a class (hopefully) of the form 'a.b.Class' - let py_conf = pyapi_metal::_helpers::map_to_pydict(py, &mut conf_.iter())?; - Ok(Some(new_obj(py, system, py_conf.as_ref(py))?)) + Python::with_gil(|py| { + let py_conf = pyapi_metal::_helpers::map_to_pydict(py, &mut conf_.iter())?; + Ok(Some(new_obj(py, system, py_conf.as_ref(py))?)) + }) } else { // fall back to some enumerated systems if &system.to_lowercase() == "none" { @@ -188,7 +170,8 @@ fn app_utility( } } -#[pyfunction(inputs = "None")] +#[pyfunction] +#[pyo3(signature=(owner, repo, workflow, git_ref, inputs=None))] pub fn dispatch_workflow( owner: &str, repo: &str, diff --git a/rust/pyapi/src/utility/publisher/_frontend.rs b/rust/pyapi/src/utility/publisher/_frontend.rs index b43e439e..d86f040b 100644 --- a/rust/pyapi/src/utility/publisher/_frontend.rs +++ b/rust/pyapi/src/utility/publisher/_frontend.rs @@ -9,13 +9,13 @@ pub struct Publisher {} impl ofrontend::Publisher for Publisher { fn build_package(&self) -> Result { - let gil = Python::acquire_gil(); - let py = gil.python(); - let pyapp = get_pyapp(py)?; - let pb = PyApplication::_get_publisher(pyapp, py)?; - let py_pbr = pb.call_method0(py, "build_package")?; - let pbr = py_pbr.extract::>(py)?; - Ok(pbr.build_result()?.clone()) + Python::with_gil(|py| { + let pyapp = get_pyapp(py)?; + let pb = PyApplication::_get_publisher(pyapp, py)?; + let py_pbr = pb.call_method0(py, "build_package")?; + let pbr = py_pbr.extract::>(py)?; + Ok(pbr.build_result()?.clone()) + }) } fn upload( @@ -23,22 +23,22 @@ impl ofrontend::Publisher for Publisher { build_result: &Outcome, dry_run: bool, ) -> Result { - let gil = Python::acquire_gil(); - let py = gil.python(); - let pyapp = get_pyapp(py)?; - let pb = PyApplication::_get_publisher(pyapp, py)?; - let py_pbr = pb.call_method1( - py, - "upload", - PyTuple::new( + Python::with_gil(|py| { + let pyapp = get_pyapp(py)?; + let pb = PyApplication::_get_publisher(pyapp, py)?; + let py_pbr = pb.call_method1( py, - &[ - BuildResult::to_py(py, build_result)?.to_object(py), - dry_run.to_object(py), - ], - ), - )?; - let pur = py_pbr.extract::>(py)?; - Ok(pur.upload_result()?.clone()) + "upload", + PyTuple::new( + py, + &[ + BuildResult::to_py(py, build_result)?.to_object(py), + dry_run.to_object(py), + ], + ), + )?; + let pur = py_pbr.extract::>(py)?; + Ok(pur.upload_result()?.clone()) + }) } } diff --git a/rust/pyapi/src/utility/publisher/mod.rs b/rust/pyapi/src/utility/publisher/mod.rs index eba29772..d10af762 100644 --- a/rust/pyapi/src/utility/publisher/mod.rs +++ b/rust/pyapi/src/utility/publisher/mod.rs @@ -6,9 +6,10 @@ use origen::STATUS; use pyo3::prelude::*; use pyo3::wrap_pyfunction; -#[pymodule] -pub fn publisher(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_wrapped(wrap_pyfunction!(app_publisher))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "publisher")?; + subm.add_wrapped(wrap_pyfunction!(app_publisher))?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi/src/utility/release_scribe/_frontend.rs b/rust/pyapi/src/utility/release_scribe/_frontend.rs index 1689710d..ecb3db3c 100644 --- a/rust/pyapi/src/utility/release_scribe/_frontend.rs +++ b/rust/pyapi/src/utility/release_scribe/_frontend.rs @@ -1,5 +1,5 @@ use crate::application::{get_pyapp, PyApplication}; -use origen::utility::version::Version as OVersion; +use origen_metal::utils::version::Version as OVersion; use origen::Result as OResult; use pyo3::prelude::*; use pyo3::types::PyDict; @@ -80,10 +80,10 @@ impl ReleaseScribe { where F: FnMut(Python, PyObject) -> PyResult, { - let gil = Python::acquire_gil(); - let py = gil.python(); - let pyapp = get_pyapp(py)?; - let rs = PyApplication::_get_release_scribe(pyapp, py)?; - func(py, rs) + Python::with_gil(|py| { + let pyapp = get_pyapp(py)?; + let rs = PyApplication::_get_release_scribe(pyapp, py)?; + func(py, rs) + }) } } diff --git a/rust/pyapi/src/utility/release_scribe/mod.rs b/rust/pyapi/src/utility/release_scribe/mod.rs index 81ff932d..c5cb78f6 100644 --- a/rust/pyapi/src/utility/release_scribe/mod.rs +++ b/rust/pyapi/src/utility/release_scribe/mod.rs @@ -3,13 +3,21 @@ pub mod _frontend; use super::app_utility; use crate::runtime_error; use origen::utility::release_scribe::ReleaseScribe as OrigenRS; -use origen::utility::version::Version as OVersion; +use origen_metal::utils::version::Version as OVersion; use origen::STATUS; use pyo3::prelude::*; use pyo3::types::PyDict; use pyo3::wrap_pyfunction; use std::collections::HashMap; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "release_scribe")?; + subm.add_class::()?; + subm.add_wrapped(wrap_pyfunction!(app_release_scribe))?; + m.add_submodule(subm)?; + Ok(()) +} + #[pymodule] pub fn release_scribe(_py: Python, m: &PyModule) -> PyResult<()> { m.add_class::()?; @@ -45,7 +53,7 @@ pub struct ReleaseScribe { #[pymethods] impl ReleaseScribe { #[new] - #[args(config = "**")] + #[pyo3(signature=(**config))] fn new(config: Option<&PyDict>) -> PyResult { let mut c: HashMap = HashMap::new(); if let Some(cfg) = config { @@ -59,9 +67,7 @@ impl ReleaseScribe { } #[getter] - fn release_note_file(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn release_note_file(&self, py: Python) -> PyResult { Ok(crate::pypath!( py, format!("{}", self.rs.release_file.display()) @@ -81,16 +87,14 @@ impl ReleaseScribe { } #[getter] - fn history_tracking_file(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn history_tracking_file(&self, py: Python) -> PyResult { Ok(crate::pypath!( py, format!("{}", self.rs.history_toml.display()) )) } - #[args(release = "None", title = "None", dry_run = "false")] + #[pyo3(signature=(body, title=None, release=None, dry_run=false))] fn append_history( &mut self, body: String, diff --git a/rust/pyapi/src/utility/results.rs b/rust/pyapi/src/utility/results.rs index 4cb31d2f..a6836199 100644 --- a/rust/pyapi/src/utility/results.rs +++ b/rust/pyapi/src/utility/results.rs @@ -14,11 +14,12 @@ macro_rules! incomplete_result_error { }}; } -#[pymodule] -pub fn results(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_class::()?; - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "results")?; + subm.add_class::()?; + subm.add_class::()?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } @@ -32,7 +33,7 @@ pub struct BuildResult { #[pymethods] impl BuildResult { #[classmethod] - #[args(build_contents = "None", message = "None", metadata = "None")] + #[pyo3(signature=(instance, succeeded, build_contents=None, message=None, metadata=None))] fn __init__( _cls: &PyType, instance: &PyAny, @@ -114,7 +115,7 @@ pub struct UploadResult { #[pymethods] impl UploadResult { #[classmethod] - #[args(message = "None", metadata = "None")] + #[pyo3(signature=(instance, succeeded, message=None, metadata=None))] fn __init__( _cls: &PyType, instance: &PyAny, @@ -156,7 +157,7 @@ pub struct ExecResult { #[pymethods] impl ExecResult { #[classmethod] - #[args(stdout = "None", stderr = "None")] + #[pyo3(signature=(instance, exit_code, stdout=None, stderr=None))] fn __init__( _cls: &PyType, instance: &PyAny, diff --git a/rust/pyapi/src/utility/revision_control/mod.rs b/rust/pyapi/src/utility/revision_control/mod.rs index 93a5e74f..680603b3 100644 --- a/rust/pyapi/src/utility/revision_control/mod.rs +++ b/rust/pyapi/src/utility/revision_control/mod.rs @@ -9,15 +9,16 @@ use origen_metal::utils::revision_control::SupportedSystems; use crate::runtime_error; -#[pymodule] -pub fn revision_control(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_wrapped(wrap_pyfunction!(app_rc))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "revision_control")?; + subm.add_wrapped(wrap_pyfunction!(app_rc))?; + m.add_submodule(subm)?; Ok(()) } /// Creates a RC driver from the application's ``config.toml`` #[pyfunction] -fn app_rc() -> PyResult> { +fn app_rc(py: Python) -> PyResult> { // Raise an error if we aren't in an application instance let app; match &STATUS.app { @@ -46,8 +47,6 @@ fn app_rc() -> PyResult> { } // fall back to Rust's lookup parameters - let gil = Python::acquire_gil(); - let py = gil.python(); let locals = PyDict::new(py); let py_rc_config = PyDict::new(py); for (k, v) in rc_config.iter() { diff --git a/rust/pyapi/src/utility/sessions.rs b/rust/pyapi/src/utility/sessions.rs index b20b32ee..63e9ea66 100644 --- a/rust/pyapi/src/utility/sessions.rs +++ b/rust/pyapi/src/utility/sessions.rs @@ -6,9 +6,10 @@ use origen::{om, with_app_session, with_app_session_group}; use pyapi_metal::framework::sessions::{SessionGroup, SessionStore, Sessions}; use pyo3::prelude::*; -#[pymodule] -pub fn sessions(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "sessions")?; + subm.add_class::()?; + m.add_submodule(subm)?; Ok(()) } @@ -22,7 +23,7 @@ impl OrigenSessions { Ok((OrigenSessions {}, Sessions {})) } - #[args(session = "None")] + #[pyo3(signature=(session=None))] fn user_session(&self, session: Option<&PyAny>) -> PyResult { // Can accept: // None -> Top app's session @@ -52,7 +53,7 @@ impl OrigenSessions { })?) } - #[args(session = "None")] + #[pyo3(signature=(session=None))] fn app_session(&self, session: Option<&PyAny>) -> PyResult { let t; if let Some(s) = session { diff --git a/rust/pyapi/src/utility/transaction.rs b/rust/pyapi/src/utility/transaction.rs index f45ce581..e0c5ca7f 100644 --- a/rust/pyapi/src/utility/transaction.rs +++ b/rust/pyapi/src/utility/transaction.rs @@ -13,7 +13,7 @@ pub struct Transaction { #[pymethods] impl Transaction { #[new] - #[args(kwargs = "**")] + #[pyo3(signature=(bc_or_val, **kwargs))] fn new(bc_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); Ok(Self { @@ -22,7 +22,7 @@ impl Transaction { } #[classmethod] - #[args(kwargs = "**")] + #[pyo3(signature=(bc_or_val, **kwargs))] fn new_write(_cls: &PyType, bc_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); Ok(Self { @@ -36,7 +36,7 @@ impl Transaction { } #[classmethod] - #[args(kwargs = "**")] + #[pyo3(signature=(bc_or_val, **kwargs))] fn new_verify(_cls: &PyType, bc_or_val: &PyAny, kwargs: Option<&PyDict>) -> PyResult { let dut = origen::dut(); Ok(Self { @@ -63,10 +63,7 @@ impl Transaction { } #[getter] - fn address(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - + fn address(&self, py: Python) -> PyResult { if let Some(a) = &self.transaction.address { Ok(a.to_object(py)) } else { @@ -75,8 +72,8 @@ impl Transaction { } #[getter] - fn addr(&self) -> PyResult { - self.address() + fn addr(&self, py: Python) -> PyResult { + self.address(py) } #[getter] @@ -85,10 +82,7 @@ impl Transaction { } #[getter] - fn address_width(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - + fn address_width(&self, py: Python) -> PyResult { if let Some(a) = self.transaction.address_width { Ok(a.to_object(py)) } else { @@ -97,16 +91,13 @@ impl Transaction { } #[getter] - fn addr_width(&self) -> PyResult { - self.address_width() + fn addr_width(&self, py: Python) -> PyResult { + self.address_width(py) } #[getter] - fn register(&self) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn register(&self, py: Python) -> PyResult { let dut = origen::dut(); - if let Some(id) = self.transaction.reg_id { Ok(crate::registers::bit_collection::BitCollection::from_reg_id(id, &dut).into_py(py)) } else { @@ -115,7 +106,7 @@ impl Transaction { } #[getter] - fn reg(&self) -> PyResult { - self.register() + fn reg(&self, py: Python) -> PyResult { + self.register(py) } } diff --git a/rust/pyapi/src/utility/unit_testers/_frontend.rs b/rust/pyapi/src/utility/unit_testers/_frontend.rs index bf42536a..cab16dff 100644 --- a/rust/pyapi/src/utility/unit_testers/_frontend.rs +++ b/rust/pyapi/src/utility/unit_testers/_frontend.rs @@ -8,15 +8,15 @@ pub struct UnitTester {} impl origen::core::frontend::UnitTester for UnitTester { fn run(&self) -> Result { - let gil = Python::acquire_gil(); - let py = gil.python(); - let pyapp = get_pyapp(py)?; - let ut = PyApplication::_get_ut(pyapp, py)?; - let pystat = ut.call_method0(py, "run")?; - let stat = pystat.extract::>(py)?; - match stat.orr.as_ref() { - Some(rr) => Ok(rr.clone()), - None => runtime_error!("Incomplete or Uninitialized RunResult encountered")?, - } + Python::with_gil(|py| { + let pyapp = get_pyapp(py)?; + let ut = PyApplication::_get_ut(pyapp, py)?; + let pystat = ut.call_method0(py, "run")?; + let stat = pystat.extract::>(py)?; + match stat.orr.as_ref() { + Some(rr) => Ok(rr.clone()), + None => runtime_error!("Incomplete or Uninitialized RunResult encountered")?, + } + }) } } diff --git a/rust/pyapi/src/utility/unit_testers/mod.rs b/rust/pyapi/src/utility/unit_testers/mod.rs index 3b63c380..9138768f 100644 --- a/rust/pyapi/src/utility/unit_testers/mod.rs +++ b/rust/pyapi/src/utility/unit_testers/mod.rs @@ -9,10 +9,11 @@ use pyo3::wrap_pyfunction; use std::collections::HashMap; use origen_metal::{Outcome, OutcomeSubtypes}; -#[pymodule] -pub fn unit_testers(_py: Python, m: &PyModule) -> PyResult<()> { - m.add_class::()?; - m.add_wrapped(wrap_pyfunction!(app_unit_tester))?; +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "unit_testers")?; + subm.add_class::()?; + subm.add_wrapped(wrap_pyfunction!(app_unit_tester))?; + m.add_submodule(subm)?; Ok(()) } @@ -71,17 +72,17 @@ impl RunResult { // Returns a new pytest driver with the parameters from the app config pub fn new_pytest_driver(py_config: &PyDict) -> PyResult { - let gil = Python::acquire_gil(); - let py = gil.python(); - let locals = PyDict::new(py); - locals.set_item("py_config", py_config)?; - locals.set_item( - "origen_pytester", - py.import("origen.utility.unit_testers.pytest")? - .to_object(py), - )?; - let pytester = py.eval("origen_pytester.PyTest(py_config)", Some(locals), None)?; - Ok(pytester.to_object(py)) + Python::with_gil(|py| { + let locals = PyDict::new(py); + locals.set_item("py_config", py_config)?; + locals.set_item( + "origen_pytester", + py.import("origen.utility.unit_testers.pytest")? + .to_object(py), + )?; + let pytester = py.eval("origen_pytester.PyTest(py_config)", Some(locals), None)?; + Ok(pytester.to_object(py)) + }) } /// Creates a unit test driver from the application's ``config.toml`` @@ -99,35 +100,35 @@ fn app_unit_tester() -> PyResult> { } let config = app.config(); - let gil = Python::acquire_gil(); - let py = gil.python(); - if let Some(ut_config) = &config.unit_tester { - if let Some(c) = ut_config.get("system") { - // Get the module and try to import it - let split = c.rsplitn(1, "."); - if split.count() == 2 { - // Have a class (hopefully) of the form 'a.b.Class' - // let py_config = hashmap_to_pydict(py, ut_config)?; - // return runtime_error!("custom unit tester not supported yet!"); - todo!(); - } else { - // fall back to some enumerated systems - if &c.to_lowercase() == "pytest" { - let py_config = map_to_pydict(py, &mut ut_config.iter())?; - Ok(Some(new_pytest_driver(py_config.as_ref(py))?)) - } else if &c.to_lowercase() == "none" { - Ok(None) + Python::with_gil(|py| { + if let Some(ut_config) = &config.unit_tester { + if let Some(c) = ut_config.get("system") { + // Get the module and try to import it + let split = c.rsplitn(1, "."); + if split.count() == 2 { + // Have a class (hopefully) of the form 'a.b.Class' + // let py_config = hashmap_to_pydict(py, ut_config)?; + // return runtime_error!("custom unit tester not supported yet!"); + todo!(); } else { - return runtime_error!(format!("Unrecognized unit tester system '{}'", c)); + // fall back to some enumerated systems + if &c.to_lowercase() == "pytest" { + let py_config = map_to_pydict(py, &mut ut_config.iter())?; + Ok(Some(new_pytest_driver(py_config.as_ref(py))?)) + } else if &c.to_lowercase() == "none" { + Ok(None) + } else { + return runtime_error!(format!("Unrecognized unit tester system '{}'", c)); + } } + } else { + // Invalid config + return runtime_error!("Could not discern unit tester from app config"); } } else { - // Invalid config - return runtime_error!("Could not discern unit tester from app config"); + let temp = HashMap::::new(); + let py_config = map_to_pydict(py, &mut temp.iter())?; + Ok(Some(new_pytest_driver(py_config.as_ref(py))?)) } - } else { - let temp = HashMap::::new(); - let py_config = map_to_pydict(py, &mut temp.iter())?; - Ok(Some(new_pytest_driver(py_config.as_ref(py))?)) - } + }) } diff --git a/rust/pyapi/src/utility/version.rs b/rust/pyapi/src/utility/version.rs deleted file mode 100644 index 1ae3fc2d..00000000 --- a/rust/pyapi/src/utility/version.rs +++ /dev/null @@ -1,17 +0,0 @@ -use origen::utility::version::Version as OrigenVersion; -use pyo3::prelude::*; - -#[pyclass] -pub struct Version { - _origen_version: OrigenVersion, -} - -#[pymethods] -impl Version { - #[new] - fn new(ver: &str) -> PyResult { - Ok(Self { - _origen_version: OrigenVersion::new_pep440(ver)?, - }) - } -} diff --git a/rust/pyapi/src/utility/website/_frontend.rs b/rust/pyapi/src/utility/website/_frontend.rs index 0d2bc890..84601686 100644 --- a/rust/pyapi/src/utility/website/_frontend.rs +++ b/rust/pyapi/src/utility/website/_frontend.rs @@ -8,12 +8,12 @@ pub struct Website {} impl ofrontend::Website for Website { fn build(&self) -> Result { - let gil = Python::acquire_gil(); - let py = gil.python(); - let pyapp = get_pyapp(py)?; - let web = PyApplication::_get_website(pyapp, py)?; - let py_pbr = web.call_method0(py, "build")?; - let pbr = py_pbr.extract::>(py)?; - Ok(pbr.build_result()?.clone()) + Python::with_gil(|py| { + let pyapp = get_pyapp(py)?; + let web = PyApplication::_get_website(pyapp, py)?; + let py_pbr = web.call_method0(py, "build")?; + let pbr = py_pbr.extract::>(py)?; + Ok(pbr.build_result()?.clone()) + }) } } diff --git a/rust/pyapi/src/utility/website/mod.rs b/rust/pyapi/src/utility/website/mod.rs index 2f9f444a..f551dc06 100644 --- a/rust/pyapi/src/utility/website/mod.rs +++ b/rust/pyapi/src/utility/website/mod.rs @@ -2,7 +2,8 @@ pub mod _frontend; use pyo3::prelude::*; -#[pymodule] -pub fn website(_py: Python, _m: &PyModule) -> PyResult<()> { +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "website")?; + m.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi_metal/Cargo.lock b/rust/pyapi_metal/Cargo.lock deleted file mode 100644 index 8742045a..00000000 --- a/rust/pyapi_metal/Cargo.lock +++ /dev/null @@ -1,2883 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc95d1bdb8e6666b2b217308eeeb09f2d6728d104be3e31916cc74d15420331" -dependencies = [ - "generic-array 0.14.5", -] - -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher", -] - -[[package]] -name = "aes-gcm" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5278b5fabbb9bd46e24aa69b2fdea62c99088e0a950a9be40e3e0101298f88da" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "ghash", - "subtle", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher", - "opaque-debug 0.3.0", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - -[[package]] -name = "arc-swap" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5d78ce20460b82d3fa150275ed9d55e21064fc7951177baacf86a145c4a4b1f" - -[[package]] -name = "async-io" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" -dependencies = [ - "concurrent-queue", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - -[[package]] -name = "async-trait" -version = "0.1.68" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a17d453482a265fd5f8479f2a3f405566e6ca627837aaddb85af8b1ab8ef61" -dependencies = [ - "addr2line", - "cc", - "cfg-if 1.0.0", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "base64" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding 0.1.5", - "byte-tools", - "byteorder", - "generic-array 0.12.4", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array 0.14.5", -] - -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding 0.2.1", - "cipher", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "built" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f346b6890a0dfa7266974910e7df2d5088120dd54721b9b0e5aae1ae5e05715" -dependencies = [ - "cargo-lock", -] - -[[package]] -name = "bumpalo" -version = "3.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" - -[[package]] -name = "cache-padded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c" - -[[package]] -name = "cargo-lock" -version = "7.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c408da54db4c50d4693f7e649c299bc9de9c23ead86249e5368830bb32a734b" -dependencies = [ - "semver", - "serde", - "toml", - "url", -] - -[[package]] -name = "cc" -version = "1.0.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" -dependencies = [ - "jobserver", -] - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "serde", - "time 0.1.44", - "winapi", -] - -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array 0.14.5", -] - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - -[[package]] -name = "config" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea917b74b6edfb5024e3b55d3c8f710b5f4ed92646429601a42e96f0812b31b" -dependencies = [ - "async-trait", - "json5", - "lazy_static", - "nom", - "pathdiff", - "ron", - "rust-ini", - "serde", - "serde_json", - "toml", - "yaml-rust", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" - -[[package]] -name = "cpufeatures" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" -dependencies = [ - "libc", -] - -[[package]] -name = "cpuid-bool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb25d077389e53838a8158c8e99174c5a9d902dee4904320db714f3c653ffba" - -[[package]] -name = "crypto-mac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a" -dependencies = [ - "generic-array 0.14.5", - "subtle", -] - -[[package]] -name = "ctr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb4a30d54f7443bf3d6191dcd486aca19e67cb3c49fa7a06a319966346707e7f" -dependencies = [ - "cipher", -] - -[[package]] -name = "curl-sys" -version = "0.4.55+curl-7.83.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23734ec77368ec583c2e61dd3f0b0e5c98b93abe6d2a004ca06b91dd7e3e2762" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "winapi", -] - -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array 0.12.4", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array 0.14.5", -] - -[[package]] -name = "dirs" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13aea89a5c93364a98e9b37b2fa237effbb694d5cfe01c5b70941f7eb087d5e3" -dependencies = [ - "cfg-if 0.1.10", - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "dlv-list" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257" - -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "either" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" - -[[package]] -name = "email-encoding" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfb21b9878cf7a348dcb8559109aabc0ec40d69924bd706fa5149846c4fef75" -dependencies = [ - "base64 0.21.0", - "memchr", -] - -[[package]] -name = "email_address" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2153bd83ebc09db15bcbdc3e2194d901804952e3dc96967e1cd3b0c5c32d112" - -[[package]] -name = "encoding_rs" -version = "0.8.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enum-display-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ef37b2a9b242295d61a154ee91ae884afff6b8b933b486b12481cc58310ca" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "enum-utils" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed327f716d0d351d86c9fd3398d20ee39ad8f681873cc081da2ca1c10fed398a" -dependencies = [ - "enum-utils-from-str", - "failure", - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 1.0.93", -] - -[[package]] -name = "enum-utils-from-str" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d49be08bad6e4ca87b2b8e74146987d4e5cb3b7512efa50ef505b51a22227ee1" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "failure" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" -dependencies = [ - "backtrace", -] - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "fastrand" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" -dependencies = [ - "instant", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23342abe12aba583913b2e62f22225ff9c950774065e4bfb61a19cd9770fec40" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-executor" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccecee823288125bd88b4d7f565c9e58e41858e47ab72e8ea2d64e93624386e0" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fff74096e71ed47f8e023204cfd0aa1289cd54ae5430a9523be060cdb849964" - -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", -] - -[[package]] -name = "futures-sink" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - -[[package]] -name = "generic-array" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", -] - -[[package]] -name = "ghash" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97304e4cd182c3846f7575ced3890c53012ce534ad9114046b0a9e00bb30a375" -dependencies = [ - "opaque-debug 0.3.0", - "polyval", -] - -[[package]] -name = "gimli" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" - -[[package]] -name = "git2" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf7f68c2995f392c49fffb4f95ae2c873297830eb25c6bc4c114ce8f4562acc" -dependencies = [ - "bitflags", - "libc", - "libgit2-sys", - "log", - "openssl-probe", - "openssl-sys", - "url", -] - -[[package]] -name = "glob" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" - -[[package]] -name = "h2" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - -[[package]] -name = "hashbrown" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3" -dependencies = [ - "ahash", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hkdf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" -dependencies = [ - "digest 0.9.0", - "hmac", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hostname" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" -dependencies = [ - "libc", - "match_cfg", - "winapi", -] - -[[package]] -name = "http" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c" - -[[package]] -name = "httpdate" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" - -[[package]] -name = "hyper" -version = "0.14.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "idna" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee" -dependencies = [ - "autocfg", - "hashbrown 0.11.2", - "serde", -] - -[[package]] -name = "indoc" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05a0bd019339e5d968b37855180087b7b9d512c5046fbd244cf8c95687927d6e" - -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "ipnet" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" - -[[package]] -name = "iter-read" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c397ca3ea05ad509c4ec451fea28b4771236a376ca1c69fd5143aae0cf8f93c4" - -[[package]] -name = "itoa" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" - -[[package]] -name = "jobserver" -version = "0.1.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" -dependencies = [ - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonwebtoken" -version = "8.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" -dependencies = [ - "base64 0.21.0", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "keyring" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "894a58932447ecc241a3545135bdfd26ac0e611295b391904ce0b085310ab38c" -dependencies = [ - "byteorder", - "secret-service", - "security-framework", - "winapi", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "lber" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5d85f5e00e12cb50c70c3b1c1f0daff6546eb4c608b44d0a990e38a539e0446" -dependencies = [ - "bytes", - "nom", -] - -[[package]] -name = "ldap3" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5cfbd3c59ca16d6671b002b8b3dd013cd825d9c77a1664a3135194d3270511e" -dependencies = [ - "async-trait", - "bytes", - "futures", - "futures-util", - "lazy_static", - "lber", - "log", - "native-tls", - "nom", - "percent-encoding", - "thiserror", - "tokio", - "tokio-native-tls", - "tokio-stream", - "tokio-util", - "url", -] - -[[package]] -name = "lettre" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76bd09637ae3ec7bd605b8e135e757980b3968430ff2b1a4a94fb7769e50166d" -dependencies = [ - "base64 0.21.0", - "email-encoding", - "email_address", - "fastrand", - "futures-util", - "hostname", - "httpdate", - "idna", - "mime", - "native-tls", - "nom", - "once_cell", - "quoted_printable", - "socket2", - "tokio", -] - -[[package]] -name = "libc" -version = "0.2.125" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" - -[[package]] -name = "libgit2-sys" -version = "0.14.2+1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f3d95f6b51075fe9810a7ae22c7095f12b98005ab364d8544797a825ce946a4" -dependencies = [ - "cc", - "libc", - "libssh2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", -] - -[[package]] -name = "libssh2-sys" -version = "0.2.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b094a36eb4b8b8c8a7b4b8ae43b2944502be3e59cd87687595cf6b0a71b3f4ca" -dependencies = [ - "cc", - "libc", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libz-sys" -version = "1.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e7e15d7610cce1d9752e137625f14e61a28cd45929b6e12e47b50fe154ee2e" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" - -[[package]] -name = "lock_api" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "match_cfg" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" - -[[package]] -name = "memchr" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" - -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2b29bd4bc3f33391105ebee3589c19197c4271e3e5a9ec9bfe8127eeff8f082" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" -dependencies = [ - "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nb-connect" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" -dependencies = [ - "libc", - "socket2", -] - -[[package]] -name = "nix" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "nom" -version = "7.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "num" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" -dependencies = [ - "num-bigint 0.3.3", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", - "serde", -] - -[[package]] -name = "num-complex" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-bigint 0.3.3", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.28.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e42c982f2d955fac81dd7e1d0e1426a7d702acd9c98d19ab01083a6a0328c424" -dependencies = [ - "memchr", -] - -[[package]] -name = "octocrab" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "496442a5ec5ad38376a0c49bc0f31ba55dbda5276cf12757498c378c3bc2ea1c" -dependencies = [ - "arc-swap", - "async-trait", - "base64 0.21.0", - "bytes", - "cfg-if 1.0.0", - "chrono", - "either", - "jsonwebtoken", - "once_cell", - "reqwest", - "secrecy", - "serde", - "serde_json", - "serde_path_to_error", - "snafu", - "tracing", - "url", -] - -[[package]] -name = "once_cell" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9" - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "openssl" -version = "0.10.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" -dependencies = [ - "bitflags", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-src" -version = "111.18.0+1.1.1n" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7897a926e1e8d00219127dc020130eca4292e5ca666dd592480d72c3eca2ff6c" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" -dependencies = [ - "autocfg", - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "ordered-multimap" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a" -dependencies = [ - "dlv-list", - "hashbrown 0.12.1", -] - -[[package]] -name = "origen_metal" -version = "0.5.0" -dependencies = [ - "aes-gcm", - "built", - "cfg-if 1.0.0", - "chrono", - "config", - "dirs", - "enum-display-derive", - "enum-utils", - "git2", - "glob", - "indexmap", - "keyring", - "lazy_static", - "ldap3", - "lettre", - "num-bigint 0.4.3", - "num-traits", - "octocrab", - "pest", - "pest_derive", - "pyo3", - "rand", - "regex", - "reqwest", - "rpassword", - "semver", - "serde", - "serde-pickle", - "serde_json", - "shellexpand", - "tempfile", - "termcolor", - "time 0.1.44", - "toml", - "wait-timeout", - "whoami", -] - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" -dependencies = [ - "cfg-if 1.0.0", - "instant", - "libc", - "redox_syscall", - "smallvec", - "winapi", -] - -[[package]] -name = "pathdiff" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" - -[[package]] -name = "pem" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" -dependencies = [ - "base64 0.13.0", -] - -[[package]] -name = "percent-encoding" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" - -[[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" - -[[package]] -name = "polling" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - -[[package]] -name = "polyval" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eebcc4aa140b9abd2bc40d9c3f7ccec842679cd79045ac3a7ac698c1a064b7cd" -dependencies = [ - "cpuid-bool", - "opaque-debug 0.3.0", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro-crate" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17d47ce914bf4de440332250b0edd23ce48c005f59fab39d3335866b114f11a" -dependencies = [ - "thiserror", - "toml", -] - -[[package]] -name = "proc-macro2" -version = "1.0.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "pyapi_metal" -version = "0.4.0" -dependencies = [ - "built", - "curl-sys", - "indexmap", - "libz-sys", - "num-bigint 0.4.3", - "openssl", - "origen_metal", - "pyo3", -] - -[[package]] -name = "pyo3" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6302e85060011447471887705bb7838f14aba43fcb06957d823739a496b3dc" -dependencies = [ - "cfg-if 1.0.0", - "indoc", - "libc", - "num-bigint 0.4.3", - "parking_lot", - "pyo3-build-config", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-build-config" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b65b546c35d8a3b1b2f0ddbac7c6a569d759f357f2b9df884f5d6b719152c8" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c275a07127c1aca33031a563e384ffdd485aee34ef131116fcd58e3430d1742b" -dependencies = [ - "libc", - "pyo3-build-config", -] - -[[package]] -name = "pyo3-macros" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "284fc4485bfbcc9850a6d661d627783f18d19c2ab55880b021671c4ba83e90f7" -dependencies = [ - "proc-macro2", - "pyo3-macros-backend", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.16.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53bda0f58f73f5c5429693c96ed57f7abdb38fdfc28ae06da4101a257adb7faf" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "quote" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "quoted_printable" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3866219251662ec3b26fc217e3e05bf9c4f84325234dfb96bf0bf840889e49" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", -] - -[[package]] -name = "regex" -version = "1.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] - -[[package]] -name = "reqwest" -version = "0.11.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb" -dependencies = [ - "base64 0.13.0", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "lazy_static", - "log", - "mime", - "native-tls", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "tokio", - "tokio-native-tls", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "ring" -version = "0.16.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" -dependencies = [ - "cc", - "libc", - "once_cell", - "spin", - "untrusted", - "web-sys", - "winapi", -] - -[[package]] -name = "ron" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b861ecaade43ac97886a512b360d01d66be9f41f3c61088b42cedf92e03d678" -dependencies = [ - "base64 0.13.0", - "bitflags", - "serde", -] - -[[package]] -name = "rpassword" -version = "5.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc936cf8a7ea60c58f030fd36a612a48f440610214dc54bc36431f9ea0c3efb" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "rust-ini" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df" -dependencies = [ - "cfg-if 1.0.0", - "ordered-multimap", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" - -[[package]] -name = "ryu" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" - -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "zeroize", -] - -[[package]] -name = "secret-service" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2400fb1bf2a87b303ada204946294f932ade4929477e9e2bf66d7b49a66656ec" -dependencies = [ - "aes", - "block-modes", - "hkdf", - "lazy_static", - "num", - "rand", - "serde", - "sha2", - "zbus", - "zbus_macros", - "zvariant", - "zvariant_derive", -] - -[[package]] -name = "security-framework" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc" -dependencies = [ - "bitflags", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" -dependencies = [ - "serde", -] - -[[package]] -name = "serde" -version = "1.0.137" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-pickle" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b88454094f5ba5b2149722f41e42395b39556632c3abb068540c0b04d27017a" -dependencies = [ - "byteorder", - "iter-read", - "num-bigint 0.3.3", - "num-traits", - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.137" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "serde_derive_internals" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbab34ca63057a1f15280bdf3c39f2b1eb1b54c17e98360e511637aef7418c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "serde_json" -version = "1.0.81" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7868ad3b8196a8a0aea99a8220b124278ee5320a55e4fde97794b6f85b1a377" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_repr" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2ad84e47328a31223de7fed7a4f5087f2d6ddfe586cf3ca25b7a165bc0a5aed" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer 0.7.3", - "digest 0.8.1", - "fake-simd", - "opaque-debug 0.2.3", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if 1.0.0", - "cpufeatures", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "shellexpand" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c7e79eddc7b411f9beeaaf2d421de7e7cb3b1ab9eaf1b79704c0e4130cba6b5" -dependencies = [ - "dirs", -] - -[[package]] -name = "simple_asn1" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" -dependencies = [ - "num-bigint 0.4.3", - "num-traits", - "thiserror", - "time 0.3.21", -] - -[[package]] -name = "slab" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32" - -[[package]] -name = "smallvec" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" - -[[package]] -name = "snafu" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0656e7e3ffb70f6c39b3c2a86332bb74aa3c679da781642590f3c1118c5045" -dependencies = [ - "backtrace", - "doc-comment", - "snafu-derive", -] - -[[package]] -name = "snafu-derive" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "475b3bbe5245c26f2d8a6f62d67c1f30eb9fffeccee721c45d162c3ebbdf81b2" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "socket2" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "spin" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "syn" -version = "1.0.93" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04066589568b72ec65f42d65a1a52436e954b168773148893c020269563decf2" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "syn" -version = "2.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "target-lexicon" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c02424087780c9b71cc96799eaeddff35af2bc513278cda5c99fc1f5d026d3c1" - -[[package]] -name = "tempfile" -version = "3.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" -dependencies = [ - "cfg-if 1.0.0", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.16", -] - -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3403384eaacbca9923fa06940178ac13e4edb725486d70e8e15881d0c836cc" -dependencies = [ - "itoa", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" - -[[package]] -name = "time-macros" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "372950940a5f07bf38dbe211d7283c9e6d7327df53794992d293e534c733d09b" -dependencies = [ - "time-core", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - -[[package]] -name = "tokio" -version = "1.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" -dependencies = [ - "autocfg", - "bytes", - "libc", - "memchr", - "mio", - "num_cpus", - "pin-project-lite", - "socket2", - "tokio-macros", - "windows-sys", -] - -[[package]] -name = "tokio-macros" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.5.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" -dependencies = [ - "serde", -] - -[[package]] -name = "tower-service" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" - -[[package]] -name = "tracing" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09" -dependencies = [ - "cfg-if 1.0.0", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "tracing-core" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "try-lock" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" - -[[package]] -name = "typenum" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "unicode-bidi" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" - -[[package]] -name = "unicode-ident" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-xid" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04" - -[[package]] -name = "unindent" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52fee519a3e570f7df377a06a1a7775cdbfb7aa460be7e08de2b1f0e69973a44" - -[[package]] -name = "universal-hash" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" -dependencies = [ - "generic-array 0.14.5", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "url" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "want" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" -dependencies = [ - "log", - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" -dependencies = [ - "cfg-if 1.0.0", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" -dependencies = [ - "bumpalo", - "lazy_static", - "log", - "proc-macro2", - "quote", - "syn 1.0.93", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" -dependencies = [ - "cfg-if 1.0.0", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.93", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.80" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" - -[[package]] -name = "web-sys" -version = "0.3.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - -[[package]] -name = "whoami" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" -dependencies = [ - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi", -] - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] - -[[package]] -name = "zbus" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" -dependencies = [ - "async-io", - "byteorder", - "derivative", - "enumflags2", - "fastrand", - "futures", - "nb-connect", - "nix", - "once_cell", - "polling", - "scoped-tls", - "serde", - "serde_repr", - "zbus_macros", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn 1.0.93", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" - -[[package]] -name = "zvariant" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68c7b55f2074489b7e8e07d2d0a6ee6b4f233867a653c664d8020ba53692525" -dependencies = [ - "byteorder", - "enumflags2", - "libc", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ca5e22593eb4212382d60d26350065bf2a02c34b85bc850474a74b589a3de9" -dependencies = [ - "proc-macro-crate 1.1.3", - "proc-macro2", - "quote", - "syn 1.0.93", -] diff --git a/rust/pyapi_metal/Cargo.toml b/rust/pyapi_metal/Cargo.toml index 6651ed9e..1398f659 100644 --- a/rust/pyapi_metal/Cargo.toml +++ b/rust/pyapi_metal/Cargo.toml @@ -11,7 +11,7 @@ name = "origen_metal" crate-type = ["cdylib", "lib"] [dependencies] -origen_metal = { path = "../origen_metal", features = ["python"] } +origen_metal = { path = "../origen_metal" } indexmap = "1.3.0" num-bigint = "0.4.0" @@ -23,11 +23,11 @@ curl-sys = { version = "0.4.34", features = ["static-curl"] } openssl = { version = "0.10", features = ["vendored"] } [dependencies.pyo3] -version = "0.16.5" +version = "0.19.1" features = ["extension-module", "num-bigint"] [build-dependencies] -built = "0.5.1" +built = "0.5.2" [package.metadata.maturin] name = "origen_metal._origen_metal" diff --git a/rust/pyapi_metal/src/_helpers/errors.rs b/rust/pyapi_metal/src/_helpers/errors.rs index 2c612cea..63c91cf4 100644 --- a/rust/pyapi_metal/src/_helpers/errors.rs +++ b/rust/pyapi_metal/src/_helpers/errors.rs @@ -12,6 +12,13 @@ macro_rules! runtime_error { }}; } +#[macro_export] +macro_rules! runtime_exception { + ($message:expr) => {{ + PyErr::new::($message) + }}; +} + #[macro_export] macro_rules! type_error { ($message:expr) => { @@ -32,6 +39,16 @@ macro_rules! key_error { }; } +#[macro_export] +macro_rules! key_exception { + ($message:expr) => { + pyo3::exceptions::PyKeyError::new_err(format!( + "{}", + $message + )) + }; +} + #[macro_export] macro_rules! not_implemented_error { ($message:expr) => { @@ -41,3 +58,13 @@ macro_rules! not_implemented_error { ))) }; } + +#[macro_export] +macro_rules! value_error { + ($message:expr) => { + Err(pyo3::exceptions::PyValueError::new_err(format!( + "{}", + $message + ))) + }; +} diff --git a/rust/pyapi_metal/src/_helpers/macros.rs b/rust/pyapi_metal/src/_helpers/macros.rs new file mode 100644 index 00000000..ab1f888b --- /dev/null +++ b/rust/pyapi_metal/src/_helpers/macros.rs @@ -0,0 +1,8 @@ +#[macro_export] +macro_rules! alias_method_apply_to_set { + ($m: expr, $cls: tt, $basename: tt) => {{ + let cls = $m.getattr($cls)?; + let func = cls.getattr(concat!("apply_", $basename))?; + cls.setattr(concat!("set_", $basename), func)?; + }}; +} diff --git a/rust/pyapi_metal/src/_helpers/mod.rs b/rust/pyapi_metal/src/_helpers/mod.rs index 69489c0f..6ea47502 100644 --- a/rust/pyapi_metal/src/_helpers/mod.rs +++ b/rust/pyapi_metal/src/_helpers/mod.rs @@ -9,6 +9,9 @@ pub mod config; #[macro_use] pub mod errors; +#[macro_use] +pub mod macros; + use crate::{pypath, runtime_error}; use indexmap::IndexMap; use pyo3::conversion::ToPyObject; @@ -53,9 +56,7 @@ pub fn new_py_obj<'p>( ) } -pub fn to_py_paths(paths: &Vec) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); +pub fn to_py_paths(py: Python, paths: &Vec) -> PyResult> { let mut retn: Vec = vec![]; for p in paths { retn.push(pypath!(py, format!("{}", p))); @@ -142,7 +143,7 @@ pub fn get_qualified_attr(s: &str) -> PyResult> { for component in remaining { current_str.push_str("."); current_str.push_str(component); - match PyModule::import(py, ¤t_str) { + match PyModule::import(py, &*current_str) { Ok(py_mod) => { current = py_mod.to_object(py); }, diff --git a/rust/pyapi_metal/src/_helpers/typed_value.rs b/rust/pyapi_metal/src/_helpers/typed_value.rs index e0387fc1..a37f4b63 100644 --- a/rust/pyapi_metal/src/_helpers/typed_value.rs +++ b/rust/pyapi_metal/src/_helpers/typed_value.rs @@ -12,69 +12,66 @@ pub fn typed_value_to_pyobj( key: Option<&str>, ) -> PyResult> { if let Some(d) = data { - let gil = Python::acquire_gil(); - let py = gil.python(); - match d { - TypedValue::None => Ok(None), - TypedValue::String(s) => Ok(Some(s.to_object(py))), - TypedValue::Usize(u) => Ok(Some(u.to_object(py))), - TypedValue::BigInt(big) => Ok(Some(big.to_object(py))), - TypedValue::BigUint(big) => Ok(Some(big.to_object(py))), - TypedValue::Bool(b) => Ok(Some(b.to_object(py))), - TypedValue::Float(f) => Ok(Some(f.to_object(py))), - TypedValue::Serialized(bytes, serializer, _class) => { - if let Some(s) = serializer { - if s == "Python-Pickle" { - let gil = Python::acquire_gil(); - let py = gil.python(); - - let any = depickle(py, &bytes)?; - Ok(Some(any.into())) - } else if s == "Python-Frontend" { - let bytes = PyBytes::new(py, &bytes); - Ok(Some(bytes.into())) + Python::with_gil(|py| { + match d { + TypedValue::None => Ok(None), + TypedValue::String(s) => Ok(Some(s.to_object(py))), + TypedValue::Usize(u) => Ok(Some(u.to_object(py))), + TypedValue::BigInt(big) => Ok(Some(big.to_object(py))), + TypedValue::BigUint(big) => Ok(Some(big.to_object(py))), + TypedValue::Bool(b) => Ok(Some(b.to_object(py))), + TypedValue::Float(f) => Ok(Some(f.to_object(py))), + TypedValue::Serialized(bytes, serializer, _class) => { + if let Some(s) = serializer { + if s == "Python-Pickle" { + let any = depickle(py, &bytes)?; + Ok(Some(any.into())) + } else if s == "Python-Frontend" { + let bytes = PyBytes::new(py, &bytes); + Ok(Some(bytes.into())) + } else { + crate::runtime_error!(if let Some(k) = key { + format!( + "Unknown serializer {} for {}. \ + If this was manually serialized, use method 'get_serialized' \ + to get a byte-array and manually deserialize.", + k, s + ) + } else { + format!( + "Unknown serializer {}. \ + If this was manually serialized, use method 'get_serialized' \ + to get a byte-array and manually deserialize.", + s + ) + }) + } } else { crate::runtime_error!(if let Some(k) = key { format!( - "Unknown serializer {} for {}. \ + "No serializer provided for {}. \ If this was manually serialized, use method 'get_serialized' \ to get a byte-array and manually deserialize.", - k, s + k ) } else { - format!( - "Unknown serializer {}. \ - If this was manually serialized, use method 'get_serialized' \ - to get a byte-array and manually deserialize.", - s - ) + "No serializer provided. \ + If this was manually serialized, use method 'get_serialized' \ + to get a byte-array and manually deserialize." + .to_string() }) } - } else { - crate::runtime_error!(if let Some(k) = key { - format!( - "No serializer provided for {}. \ - If this was manually serialized, use method 'get_serialized' \ - to get a byte-array and manually deserialize.", - k - ) - } else { - "No serializer provided. \ - If this was manually serialized, use method 'get_serialized' \ - to get a byte-array and manually deserialize." - .to_string() - }) } - } - TypedValue::Vec(list) => { - let mut pylist: Vec = vec![]; - for l in list { - pylist.push(typed_value_to_pyobj(Some(l), None)?.unwrap()); + TypedValue::Vec(list) => { + let mut pylist: Vec = vec![]; + for l in list { + pylist.push(typed_value_to_pyobj(Some(l), None)?.unwrap()); + } + Ok(Some(pylist.to_object(py))) } - Ok(Some(pylist.to_object(py))) + TypedValue::Map(map) => Ok(Some(into_pydict(py, map)?.to_object(py))), } - TypedValue::Map(map) => Ok(Some(into_pydict(py, map)?.to_object(py))), - } + }) } else { Ok(None) } @@ -101,15 +98,14 @@ pub fn extract_as_typed_value(value: &PyAny) -> PyResult { } else if let Ok(f) = value.extract::() { data = TypedValue::Float(f); } else { - let gil = Python::acquire_gil(); - let py = gil.python(); - // Serialize the data data = TypedValue::Serialized( - pickle(py, value)?, + Python::with_gil(|py| { + pickle(py, value) + })?, Some("Python-Pickle".to_string()), Some(value.get_type().name()?.to_string()), - ); + ) } Ok(data) } diff --git a/rust/pyapi_metal/src/framework/logger.rs b/rust/pyapi_metal/src/framework/logger.rs index 82c11197..9a934f60 100644 --- a/rust/pyapi_metal/src/framework/logger.rs +++ b/rust/pyapi_metal/src/framework/logger.rs @@ -1,4 +1,5 @@ use origen_metal::LOGGER; +use crate::pypath; use pyo3::prelude::*; use pyo3::types::{PyDict, PyTuple}; use pyo3::wrap_pyfunction; @@ -17,6 +18,9 @@ pub(crate) fn define(py: Python, m: &PyModule) -> PyResult<()> { subm.add_wrapped(wrap_pyfunction!(output_file))?; subm.add_wrapped(wrap_pyfunction!(set_verbosity))?; subm.add_wrapped(wrap_pyfunction!(set_verbosity_keywords))?; + subm.add_wrapped(wrap_pyfunction!(get_verbosity))?; + subm.add_wrapped(wrap_pyfunction!(get_keywords))?; + subm.add_class::()?; m.add_submodule(subm)?; Ok(()) } @@ -34,54 +38,63 @@ macro_rules! pytuple_to_vector_str { }; } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn debug(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.debug_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn deprecated(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.deprecated_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn error(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.error_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn info(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.info_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn success(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.success_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn warning(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.warning_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn display(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.display_block(&pytuple_to_vector_str!(messages)); Ok(()) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn log(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { display(_py, messages, _kwargs) } -#[pyfunction(messages = "*", _kwargs = "**")] +#[pyfunction] +#[pyo3(signature=(*messages, **_kwargs))] fn trace(_py: Python, messages: &PyTuple, _kwargs: Option<&PyDict>) -> PyResult<()> { LOGGER.trace_block(&pytuple_to_vector_str!(messages)); Ok(()) @@ -103,3 +116,96 @@ fn set_verbosity_keywords(keywords: Vec) -> PyResult<()> { LOGGER.set_verbosity_keywords(keywords)?; Ok(()) } + +#[pyfunction] +fn get_verbosity() -> PyResult { + Ok(LOGGER.verbosity()) +} + +#[pyfunction] +fn get_keywords() -> PyResult> { + Ok(LOGGER.keywords()) +} + +/// Class-like wrapper for Logger +#[pyclass] +pub struct Logger {} + +#[pymethods] +impl Logger { + + #[new] + fn new() -> Self { + Self {} + } + + #[pyo3(signature=(*messages, **kwargs))] + fn debug(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + debug(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn deprecated(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + deprecated(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn error(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + error(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn info(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + info(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn success(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + success(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn warning(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + warning(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn display(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + display(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn log(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + log(py, messages, kwargs) + } + + #[pyo3(signature=(*messages, **kwargs))] + fn trace(&self, py: Python, messages: &PyTuple, kwargs: Option<&PyDict>) -> PyResult<()> { + trace(py, messages, kwargs) + } + + #[getter] + fn output_file(&self, py: Python) -> PyResult { + Ok(pypath!(py, LOGGER.output_file().display())) + } + + #[getter] + fn get_verbosity(&self) -> PyResult { + get_verbosity() + } + + #[setter] + fn set_verbosity(&self, level: u8) -> PyResult<()> { + set_verbosity(level) + } + + #[getter] + fn get_keywords(&self) -> PyResult> { + get_keywords() + } + + #[setter] + fn set_keywords(&self, keywords: Vec) -> PyResult<()> { + set_verbosity_keywords(keywords) + } +} diff --git a/rust/pyapi_metal/src/framework/outcomes.rs b/rust/pyapi_metal/src/framework/outcomes.rs index 339b321c..15cc6fc5 100644 --- a/rust/pyapi_metal/src/framework/outcomes.rs +++ b/rust/pyapi_metal/src/framework/outcomes.rs @@ -53,7 +53,7 @@ impl Outcome { /// Provide an __init__ for typical Python subclass initialization. /// Otherwise, ``new`` will initialize. #[classmethod] - #[args(message = "None", metadata = "None", use_pass_fail = "false")] + #[pyo3(signature=(instance, succeeded, message = None, positional_results = None, keyword_results = None, use_pass_fail = false, metadata = None))] fn __init__( _cls: &PyType, mut instance: PyRefMut, @@ -76,7 +76,7 @@ impl Outcome { } #[new] - #[args(message = "None", metadata = "None", use_pass_fail = "false")] + #[pyo3(signature=(succeeded, message = None, positional_results = None, keyword_results = None, use_pass_fail = false, metadata = None))] fn new( succeeded: &PyAny, message: Option, diff --git a/rust/pyapi_metal/src/framework/users.rs b/rust/pyapi_metal/src/framework/users.rs index b914fd1c..92ff6509 100644 --- a/rust/pyapi_metal/src/framework/users.rs +++ b/rust/pyapi_metal/src/framework/users.rs @@ -7,6 +7,7 @@ use pyo3::prelude::*; use pyo3::types::PyDict; use pyo3::wrap_pyfunction; use std::collections::HashMap; +use crate::frontend::{LOOKUP_HOME_DIR_FUNC_KEY}; use super::file_permissions::FilePermissions; use std::path::PathBuf; @@ -45,6 +46,7 @@ pub(crate) fn define(py: Python, m: &PyModule) -> PyResult<()> { let users_class = subm.getattr("Users")?; users_class.setattr("current_user_as", wrap_instance_method(py, "current_user_as", Some(vec!("new_current")), None)?)?; + crate::alias_method_apply_to_set!(subm, "Users", "data_lookup_hierarchy"); Ok(()) } @@ -199,6 +201,7 @@ impl Users { } #[allow(non_snake_case)] + #[pyo3(signature=(_yield_retn, _yield_context, old_user))] pub fn __exit__current_user_as(&self, _py: Python, _yield_retn: Option<&PyAny>, _yield_context: Option>, old_user: &PyAny) -> PyResult<()> { self.set_current_user(old_user)?; Ok(()) @@ -210,7 +213,7 @@ impl Users { Ok(DATA_FIELDS) } - #[args(update_current = "false")] + #[pyo3(signature=(update_current = false))] pub fn lookup_current_id(&self, update_current: bool) -> PyResult { if update_current { let r = om::try_lookup_and_set_current_user()?; @@ -254,6 +257,27 @@ impl Users { }) } + #[getter] + pub fn get_lookup_home_dir_function(&self) -> PyResult> { + crate::frontend::with_py_frontend(|py, py_fe| { + Ok(match py_fe._users_.get(*LOOKUP_HOME_DIR_FUNC_KEY) { + Some(f) => Some(f.to_object(py)), + None => None, + }) + }) + } + + #[setter] + pub fn set_lookup_home_dir_function(&self, func: Option<&PyAny>) -> PyResult<()> { + crate::frontend::with_mut_py_frontend(|py, mut py_fe| { + match func { + Some(f) => py_fe._users_.insert(LOOKUP_HOME_DIR_FUNC_KEY.to_string(), f.to_object(py)), + None => py_fe._users_.remove(*LOOKUP_HOME_DIR_FUNC_KEY), + }; + Ok(()) + }) + } + #[getter] fn get_datakeys(&self) -> PyResult> { let users = om::users(); @@ -286,14 +310,14 @@ impl Users { } } - #[args(config = "None")] + #[pyo3(signature=(name, config = None))] fn register_dataset(&self, name: &str, config: Option<&PyAny>) -> PyResult<()> { let mut users = om::users_mut(); users.register_default_dataset(name, UserDatasetConfig::into_om(config)?)?; Ok(()) } - #[args(config = "None", as_topmost = "true")] + #[pyo3(signature=(name, config = None, as_topmost = true))] pub fn add_dataset( &self, name: &str, @@ -305,7 +329,7 @@ impl Users { Ok(()) } - #[args(config = "None")] + #[pyo3(signature=(name, config = None))] pub fn override_default_dataset(&self, name: &str, config: Option<&PyAny>) -> PyResult<()> { let mut users = om::users_mut(); users.override_default_dataset(name, UserDatasetConfig::into_om(config)?)?; @@ -324,10 +348,10 @@ impl Users { #[setter] fn data_lookup_hierarchy(&self, new_hierarchy: Vec) -> PyResult<()> { - self.set_data_lookup_hierarchy(new_hierarchy) + self.apply_data_lookup_hierarchy(new_hierarchy) } - pub fn set_data_lookup_hierarchy(&self, new_hierarchy: Vec) -> PyResult<()> { + pub fn apply_data_lookup_hierarchy(&self, new_hierarchy: Vec) -> PyResult<()> { let mut users = om::users_mut(); Ok(users.set_default_data_lookup_hierarchy(new_hierarchy)?) } @@ -338,7 +362,7 @@ impl Users { Ok(map_to_pydict(py, &mut users.motive_mapping().iter())?) } - #[args(replace_existing = "false")] + #[pyo3(signature=(motive, dataset, replace_existing = false))] pub fn add_motive( &self, motive: &str, @@ -354,11 +378,11 @@ impl Users { Ok(users.dataset_for(motive)?.cloned()) } - #[args( - repopulate = "false", - continue_on_error = "false", - stop_on_failure = "false" - )] + #[pyo3(signature=( + repopulate = false, + continue_on_error = false, + stop_on_failure = false + ))] pub fn populate( &self, repopulate: bool, @@ -439,7 +463,7 @@ impl Users { Ok(retn) } - #[args(exclusive="false", required="false")] + #[pyo3(signature=(role, exclusive = false, required = false))] pub fn for_role(&self, role: &str, exclusive: bool, required: bool) -> PyResult> { let users = om::users(); let r = users.users_by_role(Some( &|_u, rn| rn == role ))?; @@ -466,11 +490,23 @@ impl Users { } } - #[args(required="false")] + #[pyo3(signature=(role, required = false))] pub fn for_exclusive_role(&self, role: &str, required: bool) -> PyResult> { Ok(self.for_role(role, true, required)?.pop()) } + #[setter] + pub fn set_default_password_cache_option(&self, password_cache_option: Option<&str>) -> PyResult<()> { + let mut users = om::users_mut(); + Ok(users.set_default_password_cache_option(password_cache_option)?) + } + + #[getter] + pub fn get_default_password_cache_option(&self) -> PyResult> { + let users = om::users_mut(); + Ok(users.default_password_cache_option().as_ref().map_or( None, |p| p.into())) + } + fn __getitem__(&self, id: &str) -> PyResult { let users = om::users(); match users.user(id) { @@ -746,8 +782,8 @@ impl UserDataset { })?) } - #[setter] - pub fn set_home_dir(&self, hd: Option) -> PyResult<()> { + #[setter(home_dir)] + pub fn home_dir_setter(&self, hd: Option) -> PyResult<()> { Ok(om::with_user_dataset_mut( Some(&self.user_id), &self.dataset, @@ -758,14 +794,37 @@ impl UserDataset { )?) } + pub fn set_home_dir(&self, d: Option) -> PyResult<()> { + self.home_dir_setter( + if d.is_some() { + d + } else { + origen_metal::framework::users::user::try_default_home_dir(Some(&self.user_id), Some(&self.dataset))? + } + ) + } + + pub fn clear_home_dir(&self) -> PyResult<()> { + self.home_dir_setter(None) + } + /// Gets the password for this dataset #[getter] - fn get_password(&self) -> PyResult { + fn password(&self) -> PyResult { Ok(om::with_user(&self.user_id, |u| { u.password(Some(&self.dataset), false, None) })?) } + #[getter] + fn __password__(&self) -> PyResult> { + Ok(om::with_user_dataset( + Some(&self.user_id), + &self.dataset, + |d| Ok(d.password.as_ref().map( |s| s.to_string())), + )?) + } + #[setter] pub fn set_password(&self, password: Option) -> PyResult<()> { Ok(om::with_user(&self.user_id, |u| { @@ -818,11 +877,11 @@ impl UserDataset { self.data_store() } - #[args( - repopulate = "false", - continue_on_error = "false", - stop_on_failure = "false" - )] + #[pyo3(signature=( + repopulate = false, + continue_on_error = false, + stop_on_failure = false + ))] pub fn populate( &self, repopulate: bool, @@ -1019,7 +1078,7 @@ impl UserDatasetConfig { // TODO rename to new? #[new] - #[args(category = "None", data_store = "None", auto_populate = "None")] + #[pyo3(signature=(category = None, data_store = None, auto_populate = None, should_validate_password = None))] fn py_new( category: Option, data_store: Option, @@ -1409,7 +1468,7 @@ impl User { // We can't get a optional None value (as least as far as I know...) // Passing in None on the Python side makes this look like the argument given, so can't // get a nested None. - #[args(kwargs = "**")] + #[pyo3(signature=(motive, **kwargs))] fn password_for(&self, motive: &str, kwargs: Option<&PyDict>) -> PyResult { let default: Option>; if let Some(opts) = kwargs { @@ -1442,7 +1501,7 @@ impl User { })?) } - #[args(replace_existing = "false")] + #[pyo3(signature=(motive, dataset, replace_existing = false))] fn add_motive( &self, motive: &str, @@ -1472,7 +1531,7 @@ impl User { } /// Clears the cached password only for the default dataset - fn clear_cache_password(&self) -> PyResult<()> { + fn clear_cached_password(&self) -> PyResult<()> { Ok(om::with_user(&self.user_id, |u| { u.clear_cached_password(None) })?) @@ -1499,6 +1558,27 @@ impl User { })?) } + #[getter] + pub fn prompt_for_passwords(&self) -> PyResult { + Ok(om::with_user(&self.user_id, |u| { + Ok(u.prompt_for_passwords()) + })?) + } + + #[setter] + pub fn set_prompt_for_passwords(&self, prompt_for_passwords: Option) -> PyResult<()> { + Ok(om::with_user_mut(&self.user_id, |u| { + Ok(u.set_prompt_for_passwords(prompt_for_passwords)) + })?) + } + + #[getter] + pub fn __prompt_for_passwords__(&self) -> PyResult> { + Ok(om::with_user(&self.user_id, |u| { + Ok(*u.prompt_for_passwords_value()) + })?) + } + // TODO? // #[getter] // fn authenticated(&self) -> PyResult { @@ -1531,7 +1611,7 @@ impl User { })?) } - #[args(config = "None", replace_existing = "None", as_topmost = "true")] + #[pyo3(signature=(name, config = None, replace_existing = None, as_topmost = true))] pub fn add_dataset( &self, name: &str, @@ -1549,7 +1629,7 @@ impl User { Ok(UserDataset::new(&self.user_id, name)) } - #[args(config = "None", replace_existing = "None")] + #[pyo3(signature=(name, config = None, replace_existing = None))] pub fn register_dataset( &self, name: &str, @@ -1607,11 +1687,11 @@ impl User { self.data_store() } - #[args( - repopulate = "false", - continue_on_error = "false", - stop_on_failure = "false" - )] + #[pyo3(signature=( + repopulate = false, + continue_on_error = false, + stop_on_failure = false + ))] pub fn populate( &self, repopulate: bool, @@ -1669,14 +1749,36 @@ impl User { })?) } - #[setter] - pub fn set_home_dir(&self, d: Option) -> PyResult<()> { + #[setter(home_dir)] + pub fn home_dir_setter(&self, d: Option) -> PyResult<()> { Ok(om::with_user(&self.user_id, |u| { u.set_home_dir(d.clone())?; Ok(()) })?) } + pub fn set_home_dir(&self, d: Option) -> PyResult<()> { + self.home_dir_setter( + if d.is_some() { + d + } else { + origen_metal::framework::users::user::try_default_home_dir(Some(&self.user_id), None)? + } + ) + } + + pub fn clear_home_dir(&self) -> PyResult<()> { + self.home_dir_setter(None) + } + + #[allow(non_snake_case)] + #[getter] + pub fn __dot_origen_dir__(&self, py: Python) -> PyResult { + Ok(pypath!(py, om::with_user(&self.user_id, |u| { + u.dot_origen_dir() + })?.display())) + } + #[getter] pub fn session_config(&self) -> PyResult { Ok(UserSessionConfig::new(&self.user_id)) @@ -1708,7 +1810,7 @@ impl User { })?) } - #[args(roles="*")] + #[pyo3(signature=(*roles))] pub fn add_roles(&self, roles: &PyAny) -> PyResult> { let v: Vec; if let Ok(r) = roles.extract::() { @@ -1724,7 +1826,7 @@ impl User { })?) } - #[args(roles="*")] + #[pyo3(signature=(*roles))] pub fn remove_roles(&self, roles: &PyAny) -> PyResult> { let v: Vec; if let Ok(r) = roles.extract::() { diff --git a/rust/pyapi_metal/src/frontend/_frontend.rs b/rust/pyapi_metal/src/frontend/_frontend.rs index 40d65fb6..edecb1d1 100644 --- a/rust/pyapi_metal/src/frontend/_frontend.rs +++ b/rust/pyapi_metal/src/frontend/_frontend.rs @@ -12,6 +12,8 @@ use origen_metal::Result as OMResult; use pyo3::prelude::*; use pyo3::types::{PyDict, PyList, PyTuple}; use std::collections::HashMap; +use std::path::PathBuf; +use crate::framework::users::{User, UserDataset}; use crate::_helpers::typed_value; @@ -133,6 +135,45 @@ impl origen_metal::frontend::FrontendAPI for Frontend { } } + fn lookup_home_dir(&self, user_id: &str, dataset: Option<&str>, is_current: bool) -> Option>> { + let fe_result = with_py_frontend(|py, fe| { + Ok(match fe._users_.get(*super::LOOKUP_HOME_DIR_FUNC_KEY) { + Some(f) => { + let args = ( + User::new(user_id)?, + if let Some(d) = dataset { + Py::new(py, UserDataset::new(user_id, d))?.to_object(py) + } else { + py.None() + }, + is_current, + ); + + let result = f.call1(py, args)?; + if result.is_none(py) { + Some(None) + } else if let Ok(b) = result.extract::(py) { + if b { + return runtime_error!("'True' is not a valid return value when looking up a user's home directory") + } else { + None + } + } else { + Some(Some(result.extract::(py)?)) + } + } + None => None, + }) + }); + match fe_result { + Ok(r) => match r { + Some(res) => return Some(Ok(res)), + None => None, + }, + Err(e) => Some(Err(e.into())), + } + } + fn as_any(&self) -> &dyn std::any::Any { self } diff --git a/rust/pyapi_metal/src/frontend/mod.rs b/rust/pyapi_metal/src/frontend/mod.rs index 842c618c..0f475012 100644 --- a/rust/pyapi_metal/src/frontend/mod.rs +++ b/rust/pyapi_metal/src/frontend/mod.rs @@ -2,6 +2,10 @@ static MOD_PATH: &'static str = "origen_metal._origen_metal"; static MOD: &'static str = "frontend"; static PY_FRONTEND: &'static str = "__py_frontend__"; +crate::lazy_static! { + pub static ref LOOKUP_HOME_DIR_FUNC_KEY: &'static str = "lookup_default_home_dir_function"; +} + #[macro_export] macro_rules! frontend_mod { ($py:expr) => {{ @@ -223,7 +227,8 @@ pub(crate) fn backend_get_category( } #[cfg(debug_assertions)] -#[pyfunction(opts = "**")] +#[pyfunction] +#[pyo3(signature=(category, data_store, **opts))] pub(crate) fn backend_get_class( _py: Python, category: &str, diff --git a/rust/pyapi_metal/src/frontend/py_data_stores.rs b/rust/pyapi_metal/src/frontend/py_data_stores.rs index e69bfa1d..84ead6c4 100644 --- a/rust/pyapi_metal/src/frontend/py_data_stores.rs +++ b/rust/pyapi_metal/src/frontend/py_data_stores.rs @@ -182,7 +182,7 @@ impl PyDataStoreCategory { } // Note: This will shallow-copy ``init_args`` and ``init_kwargs``, if given. - #[args(func_kwargs = "**")] + #[pyo3(signature=(name, cls, init_args=None, init_kwargs=None, **func_kwargs))] pub fn add( &mut self, py: Python, @@ -205,7 +205,7 @@ impl PyDataStoreCategory { let mut category_idx: Option = None; if let Some(fa) = func_kwargs { if let Some(pn) = fa.get_item("provide_name") { - if pn.is_instance_of::()? { + if pn.is_instance_of::() { provide_name = pn.extract::()?; } else { if let Ok(i) = pn.extract::() { @@ -219,7 +219,7 @@ impl PyDataStoreCategory { } } if let Some(pc) = fa.get_item("provide_category") { - if pc.is_instance_of::()? { + if pc.is_instance_of::() { provide_category = pc.extract::()?; } else { if let Ok(i) = pc.extract::() { diff --git a/rust/pyapi_metal/src/lib.rs b/rust/pyapi_metal/src/lib.rs index 5ab0f1b6..92bbc8e8 100644 --- a/rust/pyapi_metal/src/lib.rs +++ b/rust/pyapi_metal/src/lib.rs @@ -1,3 +1,4 @@ +#[macro_use] pub mod _helpers; pub mod framework; pub mod frontend; @@ -21,8 +22,14 @@ pub mod built_info { include!(concat!(env!("OUT_DIR"), "/built.rs")); } -#[pymodule] -pub fn _origen_metal(py: Python, m: &PyModule) -> PyResult<()> { +pub fn define(py: Python, m: &PyModule) -> PyResult<()> { + let subm = PyModule::new(py, "_origen_metal")?; + _define(py, subm)?; + m.add_submodule(subm)?; + Ok(()) +} + +pub fn _define(py: Python, m: &PyModule) -> PyResult<()> { framework::define(py, m)?; utils::define(py, m)?; frontend::define(py, m)?; @@ -43,10 +50,14 @@ pub fn _origen_metal(py: Python, m: &PyModule) -> PyResult<()> { _helpers::define_tests(py, test_sm)?; m.add_submodule(test_sm)?; } - Ok(()) } +#[pymodule] +pub fn _origen_metal(py: Python, m: &PyModule) -> PyResult<()> { + _define(py, m) +} + fn py_submodule(py: Python, parent: &PyModule, path: &str, func: F) -> PyResult<()> where F: FnOnce(&PyModule) -> PyResult<()>, diff --git a/rust/pyapi_metal/src/utils/differ.rs b/rust/pyapi_metal/src/utils/differ.rs index 025ead9e..9f928d56 100644 --- a/rust/pyapi_metal/src/utils/differ.rs +++ b/rust/pyapi_metal/src/utils/differ.rs @@ -3,11 +3,8 @@ use origen_metal::utils::differ::{ASCIIDiffer, Differ}; use pyo3::prelude::*; use std::path::Path; -#[pyfunction( - ignore_comments = "None", - ignore_blocks = "None", - ignore_blank_lines = "true" -)] +#[pyfunction] +#[pyo3(signature=(file_a, file_b, ignore_comments = None, ignore_blocks = None, ignore_blank_lines = true))] pub fn has_diffs( file_a: &str, file_b: &str, diff --git a/rust/pyapi_metal/src/utils/ldap.rs b/rust/pyapi_metal/src/utils/ldap.rs index 35933ea9..65d10070 100644 --- a/rust/pyapi_metal/src/utils/ldap.rs +++ b/rust/pyapi_metal/src/utils/ldap.rs @@ -37,12 +37,7 @@ impl LDAP {} #[pymethods] impl LDAP { #[new] - #[args( - username = "None", - password = "None", - populate_user_config = "None", - timeout = "None" - )] + #[pyo3(signature=(name, server, base, auth=None, continuous_bind=None, populate_user_config=None, timeout=None))] fn new( name: &str, server: &str, diff --git a/rust/pyapi_metal/src/utils/mailer/mailer.rs b/rust/pyapi_metal/src/utils/mailer/mailer.rs index 869ac194..95924dc0 100644 --- a/rust/pyapi_metal/src/utils/mailer/mailer.rs +++ b/rust/pyapi_metal/src/utils/mailer/mailer.rs @@ -18,7 +18,7 @@ pub struct Mailer { #[pymethods] impl Mailer { #[new] - #[args(timeout="60")] + #[pyo3(signature=(server, port=None, domain=None, auth_method=None, timeout=60, user=None))] pub fn new(server: String, port: Option, domain: Option, auth_method: Option<&str>, timeout: Option, user: Option) -> PyResult { Ok(Self { mailer: OMailer::new(server, port, domain, auth_method, timeout, user)? diff --git a/rust/pyapi_metal/src/utils/mailer/maillists.rs b/rust/pyapi_metal/src/utils/mailer/maillists.rs index ce4c1be0..a140041b 100644 --- a/rust/pyapi_metal/src/utils/mailer/maillists.rs +++ b/rust/pyapi_metal/src/utils/mailer/maillists.rs @@ -16,7 +16,7 @@ pub struct Maillists { #[pymethods] impl Maillists { #[new] - #[args(dirs="*", continue_on_error="false")] + #[pyo3(signature=(n, *dirs, continue_on_error=false))] fn new(n: String, dirs: &PyTuple, continue_on_error: bool) -> PyResult { Ok(Self { om_mls: OrigenMLS::new( diff --git a/rust/pyapi_metal/src/utils/mod.rs b/rust/pyapi_metal/src/utils/mod.rs index 630d993c..9a9899b3 100644 --- a/rust/pyapi_metal/src/utils/mod.rs +++ b/rust/pyapi_metal/src/utils/mod.rs @@ -2,8 +2,10 @@ mod differ; pub mod ldap; pub mod revision_control; pub mod mailer; +pub mod version; use pyo3::prelude::*; +use version::Version; pub(crate) fn define(py: Python, parent: &PyModule) -> PyResult<()> { let subm = PyModule::new(py, "utils")?; @@ -11,6 +13,7 @@ pub(crate) fn define(py: Python, parent: &PyModule) -> PyResult<()> { ldap::define(py, subm)?; differ::define(py, subm)?; mailer::define(py, subm)?; + subm.add_class::()?; parent.add_submodule(subm)?; Ok(()) } diff --git a/rust/pyapi_metal/src/utils/revision_control/mod.rs b/rust/pyapi_metal/src/utils/revision_control/mod.rs index d895697e..32ef4c1a 100644 --- a/rust/pyapi_metal/src/utils/revision_control/mod.rs +++ b/rust/pyapi_metal/src/utils/revision_control/mod.rs @@ -23,7 +23,7 @@ pub struct Base {} #[pymethods] impl Base { #[new] - #[args(_args = "*", _config = "**")] + #[pyo3(signature=(*_args, **_config))] fn new(_args: &PyTuple, _config: Option<&PyDict>) -> PyResult { Ok(Self {}) } diff --git a/rust/pyapi_metal/src/utils/revision_control/status.rs b/rust/pyapi_metal/src/utils/revision_control/status.rs index f5baf76e..eca53630 100644 --- a/rust/pyapi_metal/src/utils/revision_control/status.rs +++ b/rust/pyapi_metal/src/utils/revision_control/status.rs @@ -11,9 +11,7 @@ pub struct Status { #[pymethods] impl Status { #[getter] - fn added(&self) -> PyResult> { - let gil = Python::acquire_gil(); - let py = gil.python(); + fn added(&self, py: Python) -> PyResult> { let mut retn: Vec = vec![]; for added in self.stat.added.iter() { retn.push(pypath!(py, added.display())); @@ -22,18 +20,18 @@ impl Status { } #[getter] - fn removed(&self) -> PyResult> { - to_py_paths(&self.stat.removed.iter().map(|p| p.display()).collect()) + fn removed(&self, py: Python) -> PyResult> { + to_py_paths(py, &self.stat.removed.iter().map(|p| p.display()).collect()) } #[getter] - fn conflicted(&self) -> PyResult> { - to_py_paths(&self.stat.conflicted.iter().map(|p| p.display()).collect()) + fn conflicted(&self, py: Python) -> PyResult> { + to_py_paths(py, &self.stat.conflicted.iter().map(|p| p.display()).collect()) } #[getter] - fn changed(&self) -> PyResult> { - to_py_paths(&self.stat.changed.iter().map(|p| p.display()).collect()) + fn changed(&self, py: Python) -> PyResult> { + to_py_paths(py, &self.stat.changed.iter().map(|p| p.display()).collect()) } #[getter] diff --git a/rust/pyapi_metal/src/utils/revision_control/supported/git.rs b/rust/pyapi_metal/src/utils/revision_control/supported/git.rs index b1747218..a344a4db 100644 --- a/rust/pyapi_metal/src/utils/revision_control/supported/git.rs +++ b/rust/pyapi_metal/src/utils/revision_control/supported/git.rs @@ -39,7 +39,7 @@ impl Git { } #[new] - #[args(args = "*", config = "**")] + #[pyo3(signature=(*args, **config))] fn new(args: &PyTuple, config: Option<&PyDict>) -> PyResult<(Self, Base)> { let mut c: HashMap = HashMap::new(); if let Some(cfg) = config { @@ -54,6 +54,7 @@ impl Git { Ok(self.rc()?.populate(version)?) } + #[pyo3(signature=(force, path, version))] fn checkout(&self, force: bool, path: Option<&str>, version: &str) -> PyResult { let rusty_path; if let Some(p) = path { @@ -81,7 +82,7 @@ impl Git { }) } - #[args(kwargs = "**")] + #[pyo3(signature=(tagname, **kwargs))] fn tag(&self, tagname: &str, kwargs: Option<&PyDict>) -> PyResult<()> { let msg: Option<&str>; Ok(self.rc()?.tag( @@ -116,7 +117,7 @@ impl Git { Ok(self.rc()?.is_initialized()?) } - #[args(paths = "*", kwargs = "**")] + #[pyo3(signature=(*paths, **kwargs))] fn checkin(&self, paths: &PyTuple, kwargs: Option<&PyDict>) -> PyResult { let msg; let dry_run; @@ -149,7 +150,7 @@ impl Git { )?)) } - #[args(dry_run = "false")] + #[pyo3(signature=(msg, dry_run=false))] fn checkin_all(&self, msg: &str, dry_run: bool) -> PyResult { Ok(PyOutcome::from_origen( self.rc()?.checkin(None, msg, dry_run)?, diff --git a/rust/pyapi_metal/src/utils/version.rs b/rust/pyapi_metal/src/utils/version.rs new file mode 100644 index 00000000..cd00d659 --- /dev/null +++ b/rust/pyapi_metal/src/utils/version.rs @@ -0,0 +1,98 @@ +use origen_metal::utils::version::Version as OMVersion; +use pyo3::prelude::*; +use pyo3::types::PyType; +use std::path::PathBuf; + +#[pyclass] +pub struct Version { + _origen_version: OMVersion, +} + +impl Version { + fn coerce_error_type(err: Result) -> PyResult { + match err { + Ok(v) => Ok(v), + Err(e) => if e.msg.starts_with("unexpected character '") { + value_error!(e.msg) + } else { + runtime_error!(e.msg) + } + } + } +} + +#[pymethods] +impl Version { + #[new] + fn new(ver: &str) -> PyResult { + Ok(Self { + _origen_version: { + Self::coerce_error_type(OMVersion::new_pep440(ver))? + } + }) + } + + #[classmethod] + fn from_pyproject(_cls: &PyType, pyproject: PathBuf) -> PyResult { + Ok( Self { + _origen_version: OMVersion::from_pyproject_with_toml_handle(pyproject)?.orig_version().clone() + }) + } + + #[classmethod] + fn from_cargo(_cls: &PyType, cargo_toml: PathBuf) -> PyResult { + Ok( Self { + _origen_version: OMVersion::from_cargo_with_toml_handle(cargo_toml)?.orig_version().clone() + }) + } + + #[classmethod] + fn pep440(_cls: &PyType, ver: &str) -> PyResult { + Ok( Self { + _origen_version: { + Self::coerce_error_type(OMVersion::new_pep440(ver))? + } + }) + } + + #[classmethod] + fn semver(_cls: &PyType, ver: &str) -> PyResult { + Ok( Self { + _origen_version: { + Self::coerce_error_type(OMVersion::new_semver(ver))? + } + }) + } + + fn __str__(&self) -> PyResult { + Ok(self._origen_version.to_string()) + } + + fn convert_to_pep440(&mut self) -> PyResult { + Ok(self._origen_version.convert_to_pep440()) + } + + fn convert_to_semver(&mut self) -> PyResult { + Ok(self._origen_version.convert_to_semver()) + } + + #[getter] + fn is_pep440(&self) -> PyResult { + Ok(self._origen_version.is_pep440()) + } + + #[getter] + fn is_semver(&self) -> PyResult { + Ok(self._origen_version.is_semver()) + } + + #[getter] + fn pep440_str(&self) -> PyResult { + Ok(self._origen_version.to_pep440_string()) + } + + #[getter] + fn semver_str(&self) -> PyResult { + Ok(self._origen_version.to_semver_string()) + } +} diff --git a/test_apps/no_workspace/README.md b/test_apps/no_workspace/README.md new file mode 100644 index 00000000..0915725d --- /dev/null +++ b/test_apps/no_workspace/README.md @@ -0,0 +1,49 @@ +No-Workspace tests require some setup to run. This can custom pyenv can be setup for this, or manual changes can be made. A similar sequence is contained in `regression_test.yml`. + +### Ensure the origen plugin is up to date with the latest executable and `pyapi`: +~~~ +cd rust/origen +cargo build --workspace +cp target/debug/origen ../../python/origen/origen/__bin__/bin/ +cd ../pyapi +cargo build +# For linux +cp target/debug/lib_origen.so ../../python/origen/_origen.so +~~~ + +### Clean origen_metal tmp/ directory +For some reason, this confuses `pip`, but is an easy workaround: + +~~~ +rm python/origen_metal/tmp -r +~~~ + +### Remove Origen-Metal Dependency from Origen +Origen Metal version will likely not be checked in during development. Get around this by removing it as a dependency from Origen +Origen Metal can be installed manually afterwards. + +~~~ +cd python/origen +poetry remove origen_metal +~~~ + +### Install Origen & Origen Metal + +~~~ +pip install python/origen +pip install python/origen_metal +~~~ + +### Install Pytest +`pytest` is currently just a development dependency. Need to instal it manually: + +~~~ +pip install pytest==7.2.1 +~~~ + +### Run Some Tests +~~~ +pytest test_no_workspace.py::TestNoWorkspaceNoPlugins -vv +~~~ + +See the `regression_test.yml` for more tests to run in this setup. diff --git a/test_apps/no_workspace/__init__.py b/test_apps/no_workspace/__init__.py new file mode 100644 index 00000000..9f5919ba --- /dev/null +++ b/test_apps/no_workspace/__init__.py @@ -0,0 +1,2 @@ +import pytest +pytest.register_assert_rewrite("no_workspace.t_invocation_env") diff --git a/test_apps/no_workspace/eval_scripts/print_pl_names.py b/test_apps/no_workspace/eval_scripts/print_pl_names.py new file mode 100644 index 00000000..4cb9d252 --- /dev/null +++ b/test_apps/no_workspace/eval_scripts/print_pl_names.py @@ -0,0 +1,4 @@ +import origen +header = "--Origen Eval--" +print(header) +print(list(origen.plugins.keys())) diff --git a/test_apps/no_workspace/eval_scripts/print_status.py b/test_apps/no_workspace/eval_scripts/print_status.py new file mode 100644 index 00000000..dd9606d5 --- /dev/null +++ b/test_apps/no_workspace/eval_scripts/print_status.py @@ -0,0 +1,4 @@ +import origen +header = "--Origen Eval--" +print(header) +print(origen.status) diff --git a/test_apps/no_workspace/t_invocation_env.py b/test_apps/no_workspace/t_invocation_env.py new file mode 100644 index 00000000..e3339931 --- /dev/null +++ b/test_apps/no_workspace/t_invocation_env.py @@ -0,0 +1,171 @@ +# Use the local origen/origen_metal - actual tests should be done through 'eval', which will use the installed packages. +import sys, pathlib +p = pathlib.Path(__file__).parent.parent.parent.joinpath("python/origen") +sys.path.append(str(p)) +sys.path.append(str(p.parent.joinpath("origen_metal"))) + +import origen, _origen, origen_metal + +import pytest, pip, jinja2, shutil, subprocess +from origen.helpers.regressions.cli import CLI +from types import ModuleType +from pathlib import Path, PosixPath, WindowsPath + +sys.path.append(str(pathlib.Path(__file__).parent.parent.joinpath("test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli"))) +from dirs import o2_root, cli_dir + +PyProjectSrc = _origen.infrastructure.pyproject.PyProjectSrc +toml = "pyproject.toml" +lockfile = "poetry.lock" +no_workspace_test_dir = pathlib.Path(__file__).parent +eval_scripts_dir = no_workspace_test_dir.joinpath("eval_scripts") +status_eval_script = eval_scripts_dir.joinpath("print_status.py") +pl_names_eval_script = eval_scripts_dir.joinpath("print_pl_names.py") + +# Assume pip is installed in 'site-packages' +site_packages_dir = pathlib.Path(pip.__file__).parent.parent +site_cli_dir = site_packages_dir.joinpath("origen/__bin__/bin") + +class T_InvocationBaseTests(CLI): + site_packages_dir = site_packages_dir + site_cli_dir = site_cli_dir + templates_dir = no_workspace_test_dir.joinpath("templates") + templates_out_dir = templates_dir.joinpath("output") + cli_dir = cli_dir + PyProjectSrc = PyProjectSrc + + @classmethod + def setup_method(cls): + cls.set_params() + if cls.target_pyproj_dir: + cls.target_pyproj_toml = cls.target_pyproj_dir.joinpath(toml) + cls.target_poetry_lock = cls.target_pyproj_dir.joinpath(lockfile) + else: + cls.target_pyproj_toml = None + cls.target_poetry_lock = None + + if not hasattr(cls, "file_based_evals"): + cls.file_based_evals = False + if not hasattr(cls, "error_case"): + cls.error_case = False + cls.error_case_global_fallback = False + + cls.cli_location = cls.cli_dir.joinpath(f"origen{'.exe' if origen.running_on_windows else ''}") + + @property + def header(self): + return "--Origen Eval--" + + def eval_and_parse(self, code): + if isinstance(code, str): + code = [code] + out = CLI.global_cmds.eval.run(*code) + out = out.split("\n") + idx = next(i for i, l in enumerate(out) if l.endswith(self.header)) + return eval(out[idx+1]) + + def get_status(self): + if self.file_based_evals: + return self.eval_and_parse(["-f", status_eval_script]) + else: + return self.eval_and_parse(f"print('{self.header}'); print(origen.status)") + + def test_invocation_from_pytest(self): + assert origen.status["pyproject"] is None + assert origen.status["invocation"] is None + + def test_pyproject_and_invocation_set(self): + status = self.get_status() + assert status["pyproject"] == self.target_pyproj_toml + assert status["invocation"] == self.invocation + + def test_cli_location(self): + status = self.get_status() + assert status['cli_location'] == self.cli_location + +class T_InvocationEnv(T_InvocationBaseTests): + @classmethod + def setup_method(cls): + super().setup_method() + # cls.set_params() + if cls.target_pyproj_dir: + cls._pyproj_src_file = cls.gen_pyproj() + if not hasattr(cls, "move_pyproject"): + if cls.target_pyproj_dir: + cls.move_pyproject = True + else: + cls.move_pyproject = False + # TODO clear any existing pyproject/poetry.locks ? + # cls._pyproj_lock = cls._pyproj_file.parent.joinpath("poetry.lock") + # for d in origen_exe_loc.parents: + # f = d.joinpath(toml) + # if f.exists(): + # target = f.parent.joinpath(f"{toml}.origen.regressions") + # print(f"Temporarily moving pyproject {f} to {target}") + # f.rename(target) + if cls.move_pyproject: + target = cls.target_pyproj_dir.joinpath(toml) + print(f"Moving pyproject {cls._pyproj_src_file} to {target}") + shutil.copy(cls._pyproj_src_file, target) + if cls.target_pyproj_dir: + subprocess.run(["pip", "--version"], check=True, cwd=cls.target_pyproj_dir) + subprocess.run(["poetry", "--version"], check=True, cwd=cls.target_pyproj_dir) + subprocess.run(["poetry", "install"], check=True, cwd=cls.target_pyproj_dir) + + @classmethod + def teardown_method(cls): + if cls.move_pyproject: + print(f"Cleaning pyproject and lockfile {cls.target_pyproj_toml}, {cls.target_poetry_lock}") + cls.target_pyproj_toml.unlink() + cls.target_poetry_lock.unlink() + + @classmethod + def gen_pyproj(cls): + env = jinja2.Environment( + loader=jinja2.FileSystemLoader(searchpath="./templates") + ) + t = env.get_template("pyproject.toml") + cls.templates_out_dir.mkdir(exist_ok=True) + pyproj = cls.templates_out_dir.joinpath(f"{cls.__name__}.{toml}") + with open(pyproj, "w") as f: + f.write(t.render( + local_origen=cls.local_origen, + name=cls.__name__, + o2_root=o2_root, + has_pls=cls.has_pls, + )) + return pyproj + + # TEST_NEEDED Invocations: origen/metal package locations + # class TestBareEnv(CLI): + # @pytest.mark.parameterize( + # [origen, origen._origen, origen_metal, origen._origen_metal], + # ids=["origen", "_origen", "origen_metal", "_origen_metal"] + # ) + # def test_origen_pkgs(self, mod, ext, ): + # # assert origen.__file__ == ? + # # assert origen._origen.__file__ == + # # assert origen_metal.__file__ == ? + # # TEST_NEEDED CLI not sure why origen_metal._origen_metal has no filename + # # Just assert its a module fo now. + # # if id == "_origen_metal": + # assert isinstance(origen_metal._origen_metal, ModuleType) + + def get_plugin_names(self): + if self.file_based_evals: + return self.eval_and_parse(["-f", pl_names_eval_script]) + else: + return self.eval_and_parse(f"print('{self.header}'); print(list(origen.plugins.keys()))") + + # TEST_NEEDED Invocations: check 'origen -h' in various contexts? + @pytest.mark.skip + def test_origen_h(self): + raise NotImplementedError + + def test_plugins(self): + pls = self.get_plugin_names() + if self.has_pls: + # TODO consistent plugin loading + assert set(pls) == {'pl_ext_cmds', 'test_apps_shared_test_helpers', 'python_plugin'} + else: + assert pls == [] diff --git a/test_apps/no_workspace/templates/pyproject.toml b/test_apps/no_workspace/templates/pyproject.toml new file mode 100644 index 00000000..41709614 --- /dev/null +++ b/test_apps/no_workspace/templates/pyproject.toml @@ -0,0 +1,24 @@ +[tool.poetry] +name = "{{ name }}" +version = "0.1.0" +description = "Origen Installation Test" +authors = ["Origen-SDK"] + +[tool.poetry.dependencies] +python = ">=3.7.0,<3.13" +{% if local_origen %} +origen = { path = "{{ o2_root.joinpath("python/origen").as_posix() }}", develop = true } +origen_metal = { path = "{{ o2_root.joinpath("python/origen_metal").as_posix() }}", develop = true } +{% else %} +origen = ">= 0.0.0" +origen_metal = ">= 0.0.0" +{% endif %} +{% if has_pls %} + {% if local_origen %} +python_plugin = { path = "{{ o2_root.joinpath("test_apps/python_plugin").as_posix() }}", develop = true } +test_apps_shared_test_helpers = { path = "{{ o2_root.joinpath("test_apps/test_apps_shared_test_helpers").as_posix() }}", develop = true } + {% else %} +python_plugin = ">= 0.0.0" +test_apps_shared_test_helpers = ">= 0.0.0" + {% endif %} +{% endif %} \ No newline at end of file diff --git a/test_apps/no_workspace/test_global_install.py b/test_apps/no_workspace/test_global_install.py new file mode 100644 index 00000000..64a61523 --- /dev/null +++ b/test_apps/no_workspace/test_global_install.py @@ -0,0 +1,33 @@ +from .t_invocation_env import T_InvocationEnv, PyProjectSrc + +class GlobalInstalBase(T_InvocationEnv): + @classmethod + def set_params(cls): + cls.local_origen = True + cls.invocation = PyProjectSrc.Global + cls.cli_dir = cls.site_cli_dir + cls.file_based_evals = True + +# Pyproject closer to root - no plugins +class TestGlobalInstallNoPlugins(GlobalInstalBase): + @classmethod + def set_params(cls): + super().set_params() + cls.target_pyproj_dir = cls.site_packages_dir.parent + cls.has_pls = False + +# Pyproject at site-packages dir - with plugins +class TestGlobalInstallWithPlugins(GlobalInstalBase): + @classmethod + def set_params(cls): + super().set_params() + cls.target_pyproj_dir = cls.site_packages_dir + cls.has_pls = True + +# Pyproject at binary location - no plugins +class TestGlobalInstallAtCliDir(GlobalInstalBase): + @classmethod + def set_params(cls): + super().set_params() + cls.target_pyproj_dir = cls.site_cli_dir + cls.has_pls = False diff --git a/test_apps/no_workspace/test_no_workspace.py b/test_apps/no_workspace/test_no_workspace.py new file mode 100644 index 00000000..1d571779 --- /dev/null +++ b/test_apps/no_workspace/test_no_workspace.py @@ -0,0 +1,27 @@ +from .t_invocation_env import T_InvocationEnv, no_workspace_test_dir, PyProjectSrc, site_packages_dir + +class TestNoWorkspaceNoPlugins(T_InvocationEnv): + user_install_dir = no_workspace_test_dir.joinpath("user_install") + + @classmethod + def set_params(cls): + cls.target_pyproj_dir = None + cls.invocation = PyProjectSrc.NoneFound + cls.cli_dir = site_packages_dir.joinpath("origen/__bin__/bin") + cls.has_pls = False + + @classmethod + def setup_method(cls): + cls.file_based_evals = True + super().setup_method() + +class TestNoWorkspaceWithPlugins(TestNoWorkspaceNoPlugins): + @classmethod + def set_params(cls): + super().set_params() + cls.has_pls = True + + def test_exts_in_user_global_context(self): + out = self.global_cmds.eval.run("1==1", "-b", "-a") + assert "Hi from python-plugin during 'eval'!" in out + assert "Hi again from python-plugin during 'eval'!" in out diff --git a/test_apps/no_workspace/test_user_install.py b/test_apps/no_workspace/test_user_install.py new file mode 100644 index 00000000..a491eae6 --- /dev/null +++ b/test_apps/no_workspace/test_user_install.py @@ -0,0 +1,130 @@ +import os +from .t_invocation_env import T_InvocationEnv, T_InvocationBaseTests, no_workspace_test_dir, PyProjectSrc + +class TestUserInstall(T_InvocationEnv): + user_install_dir = no_workspace_test_dir.joinpath("user_install") + + @classmethod + def set_params(cls): + cls.local_origen = True + cls.has_pls = True + cls.target_pyproj_dir = cls.user_install_dir + cls.move_pyproject = False + cls.invocation = PyProjectSrc.UserGlobal + cls.file_based_evals = True + cls.cli_dir = cls.site_cli_dir + + @classmethod + def setup_method(cls): + super().setup_method() + os.environ["ORIGEN_PYPROJECT"] = str(cls.user_install_dir) + + @classmethod + def teardown_method(cls): + del os.environ["ORIGEN_PYPROJECT"] + + def test_exts_in_user_global_context(self): + out = self.global_cmds.eval.run("print('hi with exts')", "-b", "-a") + assert "Hi from python-plugin during 'eval'!" in out + assert "Hi again from python-plugin during 'eval'!" in out + +class TestErrorCasesWithFallback(): + class TestInvalidPyProjectDir(T_InvocationBaseTests): + invalid_install_dir = no_workspace_test_dir.joinpath("no_dir") + + @classmethod + def set_params(cls): + cls.local_origen = True + cls.has_pls = True + cls.move_pyproject = False + cls.file_based_evals = True + cls.error_case = f"Errors encountered resolving pyproject: ORIGEN_PYPROJECT '{cls.invalid_install_dir}' does not exists!" + cls.error_case_global_fallback = True + + cls.invocation = None + cls.cli_dir = cls.site_cli_dir + cls.target_pyproj_dir = None + + + @classmethod + def setup_method(cls): + super().setup_method() + os.environ["ORIGEN_PYPROJECT"] = str(cls.invalid_install_dir) + + @classmethod + def teardown_method(cls): + del os.environ["ORIGEN_PYPROJECT"] + + def test_error_message(self): + out = self.global_cmds.eval.run("1==1") + errors = self.extract_logged_errors(out) + assert errors[0] == f"Errors encountered resolving pyproject: ORIGEN_PYPROJECT '{self.invalid_install_dir}' does not exists!" + assert errors[1] == "Dependency source has not been set - defaulting to global Python installation" + assert errors[2] == "Dependency source has not been set - defaulting to global Python installation" + assert len(errors) == 3 + + class TestMissingPyProject(T_InvocationBaseTests): + missing_pyproject = no_workspace_test_dir + + @classmethod + def set_params(cls): + cls.local_origen = True + cls.has_pls = True + cls.move_pyproject = False + cls.file_based_evals = True + cls.error_case = f"Errors encountered resolving pyproject: Could not locate pyproject.toml from ORIGEN_PYPROJECT {cls.missing_pyproject.joinpath('pyproject.toml')}" + cls.error_case_global_fallback = True + + cls.invocation = None + cls.cli_dir = cls.site_cli_dir + cls.target_pyproj_dir = None + + @classmethod + def setup_method(cls): + super().setup_method() + os.environ["ORIGEN_PYPROJECT"] = str(cls.missing_pyproject) + + @classmethod + def teardown_method(cls): + del os.environ["ORIGEN_PYPROJECT"] + + def test_error_message(self): + out = self.global_cmds.eval.run("1==1") + errors = self.extract_logged_errors(out) + print(out) + assert errors[0] == f"Errors encountered resolving pyproject: Could not locate pyproject.toml from ORIGEN_PYPROJECT {self.missing_pyproject.joinpath('pyproject.toml')}" + assert errors[1] == "Dependency source has not been set - defaulting to global Python installation" + assert errors[2] == "Dependency source has not been set - defaulting to global Python installation" + assert len(errors) == 3 + + class TestMalformedPyProject(): + # Use the template pyproject as an example of a malformed one + malformed_pyproject = no_workspace_test_dir.joinpath("templates") + + @classmethod + def set_params(cls): + cls.local_origen = True + cls.has_pls = True + cls.move_pyproject = False + cls.file_based_evals = True + + cls.invocation = None + cls.cli_dir = cls.site_cli_dir + cls.target_pyproj_dir = None + + @classmethod + def setup_method(cls): + os.environ["ORIGEN_PYPROJECT"] = str(cls.malformed_pyproject) + + @classmethod + def teardown_method(cls): + del os.environ["ORIGEN_PYPROJECT"] + + def test_error_message(self): + # Pyproject found but malformed should print the poetry errors as it tries to run. + # Should not fall back to global install, even if its available. Pyproject should be fixed. + out = T_InvocationBaseTests.global_cmds.eval.gen_error("1==1", run_opts={"return_details": True}, return_full=True) + err = f"Invalid TOML file {self.malformed_pyproject.joinpath('pyproject.toml').as_posix()}" + assert err in out["stderr"] + assert out["stdout"] == '' + diff --git a/test_apps/no_workspace/user_install/inner/.keep b/test_apps/no_workspace/user_install/inner/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/no_workspace/user_install/poetry.lock b/test_apps/no_workspace/user_install/poetry.lock new file mode 100644 index 00000000..8f338af3 --- /dev/null +++ b/test_apps/no_workspace/user_install/poetry.lock @@ -0,0 +1,1976 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.13" +description = "A configurable sidebar-enabled Sphinx theme" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "babel" +version = "2.12.1" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, + {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[[package]] +name = "backports-cached-property" +version = "1.0.2" +description = "cached_property() - computed once per instance, cached as attribute" +category = "main" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "backports.cached-property-1.0.2.tar.gz", hash = "sha256:9306f9eed6ec55fd156ace6bc1094e2c86fae5fb2bf07b6a9c00745c656e75dd"}, + {file = "backports.cached_property-1.0.2-py3-none-any.whl", hash = "sha256:baeb28e1cd619a3c9ab8941431fe34e8490861fb998c6c4590693d50171db0cc"}, +] + +[[package]] +name = "beautifulsoup4" +version = "4.8.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] + +[package.dependencies] +soupsieve = ">=1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "build" +version = "0.10.0" +description = "A simple, correct Python build frontend" +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "build-0.10.0-py3-none-any.whl", hash = "sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171"}, + {file = "build-0.10.0.tar.gz", hash = "sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +importlib-metadata = {version = ">=0.22", markers = "python_version < \"3.8\""} +packaging = ">=19.0" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2021.08.31)", "sphinx (>=4.0,<5.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)"] +test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "toml (>=0.10.0)", "wheel (>=0.36.0)"] +typing = ["importlib-metadata (>=5.1)", "mypy (==0.991)", "tomli", "typing-extensions (>=3.7.4.3)"] +virtualenv = ["virtualenv (>=20.0.35)"] + +[[package]] +name = "cachecontrol" +version = "0.12.14" +description = "httplib2 caching for requests" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "CacheControl-0.12.14-py2.py3-none-any.whl", hash = "sha256:1c2939be362a70c4e5f02c6249462b3b7a24441e4f1ced5e9ef028172edf356a"}, + {file = "CacheControl-0.12.14.tar.gz", hash = "sha256:d1087f45781c0e00616479bfd282c78504371ca71da017b49df9f5365a95feba"}, +] + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win32.whl", hash = "sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448"}, + {file = "charset_normalizer-3.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win32.whl", hash = "sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909"}, + {file = "charset_normalizer-3.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974"}, + {file = "charset_normalizer-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win32.whl", hash = "sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0"}, + {file = "charset_normalizer-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win32.whl", hash = "sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1"}, + {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, + {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, +] + +[[package]] +name = "cleo" +version = "2.0.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "cleo-2.0.1-py3-none-any.whl", hash = "sha256:6eb133670a3ed1f3b052d53789017b6e50fca66d1287e6e6696285f4cb8ea448"}, + {file = "cleo-2.0.1.tar.gz", hash = "sha256:eb4b2e1f3063c11085cebe489a6e9124163c226575a3c3be69b2e51af4a15ec5"}, +] + +[package.dependencies] +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=2.2.0,<3.0.0" + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "crashtest" +version = "0.4.1" +description = "Manage Python errors with ease" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] + +[[package]] +name = "cryptography" +version = "41.0.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:f73bff05db2a3e5974a6fd248af2566134d8981fd7ab012e5dd4ddb1d9a70699"}, + {file = "cryptography-41.0.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:1a5472d40c8f8e91ff7a3d8ac6dfa363d8e3138b961529c996f3e2df0c7a411a"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fa01527046ca5facdf973eef2535a27fec4cb651e4daec4d043ef63f6ecd4ca"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b46e37db3cc267b4dea1f56da7346c9727e1209aa98487179ee8ebed09d21e43"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d198820aba55660b4d74f7b5fd1f17db3aa5eb3e6893b0a41b75e84e4f9e0e4b"}, + {file = "cryptography-41.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:948224d76c4b6457349d47c0c98657557f429b4e93057cf5a2f71d603e2fc3a3"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:059e348f9a3c1950937e1b5d7ba1f8e968508ab181e75fc32b879452f08356db"}, + {file = "cryptography-41.0.1-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b4ceb5324b998ce2003bc17d519080b4ec8d5b7b70794cbd2836101406a9be31"}, + {file = "cryptography-41.0.1-cp37-abi3-win32.whl", hash = "sha256:8f4ab7021127a9b4323537300a2acfb450124b2def3756f64dc3a3d2160ee4b5"}, + {file = "cryptography-41.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:1fee5aacc7367487b4e22484d3c7e547992ed726d14864ee33c0176ae43b0d7c"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9a6c7a3c87d595608a39980ebaa04d5a37f94024c9f24eb7d10262b92f739ddb"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5d092fdfedaec4cbbffbf98cddc915ba145313a6fdaab83c6e67f4e6c218e6f3"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a8e6c2de6fbbcc5e14fd27fb24414507cb3333198ea9ab1258d916f00bc3039"}, + {file = "cryptography-41.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb33ccf15e89f7ed89b235cff9d49e2e62c6c981a6061c9c8bb47ed7951190bc"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5f0ff6e18d13a3de56f609dd1fd11470918f770c6bd5d00d632076c727d35485"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7bfc55a5eae8b86a287747053140ba221afc65eb06207bedf6e019b8934b477c"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:eb8163f5e549a22888c18b0d53d6bb62a20510060a22fd5a995ec8a05268df8a"}, + {file = "cryptography-41.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:8dde71c4169ec5ccc1087bb7521d54251c016f126f922ab2dfe6649170a3b8c5"}, + {file = "cryptography-41.0.1.tar.gz", hash = "sha256:d34579085401d3f49762d2f7d6634d6b6c2ae1242202e860f4d26b046e3a1006"}, +] + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +nox = ["nox"] +pep8test = ["black", "check-sdist", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "distlib" +version = "0.3.6" +description = "Distribution utilities" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"}, + {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"}, +] + +[[package]] +name = "docutils" +version = "0.20.1" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "docutils-0.20.1-py3-none-any.whl", hash = "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6"}, + {file = "docutils-0.20.1.tar.gz", hash = "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b"}, +] + +[[package]] +name = "dulwich" +version = "0.21.5" +description = "Python Git Library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.21.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8864719bc176cdd27847332a2059127e2f7bab7db2ff99a999873cb7fff54116"}, + {file = "dulwich-0.21.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3800cdc17d144c1f7e114972293bd6c46688f5bcc2c9228ed0537ded72394082"}, + {file = "dulwich-0.21.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e2f676bfed8146966fe934ee734969d7d81548fbd250a8308582973670a9dab1"}, + {file = "dulwich-0.21.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db330fb59fe3b9d253bdf0e49a521739db83689520c4921ab1c5242aaf77b82"}, + {file = "dulwich-0.21.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3e8f6d4f4f4d01dd1d3c968e486d4cd77f96f772da7265941bc506de0944ddb9"}, + {file = "dulwich-0.21.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1cc0c9ba19ac1b2372598802bc9201a9c45e5d6f1f7a80ec40deeb10acc4e9ae"}, + {file = "dulwich-0.21.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:61e10242b5a7a82faa8996b2c76239cfb633620b02cdd2946e8af6e7eb31d651"}, + {file = "dulwich-0.21.5-cp310-cp310-win32.whl", hash = "sha256:7f357639b56146a396f48e5e0bc9bbaca3d6d51c8340bd825299272b588fff5f"}, + {file = "dulwich-0.21.5-cp310-cp310-win_amd64.whl", hash = "sha256:891d5c73e2b66d05dbb502e44f027dc0dbbd8f6198bc90dae348152e69d0befc"}, + {file = "dulwich-0.21.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:45d6198e804b539708b73a003419e48fb42ff2c3c6dd93f63f3b134dff6dd259"}, + {file = "dulwich-0.21.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c2a565d4e704d7f784cdf9637097141f6d47129c8fffc2fac699d57cb075a169"}, + {file = "dulwich-0.21.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:823091d6b6a1ea07dc4839c9752198fb39193213d103ac189c7669736be2eaff"}, + {file = "dulwich-0.21.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2c9931b657f2206abec0964ec2355ee2c1e04d05f8864e823ffa23c548c4548"}, + {file = "dulwich-0.21.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7dc358c2ee727322a09b7c6da43d47a1026049dbd3ad8d612eddca1f9074b298"}, + {file = "dulwich-0.21.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6155ab7388ee01c670f7c5d8003d4e133eebebc7085a856c007989f0ba921b36"}, + {file = "dulwich-0.21.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a605e10d72f90a39ea2e634fbfd80f866fc4df29a02ea6db52ae92e5fd4a2003"}, + {file = "dulwich-0.21.5-cp311-cp311-win32.whl", hash = "sha256:daa607370722c3dce99a0022397c141caefb5ed32032a4f72506f4817ea6405b"}, + {file = "dulwich-0.21.5-cp311-cp311-win_amd64.whl", hash = "sha256:5e56b2c1911c344527edb2bf1a4356e2fb7e086b1ba309666e1e5c2224cdca8a"}, + {file = "dulwich-0.21.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:85d3401d08b1ec78c7d58ae987c4bb7b768a438f3daa74aeb8372bebc7fb16fa"}, + {file = "dulwich-0.21.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90479608e49db93d8c9e4323bc0ec5496678b535446e29d8fd67dc5bbb5d51bf"}, + {file = "dulwich-0.21.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a6bf99f57bcac4c77fc60a58f1b322c91cc4d8c65dc341f76bf402622f89cb"}, + {file = "dulwich-0.21.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3e68b162af2aae995355e7920f89d50d72b53d56021e5ac0a546d493b17cbf7e"}, + {file = "dulwich-0.21.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:0ab86d6d42e385bf3438e70f3c9b16de68018bd88929379e3484c0ef7990bd3c"}, + {file = "dulwich-0.21.5-cp37-cp37m-win32.whl", hash = "sha256:f2eeca6d61366cf5ee8aef45bed4245a67d4c0f0d731dc2383eabb80fa695683"}, + {file = "dulwich-0.21.5-cp37-cp37m-win_amd64.whl", hash = "sha256:1b20a3656b48c941d49c536824e1e5278a695560e8de1a83b53a630143c4552e"}, + {file = "dulwich-0.21.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3932b5e17503b265a85f1eda77ede647681c3bab53bc9572955b6b282abd26ea"}, + {file = "dulwich-0.21.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6616132d219234580de88ceb85dd51480dc43b1bdc05887214b8dd9cfd4a9d40"}, + {file = "dulwich-0.21.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:eaf6c7fb6b13495c19c9aace88821c2ade3c8c55b4e216cd7cc55d3e3807d7fa"}, + {file = "dulwich-0.21.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be12a46f73023970125808a4a78f610c055373096c1ecea3280edee41613eba8"}, + {file = "dulwich-0.21.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baecef0d8b9199822c7912876a03a1af17833f6c0d461efb62decebd45897e49"}, + {file = "dulwich-0.21.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:82f632afb9c7c341a875d46aaa3e6c5e586c7a64ce36c9544fa400f7e4f29754"}, + {file = "dulwich-0.21.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82cdf482f8f51fcc965ffad66180b54a9abaea9b1e985a32e1acbfedf6e0e363"}, + {file = "dulwich-0.21.5-cp38-cp38-win32.whl", hash = "sha256:c8ded43dc0bd2e65420eb01e778034be5ca7f72e397a839167eda7dcb87c4248"}, + {file = "dulwich-0.21.5-cp38-cp38-win_amd64.whl", hash = "sha256:2aba0fdad2a19bd5bb3aad6882580cb33359c67b48412ccd4cfccd932012b35e"}, + {file = "dulwich-0.21.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fd4ad079758514375f11469e081723ba8831ce4eaa1a64b41f06a3a866d5ac34"}, + {file = "dulwich-0.21.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fe62685bf356bfb4d0738f84a3fcf0d1fc9e11fee152e488a20b8c66a52429e"}, + {file = "dulwich-0.21.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:aae448da7d80306dda4fc46292fed7efaa466294571ab3448be16714305076f1"}, + {file = "dulwich-0.21.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b24cb1fad0525dba4872e9381bc576ea2a6dcdf06b0ed98f8e953e3b1d719b89"}, + {file = "dulwich-0.21.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e39b7c2c9bda6acae83b25054650a8bb7e373e886e2334721d384e1479bf04b"}, + {file = "dulwich-0.21.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26456dba39d1209fca17187db06967130e27eeecad2b3c2bbbe63467b0bf09d6"}, + {file = "dulwich-0.21.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:281310644e02e3aa6d76bcaffe2063b9031213c4916b5f1a6e68c25bdecfaba4"}, + {file = "dulwich-0.21.5-cp39-cp39-win32.whl", hash = "sha256:4814ca3209dabe0fe7719e9545fbdad7f8bb250c5a225964fe2a31069940c4cf"}, + {file = "dulwich-0.21.5-cp39-cp39-win_amd64.whl", hash = "sha256:c922a4573267486be0ef85216f2da103fb38075b8465dc0e90457843884e4860"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e52b20c4368171b7d32bd3ab0f1d2402e76ad4f2ea915ff9aa73bc9fa2b54d6d"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeb736d777ee21f2117a90fc453ee181aa7eedb9e255b5ef07c51733f3fe5cb6"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e8a79c1ed7166f32ad21974fa98d11bf6fd74e94a47e754c777c320e01257c6"}, + {file = "dulwich-0.21.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b943517e30bd651fbc275a892bb96774f3893d95fe5a4dedd84496a98eaaa8ab"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:32493a456358a3a6c15bbda07106fc3d4cc50834ee18bc7717968d18be59b223"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0aa44b812d978fc22a04531f5090c3c369d5facd03fa6e0501d460a661800c7f"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f46bcb6777e5f9f4af24a2bd029e88b77316269d24ce66be590e546a0d8f7b7"}, + {file = "dulwich-0.21.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a917fd3b4493db3716da2260f16f6b18f68d46fbe491d851d154fc0c2d984ae4"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:684c52cff867d10c75a7238151ca307582b3d251bbcd6db9e9cffbc998ef804e"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9019189d7a8f7394df6a22cd5b484238c5776e42282ad5d6d6c626b4c5f43597"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:494024f74c2eef9988adb4352b3651ac1b6c0466176ec62b69d3d3672167ba68"}, + {file = "dulwich-0.21.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f9b6ac1b1c67fc6083c42b7b6cd3b211292c8a6517216c733caf23e8b103ab6d"}, + {file = "dulwich-0.21.5.tar.gz", hash = "sha256:70955e4e249ddda6e34a4636b90f74e931e558f993b17c52570fa6144b993103"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version <= \"3.7\""} +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, + {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "filelock" +version = "3.12.2" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["chardet (>=2.2)", "genshi", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] + +[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)", "sphinx-lint"] +perf = ["ipython"] +testing = ["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-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "5.12.0" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.12.0-py3-none-any.whl", hash = "sha256:7b1deeebbf351c7578e09bf2f63fa2ce8b5ffec296e0d349139d43cca061a81a"}, + {file = "importlib_resources-5.12.0.tar.gz", hash = "sha256:4be82589bf5c1d7999aedf2a45159d10cb3ca4f19b2271f8792bc8e6da7b22f6"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] + +[[package]] +name = "jaraco-classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "keyring" +version = "23.13.1" +description = "Store and access your passwords safely." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] + +[[package]] +name = "mako" +version = "1.1.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "more-itertools" +version = "9.1.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, + {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, +] + +[[package]] +name = "msgpack" +version = "1.0.5" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, + {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, + {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, + {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, + {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, + {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, + {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, + {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, + {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, + {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, + {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, + {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, + {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, + {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, + {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, + {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +] + +[[package]] +name = "origen" +version = "2.0.0.dev5" +description = "Semiconductor Developer's Kit" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +beautifulsoup4 = "4.8.2" +bs4 = "0.0.1" +colorama = "^0.4" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" +mako = "1.1.0" +origen_autoapi = "2.0.1" +origen_metal = "= 0.4.0" +poetry = "^1.1.14" +recommonmark = ">= 0" +sphinx = "3.0.2" +sphinxbootstrap4theme = ">= 0" +termcolor = ">= 1.1.0" +yapf = "0.30" + +[package.source] +type = "directory" +url = "../../../python/origen" + +[[package]] +name = "origen-autoapi" +version = "2.0.1" +description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] + +[package.dependencies] +sphinx = "*" + +[[package]] +name = "origen-metal" +version = "0.4.0" +description = "Bare metal APIs for the Origen SDK" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +colorama = ">= 0.4.4" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../../python/origen_metal" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pkginfo" +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] + +[package.extras] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "pl-ext-cmds" +version = "0.1.0" +description = "Plugin Extending Cmds" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +origen_metal = ">=0.0.0" + +[package.source] +type = "directory" +url = "../../pl_ext_cmds" + +[[package]] +name = "platformdirs" +version = "3.8.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.8.0-py3-none-any.whl", hash = "sha256:ca9ed98ce73076ba72e092b23d3c93ea6c4e186b3f1c3dad6edd98ff6ffcca2e"}, + {file = "platformdirs-3.8.0.tar.gz", hash = "sha256:b0cabcb11063d21a0b261d557acb0a9d2126350e63b70cdf7db6347baea456dc"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.6.3", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.5.1" +description = "Python dependency management and packaging made easy." +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry-1.5.1-py3-none-any.whl", hash = "sha256:dfc7ce3a38ae216c0465694e2e674bef6eb1a2ba81aa47a26f9dc03362fe2f5f"}, + {file = "poetry-1.5.1.tar.gz", hash = "sha256:cc7ea4524d1a11558006224bfe8ba8ed071417d4eb5ef6c89decc6a37d437eeb"}, +] + +[package.dependencies] +"backports.cached-property" = {version = ">=1.0.2,<2.0.0", markers = "python_version < \"3.8\""} +build = ">=0.10.0,<0.11.0" +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"]} +cleo = ">=2.0.0,<3.0.0" +crashtest = ">=0.4.1,<0.5.0" +dulwich = ">=0.21.2,<0.22.0" +filelock = ">=3.8.0,<4.0.0" +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +installer = ">=0.7.0,<0.8.0" +jsonschema = ">=4.10.0,<5.0.0" +keyring = ">=23.9.0,<24.0.0" +lockfile = ">=0.12.2,<0.13.0" +packaging = ">=20.4" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.9.4,<2.0.0" +platformdirs = ">=3.0.0,<4.0.0" +poetry-core = "1.6.1" +poetry-plugin-export = ">=1.4.0,<2.0.0" +pyproject-hooks = ">=1.0.0,<2.0.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<2" +shellingham = ">=1.5,<2.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.11.4,<1.0.0" +trove-classifiers = ">=2022.5.19" +urllib3 = ">=1.26.0,<2.0.0" +virtualenv = ">=20.22.0,<21.0.0" +xattr = {version = ">=0.10.0,<0.11.0", markers = "sys_platform == \"darwin\""} + +[[package]] +name = "poetry-core" +version = "1.6.1" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_core-1.6.1-py3-none-any.whl", hash = "sha256:70707340447dee0e7f334f9495ae652481c67b32d8d218f296a376ac2ed73573"}, + {file = "poetry_core-1.6.1.tar.gz", hash = "sha256:0f9b0de39665f36d6594657e7d57b6f463cc10f30c28e6d1c3b9ff54c26c9ac3"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} + +[[package]] +name = "poetry-plugin-export" +version = "1.4.0" +description = "Poetry plugin to export the dependencies to various formats" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_plugin_export-1.4.0-py3-none-any.whl", hash = "sha256:5d9186d6f77cf2bf35fc96bd11fe650cc7656e515b17d99cb65018d50ba22589"}, + {file = "poetry_plugin_export-1.4.0.tar.gz", hash = "sha256:f16974cd9f222d4ef640fa97a8d661b04d4fb339e51da93973f1bc9d578e183f"}, +] + +[package.dependencies] +poetry = ">=1.5.0,<2.0.0" +poetry-core = ">=1.6.0,<2.0.0" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +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", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-plugin" +version = "0.1.0" +description = "Example Origen Plugin" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} + +[package.source] +type = "directory" +url = "../../python_plugin" + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, + {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.1" +description = "A (partial) reimplementation of pywin32 using ctypes/cffi" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pywin32-ctypes-0.2.1.tar.gz", hash = "sha256:934a2def1e5cbc472b2b6bf80680c0f03cd87df65dfd58bfd1846969de095b03"}, + {file = "pywin32_ctypes-0.2.1-py3-none-any.whl", hash = "sha256:b9a53ef754c894a525469933ab2a447c74ec1ea6b9d2ef446f40ec50d3dcec9f"}, +] + +[[package]] +name = "rapidfuzz" +version = "2.15.1" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fc0bc259ebe3b93e7ce9df50b3d00e7345335d35acbd735163b7c4b1957074d3"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d59fb3a410d253f50099d7063855c2b95df1ef20ad93ea3a6b84115590899f25"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c525a3da17b6d79d61613096c8683da86e3573e807dfaecf422eea09e82b5ba6"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4deae6a918ecc260d0c4612257be8ba321d8e913ccb43155403842758c46fbe"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2577463d10811386e704a3ab58b903eb4e2a31b24dfd9886d789b0084d614b01"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f67d5f56aa48c0da9de4ab81bffb310683cf7815f05ea38e5aa64f3ba4368339"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d7927722ff43690e52b3145b5bd3089151d841d350c6f8378c3cfac91f67573a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6534afc787e32c4104f65cdeb55f6abe4d803a2d0553221d00ef9ce12788dcde"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d0ae6ec79a1931929bb9dd57bc173eb5ba4c7197461bf69e3a34b6dd314feed2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:be7ccc45c4d1a7dfb595f260e8022a90c6cb380c2a346ee5aae93f85c96d362b"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:8ba013500a2b68c64b2aecc5fb56a2dad6c2872cf545a0308fd044827b6e5f6a"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4d9f7d10065f657f960b48699e7dddfce14ab91af4bab37a215f0722daf0d716"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7e24a1b802cea04160b3fccd75d2d0905065783ebc9de157d83c14fb9e1c6ce2"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win32.whl", hash = "sha256:dffdf03499e0a5b3442951bb82b556333b069e0661e80568752786c79c5b32de"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:7d150d90a7c6caae7962f29f857a4e61d42038cfd82c9df38508daf30c648ae7"}, + {file = "rapidfuzz-2.15.1-cp310-cp310-win_arm64.whl", hash = "sha256:87c30e9184998ff6eb0fa9221f94282ce7c908fd0da96a1ef66ecadfaaa4cdb7"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6986413cb37035eb796e32f049cbc8c13d8630a4ac1e0484e3e268bb3662bd1b"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a72f26e010d4774b676f36e43c0fc8a2c26659efef4b3be3fd7714d3491e9957"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b5cd54c98a387cca111b3b784fc97a4f141244bbc28a92d4bde53f164464112e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7fac7c3da39f93e6b2ebe386ed0ffe1cefec91509b91857f6e1204509e931f"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f976e76ac72f650790b3a5402431612175b2ac0363179446285cb3c901136ca9"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:abde47e1595902a490ed14d4338d21c3509156abb2042a99e6da51f928e0c117"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca8f1747007a3ce919739a60fa95c5325f7667cccf6f1c1ef18ae799af119f5e"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35da09ab9797b020d0d4f07a66871dfc70ea6566363811090353ea971748b5a"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a3a769ca7580686a66046b77df33851b3c2d796dc1eb60c269b68f690f3e1b65"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d50622efefdb03a640a51a6123748cd151d305c1f0431af762e833d6ffef71f0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b7461b0a7651d68bc23f0896bffceea40f62887e5ab8397bf7caa883592ef5cb"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:074ee9e17912e025c72a5780ee4c7c413ea35cd26449719cc399b852d4e42533"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7025fb105a11f503943f17718cdb8241ea3bb4d812c710c609e69bead40e2ff0"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win32.whl", hash = "sha256:2084d36b95139413cef25e9487257a1cc892b93bd1481acd2a9656f7a1d9930c"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:5a738fcd24e34bce4b19126b92fdae15482d6d3a90bd687fd3d24ce9d28ce82d"}, + {file = "rapidfuzz-2.15.1-cp311-cp311-win_arm64.whl", hash = "sha256:dc3cafa68cfa54638632bdcadf9aab89a3d182b4a3f04d2cad7585ed58ea8731"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3c53d57ba7a88f7bf304d4ea5a14a0ca112db0e0178fff745d9005acf2879f7d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6ee758eec4cf2215dc8d8eafafcea0d1f48ad4b0135767db1b0f7c5c40a17dd"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2d93ba3ae59275e7a3a116dac4ffdb05e9598bf3ee0861fecc5b60fb042d539e"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7c3ff75e647908ddbe9aa917fbe39a112d5631171f3fcea5809e2363e525a59d"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d89c421702474c6361245b6b199e6e9783febacdbfb6b002669e6cb3ef17a09"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f69e6199fec0f58f9a89afbbaea78d637c7ce77f656a03a1d6ea6abdc1d44f8"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:41dfea282844d0628279b4db2929da0dacb8ac317ddc5dcccc30093cf16357c1"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2dd03477feefeccda07b7659dd614f6738cfc4f9b6779dd61b262a73b0a9a178"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5efe035aa76ff37d1b5fa661de3c4b4944de9ff227a6c0b2e390a95c101814c0"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ed2cf7c69102c7a0a06926d747ed855bc836f52e8d59a5d1e3adfd980d1bd165"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a0e441d4c2025110ec3eba5d54f11f78183269a10152b3a757a739ffd1bb12bf"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win32.whl", hash = "sha256:a4a54efe17cc9f53589c748b53f28776dfdfb9bc83619685740cb7c37985ac2f"}, + {file = "rapidfuzz-2.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:bb8318116ecac4dfb84841d8b9b461f9bb0c3be5b616418387d104f72d2a16d1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e9296c530e544f68858c3416ad1d982a1854f71e9d2d3dcedb5b216e6d54f067"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:49c4bcdb9238f11f8c4eba1b898937f09b92280d6f900023a8216008f299b41a"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ebb40a279e134bb3fef099a8b58ed5beefb201033d29bdac005bddcdb004ef71"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7381c11cb590bbd4e6f2d8779a0b34fdd2234dfa13d0211f6aee8ca166d9d05"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfdcdedfd12a0077193f2cf3626ff6722c5a184adf0d2d51f1ec984bf21c23c3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f85bece1ec59bda8b982bd719507d468d4df746dfb1988df11d916b5e9fe19e8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1b393f4a1eaa6867ffac6aef58cfb04bab2b3d7d8e40b9fe2cf40dd1d384601"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53de456ef020a77bf9d7c6c54860a48e2e902584d55d3001766140ac45c54bc7"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2492330bc38b76ed967eab7bdaea63a89b6ceb254489e2c65c3824efcbf72993"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:099e4c6befaa8957a816bdb67ce664871f10aaec9bebf2f61368cf7e0869a7a1"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:46599b2ad4045dd3f794a24a6db1e753d23304699d4984462cf1ead02a51ddf3"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:591f19d16758a3c55c9d7a0b786b40d95599a5b244d6eaef79c7a74fcf5104d8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ed17359061840eb249f8d833cb213942e8299ffc4f67251a6ed61833a9f2ea20"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win32.whl", hash = "sha256:aa1e5aad325168e29bf8e17006479b97024aa9d2fdbe12062bd2f8f09080acf8"}, + {file = "rapidfuzz-2.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:c2bb68832b140c551dbed691290bef4ee6719d4e8ce1b7226a3736f61a9d1a83"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3fac40972cf7b6c14dded88ae2331eb50dfbc278aa9195473ef6fc6bfe49f686"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0e456cbdc0abf39352800309dab82fd3251179fa0ff6573fa117f51f4e84be8"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:22b9d22022b9d09fd4ece15102270ab9b6a5cfea8b6f6d1965c1df7e3783f5ff"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46754fe404a9a6f5cbf7abe02d74af390038d94c9b8c923b3f362467606bfa28"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91abb8bf7610efe326394adc1d45e1baca8f360e74187f3fa0ef3df80cdd3ba6"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e40a2f60024f9d3c15401e668f732800114a023f3f8d8c40f1521a62081ff054"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a48ee83916401ac73938526d7bd804e01d2a8fe61809df7f1577b0b3b31049a3"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c71580052f9dbac443c02f60484e5a2e5f72ad4351b84b2009fbe345b1f38422"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:82b86d5b8c1b9bcbc65236d75f81023c78d06a721c3e0229889ff4ed5c858169"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fc4528b7736e5c30bc954022c2cf410889abc19504a023abadbc59cdf9f37cae"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e1e0e569108a5760d8f01d0f2148dd08cc9a39ead79fbefefca9e7c7723c7e88"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94e1c97f0ad45b05003806f8a13efc1fc78983e52fa2ddb00629003acf4676ef"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47e81767a962e41477a85ad7ac937e34d19a7d2a80be65614f008a5ead671c56"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win32.whl", hash = "sha256:79fc574aaf2d7c27ec1022e29c9c18f83cdaf790c71c05779528901e0caad89b"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:f3dd4bcef2d600e0aa121e19e6e62f6f06f22a89f82ef62755e205ce14727874"}, + {file = "rapidfuzz-2.15.1-cp39-cp39-win_arm64.whl", hash = "sha256:cac095cbdf44bc286339a77214bbca6d4d228c9ebae3da5ff6a80aaeb7c35634"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b89d1126be65c85763d56e3b47d75f1a9b7c5529857b4d572079b9a636eaa8a7"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7460e91168229768be882ea365ba0ac7da43e57f9416e2cfadc396a7df3c2"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c33c03e7092642c38f8a15ca2d8fc38da366f2526ec3b46adf19d5c7aa48ba"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040faca2e26d9dab5541b45ce72b3f6c0e36786234703fc2ac8c6f53bb576743"}, + {file = "rapidfuzz-2.15.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6e2a3b23e1e9aa13474b3c710bba770d0dcc34d517d3dd6f97435a32873e3f28"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e597b9dfd6dd180982684840975c458c50d447e46928efe3e0120e4ec6f6686"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d14752c9dd2036c5f36ebe8db5f027275fa7d6b3ec6484158f83efb674bab84e"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:558224b6fc6124d13fa32d57876f626a7d6188ba2a97cbaea33a6ee38a867e31"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c89cfa88dc16fd8c9bcc0c7f0b0073f7ef1e27cceb246c9f5a3f7004fa97c4d"}, + {file = "rapidfuzz-2.15.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:509c5b631cd64df69f0f011893983eb15b8be087a55bad72f3d616b6ae6a0f96"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0f73a04135a03a6e40393ecd5d46a7a1049d353fc5c24b82849830d09817991f"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c99d53138a2dfe8ada67cb2855719f934af2733d726fbf73247844ce4dd6dd5"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f01fa757f0fb332a1f045168d29b0d005de6c39ee5ce5d6c51f2563bb53c601b"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60368e1add6e550faae65614844c43f8a96e37bf99404643b648bf2dba92c0fb"}, + {file = "rapidfuzz-2.15.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:785744f1270828cc632c5a3660409dee9bcaac6931a081bae57542c93e4d46c4"}, + {file = "rapidfuzz-2.15.1.tar.gz", hash = "sha256:d62137c2ca37aea90a11003ad7dc109c8f1739bfbe5a9a217f3cdb07d7ac00f6"}, +] + +[package.extras] +full = ["numpy"] + +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {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] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "setuptools" +version = "68.0.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, + {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "shellingham" +version = "1.5.0.post1" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.0.post1-py2.py3-none-any.whl", hash = "sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744"}, + {file = "shellingham-1.5.0.post1.tar.gz", hash = "sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "soupsieve" +version = "2.4.1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, + {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, +] + +[[package]] +name = "sphinx" +version = "3.0.2" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.12" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +setuptools = "*" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] + +[[package]] +name = "sphinxbootstrap4theme" +version = "0.6.0" +description = "Sphinx Bootstrap4 Theme" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.5" +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"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.6" +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"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["pytest"] + +[[package]] +name = "termcolor" +version = "2.3.0" +description = "ANSI color formatting for output in terminal" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "test-apps-shared-test-helpers" +version = "0.1.0" +description = "Shared Regression Test Helpers for Test Apps" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +pl_ext_cmds = {path = "../pl_ext_cmds", develop = true} +pytest = ">=7.2.1" + +[package.source] +type = "directory" +url = "../../test_apps_shared_test_helpers" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +category = "main" +optional = false +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 = "trove-classifiers" +version = "2023.5.24" +description = "Canonical source for classifiers on PyPI (pypi.org)." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "trove-classifiers-2023.5.24.tar.gz", hash = "sha256:fd5a1546283be941f47540a135bdeae8fb261380a6a204d9c18012f2a1b0ceae"}, + {file = "trove_classifiers-2023.5.24-py3-none-any.whl", hash = "sha256:d9d7ae14fb90bf3d50bef99c3941b176b5326509e6e9037e622562d6352629d0"}, +] + +[[package]] +name = "typing-extensions" +version = "4.6.3" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.6.3-py3-none-any.whl", hash = "sha256:88a4153d8505aabbb4e13aacb7c486c2b4a33ca3b3f807914a9b4c844c471c26"}, + {file = "typing_extensions-4.6.3.tar.gz", hash = "sha256:d91d5919357fe7f681a9f2b5b4cb2a5f1ef0a1e9f59c4d8ff0d3491e05c0ffd5"}, +] + +[[package]] +name = "urllib3" +version = "1.26.16" +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.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[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)"] + +[[package]] +name = "virtualenv" +version = "20.23.1" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.23.1-py3-none-any.whl", hash = "sha256:34da10f14fea9be20e0fd7f04aba9732f84e593dac291b757ce42e3368a39419"}, + {file = "virtualenv-20.23.1.tar.gz", hash = "sha256:8ff19a38c1021c742148edc4f81cb43d7f8c6816d2ede2ab72af5b84c749ade1"}, +] + +[package.dependencies] +distlib = ">=0.3.6,<1" +filelock = ">=3.12,<4" +importlib-metadata = {version = ">=6.6", markers = "python_version < \"3.8\""} +platformdirs = ">=3.5.1,<4" + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "xattr" +version = "0.10.1" +description = "Python wrapper for extended filesystem attributes" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "xattr-0.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:16a660a883e703b311d1bbbcafc74fa877585ec081cd96e8dd9302c028408ab1"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1e2973e72faa87ca29d61c23b58c3c89fe102d1b68e091848b0e21a104123503"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:13279fe8f7982e3cdb0e088d5cb340ce9cbe5ef92504b1fd80a0d3591d662f68"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1dc9b9f580ef4b8ac5e2c04c16b4d5086a611889ac14ecb2e7e87170623a0b75"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:485539262c2b1f5acd6b6ea56e0da2bc281a51f74335c351ea609c23d82c9a79"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:295b3ab335fcd06ca0a9114439b34120968732e3f5e9d16f456d5ec4fa47a0a2"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a126eb38e14a2f273d584a692fe36cff760395bf7fc061ef059224efdb4eb62c"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:b0e919c24f5b74428afa91507b15e7d2ef63aba98e704ad13d33bed1288dca81"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:e31d062cfe1aaeab6ba3db6bd255f012d105271018e647645941d6609376af18"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:209fb84c09b41c2e4cf16dd2f481bb4a6e2e81f659a47a60091b9bcb2e388840"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4120090dac33eddffc27e487f9c8f16b29ff3f3f8bcb2251b2c6c3f974ca1e1"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e739d624491267ec5bb740f4eada93491de429d38d2fcdfb97b25efe1288eca"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2677d40b95636f3482bdaf64ed9138fb4d8376fb7933f434614744780e46e42d"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40039f1532c4456fd0f4c54e9d4e01eb8201248c321c6c6856262d87e9a99593"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:148466e5bb168aba98f80850cf976e931469a3c6eb11e9880d9f6f8b1e66bd06"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0aedf55b116beb6427e6f7958ccd80a8cbc80e82f87a4cd975ccb61a8d27b2ee"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3024a9ff157247c8190dd0eb54db4a64277f21361b2f756319d9d3cf20e475f"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f1be6e733e9698f645dbb98565bb8df9b75e80e15a21eb52787d7d96800e823b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7880c8a54c18bc091a4ce0adc5c6d81da1c748aec2fe7ac586d204d6ec7eca5b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c93b42c3ba8aedbc29da759f152731196c2492a2154371c0aae3ef8ba8301b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b905e808df61b677eb972f915f8a751960284358b520d0601c8cbc476ba2df6"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ef954d0655f93a34d07d0cc7e02765ec779ff0b59dc898ee08c6326ad614d5"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:199b20301b6acc9022661412346714ce764d322068ef387c4de38062474db76c"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0956a8ab0f0d3f9011ba480f1e1271b703d11542375ef73eb8695a6bd4b78b"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffcb57ca1be338d69edad93cf59aac7c6bb4dbb92fd7bf8d456c69ea42f7e6d2"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f0563196ee54756fe2047627d316977dc77d11acd7a07970336e1a711e934db"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc354f086f926a1c7f04886f97880fed1a26d20e3bc338d0d965fd161dbdb8ab"}, + {file = "xattr-0.10.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cd2d02ef2fb45ecf2b0da066a58472d54682c6d4f0452dfe7ae2f3a76a42ea"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49626096ddd72dcc1654aadd84b103577d8424f26524a48d199847b5d55612d0"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceaa26bef8fcb17eb59d92a7481c2d15d20211e217772fb43c08c859b01afc6a"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c014c371391f28f8cd27d73ea59f42b30772cd640b5a2538ad4f440fd9190b"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:46c32cd605673606b9388a313b0050ee7877a0640d7561eea243ace4fa2cc5a6"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:772b22c4ff791fe5816a7c2a1c9fcba83f9ab9bea138eb44d4d70f34676232b4"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:183ad611a2d70b5a3f5f7aadef0fcef604ea33dcf508228765fd4ddac2c7321d"}, + {file = "xattr-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8068df3ebdfa9411e58d5ae4a05d807ec5994645bb01af66ec9f6da718b65c5b"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bc40570155beb85e963ae45300a530223d9822edfdf09991b880e69625ba38a"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:436e1aaf23c07e15bed63115f1712d2097e207214fc6bcde147c1efede37e2c5"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7298455ccf3a922d403339781b10299b858bb5ec76435445f2da46fb768e31a5"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:986c2305c6c1a08f78611eb38ef9f1f47682774ce954efb5a4f3715e8da00d5f"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5dc6099e76e33fa3082a905fe59df766b196534c705cf7a2e3ad9bed2b8a180e"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:042ad818cda6013162c0bfd3816f6b74b7700e73c908cde6768da824686885f8"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d4c306828a45b41b76ca17adc26ac3dc00a80e01a5ba85d71df2a3e948828f2"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a606280b0c9071ef52572434ecd3648407b20df3d27af02c6592e84486b05894"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5b49d591cf34cda2079fd7a5cb2a7a1519f54dc2e62abe3e0720036f6ed41a85"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8705ac6791426559c1a5c2b88bb2f0e83dc5616a09b4500899bfff6a929302"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5ea974930e876bc5c146f54ac0f85bb39b7b5de2b6fc63f90364712ae368ebe"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f55a2dd73a12a1ae5113c5d9cd4b4ab6bf7950f4d76d0a1a0c0c4264d50da61d"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:475c38da0d3614cc5564467c4efece1e38bd0705a4dbecf8deeb0564a86fb010"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:925284a4a28e369459b2b7481ea22840eed3e0573a4a4c06b6b0614ecd27d0a7"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa32f1b45fed9122bed911de0fcc654da349e1f04fa4a9c8ef9b53e1cc98b91e"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5d3d0e728bace64b74c475eb4da6148cd172b2d23021a1dcd055d92f17619ac"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8faaacf311e2b5cc67c030c999167a78a9906073e6abf08eaa8cf05b0416515c"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc6b8d5ca452674e1a96e246a3d2db5f477aecbc7c945c73f890f56323e75203"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3725746a6502f40f72ef27e0c7bfc31052a239503ff3eefa807d6b02a249be22"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789bd406d1aad6735e97b20c6d6a1701e1c0661136be9be862e6a04564da771f"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a7a807ab538210ff8532220d8fc5e2d51c212681f63dbd4e7ede32543b070f"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e5825b5fc99ecdd493b0cc09ec35391e7a451394fdf623a88b24726011c950d"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80638d1ce7189dc52f26c234cee3522f060fadab6a8bc3562fe0ddcbe11ba5a4"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ff0dbe4a6ce2ce065c6de08f415bcb270ecfd7bf1655a633ddeac695ce8b250"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5267e5f9435c840d2674194150b511bef929fa7d3bc942a4a75b9eddef18d8d8"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b27dfc13b193cb290d5d9e62f806bb9a99b00cd73bb6370d556116ad7bb5dc12"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:636ebdde0277bce4d12d2ef2550885804834418fee0eb456b69be928e604ecc4"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d60c27922ec80310b45574351f71e0dd3a139c5295e8f8b19d19c0010196544f"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b34df5aad035d0343bd740a95ca30db99b776e2630dca9cc1ba8e682c9cc25ea"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24a7c04ff666d0fe905dfee0a84bc899d624aeb6dccd1ea86b5c347f15c20c1"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3878e1aff8eca64badad8f6d896cb98c52984b1e9cd9668a3ab70294d1ef92d"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4abef557028c551d59cf2fb3bf63f2a0c89f00d77e54c1c15282ecdd56943496"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0e14bd5965d3db173d6983abdc1241c22219385c22df8b0eb8f1846c15ce1fee"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9be588a4b6043b03777d50654c6079af3da60cc37527dbb80d36ec98842b1e"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bc4ae264aa679aacf964abf3ea88e147eb4a22aea6af8c6d03ebdebd64cfd6"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827b5a97673b9997067fde383a7f7dc67342403093b94ea3c24ae0f4f1fec649"}, + {file = "xattr-0.10.1.tar.gz", hash = "sha256:c12e7d81ffaa0605b3ac8c22c2994a8e18a9cf1c59287a1b7722a2289c952ec5"}, +] + +[package.dependencies] +cffi = ">=1.0" + +[[package]] +name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, + {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +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)"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.7.0,<3.13" +content-hash = "29a2150544681b9aa667a228c0adebe0f07915aa2fadda56a30e117782811b20" diff --git a/test_apps/no_workspace/user_install/pyproject.toml b/test_apps/no_workspace/user_install/pyproject.toml new file mode 100644 index 00000000..5c530980 --- /dev/null +++ b/test_apps/no_workspace/user_install/pyproject.toml @@ -0,0 +1,13 @@ +[tool.poetry] +name = "TestUserInstall" +version = "0.1.0" +description = "Origen Installation Test" +authors = ["Origen-SDK"] + +[tool.poetry.dependencies] +python = ">=3.7.0,<3.13" + +origen = { path = "../../../python/origen", develop = true } +origen_metal = { path = "../../../python/origen_metal", develop = true } +python_plugin = { path = "../../python_plugin", develop = true } +test_apps_shared_test_helpers = { path = "../../test_apps_shared_test_helpers", develop = true } diff --git a/test_apps/pl_ext_cmds/.gitignore b/test_apps/pl_ext_cmds/.gitignore new file mode 100644 index 00000000..47275fc7 --- /dev/null +++ b/test_apps/pl_ext_cmds/.gitignore @@ -0,0 +1,6 @@ +/.origen +/output +/web/source/_static/build +/web/source/interbuild +/tmp +/.ref \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/config/application.toml b/test_apps/pl_ext_cmds/config/application.toml new file mode 100644 index 00000000..a47e1634 --- /dev/null +++ b/test_apps/pl_ext_cmds/config/application.toml @@ -0,0 +1 @@ +name = "pl_ext_cmds" \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/config/commands.toml b/test_apps/pl_ext_cmds/config/commands.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/config/origen.toml b/test_apps/pl_ext_cmds/config/origen.toml new file mode 100644 index 00000000..eee0cdec --- /dev/null +++ b/test_apps/pl_ext_cmds/config/origen.toml @@ -0,0 +1,14 @@ +# Use this to define your application-specific Origen configuration +# Do not delete it even if you don't use it since it is also used by the Origen +# command line interface to determine when it is in an Origen application workspace + +# Specify what command should be used to invoke python, if not specified +# Origen will try python, python3, python3.8, etc. until one is found that +# satisfies the minimum Python version requirement +#python_cmd = "mypython" + +# If your company has an internal package server enter it here: +#pkg_server = "https://pkgs.company.net:9292" +# or here, if you need to use different urls for push and pull (write and read): +#pkg_server_push = "https://pkgs.company.net:9292" +#pkg_server_pull = "https://pkgs.company.net:9292" \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/application.py b/test_apps/pl_ext_cmds/pl_ext_cmds/application.py new file mode 100644 index 00000000..5b9a0cb4 --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/application.py @@ -0,0 +1,6 @@ +from origen.application import Base + +# This class represents this application and is automatically instantiated as `origen.app` +# It is required by Origen and should not be renamed or removed under any circumstances +class Application(Base): + pass diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/commands.toml b/test_apps/pl_ext_cmds/pl_ext_cmds/commands.toml new file mode 100644 index 00000000..64fd060f --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/commands.toml @@ -0,0 +1,6 @@ +[[extension]] +extend = "origen.eval" + + [[extension.opt]] + name = "pl_ext_cmds_generic_ext" + help = "Generic ext from pl_ext_cmds plugin" \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/commands/extensions/core/eval.py b/test_apps/pl_ext_cmds/pl_ext_cmds/commands/extensions/core/eval.py new file mode 100644 index 00000000..bc7b4dd2 --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/commands/extensions/core/eval.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli import after_cmd_ext_args_str, before_cmd_ext_args_str, clean_up_ext_args_str +from origen.boot import before_cmd, after_cmd, clean_up + +@before_cmd +def before(**args): + print(before_cmd_ext_args_str(args)) + +@after_cmd +def after(**args): + print(after_cmd_ext_args_str(args)) + +@clean_up +def clean_up(**args): + print(clean_up_ext_args_str(args)) diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/attributes.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/attributes.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/controller.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/controller.py new file mode 100644 index 00000000..2e09abc1 --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/controller.py @@ -0,0 +1,18 @@ +from origen.controller import TopLevel as BaseController +import origen + + +class Controller(BaseController): + def write_register(self, reg_or_val, size=None, address=None, **kwargs): + # Invoke your driver of choice to dispatch this write_register request, + # here is a JTAG example: + #self.jtag.write_ir(0xF, size=8) + #self.jtag.write_dr(reg_or_val, size) + raise RuntimeError(f"A request to write a register was received by '{self.path}' ({type(self)}), however the logic to implement it has not been defined yet") + + def verify_register(self, reg_or_val, size=None, address=None, **kwargs): + # Invoke your driver of choice to dispatch this verify_register request, + # here is a JTAG example: + #self.jtag.write_ir(0x1F, size=8) + #self.jtag.verify_dr(reg_or_val, size) + raise RuntimeError(f"A request to verify a register was received by '{self.path}' ({type(self)}), however the logic to implement it has not been defined yet") diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/attributes.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/attributes.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/controller.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/controller.py new file mode 100644 index 00000000..05ae2a5e --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/controller.py @@ -0,0 +1,16 @@ +from ...controller import Controller as Parent +import origen + + +class Controller(Parent): + def write_register(self, reg_or_val, size=None, address=None, **kwargs): + # All write register requests originated from within this block (or one of its children) + # will be sent to the parent class by default, however you can intercept it here and do + # something else if required + super().write_register(reg_or_val, size, address, **kwargs) + + def verify_register(self, reg_or_val, size=None, address=None, **kwargs): + # A verify register requests originated from within this block (or one of its children) + # will be sent to the parent class by default, however you can intercept it here and do + # something else if required + super().verify_register(reg_or_val, size, address, **kwargs) diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/levels.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/levels.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/pins.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/pins.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/registers.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/registers.py new file mode 100644 index 00000000..591d55e9 --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/registers.py @@ -0,0 +1,33 @@ +########################################################################################## +# Any registers defined here will be added to this DUT and all of its derivative children +########################################################################################## + +# Example of a simple register definition with all bits r/w, 0x0 is the local offset address: +# +# SimpleReg("my_reg1", 0x0, size=32) # 32 is the default size if not specified +SimpleReg("hawk_reg1", 0x0, size=32) # 32 is the default size if not specified +# +# Example of a richer definition with bitfields: +# +# with Reg("my_reg2", 0x4): +# Field("coco", offset=7, access="ro") +# Field("aien", offset=6) +# Field("diff", offset=5) +# Field( +# "adch", +# offset=0, +# width=5, +# reset=0x1F, +# enums={ +# # A simple enum +# "val1": 3, +# # A more complex enum, all fields except for value are optional +# "val2": { +# "value": 5, +# "usage": "w", +# "description": "The value of something" +# }, +# }) +# +# For more examples and full documentation see: https://origen-sdk.org/o2/guides/registers + diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/services.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/services.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/sub_blocks.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/sub_blocks.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/timing.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/derivatives/demo/timing.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/levels.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/levels.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/pins.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/pins.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/registers.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/registers.py new file mode 100644 index 00000000..5de5f73c --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/registers.py @@ -0,0 +1,32 @@ +########################################################################################## +# Any registers defined here will be added to all DUTs in your application +########################################################################################## + +# Example of a simple register definition with all bits r/w, 0x0 is the local offset address: +# +# SimpleReg("my_reg1", 0x0, size=32) # 32 is the default size if not specified +# +# Example of a richer definition with bitfields: +# +# with Reg("my_reg2", 0x4): +# Field("coco", offset=7, access="ro") +# Field("aien", offset=6) +# Field("diff", offset=5) +# Field( +# "adch", +# offset=0, +# width=5, +# reset=0x1F, +# enums={ +# # A simple enum +# "val1": 3, +# # A more complex enum, all fields except for value are optional +# "val2": { +# "value": 5, +# "usage": "w", +# "description": "The value of something" +# }, +# }) +# +# For more examples and full documentation see: https://origen-sdk.org/o2/guides/registers + diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/services.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/services.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/sub_blocks.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/sub_blocks.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/dut/timing.py b/test_apps/pl_ext_cmds/pl_ext_cmds/dut/timing.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/flows/.gitkeep b/test_apps/pl_ext_cmds/pl_ext_cmds/flows/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/interface/interface.py b/test_apps/pl_ext_cmds/pl_ext_cmds/interface/interface.py new file mode 100644 index 00000000..97544bae --- /dev/null +++ b/test_apps/pl_ext_cmds/pl_ext_cmds/interface/interface.py @@ -0,0 +1,5 @@ +from origen.interface import BaseInterface + + +class Interface(BaseInterface): + pass \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/origen.plugin.toml b/test_apps/pl_ext_cmds/pl_ext_cmds/origen.plugin.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/patterns/.gitkeep b/test_apps/pl_ext_cmds/pl_ext_cmds/patterns/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/pl_ext_cmds/templates/.gitkeep b/test_apps/pl_ext_cmds/pl_ext_cmds/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/poetry.lock b/test_apps/pl_ext_cmds/poetry.lock new file mode 100644 index 00000000..74f65dab --- /dev/null +++ b/test_apps/pl_ext_cmds/poetry.lock @@ -0,0 +1,1358 @@ +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] +dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] + +[[package]] +name = "babel" +version = "2.10.3" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "beautifulsoup4" +version = "4.8.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +soupsieve = ">=1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "cachecontrol" +version = "0.12.11" +description = "httplib2 caching for requests" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "cachy" +version = "0.3.0" +description = "Cachy provides a simple yet effective caching library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +redis = ["redis (>=3.3.6,<4.0.0)"] +memcached = ["python-memcached (>=1.59,<2.0)"] +msgpack = ["msgpack-python (>=0.5,<0.6)"] + +[[package]] +name = "certifi" +version = "2022.6.15" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cleo" +version = "0.8.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +clikit = ">=0.6.0,<0.7.0" + +[[package]] +name = "clikit" +version = "0.6.2" +description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +pastel = ">=0.2.0,<0.3.0" +pylev = ">=1.3,<2.0" + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "crashtest" +version = "0.3.1" +description = "Manage Python errors with ease" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "cryptography" +version = "37.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "distlib" +version = "0.3.5" +description = "Distribution utilities" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "filelock" +version = "3.8.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +testing = ["pytest-timeout (>=2.1)", "pytest-cov (>=3)", "pytest (>=7.1.2)", "coverage (>=6.4.2)", "covdefaults (>=2.2)"] +docs = ["sphinx-autodoc-typehints (>=1.19.1)", "sphinx (>=5.1.1)", "furo (>=2022.6.21)"] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "importlib-metadata" +version = "1.7.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keyring" +version = "22.3.0" +description = "Store and access your passwords safely." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mako" +version = "1.1.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "more-itertools" +version = "8.14.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "origen" +version = "2.0.0.dev5" +description = "Semiconductor Developer's Kit" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +beautifulsoup4 = "4.8.2" +bs4 = "0.0.1" +colorama = "^0.4" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" +mako = "1.1.0" +origen_autoapi = "2.0.1" +origen_metal = "= 0.4.0" +poetry = "^1.1.14" +recommonmark = ">= 0" +sphinx = "3.0.2" +sphinxbootstrap4theme = ">= 0" +termcolor = ">= 1.1.0" +yapf = "0.30" + +[package.source] +type = "directory" +url = "../../python/origen" + +[[package]] +name = "origen-autoapi" +version = "2.0.1" +description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +sphinx = "*" + +[[package]] +name = "origen-metal" +version = "0.4.0" +description = "Bare metal APIs for the Origen SDK" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +colorama = ">= 0.4.4" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../python/origen_metal" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pkginfo" +version = "1.8.3" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.1.14" +description = "Python dependency management and packaging made easy." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +cachy = ">=0.3.0,<0.4.0" +cleo = ">=0.8.1,<0.9.0" +clikit = ">=0.6.2,<0.7.0" +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} +keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +packaging = ">=20.4,<21.0" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.4,<2.0" +poetry-core = ">=1.0.7,<1.1.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +shellingham = ">=1.1,<2.0" +tomlkit = ">=0.7.0,<1.0.0" +virtualenv = ">=20.0.26,<21.0.0" + +[[package]] +name = "poetry-core" +version = "1.0.8" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pylev" +version = "1.4.0" +description = "A pure Python Levenshtein implementation that's not freaking GPL'd." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pytest" +version = "3.10.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +more-itertools = ">=4.0.0" +pluggy = ">=0.7" +py = ">=1.5.0" +six = ">=1.10.0" + +[[package]] +name = "pytz" +version = "2022.2.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "shellingham" +version = "1.5.0" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.4" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "sphinx" +version = "3.0.2" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.12" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] + +[[package]] +name = "sphinxbootstrap4theme" +version = "0.6.0" +description = "Sphinx Bootstrap4 Theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tomlkit" +version = "0.11.4" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "urllib3" +version = "1.26.11" +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.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.16.2" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +platformdirs = ">=2,<3" + +[package.extras] +testing = ["pytest-timeout (>=1)", "pytest-randomly (>=1)", "pytest-mock (>=2)", "pytest-freezegun (>=0.4.1)", "pytest-env (>=0.6.2)", "pytest (>=4)", "packaging (>=20.0)", "flaky (>=3)", "coverage-enable-subprocess (>=1)", "coverage (>=4)"] +docs = ["towncrier (>=21.3)", "sphinx-rtd-theme (>=0.4.3)", "sphinx-argparse (>=0.2.5)", "sphinx (>=3)", "proselint (>=0.10.2)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.8.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = ">=3.7,<3.11" +content-hash = "1f4c2af7a73abea014b8d078693c410088ef6c775fb5d4b9e8e06aa06b9a5680" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +babel = [ + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] +bs4 = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] +cachecontrol = [ + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, +] +cachy = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] +certifi = [ + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, +] +cffi = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, +] +cleo = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] +clikit = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, +] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] +crashtest = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] +cryptography = [ + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, + {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, + {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, + {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, +] +distlib = [ + {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, + {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, +] +docutils = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] +filelock = [ + {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, + {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +imagesize = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +keyring = [ + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, +] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] +mako = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +more-itertools = [ + {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, + {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, +] +msgpack = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] +origen = [] +origen-autoapi = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] +origen-metal = [] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pastel = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pkginfo = [ + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poetry = [ + {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, + {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, +] +poetry-core = [ + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pylev = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyreadline3 = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] +pytest = [ + {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"}, + {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"}, +] +pytz = [ + {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, + {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +recommonmark = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] +requests = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] +shellingham = [ + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +sphinx = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] +sphinxbootstrap4theme = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] +tomlkit = [ + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, +] +urllib3 = [ + {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, + {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, +] +virtualenv = [ + {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, + {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +yapf = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] +zipp = [ + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, +] diff --git a/test_apps/pl_ext_cmds/pyproject.toml b/test_apps/pl_ext_cmds/pyproject.toml new file mode 100644 index 00000000..2188c26e --- /dev/null +++ b/test_apps/pl_ext_cmds/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "pl_ext_cmds" +version = "0.1.0" +description = "Plugin Extending Cmds" +authors = ["Origen-SDK"] + +[tool.poetry.dependencies] +python = ">=3.7.0,<3.13" +origen = { path = "../../python/origen", develop = true } +origen_metal = ">=0.0.0" + +[tool.poetry.dev-dependencies] +pytest = "^3" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/setup.cfg b/test_apps/pl_ext_cmds/setup.cfg new file mode 100644 index 00000000..6e1cfdfa --- /dev/null +++ b/test_apps/pl_ext_cmds/setup.cfg @@ -0,0 +1,2 @@ +[tool:pytest] +testpaths = tests \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/targets/dut/demo.py b/test_apps/pl_ext_cmds/targets/dut/demo.py new file mode 100644 index 00000000..8479f6a8 --- /dev/null +++ b/test_apps/pl_ext_cmds/targets/dut/demo.py @@ -0,0 +1 @@ +origen.app.instantiate_dut("dut.demo") \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/targets/tester/smt7.py b/test_apps/pl_ext_cmds/targets/tester/smt7.py new file mode 100644 index 00000000..9335607f --- /dev/null +++ b/test_apps/pl_ext_cmds/targets/tester/smt7.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT7") \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/targets/tester/smt8.py b/test_apps/pl_ext_cmds/targets/tester/smt8.py new file mode 100644 index 00000000..7a378261 --- /dev/null +++ b/test_apps/pl_ext_cmds/targets/tester/smt8.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT8") \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/targets/tester/uflex.py b/test_apps/pl_ext_cmds/targets/tester/uflex.py new file mode 100644 index 00000000..da6c3b88 --- /dev/null +++ b/test_apps/pl_ext_cmds/targets/tester/uflex.py @@ -0,0 +1 @@ +origen.tester.target("Ultraflex") \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/tests/README.md b/test_apps/pl_ext_cmds/tests/README.md new file mode 100644 index 00000000..218887c3 --- /dev/null +++ b/test_apps/pl_ext_cmds/tests/README.md @@ -0,0 +1,16 @@ +Note that the `tests` folder is the place to create tests to verify the +functionality of this Origen application, it does not refer to silicon +tests! + +This is setup to use a popular Python test framework called `pytest` which +requires that following naming convention is followed: + +* All files containing tests must be named `_test.py`, e.g. `tests/example_test.py` +* Functions that define tests within such files must be named `test_`, + e.g. `def test_example():` + +To execute the tests, run the following command from the command line: + +~~~ +poetry run pytest +~~~ \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/tests/example_test.py b/test_apps/pl_ext_cmds/tests/example_test.py new file mode 100644 index 00000000..374f68a0 --- /dev/null +++ b/test_apps/pl_ext_cmds/tests/example_test.py @@ -0,0 +1,6 @@ +import origen +import pytest +from tests.shared import * + +def test_example(): + assert 1 == 1 \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/tests/shared/__init__.py b/test_apps/pl_ext_cmds/tests/shared/__init__.py new file mode 100644 index 00000000..5579f7f3 --- /dev/null +++ b/test_apps/pl_ext_cmds/tests/shared/__init__.py @@ -0,0 +1,5 @@ +# This is a good place to add helper functions that you want to make +# available to all of your tests + +import pytest +import origen \ No newline at end of file diff --git a/test_apps/pl_ext_cmds/vendor/.gitkeep b/test_apps/pl_ext_cmds/vendor/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/web/Makefile b/test_apps/pl_ext_cmds/web/Makefile new file mode 100644 index 00000000..d0c3cbf1 --- /dev/null +++ b/test_apps/pl_ext_cmds/web/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/test_apps/pl_ext_cmds/web/make.bat b/test_apps/pl_ext_cmds/web/make.bat new file mode 100644 index 00000000..9534b018 --- /dev/null +++ b/test_apps/pl_ext_cmds/web/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/test_apps/pl_ext_cmds/web/source/_static/.gitkeep b/test_apps/pl_ext_cmds/web/source/_static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/pl_ext_cmds/web/source/conf.py b/test_apps/pl_ext_cmds/web/source/conf.py new file mode 100644 index 00000000..a03196d1 --- /dev/null +++ b/test_apps/pl_ext_cmds/web/source/conf.py @@ -0,0 +1,76 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) +import origen +import origen.web + +import sys, os +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'pl_ext_cmds' +copyright = '2020, Origen Core Team' +author = 'Origen Core Team' + +# The full version, including alpha/beta/rc tags +release = '0.0.0' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'origen.web.origen_sphinx_extension', 'origen_autoapi.sphinx', + 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.autosectionlabel', + 'recommonmark', 'origen.web.shorthand' +] + +autosectionlabel_prefix_document = True +autoapi_modules = { + 'pl_ext_cmds.application': { + 'module-members': ['undoc-members'], + 'class-members': ['members', 'undoc-members'] + } +} +autoapi_output_dir = origen.web.interbuild_dir.joinpath('autoapi') + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme_options = { +# 'navbar_links': +# [('Github', 'https://github.com/Origen-SDK/o2/tree/master/example', True)], +# 'logos': [{ +# 'src': '_static/example_logo.png', +# 'alt': 'Example', +# 'rel_src': True, +# }] +#} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/test_apps/pl_ext_cmds/web/source/index.rst b/test_apps/pl_ext_cmds/web/source/index.rst new file mode 100644 index 00000000..b2dc3f0b --- /dev/null +++ b/test_apps/pl_ext_cmds/web/source/index.rst @@ -0,0 +1,22 @@ +.. example documentation master file, created by + sphinx-quickstart on Wed Apr 15 21:59:35 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to pl_ext_cmds's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + interbuild/autoapi/pl_ext_cmds.application/pl_ext_cmds.application + +For information on how to build documentation with Origen, see :link-to:`the documentation guides `. + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/test_apps/python_app/config/cmd_tomls/invalid.toml b/test_apps/python_app/config/cmd_tomls/invalid.toml new file mode 100644 index 00000000..e9630716 --- /dev/null +++ b/test_apps/python_app/config/cmd_tomls/invalid.toml @@ -0,0 +1,5 @@ +[[command]] +name = "invalid" +test = "invalid toml format" + +[[command] \ No newline at end of file diff --git a/test_apps/python_app/config/cmd_tomls/invalid2.toml b/test_apps/python_app/config/cmd_tomls/invalid2.toml new file mode 100644 index 00000000..f927395a --- /dev/null +++ b/test_apps/python_app/config/cmd_tomls/invalid2.toml @@ -0,0 +1,7 @@ +[[command]] +name = "invalid2" +test = "invalid toml format" + +[[command]] +name = "invalid2" +test = "invalid toml format diff --git a/test_apps/python_app/config/cmd_tomls/simple.toml b/test_apps/python_app/config/cmd_tomls/simple.toml new file mode 100644 index 00000000..42370155 --- /dev/null +++ b/test_apps/python_app/config/cmd_tomls/simple.toml @@ -0,0 +1,11 @@ +[[command]] + name = "simple" + help = "Simple App CMD" + +[[command]] + name = "simple_with_arg" + help = "Simple App CMD with Arg" + + [[command.arg]] + name = "arg" + help = "Simple arg" diff --git a/test_apps/python_app/config/cmd_tomls/simple2.toml b/test_apps/python_app/config/cmd_tomls/simple2.toml new file mode 100644 index 00000000..09c2bf30 --- /dev/null +++ b/test_apps/python_app/config/cmd_tomls/simple2.toml @@ -0,0 +1,11 @@ +[[command]] + name = "simple2" + help = "Simple App CMD - 2" + +[[command]] + name = "simple2_with_arg" + help = "Simple App CMD with Arg - 2" + + [[command.arg]] + name = "arg" + help = "Simple arg" diff --git a/test_apps/python_app/config/commands.toml b/test_apps/python_app/config/commands.toml index 500bee15..cb8ff570 100644 --- a/test_apps/python_app/config/commands.toml +++ b/test_apps/python_app/config/commands.toml @@ -15,7 +15,6 @@ [[command.arg]] name = "arg2" help = "A required argument accepting multiple values" - switch = false takes_value = true multiple = true required = true @@ -45,4 +44,537 @@ [[command.subcommand]] name = "stop" - help = "Stop playing" \ No newline at end of file + help = "Stop playing" + +[[command]] + name = "arg_opt_warmup" + aliases = ["w", "w-out"] + help = "Gross test command demonstrating args/opts from app commands" + + [[command.arg]] + name = "first" + required = true + help = "First Argument - Required" + + [[command.arg]] + name = "second" + help = "Second Multi-Argument - Not Required" + multiple = true + use_delimiter = true + + [[command.opt]] + name = "flag_opt" + help = "Flag opt" + short = "f" + + [[command.opt]] + name = "single_opt" + help = "Single-value non-required opt" + short_aliases = ["s"] + takes_value = true + + [[command.opt]] + name = "multi_opt" + help = "Multi-value non-required opt" + long_aliases = ["m_opt"] + short_aliases = ["m"] + multiple = true + + [[command.opt]] + name = "hidden_flag_opt" + help = "Hidden flag opt" + long = "hidden" + hidden = true + +[[command]] +name = "nested_app_cmds" +help = "Nested app cmds" + + [[command.subcommand]] + name = "nested_l1" + help = "Nested app cmds level 1" + + [[command.subcommand.subcommand]] + name = "nested_l2_a" + help = "Nested app cmds level 2 (A)" + + [[command.subcommand.subcommand.subcommand]] + name = "nested_l3_a" + help = "Nested app cmds level 3 (A-A)" + + [[command.subcommand.subcommand.subcommand]] + name = "nested_l3_b" + help = "Nested app cmds level 3 (A-B)" + + [[command.subcommand.subcommand]] + name = "nested_l2_b" + help = "Nested app cmds level 2 (B)" + + [[command.subcommand.subcommand.subcommand]] + name = "nested_l3_a" + help = "Nested app cmds level 3 (B-A)" + + [[command.subcommand.subcommand.subcommand]] + name = "nested_l3_b" + help = "Nested app cmds level 3 (B-B)" + +# Command disabling standard app opts +[[command]] +name = "disabling_app_opts" +help = "Test disabling standard app opts" + + [[command.subcommand]] + name = "disable_targets_opt" + help = "Disable the targets and no-targets opt" + add_target_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_target_opt = true + + [[command.subcommand]] + name = "disable_mode_opt" + help = "Disable the mode opt" + add_mode_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_mode_opt = true + + [[command.subcommand]] + name = "disable_app_opts" + help = "Disable all app opts" + add_target_opt = false + add_mode_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_target_opt = true + add_mode_opt = true + +[[command]] +name = "reserved_opt_error_gen" +help = "Generate error messages when reserved opts are used" +on_env = ["ORIGEN_APP_TEST_RESERVED_OPT_ERRORS"] + + [[command.opt]] + name = "conflicting_help" + short = "h" + help = "Conflicting Opt" + + [[command.opt]] + name = "conflicting_target" + short = "t" + long = "target" + help = "Conflicting Opt" + + [[command.opt]] + name = "non_conflicting" + long = "non_conflicting" + short = "n" + help = "Non-Conflicting Opt" + + [[command.subcommand]] + name = "single_conflicting_opt" + help = "Generate error messages for reserved opts" + + [[command.subcommand.opt]] + name = "non_conflicting" + long = "non_conflicting" + help = "Non-Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_target" + long = "target" + help = "Conflicting Opt" + + [[command.subcommand]] + name = "multiple_conflicting_opts" + help = "Generate error messages for reserved opts" + + [[command.subcommand.opt]] + name = "conflicting_target" + short = "t" + help = "Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_mode" + long_aliases = ["mode"] + help = "Conflicting Opt" + + [[command.subcommand.opt]] + name = "not_conflicting" + short = "n" + help = "Non-Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_no_targets" + long_aliases = ["no_targets", "no_target"] + help = "Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_target_again" + long = "target" + long_aliases = ["targets"] + short = "t" + help = "Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_v" + short = "v" + long = "verbosity" + help = "Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_vk" + long = "vk" + long_aliases = ["verbosity_keywords"] + help = "Conflicting Opt" + + [[command.subcommand.opt]] + name = "conflicting_help" + short = "h" + long = "help" + short_aliases = ["g", "i"] + long_aliases = ["help_alias"] + help = "Conflicting Opt" + + [[command.subcommand.subcommand]] + name = "subc" + help = "Generate error messages for reserved opts - subc" + + [[command.subcommand.subcommand.opt]] + name = "conflicting_help" + short = "h" + help = "Conflicting Opt" + + [[command.subcommand.subcommand.subcommand]] + name = "subc" + help = "Generate error messages for reserved opts - subc - subc" + + [[command.subcommand.subcommand.subcommand.opt]] + name = "conflicting_help" + long_aliases = ["help", "help2", "help3"] + help = "Conflicting Opt" + + [[command.subcommand.subcommand.subcommand.opt]] + name = "conflicting_v" + short = "c" + short_aliases = ["v"] + long = "verbosity" + help = "Conflicting Opt" + +[[command]] +name = "intra_cmd_conflicts" +help = "App cmd with conflicting args and opts within the cmd" +on_env=["ORIGEN_APP_INTRA_CMD_CONFLICTS"] + + [[command.arg]] + name = "arg0" + help = "Arg 0" + + [[command.arg]] + name = "arg0" + help = "Duplicate: Arg 0" + + [[command.arg]] + name = "arg1" + help = "Arg 1" + + [[command.arg]] + name = "arg2" + help = "Arg 2" + + [[command.arg]] + name = "arg1" + help = "Duplicate: Arg 1" + + [[command.arg]] + name = "ext_opt.arg" + help = "Arg with reserved prefix" + + [[command.opt]] + name = "opt" + help = "Opt 0" + long_aliases=["opt0"] + + [[command.opt]] + name = "opt" + help = "Duplicate: Opt 0" + + [[command.opt]] + name = "ext_opt.opt" + help = "Reserved Prefix" + + [[command.opt]] + name = "arg0" + help = "Arg-Opt clash" + + [[command.opt]] + name = "arg_clash" + help = "Arg-Opt clash in ln/lna (okay)" + long = "arg0" + long_aliases = ["arg1"] + + [[command.opt]] + name= "reserved_prefix_in_ln_lna" + help = "Reserved prefix in ln and lna" + long = "ext_opt.ln" + long_aliases = ["ext_opt.lna", "ext_opt_lna"] + + [[command.opt]] + name= "intra_opt_conflicts" + help = "Various intra-opt conflicts" + long = "intra_opt_cons" + short = "c" + long_aliases = ["intra_opt_conflicts", "intra_opt_cons", "intra_opt_cons2", "intra_opt_cons2"] + short_aliases = ["a", "b", "c", "b", "c", "e", "e"] + + [[command.opt]] + name= "inter_opt_conflicts" + help = "Various inter-opt conflicts" + long = "intra_opt_conflicts" + short = "a" + long_aliases = ["intra_opt_cons", "ext_opt_lna", "reserved_prefix_in_ln_lna"] + short_aliases = ["b", "c", "d"] + + [[command.opt]] + name = "opt0" + help = "Inferred long name clash" + + [[command.subcommand]] + name = "conflicts_subc" + help = "Subcommand with conflicts" + + [[command.subcommand.arg]] + name = "arg0" + help = "Arg 0" + + [[command.subcommand.arg]] + name = "sub_arg_1" + help = "Subc Arg 1" + + [[command.subcommand.arg]] + name = "sub_arg_1" + help = "Duplicate" + + [[command.subcommand.arg]] + name = "ext_opt.subc_arg" + help = "Arg with reserved prefix" + + [[command.subcommand.opt]] + name = "ext_opt.subc_opt" + help = "Reserved opt prefix" + short = "r" + + [[command.subcommand.opt]] + name = "opt" + help = "Opt 0" + long_aliases=["subc_opt", "ext_opt.subc_opt_lna"] + + [[command.subcommand.opt]] + name = "intra_subc_conflicts" + help = "Intra-opt conflicts for subc" + long = "intra_subc_conflicts" + short = "r" + long_aliases=["intra_subc_conflicts"] + short_aliases=["r"] + + [[command.subcommand.opt]] + name = "intra_subc_lna_iln_conflict" + help = "Intra-opt iln conflict" + long_aliases=["intra_subc_lna_iln_conflict"] + + [[command.subcommand.opt]] + name = "inter_subc_conflicts" + help = "Inter-opt conflicts for subc" + long = "opt" + long_aliases=["intra_subc_conflicts"] + short_aliases=["r"] + + [[command.subcommand.opt]] + name = "intra_subc_conflicts" + help = "Duplicate Opt" + +# Extend core command +[[extension]] +extend = "origen.eval" +on_env = ["ORIGEN_APP_EXTEND_CORE_CMDS"] + + [[extension.opt]] + name = "generic_app_ext_action" + multiple = true + help = "Action from the app" + + [[extension.opt]] + name = "generic_app_ext_flag" + help = "Flag ext from the app" + +[[extension]] +extend = "plugin.python_plugin.plugin_says_hi" +on_env = ["ORIGEN_APP_PL_CMD_MISSING_EXT_IMPL"] + + [[extension.opt]] + name = "app_ext_missing_impl" + help = "App extension missing the implementation" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args" +on_env = ["ORIGEN_APP_PL_CMD_CONFLICTS"] + + [[extension.opt]] + name = "app_opt" + help = "Conflict with cmd/aux/plugin opts" + long = "app" + short = "a" + long_aliases=["app_opt", "tas", "flag", "app_flag", "ext_opt.res"] + short_aliases=["c", "d", "g", "g"] + + [[extension.opt]] + name = "tas_iln" + help = "Conflict iln from App" + + [[extension.opt]] + name = "app_opt" + help = "App opt repeat" + + [[extension.opt]] + name = "ext_opt.res_app_opt" + long = "res_opt_opt" + help = "App opt reserved name" + + +# Extend plugin command +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking" +on_env = ["ORIGEN_APP_EXT_PL_TEST_EXT_STACKING"] + + [[extension.opt]] + name = "generic_app_ext_action" + multiple = true + help = "Action from the app" + + [[extension.opt]] + name = "generic_app_ext_flag" + help = "Flag ext from the app" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking.subc" +on_env = ["ORIGEN_APP_EXT_PL_TEST_EXT_STACKING"] + + [[extension.opt]] + name = "generic_app_ext_action" + multiple = true + help = "Action from the app" + + [[extension.opt]] + name = "generic_app_ext_flag" + help = "Flag ext from the app" + +# Extend aux command +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd" +on_env = ["ORIGEN_DUMMY_AUX_CMDS"] + + [[extension.opt]] + name = "generic_app_ext_action" + multiple = true + help = "Action from the app" + + [[extension.opt]] + name = "generic_app_ext_flag" + help = "Flag ext from the app" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd.subc" +on_env = ["ORIGEN_DUMMY_AUX_CMDS"] + + [[extension.opt]] + name = "generic_app_ext_action" + multiple = true + help = "Action from the app" + + [[extension.opt]] + name = "generic_app_ext_flag" + help = "Flag ext from the app" + +# Missing extension +[[extension]] +extend = "origen.eval" +on_env = ["ORIGEN_APP_MISSING_CORE_EXT"] + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd" +on_env = ["ORIGEN_APP_MISSING_AUX_EXT"] + +[[extension]] +extend = "origen.eval" +on_env = ["ORIGEN_APP_EXT_TEST_RESERVED_OPT_ERRORS"] + + [[extension.opt]] + name = "conflicting_target" + help = "Conflicting Core Extension" + long = "target" + short = "t" + + [[extension.opt]] + name = "conflicting_no_target" + help = "Conflicting Core Extension" + long_aliases=["no_target", "no_targets"] + short="n" + + [[extension.opt]] + name = "conflicting_mode" + help = "Conflicting Core Extension" + long="mode_conflict" + short_aliases=["m"] + long_aliases=["mode"] + + [[extension.opt]] + name = "conflicting_help" + help = "Conflicting Core Extension" + short = "h" + long = "help_conflict" + long_aliases=["help", "help1"] + + [[extension.opt]] + name = "conflicting_v" + help = "Conflicting Core Extension" + short="v" + short_aliases=["w"] + long="verbosity" + + [[extension.opt]] + name = "conflicting_vk" + help = "Conflicting Core Extension" + long_aliases=["verbosity_keywords", "vk"] + +# Try to extend non-extenable commands +[[extension]] +extend = "origen.target" +on_env = ["ORIGEN_EXT_TARGET_CMD"] + [[extension.opt]] + name = "test_ext" + help = "Test target" + +[[extension]] +extend = "origen.target.view" +on_env = ["ORIGEN_EXT_TARGET_CMD"] + [[extension.opt]] + name = "test_ext" + help = "Test target view" diff --git a/test_apps/python_app/config/enumerated_plugins.toml b/test_apps/python_app/config/enumerated_plugins.toml new file mode 100644 index 00000000..693bb889 --- /dev/null +++ b/test_apps/python_app/config/enumerated_plugins.toml @@ -0,0 +1,6 @@ +[plugins] +collect = false +load = [ + { name = "test_apps_shared_test_helpers" }, + { name = "python_plugin" }, +] diff --git a/test_apps/python_app/config/origen.toml b/test_apps/python_app/config/origen.toml index 85ee6bd2..8cbb6108 100644 --- a/test_apps/python_app/config/origen.toml +++ b/test_apps/python_app/config/origen.toml @@ -71,4 +71,10 @@ port = 25 auth_method = "None" domain = "origen.org" user = "dummy_ldap_read_only" -timeout = 120 \ No newline at end of file +timeout = 120 + +[[auxillary_commands]] + path = "../../test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds.toml" + +[[auxillary_commands]] + path = "../../test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns.toml" diff --git a/test_apps/python_app/example/commands/arg_opt_warmup.py b/test_apps/python_app/example/commands/arg_opt_warmup.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/arg_opt_warmup.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py b/test_apps/python_app/example/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_app/example/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_app/example/commands/extensions/aux_ns/dummy_cmds/dummy_cmd/subc.py b/test_apps/python_app/example/commands/extensions/aux_ns/dummy_cmds/dummy_cmd/subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_app/example/commands/extensions/aux_ns/dummy_cmds/dummy_cmd/subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_app/example/commands/extensions/core.eval.py b/test_apps/python_app/example/commands/extensions/core.eval.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_app/example/commands/extensions/core.eval.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_args.py b/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_args.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_args.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.py b/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.py new file mode 100644 index 00000000..eb4549b1 --- /dev/null +++ b/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) diff --git a/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.subc.py b/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.subc.py new file mode 100644 index 00000000..eb4549b1 --- /dev/null +++ b/test_apps/python_app/example/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) diff --git a/test_apps/python_app/example/commands/intra_cmd_conflicts.conflicts_subc.py b/test_apps/python_app/example/commands/intra_cmd_conflicts.conflicts_subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/intra_cmd_conflicts.conflicts_subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/intra_cmd_conflicts.py b/test_apps/python_app/example/commands/intra_cmd_conflicts.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/intra_cmd_conflicts.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/nested_app_cmds.nested_l1.nested_l2_a.nested_l3_b.py b/test_apps/python_app/example/commands/nested_app_cmds.nested_l1.nested_l2_a.nested_l3_b.py new file mode 100644 index 00000000..a93d11d2 --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds.nested_l1.nested_l2_a.nested_l3_b.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi("3 (A-B)") \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds.nested_l1.nested_l2_a.py b/test_apps/python_app/example/commands/nested_app_cmds.nested_l1.nested_l2_a.py new file mode 100644 index 00000000..b3908b3e --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds.nested_l1.nested_l2_a.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi("2 (A)") \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds.py b/test_apps/python_app/example/commands/nested_app_cmds.py new file mode 100644 index 00000000..4d241ecc --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds.py @@ -0,0 +1,11 @@ +from test_apps_shared_test_helpers.aux_cmds import run as output_exts + +def say_hi(lvl): + import os + if os.environ.get("ORIGEN_APP_EXT_NESTED") == "1": + output_exts() + else: + print(f"Hi from 'nested_app_cmds' level {lvl}!") + +def run(**args): + say_hi(0) \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds/nested_l1.nested_l2_b.py b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1.nested_l2_b.py new file mode 100644 index 00000000..b0b89b6b --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1.nested_l2_b.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi("2 (B)") \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds/nested_l1.py b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1.py new file mode 100644 index 00000000..8c80ad8f --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi(1) \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_a/nested_l3_a.py b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_a/nested_l3_a.py new file mode 100644 index 00000000..6fb4a7b1 --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_a/nested_l3_a.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi("3 (A-A)") \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_b.nested_l3_b.py b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_b.nested_l3_b.py new file mode 100644 index 00000000..64bc91f9 --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_b.nested_l3_b.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi("3 (B-B)") \ No newline at end of file diff --git a/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_b/nested_l3_a.py b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_b/nested_l3_a.py new file mode 100644 index 00000000..1c9aefca --- /dev/null +++ b/test_apps/python_app/example/commands/nested_app_cmds/nested_l1/nested_l2_b/nested_l3_a.py @@ -0,0 +1,4 @@ +from example.commands.nested_app_cmds import say_hi + +def run(**args): + say_hi("3 (B-A)") \ No newline at end of file diff --git a/test_apps/python_app/example/commands/reserved_opt_error_gen.py b/test_apps/python_app/example/commands/reserved_opt_error_gen.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/reserved_opt_error_gen.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.py b/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.subc.py b/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.subc.subc.py b/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.subc.subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/reserved_opt_error_gen/multiple_conflicting_opts.subc.subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/reserved_opt_error_gen/single_conflicting_opt.py b/test_apps/python_app/example/commands/reserved_opt_error_gen/single_conflicting_opt.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/reserved_opt_error_gen/single_conflicting_opt.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/simple2_with_arg.py b/test_apps/python_app/example/commands/simple2_with_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/simple2_with_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/example/commands/simple_with_arg.py b/test_apps/python_app/example/commands/simple_with_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_app/example/commands/simple_with_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_app/poetry.lock b/test_apps/python_app/poetry.lock index 186b363d..054317e4 100644 --- a/test_apps/python_app/poetry.lock +++ b/test_apps/python_app/poetry.lock @@ -1,44 +1,63 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] name = "alabaster" -version = "0.7.12" +version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" category = "main" optional = false -python-versions = "*" - -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" +files = [ + {file = "alabaster-0.7.13-py3-none-any.whl", hash = "sha256:1ee19aca801bbabb5ba3f5f258e4422dfa86f82f3e9cefb0859b283cdd7f62a3"}, + {file = "alabaster-0.7.13.tar.gz", hash = "sha256:a27a4a084d5e690e16e01e03ad2b2e552c61a65469419b907243193de1a84ae2"}, +] [[package]] name = "attrs" -version = "21.4.0" +version = "22.2.0" description = "Classes Without Boilerplate" -category = "dev" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +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"}, +] [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "cloudpickle"] +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.10.3" +version = "2.11.0" description = "Internationalization utilities" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, + {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, +] [package.dependencies] pytz = ">=2015.7" +[[package]] +name = "backports-cached-property" +version = "1.0.2" +description = "cached_property() - computed once per instance, cached as attribute" +category = "main" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "backports.cached-property-1.0.2.tar.gz", hash = "sha256:9306f9eed6ec55fd156ace6bc1094e2c86fae5fb2bf07b6a9c00745c656e75dd"}, + {file = "backports.cached_property-1.0.2-py3-none-any.whl", hash = "sha256:baeb28e1cd619a3c9ab8941431fe34e8490861fb998c6c4590693d50171db0cc"}, +] + [[package]] name = "beautifulsoup4" version = "4.8.2" @@ -46,6 +65,11 @@ description = "Screen-scraping library" category = "main" optional = false python-versions = "*" +files = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] [package.dependencies] soupsieve = ">=1.2" @@ -61,10 +85,38 @@ description = "Dummy package for Beautiful Soup" category = "main" optional = false python-versions = "*" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] [package.dependencies] beautifulsoup4 = "*" +[[package]] +name = "build" +version = "0.10.0" +description = "A simple, correct Python build frontend" +category = "main" +optional = false +python-versions = ">= 3.7" +files = [ + {file = "build-0.10.0-py3-none-any.whl", hash = "sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171"}, + {file = "build-0.10.0.tar.gz", hash = "sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "os_name == \"nt\""} +importlib-metadata = {version = ">=0.22", markers = "python_version < \"3.8\""} +packaging = ">=19.0" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["furo (>=2021.08.31)", "sphinx (>=4.0,<5.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)"] +test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "toml (>=0.10.0)", "wheel (>=0.36.0)"] +typing = ["importlib-metadata (>=5.1)", "mypy (==0.991)", "tomli", "typing-extensions (>=3.7.4.3)"] +virtualenv = ["virtualenv (>=20.0.35)"] + [[package]] name = "cachecontrol" version = "0.12.11" @@ -72,6 +124,10 @@ description = "httplib2 caching for requests" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, +] [package.dependencies] lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} @@ -82,26 +138,17 @@ requests = "*" filecache = ["lockfile (>=0.9)"] redis = ["redis (>=2.10.5)"] -[[package]] -name = "cachy" -version = "0.3.0" -description = "Cachy provides a simple yet effective caching library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -redis = ["redis (>=3.3.6,<4.0.0)"] -memcached = ["python-memcached (>=1.59,<2.0)"] -msgpack = ["msgpack-python (>=0.5,<0.6)"] - [[package]] name = "certifi" -version = "2022.6.15" +version = "2022.12.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"}, +] [[package]] name = "cffi" @@ -110,52 +157,201 @@ description = "Foreign Function Interface for Python calling C code." category = "main" optional = false python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.1.0" +version = "3.0.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.6.0" - -[package.extras] -unicode_backport = ["unicodedata2"] +python-versions = "*" +files = [ + {file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"}, + {file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"}, + {file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"}, + {file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"}, + {file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"}, + {file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"}, + {file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"}, + {file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"}, +] [[package]] name = "cleo" -version = "0.8.1" +version = "2.0.1" description = "Cleo allows you to create beautiful and testable command-line interfaces." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -clikit = ">=0.6.0,<0.7.0" - -[[package]] -name = "clikit" -version = "0.6.2" -description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7,<4.0" +files = [ + {file = "cleo-2.0.1-py3-none-any.whl", hash = "sha256:6eb133670a3ed1f3b052d53789017b6e50fca66d1287e6e6696285f4cb8ea448"}, + {file = "cleo-2.0.1.tar.gz", hash = "sha256:eb4b2e1f3063c11085cebe489a6e9124163c226575a3c3be69b2e51af4a15ec5"}, +] [package.dependencies] -crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -pastel = ">=0.2.0,<0.3.0" -pylev = ">=1.3,<2.0" +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=2.2.0,<3.0.0" [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "commonmark" @@ -164,44 +360,81 @@ description = "Python parser for the CommonMark Markdown spec" category = "main" optional = false python-versions = "*" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] [package.extras] test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "crashtest" -version = "0.3.1" +version = "0.4.1" description = "Manage Python errors with ease" category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.7,<4.0" +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] [[package]] name = "cryptography" -version = "37.0.4" +version = "39.0.0" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "cryptography-39.0.0-cp36-abi3-macosx_10_12_universal2.whl", hash = "sha256:c52a1a6f81e738d07f43dab57831c29e57d21c81a942f4602fac7ee21b27f288"}, + {file = "cryptography-39.0.0-cp36-abi3-macosx_10_12_x86_64.whl", hash = "sha256:80ee674c08aaef194bc4627b7f2956e5ba7ef29c3cc3ca488cf15854838a8f72"}, + {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:887cbc1ea60786e534b00ba8b04d1095f4272d380ebd5f7a7eb4cc274710fad9"}, + {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f97109336df5c178ee7c9c711b264c502b905c2d2a29ace99ed761533a3460f"}, + {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a6915075c6d3a5e1215eab5d99bcec0da26036ff2102a1038401d6ef5bef25b"}, + {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:76c24dd4fd196a80f9f2f5405a778a8ca132f16b10af113474005635fe7e066c"}, + {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bae6c7f4a36a25291b619ad064a30a07110a805d08dc89984f4f441f6c1f3f96"}, + {file = "cryptography-39.0.0-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:875aea1039d78557c7c6b4db2fe0e9d2413439f4676310a5f269dd342ca7a717"}, + {file = "cryptography-39.0.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:f6c0db08d81ead9576c4d94bbb27aed8d7a430fa27890f39084c2d0e2ec6b0df"}, + {file = "cryptography-39.0.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f3ed2d864a2fa1666e749fe52fb8e23d8e06b8012e8bd8147c73797c506e86f1"}, + {file = "cryptography-39.0.0-cp36-abi3-win32.whl", hash = "sha256:f671c1bb0d6088e94d61d80c606d65baacc0d374e67bf895148883461cd848de"}, + {file = "cryptography-39.0.0-cp36-abi3-win_amd64.whl", hash = "sha256:e324de6972b151f99dc078defe8fb1b0a82c6498e37bff335f5bc6b1e3ab5a1e"}, + {file = "cryptography-39.0.0-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:754978da4d0457e7ca176f58c57b1f9de6556591c19b25b8bcce3c77d314f5eb"}, + {file = "cryptography-39.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ee1fd0de9851ff32dbbb9362a4d833b579b4a6cc96883e8e6d2ff2a6bc7104f"}, + {file = "cryptography-39.0.0-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:fec8b932f51ae245121c4671b4bbc030880f363354b2f0e0bd1366017d891458"}, + {file = "cryptography-39.0.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:407cec680e811b4fc829de966f88a7c62a596faa250fc1a4b520a0355b9bc190"}, + {file = "cryptography-39.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7dacfdeee048814563eaaec7c4743c8aea529fe3dd53127313a792f0dadc1773"}, + {file = "cryptography-39.0.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ad04f413436b0781f20c52a661660f1e23bcd89a0e9bb1d6d20822d048cf2856"}, + {file = "cryptography-39.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50386acb40fbabbceeb2986332f0287f50f29ccf1497bae31cf5c3e7b4f4b34f"}, + {file = "cryptography-39.0.0-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:e5d71c5d5bd5b5c3eebcf7c5c2bb332d62ec68921a8c593bea8c394911a005ce"}, + {file = "cryptography-39.0.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:844ad4d7c3850081dffba91cdd91950038ee4ac525c575509a42d3fc806b83c8"}, + {file = "cryptography-39.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e0a05aee6a82d944f9b4edd6a001178787d1546ec7c6223ee9a848a7ade92e39"}, + {file = "cryptography-39.0.0.tar.gz", hash = "sha256:f964c7dcf7802d133e8dbd1565914fa0194f9d683d82411989889ecd701e8adf"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools_rust (>=0.11.4)"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1,!=5.2.0,!=5.2.0.post0)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "ruff"] +sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] name = "distlib" -version = "0.3.5" +version = "0.3.8" description = "Distribution utilities" category = "main" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] [[package]] name = "docutils" @@ -210,18 +443,130 @@ description = "Docutils -- Python Documentation Utilities" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] + +[[package]] +name = "dulwich" +version = "0.21.7" +description = "Python Git Library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, + {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, + {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, + {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, + {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, + {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, + {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, + {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, + {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, + {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, + {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, + {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, + {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, + {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, + {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version <= \"3.7\""} +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] [[package]] name = "filelock" -version = "3.7.1" +version = "3.12.2" description = "A platform independent file lock." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] [package.extras] -docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"] -testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] [[package]] name = "html5lib" @@ -230,24 +575,32 @@ description = "HTML parser based on the WHATWG HTML specification" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] [package.dependencies] six = ">=1.9" webencodings = "*" [package.extras] -all = ["genshi", "chardet (>=2.2)", "lxml"] +all = ["chardet (>=2.2)", "genshi", "lxml"] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] lxml = ["lxml"] [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "imagesize" @@ -256,29 +609,93 @@ description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] name = "importlib-metadata" -version = "1.7.0" +version = "6.7.0" description = "Read metadata from Python packages" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["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-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "5.10.2" +description = "Read resources from Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, + {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] + +[[package]] +name = "jaraco-classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "jeepney" @@ -287,10 +704,14 @@ description = "Low-level, pure Python DBus protocol wrapper." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] -trio = ["trio", "async-generator"] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] name = "jinja2" @@ -299,6 +720,10 @@ description = "A very fast and expressive template engine." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] MarkupSafe = ">=2.0" @@ -306,23 +731,54 @@ MarkupSafe = ">=2.0" [package.extras] i18n = ["Babel (>=2.7)"] +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + [[package]] name = "keyring" -version = "22.3.0" +version = "23.13.1" description = "Store and access your passwords safely." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, +] [package.dependencies] -importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +"jaraco.classes" = "*" jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} -pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] +completion = ["shtab"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] name = "lockfile" @@ -331,6 +787,10 @@ description = "Platform-independent file locking module" category = "main" optional = false python-versions = "*" +files = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] [[package]] name = "mako" @@ -339,6 +799,9 @@ description = "A super-fast templating language that borrows the best ideas fro category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] [package.dependencies] MarkupSafe = ">=0.9.2" @@ -350,43 +813,152 @@ description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false python-versions = ">=3.7" - -[[package]] -name = "msgpack" -version = "1.0.4" -description = "MessagePack serializer" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "origen" -version = "2.0.0.dev5" -description = "Semiconductor Developer's Kit" -category = "main" -optional = false -python-versions = ">=3.7,<3.11" -develop = true - -[package.dependencies] -beautifulsoup4 = "4.8.2" -bs4 = "0.0.1" -colorama = "^0.4" -importlib-metadata = ">= 1.7.0" -Jinja2 = "^3" -mako = "1.1.0" -origen_autoapi = "2.0.1" -origen_metal = "= 0.4.0" -poetry = "^1.1.14" -recommonmark = ">= 0" -sphinx = "3.0.2" -sphinxbootstrap4theme = ">= 0" -termcolor = ">= 1.1.0" -yapf = "0.30" - -[package.source] -type = "directory" -url = "../../python/origen" +files = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] + +[[package]] +name = "more-itertools" +version = "9.0.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, +] + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] + +[[package]] +name = "origen" +version = "2.0.0.dev8" +description = "Semiconductor Developer's Kit" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +beautifulsoup4 = "4.8.2" +bs4 = "0.0.1" +colorama = "^0.4" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" +mako = "1.1.0" +origen_autoapi = "2.0.1" +origen_metal = "~0.4.1.dev1" +poetry = "^1.1.14" +recommonmark = ">= 0" +sphinx = "3.0.2" +sphinxbootstrap4theme = ">= 0" +termcolor = ">= 1.1.0" +yapf = "0.30" + +[package.source] +type = "directory" +url = "../../python/origen" [[package]] name = "origen-autoapi" @@ -395,21 +967,27 @@ description = "Automatic API reference documentation generation for Sphinx inspi category = "main" optional = false python-versions = "*" +files = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] [package.dependencies] sphinx = "*" [[package]] name = "origen-metal" -version = "0.4.0" +version = "0.4.1.dev1" description = "Bare metal APIs for the Origen SDK" category = "main" optional = false -python-versions = ">=3.7,<3.11" +python-versions = ">=3.7.0,<3.13" +files = [] develop = true [package.dependencies] colorama = ">= 0.4.4" +importlib-metadata = ">= 6.7.0" pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} termcolor = ">= 1.1.0" @@ -419,22 +997,15 @@ url = "../../python/origen_metal" [[package]] name = "packaging" -version = "20.9" +version = "23.0" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +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"}, +] [[package]] name = "pexpect" @@ -443,40 +1014,89 @@ description = "Pexpect allows easy control of interactive console applications." category = "main" optional = false python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" [[package]] name = "pkginfo" -version = "1.8.3" -description = "Query metadatdata from sdists / bdists / installed packages." +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] [package.extras] -testing = ["nose", "coverage"] +testing = ["pytest", "pytest-cov"] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "pl-ext-cmds" +version = "0.1.0" +description = "Plugin Extending Cmds" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +origen_metal = ">=0.0.0" + +[package.source] +type = "directory" +url = "../pl_ext_cmds" [[package]] name = "platformdirs" -version = "2.5.2" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +version = "3.11.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} [package.extras] -docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] -test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] [[package]] name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "dev" +category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.dependencies] importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} @@ -487,41 +1107,77 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "poetry" -version = "1.1.14" +version = "1.5.1" description = "Python dependency management and packaging made easy." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry-1.5.1-py3-none-any.whl", hash = "sha256:dfc7ce3a38ae216c0465694e2e674bef6eb1a2ba81aa47a26f9dc03362fe2f5f"}, + {file = "poetry-1.5.1.tar.gz", hash = "sha256:cc7ea4524d1a11558006224bfe8ba8ed071417d4eb5ef6c89decc6a37d437eeb"}, +] [package.dependencies] -cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -cachy = ">=0.3.0,<0.4.0" -cleo = ">=0.8.1,<0.9.0" -clikit = ">=0.6.2,<0.7.0" -crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +"backports.cached-property" = {version = ">=1.0.2,<2.0.0", markers = "python_version < \"3.8\""} +build = ">=0.10.0,<0.11.0" +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"]} +cleo = ">=2.0.0,<3.0.0" +crashtest = ">=0.4.1,<0.5.0" +dulwich = ">=0.21.2,<0.22.0" +filelock = ">=3.8.0,<4.0.0" html5lib = ">=1.0,<2.0" -importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} -keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} -packaging = ">=20.4,<21.0" +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +installer = ">=0.7.0,<0.8.0" +jsonschema = ">=4.10.0,<5.0.0" +keyring = ">=23.9.0,<24.0.0" +lockfile = ">=0.12.2,<0.13.0" +packaging = ">=20.4" pexpect = ">=4.7.0,<5.0.0" -pkginfo = ">=1.4,<2.0" -poetry-core = ">=1.0.7,<1.1.0" +pkginfo = ">=1.9.4,<2.0.0" +platformdirs = ">=3.0.0,<4.0.0" +poetry-core = "1.6.1" +poetry-plugin-export = ">=1.4.0,<2.0.0" +pyproject-hooks = ">=1.0.0,<2.0.0" requests = ">=2.18,<3.0" -requests-toolbelt = ">=0.9.1,<0.10.0" -shellingham = ">=1.1,<2.0" -tomlkit = ">=0.7.0,<1.0.0" -virtualenv = ">=20.0.26,<21.0.0" +requests-toolbelt = ">=0.9.1,<2" +shellingham = ">=1.5,<2.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.11.4,<1.0.0" +trove-classifiers = ">=2022.5.19" +urllib3 = ">=1.26.0,<2.0.0" +virtualenv = ">=20.22.0,<21.0.0" +xattr = {version = ">=0.10.0,<0.11.0", markers = "sys_platform == \"darwin\""} [[package]] name = "poetry-core" -version = "1.0.8" +version = "1.6.1" description = "Poetry PEP 517 Build Backend" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_core-1.6.1-py3-none-any.whl", hash = "sha256:70707340447dee0e7f334f9495ae652481c67b32d8d218f296a376ac2ed73573"}, + {file = "poetry_core-1.6.1.tar.gz", hash = "sha256:0f9b0de39665f36d6594657e7d57b6f463cc10f30c28e6d1c3b9ff54c26c9ac3"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} + +[[package]] +name = "poetry-plugin-export" +version = "1.4.0" +description = "Poetry plugin to export the dependencies to various formats" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_plugin_export-1.4.0-py3-none-any.whl", hash = "sha256:5d9186d6f77cf2bf35fc96bd11fe650cc7656e515b17d99cb65018d50ba22589"}, + {file = "poetry_plugin_export-1.4.0.tar.gz", hash = "sha256:f16974cd9f222d4ef640fa97a8d661b04d4fb339e51da93973f1bc9d578e183f"}, +] [package.dependencies] -importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} +poetry = ">=1.5.0,<2.0.0" +poetry-core = ">=1.6.0,<2.0.0" [[package]] name = "ptyprocess" @@ -530,14 +1186,10 @@ description = "Run a subprocess in a pseudo terminal" category = "main" optional = false python-versions = "*" - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] name = "pycparser" @@ -546,33 +1198,40 @@ description = "C parser in Python" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] name = "pygments" -version = "2.12.0" +version = "2.14.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Pygments-2.14.0-py3-none-any.whl", hash = "sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717"}, + {file = "Pygments-2.14.0.tar.gz", hash = "sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297"}, +] -[[package]] -name = "pylev" -version = "1.4.0" -description = "A pure Python Levenshtein implementation that's not freaking GPL'd." -category = "main" -optional = false -python-versions = "*" +[package.extras] +plugins = ["importlib-metadata"] [[package]] -name = "pyparsing" -version = "3.0.9" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." category = "main" optional = false -python-versions = ">=3.6.8" +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] -[package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] name = "pyreadline3" @@ -581,28 +1240,71 @@ description = "A python implementation of GNU readline." category = "main" optional = false python-versions = "*" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] [[package]] name = "pytest" -version = "6.2.5" +version = "7.4.0" description = "pytest: simple powerful testing with Python" -category = "dev" +category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -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" -py = ">=1.8.2" -toml = "*" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "python-plugin" @@ -610,7 +1312,8 @@ version = "0.1.0" description = "Example Origen Plugin" category = "main" optional = false -python-versions = ">=3.7,<3.11" +python-versions = ">=3.7.0,<3.13" +files = [] develop = true [package.dependencies] @@ -620,13 +1323,35 @@ origen = {path = "../../python/origen", develop = true} type = "directory" url = "../python_plugin" +[[package]] +name = "python-plugin-no-cmds" +version = "0.1.0" +description = "Example Origen Plugin Without Any Commands" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +origen_metal = {path = "../../python/origen_metal", develop = true} + +[package.source] +type = "directory" +url = "../python_plugin_no_cmds" + [[package]] name = "pytz" -version = "2022.1" +version = "2022.7" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, + {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, +] [[package]] name = "pywin32-ctypes" @@ -635,6 +1360,112 @@ description = "" category = "main" optional = false python-versions = "*" +files = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] + +[[package]] +name = "rapidfuzz" +version = "2.13.7" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b75dd0928ce8e216f88660ab3d5c5ffe990f4dd682fd1709dba29d5dafdde6de"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24d3fea10680d085fd0a4d76e581bfb2b1074e66e78fd5964d4559e1fcd2a2d4"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8109e0324d21993d5b2d111742bf5958f3516bf8c59f297c5d1cc25a2342eb66"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f705652360d520c2de52bee11100c92f59b3e3daca308ebb150cbc58aecdad"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7496e8779905b02abc0ab4ba2a848e802ab99a6e20756ffc967a0de4900bd3da"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24eb6b843492bdc63c79ee4b2f104059b7a2201fef17f25177f585d3be03405a"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:467c1505362823a5af12b10234cb1c4771ccf124c00e3fc9a43696512bd52293"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53dcae85956853b787c27c1cb06f18bb450e22cf57a4ad3444cf03b8ff31724a"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46b9b8aa09998bc48dd800854e8d9b74bc534d7922c1d6e1bbf783e7fa6ac29c"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1fbad8fb28d98980f5bff33c7842efef0315d42f0cd59082108482a7e6b61410"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:43fb8cb030f888c3f076d40d428ed5eb4331f5dd6cf1796cfa39c67bf0f0fc1e"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b6bad92de071cbffa2acd4239c1779f66851b60ffbbda0e4f4e8a2e9b17e7eef"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d00df2e4a81ffa56a6b1ec4d2bc29afdcb7f565e0b8cd3092fece2290c4c7a79"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-win32.whl", hash = "sha256:2c836f0f2d33d4614c3fbaf9a1eb5407c0fe23f8876f47fd15b90f78daa64c34"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-win_amd64.whl", hash = "sha256:c36fd260084bb636b9400bb92016c6bd81fd80e59ed47f2466f85eda1fc9f782"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b34e8c0e492949ecdd5da46a1cfc856a342e2f0389b379b1a45a3cdcd3176a6e"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:875d51b3497439a72e2d76183e1cb5468f3f979ab2ddfc1d1f7dde3b1ecfb42f"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae33a72336059213996fe4baca4e0e4860913905c2efb7c991eab33b95a98a0a"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5585189b3d90d81ccd62d4f18530d5ac8972021f0aaaa1ffc6af387ff1dce75"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42085d4b154a8232767de8296ac39c8af5bccee6b823b0507de35f51c9cbc2d7"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:585206112c294e335d84de5d5f179c0f932837752d7420e3de21db7fdc476278"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f891b98f8bc6c9d521785816085e9657212621e93f223917fb8e32f318b2957e"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08590905a95ccfa43f4df353dcc5d28c15d70664299c64abcad8721d89adce4f"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b5dd713a1734574c2850c566ac4286594bacbc2d60b9170b795bee4b68656625"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:988f8f6abfba7ee79449f8b50687c174733b079521c3cc121d65ad2d38831846"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b3210869161a864f3831635bb13d24f4708c0aa7208ef5baac1ac4d46e9b4208"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f6fe570e20e293eb50491ae14ddeef71a6a7e5f59d7e791393ffa99b13f1f8c2"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6120f2995f5154057454c5de99d86b4ef3b38397899b5da1265467e8980b2f60"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-win32.whl", hash = "sha256:b20141fa6cee041917801de0bab503447196d372d4c7ee9a03721b0a8edf5337"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-win_amd64.whl", hash = "sha256:ec55a81ac2b0f41b8d6fb29aad16e55417036c7563bad5568686931aa4ff08f7"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d005e058d86f2a968a8d28ca6f2052fab1f124a39035aa0523261d6baf21e1f"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe59a0c21a032024edb0c8e43f5dee5623fef0b65a1e3c1281836d9ce199af3b"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfc04f7647c29fb48da7a04082c34cdb16f878d3c6d098d62d5715c0ad3000c"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68a89bb06d5a331511961f4d3fa7606f8e21237467ba9997cae6f67a1c2c2b9e"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:effe182767d102cb65dfbbf74192237dbd22d4191928d59415aa7d7c861d8c88"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25b4cedf2aa19fb7212894ce5f5219010cce611b60350e9a0a4d492122e7b351"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9bd02e1679c0fd2ecf69b72d0652dbe2a9844eaf04a36ddf4adfbd70010e95"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5e2b3d020219baa75f82a4e24b7c8adcb598c62f0e54e763c39361a9e5bad510"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:cf62dacb3f9234f3fddd74e178e6d25c68f2067fde765f1d95f87b1381248f58"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:fa263135b892686e11d5b84f6a1892523123a00b7e5882eff4fbdabb38667347"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa4c598ed77f74ec973247ca776341200b0f93ec3883e34c222907ce72cb92a4"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-win32.whl", hash = "sha256:c2523f8180ebd9796c18d809e9a19075a1060b1a170fde3799e83db940c1b6d5"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-win_amd64.whl", hash = "sha256:5ada0a14c67452358c1ee52ad14b80517a87b944897aaec3e875279371a9cb96"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ca8a23097c1f50e0fdb4de9e427537ca122a18df2eead06ed39c3a0bef6d9d3a"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9be02162af0376d64b840f2fc8ee3366794fc149f1e06d095a6a1d42447d97c5"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af4f7c3c904ca709493eb66ca9080b44190c38e9ecb3b48b96d38825d5672559"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f50d1227e6e2a0e3ae1fb1c9a2e1c59577d3051af72c7cab2bcc430cb5e18da"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c71d9d512b76f05fa00282227c2ae884abb60e09f08b5ca3132b7e7431ac7f0d"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b52ac2626945cd21a2487aeefed794c14ee31514c8ae69b7599170418211e6f6"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca00fafd2756bc9649bf80f1cf72c647dce38635f0695d7ce804bc0f759aa756"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d248a109699ce9992304e79c1f8735c82cc4c1386cd8e27027329c0549f248a2"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c88adbcb933f6b8612f6c593384bf824e562bb35fc8a0f55fac690ab5b3486e5"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8601a66fbfc0052bb7860d2eacd303fcde3c14e87fdde409eceff516d659e77"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:27be9c63215d302ede7d654142a2e21f0d34ea6acba512a4ae4cfd52bbaa5b59"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3dcffe1f3cbda0dc32133a2ae2255526561ca594f15f9644384549037b355245"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8450d15f7765482e86ef9be2ad1a05683cd826f59ad236ef7b9fb606464a56aa"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-win32.whl", hash = "sha256:460853983ab88f873173e27cc601c5276d469388e6ad6e08c4fd57b2a86f1064"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-win_amd64.whl", hash = "sha256:424f82c35dbe4f83bdc3b490d7d696a1dc6423b3d911460f5493b7ffae999fd2"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c3fbe449d869ea4d0909fc9d862007fb39a584fb0b73349a6aab336f0d90eaed"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16080c05a63d6042643ae9b6cfec1aefd3e61cef53d0abe0df3069b9d4b72077"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dbcf5371ea704759fcce772c66a07647751d1f5dbdec7818331c9b31ae996c77"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:114810491efb25464016fd554fdf1e20d390309cecef62587494fc474d4b926f"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a84ab9ac9a823e7e93b4414f86344052a5f3e23b23aa365cda01393ad895bd"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81642a24798851b118f82884205fc1bd9ff70b655c04018c467824b6ecc1fabc"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3741cb0bf9794783028e8b0cf23dab917fa5e37a6093b94c4c2f805f8e36b9f"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:759a3361711586a29bc753d3d1bdb862983bd9b9f37fbd7f6216c24f7c972554"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1333fb3d603d6b1040e365dca4892ba72c7e896df77a54eae27dc07db90906e3"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:916bc2e6cf492c77ad6deb7bcd088f0ce9c607aaeabc543edeb703e1fbc43e31"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:23524635840500ce6f4d25005c9529a97621689c85d2f727c52eed1782839a6a"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ebe303cd9839af69dd1f7942acaa80b1ba90bacef2e7ded9347fbed4f1654672"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe56659ccadbee97908132135de4b875543353351e0c92e736b7c57aee298b5a"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-win32.whl", hash = "sha256:3f11a7eff7bc6301cd6a5d43f309e22a815af07e1f08eeb2182892fca04c86cb"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-win_amd64.whl", hash = "sha256:e8914dad106dacb0775718e54bf15e528055c4e92fb2677842996f2d52da5069"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f7930adf84301797c3f09c94b9c5a9ed90a9e8b8ed19b41d2384937e0f9f5bd"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31022d9970177f6affc6d5dd757ed22e44a10890212032fabab903fdee3bfe7"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f42b82f268689f429def9ecfb86fa65ceea0eaf3fed408b570fe113311bf5ce7"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b477b43ced896301665183a5e0faec0f5aea2373005648da8bdcb3c4b73f280"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d63def9bbc6b35aef4d76dc740301a4185867e8870cbb8719ec9de672212fca8"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c66546e30addb04a16cd864f10f5821272a1bfe6462ee5605613b4f1cb6f7b48"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f799d1d6c33d81e983d3682571cc7d993ae7ff772c19b3aabb767039c33f6d1e"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82f20c0060ffdaadaf642b88ab0aa52365b56dffae812e188e5bdb998043588"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042644133244bfa7b20de635d500eb9f46af7097f3d90b1724f94866f17cb55e"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75c45dcd595f8178412367e302fd022860ea025dc4a78b197b35428081ed33d5"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d8b081988d0a49c486e4e845a547565fee7c6e7ad8be57ff29c3d7c14c6894c"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16ffad751f43ab61001187b3fb4a9447ec2d1aedeff7c5bac86d3b95f9980cc3"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020858dd89b60ce38811cd6e37875c4c3c8d7fcd8bc20a0ad2ed1f464b34dc4e"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda1e2f66bb4ba7261a0f4c2d052d5d909798fca557cbff68f8a79a87d66a18f"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6389c50d8d214c9cd11a77f6d501529cb23279a9c9cafe519a3a4b503b5f72a"}, + {file = "rapidfuzz-2.13.7.tar.gz", hash = "sha256:8d3e252d4127c79b4d7c2ae47271636cbaca905c8bb46d80c7930ab906cf4b5c"}, +] + +[package.extras] +full = ["numpy"] [[package]] name = "recommonmark" @@ -643,6 +1474,10 @@ description = "A docutils-compatibility bridge to CommonMark, enabling you to wr category = "main" optional = false python-versions = "*" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] [package.dependencies] commonmark = ">=0.8.1" @@ -651,52 +1486,85 @@ sphinx = ">=1.3.1" [[package]] name = "requests" -version = "2.28.1" +version = "2.28.2" description = "Python HTTP for Humans." category = "main" optional = false python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.2-py3-none-any.whl", hash = "sha256:64299f4909223da747622c030b781c0d7811e359c37124b4bd368fb8c6518baa"}, + {file = "requests-2.28.2.tar.gz", hash = "sha256:98b1b2782e3c6c4904938b84c0eb932721069dfdb9134313beff7c83c2df24bf"}, +] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" +charset-normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" -version = "0.9.1" +version = "0.10.1" description = "A utility belt for advanced users of python-requests" category = "main" optional = false -python-versions = "*" - +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"}, +] + [package.dependencies] requests = ">=2.0.1,<3.0.0" [[package]] name = "secretstorage" -version = "3.3.2" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] [package.dependencies] cryptography = ">=2.0" jeepney = ">=0.6" +[[package]] +name = "setuptools" +version = "65.7.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "setuptools-65.7.0-py3-none-any.whl", hash = "sha256:8ab4f1dbf2b4a65f7eec5ad0c620e84c34111a68d3349833494b9088212214dd"}, + {file = "setuptools-65.7.0.tar.gz", hash = "sha256:4d3c92fac8f1118bb77a22181355e29c239cabfe2b9effdaa665c66b711136d7"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "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", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "shellingham" -version = "1.4.0" +version = "1.5.0.post1" description = "Tool to Detect Surrounding Shell" category = "main" optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" +python-versions = ">=3.7" +files = [ + {file = "shellingham-1.5.0.post1-py2.py3-none-any.whl", hash = "sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744"}, + {file = "shellingham-1.5.0.post1.tar.gz", hash = "sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28"}, +] [[package]] name = "six" @@ -705,6 +1573,10 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "snowballstemmer" @@ -713,6 +1585,10 @@ description = "This package provides 29 stemmers for 28 languages generated from category = "main" optional = false python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] [[package]] name = "soupsieve" @@ -721,6 +1597,10 @@ description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] [[package]] name = "sphinx" @@ -729,6 +1609,10 @@ description = "Python documentation generator" category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] [package.dependencies] alabaster = ">=0.7,<0.8" @@ -740,6 +1624,7 @@ Jinja2 = ">=2.3" packaging = "*" Pygments = ">=2.0" requests = ">=2.5.0" +setuptools = "*" snowballstemmer = ">=1.1" sphinxcontrib-applehelp = "*" sphinxcontrib-devhelp = "*" @@ -750,8 +1635,8 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] name = "sphinxbootstrap4theme" @@ -760,6 +1645,9 @@ description = "Sphinx Bootstrap4 Theme" category = "main" optional = false python-versions = "*" +files = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] [[package]] name = "sphinxcontrib-applehelp" @@ -768,9 +1656,13 @@ description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple category = "main" optional = false python-versions = ">=3.5" +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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -780,9 +1672,13 @@ description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -792,10 +1688,14 @@ description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML h category = "main" optional = false python-versions = ">=3.6" +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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] [[package]] name = "sphinxcontrib-jsmath" @@ -804,9 +1704,13 @@ description = "A sphinx extension which renders display math in HTML via JavaScr category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] [package.extras] -test = ["pytest", "flake8", "mypy"] +test = ["flake8", "mypy", "pytest"] [[package]] name = "sphinxcontrib-qthelp" @@ -815,9 +1719,13 @@ description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp d category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] @@ -827,66 +1735,135 @@ description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] name = "termcolor" -version = "1.1.0" -description = "ANSII Color formatting for output in terminal." +version = "2.2.0" +description = "ANSI color formatting for output in terminal" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.2.0-py3-none-any.whl", hash = "sha256:91ddd848e7251200eac969846cbae2dacd7d71c2871e92733289e7e3666f48e7"}, + {file = "termcolor-2.2.0.tar.gz", hash = "sha256:dfc8ac3f350788f23b2947b3e6cfa5a53b630b612e6cd8965a015a776020b99a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] [[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" +name = "test-apps-shared-test-helpers" +version = "0.1.0" +description = "Shared Regression Test Helpers for Test Apps" +category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +pl_ext_cmds = {path = "../pl_ext_cmds", develop = true} +pytest = ">=7.2.1" + +[package.source] +type = "directory" +url = "../test_apps_shared_test_helpers" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] [[package]] name = "tomlkit" -version = "0.11.1" +version = "0.11.6" description = "Style preserving TOML library" category = "main" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6" +files = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] + +[[package]] +name = "trove-classifiers" +version = "2023.1.12" +description = "Canonical source for classifiers on PyPI (pypi.org)." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "trove-classifiers-2023.1.12.tar.gz", hash = "sha256:eba460d83260fcf3648d7c8acbf2204344fd785f890fbaecb6864a7fb9f0692e"}, + {file = "trove_classifiers-2023.1.12-py3-none-any.whl", hash = "sha256:b10b3cbdefc342fbce9aa5b49907c7df4b33b14252a8e0ee4122cbf918a5cab4"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] [[package]] name = "urllib3" -version = "1.26.10" +version = "1.26.14" 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.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.14-py2.py3-none-any.whl", hash = "sha256:75edcdc2f7d85b137124a6c3c9fc3933cdeaa12ecb9a6a959f22797a0feca7e1"}, + {file = "urllib3-1.26.14.tar.gz", hash = "sha256:076907bf8fd355cde77728471316625a4d2f7e713c125f51953bb5b3eecf4f72"}, +] [package.extras] -brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +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)"] [[package]] name = "virtualenv" -version = "20.15.1" +version = "20.25.0" description = "Virtual Python Environment builder" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, +] [package.dependencies] -distlib = ">=0.3.1,<1" -filelock = ">=3.2,<4" -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -platformdirs = ">=2,<3" -six = ">=1.9.0,<2" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +importlib-metadata = {version = ">=6.6", markers = "python_version < \"3.8\""} +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=21.3)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "webencodings" @@ -895,6 +1872,95 @@ description = "Character encoding aliases for legacy web content" category = "main" optional = false python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "xattr" +version = "0.10.1" +description = "Python wrapper for extended filesystem attributes" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "xattr-0.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:16a660a883e703b311d1bbbcafc74fa877585ec081cd96e8dd9302c028408ab1"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1e2973e72faa87ca29d61c23b58c3c89fe102d1b68e091848b0e21a104123503"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:13279fe8f7982e3cdb0e088d5cb340ce9cbe5ef92504b1fd80a0d3591d662f68"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1dc9b9f580ef4b8ac5e2c04c16b4d5086a611889ac14ecb2e7e87170623a0b75"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:485539262c2b1f5acd6b6ea56e0da2bc281a51f74335c351ea609c23d82c9a79"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:295b3ab335fcd06ca0a9114439b34120968732e3f5e9d16f456d5ec4fa47a0a2"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a126eb38e14a2f273d584a692fe36cff760395bf7fc061ef059224efdb4eb62c"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:b0e919c24f5b74428afa91507b15e7d2ef63aba98e704ad13d33bed1288dca81"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:e31d062cfe1aaeab6ba3db6bd255f012d105271018e647645941d6609376af18"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:209fb84c09b41c2e4cf16dd2f481bb4a6e2e81f659a47a60091b9bcb2e388840"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4120090dac33eddffc27e487f9c8f16b29ff3f3f8bcb2251b2c6c3f974ca1e1"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e739d624491267ec5bb740f4eada93491de429d38d2fcdfb97b25efe1288eca"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2677d40b95636f3482bdaf64ed9138fb4d8376fb7933f434614744780e46e42d"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40039f1532c4456fd0f4c54e9d4e01eb8201248c321c6c6856262d87e9a99593"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:148466e5bb168aba98f80850cf976e931469a3c6eb11e9880d9f6f8b1e66bd06"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0aedf55b116beb6427e6f7958ccd80a8cbc80e82f87a4cd975ccb61a8d27b2ee"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3024a9ff157247c8190dd0eb54db4a64277f21361b2f756319d9d3cf20e475f"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f1be6e733e9698f645dbb98565bb8df9b75e80e15a21eb52787d7d96800e823b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7880c8a54c18bc091a4ce0adc5c6d81da1c748aec2fe7ac586d204d6ec7eca5b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c93b42c3ba8aedbc29da759f152731196c2492a2154371c0aae3ef8ba8301b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b905e808df61b677eb972f915f8a751960284358b520d0601c8cbc476ba2df6"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ef954d0655f93a34d07d0cc7e02765ec779ff0b59dc898ee08c6326ad614d5"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:199b20301b6acc9022661412346714ce764d322068ef387c4de38062474db76c"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0956a8ab0f0d3f9011ba480f1e1271b703d11542375ef73eb8695a6bd4b78b"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffcb57ca1be338d69edad93cf59aac7c6bb4dbb92fd7bf8d456c69ea42f7e6d2"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f0563196ee54756fe2047627d316977dc77d11acd7a07970336e1a711e934db"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc354f086f926a1c7f04886f97880fed1a26d20e3bc338d0d965fd161dbdb8ab"}, + {file = "xattr-0.10.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cd2d02ef2fb45ecf2b0da066a58472d54682c6d4f0452dfe7ae2f3a76a42ea"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49626096ddd72dcc1654aadd84b103577d8424f26524a48d199847b5d55612d0"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceaa26bef8fcb17eb59d92a7481c2d15d20211e217772fb43c08c859b01afc6a"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c014c371391f28f8cd27d73ea59f42b30772cd640b5a2538ad4f440fd9190b"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:46c32cd605673606b9388a313b0050ee7877a0640d7561eea243ace4fa2cc5a6"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:772b22c4ff791fe5816a7c2a1c9fcba83f9ab9bea138eb44d4d70f34676232b4"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:183ad611a2d70b5a3f5f7aadef0fcef604ea33dcf508228765fd4ddac2c7321d"}, + {file = "xattr-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8068df3ebdfa9411e58d5ae4a05d807ec5994645bb01af66ec9f6da718b65c5b"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bc40570155beb85e963ae45300a530223d9822edfdf09991b880e69625ba38a"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:436e1aaf23c07e15bed63115f1712d2097e207214fc6bcde147c1efede37e2c5"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7298455ccf3a922d403339781b10299b858bb5ec76435445f2da46fb768e31a5"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:986c2305c6c1a08f78611eb38ef9f1f47682774ce954efb5a4f3715e8da00d5f"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5dc6099e76e33fa3082a905fe59df766b196534c705cf7a2e3ad9bed2b8a180e"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:042ad818cda6013162c0bfd3816f6b74b7700e73c908cde6768da824686885f8"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d4c306828a45b41b76ca17adc26ac3dc00a80e01a5ba85d71df2a3e948828f2"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a606280b0c9071ef52572434ecd3648407b20df3d27af02c6592e84486b05894"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5b49d591cf34cda2079fd7a5cb2a7a1519f54dc2e62abe3e0720036f6ed41a85"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8705ac6791426559c1a5c2b88bb2f0e83dc5616a09b4500899bfff6a929302"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5ea974930e876bc5c146f54ac0f85bb39b7b5de2b6fc63f90364712ae368ebe"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f55a2dd73a12a1ae5113c5d9cd4b4ab6bf7950f4d76d0a1a0c0c4264d50da61d"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:475c38da0d3614cc5564467c4efece1e38bd0705a4dbecf8deeb0564a86fb010"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:925284a4a28e369459b2b7481ea22840eed3e0573a4a4c06b6b0614ecd27d0a7"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa32f1b45fed9122bed911de0fcc654da349e1f04fa4a9c8ef9b53e1cc98b91e"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5d3d0e728bace64b74c475eb4da6148cd172b2d23021a1dcd055d92f17619ac"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8faaacf311e2b5cc67c030c999167a78a9906073e6abf08eaa8cf05b0416515c"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc6b8d5ca452674e1a96e246a3d2db5f477aecbc7c945c73f890f56323e75203"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3725746a6502f40f72ef27e0c7bfc31052a239503ff3eefa807d6b02a249be22"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789bd406d1aad6735e97b20c6d6a1701e1c0661136be9be862e6a04564da771f"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a7a807ab538210ff8532220d8fc5e2d51c212681f63dbd4e7ede32543b070f"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e5825b5fc99ecdd493b0cc09ec35391e7a451394fdf623a88b24726011c950d"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80638d1ce7189dc52f26c234cee3522f060fadab6a8bc3562fe0ddcbe11ba5a4"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ff0dbe4a6ce2ce065c6de08f415bcb270ecfd7bf1655a633ddeac695ce8b250"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5267e5f9435c840d2674194150b511bef929fa7d3bc942a4a75b9eddef18d8d8"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b27dfc13b193cb290d5d9e62f806bb9a99b00cd73bb6370d556116ad7bb5dc12"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:636ebdde0277bce4d12d2ef2550885804834418fee0eb456b69be928e604ecc4"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d60c27922ec80310b45574351f71e0dd3a139c5295e8f8b19d19c0010196544f"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b34df5aad035d0343bd740a95ca30db99b776e2630dca9cc1ba8e682c9cc25ea"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24a7c04ff666d0fe905dfee0a84bc899d624aeb6dccd1ea86b5c347f15c20c1"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3878e1aff8eca64badad8f6d896cb98c52984b1e9cd9668a3ab70294d1ef92d"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4abef557028c551d59cf2fb3bf63f2a0c89f00d77e54c1c15282ecdd56943496"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0e14bd5965d3db173d6983abdc1241c22219385c22df8b0eb8f1846c15ce1fee"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9be588a4b6043b03777d50654c6079af3da60cc37527dbb80d36ec98842b1e"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bc4ae264aa679aacf964abf3ea88e147eb4a22aea6af8c6d03ebdebd64cfd6"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827b5a97673b9997067fde383a7f7dc67342403093b94ea3c24ae0f4f1fec649"}, + {file = "xattr-0.10.1.tar.gz", hash = "sha256:c12e7d81ffaa0605b3ac8c22c2994a8e18a9cf1c59287a1b7722a2289c952ec5"}, +] + +[package.dependencies] +cffi = ">=1.0" [[package]] name = "yapf" @@ -903,491 +1969,28 @@ description = "A formatter for Python code." category = "main" optional = false python-versions = "*" +files = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] [[package]] name = "zipp" -version = "3.8.1" +version = "3.11.0" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, + {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "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)"] [metadata] -lock-version = "1.1" -python-versions = ">=3.7,<3.11" -content-hash = "4d869d2fe1546b198d52df841cf2a30fb6bf57df73ad7355df5beff6d306c0a4" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] -attrs = [ - {file = "attrs-21.4.0-py2.py3-none-any.whl", hash = "sha256:2d27e3784d7a565d36ab851fe94887c5eccd6a463168875832a1be79c82828b4"}, - {file = "attrs-21.4.0.tar.gz", hash = "sha256:626ba8234211db98e869df76230a137c4c40a12d72445c45d5f5b716f076e2fd"}, -] -babel = [ - {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, - {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, - {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, - {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, -] -bs4 = [ - {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, -] -cachecontrol = [ - {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, - {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, -] -cachy = [ - {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, - {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, -] -certifi = [ - {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, - {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, -] -cffi = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, - {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, -] -cleo = [ - {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, - {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, -] -clikit = [ - {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, - {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, -] -colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] -crashtest = [ - {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, - {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, -] -cryptography = [ - {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, - {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, - {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, - {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, - {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, - {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, - {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, - {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, - {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, - {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, - {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, - {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, -] -distlib = [ - {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, - {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] -filelock = [ - {file = "filelock-3.7.1-py3-none-any.whl", hash = "sha256:37def7b658813cda163b56fc564cdc75e86d338246458c4c28ae84cabefa2404"}, - {file = "filelock-3.7.1.tar.gz", hash = "sha256:3a0fd85166ad9dbab54c9aec96737b744106dc5f15c0b09a6744a445299fcf04"}, -] -html5lib = [ - {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, - {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -imagesize = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] -importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -jeepney = [ - {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, - {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -keyring = [ - {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, - {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, -] -lockfile = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] -mako = [ - {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -msgpack = [ - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, - {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, - {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, - {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, - {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, - {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, - {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, - {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, - {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, - {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, - {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, - {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, - {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, - {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, - {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, - {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, - {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, - {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, - {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, - {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, - {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, - {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, - {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, - {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, - {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, - {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, - {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, -] -origen = [] -origen-autoapi = [ - {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, - {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, -] -origen-metal = [] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -pastel = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pkginfo = [ - {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, - {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -poetry = [ - {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, - {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, -] -poetry-core = [ - {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, - {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycparser = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] -pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] -pylev = [ - {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, - {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyreadline3 = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -python-plugin = [] -pytz = [ - {file = "pytz-2022.1-py2.py3-none-any.whl", hash = "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c"}, - {file = "pytz-2022.1.tar.gz", hash = "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -recommonmark = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.2-py3-none-any.whl", hash = "sha256:755dc845b6ad76dcbcbc07ea3da75ae54bb1ea529eb72d15f83d26499a5df319"}, - {file = "SecretStorage-3.3.2.tar.gz", hash = "sha256:0a8eb9645b320881c222e827c26f4cfcf55363e8b374a021981ef886657a912f"}, -] -shellingham = [ - {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, - {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] -sphinx = [ - {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, - {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, -] -sphinxbootstrap4theme = [ - {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -termcolor = [ - {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.1-py3-none-any.whl", hash = "sha256:1c5bebdf19d5051e2e1de6cf70adfc5948d47221f097fcff7a3ffc91e953eaf5"}, - {file = "tomlkit-0.11.1.tar.gz", hash = "sha256:61901f81ff4017951119cd0d1ed9b7af31c821d6845c8c477587bbdcd5e5854e"}, -] -urllib3 = [ - {file = "urllib3-1.26.10-py2.py3-none-any.whl", hash = "sha256:8298d6d56d39be0e3bc13c1c97d133f9b45d797169a0e11cdd0e0489d786f7ec"}, - {file = "urllib3-1.26.10.tar.gz", hash = "sha256:879ba4d1e89654d9769ce13121e0f94310ea32e8d2f8cf587b77c08bbcdb30d6"}, -] -virtualenv = [ - {file = "virtualenv-20.15.1-py2.py3-none-any.whl", hash = "sha256:b30aefac647e86af6d82bfc944c556f8f1a9c90427b2fb4e3bfbf338cb82becf"}, - {file = "virtualenv-20.15.1.tar.gz", hash = "sha256:288171134a2ff3bfb1a2f54f119e77cd1b81c29fc1265a2356f3e8d14c7d58c4"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -yapf = [ - {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, - {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, -] -zipp = [ - {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, - {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, -] +lock-version = "2.0" +python-versions = ">=3.7.0,<3.13" +content-hash = "1bff1af9ab1d51fced868030f3c5390423dde811e48e184ff50aa5a636049601" diff --git a/test_apps/python_app/pyproject.toml b/test_apps/python_app/pyproject.toml index 3630595b..47da1f9a 100644 --- a/test_apps/python_app/pyproject.toml +++ b/test_apps/python_app/pyproject.toml @@ -5,14 +5,15 @@ description = "" authors = ["Origen-SDK"] [tool.poetry.dependencies] -python = ">=3.7,<3.11" -origen = "= 2.0.0.dev5" +python = ">=3.7.0,<3.13" +origen = { path = "../../python/origen", develop = true } +origen_metal = { path = "../../python/origen_metal", develop = true } python_plugin = { path = "../python_plugin", develop = true } +test_apps_shared_test_helpers = { path = "../test_apps_shared_test_helpers", develop = true } +python_plugin_no_cmds = { path = "../python_plugin_no_cmds", develop = true } [tool.poetry.dev-dependencies] -pytest = "^6.0" -origen = { path = "../../python/origen", develop = true } -origen_metal = { path = "../../python/origen_metal", develop = true } +pytest = ">= 6.0" [build-system] requires = ["poetry-core>=1.0.0"] @@ -25,4 +26,4 @@ addopts = "--strict-markers" markers = [ "online: marks tests as requiring an internet connection", "ldap: marks tests requiring/using the external ldap", -] +] \ No newline at end of file diff --git a/test_apps/python_app/targets/readme.md b/test_apps/python_app/targets/readme.md new file mode 100644 index 00000000..582d9bbb --- /dev/null +++ b/test_apps/python_app/targets/readme.md @@ -0,0 +1 @@ +Test targets for `python_app` \ No newline at end of file diff --git a/test_apps/python_app/templates/dut_info.txt.mako b/test_apps/python_app/templates/dut_info.txt.mako index 5284a037..9d896aee 100644 --- a/test_apps/python_app/templates/dut_info.txt.mako +++ b/test_apps/python_app/templates/dut_info.txt.mako @@ -1,3 +1,3 @@ -Hello from Origen version ${origen.version}! +Hello from Origen version ${origen.__version__}! Hello from template compiler "${test_renderer_name}"! The application name is "${origen.app.name}" \ No newline at end of file diff --git a/test_apps/python_app/tests/_shared/for_proc.py b/test_apps/python_app/tests/_shared/for_proc.py index 54091fc1..6f6e9270 100644 --- a/test_apps/python_app/tests/_shared/for_proc.py +++ b/test_apps/python_app/tests/_shared/for_proc.py @@ -3,10 +3,18 @@ def setenv(config_root, config_name=None, bypass_config_lookup=None, cd=None): if bypass_config_lookup: os.environ['origen_bypass_config_lookup'] = "1" if config_root is not None: - if config_name is None: - config_name = inspect.stack()[1].function - os.environ['origen_config_paths'] = str( - config_root.joinpath(f"{config_name}.toml").absolute()) + if isinstance(config_root, list): + os.environ['origen_config_paths'] = os.pathsep.join([str(c) for c in config_root]) + else: + if config_name is None: + config_name = inspect.stack()[1].function + if config_name: + os.environ['origen_config_paths'] = str(config_root.joinpath(f"{config_name}.toml").absolute()) + else: + if isinstance(config_root, pathlib.Path): + os.environ['origen_config_paths'] = str(config_root.absolute()) + else: + os.environ['origen_config_paths'] = config_root if cd: os.chdir(str(cd)) \ No newline at end of file diff --git a/test_apps/python_app/tests/app_invocation_test.py b/test_apps/python_app/tests/app_invocation_test.py new file mode 100644 index 00000000..b0d231d2 --- /dev/null +++ b/test_apps/python_app/tests/app_invocation_test.py @@ -0,0 +1,10 @@ +import origen, _origen + +def test_app_is_none(): + print(origen.app) + assert isinstance(origen.app, origen.application.Base) + +def test_is_app_present(): + assert origen.is_app_present is True + assert _origen.is_app_present() is True + assert origen.status["is_app_present"] is True \ No newline at end of file diff --git a/test_apps/python_app/tests/cli/core_cmds/app.py b/test_apps/python_app/tests/cli/core_cmds/app.py new file mode 100644 index 00000000..53abeb54 --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/app.py @@ -0,0 +1,16 @@ +from test_apps_shared_test_helpers.cli.auditors import CmdNamespaceAuditor +from ..shared import CLICommon +import pytest + +class T_App(CLICommon): + class TestAppCommands(CmdNamespaceAuditor, CLICommon): + nspace = CLICommon.app_cmds + nspace_help_offset = 3 + empty_nspace = CLICommon.empty_app + + def test_app_cmd_help_msg(self): + cmd = CLICommon.in_app_cmds.app + help = cmd.get_help_msg() + help.assert_cmd(cmd) + out = cmd.gen_error() + assert out == help.text \ No newline at end of file diff --git a/test_apps/python_app/tests/cli/core_cmds/aux_cmds.py b/test_apps/python_app/tests/cli/core_cmds/aux_cmds.py new file mode 100644 index 00000000..ab3d3c6b --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/aux_cmds.py @@ -0,0 +1,13 @@ +from test_apps_shared_test_helpers.cli.auditors import CmdNamespaceContainerAuditor +from ..shared import CLICommon + +class T_AuxCmds(CmdNamespaceContainerAuditor): + container = CmdNamespaceContainerAuditor.in_app_cmds.aux_cmds + container_help_offset = 2 + container_nspaces = [ + CmdNamespaceContainerAuditor.aux.ns.dummy_cmds, + CmdNamespaceContainerAuditor.aux.ns.empty_aux_ns, + ] + nspace = CmdNamespaceContainerAuditor.aux.ns.dummy_cmds + nspace_help_offset = 1 + empty_nspace = CmdNamespaceContainerAuditor.aux.ns.empty_aux_ns diff --git a/test_apps/python_app/tests/cli/core_cmds/env.py b/test_apps/python_app/tests/cli/core_cmds/env.py new file mode 100644 index 00000000..7f5545a9 --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/env.py @@ -0,0 +1,11 @@ +from ..shared import CLICommon + +class T_Env(CLICommon): + _cmd = CLICommon.in_app_cmds.env + + def test_help_msg(self, cmd, cached_help): + cached_help.assert_cmd(cmd) + + def test_help_msg_on_no_subcs(self, cmd, cached_help): + out = cmd.gen_error() + assert out == cached_help.text diff --git a/test_apps/python_app/tests/cli/core_cmds/generate.py b/test_apps/python_app/tests/cli/core_cmds/generate.py new file mode 100644 index 00000000..fc2b930f --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/generate.py @@ -0,0 +1,39 @@ +from ..shared import CLICommon +import re, origen +from pathlib import Path + +class T_Generate(CLICommon): + _cmd = CLICommon.in_app_cmds.generate + pat = "example/patterns/toggle.py" + toggle_out = Path("output/j750/toggle.atp") + custom_dir = CLICommon.tmp_dir() + toggle_out_custom = custom_dir.joinpath("j750/toggle.atp") + targets = ["eagle", "j750"] + + def setup_class(cls): + if cls.toggle_out.exists(): + cls.toggle_out.unlink() + if cls.toggle_out_custom.exists(): + cls.toggle_out_custom.unlink() + + def test_help_msg(self, cmd, cached_help): + cached_help.assert_cmd(cmd) + + def test_error_on_no_args(self, cmd): + out = cmd.gen_error() + exp = self.err_msgs.missing_required_arg(cmd.files) + assert exp in out + + def test_generate_pattern(self, cmd): + assert not self.toggle_out.exists() + out = cmd.run(self.pat, run_opts={"targets": self.targets}) + s = str(self.toggle_out).replace("\\", "\\\\") + assert re.match(rf"Created: {s} - .*New pattern", out) + assert self.toggle_out.exists() + + def test_output_dir(self, cmd): + assert not self.toggle_out_custom.exists() + out = cmd.run(self.pat, cmd.output_dir.sn_to_cli(), str(self.custom_dir), run_opts={"targets": self.targets}) + s = str(self.toggle_out_custom.relative_to(origen.app.root)).replace("\\", "\\\\") + assert re.match(rf"Created: {s} - .*New pattern", out) + assert self.toggle_out_custom.exists() diff --git a/test_apps/python_app/tests/cli/core_cmds/plugin.py b/test_apps/python_app/tests/cli/core_cmds/plugin.py new file mode 100644 index 00000000..3b3b6f42 --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/plugin.py @@ -0,0 +1,10 @@ +from test_apps_shared_test_helpers.cli.auditors import CmdNamespaceContainerAuditor +from ..shared import CLICommon + +class T_Plugin(CmdNamespaceContainerAuditor): + container = CLICommon.in_app_cmds.pl + container_help_offset = 0 + container_nspaces = CLICommon.loaded_plugins_alpha() + nspace = CmdNamespaceContainerAuditor.plugins.python_plugin + nspace_help_offset = 3 + empty_nspace = CmdNamespaceContainerAuditor.plugins.python_plugin_no_cmds diff --git a/test_apps/python_app/tests/cli/core_cmds/plugins.py b/test_apps/python_app/tests/cli/core_cmds/plugins.py new file mode 100644 index 00000000..2772976b --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/plugins.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli.auditors import PluginsCmdAudit +from ..shared import CLICommon + +class T_Plugins(PluginsCmdAudit): + loaded_plugins = CLICommon.loaded_plugins() + check_pl_list_order = False \ No newline at end of file diff --git a/test_apps/python_app/tests/cli/core_cmds/target.py b/test_apps/python_app/tests/cli/core_cmds/target.py new file mode 100644 index 00000000..2a5fba89 --- /dev/null +++ b/test_apps/python_app/tests/cli/core_cmds/target.py @@ -0,0 +1,325 @@ +import pytest, origen +from ..shared import CLICommon +from tests.shared import Targets +from tests.proc_funcs import target_proc_funcs +from origen.helpers.env import in_new_origen_proc + +class TargetCLI(CLICommon, Targets.TargetFixtures): + target_cmd = CLICommon.in_app_commands.target + + @classmethod + def clear_targets_cli(cls): + return cls.target_cmd.run("clear") + + @classmethod + def check_targets(cls, *targets, func_kwargs=None): + retn = in_new_origen_proc(func=target_proc_funcs.show_target_setup, func_kwargs=func_kwargs) + if len(targets) == 1 and targets[0] is None: + targets = [] + assert retn['targets'] == [t.fp for t in targets] + + @pytest.fixture + def set_eagle(self, eagle): + # Add an initial target + out = self.target_cmd.set.run(eagle.name) + self.assert_out(out, eagle) + self.check_targets(eagle) + + @classmethod + def assert_out(cls, out, *targets, full_paths=False): + t = out.split("The targets currently enabled are:\n")[1].split("\n") + t = t[:t.index('')] + if len(targets) == 1 and targets[0] is None: + targets = [] + else: + if full_paths: + targets = [t.fp for t in targets] + else: + targets = [t.rp for t in targets] + assert targets == t + + # Unknown target name + utn = "unknown" + unknown_err_msg = ("\n").join([ + f"No matching target '{utn}' found, here are the available targets:", + *[f" {t}" for t in CLICommon.targets.all_rp], + ]) + + no_set_or_default_targets_msg = "No targets have been enabled and this workspace does not enable any default targets" + all_targets_removed_msg = "All targets were removed. Resetting to the default target." + + empty_default_env = {"origen_app_config_paths": str(CLICommon.to_config_path("target/empty_default_targets.toml"))} + empty_default_run_opts = {"with_env": empty_default_env} + bad_default_run_opts = {"with_env": {"origen_app_config_paths": str(CLICommon.to_config_path("target/bad_default_targets.toml"))}} + + @classmethod + def duplicate_err_msg(cls, t): + return f"Target '{t.name}' appears multiple times in the TARGETS list ({t.fp})" + + @classmethod + def rm_non_active_target_err_msg(cls, t): + return f"Tried to remove non-activated target '{t.name}' ({t.fp})" + + @pytest.fixture + def clear_targets(self): + self.clear_targets_cli() + +class T_Target(TargetCLI): + cmd = TargetCLI.target_cmd + + @classmethod + def setup_class(cls): + cls.clear_targets_cli() + + @pytest.mark.parametrize("cmd", [cmd, *cmd.subcmds.values()], ids=[cmd.name, *cmd.subcmds.keys()]) + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_summary(cmd.help) + help.assert_args(cmd.args) + if not cmd.name == "clear": + help.assert_opts(cmd.full_paths, "h", "v", "vk") + else: + help.assert_bare_opts() + if cmd.name == "target": + help.assert_subcmds(cmd.subcmds, help=3) + else: + help.assert_subcmds(None) + help.assert_not_extendable() + + def test_adding_targets(self, clear_targets, eagle, uflex, smt7, smt8): + add = self.cmd.add + out = add.run(eagle.name) + self.assert_out(out, eagle) + self.check_targets(eagle) + + out = add.run(uflex.name, add.full_paths) + self.assert_out(out, eagle, uflex, full_paths=True) + self.check_targets(eagle, uflex) + + out = add.run(smt7.name, smt8.name) + self.assert_out(out, eagle, uflex, smt7, smt8) + self.check_targets(eagle, uflex, smt7, smt8) + + def test_error_adding_unknown_targets(self, set_eagle, eagle, j750, uflex): + add = self.cmd.add + + r = add.gen_error("unknown", return_full=True) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.unknown_err_msg in r["stdout"] + + # Targets should remain the same + self.check_targets(eagle) + + # Try with some valid, some unknown + r = add.gen_error(j750.name, "unknown", uflex.name, return_full=True) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.unknown_err_msg in r["stdout"] + + # Targets should remain the same + self.check_targets(eagle) + + def test_adding_duplicate_target(self, set_eagle, eagle, j750, falcon): + r = self.cmd.add.gen_error(j750.name, falcon.name, j750.name, return_full=True) + self.check_targets(eagle) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.duplicate_err_msg(j750) in r["stdout"] + + def test_adding_already_added_targets(self, set_eagle, eagle, j750): + add = self.cmd.add + self.check_targets(eagle) + + out = add.run(eagle.name) + self.assert_out(out, eagle) + self.check_targets(eagle) + + out = add.run(j750.name) + self.assert_out(out, eagle, j750) + self.check_targets(eagle, j750) + + # Re-adding target shifts its position + out = add.run(eagle.name) + self.assert_out(out, j750, eagle) + self.check_targets(j750, eagle) + + def test_setting_targets(self, clear_targets, eagle, falcon, j750, smt7, hawk): + set = self.cmd.set + out = set.run(eagle.name) + self.assert_out(out, eagle) + self.check_targets(eagle) + + out = set.run(falcon.name, j750.name, smt7.name) + self.assert_out(out, falcon, j750, smt7) + self.check_targets(falcon, j750, smt7) + + out = set.run(hawk.name, set.full_paths) + self.assert_out(out, hawk, full_paths=True) + self.check_targets(hawk) + + def test_error_setting_unknown_targets(self, set_eagle, eagle, j750, uflex): + set = self.cmd.set + r = set.gen_error("unknown", return_full=True) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.unknown_err_msg in r["stdout"] + + # Targets should remain the same + self.check_targets(eagle) + + # Try with some valid, some unknown + r = set.gen_error(j750.name, "unknown", uflex.name, return_full=True) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.unknown_err_msg in r["stdout"] + + # Targets should remain the same + self.check_targets(eagle) + + def test_setting_duplicate_targets(self, set_eagle, eagle, j750, falcon): + r = self.cmd.set.gen_error(j750.name, falcon.name, j750.name, return_full=True) + self.check_targets(eagle) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.duplicate_err_msg(j750) in r["stdout"] + + def test_removing_targets(self, eagle, uflex, j750, smt7, smt8): + self.cmd.set.run(eagle.name, uflex.name, j750.name, smt7.name, smt8.name) + + rm = self.cmd.remove + out = rm.run(eagle.name, smt7.name) + self.assert_out(out, uflex, j750, smt8) + self.check_targets(uflex, j750, smt8) + + out = rm.run(smt8.name, rm.full_paths) + self.assert_out(out, uflex, j750, full_paths=True) + self.check_targets(uflex, j750) + + def test_error_removing_unset_or_unknown_targets(self, set_eagle, eagle, j750): + rm = self.cmd.remove + + r = rm.gen_error(j750.name, return_full=True) + self.check_targets(eagle) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.rm_non_active_target_err_msg(j750) in r["stdout"] + + r = rm.gen_error(eagle.name, j750.name, return_full=True) + self.check_targets(eagle) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.rm_non_active_target_err_msg(j750) in r["stdout"] + + def test_removing_duplicate_targets(self, set_eagle, eagle): + r = self.cmd.remove.gen_error(eagle.name, eagle.name, return_full=True) + self.check_targets(eagle) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.duplicate_err_msg(eagle) in r["stdout"] + + def test_removing_all_targets_restores_default(self, set_eagle, eagle, falcon): + out = self.cmd.remove.run(eagle.name) + assert self.all_targets_removed_msg in out + self.assert_out(out, falcon) + self.check_targets(falcon) + + def test_restoring_default_targets(self, set_eagle, falcon): + out = self.cmd.default.run() + self.assert_out(out, falcon) + self.check_targets(falcon) + + def test_restoring_empty_default_targets(self, set_eagle): + out = self.cmd.default.run(with_env=self.empty_default_env) + self.assert_out(out, None) + self.check_targets(None, func_kwargs=self.empty_default_run_opts) + + def test_clearing_all_targets(self): + out = self.cmd.clear.run() + self.assert_out(out, None) + self.check_targets(None) + + def test_viewing_targets(self, set_eagle, eagle, j750): + v = self.cmd.view + out = v.run() + self.assert_out(out, eagle) + self.check_targets(eagle) + + self.cmd.add.run(j750.name) + out = v.run(v.full_paths) + self.assert_out(out, eagle, j750, full_paths=True) + self.check_targets(eagle, j750) + + self.cmd.clear.run() + out = v.run(v.full_paths) + self.assert_out(out, None, full_paths=True) + self.check_targets(None) + + def test_delimited_targets(self, eagle, j750, uflex, smt7, smt8): + out= self.cmd.set.run(','.join([eagle.name, uflex.name, j750.name]), smt7.name, smt8.name) + targets = [eagle, uflex, j750, smt7, smt8] + self.assert_out(out, *targets) + self.check_targets(*targets) + + out = self.cmd.remove.run(','.join([uflex.name, j750.name]), ','.join([smt7.name, smt8.name])) + self.assert_out(out, eagle) + self.check_targets(eagle) + + out = self.cmd.add.run(','.join([smt7.name, smt8.name]), ','.join([uflex.name, j750.name])) + targets = [eagle, smt7, smt8, uflex, j750] + self.assert_out(out, *targets) + self.check_targets(*targets) + + def test_base_cmd_acts_as_view(self, set_eagle, eagle, j750): + h = "Run with 'help' or '-h' to see available subcommands" + b = self.cmd + + out = b.run() + self.assert_out(out, eagle) + self.check_targets(eagle) + assert h in out + + self.cmd.add.run(j750.name) + out = b.run(b.full_paths) + self.assert_out(out, eagle, j750, full_paths=True) + self.check_targets(eagle, j750) + assert h in out + + self.cmd.clear.run() + out = b.run(b.full_paths) + self.assert_out(out, None, full_paths=True) + self.check_targets(None) + assert h in out + + def test_no_default_set(self, eagle): + e = self.bypass_origen_app_lookup_env + + out = self.cmd.view.run(with_env=e) + assert self.no_set_or_default_targets_msg in out + + self.cmd.set.run(eagle.name) + out = self.cmd.view.run() + self.assert_out(out, eagle) + + out = self.cmd.default.run(with_env=e) + assert self.no_set_or_default_targets_msg in out + self.check_targets(None, func_kwargs={"with_env": e}) + + def test_invalid_default_target(self, clear_targets, eagle, capfd): + r = self.cmd.default.gen_error(run_opts=self.bad_default_run_opts, return_full=True) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.unknown_err_msg in r["stdout"] + assert self.unknown_err_msg not in capfd.readouterr().out + in_new_origen_proc(func=target_proc_funcs.show_target_setup, func_kwargs=self.bad_default_run_opts, expect_fail=True) + assert self.unknown_err_msg in capfd.readouterr().out + + self.cmd.set.run(eagle.name) + r = self.cmd.default.gen_error(run_opts=self.bad_default_run_opts, return_full=True) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert self.unknown_err_msg in r["stdout"] + + out = self.cmd.view.run() + self.assert_out(out, eagle) + self.check_targets(eagle) diff --git a/test_apps/python_app/tests/cli/shared.py b/test_apps/python_app/tests/cli/shared.py new file mode 100644 index 00000000..70d7dc85 --- /dev/null +++ b/test_apps/python_app/tests/cli/shared.py @@ -0,0 +1,535 @@ +import pytest, pathlib, origen +from origen.helpers.regressions import cli + +from tests.shared import PythonAppCommon +from tests._shared import tmp_dir +from test_apps_shared_test_helpers.cli import CLIShared, CmdOpt, CmdArg, CmdExtOpt +from test_apps_shared_test_helpers.cli.cmd_models import SrcBase + +Cmd = CLIShared.Cmd + +class EmptyApp(SrcBase): + def __init__(self): + self.src_type = cli.SrcTypes.APP + self.name = "example" + self.app_cmds = CLIShared.in_app_cmds.app.commands.extend( + [], + with_env = {"origen_app_config_paths": str(PythonAppCommon.to_config_path("empty_app_cmds.toml"))}, + ) + +class CLICommon(CLIShared, PythonAppCommon): + class AppCmds(SrcBase): + def __init__(self): + self.src_type = cli.SrcTypes.APP + self.name = "example" + self.app_cmds = CLIShared.in_app_cmds.app.commands.extend([]) + self.app_cmds.replace_subcmds( + Cmd( + "arg_opt_warmup", + help = "Gross test command demonstrating args/opts from app commands", + args=[ + CmdArg("first", help="First Argument - Required", required=True), + CmdArg("second", help="Second Multi-Argument - Not Required", use_delimiter=True, multi=True), + ], + opts=[ + CmdOpt("flag_opt", sn="f", help="Flag opt"), + CmdOpt("single_opt", sn_aliases=["s"], takes_value=True, help="Single-value non-required opt"), + CmdOpt("multi_opt", sn_aliases=["m"], ln_aliases=["m_opt"], multi=True, help="Multi-value non-required opt"), + CmdOpt("hidden_flag_opt", hidden=True, ln="hidden", help="Hidden flag opt"), + ] + ), + Cmd( + "disabling_app_opts", + help="Test disabling standard app opts", + subcmds=[ + Cmd( + "disable_targets_opt", + help="Disable the targets and no-targets opt", + subcmds=[ + Cmd("disable_subc", help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ), + Cmd( + "disable_mode_opt", + help="Disable the mode opt", + subcmds=[ + Cmd("disable_subc",help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ), + Cmd( + "disable_app_opts", + help="Disable all app opts", + subcmds=[ + Cmd("disable_subc",help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ) + ] + ), + Cmd( + "examples", + help="Run diff-based regression tests of the pattern and program generator", + ), + Cmd( + "nested_app_cmds", + help="Nested app cmds", + subcmds=[ + Cmd( + "nested_l1", + help="Nested app cmds level 1", + subcmds=[ + Cmd( + "nested_l2_a", + help="Nested app cmds level 2 (A)", + subcmds=[ + Cmd( + "nested_l3_a", + help="Nested app cmds level 3 (A-A)" + ), + Cmd( + "nested_l3_b", + help="Nested app cmds level 3 (A-B)" + ), + ] + ), + Cmd( + "nested_l2_b", + help="Nested app cmds level 2 (B)", + subcmds=[ + Cmd( + "nested_l3_a", + help="Nested app cmds level 3 (B-A)" + ), + Cmd( + "nested_l3_b", + help="Nested app cmds level 3 (B-B)" + ), + ] + ) + ] + ) + ] + ), + Cmd( + "playground", + help="This is used to test Origen's app command definition and dispatch", + aliases=["y"], + ), + ) + self.intra_cmd_conflicts = CLIShared.app_sub_cmd( + "intra_cmd_conflicts", + help="Test intra app cmd conflicts", + with_env={"ORIGEN_APP_INTRA_CMD_CONFLICTS": "1"}, + **CLIShared.python_plugin.intra_cmd_conflicts_args_opts_subcs(), + ) + self.exts = { + "app.arg_opt_warmup": { + "exts": [ + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "pypl_single_opt", + help="Single opt from PYPL", + takes_value=True, + ), + CmdExtOpt( + "pypl_multi_opt", + help="Multi opt from PYPL", + ln_aliases=["PYPL"], + multi=True, + ), + CmdExtOpt( + "pypl_hidden", + help="Hidden opt from PYPL", + hidden=True, + sn="p", + ln="pypl_h_opt" + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "tas_single_opt", + help="Single opt from TAS", + ln="tas_sv", + takes_value=True, + ), + CmdExtOpt( + "tas_multi_opt", + help="Multi opt from TAS", + ln="tas_multi_opt", + ln_aliases=["tas_multi", "TAS"], + sn_aliases=["a"], + multi=True, + ), + CmdExtOpt( + "tas_hidden", + help="Hidden opt from TAS", + hidden=True, + ), + ), + *CmdExtOpt.from_src( + "python_app_exts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "ec_single_opt", + help="Single opt from EC", + takes_value=True, + ), + CmdExtOpt( + "ec_multi_opt", + help="Multi opt from EC", + ln="ec_multi_opt", + ln_aliases=["ec_multi", "EC"], + sn="e", + multi=True, + ), + CmdExtOpt( + "ec_hidden", + ln="ec_h_opt", + help="Hidden opt from EC", + hidden=True, + ), + ), + ], + "env": {"ORIGEN_APP_EXT_ARG_OPT_WARMUP": "1"}, + "cfg": CLIShared.aux.ns.python_app_aux_cmds.exts_cfg, + }, + "app.nested_app_cmds.nested_l1": { + "exts": [ + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "pypl_single_opt_shallow", + help="Single opt from PYPL", + sn="p", + takes_value=True, + ), + CmdExtOpt( + "pypl_flag_opt_shallow", + help="Flag opt from PYPL", + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "tas_multi_opt_shallow", + help="Multi opt from TAS", + ln_aliases=["tas_m_opt", "tas_shallow"], + multi=True, + ), + CmdExtOpt( + "tas_flag_opt_shallow", + help="Flag opt from TAS", + ln="tas_f", + sn="f" + ), + ), + *CmdExtOpt.from_src( + "python_app_exts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "ec_single_opt_shallow", + help="Single opt from EC", + takes_value=True, + ), + CmdExtOpt( + "ec_flag_opt_shallow", + help="Flag opt from EC", + ln="ec_f", + ), + ), + ], + "env": {"ORIGEN_APP_EXT_NESTED": "1"}, + "cfg": CLIShared.aux.ns.python_app_aux_cmds.exts_cfg, + }, + "app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a": { + "exts": [ + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "pypl_single_opt_deep", + help="Single opt from PYPL", + sn="q", + takes_value=True, + ), + CmdExtOpt( + "pypl_flag_opt_deep", + help="Flag opt from PYPL", + ln="py_f", + sn="f", + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "tas_multi_opt_deep", + help="Multi opt from TAS", + ln="tas_opt", + multi=True, + ), + CmdExtOpt( + "tas_flag_opt_deep", + help="Flag opt from TAS", + ) + ), + *CmdExtOpt.from_src( + "python_app_exts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "ec_single_opt_deep", + help="Single opt from EC", + ln="ec_opt", + ln_aliases=["ec_deep"], + takes_value=True, + ), + CmdExtOpt( + "ec_flag_opt_deep", + help="Flag opt from EC", + ln="ec_df", + sn="c" + ), + ), + ], + "env": {"ORIGEN_APP_EXT_NESTED": "1"}, + "cfg": CLIShared.aux.ns.python_app_aux_cmds.exts_cfg, + }, + } + self.conflict_exts = { + "app.arg_opt_warmup": { + "exts": [ + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "flag_opt", + help="Flag opt from Python Plugin", + ), + CmdExtOpt( + "conflicts_from_python_plugin", + help="Some conflicts from Python Plugin", + ln_aliases=["python_plugin_conflicts"], + sn_aliases=["a"], + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "flag_opt", + help="Conflict with flag opt from TAS", + access_with_full_name=True, + ), + CmdExtOpt( + "conflicts_from_test_apps_shared", + help="Some conflicts from Test Apps Shared PL", + ln="TAS", + sn_aliases=["b"], + ), + ), + *CmdExtOpt.from_src( + "ext_conflicts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "flag_opt", + help="Conflict with flag opt from ext_conflicts AUX", + access_with_full_name=True, + ), + CmdExtOpt( + "conflicts_from_ext_conflicts", + help="Some conflicts from ext_conflicts AUX", + ln_aliases=["EX_Conflicts"], + sn_aliases=["c"], + ), + ), + ], + "env": {"ORIGEN_APP_EXT_CONFLICTS_ARG_OPT_WARMUP": "1"}, + "cfg": CLIShared.aux.aux_cmds_dir.joinpath("ext_conflicts_cfg.toml"), + }, + "python_plugin.plugin_test_args": { + "exts": [ + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "tas_opt", + help="Opt from TAS", + ln="tas", + sn="z", + ln_aliases=["t_opt"], + sn_aliases=["c"], + ), + CmdExtOpt( + "tas_iln", + help="ILN from TAS", + ), + ), + *CmdExtOpt.from_src( + "ext_conflicts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "ec_opt", + help="Opt from EC", + ln="ec", + sn="e", + ln_aliases=["e_opt"], + sn_aliases=["d"], + ), + CmdExtOpt( + "tas_iln", + help="More conflicts", + access_with_full_name=True, + ), + ), + *CmdExtOpt.from_src( + "example", + cli.cmd.SrcTypes.APP, + CmdExtOpt( + "app_opt", + help="Conflict with cmd/aux/plugin opts", + ln="app", + ln_aliases=["app_opt", "app_flag"], + sn_aliases=["g"], + ), + CmdExtOpt( + "tas_iln", + help="Conflict iln from App", + access_with_full_name=True, + ), + ), + ], + "env": {"ORIGEN_APP_PL_CMD_CONFLICTS": "1"}, + "cfg": CLIShared.aux.aux_cmds_dir.joinpath("ext_conflicts_cfg.toml"), + } + } + + @property + def arg_opt_warmup(self): + return self.warmup_cmd + + class CmdTOMLs(SrcBase): + root = origen.app.root.joinpath("config/cmd_tomls") + invalid_toml = root.joinpath("invalid.toml") + invalid2_toml = root.joinpath("invalid2.toml") + simple_toml = root.joinpath("simple.toml") + simple2_toml = root.joinpath("simple2.toml") + + def __init__(self): + self.src_type = cli.SrcTypes.APP + self.name = "example" + self.app_cmds = CLIShared.in_app_cmds.app.commands.extend([]) + self.app_cmds.replace_subcmds( + Cmd( + "simple", + help = "Simple App CMD", + ), + Cmd( + "simple_with_arg", + help = "Simple App CMD with Arg", + args=[ + CmdArg("arg", help="Simple arg"), + ] + ), + Cmd( + "simple2", + help = "Simple App CMD - 2", + ), + Cmd( + "simple2_with_arg", + help = "Simple App CMD with Arg - 2", + args=[ + CmdArg("arg", help="Simple arg"), + ] + ) + ) + + app_cmds = AppCmds() + app_commands = app_cmds + empty_app = EmptyApp() + cmd_tomls = CmdTOMLs() + + class CmdShortcuts(): + @property + def app(self): + return { + 'arg_opt_warmup': 'arg_opt_warmup', + "examples": "examples", + "playground": "playground", + "y": "playground", + "nested_app_cmds": "nested_app_cmds", + "disabling_app_opts": "disabling_app_opts", + } + + @property + def pl(self): + return { + "plugin_says_hi": ("python_plugin", "plugin_says_hi"), + "plugin_test_args": ("python_plugin", "plugin_test_args"), + "plugin_test_ext_stacking": ("python_plugin", "plugin_test_ext_stacking"), + "echo": ("python_plugin", "echo"), + "do_actions": ("python_plugin", "do_actions"), + "disabling_app_opts_from_pl": ("python_plugin", "disabling_app_opts_from_pl"), + } + + @property + def aux(self): + return { + "dummy_cmd": ("dummy_cmds", "dummy_cmd") + } + + @property + def simple_cmd_tomls(self): + return { + "simple": "simple", + "simple_with_arg": "simple_with_arg", + "simple2": "simple2", + "simple2_with_arg": "simple2_with_arg", + } + cmd_shortcuts = CmdShortcuts() + + _no_config_run_opts = { + "with_configs": CLIShared.configs.suppress_plugin_collecting_config, + "bypass_config_lookup": True + } + + tmp_dir = tmp_dir + + @classmethod + def loaded_plugins_alpha(cls): + return [ + cls.plugins.pl_ext_cmds, + cls.plugins.py_pl, + cls.plugins.python_plugin_no_cmds, + cls.plugins.tas, + ] + + @classmethod + def loaded_plugins(cls): + return [ + cls.plugins.python_plugin_no_cmds, + cls.plugins.pl_ext_cmds, + cls.plugins.tas, + cls.plugins.py_pl, + ] + + @pytest.fixture + def no_config_run_opts(self): + return self._no_config_run_opts + + @classmethod + def no_config_run_opts_plus_config(cls, add_configs): + return { + "with_configs": [ + CLIShared.configs.suppress_plugin_collecting_config, + *([add_configs] if isinstance(add_configs, str) or isinstance(add_configs, pathlib.Path) else add_configs) + ], + "bypass_config_lookup": True + } \ No newline at end of file diff --git a/test_apps/python_app/tests/cli/tests__app_cmd_building.py b/test_apps/python_app/tests/cli/tests__app_cmd_building.py new file mode 100644 index 00000000..4e9c388e --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__app_cmd_building.py @@ -0,0 +1,149 @@ +import pytest, origen +from .shared import CLICommon, Cmd, CmdOpt, CmdArg + +class T_AppCmdBuilding(CLICommon): + warmup_cmd = CLICommon.app_cmds.arg_opt_warmup + nested_cmds = CLICommon.app_cmds.nested_app_cmds + + def test_app_command_args_and_opts(self): + cmd = self.warmup_cmd + help = cmd.get_help_msg() + help.assert_args(cmd.first, cmd.second) + help.assert_opts( + cmd.flag_opt, + 'h', 'm', + cmd.multi_opt, + 'nt', + cmd.single_opt, + 't', 'v', 'vk' + ) + help.assert_subcmds(None) + + rv = "req_arg" + m0 = "m0" + m12 = "m1,m2" + mo0 = "mo0" + mo12 = "m01,m02" + mo4 = "mo4" + sv = "s_opt" + + out = cmd.run( + rv, + m0, m12, + cmd.flag_opt.sn_to_cli(), + cmd.single_opt.sna_to_cli(), sv, + cmd.multi_opt.sna_to_cli(), mo0, mo12, + cmd.multi_opt.ln_to_cli(), mo4, + cmd.hidden_flag_opt.ln_to_cli(), + ) + cmd.assert_args( + out, + (cmd.first, rv), + (cmd.second, [m0, m12]), + (cmd.flag_opt, 1), + (cmd.single_opt, sv), + (cmd.multi_opt, [mo0, mo12, mo4]), + (cmd.hidden_flag_opt, 1) + ) + + out = cmd.run( + rv, + cmd.flag_opt.sn_to_cli(), cmd.flag_opt.sn_to_cli(), + cmd.multi_opt.sna_to_cli(), mo0, mo12, + ) + cmd.assert_args( + out, + (cmd.first, rv), + (cmd.flag_opt, 2), + (cmd.multi_opt, [mo0, mo12]) + ) + + out = cmd.gen_error() + assert self.err_msgs.missing_required_arg(cmd.first) in out + + nested_cmd_testcases = [ + (nested_cmds, 0, None), + (nested_cmds.nested_l1, 1, None), + (nested_cmds.nested_l1.nested_l2_a, 2, 'A'), + (nested_cmds.nested_l1.nested_l2_a.nested_l3_a, 3, 'A-A'), + (nested_cmds.nested_l1.nested_l2_a.nested_l3_b, 3, 'A-B'), + (nested_cmds.nested_l1.nested_l2_b, 2, 'B'), + (nested_cmds.nested_l1.nested_l2_b.nested_l3_a, 3, 'B-A'), + (nested_cmds.nested_l1.nested_l2_b.nested_l3_b, 3, 'B-B'), + ] + nested_cmd_ids = [f"{cmd[0].name} {'Base' if cmd[2] is None else cmd[2]}" for cmd in nested_cmd_testcases] + @pytest.mark.parametrize("cmd,lvl,sublvl", nested_cmd_testcases, ids=nested_cmd_ids) + def test_nested_cmds(self, cmd, lvl, sublvl): + help = cmd.get_help_msg() + subcs = list(cmd.subcmds.values()) + if len(subcs) == 0: + help.assert_subcmds(None) + else: + subcs.insert(0, "help") + help.assert_subcmds(*subcs) + + out = cmd.run() + assert f"Hi from 'nested_app_cmds' level {lvl}{ ' (' + sublvl + ')' if sublvl else ''}!" in out + + def test_enumerated_tomls(self): + enum_envs = {"with_env": {"ORIGEN_APP_COMMANDS": ",".join([ + str(self.cmd_tomls.simple_toml.relative_to(origen.app.config_dir)), + str(self.cmd_tomls.simple2_toml), + ])}} + + help = self.in_app_cmds.origen.get_help_msg(run_opts=enum_envs) + assert help.app_cmd_shortcuts == self.cmd_shortcuts.simple_cmd_tomls + + help = self.in_app_cmds.app.commands.get_help_msg(run_opts=enum_envs) + help.assert_subcmds( + "help", + self.cmd_tomls.simple, + self.cmd_tomls.simple2, + self.cmd_tomls.simple2_with_arg, + self.cmd_tomls.simple_with_arg, + ) + + cmd = self.cmd_tomls.simple_with_arg + out = cmd.run("hi", run_opts=enum_envs) + cmd.assert_args( + out, + (cmd.arg, "hi"), + ) + + cmd = self.cmd_tomls.simple2_with_arg + out = cmd.run("hi", run_opts=enum_envs) + cmd.assert_args( + out, + (cmd.arg, "hi"), + ) + + class TestErrorCases(CLICommon): + def test_invalid_cmd_toml(self): + missing = "missing_cmd_toml.toml" + env = {"with_env": {"ORIGEN_APP_COMMANDS": ",".join([ + str(self.cmd_tomls.invalid_toml.relative_to(origen.app.config_dir)), + str(self.cmd_tomls.simple_toml.relative_to(origen.app.config_dir)), + str(self.cmd_tomls.invalid2_toml), + str(f"cmd_tomls/{missing}"), # Since not absolute, should compute relative to config/ directory, but not from cmd_tomls + str(self.cmd_tomls.simple2_toml), + ])}} + help = self.in_app_cmds.origen.get_help_msg(run_opts=env) + assert help.app_cmd_shortcuts == self.cmd_shortcuts.simple_cmd_tomls + assert help.pl_cmd_shortcuts == self.cmd_shortcuts.pl + assert help.aux_cmd_shortcuts == self.cmd_shortcuts.aux + errs = help.logged_errors + assert f"Malformed Commands TOML '{self.cmd_tomls.invalid2_toml}'" in errs.pop() + assert f"Malformed Commands TOML '{self.cmd_tomls.invalid_toml}'" in errs.pop() + assert f"Can not locate app commands file '{self.cmd_tomls.root.joinpath(missing)}'" in errs.pop() + assert len(errs) == 0 + + def test_missing_app_cmd_implementation(self): + env = {"with_env": {"ORIGEN_APP_COMMANDS": ",".join([ + str(self.cmd_tomls.simple_toml.relative_to(origen.app.config_dir)), + ])}} + out = self.cmd_tomls.simple.gen_error(run_opts=env, return_full=True) + errs = self.extract_logged_errors(out["stdout"]) + assert " simple.py" == errs.pop() + assert f" From root '{origen.app.commands_dir}', searched:" == errs.pop() + assert "Could not find implementation for app command 'simple'" == errs.pop() + assert len(errs) == 0 diff --git a/test_apps/python_app/tests/cli/tests__cmd_exts_from_app.py b/test_apps/python_app/tests/cli/tests__cmd_exts_from_app.py new file mode 100644 index 00000000..3b4809e8 --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__cmd_exts_from_app.py @@ -0,0 +1,451 @@ +import pytest, os, origen +from origen.helpers.regressions.cli.command import SrcTypes +from .shared import CLICommon, CmdExtOpt + +class T_ExtendingFromAppCmds(CLICommon): + extend_core_cmds_env = {"ORIGEN_APP_EXTEND_CORE_CMDS": "1"} + extend_pl_test_ext_stacking = {"ORIGEN_APP_EXT_PL_TEST_EXT_STACKING": "1"} + exts = CmdExtOpt.from_src( + "example", + SrcTypes.APP, + CmdExtOpt( + "generic_app_ext_action", + help="Action from the app", + multi=True, + ), + CmdExtOpt( + "generic_app_ext_flag", + help="Flag ext from the app", + ), + ) + core_cmd = origen.helpers.regressions.cli.CLI.in_app_cmds.eval.extend( + exts, + with_env=extend_core_cmds_env, + from_configs=CLICommon.configs.suppress_plugin_collecting_config, + ) + stacked_core_cmd = origen.helpers.regressions.cli.CLI.in_app_cmds.eval.extend( + [ + *CLICommon.exts.exts["generic_core_ext"]["exts"], + *exts + ], + from_configs=[CLICommon.exts.core_cmd_exts_cfg], + with_env=extend_core_cmds_env, + ) + py_pl_cmd = CLICommon.python_plugin.plugin_test_ext_stacking.extend( + [ + *CLICommon.exts.exts["plugin.python_plugin.plugin_test_ext_stacking"]["exts"][1:3], + *CLICommon.exts.test_apps_shared_generic_exts, + *exts + ], + from_configs=[CLICommon.exts.pl_ext_stacking_from_aux_cfg], + with_env=extend_pl_test_ext_stacking, + ) + py_pl_subc = CLICommon.python_plugin.plugin_test_ext_stacking.subc.extend( + [ + *CLICommon.exts.exts["plugin.python_plugin.plugin_test_ext_stacking.subc"]["exts"][1:3], + *CLICommon.exts.test_apps_shared_generic_exts, + *exts + ], + from_configs=[CLICommon.exts.pl_ext_stacking_from_aux_cfg], + with_env=extend_pl_test_ext_stacking, + ) + aux_cmd = CLICommon.aux.ns.dummy_cmds.dummy_cmd.extend( + [ + *CLICommon.exts.exts["aux.dummy_cmds.dummy_cmd"]["exts"][2:6], + *exts + ], + from_configs=[CLICommon.exts.pl_ext_stacking_from_aux_cfg], + with_env=CLICommon.exts.exts["aux.dummy_cmds.dummy_cmd"]["env"] + ) + aux_subc = CLICommon.aux.ns.dummy_cmds.dummy_cmd.subc.extend( + [ + *CLICommon.exts.exts["aux.dummy_cmds.dummy_cmd.subc"]["exts"][2:6], + *exts + ], + from_configs=[CLICommon.exts.pl_ext_stacking_from_aux_cfg], + with_env=CLICommon.exts.exts["aux.dummy_cmds.dummy_cmd"]["env"] + ) + na = "no_action" + + missing_ext_impl_cmd = CLICommon.python_plugin.plugin_says_hi.extend( + CmdExtOpt.from_src( + "example", + SrcTypes.APP, + CmdExtOpt( + "app_ext_missing_impl", + help="App extension missing the implementation", + ), + ), + with_env={"ORIGEN_APP_PL_CMD_MISSING_EXT_IMPL": "1"} + ) + + def test_extending_global_cmds(self): + cmd = self.core_cmd + help = cmd.get_help_msg() + help.assert_args(cmd.code) + opts = list(self.in_app_cmds.standard_opts()) + opts.insert(3, cmd.scripts) + help.assert_opts( + cmd.generic_app_ext_action, + cmd.generic_app_ext_flag, + *opts + ) + + assert help.aux_exts == None + assert help.pl_exts == None + assert help.app_exts == True + + d = cmd.demos["minimal"] + out = d.run() + cmd.generic_app_ext_flag.assert_present(None, out) + d.assert_present(out) + + out = d.run(add_args=[cmd.generic_app_ext_action.ln_to_cli(), self.na, cmd.generic_app_ext_flag.ln_to_cli()]) + cmd.generic_app_ext_action.assert_present([self.na], out) + cmd.generic_app_ext_flag.assert_present(1, out) + d.assert_present(out) + + def test_stacking_pl_aux_and_app_ext(self): + cmd = self.stacked_core_cmd + help = cmd.get_help_msg() + help.assert_args(cmd.code) + help.assert_opts( + cmd.core_cmd_exts_generic_core_ext, + cmd.generic_app_ext_action, + cmd.generic_app_ext_flag, + "help", "mode", "no_targets", + cmd.pl_ext_cmds_generic_ext, + cmd.scripts, + "targets", "v", 'vk' + ) + assert help.aux_exts == ['core_cmd_exts'] + assert help.pl_exts == ['pl_ext_cmds'] + assert help.app_exts == True + + d = cmd.demos["minimal"] + out = d.run(add_args=[ + cmd.generic_app_ext_action.ln_to_cli(), self.na, + cmd.generic_app_ext_flag.ln_to_cli(), + cmd.pl_ext_cmds_generic_ext.ln_to_cli(), + cmd.core_cmd_exts_generic_core_ext.ln_to_cli(), + ]) + cmd.generic_app_ext_action.assert_present([self.na], out) + cmd.generic_app_ext_flag.assert_present(1, out) + cmd.pl_ext_cmds_generic_ext.assert_present(1, out) + cmd.core_cmd_exts_generic_core_ext.assert_present(1, out) + d.assert_present(out) + + def test_extending_pl_cmd(self): + cmd = self.py_pl_cmd + help = cmd.get_help_msg() + help.assert_args(cmd.single_arg) + help.assert_opts( + cmd.flag_opt, + cmd.generic_app_ext_action, + cmd.generic_app_ext_flag, + "help", "m", "nt", + cmd.pl_ext_stacking_from_aux_action, + cmd.pl_ext_stacking_from_aux_flag, + "t", + cmd.test_apps_shared_ext_action, + cmd.test_apps_shared_ext_flag, + "v", 'vk', + ) + help.assert_subcmds("help", cmd.subc) + + assert help.aux_exts == ['pl_ext_stacking_from_aux'] + assert help.pl_exts == ['test_apps_shared_test_helpers'] + assert help.app_exts == True + + out = cmd.run() + cmd.assert_args( + out, + (cmd.single_arg, None), + (cmd.pl_ext_stacking_from_aux_action, None), + (cmd.test_apps_shared_ext_action, None), + (cmd.generic_app_ext_flag, None), + ) + + sa_v = "single_arg_val" + out = cmd.run(sa_v, cmd.generic_app_ext_action.ln_to_cli(), self.na, cmd.generic_app_ext_flag.ln_to_cli()) + cmd.assert_args( + out, + (cmd.single_arg, sa_v), + (cmd.pl_ext_stacking_from_aux_action, None), + (cmd.test_apps_shared_ext_action, None), + (cmd.generic_app_ext_action, [self.na]), + (cmd.generic_app_ext_flag, 1), + ) + + def test_extending_pl_subc(self): + cmd = self.py_pl_subc + help = cmd.get_help_msg() + help.assert_args(cmd.single_arg) + help.assert_opts( + cmd.flag_opt, + cmd.generic_app_ext_action, + cmd.generic_app_ext_flag, + "help", "m", "nt", + cmd.pl_ext_stacking_from_aux_action_subc, + cmd.pl_ext_stacking_from_aux_flag_subc, + "t", + cmd.test_apps_shared_ext_action, + cmd.test_apps_shared_ext_flag, + "v", 'vk', + ) + help.assert_subcmds(None) + + out = cmd.run() + cmd.assert_args( + out, + (cmd.single_arg, None), + (cmd.pl_ext_stacking_from_aux_action_subc, None), + (cmd.test_apps_shared_ext_action, None), + (cmd.generic_app_ext_action, None), + (cmd.generic_app_ext_flag, None), + ) + + sa_v = "single_arg_val" + out = cmd.run(sa_v, cmd.generic_app_ext_action.ln_to_cli(), self.na, cmd.generic_app_ext_flag.ln_to_cli()) + cmd.assert_args( + out, + (cmd.single_arg, sa_v), + (cmd.pl_ext_stacking_from_aux_action_subc, None), + (cmd.test_apps_shared_ext_action, None), + (cmd.generic_app_ext_action, [self.na]), + (cmd.generic_app_ext_flag, 1), + ) + + def test_extending_aux_cmd(self): + cmd = self.aux_cmd + help = cmd.get_help_msg() + help.assert_args(cmd.action_arg) + help.assert_opts( + cmd.generic_app_ext_action, + cmd.generic_app_ext_flag, + "help", "m", "nt", + cmd.pl_ext_stacking_from_aux_action, + cmd.pl_ext_stacking_from_aux_flag, + cmd.python_plugin_action, + cmd.python_plugin_flag, + "t", "v", 'vk', + ) + help.assert_subcmds("help", cmd.subc) + + out = cmd.run() + cmd.assert_args( + out, + (cmd.action_arg, None), + (cmd.pl_ext_stacking_from_aux_action, None), + (cmd.python_plugin_action, None), + (cmd.generic_app_ext_action, None), + (cmd.generic_app_ext_flag, None), + ) + + sa_v = "single_arg_val" + out = cmd.run(sa_v, cmd.generic_app_ext_action.ln_to_cli(), self.na, cmd.generic_app_ext_flag.ln_to_cli()) + cmd.assert_args( + out, + (cmd.action_arg, [sa_v]), + (cmd.pl_ext_stacking_from_aux_action, None), + (cmd.python_plugin_action, None), + (cmd.generic_app_ext_action, [self.na]), + (cmd.generic_app_ext_flag, 1), + ) + + def test_extending_aux_subc(self): + cmd = self.aux_subc + help = cmd.get_help_msg() + help.assert_args(cmd.action_arg) + help.assert_opts( + cmd.flag_opt, + cmd.generic_app_ext_action, + cmd.generic_app_ext_flag, + "help", "m", "nt", + cmd.pl_ext_stacking_from_aux_action_subc, + cmd.pl_ext_stacking_from_aux_flag_subc, + cmd.python_plugin_action_subc, + cmd.python_plugin_flag_subc, + "t", "v", 'vk', + ) + help.assert_subcmds(None) + + out = cmd.run() + cmd.assert_args( + out, + (cmd.action_arg, None), + (cmd.pl_ext_stacking_from_aux_action_subc, None), + (cmd.python_plugin_action_subc, None), + (cmd.generic_app_ext_action, None), + (cmd.generic_app_ext_flag, None), + ) + + sa_v = "single_arg_val" + out = cmd.run(sa_v, cmd.generic_app_ext_action.ln_to_cli(), self.na, cmd.generic_app_ext_flag.ln_to_cli()) + cmd.assert_args( + out, + (cmd.action_arg, [sa_v]), + (cmd.pl_ext_stacking_from_aux_action_subc, None), + (cmd.python_plugin_action_subc, None), + (cmd.generic_app_ext_action, [self.na]), + (cmd.generic_app_ext_flag, 1), + ) + + def test_error_msg_on_missing_implementation(self): + cmd = self.missing_ext_impl_cmd + help = cmd.get_help_msg() + help.assert_args() + help.assert_opts( + cmd.app_ext_missing_impl, + "help", + cmd.loudly, + "m", "nt", "t", + cmd.to, + "v", 'vk', + cmd.times, + ) + + assert help.aux_exts == None + assert help.pl_exts == None + assert help.app_exts == True + + out = cmd.run() + r = origen.app.root.joinpath('example/commands/extensions') + assert "Could not find implementation for app extension" in out + assert f"From root '{r}', searched:" in out + assert f"plugin.python_plugin.plugin_says_hi.py" in out + assert f"plugin{os.sep}python_plugin.plugin_says_hi.py" in out + assert f"plugin{os.sep}python_plugin{os.sep}plugin_says_hi.py" in out + # TEST_NEEDED CLI check mod is None in error cases + + @pytest.mark.skip + def error_msg_on_extending_unknown_cmd(self): + # TEST_NEEDED CLI error handling from app context + fail + + @pytest.mark.skip + def test_error_in_before(self): + # TEST_NEEDED CLI error handling from app context + fail + + @pytest.mark.skip + def test_error_in_after(self): + # TEST_NEEDED CLI error handling from app context + fail + + @pytest.mark.skip + def test_error_in_cleanup(self): + # TEST_NEEDED CLI error handling from app context + fail + + class TestAppExtConflicts(CLICommon): + ''' Test what happens when app/plugin/aux extensions conflict + Only need a subset to ensure app messaging is okay ''' + config = CLICommon.app_cmds.conflict_exts["python_plugin.plugin_test_args"] + cmd = CLICommon.python_plugin.plugin_test_args.extend( + config["exts"], + from_configs=[config["cfg"]], + with_env=config["env"] + ) + _exts = CLICommon.exts.partition_exts(config["exts"]) + + @pytest.fixture + def exts(self): + return self._exts + + @pytest.fixture + def cmd_help(self): + if not hasattr(self, "_cmd_help"): + self._cmd_help = self.cmd.get_help_msg() + return self._cmd_help + + def test_help_msg(self, exts, cmd_help): + cmd = self.cmd + help = cmd_help + help.assert_args(cmd.single_arg, cmd.multi_arg) + help.assert_opts( + exts.app.app_opt, + exts.ec.ec_opt, + exts.app.tas_iln, + exts.ec.tas_iln, + cmd.flag_opt, + "h", "m", + cmd.sn_only, + "nt", + cmd.opt_taking_value, + cmd.opt_with_aliases, + "t", + exts.tas.tas_iln, + "v", "vk", + exts.tas.tas_opt, + ) + help.assert_subcmds("help", cmd.subc) + + assert help.aux_exts == ["ext_conflicts"] + assert help.pl_exts == ["test_apps_shared_test_helpers"] + assert help.app_exts == True + + def test_conflict_msgs(self, exts, cmd_help): + cmd = self.cmd + cmd_conflicts = cmd_help.logged_errors + conflicts = [ + ["repeated_sna", exts.app.app_opt, "g", 2], + ["reserved_prefix_lna", exts.app.app_opt, "ext_opt.res"], + ["duplicate", exts.app.app_opt, 0], + ["reserved_prefix_opt_name", "ext_opt.res_app_opt", exts.app.app_opt.displayed], + + ["sna", "sna", exts.tas.tas_opt, cmd.opt_with_aliases, "b"], + + ["sna", "sna", exts.ec.ec_opt, cmd.opt_with_aliases, "a"], + ["sna", "sna", exts.ec.ec_opt, cmd.opt_with_aliases, "b"], + ["sna", "sna", exts.ec.ec_opt, exts.tas.tas_opt, "c"], + ["sn", "sn", exts.ec.tas_iln, cmd.sn_only, "n"], + ["iln", "iln", exts.ec.tas_iln, exts.tas.tas_iln], + ["lna", "lna", exts.ec.tas_iln, exts.tas.tas_opt, "t_opt"], + + ["sn", "sna", exts.app.app_opt, cmd.opt_with_aliases, "a"], + ["lna", "ln", exts.app.app_opt, exts.tas.tas_opt, "tas"], + ["lna", "ln", exts.app.app_opt, cmd.flag_opt, "flag"], + ["sna", "sna", exts.app.app_opt, exts.tas.tas_opt, "c"], + ["sna", "sna", exts.app.app_opt, exts.ec.ec_opt, "d"], + ["iln", "iln", exts.app.tas_iln, exts.tas.tas_iln], + ] + for c in reversed(conflicts): + m = cmd_conflicts.pop() + print(m) + assert self.err_msgs.to_conflict_msg(cmd, c) in m + + def test_exts(self, exts): + cmd = self.cmd + sa = "sa_val" + ma = ["a", "b", "c"] + opt = "opt_val" + out = cmd.run( + sa, *ma, + "--app", "--app_flag", "-g", "-g", "--app_flag", "-g", + "-e", "--ec", "-d", + "--ext_opt.app.tas_iln", + "--ext_opt.aux.ext_conflicts.tas_iln", "--ext_opt.aux.ext_conflicts.tas_iln", + "--flag", "--flag", "--flag", + "-n", "-n", "-n", "-n", + "--opt", opt, + "--opt_alias", "-a", "-b", "-a", "-b", + "--tas_iln", "--tas_iln", "--tas_iln", + "--tas", "-z", "-c", "--tas", "-z", "-c", "--t_opt", + ) + cmd.assert_args( + out, + (cmd.single_arg, sa), + (cmd.multi_arg, ma), + (cmd.flag_opt, 3), + (cmd.sn_only, 4), + (cmd.opt_taking_value, opt), + (cmd.opt_with_aliases, 5), + + (exts.app.app_opt, 6), + (exts.app.tas_iln, 1), + (exts.ec.ec_opt, 3), + (exts.ec.tas_iln, 2), + (exts.tas.tas_opt, 7), + (exts.tas.tas_iln, 3), + ) diff --git a/test_apps/python_app/tests/cli/tests__cmd_integration.py b/test_apps/python_app/tests/cli/tests__cmd_integration.py new file mode 100644 index 00000000..bb99f026 --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__cmd_integration.py @@ -0,0 +1,45 @@ +import pytest +from .shared import CLICommon, Cmd, CmdOpt, CmdArg + +class T_CommandIntegration(CLICommon): + class TestDisablingAppOpts(CLICommon): + disabling_app_opts = CLICommon.app_cmds.disabling_app_opts + disabling_app_opts_from_pl = CLICommon.plugins.python_plugin.disabling_app_opts_from_pl + disabling_app_opts_from_aux = CLICommon.aux.ns.python_app_aux_cmds.disabling_app_opts_from_aux + no_app_opts = ["h", "v", "vk"] + no_target_opts = ["h", "m", "v", "vk"] + no_mode_opts = ["h", 'nt', "t", "v", "vk"] + + def test_app_opts_are_added_by_default(self): + help = self.disabling_app_opts.get_help_msg() + help.assert_args(None) + help.assert_bare_app_opts() + + cmds = [ + (disabling_app_opts.disable_targets_opt, no_target_opts), + (disabling_app_opts.disable_mode_opt, no_mode_opts), + (disabling_app_opts.disable_app_opts, no_app_opts), + (disabling_app_opts_from_pl.disable_targets_opt, no_target_opts), + (disabling_app_opts_from_pl.disable_mode_opt, no_mode_opts), + (disabling_app_opts_from_pl.disable_app_opts, no_app_opts), + (disabling_app_opts_from_aux.disable_targets_opt, no_target_opts), + (disabling_app_opts_from_aux.disable_mode_opt, no_mode_opts), + (disabling_app_opts_from_aux.disable_app_opts, no_app_opts), + ] + ids = [f"{cmd[0].parent.name}.{cmd[0].name}" for cmd in cmds] + @pytest.mark.parametrize("cmd,opts", cmds, ids=ids) + def test_disabling_app_opts(self, cmd, opts): + help = cmd.get_help_msg() + help.assert_opts(*opts) + + @pytest.mark.parametrize("cmd,opts", cmds, ids=ids) + def test_app_opt_disables_are_inherited(self, cmd, opts): + cmd = cmd.disable_subc + help = cmd.get_help_msg() + help.assert_opts(*opts) + + @pytest.mark.parametrize("cmd,opts", cmds, ids=ids) + def test_inherited_app_opt_disables_can_be_overridden(self, cmd, opts): + cmd = cmd.override_subc + help = cmd.get_help_msg() + help.assert_bare_app_opts() \ No newline at end of file diff --git a/test_apps/python_app/tests/cli/tests__core_cmds.py b/test_apps/python_app/tests/cli/tests__core_cmds.py new file mode 100644 index 00000000..cfda3c16 --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__core_cmds.py @@ -0,0 +1,119 @@ +import pytest, origen +from .shared import CLICommon +from .core_cmds.aux_cmds import T_AuxCmds +from .core_cmds.env import T_Env +from .core_cmds.generate import T_Generate +from .core_cmds.target import T_Target +from .core_cmds.app import T_App +from .core_cmds.plugin import T_Plugin +from .core_cmds.plugins import T_Plugins + +class T_AppWorkspaceCoreCommands(CLICommon): + def test_app_workspace_help_message(self): + help = self.in_app_cmds.origen.get_help_msg() + assert help.root_cmd is True + assert "Origen CLI: 2." in help.version_str + help.assert_bare_opts() + + assert set(help.subcmd_names) == set(self.in_app_cmds.all_names_add_help) + assert help.app_cmd_shortcuts == self.cmd_shortcuts.app + assert help.pl_cmd_shortcuts == self.cmd_shortcuts.pl + assert help.aux_cmd_shortcuts == self.cmd_shortcuts.aux + + @pytest.mark.parametrize("cmd", CLICommon.in_app_cmds.cmds, ids=CLICommon.in_app_cmds.all_names) + def test_core_commands_are_available(self, cmd): + ''' Just testing that "-h" doesn't crash for all core commands ''' + help = cmd.get_help_msg() + assert len(help.opts) >= 3 + # TESTS_NEEDED CLI add check for app opts when applicable + + class TestApp(T_App): + pass + + class TestAuxCmds(T_AuxCmds): + pass + + class TestEnv(T_Env): + pass + + class TestEval(CLICommon): + _cmd= origen.helpers.regressions.cli.CLI.in_app_cmds.eval + + def test_help_msg(self, cmd, no_config_run_opts): + help = cmd.get_help_msg(run_opts=no_config_run_opts) + help.assert_summary(cmd.help) + help.assert_args(cmd.code) + opts = list(self.in_app_cmds.standard_opts()) + opts.insert(3, cmd.scripts) + help.assert_opts(*opts) + + def test_basic_eval(self, cmd, no_config_run_opts): + d = cmd.demos["multi_statement_single_arg"] + out = d.run(run_opts=no_config_run_opts) + d.assert_present(out) + + class TestGenerate(T_Generate): + pass + + class TestPlugin(T_Plugin): + pass + + class TestPlugins(T_Plugins): + pass + + class TestTarget(T_Target): + pass + + class TestInteractive(CLICommon): + _cmd= origen.helpers.regressions.cli.CLI.in_app_cmds.i + + def test_help_msg(self, cmd, no_config_run_opts): + help = cmd.get_help_msg(run_opts=no_config_run_opts) + help.assert_summary(cmd.help) + help.assert_args(None) + help.assert_bare_app_opts() + + @pytest.mark.skip + def test_interactive(self, cmd, no_config_run_opts): + # TEST_NEEDED CLI try to get an interactive test that just starts/stops + proc = subprocess.Popen(["poetry", "run", "origen", "i"], universal_newlines=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + proc.stdin.flush() + #proc.stdout.flush() + m = 'print("hi from interactive!")' + import time + # time.sleep(10) + assert proc.poll() is None + # proc.stdin.write(f"{m}\n".encode()) + assert proc.poll() is None + # lines = proc.stdout.readlines() + # print(lines) + # assert lines[-1] == m + + m = "print('hi again!')" + # proc.stdin.write(f"{m}\n".encode()) + assert proc.poll() is None + # lines = proc.stdout.readlines() + # assert lines[0] == m + + proc.stdin.write("exit()\n") + assert proc.wait(3) == 0 + lines = proc.stdout.readline() + print(lines) + finally: + if proc.poll() is None: + proc.kill() + # print(proc.stdout.readline()) + # print(proc.stdout.readline()) + # print(proc.stdout.readline()) + # print(proc.stdout.readline()) + for l in proc.stdout: + # lines = proc.stdout.readlines() + if "CMD" in l: + break + print(l) + fail + + # class TestCredentials(CLICommon): + # def test_credentials(self): + # # TEST_NEEDED CLI credentials from app context diff --git a/test_apps/python_app/tests/cli/tests__extending_app_cmds.py b/test_apps/python_app/tests/cli/tests__extending_app_cmds.py new file mode 100644 index 00000000..55b88e0f --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__extending_app_cmds.py @@ -0,0 +1,340 @@ +import pytest +from .shared import CLICommon + +class T_ExtendingAppCmds(CLICommon): + class TestExtendingAppCmds(CLICommon): + config = CLICommon.app_cmds.exts["app.arg_opt_warmup"] + cmd = CLICommon.app_cmds.arg_opt_warmup.extend( + config["exts"], + from_configs=[config["cfg"]], + with_env=config["env"], + ) + + config_shallow_subc = CLICommon.app_cmds.exts["app.nested_app_cmds.nested_l1"] + shallow_subc = CLICommon.app_cmds.nested_app_cmds.nested_l1.extend( + config_shallow_subc["exts"], + from_configs=[config_shallow_subc["cfg"]], + with_env=config_shallow_subc["env"], + ) + + config_deep_subc = CLICommon.app_cmds.exts["app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a"] + deep_subc = CLICommon.app_cmds.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.extend( + config_deep_subc["exts"], + from_configs=[config_deep_subc["cfg"]], + with_env=config_deep_subc["env"], + ) + + @pytest.fixture + def first(self): + return "1st" + + @pytest.fixture + def second(self): + return ["2nd", "second"] + + @pytest.fixture + def sv(self): + return "sv" + + @pytest.fixture + def mv(self): + return ["mv0", "mv1"] + + @pytest.fixture + def pypl_sv(self): + return "pypl_sv" + + @pytest.fixture + def pypl_mv(self): + return ["pypl_mv_0", "pypl_mv_1", "pypl_mv_2"] + + @pytest.fixture + def tas_sv(self): + return "tas_sv" + + @pytest.fixture + def tas_mv(self): + return ["tas_mv_0", "tas_mv_1", "tas_mv_2"] + + @pytest.fixture + def ec_sv(self): + return "ec_sv" + + @pytest.fixture + def ec_mv(self): + return ["ec_mv_0", "ec_mv_1"] + + def test_help_msg(self): + cmd = self.cmd + help = cmd.get_help_msg() + help.assert_args(cmd.first, cmd.second) + help.assert_opts( + cmd.ec_multi_opt, + cmd.ec_single_opt, + cmd.flag_opt, + "help", + "m", + cmd.multi_opt, + "nt", + cmd.pypl_multi_opt, + cmd.pypl_single_opt, + cmd.single_opt, + "t", + cmd.tas_multi_opt, + cmd.tas_single_opt, + "v", "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ["python_app_exts"] + assert help.pl_exts == ["python_plugin", "test_apps_shared_test_helpers"] + assert help.app_exts == False + + def test_exts(self, first, second, sv, mv, pypl_sv, pypl_mv, tas_sv, tas_mv, ec_sv, ec_mv): + cmd = self.cmd + out = cmd.run( + first, second[0], second[1], + "--single_opt", sv, + "--m_opt", mv[0], mv[1], + "-f", "--hidden", + + "--pypl_single_opt", pypl_sv, + "--PYPL", pypl_mv[0], "--pypl_multi_opt", pypl_mv[1], pypl_mv[2], + "-p", "--pypl_h_opt", "-p", '--pypl_h_opt', + + "--tas_sv", tas_sv, + "-a", tas_mv[0], "--TAS", tas_mv[1], "--tas_multi_opt", tas_mv[2], + "--tas_hidden", "--tas_hidden", + + "--ec_single_opt", ec_sv, + "--ec_multi_opt", ec_mv[0], "-e", ec_mv[1], + "--ec_h_opt", "--ec_h_opt", "--ec_h_opt", + ) + cmd.assert_args( + out, + (cmd.first, first), + (cmd.second, second), + (cmd.single_opt, sv), + (cmd.multi_opt, mv), + (cmd.flag_opt, 1), + (cmd.hidden_flag_opt, 1), + + (cmd.pypl_single_opt, pypl_sv), + (cmd.pypl_multi_opt, pypl_mv), + (cmd.pypl_hidden, 4), + + (cmd.tas_single_opt, tas_sv), + (cmd.tas_multi_opt, tas_mv), + (cmd.tas_hidden, 2), + + (cmd.ec_single_opt, ec_sv), + (cmd.ec_multi_opt, ec_mv), + (cmd.ec_hidden, 3), + ) + + def test_shallow_subc_help_msg(self): + cmd = self.shallow_subc + help = cmd.get_help_msg() + help.assert_opts( + cmd.ec_flag_opt_shallow, + cmd.ec_single_opt_shallow, + cmd.tas_flag_opt_shallow, + "help", "m", "nt", + cmd.pypl_single_opt_shallow, + cmd.pypl_flag_opt_shallow, + "t", + cmd.tas_multi_opt_shallow, + "v", "vk", + ) + help.assert_subcmds("help", cmd.nested_l2_a, cmd.nested_l2_b) + + assert help.aux_exts == ["python_app_exts"] + assert help.pl_exts == ["python_plugin", "test_apps_shared_test_helpers"] + assert help.app_exts == False + + def test_shallow_subc_exts(self, pypl_sv, tas_sv, tas_mv, ec_sv): + cmd = self.shallow_subc + out = cmd.run( + "-p", pypl_sv, + "--pypl_flag_opt_shallow", + "--tas_shallow", tas_mv[0], tas_mv[1], "--tas_m_opt", tas_mv[2], tas_sv, + "-f", "--tas_f", + "--ec_single_opt_shallow", ec_sv, + "--ec_f", "--ec_f", "--ec_f", + ) + cmd.assert_args( + out, + (cmd.pypl_single_opt_shallow, pypl_sv), + (cmd.pypl_flag_opt_shallow, 1), + (cmd.tas_multi_opt_shallow, [*tas_mv, tas_sv]), + (cmd.tas_flag_opt_shallow, 2), + (cmd.ec_single_opt_shallow, ec_sv), + (cmd.ec_flag_opt_shallow, 3), + ) + + def test_deep_subc_help_msg(self): + cmd = self.deep_subc + help = cmd.get_help_msg() + help.assert_opts( + cmd.ec_flag_opt_deep, + cmd.ec_single_opt_deep, + cmd.pypl_flag_opt_deep, + "help", "m", "nt", + cmd.pypl_single_opt_deep, + "t", + cmd.tas_flag_opt_deep, + cmd.tas_multi_opt_deep, + "v", "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ["python_app_exts"] + assert help.pl_exts == ["python_plugin", "test_apps_shared_test_helpers"] + assert help.app_exts == False + + def test_deep_subc_exts(self, pypl_sv, tas_mv, ec_sv): + cmd = self.deep_subc + out = cmd.run( + "-q", pypl_sv, + "-f", "-f", "--py_f", "--py_f", + "--tas_opt", tas_mv[0], "--tas_opt", tas_mv[1], "--tas_opt", tas_mv[2], + "--tas_flag_opt_deep", + "--ec_opt", ec_sv, + "--ec_df", "-c", "--ec_df", + ) + cmd.assert_args( + out, + (cmd.pypl_single_opt_deep, pypl_sv), + (cmd.pypl_flag_opt_deep, 4), + (cmd.tas_multi_opt_deep, tas_mv), + (cmd.tas_flag_opt_deep, 1), + (cmd.ec_single_opt_deep, ec_sv), + (cmd.ec_flag_opt_deep, 3), + ) + + class TestAppCmdExtConflicts(CLICommon): + ''' Test what happens when extensions conflict with app commands ''' + config = CLICommon.app_cmds.conflict_exts["app.arg_opt_warmup"] + cmd = CLICommon.app_cmds.arg_opt_warmup.extend( + config["exts"], + from_configs=[config["cfg"]], + with_env=config["env"], + ) + _exts = CLICommon.exts.partition_exts(config["exts"]) + + @classmethod + def setup_class(cls): + cls.cmd_help = cls.cmd.get_help_msg() + cls.cmd_conflicts = cls.cmd_help.logged_errors + + @classmethod + def teardown_class(cls): + delattr(cls, "cmd_help") + delattr(cls, "cmd_conflicts") + + @pytest.fixture + def exts(self): + return self._exts + + def test_help_msg(self, exts): + cmd = self.cmd + help = self.cmd_help + + help.assert_args(cmd.first, cmd.second) + help.assert_opts( + exts.tas.conflicts_from_test_apps_shared, + exts.ec.conflicts_from_ext_conflicts, + exts.pypl.conflicts_from_python_plugin, + exts.ec.flag_opt, + exts.tas.flag_opt, + cmd.flag_opt, + exts.pypl.flag_opt, + "h", "m", + cmd.multi_opt, + "nt", + cmd.single_opt, + "t", "v", "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ["ext_conflicts"] + assert help.pl_exts == ["python_plugin", "test_apps_shared_test_helpers"] + assert help.app_exts == False + + def test_conflict_messages(self, exts): + cmd = self.cmd + print(self.cmd_help.text) + conflicts = [ + ["inter_ext_lna_ln", exts.tas.conflicts_from_test_apps_shared, "TAS"], + + ["ln", "iln", exts.pypl.conflicts_from_python_plugin, cmd.single_opt, "single_opt"], + ["sn", "sna", exts.pypl.conflicts_from_python_plugin, cmd.multi_opt, "m"], + ["lna", "lna", exts.pypl.conflicts_from_python_plugin, cmd.multi_opt, "m_opt"], + + ["iln", "iln", exts.tas.flag_opt, exts.pypl.flag_opt], + ["lna", "ln", exts.tas.conflicts_from_test_apps_shared, cmd.hidden_flag_opt, "hidden"], + ["lna", "lna", exts.tas.conflicts_from_test_apps_shared, exts.pypl.conflicts_from_python_plugin, "python_plugin_conflicts"], + ["sna", "sna", exts.tas.conflicts_from_test_apps_shared, cmd.multi_opt, "m"], + ["sna", "sna", exts.tas.conflicts_from_test_apps_shared, exts.pypl.conflicts_from_python_plugin, "a"], + + ["iln", "iln", exts.ec.flag_opt, exts.pypl.flag_opt], + ["lna", "lna", exts.ec.conflicts_from_ext_conflicts, exts.pypl.conflicts_from_python_plugin, "python_plugin_conflicts"], + ["lna", "ln", exts.ec.conflicts_from_ext_conflicts, exts.tas.conflicts_from_test_apps_shared, "TAS"], + ["lna", "ln", exts.ec.conflicts_from_ext_conflicts, cmd.hidden_flag_opt, "hidden"], + ["sna", "sna", exts.ec.conflicts_from_ext_conflicts, exts.pypl.conflicts_from_python_plugin, "a"], + ["sna", "sna", exts.ec.conflicts_from_ext_conflicts, exts.tas.conflicts_from_test_apps_shared, "b"], + ] + for c in reversed(conflicts): + m = self.cmd_conflicts.pop() + assert self.err_msgs.to_conflict_msg(self.cmd, c) in m + assert len(self.cmd_conflicts) == 0 + + def test_conflicts_resolve_correctly(self, exts): + cmd = self.cmd + out = cmd.run( + "a1", "a2,a3", + "--TAS", "-b", + "--EX_Conflicts", "-c", "-c", + "--python_plugin_conflicts", "-a", "-a", "--conflicts_from_python_plugin", + "--ext_opt.aux.ext_conflicts.flag_opt", + "--ext_opt.plugin.test_apps_shared_test_helpers.flag_opt", "--ext_opt.plugin.test_apps_shared_test_helpers.flag_opt", + "--flag_opt", "--flag_opt", "--flag_opt", + "-f", "-f", "-f", "-f", + "--m_opt", "m0", "m1", "-m", "m2", + "-s", "s0" + ) + cmd.assert_args( + out, + (cmd.first, "a1"), + (cmd.second, ["a2", "a3"]), + (cmd.flag_opt, 4), + (exts.ec.flag_opt, 1), + (exts.tas.flag_opt, 2), + (exts.pypl.flag_opt, 3), + (exts.tas.conflicts_from_test_apps_shared, 2), + (exts.ec.conflicts_from_ext_conflicts, 3), + (exts.pypl.conflicts_from_python_plugin, 4), + (cmd.multi_opt, ["m0", "m1", "m2"]), + (cmd.single_opt, "s0"), + ) + + @pytest.mark.skip + def test_subc_help_msg(self): + # TEST_NEEDED CLI subc conflicts from app context + fail + + @pytest.mark.skip + def test_subc_conflict_msgs(self): + # TEST_NEEDED CLI subc conflicts from app context + fail + + @pytest.mark.skip + def test_subc_exts(self): + # TEST_NEEDED CLI subc conflicts from app context + fail + + @pytest.mark.skip + def test_app_cmd_ext_conflicts(self): + ''' This is likely a mistake case but should resolve nonetheless ''' + # TEST_NEEDED CLI subc conflicts from app context + fail \ No newline at end of file diff --git a/test_apps/python_app/tests/cli/tests__intra_cmd_conflicts.py b/test_apps/python_app/tests/cli/tests__intra_cmd_conflicts.py new file mode 100644 index 00000000..c5314b40 --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__intra_cmd_conflicts.py @@ -0,0 +1,111 @@ +import pytest +from .shared import CLICommon + +class T_IntraCmdConflicts(CLICommon): + # Reuse the same conflicts as python plugin. Only change should be the processed command + + cmd = CLICommon.app_cmds.intra_cmd_conflicts + conflicts = CLICommon.python_plugin.get_intra_cmd_conflicts_list(cmd) + + @classmethod + def setup_class(cls): + cls.cmd_help = cls.cmd.get_help_msg() + cls.cmd_conflicts = cls.cmd_help.logged_errors + + @classmethod + def teardown_class(cls): + delattr(cls, "cmd_help") + delattr(cls, "cmd_conflicts") + + def test_help_msg(self): + # Check help message + cmd = self.cmd + help = self.cmd_help + print(self.cmd_help.text) + help.assert_args(cmd.arg0, cmd.arg1, cmd.arg2) + help.assert_opts( + cmd.arg_clash, + cmd.intra_opt_conflicts, + "help", + cmd.inter_opt_conflicts, + "m", "nt", + cmd.opt, + cmd.reserved_prefix_in_ln_lna, + "t", "v", "vk", + ) + help.assert_subcmds(cmd.conflicts_subc, "help") + + assert help.aux_exts == None + assert help.pl_exts == None + assert help.app_exts == False + + def test_conflicts_during_cmd_building(self): + for c in reversed(self.conflicts): + m = self.cmd_conflicts.pop() + assert self.err_msgs.to_conflict_msg(self.cmd, c) in m + + def test_all_error_messages_checked(self): + assert len(self.cmd_conflicts) == 0 + + def test_cmd_conflicts_resolve_correctly(self): + cmd = self.cmd + out = cmd.run( + "0", "1", "2", + "--opt", "--opt0", + "--arg0", "--arg1", + "--ext_opt_lna", + "--intra_opt_cons", "-c", "-e", + "-d", + ) + cmd.assert_args( + out, + (cmd.arg0, "0"), + (cmd.arg1, "1"), + (cmd.arg2, "2"), + (cmd.opt, 2), + (cmd.arg_clash, 2), + (cmd.reserved_prefix_in_ln_lna, 1), + (cmd.intra_opt_conflicts, 3), + (cmd.inter_opt_conflicts, 1), + ) + + def test_subc_help_msg(self): + # Check help message + cmd = self.cmd.conflicts_subc + help = cmd.get_help_msg() + + help.assert_args(cmd.arg0, cmd.sub_arg_1) + help.assert_opts( + "help", + cmd.inter_subc_conflicts, + cmd.intra_subc_lna_iln_conflict, + "m", "nt", + cmd.opt, + cmd.intra_subc_conflicts, + "t", "v", "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == None + assert help.pl_exts == None + assert help.app_exts == False + + def test_cmd_subc_conflicts_resolve_correctly(self): + cmd = self.cmd.conflicts_subc + out = cmd.run( + "a", "b", + "--opt", "--subc_opt", + "--intra_subc_conflicts", "-r", + "--intra_subc_lna_iln_conflict", + "--inter_subc_conflicts" + ) + cmd.assert_args( + out, + (cmd.arg0, "a"), + (cmd.sub_arg_1, "b"), + (cmd.opt, 2), + (cmd.intra_subc_conflicts, 2), + (cmd.intra_subc_lna_iln_conflict, 1), + (cmd.inter_subc_conflicts, 1), + ) + diff --git a/test_apps/python_app/tests/cli/tests__non_extendable_err_msgs.py b/test_apps/python_app/tests/cli/tests__non_extendable_err_msgs.py new file mode 100644 index 00000000..bef7b85a --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__non_extendable_err_msgs.py @@ -0,0 +1,50 @@ +import pytest +from cli.shared import CLICommon +from .core_cmds.target import TargetCLI + +class T_NonExtendableErrMsgs(TargetCLI): + with_env = {"ORIGEN_EXT_TARGET_CMD": "1"} + _cmd = CLICommon.in_app_commands.target.extend( + [], + with_env=with_env, + from_configs=["config/enumerated_plugins.toml"], + ) + # TODO CLI have with_env extension apply to subcommands? + view_cmd = CLICommon.in_app_commands.target.view.extend( + [], + with_env=with_env, + from_configs=["config/enumerated_plugins.toml"], + ) + + @pytest.fixture + def cmd(self): + return self._cmd + + err_srcs = [CLICommon.plugins.tas, CLICommon.plugins.python_plugin, CLICommon.app_cmds] + + @classmethod + def assert_non_ext_errors(cls, out): + errors = "\n".join(cls.extract_logged_errors(out)) + cls.assert_ext_non_ext_cmd_msg(errors, cls._cmd.view, cls.err_srcs) + cls.assert_ext_non_ext_cmd_msg(errors, cls._cmd, cls.err_srcs) + + def test_err_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_opts(cmd.full_paths, "h", "v", "vk") + self.assert_non_ext_errors(help.text) + + def test_err_msg_when_run(self, cmd, eagle): + out = cmd.run() + self.assert_non_ext_errors(out) + self.assert_out(out, eagle) + + def test_err_msg_subc(self): + cmd = self.view_cmd + help = cmd.get_help_msg() + help.assert_opts(cmd.full_paths, "h", "v", "vk") + self.assert_non_ext_errors(help.text) + + def test_subc_err_msg_when_run(self, eagle): + out = self.view_cmd.run() + self.assert_non_ext_errors(out) + self.assert_out(out, eagle) diff --git a/test_apps/python_app/tests/cli/tests__reserved_opts.py b/test_apps/python_app/tests/cli/tests__reserved_opts.py new file mode 100644 index 00000000..33ac9f69 --- /dev/null +++ b/test_apps/python_app/tests/cli/tests__reserved_opts.py @@ -0,0 +1,315 @@ +import pytest, origen +from .shared import CLICommon, Cmd, CmdOpt, CmdExtOpt +from origen.helpers.regressions.cli.command import SrcTypes + +class T_ReservedOpts(CLICommon): + cmd = CLICommon.app_sub_cmd( + "reserved_opt_error_gen", + help = "Generate error messages when reserved opts are used", + opts=[ + CmdOpt("conflicting_help", help="Conflicting Opt"), + CmdOpt("conflicting_target", help="Conflicting Opt"), + CmdOpt("non_conflicting", help="Non-Conflicting Opt", ln="non_conflicting", sn="n"), + ], + subcmds=[ + Cmd( + "single_conflicting_opt", + help="Generate error messages for reserved opts", + opts=[ + CmdOpt("non_conflicting", help="Non-Conflicting Opt"), + CmdOpt("conflicting_target", help="Conflicting Opt"), + ], + ), + Cmd( + "multiple_conflicting_opts", + help="Generate error messages for reserved opts", + opts=[ + CmdOpt("conflicting_target", help="Conflicting Opt"), + CmdOpt("conflicting_mode", help="Conflicting Opt"), + CmdOpt("not_conflicting", help="Non-Conflicting Opt", sn='n'), + CmdOpt("conflicting_no_targets", help="Conflicting Opt"), + CmdOpt("conflicting_target_again", help="Conflicting Opt"), + CmdOpt("conflicting_v", help="Conflicting Opt"), + CmdOpt("conflicting_vk", help="Conflicting Opt"), + CmdOpt("conflicting_help", help="Conflicting Opt", ln_aliases=["help_alias"], sn_aliases=["g", "i"]), + ], + subcmds=[ + Cmd( + "subc", + help="Generate error messages for reserved opts - subc", + opts=[ + CmdOpt("conflicting_help", help="Conflicting Opt"), + ], + subcmds=[ + Cmd( + "subc", + help="Generate error messages for reserved opts - subc - subc", + opts=[ + CmdOpt("conflicting_help", help="Conflicting Opt", ln_aliases=["help2", "help3"]), + CmdOpt("conflicting_v", help="Conflicting Opt", sn="c"), + ], + ), + ] + ) + ] + ) + ], + with_env={"ORIGEN_APP_TEST_RESERVED_OPT_ERRORS": "1"}, + ) + + @classmethod + def setup_class(cls): + if not hasattr(cls, "base_cmd_help"): + cls.base_cmd_help = cls.cmd.get_help_msg() + if not hasattr(cls, "ext_cmd_help"): + cls.ext_cmd_help = cls.ext_cmd.get_help_msg() + + @classmethod + def teardown_class(cls): + delattr(cls, "base_cmd_help") + delattr(cls, "ext_cmd_help") + + def test_opts_are_added_with_respect_to_errors(self): + help = self.base_cmd_help + help.assert_args(None) + help.assert_opts( + self.cmd.conflicting_help, + self.cmd.conflicting_target, + "h", "m", + self.cmd.non_conflicting, + "nt", "t", "v", "vk" + ) + help.assert_subcmds("help", self.cmd.multiple_conflicting_opts, self.cmd.single_conflicting_opt) + + cmd = self.cmd.single_conflicting_opt + help = cmd.get_help_msg() + help.assert_opts( + cmd.conflicting_target, + "h", "m", "nt", + cmd.non_conflicting, + "t", "v", "vk" + ) + + cmd = self.cmd.multiple_conflicting_opts + help = cmd.get_help_msg() + help.assert_opts( + cmd.conflicting_help, + cmd.conflicting_mode, + cmd.conflicting_no_targets, + cmd.conflicting_target, + cmd.conflicting_target_again, + cmd.conflicting_v, + cmd.conflicting_vk, + "h", "m", + cmd.not_conflicting, + "nt", "t", "v", "vk" + ) + + cmd = cmd.subc + help = cmd.get_help_msg() + help.assert_opts( + cmd.conflicting_help, + "h", "m", "nt", "t", "v", "vk" + ) + + cmd = cmd.subc + help = cmd.get_help_msg() + help.assert_opts( + cmd.conflicting_v, + cmd.conflicting_help, + "h", "m", "nt", "t", "v", "vk" + ) + + errors = [ + (cmd, cmd.conflicting_help, [("sn", "h")]), + (cmd, cmd.conflicting_target, [("sn", "t"), ("ln", "target")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_help, [("ln", "help"), ("sn", "h")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_vk, [("lna", "verbosity_keywords"), ("ln", "vk")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_v, [("ln", "verbosity"), ("sn", "v")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_no_targets, [("lna", "no_targets"), ("lna", "no_target")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_target_again, [("lna", "targets"), ("ln", "target"), ("sn", "t")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_mode, [("lna", "mode")]), + (cmd.multiple_conflicting_opts, cmd.multiple_conflicting_opts.conflicting_target, [("sn", "t")]), + (cmd.multiple_conflicting_opts.subc, cmd.multiple_conflicting_opts.subc.conflicting_help, [("sn", "h")]), + (cmd.multiple_conflicting_opts.subc.subc, cmd.multiple_conflicting_opts.subc.subc.conflicting_v, [("sna", "v"), ("ln", "verbosity")]), + (cmd.multiple_conflicting_opts.subc.subc, cmd.multiple_conflicting_opts.subc.subc.conflicting_help, [("lna", "help")]), + (cmd.single_conflicting_opt, cmd.single_conflicting_opt.conflicting_target, [("ln", "target")]), + ] + @pytest.mark.parametrize( + "cmd,opt,type,name", + [(o[0], o[1], inner[0], inner[1]) for o in errors for inner in o[2]], + ids=[f"{o[0].name}-{o[1].name}-{inner[0]}-{inner[1]}" for o in errors for inner in o[2]], + ) + def test_error_msg_using_reserved_opts(self, cmd, opt, type, name): + if type == "sn": + assert cmd.reserved_opt_sn_conflict_msg(opt, name) in self.base_cmd_help.text + elif type == "sna": + assert cmd.reserved_opt_sna_conflict_msg(opt, name) in self.base_cmd_help.text + elif type == "ln": + assert cmd.reserved_opt_ln_conflict_msg(opt, name) in self.base_cmd_help.text + elif type == "lna": + assert cmd.reserved_opt_lna_conflict_msg(opt, name) in self.base_cmd_help.text + else: + raise RuntimeError(f"Unknown type {type}") + + def test_opts_are_still_available_under_non_reserved_names(self): + cmd = self.cmd + out = cmd.run("--conflicting_help", "--conflicting_target", "--non_conflicting", "-n") + cmd.assert_args( + out, + (cmd.conflicting_help, 1), + (cmd.conflicting_target, 1), + (cmd.non_conflicting, 2) + ) + + cmd = self.cmd.single_conflicting_opt + out = cmd.run("--non_conflicting", "--conflicting_target") + cmd.assert_args( + out, + (cmd.conflicting_target, 1), + (cmd.non_conflicting, 1) + ) + + cmd = self.cmd.multiple_conflicting_opts + out = cmd.run( + "--conflicting_target", + "--conflicting_mode", + "-n", + "--conflicting_no_targets", + "--conflicting_target_again", + "--conflicting_v", + "--conflicting_vk", + "--conflicting_help", "-g", "-i", "--help_alias", + ) + cmd.assert_args( + out, + (cmd.conflicting_target, 1), + (cmd.conflicting_mode, 1), + (cmd.not_conflicting, 1), + (cmd.conflicting_no_targets, 1), + (cmd.conflicting_target_again, 1), + (cmd.conflicting_v, 1), + (cmd.conflicting_vk, 1), + (cmd.conflicting_help, 4), + ) + + cmd = cmd.subc + out = cmd.run("--conflicting_help") + cmd.assert_args(out, (cmd.conflicting_help, 1)) + + cmd = cmd.subc + out = cmd.run( + "--conflicting_help", "--help2", "--help3", + "-c", + ) + cmd.assert_args( + out, + (cmd.conflicting_help, 3), + (cmd.conflicting_v, 1) + ) + + ext_error_msgs_env = {"ORIGEN_APP_EXT_TEST_RESERVED_OPT_ERRORS": "1", "origen_bypass_config_lookup": "1"} + ext_cmd = origen.helpers.regressions.cli.CLI.in_app_cmds.eval.extend( + CmdExtOpt.from_src( + "example", + SrcTypes.APP, + CmdExtOpt( + "conflicting_target", + help="Conflicting Core Extension" + ), + CmdExtOpt( + "conflicting_no_target", + help="Conflicting Core Extension", + sn="n", + ), + CmdExtOpt( + "conflicting_mode", + help="Conflicting Core Extension", + ln="mode_conflict", + sn_aliases=["m"] + ), + CmdExtOpt( + "conflicting_help", + help="Conflicting Core Extension", + ln="help_conflict", + ln_aliases=["help1"] + ), + CmdExtOpt( + "conflicting_v", + help="Conflicting Core Extension", + sn_aliases=["w"] + ), + CmdExtOpt( + "conflicting_vk", + help="Conflicting Core Extension" + ), + ), + with_env=ext_error_msgs_env, + from_configs=CLICommon.configs.suppress_plugin_collecting_config, + ) + + def test_ext_opts_are_added_with_respect_to_errors(self): + cmd = self.ext_cmd + help = self.ext_cmd_help + help.assert_args(cmd.code) + help.assert_opts( + cmd.conflicting_target, + cmd.conflicting_v, + cmd.conflicting_vk, + "h", + cmd.conflicting_help, + "m", + cmd.conflicting_mode, + cmd.conflicting_no_target, + "nt", + cmd.scripts, + "t", "v", "vk" + ) + help.assert_subcmds(None) + + ext_errors = [ + (ext_cmd, ext_cmd.conflicting_target, [("ln", "target"), ("sn", "t")]), + (ext_cmd, ext_cmd.conflicting_no_target, [("lna", "no_target"), ("lna", "no_targets")]), + (ext_cmd, ext_cmd.conflicting_help, [("sn", "h"), ("lna", "help")]), + (ext_cmd, ext_cmd.conflicting_mode, [("lna", "mode")]), + (ext_cmd, ext_cmd.conflicting_v, [("ln", "verbosity"), ("sn", "v")]), + (ext_cmd, ext_cmd.conflicting_vk, [("lna", "verbosity_keywords"), ("lna", "vk")]), + ] + @pytest.mark.parametrize( + "cmd,opt,type,name", + [(o[0], o[1], inner[0], inner[1]) for o in ext_errors for inner in o[2]], + ids=[f"{o[0].name}-{o[1].name}-{inner[0]}-{inner[1]}" for o in ext_errors for inner in o[2]], + ) + def test_ext_error_msg_using_reserved_opts(self, cmd, opt, type, name): + if type == "sn": + assert cmd.reserved_opt_sn_conflict_msg(opt, name) in self.ext_cmd_help.text + elif type == "sna": + assert cmd.reserved_opt_sna_conflict_msg(opt, name) in self.ext_cmd_help.text + elif type == "ln": + assert cmd.reserved_opt_ln_conflict_msg(opt, name) in self.ext_cmd_help.text + elif type == "lna": + assert cmd.reserved_opt_lna_conflict_msg(opt, name) in self.ext_cmd_help.text + else: + raise RuntimeError(f"Unknown type {type}") + + def test_ext_opts_are_still_available_under_non_reserved_names(self): + cmd = self.ext_cmd + out = cmd.run( + "from test_apps_shared_test_helpers.aux_cmds import run; run()", + "--conflicting_target", + "-n", + "--mode_conflict", "-m", + "--help_conflict", "--help1", + "--conflicting_v", "-w", + "--conflicting_vk", + ) + self.Cmd.assert_args( + cmd, + out, + (cmd.conflicting_target, 1), + (cmd.conflicting_no_target, 1), + (cmd.conflicting_mode, 2), + (cmd.conflicting_help, 2), + (cmd.conflicting_v, 2), + (cmd.conflicting_vk, 1), + ) diff --git a/test_apps/python_app/tests/cli_test.py b/test_apps/python_app/tests/cli_test.py index 5e445bdd..af963548 100644 --- a/test_apps/python_app/tests/cli_test.py +++ b/test_apps/python_app/tests/cli_test.py @@ -1,36 +1,49 @@ -# see the following docs -# https://docs.python.org/3/library/subprocess.html#subprocess.Popen -# https://docs.python.org/3/library/subprocess.html#subprocess.call -# https://docs.python.org/3/library/subprocess.html#subprocess.run - -# Makes a lot of sense to run tests that require a Python workspace here -# rather than as Rust cli tests (Rust tests would need to ensure a working app -# is available before running). -# -# Global commands could go here if the working dir is changed first. -# Otherwise Rust cli tests can be used. See the rust/origen/cli/test directory -# -# an interactive command test write to stdin like this: -# process = subprocess.Popen(['origen', '-v']), -# stdin=subprocess.PIPE, -# stdout=subprocess.PIPE, -# stderr=subprocess.PIPE, -# universal_newlines=True, -# bufsize=0) -# process.stdin.write("yes\n") -# process.stdin.close() -# read output, etc - -import pytest, pathlib +import pytest, pathlib, sys import subprocess import os import origen -origen_cli = os.getenv('TRAVIS_ORIGEN_CLI') or 'origen' +pytest.register_assert_rewrite("t_invocation_env") + +sys.path.insert(-1, str(pathlib.Path(__file__).parent.parent.parent.joinpath("no_workspace"))) +from t_invocation_env import T_InvocationBaseTests + +from cli.tests__app_cmd_building import T_AppCmdBuilding +from cli.tests__core_cmds import T_AppWorkspaceCoreCommands +from cli.tests__cmd_exts_from_app import T_ExtendingFromAppCmds +from cli.tests__reserved_opts import T_ReservedOpts +from cli.tests__cmd_integration import T_CommandIntegration +from cli.tests__intra_cmd_conflicts import T_IntraCmdConflicts +from cli.tests__extending_app_cmds import T_ExtendingAppCmds +from cli.tests__non_extendable_err_msgs import T_NonExtendableErrMsgs + +class TestAppCmdBuilding(T_AppCmdBuilding): + pass + +class TestExtendingAppCmds(T_ExtendingAppCmds): + pass + +class TestIntraCmdConflicts(T_IntraCmdConflicts): + pass + +class TestExtendingFromAppCommands(T_ExtendingFromAppCmds): + pass +class TestAppWorkspaceCoreCommands(T_AppWorkspaceCoreCommands): + pass + +class TestReservedOpts(T_ReservedOpts): + pass + +class TestCommandIntegration(T_CommandIntegration): + pass + +class TestNonExtendableErrMsgs(T_NonExtendableErrMsgs): + pass + +origen_cli = os.getenv('TRAVIS_ORIGEN_CLI') or 'origen' def test_origen_v(): - #import pdb; pdb.set_trace() process = subprocess.Popen([f'{origen_cli}', '-v'], stdout=subprocess.PIPE, universal_newlines=True) @@ -39,80 +52,29 @@ def test_origen_v(): # Process is done # Read std out first_stdout_line = process.stdout.readline() - assert "App:" in first_stdout_line + assert "Origen" in first_stdout_line + assert " 2." in first_stdout_line second_stdout_line = process.stdout.readline() - assert "Origen" in second_stdout_line - assert " 2." in second_stdout_line + assert "App:" in second_stdout_line def test_bad_command(): process = subprocess.Popen([f'{origen_cli}', 'thisisnotacommand'], stderr=subprocess.PIPE, universal_newlines=True) - assert process.wait() == 1 + assert process.wait() == 2 assert "error:" in process.stderr.readline() +@pytest.mark.skip +class TestAuxCommandsAreAdded: + ... -def test_origen_g(): - os.chdir(origen.root) - process = subprocess.Popen([ - f'{origen_cli}', 'g', r'./example/patterns/toggle.py', '-t', - r'./targets/eagle_with_smt7.py' - ], - universal_newlines=True) - assert process.wait() == 0 +@pytest.mark.skip +class TestModeOpts(): + def test_(): + fail -class TestBadConfigs: - @property - def bad_config_env(self): - return { - **os.environ, - "origen_bypass_config_lookup": "1", - "origen_config_paths": str( - pathlib.Path(__file__).parent.joinpath("origen_utilities/configs/ldap/test_bad_ldap_config.toml").absolute() - ) - } - - def test_origen_v(self): - r = subprocess.run( - [origen_cli, '-v'], - capture_output=True, - env=self.bad_config_env - ) - assert r.returncode == 1 - out = r.stdout.decode("utf-8").strip() - err = r.stderr.decode("utf-8").strip() - p = pathlib.Path("tests/origen_utilities/configs/ldap/test_bad_ldap_config.toml") - assert "Couldn't boot app to determine the in-application Origen version" in out - assert f"invalid type: string \"hi\", expected an integer for key `ldaps.bad.timeout` in {str(p)}" in out - assert err == "" - - def test_origen_cmd(self): - r = subprocess.run( - [origen_cli, 'g', r'./example/patterns/toggle.py', '-t', r'./targets/eagle_with_smt7.py'], - capture_output=True, - env=self.bad_config_env - ) - assert r.returncode == 1 - out = r.stdout.decode("utf-8").strip() - err = r.stderr.decode("utf-8").strip() - p = pathlib.Path("tests/origen_utilities/configs/ldap/test_bad_ldap_config.toml") - assert f"invalid type: string \"hi\", expected an integer for key `ldaps.bad.timeout` in {str(p)}" in out - assert err == "" - - def test_bad_config_path(self): - r = subprocess.run( - [origen_cli, '-v'], - capture_output=True, - env={ - **self.bad_config_env, - **{ - "origen_config_paths": str(pathlib.Path(__file__).parent.joinpath("missing.toml").absolute()) - } - } - ) - assert r.returncode == 1 - out = r.stdout.decode("utf-8").strip() - err = r.stderr.decode("utf-8").strip() - assert "Couldn't boot app to determine the in-application Origen version" in out - assert "missing.toml either does not exists or is not accessible" in out - assert err == "" +class TestAppInvocation(T_InvocationBaseTests): + @classmethod + def set_params(cls): + cls.invocation = cls.PyProjectSrc.App + cls.target_pyproj_dir = pathlib.Path(__file__).parent.parent diff --git a/test_apps/python_app/tests/compiler_test.py b/test_apps/python_app/tests/compiler_test.py index 8d4042ed..8b438586 100644 --- a/test_apps/python_app/tests/compiler_test.py +++ b/test_apps/python_app/tests/compiler_test.py @@ -73,9 +73,9 @@ def expected_str_render(self): @property def expected_str_render_with_standard_context(self): # Make sure origen.version isn't woefully broken - assert isinstance(origen.version, str) - assert len(origen.version) > 0 - return f"Hello from Origen version {origen.version}!" + assert isinstance(origen.__version__, str) + assert len(origen.__version__) > 0 + return f"Hello from Origen version {origen.__version__}!" @property def expected_str_render_with_additional_context(self): diff --git a/test_apps/python_app/tests/configs/empty_app_cmds.toml b/test_apps/python_app/tests/configs/empty_app_cmds.toml new file mode 100644 index 00000000..f6c28576 --- /dev/null +++ b/test_apps/python_app/tests/configs/empty_app_cmds.toml @@ -0,0 +1 @@ +commands = [] \ No newline at end of file diff --git a/test_apps/python_app/tests/configs/target/bad_default_targets.toml b/test_apps/python_app/tests/configs/target/bad_default_targets.toml new file mode 100644 index 00000000..c5a61317 --- /dev/null +++ b/test_apps/python_app/tests/configs/target/bad_default_targets.toml @@ -0,0 +1 @@ +target = ["eagle", "unknown"] diff --git a/test_apps/python_app/tests/configs/target/empty_default_targets.toml b/test_apps/python_app/tests/configs/target/empty_default_targets.toml new file mode 100644 index 00000000..2bd1c12b --- /dev/null +++ b/test_apps/python_app/tests/configs/target/empty_default_targets.toml @@ -0,0 +1 @@ +target = [] diff --git a/test_apps/python_app/tests/configs_test.py b/test_apps/python_app/tests/configs_test.py new file mode 100644 index 00000000..fd81aa7a --- /dev/null +++ b/test_apps/python_app/tests/configs_test.py @@ -0,0 +1,49 @@ +import pathlib +from cli.shared import CLICommon + +class TestBadConfigs(CLICommon): + @property + def bad_ldap_config_path(self): + # TODO use a shared method for LDAP config path + return pathlib.Path(__file__).parent.joinpath("origen_utilities/configs/ldap/test_bad_ldap_config.toml").absolute() + + @property + def missing_toml(self): + return self.to_config_path("missing.toml").absolute() + + @property + def eval_m(self): + return "hello from eval" + + def test_origen_v(self): + err = self.cmds.v.gen_error( + return_full=True, + run_opts=self.no_config_run_opts_plus_config(self.bad_ldap_config_path) + ) + assert err["returncode"] == 1 + p = pathlib.Path("tests/origen_utilities/configs/ldap/test_bad_ldap_config.toml") + assert f"invalid type: string \"hi\", expected an integer for key `ldaps.bad.timeout` in {str(p)}" in err["stdout"] + assert err["stderr"] == "" + + def test_origen_cmd(self): + err = self.cmds.eval.gen_error( + f"print( '{self.eval_m}' )", + return_full=True, + run_opts=self.no_config_run_opts_plus_config(self.bad_ldap_config_path) + ) + assert err["returncode"] == 1 + p = pathlib.Path("tests/origen_utilities/configs/ldap/test_bad_ldap_config.toml") + assert f"invalid type: string \"hi\", expected an integer for key `ldaps.bad.timeout` in {str(p)}" in err["stdout"] + assert self.eval_m not in err["stdout"] + assert err["stderr"] == "" + + def test_bad_config_path(self): + err = self.cmds.eval.gen_error( + f"print( '{self.eval_m}' )", + return_full=True, + run_opts=self.no_config_run_opts_plus_config(self.missing_toml) + ) + assert err["returncode"] == 1 + assert "missing.toml either does not exists or is not accessible" in err["stdout"] + assert self.eval_m not in err["stdout"] + assert err["stderr"] == "" diff --git a/test_apps/python_app/tests/conftest.py b/test_apps/python_app/tests/conftest.py index d0b493c2..e9053a24 100644 --- a/test_apps/python_app/tests/conftest.py +++ b/test_apps/python_app/tests/conftest.py @@ -1,6 +1,10 @@ import os, pytest from ._shared import tmp_dir +pytest.register_assert_rewrite("origen.helpers.regressions") +pytest.register_assert_rewrite("test_apps_shared_test_helpers") +pytest.register_assert_rewrite("cli.tests__core_cmds") + # Move the session store into a local test directory os.environ['origen_session__user_root'] = str(tmp_dir()) os.environ['origen_app_app_session_root'] = str(tmp_dir()) diff --git a/test_apps/python_app/tests/origen_utilities/configs/ldap/test_simple_ldap.toml b/test_apps/python_app/tests/origen_utilities/configs/ldap/test_simple_ldap.toml index e5de02f3..7e551143 100644 --- a/test_apps/python_app/tests/origen_utilities/configs/ldap/test_simple_ldap.toml +++ b/test_apps/python_app/tests/origen_utilities/configs/ldap/test_simple_ldap.toml @@ -1,4 +1,4 @@ [ldaps] [ldaps.simple] server = "ldap://ldap.jumpcloud.com:389" -base = "ou=Users,o=63a333b92aef93fc947e34f7,dc=jumpcloud,dc=com" \ No newline at end of file +base = "ou=Users,o=63a333b92aef93fc947e34f7,dc=jumpcloud,dc=com" diff --git a/test_apps/python_app/tests/plugin_test.py b/test_apps/python_app/tests/plugin_test.py index 17e7d1ca..c53ab08e 100644 --- a/test_apps/python_app/tests/plugin_test.py +++ b/test_apps/python_app/tests/plugin_test.py @@ -2,16 +2,6 @@ import pytest from tests.shared import * -#@pytest.fixture(autouse=True) -#def run_around_tests(): -# global dut -# # Code that will run before each test -# instantiate_dut("dut.falcon") -# dut = origen.dut -# yield -# # Code that will run after each test - - def test_dut_from_a_plugin(): origen.target.load("dut/hawk") assert "python_plugin.blocks.dut.derivatives.hawk.controller.Controller" in str( diff --git a/test_apps/python_app/tests/proc_funcs/target_proc_funcs.py b/test_apps/python_app/tests/proc_funcs/target_proc_funcs.py new file mode 100644 index 00000000..8faf67c9 --- /dev/null +++ b/test_apps/python_app/tests/proc_funcs/target_proc_funcs.py @@ -0,0 +1,96 @@ +def show_target_setup(q, options): + if options and "with_env" in options: + import os + os.environ.update(options["with_env"]) + import origen + origen.target.setup() + q.put(('targets', origen.targets.current)) + +def put_target(origen, q, name): + q.put((f'target_{name}', origen.target.current)) + q.put((f'tester_{name}', origen.tester.target())) + if origen.dut is None: + q.put((f'dut_{name}', origen.dut)) + else: + q.put((f'dut_{name}', origen.dut.name)) + q.put((f'first_load_done_{name}', origen.target.first_load_done)) + q.put((f'setup_pending_{name}', origen.target.setup_pending)) + +def test_loading_targets_set_by_app(q, options): + import origen + put_target(origen, q, "pre_load") + + origen.target.load() + put_target(origen, q, "post_load") + +def test_getting_the_current_target(q, options): + import origen + origen.target.load() + q.put(('current_targets', origen.target.current)) + q.put(('current', origen.target.current)) + +def test_setup_and_load(q, options): + from tests.shared import Targets + + import origen + put_target(origen, q, "pre_setup") + + origen.target.setup([Targets.eagle.name, Targets.uflex.name]) + put_target(origen, q, "post_setup_1") + + origen.target.setup([Targets.falcon.name, Targets.sim.name, Targets.smt7.name]) + put_target(origen, q, "post_setup_2") + + origen.target.load() + put_target(origen, q, "post_load_1_2") + + origen.target.setup([Targets.eagle.name, Targets.sim.name, Targets.uflex.name]) + put_target(origen, q, "post_setup_3") + + origen.target.load() + put_target(origen, q, "post_load_3") + +def test_loading_targets_explicitly(q, options): + from tests.shared import Targets + + import origen + put_target(origen, q, "pre_load") + + origen.target.load(Targets.eagle.name, Targets.smt7.name) + put_target(origen, q, "post_load") + +def test_reloading_targets(q, options): + from tests.shared import Targets + r = "creg0" + + import origen + origen.target.load(Targets.eagle.name, Targets.j750.name) + put_target(origen, q, "pre_config") + q.put(("ast_size_pre_config", len(origen.test_ast()["children"]))) + q.put(("reg_data_pre_config", origen.dut.reg(r).data())) + q.put(("timeset_pre_config", origen.tester.timeset)) + + origen.tester.set_timeset("simple") + origen.dut.arm_debug.switch_to_swd() + origen.dut.reg(r).write(0xC) + + q.put(("ast_size_post_config", len(origen.test_ast()["children"]))) + q.put(("reg_data_post_config", origen.dut.reg(r).data())) + q.put(("timeset_post_config", origen.tester.timeset.name)) + + origen.target.load() + put_target(origen, q, "post_reload") + q.put(("ast_size_post_reload", len(origen.test_ast()["children"]))) + q.put(("reg_data_post_reload", origen.dut.reg(r).data())) + q.put(("timeset_post_reload", origen.tester.timeset)) + +def test_invalid_target(q, options): + from tests.shared import Targets + from tests.cli.core_cmds.target import TargetCLI + import origen + put_target(origen, q, "pre_setup") + + origen.target.setup([Targets.falcon.name, TargetCLI.utn]) + put_target(origen, q, "post_setup") + + origen.target.load() \ No newline at end of file diff --git a/test_apps/python_app/tests/shared/__init__.py b/test_apps/python_app/tests/shared/__init__.py index adb980c9..05886abb 100644 --- a/test_apps/python_app/tests/shared/__init__.py +++ b/test_apps/python_app/tests/shared/__init__.py @@ -1,4 +1,4 @@ -import pytest, pathlib, inspect, os, sys +import pytest, pathlib, inspect import multiprocessing as mp import origen, _origen # pylint: disable=import-error import tests._shared @@ -97,14 +97,108 @@ def in_new_origen_proc(func=None, mod=None, options=None, expect_fail=False): return results -def setenv(q, bypass_config_lookup=None): - import os, inspect, pathlib, sys - if bypass_config_lookup: - os.environ['origen_bypass_config_lookup'] = "1" - os.environ['origen_config_paths'] = str( - pathlib.Path(__file__).parent.joinpath( - f"{inspect.stack()[1].function}.toml").absolute()) - - def instantiate_dut(name): origen.target.load(lambda: origen.app.instantiate_dut(name)) + +class Targets: + class Target: + def __init__(self, name, offset, tester_name=None): + self.name = name + if offset: + self.relative_path = str(pathlib.Path(offset).joinpath(f"{name}.py")) + else: + self.relative_path = f"{name}.py" + self.full_path = str(origen.app.root.joinpath("targets").joinpath(self.rp)) + if tester_name: + self.tester_name = tester_name + + @property + def rp(self): + return self.relative_path + + @property + def fp(self): + return self.full_path + + hawk = Target("hawk", "dut") + falcon = Target("falcon", "dut") + eagle = Target("eagle", "dut") + o1_dut0 = Target("o1_dut0", "dut") + uflex = Target("uflex", "tester", tester_name="ULTRAFLEX") + j750 = Target("j750", "tester", tester_name="J750") + smt7 = Target("v93k_smt7", "tester", tester_name="V93KSMT7") + smt8 = Target("v93k_smt8", "tester", tester_name="V93KSMT8") + sim = Target("sim", "tester", tester_name="SIMULATOR") + eagle_with_smt7 = Target("eagle_with_smt7", None) + eagle_with_simulator = Target("eagle_with_simulator", None) + + def show_per_cmd_targets(self, targets=None, **kwargs): + from tests.cli.shared import CLICommon + prefix = "Current Targets: " + if targets is not None: + if targets is not False: + if not isinstance(targets, list): + targets = [targets] + targets = [(t.name if isinstance(t, Targets.Target) else t) for t in targets] + kwargs.setdefault("run_opts", {})["targets"] = targets + out = CLICommon.eval(f"print( f'{prefix}{{origen.target.current_targets}}' )", **kwargs) + out = out.split("\n") + return eval(next(t.replace(prefix, '') for t in out if t.startswith(prefix))) + + all = [ + eagle, falcon, hawk, o1_dut0, + eagle_with_simulator, eagle_with_smt7, + j750, sim, uflex, smt7, smt8, + ] + + all_rp = [t.rp for t in all] + + class TargetFixtures: + @pytest.fixture + def hawk(self): + return Targets.hawk + + @pytest.fixture + def falcon(self): + return Targets.falcon + + @pytest.fixture + def eagle(self): + return Targets.eagle + + @pytest.fixture + def uflex(self): + return Targets.uflex + + @pytest.fixture + def j750(self): + return Targets.j750 + + @pytest.fixture + def smt7(self): + return Targets.smt7 + + @pytest.fixture + def smt8(self): + return Targets.smt8 + + @pytest.fixture + def sim(self): + return Targets.sim + + @pytest.fixture + def eagle_with_smt7(self): + return Targets.eagle_with_smt7 + + @pytest.fixture + def eagle_with_simulator(self): + return Targets.eagle_with_simulator + +class PythonAppCommon: + targets = Targets() + bypass_origen_app_lookup_env = {"origen_app_bypass_config_lookup": "1", "origen_app_name": "example"} + configs_dir = pathlib.Path(__file__).parent.parent.joinpath("configs") + + @classmethod + def to_config_path(cls, config): + return cls.configs_dir.joinpath(config) \ No newline at end of file diff --git a/test_apps/python_app/tests/target_test.py b/test_apps/python_app/tests/target_test.py new file mode 100644 index 00000000..d96c1d59 --- /dev/null +++ b/test_apps/python_app/tests/target_test.py @@ -0,0 +1,124 @@ +import pytest, origen +from tests.proc_funcs import target_proc_funcs +from origen.helpers.env import in_new_origen_proc +from shared import PythonAppCommon, Targets +from cli.core_cmds.target import TargetCLI + +class TestTarget(PythonAppCommon, Targets.TargetFixtures): + @classmethod + def assert_retn(cls, retn, name, target, tester, dut, first_load_done, setup_pending): + assert retn[f"target_{name}"] == target + assert retn[f"tester_{name}"] == tester + assert retn[f"dut_{name}"] == dut + assert retn[f"first_load_done_{name}"] == first_load_done + assert retn[f"setup_pending_{name}"] == setup_pending + + @classmethod + def assert_pre_setup_retn(cls, retn, name): + assert retn[f"target_{name}"] == None + assert retn[f"tester_{name}"] == [] + assert retn[f"dut_{name}"] == None + assert retn[f"first_load_done_{name}"] == False + assert retn[f"setup_pending_{name}"] == False + + def test_loading_targets_set_by_app(self, eagle_with_smt7, smt7): + TargetCLI.target_cmd.set.run(eagle_with_smt7.name) + retn = in_new_origen_proc(mod=target_proc_funcs) + self.assert_pre_setup_retn(retn, "pre_load") + self.assert_retn(retn, "post_load", [eagle_with_smt7.fp], [smt7.tester_name], "dut", True, False) + + def test_multiple_targets_set_by_app(self, eagle, uflex, j750, sim): + TargetCLI.target_cmd.set.run(eagle.name, uflex.name, j750.name, sim.name) + retn = in_new_origen_proc(func=target_proc_funcs.test_loading_targets_set_by_app) + self.assert_pre_setup_retn(retn, "pre_load") + self.assert_retn( + retn, + "post_load", + [eagle.fp, uflex.fp, j750.fp, sim.fp], + [uflex.tester_name, j750.tester_name, sim.tester_name], + "dut", + True, + False + ) + + def test_getting_the_current_target(self, eagle): + TargetCLI.target_cmd.set.run(eagle.name) + retn = in_new_origen_proc(mod=target_proc_funcs) + t = [eagle.fp] + assert retn['current_targets'] == t + assert retn['current'] == t + assert origen.target == origen.targets + + def test_setup_and_load(self, eagle, uflex, falcon, sim, smt7): + retn = in_new_origen_proc(mod=target_proc_funcs) + self.assert_pre_setup_retn(retn, "pre_setup") + self.assert_retn(retn, "post_setup_1", [eagle.name, uflex.name], [], None, False, True) + self.assert_retn(retn, "post_setup_2", [falcon.name, sim.name, smt7.name], [], None, False, True) + self.assert_retn(retn, "post_load_1_2", [falcon.name, sim.name, smt7.name], [sim.tester_name, smt7.tester_name], "dut", True, False) + self.assert_retn(retn, "post_setup_3", [eagle.name, sim.name, uflex.name], [sim.tester_name, smt7.tester_name], "dut", True, True) + self.assert_retn(retn, "post_load_3", [eagle.name, sim.name, uflex.name], [sim.tester_name, uflex.tester_name], "dut", True, False) + + def test_loading_targets_explicitly(self, eagle, smt7): + retn = in_new_origen_proc(mod=target_proc_funcs) + self.assert_pre_setup_retn(retn, "pre_load") + self.assert_retn(retn, "post_load", [eagle.name, smt7.name], [smt7.tester_name], "dut", True, False) + + def test_reloading_targets(self, eagle, j750): + retn = in_new_origen_proc(mod=target_proc_funcs) + + n = "pre_config" + self.assert_retn(retn, n, [eagle.name, j750.name], [j750.tester_name], "dut", True, False) + assert retn[f"ast_size_{n}"] == 0 + assert retn[f"reg_data_{n}"] == 0 + assert retn[f"timeset_{n}"] is None + + n = "post_config" + assert retn[f"ast_size_{n}"] == 3 + assert retn[f"reg_data_{n}"] == 0xC + assert retn[f"timeset_{n}"] == "simple" + + # AST should remain but DUT and tester are reset + n = "post_reload" + assert retn[f"ast_size_{n}"] == 3 + assert retn[f"reg_data_{n}"] == 0 + assert retn[f"timeset_{n}"] is None + + def test_invalid_target(self, capfd, falcon): + retn = in_new_origen_proc(mod=target_proc_funcs, expect_fail=True) + self.assert_pre_setup_retn(retn, "pre_setup") + self.assert_retn(retn, "post_setup", [falcon.name, TargetCLI.utn], [], None, False, True) + assert TargetCLI.unknown_err_msg in capfd.readouterr().out + + +class TestTargetOpts(PythonAppCommon): + def test_target_can_be_set(self): + targets = self.targets.show_per_cmd_targets(targets=self.targets.eagle) + assert targets == [self.targets.eagle.name] + + targets = self.targets.show_per_cmd_targets(targets=[self.targets.hawk, self.targets.uflex]) + assert targets == [self.targets.hawk.name, self.targets.uflex.name] + + def test_no_target_can_be_used_per_command(self): + targets = self.targets.show_per_cmd_targets() + assert len(targets) != 0 + + targets = self.targets.show_per_cmd_targets(targets=False) + assert len(targets) == 0 + + def test_invalid_target_per_command(self): + u = TargetCLI.utn + t = [self.targets.eagle.name, u] + m = "Should_not_see_from_test_invalid_target_per_command" + # Invalid targets are not an issue until loading + targets = self.targets.show_per_cmd_targets(targets=t) + assert targets == t + + r = TargetCLI.in_app_commands.eval.gen_error( + f"origen.target.load(); print( f'{m}' )", + run_opts={"targets": t}, + return_full=True + ) + assert r["returncode"] == 1 + assert r["stderr"] == '' + assert TargetCLI.unknown_err_msg in r["stdout"] + assert m not in r["stdout"] diff --git a/test_apps/python_app/tests/version_test.py b/test_apps/python_app/tests/version_test.py new file mode 100644 index 00000000..e4788e50 --- /dev/null +++ b/test_apps/python_app/tests/version_test.py @@ -0,0 +1,18 @@ +import origen +from origen_metal.utils.version import Version +from origen_metal._helpers import pip_show + +class TestOrigenVersion: + _current_version = None + + def current_version(self): + if self._current_version is None: + self._current_version = pip_show('origen', wrap_poetry=True).version + return self._current_version + + def test_origen_version(self): + assert isinstance(origen.version, Version) + assert str(origen.version) == self.current_version() + + def test_origen_version_str(self): + assert origen.__version__ == self.current_version() diff --git a/test_apps/python_no_app/commands.toml b/test_apps/python_no_app/commands.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_no_app/origen.toml b/test_apps/python_no_app/origen.toml new file mode 100644 index 00000000..c90241dd --- /dev/null +++ b/test_apps/python_no_app/origen.toml @@ -0,0 +1,94 @@ +# Use this to define your application-specific Origen configuration +# Do not delete it even if you don't use it since it is also used by the Origen +# command line interface to determine when it is in an Origen application workspace + +# Specify what command should be used to invoke python, if not specified +# Origen will try python, python3, python3.8, etc. until one is found that +# satisfies the minimum Python version requirement +#python_cmd = "mypython" + +# If your company has an internal package server enter it here: +#pkg_server = "https://pkgs.company.net:9292" +# or here, if you need to use different urls for push and pull (write and read): +#pkg_server_push = "https://pkgs.company.net:9292" +#pkg_server_pull = "https://pkgs.company.net:9292" + +session__user_root = "./" + +### Users Setup ### +# Various items to customize user data +# +# If any datasets are available, selects which is the default +user__data_lookup_hierarchy = ["test", "backup"] +user__password_cache_option = "session" +# Allows passwords to be stored in the user's session store +# +# User datasets allow for single user to be "registered" in multiple systems +[user__datasets] +[user__datasets.test] +[user__datasets.test2] +[user__datasets.backup] +[user__datasets.dummy_ldap_ds] +category = "ldaps" +data_store = "dummy_ldap" # Corresponds to LDAP name +data_id = "uid" +data_service_user = "dummy_ldap_read_only" +should_validate_password = true +auto_populate = false +[user__datasets.git] +data_store = "git" +auto_populate = false + +# When a password is requested for the given reason, will select the appropriate dataset +[user__dataset_motives] +"rc" = "git" +"just because" = "test2" + +[user__dataset_mappings] +[user__dataset_mappings.dummy_ldap_ds] +email = "mail" +last_name = "sn" +uid = "uid" +full_name = "cn" + +# LDAP configuration +[ldaps] +[ldaps.dummy_ldap] +server = "ldap://ldap.jumpcloud.com:389" +base = "ou=Users,o=63a333b92aef93fc947e34f7,dc=jumpcloud,dc=com" +[ldaps.dummy_ldap.auth] +scheme = "simple_bind" +username = "uid=sponge,ou=Users,o=63a333b92aef93fc947e34f7,dc=jumpcloud,dc=com" +password = "KrabbyPatties#1" + +# Service/functional accounts +[default_users] +[default_users.dummy_ldap_read_only] +username = "uid=sponge,ou=Users,o=63a333b92aef93fc947e34f7,dc=jumpcloud,dc=com" +password = "KrabbyPatties#1" + +[mailer] +server = "smtp.origen.org" +port = 25 +auth_method = "None" +domain = "origen.org" +user = "dummy_ldap_read_only" +timeout = 120 + +[plugins] +collect = false +load = [ + { name = "python_plugin" }, + { name = "python_plugin_the_second" }, + { name = "python_plugin_no_cmds" }, +] + +[[auxillary_commands]] + path = "./tests/cmd_building/cmd_testers" + +[[auxillary_commands]] + name = "python_no_app_aux_cmds" + path = "./tests/dummy_aux_cmds/dummy_aux_cmds.toml" + +[[auxillary_commands]] + path = "../test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns.toml" diff --git a/test_apps/python_no_app/poetry.lock b/test_apps/python_no_app/poetry.lock index edb89088..c17a3534 100644 --- a/test_apps/python_no_app/poetry.lock +++ b/test_apps/python_no_app/poetry.lock @@ -1,59 +1,75 @@ +# This file is automatically @generated by Poetry and should not be changed by hand. + [[package]] -category = "main" -description = "A configurable sidebar-enabled Sphinx theme" name = "alabaster" -optional = false -python-versions = "*" version = "0.7.12" - -[[package]] +description = "A configurable sidebar-enabled Sphinx theme" category = "main" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -name = "appdirs" optional = false python-versions = "*" -version = "1.4.4" - -[[package]] -category = "main" -description = "Atomic file writes." -name = "atomicwrites" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" +files = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] [[package]] -category = "main" -description = "Classes Without Boilerplate" name = "attrs" +version = "22.2.0" +description = "Classes Without Boilerplate" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "21.2.0" +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"}, +] [package.extras] -dev = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +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]] -category = "main" -description = "Internationalization utilities" name = "babel" +version = "2.11.0" +description = "Internationalization utilities" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.9.1" +python-versions = ">=3.6" +files = [ + {file = "Babel-2.11.0-py3-none-any.whl", hash = "sha256:1ad3eca1c885218f6dce2ab67291178944f810a10a9b5f3cb8382a5a232b64fe"}, + {file = "Babel-2.11.0.tar.gz", hash = "sha256:5ef4b3226b0180dedded4229651c8b0e1a3a6a2837d45a073272f313e4cf97f6"}, +] [package.dependencies] pytz = ">=2015.7" [[package]] +name = "backports.cached-property" +version = "1.0.2" +description = "cached_property() - computed once per instance, cached as attribute" category = "main" -description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "backports.cached-property-1.0.2.tar.gz", hash = "sha256:9306f9eed6ec55fd156ace6bc1094e2c86fae5fb2bf07b6a9c00745c656e75dd"}, + {file = "backports.cached_property-1.0.2-py3-none-any.whl", hash = "sha256:baeb28e1cd619a3c9ab8941431fe34e8490861fb998c6c4590693d50171db0cc"}, +] + +[[package]] name = "beautifulsoup4" +version = "4.8.2" +description = "Screen-scraping library" +category = "main" optional = false python-versions = "*" -version = "4.8.2" +files = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] [package.dependencies] soupsieve = ">=1.2" @@ -63,368 +79,797 @@ html5lib = ["html5lib"] lxml = ["lxml"] [[package]] -category = "main" -description = "Dummy package for Beautiful Soup" name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" optional = false python-versions = "*" -version = "0.0.1" +files = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] [package.dependencies] beautifulsoup4 = "*" [[package]] +name = "build" +version = "0.10.0" +description = "A simple, correct Python build frontend" category = "main" -description = "httplib2 caching for requests" -name = "cachecontrol" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.12.6" +python-versions = ">= 3.7" +files = [ + {file = "build-0.10.0-py3-none-any.whl", hash = "sha256:af266720050a66c893a6096a2f410989eeac74ff9a68ba194b3f6473e8e26171"}, + {file = "build-0.10.0.tar.gz", hash = "sha256:d5b71264afdb5951d6704482aac78de887c80691c52b88a9ad195983ca2c9269"}, +] [package.dependencies] -msgpack = ">=0.5.2" -requests = "*" - -[package.dependencies.lockfile] -optional = true -version = ">=0.9" +colorama = {version = "*", markers = "os_name == \"nt\""} +importlib-metadata = {version = ">=0.22", markers = "python_version < \"3.8\""} +packaging = ">=19.0" +pyproject_hooks = "*" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [package.extras] -filecache = ["lockfile (>=0.9)"] -redis = ["redis (>=2.10.5)"] +docs = ["furo (>=2021.08.31)", "sphinx (>=4.0,<5.0)", "sphinx-argparse-cli (>=1.5)", "sphinx-autodoc-typehints (>=1.10)"] +test = ["filelock (>=3)", "pytest (>=6.2.4)", "pytest-cov (>=2.12)", "pytest-mock (>=2)", "pytest-rerunfailures (>=9.1)", "pytest-xdist (>=1.34)", "setuptools (>=42.0.0)", "setuptools (>=56.0.0)", "toml (>=0.10.0)", "wheel (>=0.36.0)"] +typing = ["importlib-metadata (>=5.1)", "mypy (==0.991)", "tomli", "typing-extensions (>=3.7.4.3)"] +virtualenv = ["virtualenv (>=20.0.35)"] [[package]] +name = "cachecontrol" +version = "0.12.12" +description = "httplib2 caching for requests" category = "main" -description = "Cachy provides a simple yet effective caching library." -name = "cachy" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.3.0" +python-versions = ">=3.6" +files = [ + {file = "CacheControl-0.12.12-py2.py3-none-any.whl", hash = "sha256:5986a16897cd296bdb7b86b42e0403c4ca30b9875f0e0c7c8e509b50cff115b7"}, + {file = "CacheControl-0.12.12.tar.gz", hash = "sha256:9c2e5208ea76ebd9921176569743ddf6d7f3bb4188dbf61806f0f8fc48ecad38"}, +] + +[package.dependencies] +filelock = {version = ">=3.8.0", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" [package.extras] -memcached = ["python-memcached (>=1.59,<2.0)"] -msgpack = ["msgpack-python (>=0.5,<0.6)"] -redis = ["redis (>=3.3.6,<4.0.0)"] +filecache = ["filelock (>=3.8.0)"] +redis = ["redis (>=2.10.5)"] [[package]] -category = "main" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" +version = "2022.12.7" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false -python-versions = "*" -version = "2020.12.5" +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"}, +] [[package]] -category = "main" -description = "Foreign Function Interface for Python calling C code." -marker = "python_version >= \"3.6\" and python_version < \"4.0\" and sys_platform == \"linux\"" name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = "*" -version = "1.14.5" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] [package.dependencies] pycparser = "*" [[package]] +name = "charset-normalizer" +version = "2.1.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" -description = "Universal encoding detector for Python 2 and 3" -name = "chardet" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "4.0.0" - -[[package]] -category = "main" -description = "Cleo allows you to create beautiful and testable command-line interfaces." -name = "cleo" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.8.1" +python-versions = ">=3.6.0" +files = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] -[package.dependencies] -clikit = ">=0.6.0,<0.7.0" +[package.extras] +unicode-backport = ["unicodedata2"] [[package]] +name = "cleo" +version = "2.0.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." category = "main" -description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." -name = "clikit" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.6.2" +python-versions = ">=3.7,<4.0" +files = [ + {file = "cleo-2.0.1-py3-none-any.whl", hash = "sha256:6eb133670a3ed1f3b052d53789017b6e50fca66d1287e6e6696285f4cb8ea448"}, + {file = "cleo-2.0.1.tar.gz", hash = "sha256:eb4b2e1f3063c11085cebe489a6e9124163c226575a3c3be69b2e51af4a15ec5"}, +] [package.dependencies] -pastel = ">=0.2.0,<0.3.0" -pylev = ">=1.3,<2.0" - -[package.dependencies.crashtest] -python = ">=3.6,<4.0" -version = ">=0.3.0,<0.4.0" +crashtest = ">=0.4.1,<0.5.0" +rapidfuzz = ">=2.2.0,<3.0.0" [[package]] -category = "main" -description = "Cross-platform colored terminal text." name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.4" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] -category = "main" -description = "Python parser for the CommonMark Markdown spec" name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" optional = false python-versions = "*" -version = "0.9.1" +files = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] [package.extras] -test = ["flake8 (3.7.8)", "hypothesis (3.55.3)"] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] -category = "main" -description = "Manage Python errors with ease" -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "crashtest" +version = "0.4.1" +description = "Manage Python errors with ease" +category = "main" optional = false -python-versions = ">=3.6,<4.0" -version = "0.3.1" +python-versions = ">=3.7,<4.0" +files = [ + {file = "crashtest-0.4.1-py3-none-any.whl", hash = "sha256:8d23eac5fa660409f57472e3851dab7ac18aba459a8d19cbbba86d3d5aecd2a5"}, + {file = "crashtest-0.4.1.tar.gz", hash = "sha256:80d7b1f316ebfbd429f648076d6275c877ba30ba48979de4191714a75266f0ce"}, +] [[package]] -category = "main" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -marker = "python_version >= \"3.6\" and python_version < \"4.0\" and sys_platform == \"linux\"" name = "cryptography" +version = "38.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=3.6" -version = "3.4.7" +files = [ + {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:2fa36a7b2cc0998a3a4d5af26ccb6273f3df133d61da2ba13b3286261e7efb70"}, + {file = "cryptography-38.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:1f13ddda26a04c06eb57119caf27a524ccae20533729f4b1e4a69b54e07035eb"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:2ec2a8714dd005949d4019195d72abed84198d877112abb5a27740e217e0ea8d"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50a1494ed0c3f5b4d07650a68cd6ca62efe8b596ce743a5c94403e6f11bf06c1"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10498349d4c8eab7357a8f9aa3463791292845b79597ad1b98a543686fb1ec8"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:10652dd7282de17990b88679cb82f832752c4e8237f0c714be518044269415db"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:bfe6472507986613dc6cc00b3d492b2f7564b02b3b3682d25ca7f40fa3fd321b"}, + {file = "cryptography-38.0.4-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ce127dd0a6a0811c251a6cddd014d292728484e530d80e872ad9806cfb1c5b3c"}, + {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:53049f3379ef05182864d13bb9686657659407148f901f3f1eee57a733fb4b00"}, + {file = "cryptography-38.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:8a4b2bdb68a447fadebfd7d24855758fe2d6fecc7fed0b78d190b1af39a8e3b0"}, + {file = "cryptography-38.0.4-cp36-abi3-win32.whl", hash = "sha256:1d7e632804a248103b60b16fb145e8df0bc60eed790ece0d12efe8cd3f3e7744"}, + {file = "cryptography-38.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:8e45653fb97eb2f20b8c96f9cd2b3a0654d742b47d638cf2897afbd97f80fa6d"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca57eb3ddaccd1112c18fc80abe41db443cc2e9dcb1917078e02dfa010a4f353"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:c9e0d79ee4c56d841bd4ac6e7697c8ff3c8d6da67379057f29e66acffcd1e9a7"}, + {file = "cryptography-38.0.4-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:0e70da4bdff7601b0ef48e6348339e490ebfb0cbe638e083c9c41fb49f00c8bd"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:998cd19189d8a747b226d24c0207fdaa1e6658a1d3f2494541cb9dfbf7dcb6d2"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67461b5ebca2e4c2ab991733f8ab637a7265bb582f07c7c88914b5afb88cb95b"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4eb85075437f0b1fd8cd66c688469a0c4119e0ba855e3fef86691971b887caf6"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3178d46f363d4549b9a76264f41c6948752183b3f587666aff0555ac50fd7876"}, + {file = "cryptography-38.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6391e59ebe7c62d9902c24a4d8bcbc79a68e7c4ab65863536127c8a9cd94043b"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:78e47e28ddc4ace41dd38c42e6feecfdadf9c3be2af389abbfeef1ff06822285"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fb481682873035600b5502f0015b664abc26466153fab5c6bc92c1ea69d478b"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:4367da5705922cf7070462e964f66e4ac24162e22ab0a2e9d31f1b270dd78083"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b4cad0cea995af760f82820ab4ca54e5471fc782f70a007f31531957f43e9dee"}, + {file = "cryptography-38.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:80ca53981ceeb3241998443c4964a387771588c4e4a5d92735a493af868294f9"}, + {file = "cryptography-38.0.4.tar.gz", hash = "sha256:175c1a818b87c9ac80bb7377f5520b7f31b3ef2a0004e2420319beadedb67290"}, +] [package.dependencies] cffi = ">=1.12" [package.extras] -docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0,<3.1.0 || >3.1.0,<3.1.1 || >3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] sdist = ["setuptools-rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pytz"] [[package]] -category = "main" -description = "Distribution utilities" name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +category = "main" optional = false python-versions = "*" -version = "0.3.1" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] [[package]] -category = "main" -description = "Docutils -- Python Documentation Utilities" name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.17.1" +python-versions = ">=3.7" +files = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] + +[[package]] +name = "dulwich" +version = "0.21.7" +description = "Python Git Library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d4c0110798099bb7d36a110090f2688050703065448895c4f53ade808d889dd3"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2bc12697f0918bee324c18836053644035362bb3983dc1b210318f2fed1d7132"}, + {file = "dulwich-0.21.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:471305af74790827fcbafe330fc2e8bdcee4fb56ca1177c8c481b1c8f806c4a4"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d54c9d0e845be26f65f954dff13a1cd3f2b9739820c19064257b8fd7435ab263"}, + {file = "dulwich-0.21.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:12d61334a575474e707614f2e93d6ed4cdae9eb47214f9277076d9e5615171d3"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e274cebaf345f0b1e3b70197f2651de92b652386b68020cfd3bf61bc30f6eaaa"}, + {file = "dulwich-0.21.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:817822f970e196e757ae01281ecbf21369383285b9f4a83496312204cf889b8c"}, + {file = "dulwich-0.21.7-cp310-cp310-win32.whl", hash = "sha256:7836da3f4110ce684dcd53489015fb7fa94ed33c5276e3318b8b1cbcb5b71e08"}, + {file = "dulwich-0.21.7-cp310-cp310-win_amd64.whl", hash = "sha256:4a043b90958cec866b4edc6aef5fe3c2c96a664d0b357e1682a46f6c477273c4"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ce8db196e79c1f381469410d26fb1d8b89c6b87a4e7f00ff418c22a35121405c"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:62bfb26bdce869cd40be443dfd93143caea7089b165d2dcc33de40f6ac9d812a"}, + {file = "dulwich-0.21.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c01a735b9a171dcb634a97a3cec1b174cfbfa8e840156870384b633da0460f18"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa4d14767cf7a49c9231c2e52cb2a3e90d0c83f843eb6a2ca2b5d81d254cf6b9"}, + {file = "dulwich-0.21.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bca4b86e96d6ef18c5bc39828ea349efb5be2f9b1f6ac9863f90589bac1084d"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a7b5624b02ef808cdc62dabd47eb10cd4ac15e8ac6df9e2e88b6ac6b40133673"}, + {file = "dulwich-0.21.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c3a539b4696a42fbdb7412cb7b66a4d4d332761299d3613d90a642923c7560e1"}, + {file = "dulwich-0.21.7-cp311-cp311-win32.whl", hash = "sha256:675a612ce913081beb0f37b286891e795d905691dfccfb9bf73721dca6757cde"}, + {file = "dulwich-0.21.7-cp311-cp311-win_amd64.whl", hash = "sha256:460ba74bdb19f8d498786ae7776745875059b1178066208c0fd509792d7f7bfc"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4c51058ec4c0b45dc5189225b9e0c671b96ca9713c1daf71d622c13b0ab07681"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4bc4c5366eaf26dda3fdffe160a3b515666ed27c2419f1d483da285ac1411de0"}, + {file = "dulwich-0.21.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a0650ec77d89cb947e3e4bbd4841c96f74e52b4650830112c3057a8ca891dc2f"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f18f0a311fb7734b033a3101292b932158cade54b74d1c44db519e42825e5a2"}, + {file = "dulwich-0.21.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c589468e5c0cd84e97eb7ec209ab005a2cb69399e8c5861c3edfe38989ac3a8"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d62446797163317a397a10080c6397ffaaca51a7804c0120b334f8165736c56a"}, + {file = "dulwich-0.21.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e84cc606b1f581733df4350ca4070e6a8b30be3662bbb81a590b177d0c996c91"}, + {file = "dulwich-0.21.7-cp312-cp312-win32.whl", hash = "sha256:c3d1685f320907a52c40fd5890627945c51f3a5fa4bcfe10edb24fec79caadec"}, + {file = "dulwich-0.21.7-cp312-cp312-win_amd64.whl", hash = "sha256:6bd69921fdd813b7469a3c77bc75c1783cc1d8d72ab15a406598e5a3ba1a1503"}, + {file = "dulwich-0.21.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d8ab29c660125db52106775caa1f8f7f77a69ed1fe8bc4b42bdf115731a25bf"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0d2e4485b98695bf95350ce9d38b1bb0aaac2c34ad00a0df789aa33c934469b"}, + {file = "dulwich-0.21.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e138d516baa6b5bafbe8f030eccc544d0d486d6819b82387fc0e285e62ef5261"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f34bf9b9fa9308376263fd9ac43143c7c09da9bc75037bb75c6c2423a151b92c"}, + {file = "dulwich-0.21.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e2c66888207b71cd1daa2acb06d3984a6bc13787b837397a64117aa9fc5936a"}, + {file = "dulwich-0.21.7-cp37-cp37m-win32.whl", hash = "sha256:10893105c6566fc95bc2a67b61df7cc1e8f9126d02a1df6a8b2b82eb59db8ab9"}, + {file = "dulwich-0.21.7-cp37-cp37m-win_amd64.whl", hash = "sha256:460b3849d5c3d3818a80743b4f7a0094c893c559f678e56a02fff570b49a644a"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:74700e4c7d532877355743336c36f51b414d01e92ba7d304c4f8d9a5946dbc81"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c92e72c43c9e9e936b01a57167e0ea77d3fd2d82416edf9489faa87278a1cdf7"}, + {file = "dulwich-0.21.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d097e963eb6b9fa53266146471531ad9c6765bf390849230311514546ed64db2"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:808e8b9cc0aa9ac74870b49db4f9f39a52fb61694573f84b9c0613c928d4caf8"}, + {file = "dulwich-0.21.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1957b65f96e36c301e419d7adaadcff47647c30eb072468901bb683b1000bc5"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4b09bc3a64fb70132ec14326ecbe6e0555381108caff3496898962c4136a48c6"}, + {file = "dulwich-0.21.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5882e70b74ac3c736a42d3fdd4f5f2e6570637f59ad5d3e684760290b58f041"}, + {file = "dulwich-0.21.7-cp38-cp38-win32.whl", hash = "sha256:29bb5c1d70eba155ded41ed8a62be2f72edbb3c77b08f65b89c03976292f6d1b"}, + {file = "dulwich-0.21.7-cp38-cp38-win_amd64.whl", hash = "sha256:25c3ab8fb2e201ad2031ddd32e4c68b7c03cb34b24a5ff477b7a7dcef86372f5"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8929c37986c83deb4eb500c766ee28b6670285b512402647ee02a857320e377c"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc1e11be527ac06316539b57a7688bcb1b6a3e53933bc2f844397bc50734e9ae"}, + {file = "dulwich-0.21.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0fc3078a1ba04c588fabb0969d3530efd5cd1ce2cf248eefb6baf7cbc15fc285"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40dcbd29ba30ba2c5bfbab07a61a5f20095541d5ac66d813056c122244df4ac0"}, + {file = "dulwich-0.21.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8869fc8ec3dda743e03d06d698ad489b3705775fe62825e00fa95aa158097fc0"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d96ca5e0dde49376fbcb44f10eddb6c30284a87bd03bb577c59bb0a1f63903fa"}, + {file = "dulwich-0.21.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0064363bd5e814359657ae32517fa8001e8573d9d040bd997908d488ab886ed"}, + {file = "dulwich-0.21.7-cp39-cp39-win32.whl", hash = "sha256:869eb7be48243e695673b07905d18b73d1054a85e1f6e298fe63ba2843bb2ca1"}, + {file = "dulwich-0.21.7-cp39-cp39-win_amd64.whl", hash = "sha256:404b8edeb3c3a86c47c0a498699fc064c93fa1f8bab2ffe919e8ab03eafaaad3"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e598d743c6c0548ebcd2baf94aa9c8bfacb787ea671eeeb5828cfbd7d56b552f"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4a2d76c96426e791556836ef43542b639def81be4f1d6d4322cd886c115eae1"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6c88acb60a1f4d31bd6d13bfba465853b3df940ee4a0f2a3d6c7a0778c705b7"}, + {file = "dulwich-0.21.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ecd315847dea406a4decfa39d388a2521e4e31acde3bd9c2609c989e817c6d62"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d05d3c781bc74e2c2a2a8f4e4e2ed693540fbe88e6ac36df81deac574a6dad99"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6de6f8de4a453fdbae8062a6faa652255d22a3d8bce0cd6d2d6701305c75f2b3"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e25953c7acbbe4e19650d0225af1c0c0e6882f8bddd2056f75c1cc2b109b88ad"}, + {file = "dulwich-0.21.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:4637cbd8ed1012f67e1068aaed19fcc8b649bcf3e9e26649826a303298c89b9d"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:858842b30ad6486aacaa607d60bab9c9a29e7c59dc2d9cb77ae5a94053878c08"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:739b191f61e1c4ce18ac7d520e7a7cbda00e182c3489552408237200ce8411ad"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:274c18ec3599a92a9b67abaf110e4f181a4f779ee1aaab9e23a72e89d71b2bd9"}, + {file = "dulwich-0.21.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2590e9b431efa94fc356ae33b38f5e64f1834ec3a94a6ac3a64283b206d07aa3"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ed60d1f610ef6437586f7768254c2a93820ccbd4cfdac7d182cf2d6e615969bb"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8278835e168dd097089f9e53088c7a69c6ca0841aef580d9603eafe9aea8c358"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffc27fb063f740712e02b4d2f826aee8bbed737ed799962fef625e2ce56e2d29"}, + {file = "dulwich-0.21.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:61e3451bd3d3844f2dca53f131982553be4d1b1e1ebd9db701843dd76c4dba31"}, + {file = "dulwich-0.21.7.tar.gz", hash = "sha256:a9e9c66833cea580c3ac12927e4b9711985d76afca98da971405d414de60e968"}, +] + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version <= \"3.7\""} +urllib3 = ">=1.25" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +paramiko = ["paramiko"] +pgp = ["gpg"] [[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" category = "main" -description = "A platform independent file lock." -name = "filelock" optional = false -python-versions = "*" -version = "3.0.12" +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] [[package]] +name = "filelock" +version = "3.12.2" +description = "A platform independent file lock." category = "main" -description = "HTML parser based on the WHATWG HTML specification" +optional = false +python-versions = ">=3.7" +files = [ + {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, + {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] + +[[package]] name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.1" +files = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] [package.dependencies] six = ">=1.9" webencodings = "*" [package.extras] -all = ["genshi", "chardet (>=2.2)", "lxml"] +all = ["chardet (>=2.2)", "genshi", "lxml"] chardet = ["chardet (>=2.2)"] genshi = ["genshi"] lxml = ["lxml"] [[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.10" +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] -category = "main" -description = "Getting image size from png/jpeg/jpeg2000/gif file" name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] [[package]] -category = "main" -description = "Read metadata from Python packages" -marker = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"3.8\"" name = "importlib-metadata" +version = "6.7.0" +description = "Read metadata from Python packages" +category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.7.0" +python-versions = ">=3.7" +files = [ + {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, + {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, +] [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["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-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] -category = "main" -description = "Read resources from Python packages" -marker = "python_version < \"3.7\"" name = "importlib-resources" +version = "5.10.2" +description = "Read resources from Python packages" +category = "main" optional = false -python-versions = ">=3.6" -version = "5.1.3" +python-versions = ">=3.7" +files = [ + {file = "importlib_resources-5.10.2-py3-none-any.whl", hash = "sha256:7d543798b0beca10b6a01ac7cafda9f822c54db9e8376a6bf57e0cbd74d486b6"}, + {file = "importlib_resources-5.10.2.tar.gz", hash = "sha256:e4a96c8cc0339647ff9a5e0550d9f276fc5a01ffa276012b58ec108cfd7b8484"}, +] [package.dependencies] -[package.dependencies.zipp] -python = "<3.8" -version = ">=0.4" +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" category = "main" -description = "Low-level, pure Python DBus protocol wrapper." -marker = "python_version >= \"3.6\" and python_version < \"4.0\" and sys_platform == \"linux\"" -name = "jeepney" optional = false -python-versions = ">=3.6" -version = "0.6.0" - -[package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio"] +python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] +name = "installer" +version = "0.7.0" +description = "A library for installing Python wheels." category = "main" -description = "A very fast and expressive template engine." -name = "jinja2" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.3" - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] +python-versions = ">=3.7" +files = [ + {file = "installer-0.7.0-py3-none-any.whl", hash = "sha256:05d1933f0a5ba7d8d6296bb6d5018e7c94fa473ceb10cf198a92ccea19c27b53"}, + {file = "installer-0.7.0.tar.gz", hash = "sha256:a26d3e3116289bb08216e0d0f7d925fcef0b0194eedfa0c944bcaaa106c4b631"}, +] [[package]] +name = "jaraco.classes" +version = "3.2.3" +description = "Utility functions for Python class constructs" category = "main" -description = "Store and access your passwords safely." -marker = "python_version >= \"3.6\" and python_version < \"4.0\"" -name = "keyring" optional = false -python-versions = ">=3.6" -version = "21.8.0" +python-versions = ">=3.7" +files = [ + {file = "jaraco.classes-3.2.3-py3-none-any.whl", hash = "sha256:2353de3288bc6b82120752201c6b1c1a14b058267fa424ed5ce5984e3b922158"}, + {file = "jaraco.classes-3.2.3.tar.gz", hash = "sha256:89559fa5c1d3c34eff6f631ad80bb21f378dbcbb35dd161fd2c6b93f5be2f98a"}, +] [package.dependencies] -SecretStorage = ">=3.2" -jeepney = ">=0.4.2" -pywin32-ctypes = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=1" +more-itertools = "*" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." category = "main" -description = "Platform-independent file locking module" -name = "lockfile" optional = false -python-versions = "*" -version = "0.12.2" +python-versions = ">=3.7" +files = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] + +[package.extras] +test = ["async-timeout", "pytest", "pytest-asyncio (>=0.17)", "pytest-trio", "testpath", "trio"] +trio = ["async_generator", "trio"] [[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." category = "main" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -name = "lxml" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" -version = "4.4.2" +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" [package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] -source = ["Cython (>=0.29.7)"] +i18n = ["Babel (>=2.7)"] [[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" category = "main" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -name = "mako" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.0" +python-versions = ">=3.7" +files = [ + {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, + {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, +] [package.dependencies] -MarkupSafe = ">=0.9.2" +attrs = ">=17.4.0" +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} -[[package]] -category = "main" -description = "Safely add untrusted strings to HTML/XML markup." -name = "markupsafe" -optional = false -python-versions = ">=3.6" -version = "2.0.1" +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] +name = "keyring" +version = "23.13.1" +description = "Store and access your passwords safely." category = "main" -description = "More routines for operating on iterables, beyond itertools" -name = "more-itertools" optional = false -python-versions = ">=3.5" -version = "8.7.0" +python-versions = ">=3.7" +files = [ + {file = "keyring-23.13.1-py3-none-any.whl", hash = "sha256:771ed2a91909389ed6148631de678f82ddc73737d85a927f382a8a1b157898cd"}, + {file = "keyring-23.13.1.tar.gz", hash = "sha256:ba2e15a9b35e21908d0aaf4e0a47acc52d6ae33444df0da2b49d41a46ef6d678"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.11.4", markers = "python_version < \"3.12\""} +importlib-resources = {version = "*", markers = "python_version < \"3.9\""} +"jaraco.classes" = "*" +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +completion = ["shtab"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] [[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" category = "main" -description = "MessagePack (de)serializer." -name = "msgpack" optional = false python-versions = "*" -version = "1.0.2" +files = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] + +[[package]] +name = "mako" +version = "1.1.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] + +[[package]] +name = "more-itertools" +version = "9.0.0" +description = "More routines for operating on iterables, beyond itertools" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "more-itertools-9.0.0.tar.gz", hash = "sha256:5a6257e40878ef0520b1803990e3e22303a41b5714006c32a3fd8304b26ea1ab"}, + {file = "more_itertools-9.0.0-py3-none-any.whl", hash = "sha256:250e83d7e81d0c87ca6bd942e6aeab8cc9daa6096d12c5308f3f92fa5e5c1f41"}, +] + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] [[package]] -category = "main" -description = "" -develop = true name = "origen" +version = "2.0.0.dev8" +description = "Semiconductor Developer's Kit" +category = "main" optional = false -python-versions = "^3.6" -version = "2.0.0.dev4" +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true [package.dependencies] -Jinja2 = "^2" beautifulsoup4 = "4.8.2" bs4 = "0.0.1" colorama = "^0.4" -lxml = "4.4.2" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" mako = "1.1.0" origen_autoapi = "2.0.1" -poetry = "1.1.2" -pyreadline = "^2.1" +origen_metal = "~0.4.1.dev1" +poetry = "^1.1.14" recommonmark = ">= 0" sphinx = "3.0.2" sphinxbootstrap4theme = ">= 0" @@ -432,230 +877,540 @@ termcolor = ">= 1.1.0" yapf = "0.30" [package.source] -reference = "" type = "directory" -url = "../../python" +url = "../../python/origen" [[package]] -category = "main" -description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." name = "origen-autoapi" +version = "2.0.1" +description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." +category = "main" optional = false python-versions = "*" -version = "2.0.1" +files = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] [package.dependencies] sphinx = "*" [[package]] +name = "origen-metal" +version = "0.4.1.dev1" +description = "Bare metal APIs for the Origen SDK" category = "main" -description = "Core utilities for Python packages" -name = "packaging" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "20.9" +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true [package.dependencies] -pyparsing = ">=2.0.2" +colorama = ">= 0.4.4" +importlib-metadata = ">= 6.7.0" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../python/origen_metal" [[package]] +name = "packaging" +version = "22.0" +description = "Core utilities for Python packages" category = "main" -description = "Bring colors to your terminal." -name = "pastel" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.2.1" +python-versions = ">=3.7" +files = [ + {file = "packaging-22.0-py3-none-any.whl", hash = "sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"}, + {file = "packaging-22.0.tar.gz", hash = "sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3"}, +] [[package]] -category = "main" -description = "Pexpect allows easy control of interactive console applications." name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" optional = false python-versions = "*" -version = "4.8.0" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] [package.dependencies] ptyprocess = ">=0.5" [[package]] -category = "main" -description = "Query metadatdata from sdists / bdists / installed packages." name = "pkginfo" +version = "1.9.6" +description = "Query metadata from sdists / bdists / installed packages." +category = "main" optional = false -python-versions = "*" -version = "1.7.0" +python-versions = ">=3.6" +files = [ + {file = "pkginfo-1.9.6-py3-none-any.whl", hash = "sha256:4b7a555a6d5a22169fcc9cf7bfd78d296b0361adad412a346c1226849af5e546"}, + {file = "pkginfo-1.9.6.tar.gz", hash = "sha256:8fd5896e8718a4372f0ea9cc9d96f6417c9b986e23a4d116dda26b62cc29d046"}, +] [package.extras] -testing = ["nose", "coverage"] +testing = ["pytest", "pytest-cov"] [[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." category = "main" -description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "pl-ext-cmds" +version = "0.1.0" +description = "Plugin Extending Cmds" +category = "main" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +origen_metal = ">=0.0.0" + +[package.source] +type = "directory" +url = "../pl_ext_cmds" + +[[package]] +name = "platformdirs" +version = "3.11.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.7.1", markers = "python_version < \"3.8\""} + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" +python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] -category = "main" -description = "Python dependency management and packaging made easy." name = "poetry" +version = "1.5.1" +description = "Python dependency management and packaging made easy." +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.1.2" +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry-1.5.1-py3-none-any.whl", hash = "sha256:dfc7ce3a38ae216c0465694e2e674bef6eb1a2ba81aa47a26f9dc03362fe2f5f"}, + {file = "poetry-1.5.1.tar.gz", hash = "sha256:cc7ea4524d1a11558006224bfe8ba8ed071417d4eb5ef6c89decc6a37d437eeb"}, +] [package.dependencies] -cachy = ">=0.3.0,<0.4.0" -cleo = ">=0.8.1,<0.9.0" -clikit = ">=0.6.2,<0.7.0" +"backports.cached-property" = {version = ">=1.0.2,<2.0.0", markers = "python_version < \"3.8\""} +build = ">=0.10.0,<0.11.0" +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"]} +cleo = ">=2.0.0,<3.0.0" +crashtest = ">=0.4.1,<0.5.0" +dulwich = ">=0.21.2,<0.22.0" +filelock = ">=3.8.0,<4.0.0" html5lib = ">=1.0,<2.0" -packaging = ">=20.4,<21.0" +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} +installer = ">=0.7.0,<0.8.0" +jsonschema = ">=4.10.0,<5.0.0" +keyring = ">=23.9.0,<24.0.0" +lockfile = ">=0.12.2,<0.13.0" +packaging = ">=20.4" pexpect = ">=4.7.0,<5.0.0" -pkginfo = ">=1.4,<2.0" -poetry-core = ">=1.0.0,<2.0.0" +pkginfo = ">=1.9.4,<2.0.0" +platformdirs = ">=3.0.0,<4.0.0" +poetry-core = "1.6.1" +poetry-plugin-export = ">=1.4.0,<2.0.0" +pyproject-hooks = ">=1.0.0,<2.0.0" requests = ">=2.18,<3.0" -requests-toolbelt = ">=0.9.1,<0.10.0" -shellingham = ">=1.1,<2.0" -tomlkit = ">=0.7.0,<1.0.0" -virtualenv = ">=20.0.26,<21.0.0" - -[package.dependencies.cachecontrol] -extras = ["filecache"] -version = ">=0.12.4,<0.13.0" - -[package.dependencies.crashtest] -python = ">=3.6,<4.0" -version = ">=0.3.0,<0.4.0" +requests-toolbelt = ">=0.9.1,<2" +shellingham = ">=1.5,<2.0" +tomli = {version = ">=2.0.1,<3.0.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.11.4,<1.0.0" +trove-classifiers = ">=2022.5.19" +urllib3 = ">=1.26.0,<2.0.0" +virtualenv = ">=20.22.0,<21.0.0" +xattr = {version = ">=0.10.0,<0.11.0", markers = "sys_platform == \"darwin\""} -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=1.6.0,<2.0.0" +[[package]] +name = "poetry-core" +version = "1.6.1" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_core-1.6.1-py3-none-any.whl", hash = "sha256:70707340447dee0e7f334f9495ae652481c67b32d8d218f296a376ac2ed73573"}, + {file = "poetry_core-1.6.1.tar.gz", hash = "sha256:0f9b0de39665f36d6594657e7d57b6f463cc10f30c28e6d1c3b9ff54c26c9ac3"}, +] -[package.dependencies.keyring] -python = ">=3.6,<4.0" -version = ">=21.2.0,<22.0.0" +[package.dependencies] +importlib-metadata = {version = ">=1.7.0", markers = "python_version < \"3.8\""} [[package]] +name = "poetry-plugin-export" +version = "1.4.0" +description = "Poetry plugin to export the dependencies to various formats" category = "main" -description = "Poetry PEP 517 Build Backend" -name = "poetry-core" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.0.3" +python-versions = ">=3.7,<4.0" +files = [ + {file = "poetry_plugin_export-1.4.0-py3-none-any.whl", hash = "sha256:5d9186d6f77cf2bf35fc96bd11fe650cc7656e515b17d99cb65018d50ba22589"}, + {file = "poetry_plugin_export-1.4.0.tar.gz", hash = "sha256:f16974cd9f222d4ef640fa97a8d661b04d4fb339e51da93973f1bc9d578e183f"}, +] [package.dependencies] -[package.dependencies.importlib-metadata] -python = ">=2.7,<2.8 || >=3.5,<3.8" -version = ">=1.7.0,<2.0.0" +poetry = ">=1.5.0,<2.0.0" +poetry-core = ">=1.6.0,<2.0.0" [[package]] -category = "main" -description = "Run a subprocess in a pseudo terminal" name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" optional = false python-versions = "*" -version = "0.7.0" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] [[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" category = "main" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.10.0" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] [[package]] +name = "pygments" +version = "2.13.0" +description = "Pygments is a syntax highlighting package written in Python." category = "main" -description = "C parser in Python" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" and sys_platform == \"linux\"" -name = "pycparser" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.20" +python-versions = ">=3.6" +files = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] + +[package.extras] +plugins = ["importlib-metadata"] [[package]] +name = "pyproject-hooks" +version = "1.0.0" +description = "Wrappers to call pyproject.toml-based build backend hooks." category = "main" -description = "Pygments is a syntax highlighting package written in Python." -name = "pygments" optional = false -python-versions = ">=3.5" -version = "2.9.0" +python-versions = ">=3.7" +files = [ + {file = "pyproject_hooks-1.0.0-py3-none-any.whl", hash = "sha256:283c11acd6b928d2f6a7c73fa0d01cb2bdc5f07c57a2eeb6e83d5e56b97976f8"}, + {file = "pyproject_hooks-1.0.0.tar.gz", hash = "sha256:f271b298b97f5955d53fb12b72c1fb1948c22c1a6b70b315c54cedaca0264ef5"}, +] + +[package.dependencies] +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} [[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." category = "main" -description = "A pure Python Levenshtein implementation that's not freaking GPL'd." -name = "pylev" optional = false python-versions = "*" -version = "1.3.0" +files = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.2" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6982b5a0237e1b7d876b60265564648a69b14017f3b5f908c5be2de3f9abb7a"}, + {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:187d5730b0507d9285a96fca9716310d572e5464cadd19f22b63a6976254d77a"}, + {file = "pyrsistent-0.19.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:055ab45d5911d7cae397dc418808d8802fb95262751872c841c170b0dbf51eed"}, + {file = "pyrsistent-0.19.2-cp310-cp310-win32.whl", hash = "sha256:456cb30ca8bff00596519f2c53e42c245c09e1a4543945703acd4312949bfd41"}, + {file = "pyrsistent-0.19.2-cp310-cp310-win_amd64.whl", hash = "sha256:b39725209e06759217d1ac5fcdb510e98670af9e37223985f330b611f62e7425"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aede922a488861de0ad00c7630a6e2d57e8023e4be72d9d7147a9fcd2d30712"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:879b4c2f4d41585c42df4d7654ddffff1239dc4065bc88b745f0341828b83e78"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c43bec251bbd10e3cb58ced80609c5c1eb238da9ca78b964aea410fb820d00d6"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-win32.whl", hash = "sha256:d690b18ac4b3e3cab73b0b7aa7dbe65978a172ff94970ff98d82f2031f8971c2"}, + {file = "pyrsistent-0.19.2-cp37-cp37m-win_amd64.whl", hash = "sha256:3ba4134a3ff0fc7ad225b6b457d1309f4698108fb6b35532d015dca8f5abed73"}, + {file = "pyrsistent-0.19.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a178209e2df710e3f142cbd05313ba0c5ebed0a55d78d9945ac7a4e09d923308"}, + {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e371b844cec09d8dc424d940e54bba8f67a03ebea20ff7b7b0d56f526c71d584"}, + {file = "pyrsistent-0.19.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111156137b2e71f3a9936baf27cb322e8024dac3dc54ec7fb9f0bcf3249e68bb"}, + {file = "pyrsistent-0.19.2-cp38-cp38-win32.whl", hash = "sha256:e5d8f84d81e3729c3b506657dddfe46e8ba9c330bf1858ee33108f8bb2adb38a"}, + {file = "pyrsistent-0.19.2-cp38-cp38-win_amd64.whl", hash = "sha256:9cd3e9978d12b5d99cbdc727a3022da0430ad007dacf33d0bf554b96427f33ab"}, + {file = "pyrsistent-0.19.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f1258f4e6c42ad0b20f9cfcc3ada5bd6b83374516cd01c0960e3cb75fdca6770"}, + {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21455e2b16000440e896ab99e8304617151981ed40c29e9507ef1c2e4314ee95"}, + {file = "pyrsistent-0.19.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfd880614c6237243ff53a0539f1cb26987a6dc8ac6e66e0c5a40617296a045e"}, + {file = "pyrsistent-0.19.2-cp39-cp39-win32.whl", hash = "sha256:71d332b0320642b3261e9fee47ab9e65872c2bd90260e5d225dabeed93cbd42b"}, + {file = "pyrsistent-0.19.2-cp39-cp39-win_amd64.whl", hash = "sha256:dec3eac7549869365fe263831f576c8457f6c833937c68542d08fde73457d291"}, + {file = "pyrsistent-0.19.2-py3-none-any.whl", hash = "sha256:ea6b79a02a28550c98b6ca9c35b9f492beaa54d7c5c9e9949555893c8a9234d0"}, + {file = "pyrsistent-0.19.2.tar.gz", hash = "sha256:bfa0351be89c9fcbcb8c9879b826f4353be10f58f8a677efab0c017bf7137ec2"}, +] [[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" category = "main" -description = "Python parsing module" -name = "pyparsing" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +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", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] +name = "python-plugin" +version = "0.1.0" +description = "Example Origen Plugin" category = "main" -description = "A python implmementation of GNU readline." -marker = "sys_platform == \"win32\"" -name = "pyreadline" optional = false -python-versions = "*" -version = "2.1" +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} + +[package.source] +type = "directory" +url = "../python_plugin" [[package]] +name = "python-plugin-no-cmds" +version = "0.1.0" +description = "Example Origen Plugin Without Any Commands" category = "main" -description = "pytest: simple powerful testing with Python" -name = "pytest" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.10.1" +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true [package.dependencies] -atomicwrites = ">=1.0" -attrs = ">=17.4.0" -colorama = "*" -more-itertools = ">=4.0.0" -pluggy = ">=0.7" -py = ">=1.5.0" -setuptools = "*" -six = ">=1.10.0" +origen = {path = "../../python/origen", develop = true} +origen_metal = {path = "../../python/origen_metal", develop = true} + +[package.source] +type = "directory" +url = "../python_plugin_no_cmds" [[package]] +name = "python-plugin-the-second" +version = "0.1.0" +description = "Another Example Origen Plugin" category = "main" -description = "World timezone definitions, modern and historical" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +origen_metal = {path = "../../python/origen_metal", develop = true} + +[package.source] +type = "directory" +url = "../python_plugin_the_second" + +[[package]] name = "pytz" +version = "2022.7" +description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" -version = "2021.1" +files = [ + {file = "pytz-2022.7-py2.py3-none-any.whl", hash = "sha256:93007def75ae22f7cd991c84e02d434876818661f8df9ad5df9e950ff4e52cfd"}, + {file = "pytz-2022.7.tar.gz", hash = "sha256:7ccfae7b4b2c067464a6733c6261673fdb8fd1be905460396b97a073e9fa683a"}, +] [[package]] -category = "main" -description = "" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" and sys_platform == \"win32\"" name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" optional = false python-versions = "*" -version = "0.2.0" +files = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] + +[[package]] +name = "rapidfuzz" +version = "2.13.7" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b75dd0928ce8e216f88660ab3d5c5ffe990f4dd682fd1709dba29d5dafdde6de"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24d3fea10680d085fd0a4d76e581bfb2b1074e66e78fd5964d4559e1fcd2a2d4"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8109e0324d21993d5b2d111742bf5958f3516bf8c59f297c5d1cc25a2342eb66"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f705652360d520c2de52bee11100c92f59b3e3daca308ebb150cbc58aecdad"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7496e8779905b02abc0ab4ba2a848e802ab99a6e20756ffc967a0de4900bd3da"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24eb6b843492bdc63c79ee4b2f104059b7a2201fef17f25177f585d3be03405a"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:467c1505362823a5af12b10234cb1c4771ccf124c00e3fc9a43696512bd52293"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53dcae85956853b787c27c1cb06f18bb450e22cf57a4ad3444cf03b8ff31724a"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46b9b8aa09998bc48dd800854e8d9b74bc534d7922c1d6e1bbf783e7fa6ac29c"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1fbad8fb28d98980f5bff33c7842efef0315d42f0cd59082108482a7e6b61410"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:43fb8cb030f888c3f076d40d428ed5eb4331f5dd6cf1796cfa39c67bf0f0fc1e"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b6bad92de071cbffa2acd4239c1779f66851b60ffbbda0e4f4e8a2e9b17e7eef"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d00df2e4a81ffa56a6b1ec4d2bc29afdcb7f565e0b8cd3092fece2290c4c7a79"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-win32.whl", hash = "sha256:2c836f0f2d33d4614c3fbaf9a1eb5407c0fe23f8876f47fd15b90f78daa64c34"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-win_amd64.whl", hash = "sha256:c36fd260084bb636b9400bb92016c6bd81fd80e59ed47f2466f85eda1fc9f782"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b34e8c0e492949ecdd5da46a1cfc856a342e2f0389b379b1a45a3cdcd3176a6e"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:875d51b3497439a72e2d76183e1cb5468f3f979ab2ddfc1d1f7dde3b1ecfb42f"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae33a72336059213996fe4baca4e0e4860913905c2efb7c991eab33b95a98a0a"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5585189b3d90d81ccd62d4f18530d5ac8972021f0aaaa1ffc6af387ff1dce75"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42085d4b154a8232767de8296ac39c8af5bccee6b823b0507de35f51c9cbc2d7"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:585206112c294e335d84de5d5f179c0f932837752d7420e3de21db7fdc476278"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f891b98f8bc6c9d521785816085e9657212621e93f223917fb8e32f318b2957e"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08590905a95ccfa43f4df353dcc5d28c15d70664299c64abcad8721d89adce4f"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b5dd713a1734574c2850c566ac4286594bacbc2d60b9170b795bee4b68656625"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:988f8f6abfba7ee79449f8b50687c174733b079521c3cc121d65ad2d38831846"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b3210869161a864f3831635bb13d24f4708c0aa7208ef5baac1ac4d46e9b4208"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f6fe570e20e293eb50491ae14ddeef71a6a7e5f59d7e791393ffa99b13f1f8c2"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6120f2995f5154057454c5de99d86b4ef3b38397899b5da1265467e8980b2f60"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-win32.whl", hash = "sha256:b20141fa6cee041917801de0bab503447196d372d4c7ee9a03721b0a8edf5337"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-win_amd64.whl", hash = "sha256:ec55a81ac2b0f41b8d6fb29aad16e55417036c7563bad5568686931aa4ff08f7"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d005e058d86f2a968a8d28ca6f2052fab1f124a39035aa0523261d6baf21e1f"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe59a0c21a032024edb0c8e43f5dee5623fef0b65a1e3c1281836d9ce199af3b"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfc04f7647c29fb48da7a04082c34cdb16f878d3c6d098d62d5715c0ad3000c"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68a89bb06d5a331511961f4d3fa7606f8e21237467ba9997cae6f67a1c2c2b9e"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:effe182767d102cb65dfbbf74192237dbd22d4191928d59415aa7d7c861d8c88"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25b4cedf2aa19fb7212894ce5f5219010cce611b60350e9a0a4d492122e7b351"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9bd02e1679c0fd2ecf69b72d0652dbe2a9844eaf04a36ddf4adfbd70010e95"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5e2b3d020219baa75f82a4e24b7c8adcb598c62f0e54e763c39361a9e5bad510"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:cf62dacb3f9234f3fddd74e178e6d25c68f2067fde765f1d95f87b1381248f58"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:fa263135b892686e11d5b84f6a1892523123a00b7e5882eff4fbdabb38667347"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa4c598ed77f74ec973247ca776341200b0f93ec3883e34c222907ce72cb92a4"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-win32.whl", hash = "sha256:c2523f8180ebd9796c18d809e9a19075a1060b1a170fde3799e83db940c1b6d5"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-win_amd64.whl", hash = "sha256:5ada0a14c67452358c1ee52ad14b80517a87b944897aaec3e875279371a9cb96"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ca8a23097c1f50e0fdb4de9e427537ca122a18df2eead06ed39c3a0bef6d9d3a"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9be02162af0376d64b840f2fc8ee3366794fc149f1e06d095a6a1d42447d97c5"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af4f7c3c904ca709493eb66ca9080b44190c38e9ecb3b48b96d38825d5672559"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f50d1227e6e2a0e3ae1fb1c9a2e1c59577d3051af72c7cab2bcc430cb5e18da"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c71d9d512b76f05fa00282227c2ae884abb60e09f08b5ca3132b7e7431ac7f0d"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b52ac2626945cd21a2487aeefed794c14ee31514c8ae69b7599170418211e6f6"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca00fafd2756bc9649bf80f1cf72c647dce38635f0695d7ce804bc0f759aa756"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d248a109699ce9992304e79c1f8735c82cc4c1386cd8e27027329c0549f248a2"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c88adbcb933f6b8612f6c593384bf824e562bb35fc8a0f55fac690ab5b3486e5"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8601a66fbfc0052bb7860d2eacd303fcde3c14e87fdde409eceff516d659e77"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:27be9c63215d302ede7d654142a2e21f0d34ea6acba512a4ae4cfd52bbaa5b59"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3dcffe1f3cbda0dc32133a2ae2255526561ca594f15f9644384549037b355245"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8450d15f7765482e86ef9be2ad1a05683cd826f59ad236ef7b9fb606464a56aa"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-win32.whl", hash = "sha256:460853983ab88f873173e27cc601c5276d469388e6ad6e08c4fd57b2a86f1064"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-win_amd64.whl", hash = "sha256:424f82c35dbe4f83bdc3b490d7d696a1dc6423b3d911460f5493b7ffae999fd2"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c3fbe449d869ea4d0909fc9d862007fb39a584fb0b73349a6aab336f0d90eaed"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16080c05a63d6042643ae9b6cfec1aefd3e61cef53d0abe0df3069b9d4b72077"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dbcf5371ea704759fcce772c66a07647751d1f5dbdec7818331c9b31ae996c77"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:114810491efb25464016fd554fdf1e20d390309cecef62587494fc474d4b926f"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a84ab9ac9a823e7e93b4414f86344052a5f3e23b23aa365cda01393ad895bd"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81642a24798851b118f82884205fc1bd9ff70b655c04018c467824b6ecc1fabc"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3741cb0bf9794783028e8b0cf23dab917fa5e37a6093b94c4c2f805f8e36b9f"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:759a3361711586a29bc753d3d1bdb862983bd9b9f37fbd7f6216c24f7c972554"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1333fb3d603d6b1040e365dca4892ba72c7e896df77a54eae27dc07db90906e3"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:916bc2e6cf492c77ad6deb7bcd088f0ce9c607aaeabc543edeb703e1fbc43e31"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:23524635840500ce6f4d25005c9529a97621689c85d2f727c52eed1782839a6a"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ebe303cd9839af69dd1f7942acaa80b1ba90bacef2e7ded9347fbed4f1654672"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe56659ccadbee97908132135de4b875543353351e0c92e736b7c57aee298b5a"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-win32.whl", hash = "sha256:3f11a7eff7bc6301cd6a5d43f309e22a815af07e1f08eeb2182892fca04c86cb"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-win_amd64.whl", hash = "sha256:e8914dad106dacb0775718e54bf15e528055c4e92fb2677842996f2d52da5069"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f7930adf84301797c3f09c94b9c5a9ed90a9e8b8ed19b41d2384937e0f9f5bd"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31022d9970177f6affc6d5dd757ed22e44a10890212032fabab903fdee3bfe7"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f42b82f268689f429def9ecfb86fa65ceea0eaf3fed408b570fe113311bf5ce7"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b477b43ced896301665183a5e0faec0f5aea2373005648da8bdcb3c4b73f280"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d63def9bbc6b35aef4d76dc740301a4185867e8870cbb8719ec9de672212fca8"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c66546e30addb04a16cd864f10f5821272a1bfe6462ee5605613b4f1cb6f7b48"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f799d1d6c33d81e983d3682571cc7d993ae7ff772c19b3aabb767039c33f6d1e"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82f20c0060ffdaadaf642b88ab0aa52365b56dffae812e188e5bdb998043588"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042644133244bfa7b20de635d500eb9f46af7097f3d90b1724f94866f17cb55e"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75c45dcd595f8178412367e302fd022860ea025dc4a78b197b35428081ed33d5"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d8b081988d0a49c486e4e845a547565fee7c6e7ad8be57ff29c3d7c14c6894c"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16ffad751f43ab61001187b3fb4a9447ec2d1aedeff7c5bac86d3b95f9980cc3"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020858dd89b60ce38811cd6e37875c4c3c8d7fcd8bc20a0ad2ed1f464b34dc4e"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda1e2f66bb4ba7261a0f4c2d052d5d909798fca557cbff68f8a79a87d66a18f"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6389c50d8d214c9cd11a77f6d501529cb23279a9c9cafe519a3a4b503b5f72a"}, + {file = "rapidfuzz-2.13.7.tar.gz", hash = "sha256:8d3e252d4127c79b4d7c2ae47271636cbaca905c8bb46d80c7930ab906cf4b5c"}, +] + +[package.extras] +full = ["numpy"] [[package]] -category = "main" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" optional = false python-versions = "*" -version = "0.7.1" +files = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] [package.dependencies] commonmark = ">=0.8.1" @@ -663,96 +1418,144 @@ docutils = ">=0.11" sphinx = ">=1.3.1" [[package]] -category = "main" -description = "Python HTTP for Humans." name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.25.1" +python-versions = ">=3.7, <4" +files = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<5" -idna = ">=2.5,<3" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] -category = "main" -description = "A utility belt for advanced users of python-requests" name = "requests-toolbelt" +version = "0.10.1" +description = "A utility belt for advanced users of python-requests" +category = "main" optional = false -python-versions = "*" -version = "0.9.1" +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"}, +] [package.dependencies] requests = ">=2.0.1,<3.0.0" [[package]] -category = "main" -description = "Python bindings to FreeDesktop.org Secret Service API" -marker = "python_version >= \"3.6\" and python_version < \"4.0\" and sys_platform == \"linux\"" name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" optional = false python-versions = ">=3.6" -version = "3.3.1" +files = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] [package.dependencies] cryptography = ">=2.0" jeepney = ">=0.6" [[package]] +name = "setuptools" +version = "67.7.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" -description = "Tool to Detect Surrounding Shell" -name = "shellingham" optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" -version = "1.4.0" +python-versions = ">=3.7" +files = [ + {file = "setuptools-67.7.2-py3-none-any.whl", hash = "sha256:23aaf86b85ca52ceb801d32703f12d77517b2556af839621c641fca11287952b"}, + {file = "setuptools-67.7.2.tar.gz", hash = "sha256:f104fa03692a2602fa0fec6c6a9e63b6c8a968de13e17c026957dd1f53d80990"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "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", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] +name = "shellingham" +version = "1.5.0" +description = "Tool to Detect Surrounding Shell" category = "main" -description = "Python 2 and 3 compatibility utilities" -name = "six" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.16.0" +python-versions = ">=3.4" +files = [ + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, +] [[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" category = "main" -description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -name = "snowballstemmer" optional = false -python-versions = "*" -version = "2.1.0" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." category = "main" -description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" optional = false python-versions = ">=3.6" -version = "2.2.1" +files = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] [[package]] -category = "main" -description = "Python documentation generator" name = "sphinx" +version = "3.0.2" +description = "Python documentation generator" +category = "main" optional = false python-versions = ">=3.5" -version = "3.0.2" +files = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] [package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3" -colorama = ">=0.3.5" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} docutils = ">=0.12" imagesize = "*" +Jinja2 = ">=2.3" packaging = "*" +Pygments = ">=2.0" requests = ">=2.5.0" setuptools = "*" snowballstemmer = ">=1.1" @@ -765,604 +1568,362 @@ sphinxcontrib-serializinghtml = "*" [package.extras] docs = ["sphinxcontrib-websupport"] -lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] -test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] +lint = ["docutils-stubs", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)"] +test = ["cython", "html5lib", "pytest", "pytest-cov", "typed-ast"] [[package]] -category = "main" -description = "Sphinx Bootstrap4 Theme" name = "sphinxbootstrap4theme" +version = "0.6.0" +description = "Sphinx Bootstrap4 Theme" +category = "main" optional = false python-versions = "*" -version = "0.6.0" +files = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] [[package]] -category = "main" -description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "main" optional = false python-versions = ">=3.5" -version = "1.0.2" +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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] -category = "main" -description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" optional = false python-versions = ">=3.5" -version = "1.0.2" +files = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] -category = "main" -description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" optional = false -python-versions = ">=3.5" -version = "1.0.3" +python-versions = ">=3.6" +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"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] -test = ["pytest", "html5lib"] +lint = ["docutils-stubs", "flake8", "mypy"] +test = ["html5lib", "pytest"] [[package]] -category = "main" -description = "A sphinx extension which renders display math in HTML via JavaScript" name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" optional = false python-versions = ">=3.5" -version = "1.0.1" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] [package.extras] -test = ["pytest", "flake8", "mypy"] +test = ["flake8", "mypy", "pytest"] [[package]] -category = "main" -description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" optional = false python-versions = ">=3.5" -version = "1.0.3" +files = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] -category = "main" -description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" optional = false python-versions = ">=3.5" -version = "1.1.4" +files = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] [package.extras] -lint = ["flake8", "mypy", "docutils-stubs"] +lint = ["docutils-stubs", "flake8", "mypy"] test = ["pytest"] [[package]] -category = "main" -description = "ANSII Color formatting for output in terminal." name = "termcolor" +version = "2.1.1" +description = "ANSI color formatting for output in terminal" +category = "main" optional = false -python-versions = "*" -version = "1.1.0" +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.1.1-py3-none-any.whl", hash = "sha256:fa852e957f97252205e105dd55bbc23b419a70fec0085708fc0515e399f304fd"}, + {file = "termcolor-2.1.1.tar.gz", hash = "sha256:67cee2009adc6449c650f6bcf3bdeed00c8ba53a8cda5362733c53e0a39fb70b"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] [[package]] +name = "test-apps-shared-test-helpers" +version = "0.1.0" +description = "Shared Regression Test Helpers for Test Apps" category = "main" -description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7.0,<3.13" +files = [] +develop = true + +[package.dependencies] +origen = {path = "../../python/origen", develop = true} +pl_ext_cmds = {path = "../pl_ext_cmds", develop = true} +pytest = ">=7.2.1" + +[package.source] +type = "directory" +url = "../test_apps_shared_test_helpers" + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] name = "tomlkit" +version = "0.11.6" +description = "Style preserving TOML library" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.7.1" +python-versions = ">=3.6" +files = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] [[package]] +name = "trove-classifiers" +version = "2022.12.22" +description = "Canonical source for classifiers on PyPI (pypi.org)." category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = "*" +files = [ + {file = "trove-classifiers-2022.12.22.tar.gz", hash = "sha256:fe0fe3f085987161aee2a5a853c7cc7cdf64515c5965d57ad968fdd8cc3b0362"}, + {file = "trove_classifiers-2022.12.22-py3-none-any.whl", hash = "sha256:f0013fd4ce06cfae879a2580ab6acc3d51ec93ecb364d6c061b6c77b44dd72de"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] name = "urllib3" +version = "1.26.13" +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.*, <4" -version = "1.26.4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.13-py2.py3-none-any.whl", hash = "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc"}, + {file = "urllib3-1.26.13.tar.gz", hash = "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"}, +] [package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] +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)"] [[package]] -category = "main" -description = "Virtual Python Environment builder" name = "virtualenv" +version = "20.25.0" +description = "Virtual Python Environment builder" +category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "20.4.6" +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, +] [package.dependencies] -appdirs = ">=1.4.3,<2" -distlib = ">=0.3.1,<1" -filelock = ">=3.0.0,<4" -six = ">=1.9.0,<2" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.importlib-resources] -python = "<3.7" -version = ">=1.0" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +importlib-metadata = {version = ">=6.6", markers = "python_version < \"3.8\""} +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)", "xonsh (>=0.9.16)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] -category = "main" -description = "Character encoding aliases for legacy web content" name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" optional = false python-versions = "*" -version = "0.5.1" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] [[package]] +name = "xattr" +version = "0.10.1" +description = "Python wrapper for extended filesystem attributes" category = "main" -description = "A formatter for Python code." -name = "yapf" optional = false python-versions = "*" -version = "0.30.0" +files = [ + {file = "xattr-0.10.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:16a660a883e703b311d1bbbcafc74fa877585ec081cd96e8dd9302c028408ab1"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1e2973e72faa87ca29d61c23b58c3c89fe102d1b68e091848b0e21a104123503"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:13279fe8f7982e3cdb0e088d5cb340ce9cbe5ef92504b1fd80a0d3591d662f68"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1dc9b9f580ef4b8ac5e2c04c16b4d5086a611889ac14ecb2e7e87170623a0b75"}, + {file = "xattr-0.10.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:485539262c2b1f5acd6b6ea56e0da2bc281a51f74335c351ea609c23d82c9a79"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:295b3ab335fcd06ca0a9114439b34120968732e3f5e9d16f456d5ec4fa47a0a2"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a126eb38e14a2f273d584a692fe36cff760395bf7fc061ef059224efdb4eb62c"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:b0e919c24f5b74428afa91507b15e7d2ef63aba98e704ad13d33bed1288dca81"}, + {file = "xattr-0.10.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:e31d062cfe1aaeab6ba3db6bd255f012d105271018e647645941d6609376af18"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:209fb84c09b41c2e4cf16dd2f481bb4a6e2e81f659a47a60091b9bcb2e388840"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c4120090dac33eddffc27e487f9c8f16b29ff3f3f8bcb2251b2c6c3f974ca1e1"}, + {file = "xattr-0.10.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3e739d624491267ec5bb740f4eada93491de429d38d2fcdfb97b25efe1288eca"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2677d40b95636f3482bdaf64ed9138fb4d8376fb7933f434614744780e46e42d"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40039f1532c4456fd0f4c54e9d4e01eb8201248c321c6c6856262d87e9a99593"}, + {file = "xattr-0.10.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:148466e5bb168aba98f80850cf976e931469a3c6eb11e9880d9f6f8b1e66bd06"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0aedf55b116beb6427e6f7958ccd80a8cbc80e82f87a4cd975ccb61a8d27b2ee"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3024a9ff157247c8190dd0eb54db4a64277f21361b2f756319d9d3cf20e475f"}, + {file = "xattr-0.10.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f1be6e733e9698f645dbb98565bb8df9b75e80e15a21eb52787d7d96800e823b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7880c8a54c18bc091a4ce0adc5c6d81da1c748aec2fe7ac586d204d6ec7eca5b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:89c93b42c3ba8aedbc29da759f152731196c2492a2154371c0aae3ef8ba8301b"}, + {file = "xattr-0.10.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6b905e808df61b677eb972f915f8a751960284358b520d0601c8cbc476ba2df6"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1ef954d0655f93a34d07d0cc7e02765ec779ff0b59dc898ee08c6326ad614d5"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:199b20301b6acc9022661412346714ce764d322068ef387c4de38062474db76c"}, + {file = "xattr-0.10.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec0956a8ab0f0d3f9011ba480f1e1271b703d11542375ef73eb8695a6bd4b78b"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffcb57ca1be338d69edad93cf59aac7c6bb4dbb92fd7bf8d456c69ea42f7e6d2"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f0563196ee54756fe2047627d316977dc77d11acd7a07970336e1a711e934db"}, + {file = "xattr-0.10.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc354f086f926a1c7f04886f97880fed1a26d20e3bc338d0d965fd161dbdb8ab"}, + {file = "xattr-0.10.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0cd2d02ef2fb45ecf2b0da066a58472d54682c6d4f0452dfe7ae2f3a76a42ea"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:49626096ddd72dcc1654aadd84b103577d8424f26524a48d199847b5d55612d0"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ceaa26bef8fcb17eb59d92a7481c2d15d20211e217772fb43c08c859b01afc6a"}, + {file = "xattr-0.10.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c014c371391f28f8cd27d73ea59f42b30772cd640b5a2538ad4f440fd9190b"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:46c32cd605673606b9388a313b0050ee7877a0640d7561eea243ace4fa2cc5a6"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:772b22c4ff791fe5816a7c2a1c9fcba83f9ab9bea138eb44d4d70f34676232b4"}, + {file = "xattr-0.10.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:183ad611a2d70b5a3f5f7aadef0fcef604ea33dcf508228765fd4ddac2c7321d"}, + {file = "xattr-0.10.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8068df3ebdfa9411e58d5ae4a05d807ec5994645bb01af66ec9f6da718b65c5b"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bc40570155beb85e963ae45300a530223d9822edfdf09991b880e69625ba38a"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:436e1aaf23c07e15bed63115f1712d2097e207214fc6bcde147c1efede37e2c5"}, + {file = "xattr-0.10.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7298455ccf3a922d403339781b10299b858bb5ec76435445f2da46fb768e31a5"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:986c2305c6c1a08f78611eb38ef9f1f47682774ce954efb5a4f3715e8da00d5f"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5dc6099e76e33fa3082a905fe59df766b196534c705cf7a2e3ad9bed2b8a180e"}, + {file = "xattr-0.10.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:042ad818cda6013162c0bfd3816f6b74b7700e73c908cde6768da824686885f8"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9d4c306828a45b41b76ca17adc26ac3dc00a80e01a5ba85d71df2a3e948828f2"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a606280b0c9071ef52572434ecd3648407b20df3d27af02c6592e84486b05894"}, + {file = "xattr-0.10.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5b49d591cf34cda2079fd7a5cb2a7a1519f54dc2e62abe3e0720036f6ed41a85"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b8705ac6791426559c1a5c2b88bb2f0e83dc5616a09b4500899bfff6a929302"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5ea974930e876bc5c146f54ac0f85bb39b7b5de2b6fc63f90364712ae368ebe"}, + {file = "xattr-0.10.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f55a2dd73a12a1ae5113c5d9cd4b4ab6bf7950f4d76d0a1a0c0c4264d50da61d"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:475c38da0d3614cc5564467c4efece1e38bd0705a4dbecf8deeb0564a86fb010"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:925284a4a28e369459b2b7481ea22840eed3e0573a4a4c06b6b0614ecd27d0a7"}, + {file = "xattr-0.10.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa32f1b45fed9122bed911de0fcc654da349e1f04fa4a9c8ef9b53e1cc98b91e"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5d3d0e728bace64b74c475eb4da6148cd172b2d23021a1dcd055d92f17619ac"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8faaacf311e2b5cc67c030c999167a78a9906073e6abf08eaa8cf05b0416515c"}, + {file = "xattr-0.10.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cc6b8d5ca452674e1a96e246a3d2db5f477aecbc7c945c73f890f56323e75203"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3725746a6502f40f72ef27e0c7bfc31052a239503ff3eefa807d6b02a249be22"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:789bd406d1aad6735e97b20c6d6a1701e1c0661136be9be862e6a04564da771f"}, + {file = "xattr-0.10.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9a7a807ab538210ff8532220d8fc5e2d51c212681f63dbd4e7ede32543b070f"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3e5825b5fc99ecdd493b0cc09ec35391e7a451394fdf623a88b24726011c950d"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:80638d1ce7189dc52f26c234cee3522f060fadab6a8bc3562fe0ddcbe11ba5a4"}, + {file = "xattr-0.10.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3ff0dbe4a6ce2ce065c6de08f415bcb270ecfd7bf1655a633ddeac695ce8b250"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5267e5f9435c840d2674194150b511bef929fa7d3bc942a4a75b9eddef18d8d8"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b27dfc13b193cb290d5d9e62f806bb9a99b00cd73bb6370d556116ad7bb5dc12"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:636ebdde0277bce4d12d2ef2550885804834418fee0eb456b69be928e604ecc4"}, + {file = "xattr-0.10.1-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d60c27922ec80310b45574351f71e0dd3a139c5295e8f8b19d19c0010196544f"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b34df5aad035d0343bd740a95ca30db99b776e2630dca9cc1ba8e682c9cc25ea"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f24a7c04ff666d0fe905dfee0a84bc899d624aeb6dccd1ea86b5c347f15c20c1"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3878e1aff8eca64badad8f6d896cb98c52984b1e9cd9668a3ab70294d1ef92d"}, + {file = "xattr-0.10.1-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4abef557028c551d59cf2fb3bf63f2a0c89f00d77e54c1c15282ecdd56943496"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0e14bd5965d3db173d6983abdc1241c22219385c22df8b0eb8f1846c15ce1fee"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f9be588a4b6043b03777d50654c6079af3da60cc37527dbb80d36ec98842b1e"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bc4ae264aa679aacf964abf3ea88e147eb4a22aea6af8c6d03ebdebd64cfd6"}, + {file = "xattr-0.10.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:827b5a97673b9997067fde383a7f7dc67342403093b94ea3c24ae0f4f1fec649"}, + {file = "xattr-0.10.1.tar.gz", hash = "sha256:c12e7d81ffaa0605b3ac8c22c2994a8e18a9cf1c59287a1b7722a2289c952ec5"}, +] + +[package.dependencies] +cffi = ">=1.0" [[package]] +name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." category = "main" -description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\" or python_version < \"3.8\" or python_version >= \"3.6\" and python_version < \"3.8\"" +optional = false +python-versions = "*" +files = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] + +[[package]] name = "zipp" +version = "3.11.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" optional = false -python-versions = ">=3.6" -version = "3.4.1" +python-versions = ">=3.7" +files = [ + {file = "zipp-3.11.0-py3-none-any.whl", hash = "sha256:83a28fcb75844b5c0cdaf5aa4003c2d728c77e05f5aeabe8e95e56727005fbaa"}, + {file = "zipp-3.11.0.tar.gz", hash = "sha256:a7a22e05929290a67401440b39690ae6563279bced5f314609d9d03798f56766"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)"] +testing = ["flake8 (<5)", "func-timeout", "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)"] [metadata] -content-hash = "35c04b3e3aad2e621c267ccda212dbbdcc99bf571ac90258ab9e1a6ee79be974" -lock-version = "1.0" -python-versions = "^3.6" - -[metadata.files] -alabaster = [ - {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, - {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, - {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, - {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, -] -bs4 = [ - {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, -] -cachecontrol = [ - {file = "CacheControl-0.12.6-py2.py3-none-any.whl", hash = "sha256:10d056fa27f8563a271b345207402a6dcce8efab7e5b377e270329c62471b10d"}, - {file = "CacheControl-0.12.6.tar.gz", hash = "sha256:be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8"}, -] -cachy = [ - {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, - {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, -] -certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, -] -cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, - {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, -] -cleo = [ - {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, - {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, -] -clikit = [ - {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, - {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, -] -commonmark = [ - {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, - {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, -] -crashtest = [ - {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, - {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, -] -cryptography = [ - {file = "cryptography-3.4.7-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:3d8427734c781ea5f1b41d6589c293089704d4759e34597dce91014ac125aad1"}, - {file = "cryptography-3.4.7-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:8e56e16617872b0957d1c9742a3f94b43533447fd78321514abbe7db216aa250"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:37340614f8a5d2fb9aeea67fd159bfe4f5f4ed535b1090ce8ec428b2f15a11f2"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:240f5c21aef0b73f40bb9f78d2caff73186700bf1bc6b94285699aff98cc16c6"}, - {file = "cryptography-3.4.7-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:1e056c28420c072c5e3cb36e2b23ee55e260cb04eee08f702e0edfec3fb51959"}, - {file = "cryptography-3.4.7-cp36-abi3-win32.whl", hash = "sha256:0f1212a66329c80d68aeeb39b8a16d54ef57071bf22ff4e521657b27372e327d"}, - {file = "cryptography-3.4.7-cp36-abi3-win_amd64.whl", hash = "sha256:de4e5f7f68220d92b7637fc99847475b59154b7a1b3868fb7385337af54ac9ca"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:26965837447f9c82f1855e0bc8bc4fb910240b6e0d16a664bb722df3b5b06873"}, - {file = "cryptography-3.4.7-pp36-pypy36_pp73-manylinux2014_x86_64.whl", hash = "sha256:eb8cc2afe8b05acbd84a43905832ec78e7b3873fb124ca190f574dca7389a87d"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:7ec5d3b029f5fa2b179325908b9cd93db28ab7b85bb6c1db56b10e0b54235177"}, - {file = "cryptography-3.4.7-pp37-pypy37_pp73-manylinux2014_x86_64.whl", hash = "sha256:ee77aa129f481be46f8d92a1a7db57269a2f23052d5f2433b4621bb457081cc9"}, - {file = "cryptography-3.4.7.tar.gz", hash = "sha256:3d10de8116d25649631977cb37da6cbdd2d6fa0e0281d014a5b7d337255ca713"}, -] -distlib = [ - {file = "distlib-0.3.1-py2.py3-none-any.whl", hash = "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb"}, - {file = "distlib-0.3.1.zip", hash = "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1"}, -] -docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, -] -filelock = [ - {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, - {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, -] -html5lib = [ - {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, - {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -imagesize = [ - {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, - {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, -] -importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, -] -importlib-resources = [ - {file = "importlib_resources-5.1.3-py3-none-any.whl", hash = "sha256:3b9c774e0e7e8d9c069eb2fe6aee7e9ae71759a381dec02eb45249fba7f38713"}, - {file = "importlib_resources-5.1.3.tar.gz", hash = "sha256:0786b216556e53b34156263ab654406e543a8b0d9b1381019e25a36a09263c36"}, -] -jeepney = [ - {file = "jeepney-0.6.0-py3-none-any.whl", hash = "sha256:aec56c0eb1691a841795111e184e13cad504f7703b9a64f63020816afa79a8ae"}, - {file = "jeepney-0.6.0.tar.gz", hash = "sha256:7d59b6622675ca9e993a6bd38de845051d315f8b0c72cca3aef733a20b648657"}, -] -jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] -keyring = [ - {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, - {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, -] -lockfile = [ - {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, - {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, -] -lxml = [ - {file = "lxml-4.4.2-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:7b4fc7b1ecc987ca7aaf3f4f0e71bbfbd81aaabf87002558f5bc95da3a865bcd"}, - {file = "lxml-4.4.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f6ed60a62c5f1c44e789d2cf14009423cb1646b44a43e40a9cf6a21f077678a1"}, - {file = "lxml-4.4.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4fcc472ef87f45c429d3b923b925704aa581f875d65bac80f8ab0c3296a63f78"}, - {file = "lxml-4.4.2-cp27-cp27m-win32.whl", hash = "sha256:ad9b81351fdc236bda538efa6879315448411a81186c836d4b80d6ca8217cdb9"}, - {file = "lxml-4.4.2-cp27-cp27m-win_amd64.whl", hash = "sha256:8f54f0924d12c47a382c600c880770b5ebfc96c9fd94cf6f6bdc21caf6163ea7"}, - {file = "lxml-4.4.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:217262fcf6a4c2e1c7cb1efa08bd9ebc432502abc6c255c4abab611e8be0d14d"}, - {file = "lxml-4.4.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:6e74d5f4d6ecd6942375c52ffcd35f4318a61a02328f6f1bd79fcb4ffedf969e"}, - {file = "lxml-4.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:13cf89be53348d1c17b453867da68704802966c433b2bb4fa1f970daadd2ef70"}, - {file = "lxml-4.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:cf4650942de5e5685ad308e22bcafbccfe37c54aa7c0e30cd620c2ee5c93d336"}, - {file = "lxml-4.4.2-cp35-cp35m-win32.whl", hash = "sha256:0571e607558665ed42e450d7bf0e2941d542c18e117b1ebbf0ba72f287ad841c"}, - {file = "lxml-4.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:3213f753e8ae86c396e0e066866e64c6b04618e85c723b32ecb0909885211f74"}, - {file = "lxml-4.4.2-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:4690984a4dee1033da0af6df0b7a6bde83f74e1c0c870623797cec77964de34d"}, - {file = "lxml-4.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0e3f04a7615fdac0be5e18b2406529521d6dbdb0167d2a690ee328bef7807487"}, - {file = "lxml-4.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e301055deadfedbd80cf94f2f65ff23126b232b0d1fea28f332ce58137bcdb18"}, - {file = "lxml-4.4.2-cp36-cp36m-win32.whl", hash = "sha256:223e544828f1955daaf4cefbb4853bc416b2ec3fd56d4f4204a8b17007c21250"}, - {file = "lxml-4.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:c3c289762cc09735e2a8f8a49571d0e8b4f57ea831ea11558247b5bdea0ac4db"}, - {file = "lxml-4.4.2-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:00ac0d64949fef6b3693813fe636a2d56d97a5a49b5bbb86e4cc4cc50ebc9ea2"}, - {file = "lxml-4.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cfcbc33c9c59c93776aa41ab02e55c288a042211708b72fdb518221cc803abc8"}, - {file = "lxml-4.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:61409bd745a265a742f2693e4600e4dbd45cc1daebe1d5fad6fcb22912d44145"}, - {file = "lxml-4.4.2-cp37-cp37m-win32.whl", hash = "sha256:678f1963f755c5d9f5f6968dded7b245dd1ece8cf53c1aa9d80e6734a8c7f41d"}, - {file = "lxml-4.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6c6d03549d4e2734133badb9ab1c05d9f0ef4bcd31d83e5d2b4747c85cfa21da"}, - {file = "lxml-4.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ebbfe24df7f7b5c6c7620702496b6419f6a9aa2fd7f005eb731cc80d7b4692b9"}, - {file = "lxml-4.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:277cb61fede2f95b9c61912fefb3d43fbd5f18bf18a14fae4911b67984486f5d"}, - {file = "lxml-4.4.2-cp38-cp38-win32.whl", hash = "sha256:bbd00e21ea17f7bcc58dccd13869d68441b32899e89cf6cfa90d624a9198ce85"}, - {file = "lxml-4.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:7ed386a40e172ddf44c061ad74881d8622f791d9af0b6f5be20023029129bc85"}, - {file = "lxml-4.4.2.tar.gz", hash = "sha256:eff69ddbf3ad86375c344339371168640951c302450c5d3e9936e98d6459db06"}, -] -mako = [ - {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -more-itertools = [ - {file = "more-itertools-8.7.0.tar.gz", hash = "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713"}, - {file = "more_itertools-8.7.0-py3-none-any.whl", hash = "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced"}, -] -msgpack = [ - {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, - {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192"}, - {file = "msgpack-1.0.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841"}, - {file = "msgpack-1.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f"}, - {file = "msgpack-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2"}, - {file = "msgpack-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc"}, - {file = "msgpack-1.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1"}, - {file = "msgpack-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a"}, - {file = "msgpack-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b"}, - {file = "msgpack-1.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83"}, - {file = "msgpack-1.0.2-cp38-cp38-win32.whl", hash = "sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9"}, - {file = "msgpack-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009"}, - {file = "msgpack-1.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e"}, - {file = "msgpack-1.0.2-cp39-cp39-win32.whl", hash = "sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33"}, - {file = "msgpack-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f"}, - {file = "msgpack-1.0.2.tar.gz", hash = "sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984"}, -] -origen = [] -origen-autoapi = [ - {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, - {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, -] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -pastel = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] -pexpect = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, -] -pkginfo = [ - {file = "pkginfo-1.7.0-py2.py3-none-any.whl", hash = "sha256:9fdbea6495622e022cc72c2e5e1b735218e4ffb2a2a69cde2694a6c1f16afb75"}, - {file = "pkginfo-1.7.0.tar.gz", hash = "sha256:029a70cb45c6171c329dfc890cde0879f8c52d6f3922794796e06f577bb03db4"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -poetry = [ - {file = "poetry-1.1.2-py2.py3-none-any.whl", hash = "sha256:79331ccedcf0710a4b589ba988725d8159518350f883ea290c280623e41dbc43"}, - {file = "poetry-1.1.2.tar.gz", hash = "sha256:acb153b63ebcf01ccc1b42ff2d20e6c8d07cb4aa4914fededcdbbd7546150408"}, -] -poetry-core = [ - {file = "poetry-core-1.0.3.tar.gz", hash = "sha256:2315c928249fc3207801a81868b64c66273077b26c8d8da465dccf8f488c90c5"}, - {file = "poetry_core-1.0.3-py2.py3-none-any.whl", hash = "sha256:c6bde46251112de8384013e1ab8d66e7323d2c75172f80220aba2bc07e208e9a"}, -] -ptyprocess = [ - {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, - {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pygments = [ - {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, - {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, -] -pylev = [ - {file = "pylev-1.3.0-py2.py3-none-any.whl", hash = "sha256:1d29a87beb45ebe1e821e7a3b10da2b6b2f4c79b43f482c2df1a1f748a6e114e"}, - {file = "pylev-1.3.0.tar.gz", hash = "sha256:063910098161199b81e453025653ec53556c1be7165a9b7c50be2f4d57eae1c3"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pyreadline = [ - {file = "pyreadline-2.1.win-amd64.exe", hash = "sha256:9ce5fa65b8992dfa373bddc5b6e0864ead8f291c94fbfec05fbd5c836162e67b"}, - {file = "pyreadline-2.1.win32.exe", hash = "sha256:65540c21bfe14405a3a77e4c085ecfce88724743a4ead47c66b84defcf82c32e"}, - {file = "pyreadline-2.1.zip", hash = "sha256:4530592fc2e85b25b1a9f79664433da09237c1a270e4d78ea5aa3a2c7229e2d1"}, -] -pytest = [ - {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"}, - {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"}, -] -pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, -] -pywin32-ctypes = [ - {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, - {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, -] -recommonmark = [ - {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, - {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, -] -requests = [ - {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, - {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, -] -requests-toolbelt = [ - {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, - {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, -] -secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, -] -shellingham = [ - {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, - {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, - {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, -] -soupsieve = [ - {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"}, - {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, -] -sphinx = [ - {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, - {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, -] -sphinxbootstrap4theme = [ - {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, -] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, - {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, - {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-1.0.3.tar.gz", hash = "sha256:e8f5bb7e31b2dbb25b9cc435c8ab7a79787ebf7f906155729338f3156d93659b"}, - {file = "sphinxcontrib_htmlhelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:3c0bc24a2c41e340ac37c85ced6dafc879ab485c095b1d65d2461ac2f7cca86f"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, - {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.4.tar.gz", hash = "sha256:eaa0eccc86e982a9b939b2b82d12cc5d013385ba5eadcc7e4fed23f4405f77bc"}, - {file = "sphinxcontrib_serializinghtml-1.1.4-py2.py3-none-any.whl", hash = "sha256:f242a81d423f59617a8e5cf16f5d4d74e28ee9a66f9e5b637a18082991db5a9a"}, -] -termcolor = [ - {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, -] -tomlkit = [ - {file = "tomlkit-0.7.1-py2.py3-none-any.whl", hash = "sha256:01227863019024861bb83d9a09a757b1c65604969fd2cebb19f5e2b340649792"}, - {file = "tomlkit-0.7.1.tar.gz", hash = "sha256:24d6049e0765aad9c56a30dfa60d54c69f39c142112a6c57ce8f1c285b6b9d8f"}, -] -urllib3 = [ - {file = "urllib3-1.26.4-py2.py3-none-any.whl", hash = "sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df"}, - {file = "urllib3-1.26.4.tar.gz", hash = "sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"}, -] -virtualenv = [ - {file = "virtualenv-20.4.6-py2.py3-none-any.whl", hash = "sha256:307a555cf21e1550885c82120eccaf5acedf42978fd362d32ba8410f9593f543"}, - {file = "virtualenv-20.4.6.tar.gz", hash = "sha256:72cf267afc04bf9c86ec932329b7e94db6a0331ae9847576daaa7ca3c86b29a4"}, -] -webencodings = [ - {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, - {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, -] -yapf = [ - {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, - {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, -] -zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, -] +lock-version = "2.0" +python-versions = ">=3.7.0,<3.13" +content-hash = "ace8ccb0aa8b785147b25c0985ba9ca6752fd11d59091a05a7e34a4688248b79" diff --git a/test_apps/python_no_app/pyproject.toml b/test_apps/python_no_app/pyproject.toml index 31510669..7d631271 100644 --- a/test_apps/python_no_app/pyproject.toml +++ b/test_apps/python_no_app/pyproject.toml @@ -1,10 +1,20 @@ [tool.poetry] name = "python_no_app" version = "0.1.0" -description = "" +description = "O2 workspace without an application" authors = ["Origen-SDK"] [tool.poetry.dependencies] -python = "^3.6" +python = ">=3.7.0,<3.13" origen = { path = "../../python/origen", develop = true } -pytest = "^3.0" +origen_metal = { path = "../../python/origen_metal", develop = true } +python_plugin = { path = "../python_plugin", develop = true } +python_plugin_the_second = { path = "../python_plugin_the_second", develop = true } +python_plugin_no_cmds = { path = "../python_plugin_no_cmds", develop = true } +test_apps_shared_test_helpers = { path = "../test_apps_shared_test_helpers", develop = true } + +[tool.poetry.dev-dependencies] +pytest = ">=6.0" + +[tool.pytest.ini_options] +addopts = "--ignore=tests/cmd_building/cmd_testers" \ No newline at end of file diff --git a/test_apps/python_no_app/tests/__init__.py b/test_apps/python_no_app/tests/__init__.py new file mode 100644 index 00000000..b915ff3c --- /dev/null +++ b/test_apps/python_no_app/tests/__init__.py @@ -0,0 +1,37 @@ +import sys, pathlib, importlib, contextlib +import pytest + +sys.path.insert(0, str(pathlib.Path(__file__).parent.parent.joinpath("tests"))) + +import tests as python_app_tests +_python_app_tests_root = pathlib.Path(__file__).parent.joinpath( + "../../python_app/tests/__init__.py").resolve() +_python_app_tests_spec = importlib.util.spec_from_file_location( + "python_app_tests", str(_python_app_tests_root)) +_python_app_tests = importlib.util.module_from_spec(_python_app_tests_spec) +sys.modules["python_app_tests"] = _python_app_tests +_python_app_tests_spec.loader.exec_module(_python_app_tests) + +@contextlib.contextmanager +def python_app_shared(): + _tests_modules_ = dict( + filter(lambda mod: mod[0].split('.')[0] == "tests", + sys.modules.items())) + for name, mod in _tests_modules_.items(): + if f"python_app_{name}" in sys.modules: + sys.modules[name] = sys.modules[f"python_app_{name}"] + else: + sys.modules.pop(name) + try: + yield + finally: + for name, mod in _tests_modules_.items(): + sys.modules[name] = mod + +# Have pytest's assert rewriting take over: +# https://docs.pytest.org/en/stable/writing_plugins.html#assertion-rewriting +# pytest.register_assert_rewrite("tests.shared") +pytest.register_assert_rewrite("tests.cmd_building") +pytest.register_assert_rewrite("tests.cli") +pytest.register_assert_rewrite("origen.helpers.regressions") +pytest.register_assert_rewrite("test_apps_shared_test_helpers") diff --git a/test_apps/python_no_app/tests/cli/shared.py b/test_apps/python_no_app/tests/cli/shared.py new file mode 100644 index 00000000..df020d12 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/shared.py @@ -0,0 +1,7 @@ +import pytest +from tests.test_configs import Common as ConfigCommon + +class CLICommon(ConfigCommon): + @pytest.fixture + def cmd(self): + return self._cmd diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__aux_cmds.py b/test_apps/python_no_app/tests/cli/tests__cmd__aux_cmds.py new file mode 100644 index 00000000..6d284791 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__aux_cmds.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli.auditors import CmdNamespaceContainerAuditor +import pytest + +class T_AuxCmds(CmdNamespaceContainerAuditor): + container = CmdNamespaceContainerAuditor.global_cmds.aux_cmds + container_help_offset = 2 + container_nspaces = [ + CmdNamespaceContainerAuditor.aux.ns.cmd_testers, + CmdNamespaceContainerAuditor.aux.ns.empty_aux_ns, + CmdNamespaceContainerAuditor.aux.ns.python_no_app_aux_cmds + ] + nspace = CmdNamespaceContainerAuditor.aux.ns.python_no_app_aux_cmds + nspace_help_offset = 0 + empty_nspace = CmdNamespaceContainerAuditor.aux.ns.empty_aux_ns diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__credentials.py b/test_apps/python_no_app/tests/cli/tests__cmd__credentials.py new file mode 100644 index 00000000..499c4ab6 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__credentials.py @@ -0,0 +1,141 @@ +import pytest, origen, origen_metal +from .shared import CLICommon + +class T_Credentials(CLICommon): + @pytest.mark.skip + def test_help_msg(self): + # TEST_NEEDED CLI credentials help message + fail + + @pytest.mark.skip + def test_set_passwords(self, monkeypatch): + # import io + # monkeypatch.setattr('sys.stdin', io.StringIO('test_pw_updated')) + + u = origen.current_user + assert set(u.datasets.keys()) == { + "test", "backup", "dummy_ldap_ds", "test2", "git" + } + assert u.data_lookup_hierarchy == ["test", "backup"] + u.datasets["dummy_ldap_ds"].should_validate_password = False + + u.datasets["test"].password = "test_pw" + u.datasets["backup"].password = "backup_pw" + u.datasets["dummy_ldap_ds"].password = "dummy_ldap_ds_pw" + u.datasets["test2"].password = "test2_pw" + u.datasets["git"].password = "git_pw" + + assert u.password == "test_pw" + assert u.datasets["test"].password == "test_pw" + assert u.datasets["backup"].password == "backup_pw" + assert u.datasets["dummy_ldap_ds"].password == "dummy_ldap_ds_pw" + assert u.datasets["test2"].password == "test2_pw" + assert u.datasets["git"].password == "git_pw" + + self.global_cmds.cred.run(["set", "test_pw_updated"]) + + self.global_cmds.cred.run(["set", "--dataset", "git" , "git_pw_updated", "--dataset", "test2", "test2_pw_updated"]) + # import subprocess + # proc = subprocess.Popen(["origen", "credentials", "set"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + # proc.stdin.flush() + # proc.stdout.flush() + # print(proc.stdout.readline().decode("UTF-8").strip()) + # proc.stdin.write(("test_pw_updated" + "\n").encode('UTF-8')) + # proc.stdin.flush() + # print(proc.stdout.readline().decode("UTF-8").strip()) + + assert u.password == "test_pw_updated" + + @pytest.mark.skip + def test_verify_password(self): + fail + + def test_clearing_passwords(self): + u = origen.current_user + assert set(u.datasets.keys()) == { + "test", "backup", "dummy_ldap_ds", "test2", "git" + } + assert u.data_lookup_hierarchy == ["test", "backup"] + u.datasets["dummy_ldap_ds"].should_validate_password = False + + u.datasets["test"].password = "test_pw" + u.datasets["backup"].password = "backup_pw" + u.datasets["dummy_ldap_ds"].password = "dummy_ldap_ds_pw" + u.datasets["test2"].password = "test2_pw" + u.datasets["git"].password = "git_pw" + + assert u.password == "test_pw" + assert u.datasets["test"].password == "test_pw" + assert u.datasets["backup"].password == "backup_pw" + assert u.datasets["dummy_ldap_ds"].password == "dummy_ldap_ds_pw" + assert u.datasets["test2"].password == "test2_pw" + assert u.datasets["git"].password == "git_pw" + + out = self.global_cmds.creds.run("clear") + assert "Clearing cached password for topmost dataset..." in out + origen_metal.sessions.unload() + origen_metal.users.unload() + origen._origen.boot_users() + u.datasets["dummy_ldap_ds"].should_validate_password = False + u = origen.current_user + u.prompt_for_passwords = False + + prompt_err = f"Cannot prompt for passwords for user '{u.id}'. Passwords must be loaded by the config or set directly." + with pytest.raises(RuntimeError, match=prompt_err): + assert u.password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["test"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["backup"].password == None + assert u.datasets["dummy_ldap_ds"].password == "dummy_ldap_ds_pw" + assert u.datasets["test2"].password == "test2_pw" + assert u.datasets["git"].password == "git_pw" + + out = self.global_cmds.creds.run("clear", "--datasets", "git", "test2") + origen_metal.sessions.unload() + origen_metal.users.unload() + origen._origen.boot_users() + u.datasets["dummy_ldap_ds"].should_validate_password = False + u = origen.current_user + u.prompt_for_passwords = False + + assert "Clearing cached password for dataset 'git'" in out + assert "Clearing cached password for dataset 'test2'" in out + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["test"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["backup"].password is None + assert u.datasets["dummy_ldap_ds"].password == "dummy_ldap_ds_pw" + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["test2"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["git"].password is None + + u.datasets["test"].password = "test_pw" + u.datasets["backup"].password = "backup_pw" + u.datasets["dummy_ldap_ds"].password = "dummy_ldap_ds_pw" + u.datasets["test2"].password = "test2_pw" + u.datasets["git"].password = "git_pw" + assert u.password == "test_pw" + + out = self.global_cmds.creds.run("clear", "--all") + origen_metal.sessions.unload() + origen_metal.users.unload() + origen._origen.boot_users() + u.datasets["dummy_ldap_ds"].should_validate_password = False + u = origen.current_user + u.prompt_for_passwords = False + + assert "Clearing all cached passwords..." in out + with pytest.raises(RuntimeError, match=prompt_err): + assert u.password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["test"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["backup"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["dummy_ldap_ds"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["test2"].password is None + with pytest.raises(RuntimeError, match=prompt_err): + assert u.datasets["git"].password is None diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__eval.py b/test_apps/python_no_app/tests/cli/tests__cmd__eval.py new file mode 100644 index 00000000..ec2f789d --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__eval.py @@ -0,0 +1,103 @@ +import origen, pytest, pathlib, sys +from .shared import CLICommon + +class T_Eval(CLICommon): + _cmd= origen.helpers.regressions.cli.CLI.global_cmds.eval + _no_config_run_opts = { + "with_configs": CLICommon.configs.suppress_plugin_collecting_config, + "bypass_config_lookup": True + } + script_dir = pathlib.Path(__file__).parent.joinpath("tests__cmd__eval__scripts") + + def eval_script(self, name): + return self.script_dir.joinpath(f"{name}.py") + + @pytest.fixture + def no_config_run_opts(self): + return self._no_config_run_opts + + def test_help_msg(self, cmd, no_config_run_opts): + help = cmd.get_help_msg(run_opts=no_config_run_opts) + help.assert_cmd(cmd) + + def test_with_single_statement(self, cmd, no_config_run_opts): + d = cmd.demos["multi_statement_single_arg"] + out = d.run(run_opts=no_config_run_opts) + d.assert_present(out) + + def test_with_multiple_statements(self, cmd, no_config_run_opts): + d = cmd.demos["multi_statement_multi_args"] + out = d.run(run_opts=no_config_run_opts) + d.assert_present(out) + + def test_error_with_no_input(self, cmd, no_config_run_opts): + err = cmd.gen_error(run_opts=no_config_run_opts) + assert self.err_msgs.missing_required_arg(cmd.code) in err + + def test_error_in_statements(self, cmd, no_config_run_opts): + d = cmd.demos["gen_name_error"] + out = d.gen_error(run_opts=no_config_run_opts) + d.assert_present(out) + + def test_clean_eval(self): + eval_prefix = "Origen Version From Eval: " + out = self.eval("print (f'" + eval_prefix + "{origen.version}' )") + assert out == f"{eval_prefix}{origen.version}\n" + + def test_eval_with_script(self, cmd): + out = cmd.run(cmd.scripts.ln_to_cli(), self.eval_script("hi")) + assert out == "eval_script__say_hi: hi!\n" + + out = cmd.run( + cmd.scripts.ln_to_cli(), self.eval_script("override_preface"), + cmd.scripts.ln_to_cli(), self.eval_script("hi") + ) + assert out == "eval_script_override: hi!\n" + + def test_eval_context_persists_over_scripts(self, cmd): + out = cmd.run( + "preface='preface_override'", + cmd.scripts.ln_to_cli(), self.eval_script("hi"), + "print(hi)" + ) + assert out == "preface_override: hi!\nhi!\n" + + def test_error_in_script(self, cmd): + err = self.eval_script("err") + out = cmd.gen_error( + "print('test_error_in_script')", + cmd.scripts.ln_to_cli(), err, + return_full=True + ) + + stdout = out["stdout"] + errs = self.extract_logged_errors(stdout) + assert errs[0] == f"Exception occurred evaluating from script '{err}'" + assert len(errs) == 1 + + stdout = stdout.split("\n") + assert "test_error_in_script" in stdout[1] + assert stdout[2] == "tests__cmd__eval__scripts: gen error" + assert stdout[3] == '' + assert len(stdout) == 4 + + stderr = out["stderr"].split("\n") + assert "Traceback" in stderr[0] + assert "line 2" in stderr[1] + err = "NameError: name 'hello' is not defined" + if sys.version_info.minor >= 12: + assert stderr[2] == f"{err}. Did you mean: 'help'?" + else: + assert stderr[2] == err + assert stdout[3] == '' + assert len(stderr) == 4 + + def test_eval_with_invalid_script(self, cmd): + invalid = self.eval_script("invalid") + out = cmd.gen_error( + "print('hi')", + cmd.scripts.ln_to_cli(), invalid, + return_full=True + ) + assert out["stderr"] == '' + assert f"Could not find script file '{invalid}'" in out['stdout'] diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/err.py b/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/err.py new file mode 100644 index 00000000..0def8f75 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/err.py @@ -0,0 +1,2 @@ +print('tests__cmd__eval__scripts: gen error') +print(hello) diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/hi.py b/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/hi.py new file mode 100644 index 00000000..ecbee244 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/hi.py @@ -0,0 +1,5 @@ +preface = locals().get("preface", None) +hi = "hi!" +if not preface: + preface = "eval_script__say_hi" +print(f"{preface}: {hi}") diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/override_preface.py b/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/override_preface.py new file mode 100644 index 00000000..c3eb5426 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__eval__scripts/override_preface.py @@ -0,0 +1 @@ +preface = "eval_script_override" \ No newline at end of file diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__exec.py b/test_apps/python_no_app/tests/cli/tests__cmd__exec.py new file mode 100644 index 00000000..9f3c3e2c --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__exec.py @@ -0,0 +1,56 @@ +import origen, pytest +from .shared import CLICommon + +class T_Exec(CLICommon): + _cmd= origen.helpers.regressions.cli.CLI.global_cmds.exec + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_summary(cmd.help) + help.assert_args(cmd.command, cmd.args["args"]) + help.assert_opts("h", "v", "vk") + help.assert_not_extendable() + + def test_without_any_args(self, cmd): + out = cmd.gen_error() + self.assert_v(out, None) + self.assert_args_required_msg(out, cmd.command) + + def test_error_on_usage(self, cmd): + out = cmd.gen_error(return_full=True, pre_cmd_opts=["-vv", "--vk", "vk_arg", "--blah"]) + self.assert_v(out["stdout"], 2, "vk_arg") + self.assert_invalid_ln_msg(out["stderr"], "blah") + + def test_verbosity_in_errors(self, cmd): + out = cmd.gen_error(return_full=True, pre_cmd_opts=["-vv", "--vk", "vk_arg", "--verbose"]) + print(out["stdout"]) + self.assert_v(out["stdout"], 3, ["vk_arg"]) + self.assert_args_required_msg(out["stderr"], cmd.command) + + out = cmd.gen_error(return_full=True, pre_cmd_opts=["-vv", "--vk", "vk0", "--verbose", "--vk", "vk1", "--blah"]) + self.assert_v(out["stdout"], 3, ["vk0", "vk1"]) + self.assert_invalid_ln_msg(out["stderr"], "blah") + + out = cmd.gen_error(return_full=True, pre_cmd_opts=["-b", "-vv", "--vk", "vk_arg"]) + self.assert_v(out["stdout"], 2, ["vk_arg"]) + self.assert_invalid_sn_msg(out["stderr"], "b") + + def test_args_post_cmd_is_part_of_exec_args(self, cmd): + out = cmd.run("echo", "-h", "-v", "-v") + assert out == "-h -v -v\n" + self.assert_v(out, None) + + out = cmd.run("echo", "-v", "--help") + assert out == "-v --help\n" + self.assert_v(out, None) + + # -- is needed to interpret long arg names as values and not options + out = cmd.run("echo", "--", "--vk", "hi", "bye", "-v") + assert out == "--vk hi bye -v\n" + self.assert_v(out, None) + + def test_args_pre_cmd_are_applied_to_origen(self, cmd): + out = cmd.run("echo", "echoing...", "--", "--vk", "hi", "bye", "-v", pre_cmd_opts=["-vvv", "--vk", "vk0,vk1"]) + self.assert_v(out, 3, ["vk0", "vk1"]) + # Remove the closing coloration from the previous line + assert out.split("\n")[-2].replace("\x1b[0m", '') == "echoing... --vk hi bye -v" diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__plugin.py b/test_apps/python_no_app/tests/cli/tests__cmd__plugin.py new file mode 100644 index 00000000..b472b89d --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__plugin.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli.auditors import CmdNamespaceContainerAuditor +import pytest + +class T_Plugin(CmdNamespaceContainerAuditor): + container = CmdNamespaceContainerAuditor.global_cmds.pl + container_help_offset = 0 + container_nspaces = [ + CmdNamespaceContainerAuditor.plugins.python_plugin, + CmdNamespaceContainerAuditor.plugins.python_plugin_no_cmds, + CmdNamespaceContainerAuditor.plugins.python_plugin_the_second + ] + nspace = CmdNamespaceContainerAuditor.plugins.python_plugin + nspace_help_offset = 2 + empty_nspace = CmdNamespaceContainerAuditor.plugins.python_plugin_no_cmds diff --git a/test_apps/python_no_app/tests/cli/tests__cmd__plugins.py b/test_apps/python_no_app/tests/cli/tests__cmd__plugins.py new file mode 100644 index 00000000..f77613d2 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__cmd__plugins.py @@ -0,0 +1,8 @@ +from test_apps_shared_test_helpers.cli.auditors import PluginsCmdAudit + +class T_Plugins(PluginsCmdAudit): + loaded_plugins = [ + PluginsCmdAudit.plugins.python_plugin, + PluginsCmdAudit.plugins.python_plugin_the_second, + PluginsCmdAudit.plugins.python_plugin_no_cmds, + ] diff --git a/test_apps/python_no_app/tests/cli/tests__global_cmds.py b/test_apps/python_no_app/tests/cli/tests__global_cmds.py new file mode 100644 index 00000000..30814ffd --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__global_cmds.py @@ -0,0 +1,13 @@ +import pytest +from origen.helpers.env import run_cli_cmd +from .shared import CLICommon +from tests.cmd_building.shared import CLICommon as CmdTestersCommon + +class T_GlobalCmds(CLICommon): + @pytest.mark.parametrize("cmd", CLICommon.global_cmds.cmds, ids=CLICommon.global_cmds.all_names) + def test_core_commands_are_available(self, cmd): + ''' Just testing that "-h" (or help for some commands) doesn't crash for all core commands ''' + help = cmd.get_help_msg() + assert len(help.opts) >= 3 + # TESTS_NEEDED CLI better opt check + # help.assert_bare_opts_present() \ No newline at end of file diff --git a/test_apps/python_no_app/tests/cli/tests__invocation_errors.py b/test_apps/python_no_app/tests/cli/tests__invocation_errors.py new file mode 100644 index 00000000..437ff8e3 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__invocation_errors.py @@ -0,0 +1,59 @@ +from test_apps_shared_test_helpers.cli import CLIShared, CmdOpt, CmdArg +import pytest + +class T_InvocationErrors(CLIShared): + def test_with_unknown_cmds(self): + out = self.gen_error(["blah_cmd"], return_details=True) + self.assert_v(out["stdout"], None) + self.assert_invalid_arg_msg(out["stderr"], "blah_cmd") + + out = self.gen_error(["--vk", "vk0", "blah_cmd", "-vv"], return_details=True) + self.assert_v(out["stdout"], 2, ["vk0"]) + self.assert_invalid_arg_msg(out["stderr"], "blah_cmd") + + def test_with_unknown_options(self): + out = self.gen_error(["--blah_opt"], return_details=True) + self.assert_v(out["stdout"], None) + self.assert_invalid_ln_msg(out["stderr"], "blah_opt") + + out = self.gen_error(["--verbose", "--vk", "vk_opt_1", "--blah_opt", "--verbose", "--vk", "vk_opt_2,vk_opt_3"], return_details=True) + self.assert_v(out["stdout"], 2, ["vk_opt_1", "vk_opt_2", "vk_opt_3"]) + self.assert_invalid_ln_msg(out["stderr"], "blah_opt") + + inv_subc = "invalid_subc" + invalid_help_subc_cases = [ + ("help_pre_subc", "invalid_subc", ["help", inv_subc], None, None), + ("help_post_subc", "invalid_arg", [inv_subc, "help"], None, None), + ("help_sn_pre", "invalid_arg", [inv_subc, "-h", "-vv"], 2, None), + ("help_ln", "invalid_arg", [inv_subc, "--help", "-vv", "--vk", "vk_ln"], 2, "vk_ln"), + + # This will parse "-h" first, meaning this will actually display help message, not an error + ("help_sn_post", None, ["-h", "-vv", inv_subc, "--vk", "vk0,vk1"], 2, ["vk0", "vk1"]), + ] + @pytest.mark.parametrize("assert_method,args,vlvl,vks", [h[1:] for h in invalid_help_subc_cases], ids=[h[0] for h in invalid_help_subc_cases]) + def test_help_with_unknown_subcs(self, assert_method, args, vlvl, vks): + if assert_method is None: + out = self.run_cli_cmd(args) + self.assert_core_help(out) + else: + out = self.gen_error(args, return_details=True) + getattr(self, f"assert_{assert_method}_msg")(out["stderr"], self.inv_subc) + out = out["stdout"] + self.assert_v(out, vlvl, vks) + + misuses = [ + ("eval_without_files", "missing_arg", CLIShared.global_cmds.eval.code, ["-vv", "eval", "--vk", "vk_g"], 2, "vk_g"), + ("eval_with_invalid_opt", "invalid_ln", "blah_opt", ["eval", "\"print( 'hi' )\"", "--blah_opt", "-vv", "--vk", "vk_opt"], 2, "vk_opt"), + ("eval_with_invalid_opt_pre_cmd", "invalid_ln", "blah_opt", ["--blah_opt", "-vv", "--vk", "vk_opt", "eval", "\"print( 'hi' )\"", "-v"], 3, "vk_opt"), + ("missing_vk_val", "missing_ln_val", CLIShared.opts.vk, ["eval", "\"print( 'hi' )\"", "--vk", "-vv"], None, None), + ("missing_vk_val", "missing_ln_val", CLIShared.opts.vk, ["-h", "--vk", "-vv"], None, None), + + # Help subc will view anything after as subcommand + # e.g.: "help -h" will try to "help" the subc "-h", which won't exists + ("help_subc_and_sn", "invalid_subc", "-h", ["help", "-h"], None, None), + ] + @pytest.mark.parametrize("assert_method,offender,args,vlvl,vks", [h[1:] for h in misuses], ids=[h[0] for h in misuses]) + def test_command_misuse_with_verbosity(self, assert_method, offender, args, vlvl, vks): + out = self.gen_error(args, return_details=True) + self.assert_v(out["stdout"], vlvl, vks) + getattr(self, f"assert_{assert_method}_msg")(out["stderr"], offender) diff --git a/test_apps/python_no_app/tests/cli/tests__origen_help.py b/test_apps/python_no_app/tests/cli/tests__origen_help.py new file mode 100644 index 00000000..698dec43 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__origen_help.py @@ -0,0 +1,31 @@ +from test_apps_shared_test_helpers.cli import CLIShared, CmdOpt, CmdArg +import pytest + +class T_OrigenHelp(CLIShared): + help_invocations = [ + ("sn", ["-h"]), + ("ln", ["--help"]), + ("subc", ["help"]), + ("sn_and_ln", ["-h", "--help"], + ("help_on_no_subc", [])), + ] + @pytest.mark.parametrize("args", [h[1] for h in help_invocations], ids=[h[0] for h in help_invocations]) + def test_origen_help(self, args): + out = self.run_cli_cmd(args) + self.assert_v(out, None) + self.assert_core_help(out) + + verbose_help_invocs = [ + ("sns", (["-h", "-v", "-v", "-v"], 3, None)), + ("ln_with_vks", (["-vv", "--help", "--vk", "vk0,vk1"], 2, ["vk0", "vk1"])), + ("subc_with_vks", (["-vv", "--vk", "vka", "--verbose", "--vk", "vkb", "help"], 3, ["vka", "vkb"]), + ("no_subc", (["--verbose", "--vk", "vk", "--verbose"], 2, ["vk"]))), + + # These won't show since verbosity is not enabled, but should get the help message without other errors + ("vks_only", (["--vk", "vk0", "--vk", "vk1"], None, None)), + ] + @pytest.mark.parametrize("args,vlvl,vks", [h[1] for h in verbose_help_invocs], ids=[h[0] for h in verbose_help_invocs]) + def test_help_with_verbosity(self, args, vlvl, vks): + out = self.run_cli_cmd(args) + self.assert_v(out, vlvl, vks) + self.assert_core_help(out) diff --git a/test_apps/python_no_app/tests/cli/tests__origen_v.py b/test_apps/python_no_app/tests/cli/tests__origen_v.py new file mode 100644 index 00000000..2dcff544 --- /dev/null +++ b/test_apps/python_no_app/tests/cli/tests__origen_v.py @@ -0,0 +1,20 @@ +from test_apps_shared_test_helpers.cli import CLIShared, CmdOpt, CmdArg +import pytest + +class T_OrigenVersion(CLIShared): + def test_origen_v(self): + out = self.cmds.v.run() + self.assert_v(out, None) + self.assert_no_app_origen_v(out) + + invocs = [ + ("vvv", ["-vvv"], 2, None), + ("v_v_v", ["-v", "-v", "-v"], 2, None), + ("vks", ["-v", "--verbose", "--vk", "vk0", "-vv"], 3, ["vk0"]), + ("vks_2", ["--verbose", "--vk", "vka", "-vv", "--vk", "vkb"], 2, ["vka", "vkb"]), + ] + @pytest.mark.parametrize("args,vlvl,vks", [[h[1], h[2], h[3]] for h in invocs], ids=[h[0] for h in invocs]) + def test_origen_v_with_verbosity(self, args, vlvl, vks): + out = self.run_cli_cmd(args) + self.assert_v(out, vlvl, vks) + self.assert_no_app_origen_v(out, version_only=False) diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers.toml b/test_apps/python_no_app/tests/cmd_building/cmd_testers.toml new file mode 100644 index 00000000..483052b4 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers.toml @@ -0,0 +1,337 @@ +help = "Commands to assist in testing aux commands when no app is present" + +[[command]] +name = "python_no_app_tests" +help = "Test commands for python-no-app workspace" + +[[command]] +name = "test_nested_level_1" +help = "Tests origen.current_command L1" + + [[command.subcommand]] + name = "test_nested_level_2" + help = "Tests origen.current_command L2" + + [[command.subcommand.subcommand]] + name = "test_nested_level_3_a" + help = "Tests origen.current_command L3a" + + [[command.subcommand.subcommand]] + name = "test_nested_level_3_b" + help = "Tests origen.current_command L3b" + +[[command]] +name = "test_arguments" +help = "Test various argument and option schemes from commands" + + [[command.subcommand]] + name = "display_verbosity_opts" + help = "Displays the verbosity and keywords from the current command" + + [[command.subcommand]] + name = "no_args_or_opts" + help = "Command taking no arguments or options" + + [[command.subcommand]] + name = "optional_arg" + help = "Command taking a single, optional argument" + + [[command.subcommand.arg]] + name = "single_val" + help = "Single value" + + [[command.subcommand]] + name = "required_arg" + help = "Command taking a required and optional arg" + + [[command.subcommand.arg]] + name = "required_val" + required = true + help = "Single required value" + + [[command.subcommand.arg]] + name = "optional_val" + help = "Single optional value" + + [[command.subcommand]] + name = "multi_arg" + help = "Command taking a multi-arg" + + [[command.subcommand.arg]] + name = "multi_arg" + multiple = true + help = "Multi-arg value" + + [[command.subcommand]] + name = "delim_multi_arg" + help = "Command taking a delimited multi-arg" + + [[command.subcommand.arg]] + name = "delim_m_arg" + use_delimiter = true + help = "Delimited Multi-arg value ('multiple' implied)" + + [[command.subcommand]] + name = "single_and_multi_arg" + help = "Command taking a single and multi-arg" + + [[command.subcommand.arg]] + name = "single_val" + help = "Single value" + + [[command.subcommand.arg]] + name = "multi_arg" + multiple = true + help = "Multi-arg value" + + [[command.subcommand]] + name = "args_with_value_names" + help = "Single and multi arg with value custom value names" + + [[command.subcommand.arg]] + name = "s_arg" + value_name = "Single Arg Val" + help = "Single value arg with custom value name" + + [[command.subcommand.arg]] + name = "m_arg" + multiple = true + value_name = "Multi Arg Val" + help = "Multi value arg with custom value name" + + # Very simple subcommands that only support a small piece of the options at a time + [[command.subcommand]] + name = "single_value_optional_opt" + help = "Command taking optional, single option" + + # Default setting for an arg is not required + [[command.subcommand.opt]] + name = "implicit_single_val" + takes_value = true + help = "Implicit non-required single value" + + [[command.subcommand.opt]] + name = "explicit_single_val" + takes_value = true + required = false + help = "Explicit non-required single value" + + [[command.subcommand]] + name = "single_value_required_opt" + help = "Command with single-value optional and required options" + + # Default setting is arg is not required + [[command.subcommand.opt]] + name = "non_req_val" + takes_value = true + help = "Non-required single value" + + [[command.subcommand.opt]] + name = "req_val" + takes_value = true + required = true + help = "Required single value" + + [[command.subcommand]] + name = "multi_opts" + help = "Command with multi-value optional and required options" + + [[command.subcommand.opt]] + name = "m_opt" + takes_value = true + multiple = true + help = "Opt with multiple values" + + # Takes value should be implied with multiple + [[command.subcommand.opt]] + name = "im_m_opt" + multiple = true + help = "Opt accepting multiple values were 'takes value' is implied" + + [[command.subcommand.opt]] + name = "req_m_opt" + multiple = true + required = true + help = "Required opt accepting multiple values" + + [[command.subcommand.opt]] + name = "d_m_opt" + multiple = true + use_delimiter = true + help = "Delimited multi opt" + + [[command.subcommand.opt]] + name = "d_im_m_opt" + use_delimiter = true + help = "Delimited opt where 'multi' and 'takes value' is implied" + + [[command.subcommand]] + name = "flag_opts" + help = "Command with flag-style options only" + + [[command.subcommand.opt]] + name = "im_f_opt" + help = "Stackable flag opt with 'takes value=false' implied" + + [[command.subcommand.opt]] + name = "ex_f_opt" + takes_value = false + help = "Stackable flag opt with 'takes value=false' set" + + [[command.subcommand]] + name = "opts_with_value_names" + help = "Command with single/multi-opts with custom value names" + + [[command.subcommand.opt]] + name = "s_opt_nv_im_tv" + value_name = "s_val_impl" + help = "Single opt with value name, implying 'takes_value'=true" + + [[command.subcommand.opt]] + name = "s_opt_nv_ex_tv" + value_name = "s_val_expl" + takes_value = true + help = "Single opt with value name and explicit 'takes_value'=true" + + [[command.subcommand.opt]] + name = "m_opt_named_val" + value_name = "m_val" + multiple = true + help = "Multi-opt with value name" + + [[command.subcommand.opt]] + name = "s_opt_ln_nv" + value_name = "ln_nv" + help = "Single opt with long name and value name" + + [[command.subcommand]] + name = "opts_with_aliases" + help = "Command with option aliasing, custom long, and short names" + + [[command.subcommand.opt]] + name = "single_opt" + takes_value = true + long = "s_opt" + short = "s" + help = "Single opt with long/short name" + + [[command.subcommand.opt]] + name = "multi_opt" + takes_value = true + multiple = true + long = "m_opt" + short = "m" + help = "Multi-opt with long/short name" + + [[command.subcommand.opt]] + name = "occurrence_counter" + long = "cnt" + short = "o" + help = "Flag opt with long/short name" + + [[command.subcommand.opt]] + name = "flag_opt_short_name" + short = "f" + help = "Flag opt with short name only" + + [[command.subcommand.opt]] + name = "flag_opt_long_name" + long = "ln_f_opt" + help = "Flag opt with long name only" + + [[command.subcommand.opt]] + name = "flag_opt_dupl_ln_sn" + long = "f" + help = "Flag opt with ln matching another's sn" + + [[command.subcommand.opt]] + name = "fo_sn_aliases" + short_aliases = ['a', 'b'] + help = "Flag opt with short aliases" + + [[command.subcommand.opt]] + name = "fo_sn_and_aliases" + short = "c" + short_aliases = ['d', 'e'] + help = "Flag opt with short name and short aliases" + + [[command.subcommand.opt]] + name = "fo_ln_aliases" + long_aliases = ['fa', 'fb'] + help = "Flag opt with long aliases" + + [[command.subcommand.opt]] + name = "fo_ln_and_aliases" + long = "fc" + long_aliases = ['fd', 'fe'] + help = "Flag opt with long name and long aliases" + + [[command.subcommand.opt]] + name = "fo_sn_ln_aliases" + long_aliases = ['sn_ln_1', 'sn_ln_2'] + short_aliases = ['z'] + help = "Flag opt with long and short aliases" + + [[command.subcommand]] + name = "hidden_opt" + help = "Command with a hidden opt" + + [[command.subcommand.opt]] + name = "hidden_opt" + hidden = true + help = "Hidden opt" + + [[command.subcommand.opt]] + name = "visible_opt" + hidden = false + help = "Visible, non-hidden, opt" + + [[command.subcommand]] + name = "single_arg_single_opt" + help = "Command with a single arg and single opt" + + [[command.subcommand.arg]] + name = "single_arg_val" + help = "Single value arg" + + [[command.subcommand.opt]] + name = "single_opt_val" + takes_value = true + help = "Single value opt" + + [[command.subcommand]] + name = "multi_arg_multi_opt" + help = "Command with a multi-arg and multi-opt" + + [[command.subcommand.arg]] + name = "multi_arg" + help = "Multi value arg" + + [[command.subcommand.opt]] + name = "multi_opt" + takes_value = true + help = "Multi value opt" + +[[command]] +name = "error_cases" +help = "Commands to test error messages and improper command configuration" + + [[command.subcommand]] + name = "missing_impl_dir" + help = "Parent to test missing implementation directory" + + [[command.subcommand.subcommand]] + name = "missing_impl_dir_subc" + help = "Generate error for missing implementation directory" + + [[command.subcommand]] + name = "missing_impl_file" + help = "Generate error for implementation module file" + + [[command.subcommand]] + name = "test_missing_run_function" + help = "Generate error for a missing run function" + + [[command.subcommand]] + name = "test_exception_in_run" + help = "Generate error for an exception during execution" diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/error_cases/test_exception_in_run.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/error_cases/test_exception_in_run.py new file mode 100644 index 00000000..3503dc2c --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/error_cases/test_exception_in_run.py @@ -0,0 +1,2 @@ +def run(**args): + raise RuntimeError("Raising run time error in 'test_exception_in_run'") \ No newline at end of file diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/error_cases/test_missing_run_function.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/error_cases/test_missing_run_function.py new file mode 100644 index 00000000..b6266f9d --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/error_cases/test_missing_run_function.py @@ -0,0 +1 @@ +# Purposefully missing 'run' method \ No newline at end of file diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/nested_common.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/nested_common.py new file mode 100644 index 00000000..ef27cd63 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/nested_common.py @@ -0,0 +1,2 @@ +def say_hi(lvl): + print(f"Hi from 'cmd_tester' level {lvl}!") diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/python_no_app_tests.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/python_no_app_tests.py new file mode 100644 index 00000000..019604b5 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/python_no_app_tests.py @@ -0,0 +1,2 @@ +def run(**args): + print("Hi from No-App Origen!!") diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/args_with_value_names.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/args_with_value_names.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/args_with_value_names.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/delim_multi_arg.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/delim_multi_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/delim_multi_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/display_verbosity_opts.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/display_verbosity_opts.py new file mode 100644 index 00000000..9deb0a86 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/display_verbosity_opts.py @@ -0,0 +1,6 @@ +import origen + +def run(**args): + print(f"verbosity: {origen.logger.verbosity}") + print(f"keywords: {origen.logger.keywords}") + print(f"Args: {args}") diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/flag_opts.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/flag_opts.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/flag_opts.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/hidden_opt.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/hidden_opt.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/hidden_opt.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/multi_arg.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/multi_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/multi_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/multi_opts.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/multi_opts.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/multi_opts.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/no_args_or_opts.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/no_args_or_opts.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/no_args_or_opts.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/optional_arg.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/optional_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/optional_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/opts_with_aliases.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/opts_with_aliases.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/opts_with_aliases.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/opts_with_value_names.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/opts_with_value_names.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/opts_with_value_names.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/required_arg.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/required_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/required_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_and_multi_arg.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_and_multi_arg.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_and_multi_arg.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_value_optional_opt.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_value_optional_opt.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_value_optional_opt.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_value_required_opt.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_value_required_opt.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_arguments/single_value_required_opt.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1.py new file mode 100644 index 00000000..718ad305 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1.py @@ -0,0 +1,7 @@ +import sys, pathlib +sys.path.append(str(pathlib.Path(__file__).parent)) + +from nested_common import say_hi + +def run(**args): + say_hi(1) diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1.test_nested_level_2.test_nested_level_3_b.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1.test_nested_level_2.test_nested_level_3_b.py new file mode 100644 index 00000000..51e7354f --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1.test_nested_level_2.test_nested_level_3_b.py @@ -0,0 +1,6 @@ +import sys, pathlib +sys.path.append(str(pathlib.Path(__file__).parent)) +from nested_common import say_hi + +def run(**args): + say_hi("3 (B)") diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1/test_nested_level_2.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1/test_nested_level_2.py new file mode 100644 index 00000000..c90682ec --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1/test_nested_level_2.py @@ -0,0 +1,6 @@ +import sys, pathlib +sys.path.append(str(pathlib.Path(__file__).parent.parent)) +from nested_common import say_hi + +def run(**args): + say_hi(2) diff --git a/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1/test_nested_level_2/test_nested_level_3_a.py b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1/test_nested_level_2/test_nested_level_3_a.py new file mode 100644 index 00000000..d2ea18fd --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/cmd_testers/test_nested_level_1/test_nested_level_2/test_nested_level_3_a.py @@ -0,0 +1,6 @@ +import sys, pathlib +sys.path.append(str(pathlib.Path(__file__).parent.parent.parent)) +from nested_common import say_hi + +def run(**args): + say_hi("3 (A)") diff --git a/test_apps/python_no_app/tests/cmd_building/shared.py b/test_apps/python_no_app/tests/cmd_building/shared.py new file mode 100644 index 00000000..d8e501e5 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/shared.py @@ -0,0 +1,29 @@ +import pytest, shutil, os +from test_apps_shared_test_helpers.cli import CLIShared + +class CLICommon(CLIShared): + @pytest.fixture + def cmd(self): + return self._cmd + + @pytest.fixture + def with_cli_aux_cmds(self): + shutil.copy(self.dummy_config, self.cli_config) + shutil.copy(self.cli_aux_cmds_toml, self.cli_dir) + dest_dir = self.cli_dir.joinpath("aux_cmds_from_cli_dir") + if dest_dir.exists(): + shutil.rmtree(dest_dir) + shutil.copytree(self.cli_aux_cmds_impl, dest_dir) + yield + os.remove(self.cli_config) + os.remove(self.cli_dir.joinpath("aux_cmds_from_cli_dir.toml")) + shutil.rmtree(dest_dir) + + @property + def aux_cmd_ns_subcs(self): + return [ + self.cmd_testers_cmd, + self.aux.ns.empty_aux_ns.base_cmd, + 'help', + self.aux.ns.python_no_app_aux_cmds.base_cmd + ] diff --git a/test_apps/python_no_app/tests/cmd_building/tests__arg_buildling.py b/test_apps/python_no_app/tests/cmd_building/tests__arg_buildling.py new file mode 100644 index 00000000..7a90b4a4 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/tests__arg_buildling.py @@ -0,0 +1,182 @@ +import pytest +from .shared import CLICommon + +class Common(CLICommon): + pass + +class T_ArgBuilding(Common): + @pytest.fixture + def sv(self): + return "single_arg_value" + + @pytest.fixture + def rv(self): + return "required" + + @pytest.fixture + def m0(self): + return "m0" + + @pytest.fixture + def m1(self): + return "m1" + + @pytest.fixture + def m2(self): + return "m2" + + def test_no_args_available(self): + cmd = self.cmd_testers.test_args.no_args_or_opts + help = cmd.get_help_msg() + help.assert_args(None) + help.assert_bare_opts() + + out = cmd.run() + cmd.assert_args(out, None) + + class TestSingleOptionArg(Common): + _cmd = Common.cmd_testers.test_args.optional_arg + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_args(cmd.single_val) + help.assert_bare_opts + + def test_no_args(self, cmd): + # Try with no args + out = cmd.run() + cmd.assert_args(out, None) + + def test_single_arg_given(self, cmd, sv): + # Try with single arg given + out = cmd.run(sv) + cmd.assert_args(out, (cmd.single_val, sv)) + + def test_error_on_two_args_given(self, cmd, sv): + # Two args should generate error + another_sv = f"another_{sv}" + out = cmd.gen_error(sv, another_sv) + assert self.err_msgs.too_many_args(another_sv) in out + + class TestSingleRequiredArg(Common): + _cmd = Common.cmd_testers.test_args.required_arg + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_args(cmd.required_val, cmd.optional_val) + help.assert_bare_opts() + + def test_error_on_missing_required_arg(self, cmd): + # No args should generate error + out = cmd.gen_error() + assert self.err_msgs.missing_required_arg(cmd.required_val) in out + + def test_req_arg_given(self, cmd, rv): + # Single required arg + out = cmd.run(rv) + cmd.assert_args(out, (cmd.required_val, rv)) + + def test_req_and_optional_arg_given(self, cmd, rv): + # Required and optional arg + ov = "optional" + out = cmd.run(rv, ov) + cmd.assert_args(out, (cmd.required_val, rv), (cmd.optional_val, ov)) + + class TestMultiArg(Common): + _cmd = Common.cmd_testers.test_args.multi_arg + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_args(cmd.multi_arg) + help.assert_bare_opts() + + def test_no_args(self, cmd): + # Try with no args + out = cmd.run() + cmd.assert_args(out, None) + + def test_one_arg(self, cmd, m0): + # Try with one arg + out = cmd.run(m0) + cmd.assert_args(out, (cmd.multi_arg, [m0])) + + def test_three_args(self, cmd, m0, m1, m2): + # Try with three args + out = cmd.run(m0, m1, m2) + cmd.assert_args(out, (cmd.multi_arg, [m0, m1, m2])) + + def test_delimiter_is_not_default(self, cmd, m0, m1, m2): + # No delimiter by default, so this should all look like a single value + out = cmd.run(f"{m0},{m1},{m2}") + cmd.multi_arg.to_assert_str([f"{m0},{m1},{m2}"]) in out + + class TestDelimitedMultiArg(Common): + _cmd = Common.cmd_testers.test_args.delim_multi_arg + + def test_help_msg(sel, cmd): + help = cmd.get_help_msg() + help.assert_args(cmd.delim_m_arg) + help.assert_bare_opts() + + def test_no_args(self, cmd): + # Try with no args + out = cmd.run() + cmd.assert_args(out, None) + + def test_one_arg(self, cmd, m0): + # Try with one arg + out = cmd.run(m0) + cmd.assert_args(out, (cmd.delim_m_arg, [m0])) + + def test_three_non_delimited_args(self, cmd, m0, m1, m2): + # Try with three args + out = cmd.run(m0, m1, m2) + cmd.assert_args(out, (cmd.delim_m_arg, [m0, m1, m2])) + + def test_three_delimited_args(self, cmd, m0, m1, m2): + # Use delimiter to split up values + out = cmd.run(f"{m0},{m1},{m2}") + cmd.assert_args(out, (cmd.delim_m_arg, [m0, m1, m2])) + + class TestArgsWithValueNames(Common): + _cmd = Common.cmd_testers.test_args.args_with_value_names + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_args(cmd.s_arg, cmd.m_arg) + help.assert_bare_opts() + + def test_value_names(self, cmd): + sv ="single_val" + m0 = "m0_val" + m1 = "m1_val" + out = cmd.run(sv, m0, m1) + cmd.assert_args(out, (cmd.s_arg, sv), (cmd.m_arg, [m0, m1])) + + class TestCombinedSingleAndMultiArgs(Common): + _cmd = Common.cmd_testers.test_args.single_and_multi_arg + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_args(cmd.single_val, cmd.multi_arg) + help.assert_bare_opts() + + def test_no_args(self, cmd): + # Try no args + out = cmd.run() + cmd.assert_args(out, None) + + def test_single__arg(self, cmd, sv): + # Try single arg only + out = cmd.run(sv) + cmd.assert_args(out, (cmd.single_val, sv)) + + def test_two_args(self, cmd, sv, m0): + # Try two args + out = cmd.run(sv, m0) + cmd.assert_args(out, (cmd.single_val, sv), (cmd.multi_arg, [m0])) + + def test_three_args(self, cmd, sv, m0, m1): + # Try three args + out = cmd.run(sv, m0, m1) + cmd.assert_args(out, (cmd.single_val, sv), (cmd.multi_arg, [m0, m1])) diff --git a/test_apps/python_no_app/tests/cmd_building/tests__intra_cmd_conflicts.py b/test_apps/python_no_app/tests/cmd_building/tests__intra_cmd_conflicts.py new file mode 100644 index 00000000..47749aae --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/tests__intra_cmd_conflicts.py @@ -0,0 +1,106 @@ +from test_apps_shared_test_helpers.cli import CLIShared + +class T_IntraCmdConflicts(CLIShared): + cmd = CLIShared.python_plugin.intra_cmd_conflicts + conflicts = CLIShared.python_plugin.intra_cmd_conflicts_list + + @classmethod + def setup_class(cls): + cls.cmd_help = cls.cmd.get_help_msg() + cls.cmd_conflicts = cls.cmd_help.logged_errors + + @classmethod + def teardown_class(cls): + delattr(cls, "cmd_help") + delattr(cls, "cmd_conflicts") + + def test_help_msg(self): + # Check help message + cmd = self.cmd + help = self.cmd_help + help.assert_args(cmd.arg0, cmd.arg1, cmd.arg2) + help.assert_opts( + cmd.arg_clash, + cmd.intra_opt_conflicts, + "help", + cmd.inter_opt_conflicts, + cmd.opt, + cmd.reserved_prefix_in_ln_lna, + "v", + "vk", + ) + help.assert_subcmds(cmd.conflicts_subc, "help") + + assert help.aux_exts == None + assert help.pl_exts == None + assert help.app_exts == False + + def test_conflicts_during_cmd_building(self): + for c in reversed(self.conflicts): + m = self.cmd_conflicts.pop() + assert self.err_msgs.to_conflict_msg(self.cmd, c) in m + + def test_all_error_messages_checked(self): + assert len(self.cmd_conflicts) == 0 + + def test_cmd_conflicts_resolve_correctly(self): + cmd = self.cmd + out = cmd.run( + "0", "1", "2", + "--opt", "--opt0", + "--arg0", "--arg1", + "--ext_opt_lna", + "--intra_opt_cons", "-c", "-e", + "-d", + ) + cmd.assert_args( + out, + (cmd.arg0, "0"), + (cmd.arg1, "1"), + (cmd.arg2, "2"), + (cmd.opt, 2), + (cmd.arg_clash, 2), + (cmd.reserved_prefix_in_ln_lna, 1), + (cmd.intra_opt_conflicts, 3), + (cmd.inter_opt_conflicts, 1), + ) + + def test_subc_help_msg(self): + # Check help message + cmd = self.cmd.conflicts_subc + help = cmd.get_help_msg() + + help.assert_args(cmd.arg0, cmd.sub_arg_1) + help.assert_opts( + "help", + cmd.inter_subc_conflicts, + cmd.intra_subc_lna_iln_conflict, + cmd.opt, + cmd.intra_subc_conflicts, + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == None + assert help.pl_exts == None + assert help.app_exts == False + + def test_cmd_subc_conflicts_resolve_correctly(self): + cmd = self.cmd.conflicts_subc + out = cmd.run( + "a", "b", + "--opt", "--subc_opt", + "--intra_subc_conflicts", "-r", + "--intra_subc_lna_iln_conflict", + "--inter_subc_conflicts" + ) + cmd.assert_args( + out, + (cmd.arg0, "a"), + (cmd.sub_arg_1, "b"), + (cmd.opt, 2), + (cmd.intra_subc_conflicts, 2), + (cmd.intra_subc_lna_iln_conflict, 1), + (cmd.inter_subc_conflicts, 1), + ) diff --git a/test_apps/python_no_app/tests/cmd_building/tests__loading_aux_cmds.py b/test_apps/python_no_app/tests/cmd_building/tests__loading_aux_cmds.py new file mode 100644 index 00000000..2f3304c7 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/tests__loading_aux_cmds.py @@ -0,0 +1,120 @@ +import pytest, os +from .shared import CLICommon +from tests.test_configs import Common as ConfigCommmon + +class T_LoadingAuxCommands(CLICommon, ConfigCommmon): + def test_aux_commands_are_added(self): + help = self.global_cmds.aux_cmds.get_help_msg() + help.assert_subcmds(*self.aux_cmd_ns_subcs) + + out = self.cmd_testers_cmd.run("python_no_app_tests") + assert "Hi from No-App Origen!!" in out + + def test_aux_commands_stack(self, with_cli_aux_cmds): + help = self.global_cmds.aux_cmds.get_help_msg() + help.assert_subcmds(self.aux.ns.aux_cmds_from_cli_dir.base_cmd, *self.aux_cmd_ns_subcs) + + out = self.aux.ns.aux_cmds_from_cli_dir.base_cmd.cli_dir_says_hi.run() + assert "Hi from CLI dir!! " in out + + @pytest.mark.xfail + def test_aux_command_tree_view(self): + # FEATURE CLI aux/plugin/app command tree view + fail + + class TestNestedCommands(CLICommon): + def test_first_level_nested_aux_commands(self): + # Try first level + help = self.cmd_testers_cmd.get_help_msg() + subcs = list(self.cmd_testers_cmd.subcmds.values()) + subcs.insert(1, "help") + help.assert_subcmds(*subcs) + + out = self.cmd_testers.subc_l1.run() + assert "Hi from 'cmd_tester' level 1!" in out + + def test_second_level_nested_aux_commands(self): + # Try second level + help = self.cmd_testers.subc_l1.get_help_msg() + help.assert_subcmds("help", self.cmd_testers.subc_l2) + + out = self.cmd_testers.subc_l2.run() + assert "Hi from 'cmd_tester' level 2!" in out + + def test_third_level_nested_aux_commands(self): + # Try third level + help = self.cmd_testers.subc_l2.get_help_msg() + help.assert_subcmds("help", self.cmd_testers.subc_l3_a, self.cmd_testers.subc_l3_b) + + out = self.cmd_testers.subc_l3_a.run() + assert "Hi from 'cmd_tester' level 3 (A)!" in out + + def test_third_level_nested_aux_commands_modulized_path(self): + out = self.cmd_testers.subc_l3_b.run() + assert "Hi from 'cmd_tester' level 3 (B)!" in out + + # TODO need to consolidate with other similar tests + class TestErrorCases(CLICommon, ConfigCommmon): + def test_conflicting_namespaces(self): + orig_config = self.aux_cmd_configs_dir.joinpath("add_aux_cmd_config.toml") + conflicting_config = self.aux_cmd_configs_dir.joinpath("conflicting_namespaces_config.toml") + out = self.global_cmds.aux_cmds.get_help_msg_str(with_configs=[conflicting_config, orig_config]) + help = self.HelpMsg(out) + help.assert_subcmds(self.aux.ns.add_aux_cmd.base_cmd, *self.aux_cmd_ns_subcs) + assert "Auxillary commands namespaced 'add_aux_cmd' already exists." in out + assert f"Cannot add namespace from config '{conflicting_config}'" in out + assert f"Namespace first defined in config '{orig_config}'" in out + + @pytest.mark.xfail + def test_conflicting_command_names_within_namespace(self): + fail + + @pytest.mark.xfail + def test_conflicting_subcommand_names_within_namespace(self): + fail + + @pytest.mark.xfail + def test_same_name_commands_in_different_namespace(self): + fail + + @pytest.mark.xfail + def test_same_name_commands_within_namespace_but_different_level(self): + fail + + def test_invalid_aux_path(self): + ''' Should generate a logger error message but not kill the process''' + out = self.global_cmds.aux_cmds.get_help_msg_str(with_configs=self.aux_cmd_configs_dir.joinpath("invalid_aux_cmd_path_config.toml")) + help = self.HelpMsg(out) + help.assert_subcmds(self.aux.ns.add_aux_cmd.base_cmd, *self.aux_cmd_ns_subcs) + assert f"Unable to add auxillary commands at '{self.aux_cmd_configs_dir}{os.sep}./invalid_aux_cmd_path.toml' from config '{self.aux_cmd_configs_dir}{os.sep}invalid_aux_cmd_path_config.toml'. The following error was met" in out + + def test_missing_aux_cmd_impl_dir(self): + out = self.cmd_testers.error_cases.gen_error("missing_impl_dir", "missing_impl_dir_subc", return_stdout=True) + assert "Could not find implementation for aux command 'error_cases.missing_impl_dir.missing_impl_dir_subc'" in out + assert f"From root '{self.cmd_testers_root}', searched:" in out + assert "error_cases.missing_impl_dir.missing_impl_dir_subc.py" in out + assert f"error_cases{os.sep}missing_impl_dir.missing_impl_dir_subc.py" in out + + def test_missing_aux_cmd_impl_file(self): + out = self.cmd_testers.error_cases.gen_error("missing_impl_file", return_stdout=True) + assert "Could not find implementation for aux command 'error_cases.missing_impl_file'" in out + assert "error_cases.missing_impl_file.py" in out + assert f"error_cases{os.sep}missing_impl_file.py" in out + + def test_missing_run_function(self): + out = self.cmd_testers.error_cases.gen_error("test_missing_run_function", return_stdout=True) + f = self.cmd_testers_root.joinpath('error_cases/test_missing_run_function.py') + assert f"Could not find 'run' function in module '{f}'" in out + + def test_exception_from_run_function(self): + out = self.cmd_testers.error_cases.gen_error("test_exception_in_run") + assert "test_exception_in_run.py\", line 2" in out + assert "RuntimeError: Raising run time error in 'test_exception_in_run'" in out + + @pytest.mark.xfail + def test_no_help_str_given(self): + fail + + @pytest.mark.xfail + def test_override_help(self): + fail diff --git a/test_apps/python_no_app/tests/cmd_building/tests__loading_plugin_cmds.py b/test_apps/python_no_app/tests/cmd_building/tests__loading_plugin_cmds.py new file mode 100644 index 00000000..a7318323 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/tests__loading_plugin_cmds.py @@ -0,0 +1,104 @@ +import pytest +from .shared import CLICommon + +class Common(CLICommon): + pass + +class T_LoadingPluginCmds(Common): + class Test_PythonPluginCMDs(Common): + @pytest.fixture + def root_cmd(self): + return self.python_plugin.base_cmd + + @pytest.fixture + def hi_cmd(self): + return self.python_plugin.plugin_says_hi + + @pytest.fixture + def echo_cmd(self): + return self.python_plugin.echo + + @classmethod + def hi_msg(cls, to=None): + return f"Hi{(' ' + ','.join(to)) if to else ''} from the python plugin!" + + @classmethod + def hi_preface(cls, t=1): + return f"Saying hi {t} time(s)..." + + @classmethod + def echo_msg(cls, *input): + return f"Echoing '" + ','.join(input) + "' from python_plugin" + + def test_help_msg(self, root_cmd): + help = root_cmd.get_help_msg() + help.assert_bare_opts() + + help.assert_args(None) + help.assert_subcmds(*self.python_plugin.ordered_subcmds) + help.assert_not_extendable() + + def test_help_on_no_subcmd_given(self, root_cmd): + out = root_cmd.gen_error() + assert out == root_cmd.get_help_msg().text + + def test_hi_help_cmd(self, hi_cmd): + help = hi_cmd.get_help_msg() + help.assert_opts( + "h", + hi_cmd.loudly, hi_cmd.to, + "v", "vk", + hi_cmd.times, + ) + + def test_py_plugin_says_hi(self, hi_cmd): + out = hi_cmd.run() + assert self.hi_preface() in out + assert out.count(self.hi_msg()) == 1 + + def test_py_plugin_says_hi_3_times(self, hi_cmd): + out = hi_cmd.run(hi_cmd.times.sn_to_cli(), "3") + assert self.hi_preface(3) in out + assert out.count(self.hi_msg()) == 3 + + def test_py_plugin_says_hi_loudy_to(self, hi_cmd): + to = ["Scooby", "Shaggy"] + out = hi_cmd.run("--to", *to, "--loudly") + assert self.hi_preface() in out + assert out.count(self.hi_msg(to).upper()) == 1 + + def test_py_plugin_echo(self, echo_cmd): + s = "hello" + out = echo_cmd.run(s) + assert out.count(self.echo_msg(s)) == 1 + + def test_py_plugin_echo_multi(self, echo_cmd): + s = ["hello", "there"] + out = echo_cmd.run(*s) + assert out.count(self.echo_msg(*s)) == 1 + + s = ["hello", "there", "repeated"] + out = echo_cmd.run(*s, "-r") + assert out.count(self.echo_msg(*s)) == 2 + + def test_py_plugin_echo_delimited(self, echo_cmd): + s = ["hello", "there", "delimited"] + out = echo_cmd.run(','.join(s), "--repeat") + assert out.count(self.echo_msg(*s)) == 2 + + @pytest.mark.skip + def test_nested_cmds(self): + # TEST_NEEDED CLI test nested command from global invocation side + fail + + class Test_PythonPluginNoCMDs(Common): + @pytest.fixture + def root_cmd(self): + return self.plugins.python_plugin_no_cmds.base_cmd + + def test_no_cmds_in_plugin(self, root_cmd): + help = root_cmd.get_help_msg() + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds(None) + help.assert_not_extendable() diff --git a/test_apps/python_no_app/tests/cmd_building/tests__opt_building.py b/test_apps/python_no_app/tests/cmd_building/tests__opt_building.py new file mode 100644 index 00000000..df26f1c9 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/tests__opt_building.py @@ -0,0 +1,536 @@ +import pytest +from .shared import CLICommon + +class Common(CLICommon): + pass + +class T_OptBuilding(Common): + + class TestOptionSingleValueOpts(Common): + _cmd = Common.cmd_testers.test_args.single_value_optional_opt + + @pytest.fixture + def e_opt(self, cmd): + return cmd.explicit_single_val + + @pytest.fixture + def i_opt(self, cmd): + return cmd.implicit_single_val + + @pytest.fixture + def ev(self): + return "expl_value" + + @pytest.fixture + def iv(self): + return "impl_value" + + def test_help_msg(self, cmd, e_opt, i_opt): + help = cmd.get_help_msg() + help.assert_opts(e_opt, "help", i_opt, "v", "vk") + + def test_expl_sv_opt(self, cmd, e_opt, ev): + out = cmd.run(e_opt.ln_to_cli(), ev) + cmd.assert_args(out, (e_opt, ev)) + + def test_impl_sv_opt(self, cmd, i_opt, iv): + out = cmd.run(i_opt.ln_to_cli(), iv) + cmd.assert_args(out, (i_opt, iv)) + + def test_both_opts(self, cmd, e_opt, i_opt, ev, iv): + out = cmd.run(i_opt.ln_to_cli(), iv, e_opt.ln_to_cli(), ev) + cmd.assert_args(out, (i_opt, iv), (e_opt, ev)) + + def test_both_opts_in_reverse_order(self, cmd, e_opt, i_opt, ev, iv): + out = cmd.run(e_opt.ln_to_cli(), ev, i_opt.ln_to_cli(), iv) + cmd.assert_args(out, (i_opt, iv), (e_opt, ev)) + + def test_error_on_multi_opt(self, cmd, e_opt, ev): + another_ev = f"another_{ev}" + out = cmd.gen_error(e_opt.ln_to_cli(), ev, another_ev) + assert self.err_msgs.too_many_args(another_ev) in out + + class TestRequiredOpt(Common): + _cmd = Common.cmd_testers.test_args.single_value_required_opt + + @pytest.fixture + def o_opt(self, cmd): + return cmd.non_req_val + + @pytest.fixture + def r_opt(self, cmd): + return cmd.req_val + + @pytest.fixture + def ov(self): + return "opt_val" + + @pytest.fixture + def rv(self): + return "req_val" + + def test_help_msg(self, cmd, o_opt, r_opt): + help = cmd.get_help_msg() + help.assert_opts("help", o_opt, r_opt, "v", "vk") + + def test_req_opt_given(self, cmd, r_opt, rv): + out = cmd.run(r_opt.ln_to_cli(), rv) + cmd.assert_args(out, (r_opt, rv)) + + def test_req_and_optional_opt_given(self, cmd, o_opt, r_opt, ov, rv): + out = cmd.run(r_opt.ln_to_cli(), rv, o_opt.ln_to_cli(), ov) + cmd.assert_args(out, (r_opt, rv), (o_opt, ov)) + + def test_error_on_no_opts_given(self, cmd, r_opt): + out = cmd.gen_error() + assert self.err_msgs.missing_required_arg(r_opt) in out + + def test_error_on_optional_opt_only(self, cmd, r_opt, o_opt, ov): + out = cmd.gen_error(o_opt.ln_to_cli(), ov) + assert self.err_msgs.missing_required_arg(r_opt) in out + + class TestMultiValueOpts(Common): + _cmd = Common.cmd_testers.test_args.multi_opts + + @pytest.fixture + def m_opt(self, cmd): + return cmd.m_opt + + @pytest.fixture + def im_m_opt(self, cmd): + return cmd.im_m_opt + + @pytest.fixture + def req_m_opt(self, cmd): + return cmd.req_m_opt + + @pytest.fixture + def d_m_opt(self, cmd): + return cmd.d_m_opt + + @pytest.fixture + def d_im_m_opt(self, cmd): + return cmd.d_im_m_opt + + @pytest.fixture + def m_opt_v(self): + return ["m0"] + + @pytest.fixture + def im_m_opt_v(self): + return ["mA", "mB", "mC"] + + @pytest.fixture + def req_m_opt_v(self): + return ["r0", "r1"] + + @pytest.fixture + def d_m_opt_v(self): + return ["d0", "d1"] + + @pytest.fixture + def d_im_m_opt_v(self): + return ["i0", "i1", "i2"] + + @pytest.fixture + def m_opt_v_dlim(self): + return "m0" + + @pytest.fixture + def im_m_opt_v_dlim(self): + return "mA,mB,mC" + + @pytest.fixture + def req_m_opt_v_dlim(self): + return "r0,r1" + + @pytest.fixture + def d_m_opt_v_dlim(self): + return "d0,d1" + + @pytest.fixture + def d_im_m_opt_v_dlim(self): + return "i0,i1,i2" + + def test_help_msg(self, cmd, m_opt, im_m_opt, req_m_opt, d_m_opt, d_im_m_opt): + help = cmd.get_help_msg() + help.assert_opts(d_im_m_opt, d_m_opt, "help", im_m_opt, m_opt, req_m_opt, "v", "vk") + + def test_all_multi_val_opts_given(self, cmd, + m_opt, im_m_opt, req_m_opt, d_m_opt, d_im_m_opt, + m_opt_v, im_m_opt_v, req_m_opt_v, d_m_opt_v, d_im_m_opt_v + ): + out = cmd.run( + m_opt.ln_to_cli(), *m_opt_v, + im_m_opt.ln_to_cli(), *im_m_opt_v, + req_m_opt.ln_to_cli(), *req_m_opt_v, + d_m_opt.ln_to_cli(), *d_m_opt_v, + d_im_m_opt.ln_to_cli(), *d_im_m_opt_v + ) + cmd.assert_args( + out, + (m_opt, m_opt_v), + (im_m_opt, im_m_opt_v), + (req_m_opt, req_m_opt_v), + (d_m_opt, d_m_opt_v), + (d_im_m_opt, d_im_m_opt_v), + ) + + def test_delimited_is_not_the_default(self, cmd, + m_opt, im_m_opt, req_m_opt, d_m_opt, d_im_m_opt, + d_m_opt_v, d_im_m_opt_v, + m_opt_v_dlim, im_m_opt_v_dlim, req_m_opt_v_dlim, d_m_opt_v_dlim, d_im_m_opt_v_dlim + ): + out = cmd.run( + m_opt.ln_to_cli(), m_opt_v_dlim, + im_m_opt.ln_to_cli(), im_m_opt_v_dlim, + req_m_opt.ln_to_cli(), req_m_opt_v_dlim, + d_m_opt.ln_to_cli(), d_m_opt_v_dlim, + d_im_m_opt.ln_to_cli(), d_im_m_opt_v_dlim + ) + cmd.assert_args( + out, + (m_opt, [m_opt_v_dlim]), + (im_m_opt, [im_m_opt_v_dlim]), + (req_m_opt, [req_m_opt_v_dlim]), + (d_m_opt, d_m_opt_v), + (d_im_m_opt, d_im_m_opt_v), + ) + + def test_multiple_occurrences_stack(self, cmd, m_opt, req_m_opt, m_opt_v, im_m_opt_v, req_m_opt_v): + out = cmd.run( + m_opt.ln_to_cli(), *m_opt_v, + m_opt.ln_to_cli(), *im_m_opt_v, + req_m_opt.ln_to_cli(), *req_m_opt_v, + req_m_opt.ln_to_cli(), *req_m_opt_v, + ) + cmd.assert_args( + out, + (m_opt, [*m_opt_v, *im_m_opt_v]), + (req_m_opt, [*req_m_opt_v, *req_m_opt_v]), + ) + + def test_error_on_missing_required_opt(self, cmd, req_m_opt): + out = cmd.gen_error() + assert self.err_msgs.missing_required_arg(req_m_opt) in out + + class TestFlagOpts(Common): + _cmd = Common.cmd_testers.test_args.flag_opts + + @pytest.fixture + def e_opt(self, cmd): + return cmd.ex_f_opt + + @pytest.fixture + def i_opt(self, cmd): + return cmd.im_f_opt + + def test_help_msg(self, cmd, e_opt, i_opt): + help = cmd.get_help_msg() + help.assert_opts(e_opt, "help", i_opt, "v", "vk") + + def test_no_flag_opts_given(self, cmd): + out = cmd.run() + cmd.assert_args(out, None) + + def test_one_flag_opt_given(self, cmd, e_opt): + out = cmd.run(e_opt.ln_to_cli()) + cmd.assert_args(out, (e_opt, 1)) + + def test_two_flag_opts_given(self, cmd, e_opt, i_opt): + out = cmd.run(e_opt.ln_to_cli(), i_opt.ln_to_cli()) + cmd.assert_args(out, (e_opt, 1), (i_opt, 1)) + + def test_multiple_occurrences_stack(self, cmd, e_opt, i_opt): + out = cmd.run( + e_opt.ln_to_cli(), + e_opt.ln_to_cli(), + i_opt.ln_to_cli(), + e_opt.ln_to_cli(), + i_opt.ln_to_cli() + ) + cmd.assert_args(out, (e_opt, 3), (i_opt, 2)) + + def test_error_on_flag_opt_with_value(self, cmd, i_opt): + sv = "single_val" + out = cmd.gen_error(i_opt.ln_to_cli(), sv) + assert self.err_msgs.too_many_args(sv) in out + + class TestOptsWithValueNames(Common): + _cmd = Common.cmd_testers.test_args.opts_with_value_names + + @pytest.fixture + def e_s_opt(self, cmd): + return cmd.s_opt_nv_ex_tv + + @pytest.fixture + def i_s_opt(self, cmd): + return cmd.s_opt_nv_im_tv + + @pytest.fixture + def m_opt(self, cmd): + return cmd.m_opt_named_val + + @pytest.fixture + def ln_s_opt(self, cmd): + return cmd.s_opt_ln_nv + + @pytest.fixture + def sv_e(self): + return "ex_single_val" + + @pytest.fixture + def sv_i(self): + return "im_single_val" + + @pytest.fixture + def mv(self): + return ["mv0", "mv1"] + + def test_help_msg(self, cmd, e_s_opt, i_s_opt, m_opt, ln_s_opt): + help = cmd.get_help_msg() + help.assert_opts("help", m_opt, ln_s_opt, e_s_opt, i_s_opt, "v", "vk") + + def test_single_value_opt_with_value_name(self, cmd, e_s_opt, i_s_opt, sv_e, sv_i): + out = cmd.run(i_s_opt.ln_to_cli(), sv_i, e_s_opt.ln_to_cli(), sv_e) + cmd.assert_args(out, (i_s_opt, sv_i), (e_s_opt, sv_e)) + + def test_multi_value_opt_with_value_name(self, cmd, m_opt, mv): + out = cmd.run(m_opt.ln_to_cli(), *mv) + cmd.assert_args(out, (m_opt, mv)) + + def test_single_value_opt_with_value_and_long_names(self, cmd, ln_s_opt, sv_i): + out = cmd.run(ln_s_opt.ln_to_cli(), sv_i) + cmd.assert_args(out, (ln_s_opt, sv_i)) + + class TestOptsWithAliases(Common): + _cmd = Common.cmd_testers.test_args.opts_with_aliases + + @pytest.fixture + def s_opt(self, cmd): + return cmd.single_opt + + @pytest.fixture + def m_opt(self, cmd): + return cmd.multi_opt + + @pytest.fixture + def oc_opt(self, cmd): + return cmd.occurrence_counter + + @pytest.fixture + def f_sn_opt(self, cmd): + return cmd.flag_opt_short_name + + @pytest.fixture + def f_ln_opt(self, cmd): + return cmd.flag_opt_long_name + + @pytest.fixture + def f_dupl_ln_sn_opt(self, cmd): + return cmd.flag_opt_dupl_ln_sn + + @pytest.fixture + def f_sn_al_opt(self, cmd): + return cmd.fo_sn_aliases + + @pytest.fixture + def f_sn_and_al_opt(self, cmd): + return cmd.fo_sn_and_aliases + + @pytest.fixture + def f_ln_al_opt(self, cmd): + return cmd.fo_ln_aliases + + @pytest.fixture + def f_ln_and_al_opt(self, cmd): + return cmd.fo_ln_and_aliases + + @pytest.fixture + def f_ln_sn_al_opt(self, cmd): + return cmd.fo_sn_ln_aliases + + @pytest.fixture + def tv(self): + return "single_test_val" + + def test_help_msg(self, cmd, + s_opt, m_opt, oc_opt, f_sn_opt, f_ln_opt, + f_dupl_ln_sn_opt, f_ln_al_opt, f_sn_al_opt, + f_sn_and_al_opt, f_ln_and_al_opt, f_ln_sn_al_opt + ): + help = cmd.get_help_msg() + help.assert_args(None) + help.assert_opts( + f_sn_and_al_opt, + f_dupl_ln_sn_opt, + f_sn_opt, + f_ln_and_al_opt, + f_ln_al_opt, + f_sn_al_opt, + f_ln_sn_al_opt, + "help", + f_ln_opt, + m_opt, + oc_opt, + s_opt, + "v", + "vk" + ) + + def test_single_val_opt_as_long_name(self, cmd, s_opt, tv): + # Try single opt long name + out = cmd.run(s_opt.ln_to_cli(), tv) + cmd.assert_args(out, (s_opt, tv)) + + def test_single_val_opt_as_short_name(self, cmd, s_opt, tv): + # Try single opt short name + out = cmd.run(s_opt.sn_to_cli(), tv) + cmd.assert_args(out, (s_opt, tv)) + + def test_error_on_single_val_opt_name(self, cmd, s_opt, tv): + # Try single opt opt name + # Should fail as ln and sn are used on the CLI + out = cmd.gen_error(f"--{s_opt.name}", tv) + assert self.err_msgs.unknown_opt_msg(s_opt) in out + + def test_multi_val_opt_as_long_name(self, cmd, m_opt, tv): + # Try multi opt long name + out = cmd.run(m_opt.ln_to_cli(), tv, tv) + cmd.assert_args(out, (m_opt, [tv, tv])) + + def test_multi_val_opt_as_short_name(self, cmd, m_opt, tv): + # Try multi opt short name + out = cmd.run(m_opt.sn_to_cli(), tv, tv, tv) + cmd.assert_args(out, (m_opt, [tv, tv, tv])) + + def test_error_on_multi_val_opt_name(self, cmd, m_opt, tv): + # Try multi opt opt name + # Should fail as ln and sn are used on the CLI + out = cmd.gen_error(f"--{m_opt.name}", tv) + assert self.err_msgs.unknown_opt_msg(m_opt) in out + + def test_multi_val_opt_ln_sn_stacking(self, cmd, m_opt, tv): + # Try multi opt stacking + out = cmd.run( + m_opt.sn_to_cli(), tv, tv, + m_opt.ln_to_cli(), tv, tv, + m_opt.sn_to_cli(), tv + ) + cmd.assert_args(out, (m_opt, [tv, tv, tv, tv, tv])) + + def test_flag_opt_long_name(self, cmd, oc_opt): + # Try occurrence counter long name + out = cmd.run(oc_opt.ln_to_cli()) + cmd.assert_args(out, (oc_opt, 1)) + + def test_flag_opt_short_name(self, cmd, oc_opt): + # Try occurrence counter short name + out = cmd.run(oc_opt.sn_to_cli()) + cmd.assert_args(out, (oc_opt, 1)) + + def test_flag_opt_ln_sn_stacking(self, cmd, oc_opt): + # Try occurrence counter with both short and long name + out = cmd.run(oc_opt.sn_to_cli(), oc_opt.ln_to_cli(), oc_opt.sn_to_cli(), oc_opt.ln_to_cli()) + cmd.assert_args(out, (oc_opt, 4)) + + def test_error_on_flag_opt_name(self, cmd, oc_opt): + # Try occurrence counter opt name + out = cmd.gen_error(f"--{oc_opt.name}") + assert self.err_msgs.unknown_opt_msg(oc_opt) in out + + def test_flag_opt_with_short_name_only(self, cmd, f_sn_opt): + # Try flag opt short only + out = cmd.run(f_sn_opt.sn_to_cli()) + cmd.assert_args(out, (f_sn_opt, 1)) + + def test_error_on_short_name_only_opt_name(self, cmd, f_sn_opt): + # Try flag opt short only opt name + # Should generate an error + out = cmd.gen_error(f"--{f_sn_opt.name}") + assert self.err_msgs.unknown_opt_msg(f_sn_opt) in out + + def test_flag_opt_with_long_name_only(self, cmd, f_ln_opt): + # Try flag opt long only + out = cmd.run(f_ln_opt.ln_to_cli()) + cmd.assert_args(out, (f_ln_opt, 1)) + + def test_error_on_long_name_only_opt_name(self, cmd, f_ln_opt): + # Try flag opt long only opt name + # Should generate an error + out = cmd.gen_error(f"--{f_ln_opt.name}") + assert self.err_msgs.unknown_opt_msg(f_ln_opt) in out + + def test_no_conflict_between_ln_and_sn(self, cmd, f_sn_opt, f_dupl_ln_sn_opt): + # Try flag opt long name same as another's short name + out = cmd.run("--f") + cmd.assert_args(out, (f_dupl_ln_sn_opt, 1)) + + out = cmd.run("--f", "-f") + cmd.assert_args(out, (f_dupl_ln_sn_opt, 1), (f_sn_opt, 1)) + + def test_short_name_aliasing(self, cmd, f_sn_al_opt): + # Try short name aliases + out = cmd.run(f'--{f_sn_al_opt.name}', '-a', '-b') + cmd.assert_args(out, (f_sn_al_opt, 3)) + + def test_sn_with_sn_aliases(self, cmd, f_sn_and_al_opt): + # Try short name with aliases + out = cmd.run('-c', '-d', '-e') + cmd.assert_args(out, (f_sn_and_al_opt, 3)) + + def test_error_on_opt_name_with_sn_and_sn_aliases(self, cmd, f_sn_and_al_opt): + out = cmd.gen_error(f"--{f_sn_and_al_opt.name}", '-d', '-e') + assert self.err_msgs.unknown_opt_msg(f_sn_and_al_opt) in out + + def test_long_name_aliasing(self, cmd, f_ln_al_opt): + # Try long name aliases + out = cmd.run(f"--{f_ln_al_opt.name}", '--fa', '--fb') + cmd.assert_args(out, (f_ln_al_opt, 3)) + + def test_ln_with_ln_aliases(self, cmd, f_ln_and_al_opt): + # Try long name with aliases + out = cmd.run('--fc', '--fd', '--fe') + cmd.assert_args(out, (f_ln_and_al_opt, 3)) + + def test_error_on_opt_name_with_ln_and_ln_aliases(self, cmd, f_ln_and_al_opt): + out = cmd.gen_error(f"--{f_ln_and_al_opt.name}", '--fd', '--fe') + assert self.err_msgs.unknown_opt_msg(f_ln_and_al_opt) in out + + def test_sn_and_ln_aliases_only(self, cmd, f_ln_sn_al_opt): + # Try long/short name aliases + out = cmd.run(f'--{f_ln_sn_al_opt.name}', '-z', '--sn_ln_1', '--sn_ln_2') + cmd.assert_args(out, (f_ln_sn_al_opt, 4)) + + class TestHiddenOpts(Common): + _cmd = Common.cmd_testers.test_args.hidden_opt + + @pytest.fixture + def h_opt(self, cmd): + return cmd.hidden_opt + + @pytest.fixture + def v_opt(self, cmd): + return cmd.visible_opt + + def test_help_msg(self, cmd, v_opt): + help = cmd.get_help_msg() + help.assert_args(None) + help.assert_opts("help", "v", "vk", v_opt) + + def test_hidden_opt_is_available(self, cmd, h_opt): + out = cmd.run(h_opt.ln_to_cli()) + cmd.assert_args(out, (h_opt, 1)) + + def test_visible_opt_only(self, cmd, v_opt): + out = cmd.run(v_opt.ln_to_cli()) + cmd.assert_args(out, (v_opt, 1)) + + def test_hidden_and_visible_opt_only(self, cmd, h_opt, v_opt): + out = cmd.run(h_opt.ln_to_cli(), h_opt.ln_to_cli(), v_opt.ln_to_cli()) + cmd.assert_args(out, (h_opt, 2), (v_opt, 1)) + + def test_error_on_random_opt(self, cmd): + r_opt = "random" + out = cmd.gen_error(f"--{r_opt}") + assert self.err_msgs.unknown_opt_msg(r_opt) in out diff --git a/test_apps/python_no_app/tests/cmd_building/tests__standard_opts.py b/test_apps/python_no_app/tests/cmd_building/tests__standard_opts.py new file mode 100644 index 00000000..aae5a828 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_building/tests__standard_opts.py @@ -0,0 +1,38 @@ +from .shared import CLICommon + +# Uses custom format output from ./cmd_building/cmd_testers/test_arguments/display_verbosity_opts.py +class T_StandardOpts(CLICommon): + def test_empty_verbosity_is_accessible(self): + out = self.cmd_testers.display_v.run() + assert r'Args: {}' in out + assert "verbosity: 0" in out + + def test_single_verbosity_is_accessible(self): + out = self.cmd_testers.display_v.run("-v") + assert r'Args: {}' in out + assert "verbosity: 1" in out + + def test_stacked_verbosity_is_accessible(self): + out = self.cmd_testers.display_v.run("-vv") + assert r'Args: {}' in out + assert "verbosity: 2" in out + + def test_stacked_split_verbosity_is_accessible(self): + out = self.cmd_testers.display_v.run("-vv", "-v") + assert r'Args: {}' in out + assert "verbosity: 3" in out + + def test_empty_verbosity_keywords_are_accessible(self): + out = self.cmd_testers.display_v.run() + assert r'Args: {}' in out + assert "keywords: []" in out + + def test_verbosity_keywords_are_accessible(self): + out = self.cmd_testers.display_v.run("--vk", "t1,t2", "-v") + assert r'Args: {}' in out + assert "keywords: ['t1', 't2']" in out + assert "verbosity: 1" in out + + def test_verbosity_help(self): + help = self.cmd_testers.display_v.get_help_msg() + help.assert_bare_opts() diff --git a/test_apps/python_no_app/tests/cmd_exts/tests__ext_conflicts.py b/test_apps/python_no_app/tests/cmd_exts/tests__ext_conflicts.py new file mode 100644 index 00000000..0fa15dc2 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_exts/tests__ext_conflicts.py @@ -0,0 +1,337 @@ +import pytest +from test_apps_shared_test_helpers.cli import CLIShared + +class Common(CLIShared): + @pytest.fixture + def exts(self): + return self.config["exts_by_ns"] + + @pytest.fixture + def ec(self, exts): + return exts.ec + + @pytest.fixture + def tas(self, exts): + return exts.tas + +class T_ExtConflicts(CLIShared): + class TestWithPLCmd(Common): + config = CLIShared.exts.ext_conflicts["plugin.python_plugin.plugin_test_args"] + conflicts = config["conflicts_list"] + cmd = CLIShared.python_plugin.plugin_test_args.extend( + config["exts"], + from_configs=[config["cfg"]], + with_env=config["env"] + ) + + @classmethod + def setup_class(cls): + cls.cmd_help = cls.cmd.get_help_msg() + cls.cmd_conflicts = cls.cmd_help.logged_errors + + @classmethod + def teardown_class(cls): + delattr(cls, "cmd_help") + delattr(cls, "cmd_conflicts") + + def test_help_msg(self, ec, tas): + # Check help message + cmd = self.cmd + help = self.cmd_help + + help.assert_args(cmd.single_arg, cmd.multi_arg) + help.assert_opts( + ec.aux_conflict_ln_and_aliases, + ec.conflict_sn, + ec.alias, + ec.flag, + ec.pl_aux_conflict, + tas.flag, + ec.ext_opt_in_ln, + ec.ext_opt_in_lna, + ec.ext_self_conflict, + ec.ext_self_conflict_2, + cmd.flag_opt, + ec.repeated_sn_and_aliases, + "help", + cmd.sn_only, + ec.ns_self_conflict, + cmd.opt_taking_value, + tas.opt_taking_value, + cmd.opt_with_aliases, + ec.opt_taking_value, + tas.pl_aux_conflict, + ec.pl_aux_sn_conflict_aux, + tas.pl_conflict_ln_and_aliases, + tas.pl_aux_sn_conflict_pl, + ec.same_iln_and_ln_alias, + ec.same_ln_and_ln_alias, + ec.single_arg, + ec.subc, + "v", + "vk", + ) + help.assert_subcmds("help", cmd.subc) + + assert help.aux_exts == ['ext_conflicts'] + assert help.pl_exts == ['test_apps_shared_test_helpers'] + assert help.app_exts == False + + def test_conflict_messages(self): + for c in reversed(self.conflicts): + assert self.err_msgs.to_conflict_msg(self.cmd, c) in self.cmd_conflicts.pop() + + def test_error_messages_checked(self): + assert len(self.cmd_conflicts) == 0 + + def test_ext_conflicts_resolve_correctly(self, tas, ec): + cmd = self.cmd + out = cmd.run( + "abc", "d", "e", + "--opt", "z", + "--flag", "--flag", "--flag", + "-n", + "-a", "--alias", "-b", + + "--single_arg", + "--otv", + "--conflict_sn", + "--ext_opt.aux.ext_conflicts.pl_aux_conflict", + "--pl_aux_sn_conflict_aux", + "--other_alias_aux", "-d", + "--ext_opt.aux.ext_conflicts.flag", + "--ext_opt.aux.ext_conflicts.alias", "--alias_aux", + "--subc", + "--ns_self_conflict", + "--ext_self_conflict", + "--ext_self_conflict_2_1", "--ext_self_conflict_2", + "--ext_opt_in_ln", + "--ext_opt_in_lna", "--ext_opt_in_lna_2", + "--same_ln_and_ln_alias", + "--same_iln_and_ln_alias", + "-g", "-e", "--repeated_lna", + + "--pl_aux_conflict", "--pl_aux_conflict", '--pl_aux_conflict', '--pl_aux_conflict', + "-s", "-s", + "--opt_taking_value", + "--other_alias_pl", "--pl_conflict_ln_and_aliases", "-c", + "--ext_opt.plugin.test_apps_shared_test_helpers.flag", "--ext_opt.plugin.test_apps_shared_test_helpers.flag", + ) + cmd.assert_args( + out, + (cmd.single_arg, "abc"), + (cmd.multi_arg, ["d", "e"]), + (cmd.flag_opt, 3), + (cmd.sn_only, 1), + (cmd.opt_taking_value, "z"), + (cmd.opt_with_aliases, 3), + + (ec.single_arg, 1), + (ec.opt_taking_value, 1), + (ec.conflict_sn, 1), + (ec.pl_aux_conflict, 1), + (ec.pl_aux_sn_conflict_aux, 1), + (ec.aux_conflict_ln_and_aliases, 2), + (ec.flag, 1), + (ec.alias, 2), + (ec.subc, 1), + (ec.ns_self_conflict, 1), + (ec.ext_self_conflict, 1), + (ec.ext_self_conflict_2, 2), + (ec.ext_opt_in_ln, 1), + (ec.ext_opt_in_lna, 2), + (ec.same_ln_and_ln_alias, 1), + (ec.same_iln_and_ln_alias, 1), + (ec.repeated_sn_and_aliases, 3), + + (tas.pl_aux_conflict, 4), + (tas.pl_aux_sn_conflict_pl, 2), + (tas.opt_taking_value, 1), + (tas.pl_conflict_ln_and_aliases, 3), + (tas.flag, 2), + ) + + class TestWithPLSubcmd(Common): + config = CLIShared.exts.ext_conflicts["plugin.python_plugin.plugin_test_args.subc"] + cmd = CLIShared.python_plugin.plugin_test_args.subc.extend( + config["exts"], + from_configs=[config["cfg"]], + with_env=config["env"] + ) + + @classmethod + def setup_class(cls): + cls.cmd_help = cls.cmd.get_help_msg() + cls.cmd_conflicts = cls.cmd_help.logged_errors + + @classmethod + def teardown_class(cls): + delattr(cls, "cmd_help") + delattr(cls, "cmd_conflicts") + + def test_help_msg(self, ec, tas): + cmd = self.cmd + help = self.cmd_help + + help.assert_args(cmd.single_arg) + help.assert_opts( + tas.subc_pl_aux_conflict, + ec.flag_opt, + ec.more_conflicts, + tas.flag_opt, + cmd.flag_opt, + "help", + tas.more_conflicts, + cmd.subc_sn_only, + cmd.subc_opt_with_aliases, + ec.subc_pl_aux_conflict, + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ['ext_conflicts'] + assert help.pl_exts == ['test_apps_shared_test_helpers'] + assert help.app_exts == False + + def test_conflict_messages(self): + cmd = self.cmd + conflicts = self.config["conflicts_list"] + + for c in reversed(conflicts): + m = self.err_msgs.to_conflict_msg(cmd, c) + assert m in self.cmd_conflicts.pop() + + def test_all_errors_checked(self): + assert len(self.cmd_conflicts) == 0 + + def test_conflicts_resolve_correctly(self, tas, ec): + cmd = self.cmd + out = cmd.run( + "argv", + "--flag_opt", + "-n", "-n", + "-a", "--subc_opt", "-b", "--subc_alias", + + '--pl0', '--pl1', '-c', '--subc_pl_aux', + '--ext_opt.plugin.test_apps_shared_test_helpers.flag_opt', '--ext_opt.plugin.test_apps_shared_test_helpers.flag_opt', + '--more_conflicts', '-d', '--more_conflicts', + + "-e", "--aux0", "--subc_pl_aux_conflict", + "--ext_opt.aux.ext_conflicts.flag_opt", "--ext_opt.aux.ext_conflicts.flag_opt", "--ext_opt.aux.ext_conflicts.flag_opt", + '--ext_opt.aux.ext_conflicts.more_conflicts', '--ext_opt.aux.ext_conflicts.more_conflicts' + ) + cmd.assert_args( + out, + (cmd.single_arg, "argv"), + (cmd.flag_opt, 1), + (cmd.subc_sn_only, 2), + (cmd.subc_opt_with_aliases, 4), + + (tas.subc_pl_aux_conflict, 4), + (tas.flag_opt, 2), + (tas.more_conflicts, 3), + + (ec.subc_pl_aux_conflict, 3), + (ec.flag_opt, 3), + (ec.more_conflicts, 2), + ) + + class TestWithCoreCmd(CLIShared): + eval_config = CLIShared.exts.ext_conflicts["origen.eval"] + eval_cmd = CLIShared.cmds.eval.extend( + CLIShared.exts.exts["origen.eval"]["global_exts"] + eval_config["exts"], + from_configs=[eval_config["cfg"]], + with_env=eval_config["env"] + ) + + creds_clear_config = CLIShared.exts.ext_conflicts["origen.credentials.clear"] + creds_clear_cmd = CLIShared.cmds.creds.clear.extend( + creds_clear_config["exts"], + from_configs=[creds_clear_config["cfg"]], + with_env=creds_clear_config["env"] + ) + + @classmethod + def setup_class(cls): + cls.eval_cmd_help = cls.eval_cmd.get_help_msg() + cls.eval_cmd_conflicts = cls.eval_cmd_help.logged_errors + cls.creds_clear_cmd_help = cls.creds_clear_cmd.get_help_msg() + cls.creds_clear_cmd_conflicts = cls.creds_clear_cmd_help.logged_errors + + @classmethod + def teardown_class(cls): + delattr(cls, "eval_cmd_help") + delattr(cls, "eval_cmd_conflicts") + delattr(cls, "creds_clear_cmd_help") + delattr(cls, "creds_clear_cmd_conflicts") + + def test_ext_arg_conflicts_with_core_cmd_help_msg(self): + cmd = self.eval_cmd + help = self.eval_cmd_help + aux_code_opt = CLIShared.exts.ext_conflicts["origen.eval"]["exts"][0] + pl_code_opt = CLIShared.exts.ext_conflicts["origen.eval"]["exts"][1] + + help.assert_args(cmd.code) + help.assert_opts( + cmd.say_hi_after_eval, + cmd.say_hi_before_eval, + pl_code_opt, + aux_code_opt, + "help", + cmd.scripts, + cmd.say_hi_during_cleanup, + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ['ext_conflicts'] + assert help.pl_exts == ["python_plugin", 'test_apps_shared_test_helpers'] + assert help.app_exts == False + + def test_ext_arg_conflicts_with_core_cmd_msgs(self): + # Use eval cmd for arg + cmd = self.eval_cmd + + conflicts = self.eval_config["conflicts_list"] + for c in reversed(conflicts): + m = self.err_msgs.to_conflict_msg(cmd, c) + assert m in self.eval_cmd_conflicts.pop() + assert len(self.eval_cmd_conflicts) == 0 + + + def test_ext_opt_conflicts_with_core_cmd_help_msg(self): + cmd = self.creds_clear_cmd + help = self.creds_clear_cmd_help + ec = self.creds_clear_config["exts_by_ns"].ec + tas = self.creds_clear_config["exts_by_ns"].tas + + help.assert_args(None) + help.assert_opts( + cmd.all, + ec.cmd_conflicts_aux, + tas.cmd_conflicts_pl, + cmd.datasets, + ec.all, + tas.all, + "help", + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ['ext_conflicts'] + assert help.pl_exts == ['test_apps_shared_test_helpers'] + assert help.app_exts == False + + + def test_ext_opt_conflicts_with_core_cmd(self): + # Use credentials.clear for opts + cmd = self.creds_clear_cmd + + conflicts = self.creds_clear_config["conflicts_list"] + for c in reversed(conflicts): + m = self.err_msgs.to_conflict_msg(cmd, c) + assert m in self.creds_clear_cmd_conflicts.pop() + assert len(self.creds_clear_cmd_conflicts) == 0 diff --git a/test_apps/python_no_app/tests/cmd_exts/tests__extending_cmds.py b/test_apps/python_no_app/tests/cmd_exts/tests__extending_cmds.py new file mode 100644 index 00000000..46bffb17 --- /dev/null +++ b/test_apps/python_no_app/tests/cmd_exts/tests__extending_cmds.py @@ -0,0 +1,646 @@ +import pytest +from test_apps_shared_test_helpers.cli import CLIShared, CmdExtOpt + +class Common(CLIShared): + sv = "single_val" + +class T_ExtendingCmds(CLIShared): + class TestExtensionOpts(Common): + cmd = CLIShared.python_plugin.plugin_test_args.extend( + CLIShared.exts.exts["plugin.python_plugin.plugin_test_args"]["exts"], + from_configs=CLIShared.exts.exts_workout_cfg + ) + subcmd = CLIShared.python_plugin.plugin_test_args.subc.extend( + CLIShared.exts.exts["plugin.python_plugin.plugin_test_args.subc"]["exts"], + from_configs=CLIShared.exts.exts_workout_cfg + ) + + ext_flag = cmd.flag_extension + ext_sa = cmd.single_val_opt + ext_ma = cmd.multi_val_opt + ext_ma_delim = cmd.multi_val_delim_opt + ext_action = cmd.exts_workout_action + ext_ha = cmd.hidden_opt + sa = cmd.single_arg + ma = cmd.multi_arg + sv_opt = cmd.opt_taking_value + f_opt = cmd.flag_opt + opt_als = cmd.opt_with_aliases + sn_only = cmd.sn_only + + mv = ["m0", "m1", "m2"] + ov = "opt_value" + ext_sv = "ext_single_val" + ext_mv = ["mv0", "mv1"] + ext_mvd = ["mvd0", "mvd1"] + ext_rv = ["no_action"] + + def test_help_msg(self): + help = self.cmd.get_help_msg() + help.assert_args(self.sa, self.ma) + help.assert_opts( + self.ext_action, + self.ext_flag, + self.f_opt, + "help", + self.ext_ma, + self.ext_ma_delim, + self.sn_only, + self.sv_opt, + self.opt_als, + self.ext_sa, + "v", + "vk", + ) + help.assert_subcmds("help", self.cmd.subc) + + assert help.aux_exts == ['exts_workout'] + assert help.pl_exts == None + assert help.app_exts == False + + def test_using_extended_opts(self): + out = self.cmd.run( + self.sv, *self.mv, + self.ext_flag.ln_to_cli(), self.ext_flag.sn_to_cli(), + self.cmd.opt_taking_value.ln_to_cli(), self.ov, + self.ext_sa.sn_to_cli(), self.ext_sv, + self.ext_ma.ln_to_cli(), *self.ext_mv, ','.join(self.ext_mvd), + self.ext_ma_delim.ln_to_cli(), ','.join(self.ext_mvd), + self.ext_action.ln_to_cli(), *self.ext_rv, + self.cmd.flag_opt.ln_to_cli(), + self.ext_ha.ln_to_cli(), + self.cmd.flag_opt.ln_to_cli(), + ) + self.cmd.assert_args( + out, + (self.cmd.single_arg, self.sv), + (self.cmd.multi_arg, self.mv), + (self.cmd.opt_taking_value, self.ov), + (self.cmd.flag_opt, 2), + (self.ext_flag, 2), + (self.ext_sa, self.ext_sv), + (self.ext_ma, [*self.ext_mv, ','.join(self.ext_mvd)]), + (self.ext_ma_delim, self.ext_mvd), + (self.ext_action, self.ext_rv), + (self.ext_ha, 1), + ) + + def test_error_on_required_ext_opt(self): + err = self.cmd.gen_error("single_val") + assert self.err_msgs.missing_required_arg(self.ext_action) in err + + def test_accessing_cmd_args_from_ext(self): + actions = ["show_cmd_args"] + out = self.cmd.run( + self.sv, *self.mv, + self.ext_action.ln_to_cli(), *actions + ) + self.cmd.assert_args( + out, + (self.cmd.single_arg, self.sv), + (self.cmd.multi_arg, self.mv), + (self.ext_action, actions), + ) + r = self.get_action_results(out, actions) + assert eval(r["show_cmd_args"]["Before"]) == { + self.cmd.single_arg.name: self.sv, + self.cmd.multi_arg.name: self.mv + } + assert eval(r["show_cmd_args"]["After"]) == { + self.cmd.single_arg.name: self.sv, + self.cmd.multi_arg.name: self.mv + } + + def test_accessing_ext_args_directly(self): + actions = ["show_ext_args"] + out = self.cmd.run( + self.sv, *self.mv, + self.ext_action.ln_to_cli(), *actions + ) + self.cmd.assert_args( + out, + (self.cmd.single_arg, self.sv), + (self.cmd.multi_arg, self.mv), + (self.ext_action, actions), + ) + r = self.get_action_results(out, actions) + assert eval(r["show_ext_args"]["Before"]) == { + "aux.exts_workout": {self.ext_action.name: actions} + } + assert eval(r["show_ext_args"]["After"]) == { + "aux.exts_workout": {self.ext_action.name: actions} + } + + def test_manipulating_cmd_args_in_ext(self): + actions = ["show_cmd_args", "set_arg__cmd__single_arg__updated"] + out = self.cmd.run( + self.sv, *self.mv, + self.ext_action.ln_to_cli(), *actions + ) + self.cmd.assert_args( + out, + (self.cmd.single_arg, "updated"), + (self.cmd.multi_arg, self.mv), + (self.ext_action, actions), + ) + r = self.get_action_results(out, actions) + assert eval(r["show_cmd_args"]["Before"]) == { + self.cmd.single_arg.name: self.sv, + self.cmd.multi_arg.name: self.mv + } + assert eval(r["show_cmd_args"]["After"]) == { + self.cmd.single_arg.name: "updated", + self.cmd.multi_arg.name: self.mv + } + + def test_manipulating_ext_args_in_ext(self): + actions = ["show_ext_args", "exts_workout__test_updating_args"] + out = self.cmd.run( + self.sv, + self.ext_action.ln_to_cli(), *actions, + self.ext_sa.sn_to_cli(), self.ext_sv, + self.ext_ma.ln_to_cli(), *self.ext_mv, + self.ext_ma_delim.ln_to_cli(), ','.join(self.ext_mvd), + self.ext_flag.ln_to_cli(), + self.ext_flag.ln_to_cli(), + ) + self.cmd.assert_args( + out, + (self.cmd.single_arg, self.sv), + (self.ext_flag, 3, {"Before": 2}), + (self.ext_sa, "update_sv_opt", {"Before": self.ext_sv}), + (self.ext_ma, self.ext_mv + ["update_mv_opt"], {"Before": self.ext_mv}), + (self.ext_ma_delim, self.ext_mvd), + (self.ext_action, actions), + (CmdExtOpt("new_arg", src_name="exts_workout"), "new_arg_for_ext", {"Before": False}) + ) + + def test_extending_subcommand(self): + actions = ["no_action"] + out = self.subcmd.run( + self.sv, + self.subcmd.flag_opt.ln_to_cli(), + self.subcmd.exts_workout_action.ln_to_cli(), + *actions, + ) + self.subcmd.assert_args( + out, + (self.subcmd.single_arg, self.sv), + (self.subcmd.flag_opt, 1), + (self.subcmd.exts_workout_action, actions), + ) + + def test_subc_help_msg(self): + subc = self.subcmd + help = subc.get_help_msg() + help.assert_args(subc.single_arg) + help.assert_opts( + subc.exts_workout_action, + subc.flag_opt, + "help", + subc.subc_sn_only, + subc.subc_opt_with_aliases, + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ['exts_workout'] + assert help.pl_exts == None + assert help.app_exts == False + + class TestExtensionStacking(Common): + cmd = CLIShared.python_plugin.plugin_test_ext_stacking.extend( + CLIShared.exts.exts["plugin.python_plugin.plugin_test_ext_stacking"]["exts"], + from_configs=[ + CLIShared.exts.exts_workout_cfg, + CLIShared.exts.pl_ext_stacking_from_aux_cfg + ] + ) + subc = CLIShared.python_plugin.plugin_test_ext_stacking.subc.extend( + CLIShared.exts.exts["plugin.python_plugin.plugin_test_ext_stacking.subc"]["exts"], + from_configs=[ + CLIShared.exts.exts_workout_cfg, + CLIShared.exts.pl_ext_stacking_from_aux_cfg + ], + ) + + def test_ext_stacking_help_msg(self): + cmd = self.cmd + help = cmd.get_help_msg() + help.assert_args(cmd.single_arg) + help.assert_opts( + cmd.exts_workout_action, + cmd.flag_opt, + "help", + cmd.pl_ext_stacking_from_aux_action, + cmd.pl_ext_stacking_from_aux_flag, + cmd.python_plugin_the_second_action, + cmd.python_plugin_the_second_flag, + "v", + "vk", + ) + help.assert_subcmds("help", self.subc) + + assert help.aux_exts == ['pl_ext_stacking_from_aux', 'exts_workout'] + assert help.pl_exts == ['python_plugin_the_second'] + assert help.app_exts == False + + def test_ext_stacking(self): + cmd = self.cmd + actions = [self.na] + out = cmd.run( + self.sv, + cmd.flag_opt.ln_to_cli(), + cmd.exts_workout_action.ln_to_cli(), *actions, + cmd.pl_ext_stacking_from_aux_action.ln_to_cli(), *actions, + cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), + cmd.python_plugin_the_second_action.ln_to_cli(), *actions, + cmd.python_plugin_the_second_flag.ln_to_cli(), + ) + cmd.assert_args( + out, + (cmd.single_arg, self.sv), + (cmd.flag_opt, 1), + (cmd.exts_workout_action, actions), + (cmd.pl_ext_stacking_from_aux_action, actions), + (cmd.pl_ext_stacking_from_aux_flag, 2), + (cmd.python_plugin_the_second_action, actions), + (cmd.python_plugin_the_second_flag, 1), + ) + + def test_manipulating_other_ext_args(self): + cmd = self.cmd + actions = [ + "inc_flag__cmd__flag_opt", + "inc_flag__aux_ext__pl_ext_stacking_from_aux_flag", + "inc_flag__plugin_ext__python_plugin_the_second_flag" + ] + out = cmd.run( + self.sv, + cmd.flag_opt.ln_to_cli(), + cmd.exts_workout_action.ln_to_cli(), *actions, + cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), + cmd.python_plugin_the_second_flag.ln_to_cli(), + ) + cmd.assert_args( + out, + (cmd.single_arg, self.sv), + (cmd.flag_opt, 2), + (cmd.exts_workout_action, actions), + (cmd.pl_ext_stacking_from_aux_flag, 3, {"Before": 2}), + (cmd.python_plugin_the_second_flag, 2, {"Before": 1}), + ) + + def test_subc_ext_stacking_help_msg(self): + subc = self.subc + help = subc.get_help_msg() + help.assert_args(subc.single_arg) + help.assert_opts( + subc.exts_workout_action_subc, + subc.flag_opt, + "help", + subc.pl_ext_stacking_from_aux_action_subc, + subc.pl_ext_stacking_from_aux_flag_subc, + subc.python_plugin_the_second_action_subc, + subc.python_plugin_the_second_flag_subc, + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ['pl_ext_stacking_from_aux', 'exts_workout'] + assert help.pl_exts == ['python_plugin_the_second'] + assert help.app_exts == False + + def test_subc_ext_stacking(self): + actions = [self.na] + subc = self.subc + out = subc.run( + self.sv, + subc.flag_opt.ln_to_cli(), + subc.exts_workout_action_subc.ln_to_cli(), *actions, + subc.pl_ext_stacking_from_aux_flag_subc.ln_to_cli(), subc.pl_ext_stacking_from_aux_flag_subc.ln_to_cli(), + subc.python_plugin_the_second_flag_subc.ln_to_cli(), + ) + subc.assert_args( + out, + (subc.single_arg, self.sv), + (subc.flag_opt, 1), + (subc.exts_workout_action_subc, actions), + (subc.pl_ext_stacking_from_aux_flag_subc, 2), + (subc.python_plugin_the_second_flag_subc, 1), + ) + + class TestExtendingAuxCmds(Common): + cmd = CLIShared.aux.ns.dummy_cmds.dummy_cmd.extend( + CLIShared.exts.exts["aux.dummy_cmds.dummy_cmd"]["exts"], + from_configs=[ + CLIShared.exts.exts_workout_cfg, + CLIShared.exts.pl_ext_stacking_from_aux_cfg + ], + with_env=CLIShared.exts.exts["aux.dummy_cmds.dummy_cmd"]["env"] + ) + subc = CLIShared.aux.ns.dummy_cmds.dummy_cmd.subc.extend( + CLIShared.exts.exts["aux.dummy_cmds.dummy_cmd.subc"]["exts"], + from_configs=[ + CLIShared.exts.exts_workout_cfg, + CLIShared.exts.pl_ext_stacking_from_aux_cfg + ], + with_env=CLIShared.exts.exts["aux.dummy_cmds.dummy_cmd"]["env"] + ) + + @property + def na(self): + return "no_action" + + def test_extending_aux_cmd_help_msg(self): + cmd = self.cmd + help = cmd.get_help_msg() + help.assert_args(cmd.action_arg) + help.assert_opts( + cmd.exts_workout_action, + cmd.exts_workout_flag, + "help", + cmd.pl_ext_stacking_from_aux_action, + cmd.pl_ext_stacking_from_aux_flag, + cmd.python_plugin_action, + cmd.python_plugin_flag, + cmd.python_plugin_the_second_action, + cmd.python_plugin_the_second_flag, + "v", + "vk", + ) + help.assert_subcmds("help", cmd.subc) + + assert help.aux_exts == ['pl_ext_stacking_from_aux', 'exts_workout'] + assert help.pl_exts == ['python_plugin', 'python_plugin_the_second'] + assert help.app_exts == False + + def test_extending_aux_cmd(self): + cmd = self.cmd + out = cmd.run( + self.na, + cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), + cmd.python_plugin_the_second_flag.ln_to_cli(), + cmd.python_plugin_flag.ln_to_cli(), + ) + cmd.assert_args( + out, + (cmd.action_arg, [self.na]), + (cmd.exts_workout_action, None), + (cmd.pl_ext_stacking_from_aux_flag, 2), + (cmd.python_plugin_the_second_flag, 1), + (cmd.python_plugin_flag, 1), + ) + + def test_manipulating_args_from_aux_exts(self): + cmd = self.cmd + actions = [ + "inc_flag__aux_ext__pl_ext_stacking_from_aux_flag", + "inc_flag__plugin_ext__python_plugin_the_second_flag", + "set_flag__plugin_ext__python_plugin_flag" + ] + out = cmd.run( + self.na, + cmd.exts_workout_action.ln_to_cli(), *actions, + cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), cmd.pl_ext_stacking_from_aux_flag.ln_to_cli(), + cmd.python_plugin_the_second_flag.ln_to_cli(), + ) + cmd.assert_args( + out, + (cmd.action_arg, [self.na]), + (cmd.exts_workout_action, actions), + (cmd.python_plugin_flag, -1, {"Before": None}), + (cmd.pl_ext_stacking_from_aux_flag, 3, {"Before": 2}), + (cmd.python_plugin_the_second_flag, 2, {"Before": 1}), + finalize_ext_args=lambda ext_args: ext_args['python_plugin'].update({'Before Cmd': []}) + ) + + def test_extending_aux_cmd_help_msg_subc(self): + cmd = self.subc + help = cmd.get_help_msg() + help.assert_args(cmd.action_arg) + help.assert_opts( + cmd.exts_workout_action, + cmd.exts_workout_flag_subc, + cmd.flag_opt, + "help", + cmd.pl_ext_stacking_from_aux_action_subc, + cmd.pl_ext_stacking_from_aux_flag_subc, + cmd.python_plugin_action_subc, + cmd.python_plugin_flag_subc, + cmd.python_plugin_the_second_action_subc, + cmd.python_plugin_the_second_flag_subc, + "v", + "vk", + ) + help.assert_subcmds(None) + + assert help.aux_exts == ['pl_ext_stacking_from_aux', 'exts_workout'] + assert help.pl_exts == ['python_plugin', 'python_plugin_the_second'] + assert help.app_exts == False + + def test_extending_aux_subcmd(self): + cmd = self.subc + actions = ["no_action"] + out = cmd.run( + self.na, + cmd.flag_opt.ln_to_cli(), + cmd.exts_workout_action.ln_to_cli(), *actions, + cmd.pl_ext_stacking_from_aux_flag_subc.ln_to_cli(), + cmd.pl_ext_stacking_from_aux_flag_subc.ln_to_cli(), + cmd.python_plugin_the_second_flag_subc.ln_to_cli(), + cmd.python_plugin_flag_subc.ln_to_cli(), + ) + print(out) + cmd.assert_args( + out, + (cmd.action_arg, [self.na]), + (cmd.flag_opt, 1), + (cmd.exts_workout_action, actions), + (cmd.exts_workout_flag_subc, None), + (cmd.pl_ext_stacking_from_aux_flag_subc, 2), + (cmd.python_plugin_the_second_flag_subc, 1), + (cmd.python_plugin_flag_subc, 1), + ) + + def test_manipulating_args_from_aux_subcmd(self): + cmd = self.subc + actions = [ + "inc_flag__cmd__flag_opt", + "inc_multi_arg__cmd__action_arg__updated", + "inc_flag__aux_ext__pl_ext_stacking_from_aux_flag_subc", + "inc_flag__plugin_ext__python_plugin_the_second_flag_subc", + "inc_flag__plugin_ext__python_plugin_flag_subc" + ] + out = cmd.run( + self.na, + cmd.flag_opt.ln_to_cli(), + cmd.exts_workout_action.ln_to_cli(), *actions, + cmd.pl_ext_stacking_from_aux_flag_subc.ln_to_cli(), + cmd.pl_ext_stacking_from_aux_flag_subc.ln_to_cli(), + cmd.python_plugin_the_second_flag_subc.ln_to_cli(), + cmd.python_plugin_flag_subc.ln_to_cli(), + ) + cmd.assert_args( + out, + (cmd.action_arg, ["updated"]), + (cmd.flag_opt, 2), + (cmd.exts_workout_action, actions), + (cmd.exts_workout_flag_subc, None), + (cmd.pl_ext_stacking_from_aux_flag_subc, 3, {"Before": 2}), + (cmd.python_plugin_the_second_flag_subc, 2, {"Before": 1}), + (cmd.python_plugin_flag_subc, 2, {"Before": 1}), + ) + + @pytest.mark.skip + def test_extending_origen_cmd_from_global_context_only(self): + # TEST_NEEDED CLI explicit test for global only exts + fail + + @pytest.mark.skip + def test_hidden_exts_full_name(self): + # TEST_NEEDED CLI hidden exts full name + fail + + @pytest.mark.skip + def test_ext_mods_are_accessible(self): + # TEST_NEEDED CLI test extension keys + # (what's provided in origen.current_command.exts['ext']) + fail + + @pytest.mark.skip + def test_ext_mods_are_accessible(self): + # TEST_NEEDED CLI test extension mods are available + cmd = CLIShared.aux.ns.dummy_cmds.dummy_cmd.extend( + CLIShared.exts.exts["aux.dummy_cmds.dummy_cmd"]["exts"], + from_configs=[ + CLIShared.exts.exts_workout_cfg, + CLIShared.exts.pl_ext_stacking_from_aux_cfg + ], + with_env=CLIShared.exts.exts["aux.dummy_cmds.dummy_cmd"]["env"] + ) + out = cmd.run( + cmd.exts_workout_action.ln_to_cli(), "show_ext_mods", + ) + print(out) + # actions = [ + # "inc_flag__cmd__flag_opt", + fail + + def test_extending_origen_cmd_from_plugin(self): + ''' Test each global command is extendable''' + cmd = self.global_cmds.eval + cmd = cmd.extend( + CLIShared.exts.exts["generic_core_ext"]["exts"], + from_configs=[CLIShared.exts.core_cmd_exts_cfg] + ) + + help = cmd.get_help_msg() + help.assert_args(cmd.code) + help.assert_opts( + cmd.core_cmd_exts_generic_core_ext, + "help", + cmd.pl_ext_cmds_generic_ext, + cmd.scripts, + "v", + "vk", + ) + help.assert_subcmds(None) + assert help.aux_exts == ['core_cmd_exts'] + assert help.pl_exts == ['pl_ext_cmds'] + assert help.app_exts == False + + d = cmd.global_demo("minimal") + out = d.run(add_args=[ + cmd.core_cmd_exts_generic_core_ext.ln_to_cli(), + cmd.pl_ext_cmds_generic_ext.ln_to_cli(), + cmd.pl_ext_cmds_generic_ext.ln_to_cli(), + ]) + d.assert_present(out) + cmd.core_cmd_exts_generic_core_ext.assert_present(1, out) + cmd.pl_ext_cmds_generic_ext.assert_present(2, out) + + @pytest.mark.skip + class TestErrorConditions(): + def test_exception_in_before_cmd(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + actions = ["before_cmd_exception"] + out = self.cmd.gen_error( + self.sv, + self.ext_action.ln_to_cli(), *actions, + return_full=True, + ) + stderr = out["stderr"] + stdout = out["stdout"] + action_strs = self.ext_action.to_assert_str(actions) + sv_str = self.cmd.single_arg.to_assert_str(self.sv) + print(stdout) + assert "RuntimeError: 'before_cmd_exception' encountered!" in stderr + assert action_strs[0] in stdout + assert action_strs[1] not in stdout + assert action_strs[2] in stdout + assert sv_str not in stdout + fail + + def test_exception_in_after_cmd(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_exception_in_cmd(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + # Maybe move this to cmd building. Or do an with-exts/without-exts version + actions = [self.na] + out = self.cmd.gen_error( + "gen_error", + self.ext_action.ln_to_cli(), *actions, + return_full=True, + ) + fail + + def test_exception_in_clean_up(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_exceptions_in_multiple_clean_ups(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_exceptions_in_before_and_cleanups(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_missing_ext_plugin_mod(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_missing_ext_plugin_mod(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_missing_ext_aux_mod(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_missing_multiple_ext_mods(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_exception_in_on_load(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + def test_exception_during_mod_load(self): + # TEST_NEEDED CLI Ext/Cmds Error cases in global context + fail + + @pytest.mark.skip + class TestNonExtendableCommands(CLIShared): + def test_help_msg(self): + # TEST_NEEDED CLI Ext/Cmds Non-extendable commands + cmd = self.cmds.develop_origen + + def test_error_msg_when_extended(self): + # TEST_NEEDED CLI Ext/Cmds Non-extendable commands + fail diff --git a/test_apps/python_no_app/tests/configs/__init__.py b/test_apps/python_no_app/tests/configs/__init__.py new file mode 100644 index 00000000..c2a6d7fe --- /dev/null +++ b/test_apps/python_no_app/tests/configs/__init__.py @@ -0,0 +1,54 @@ +from tests import python_app_shared +with python_app_shared(): + from python_app_tests._shared.for_proc import setenv + +def test_config_dir_from_env_is_added(q, options): + setenv(options['config_dir'], config_name=False) + + import origen + q.put(('files', origen.__config_metadata__['files'])) + +def test_direct_config_from_env_is_added(q, options): + setenv(options['config_toml'], config_name=False) + + import origen + q.put(('files', origen.__config_metadata__['files'])) + +def test_multiple_configs_from_env_are_added(q, options): + setenv(options['configs'], config_name=False) + + import origen + q.put(('files', origen.__config_metadata__['files'])) + +def test_relative_config_from_env_is_added(q, options): + setenv(options['configs'], config_name=False) + + import origen + q.put(('files', origen.__config_metadata__['files'])) + +def test_error_on_non_toml_config_in_env(q, options): + setenv(options['configs'], config_name=False) + + import origen + q.put(('files', origen.__config_metadata__['files'])) + +def test_plugins_are_collected_by_default(q, options): + setenv(None, bypass_config_lookup=True) + + import origen + q.put(('configs', origen.__config_metadata__['files'])) + q.put(('plugins', origen.plugins.names)) + +def test_suppressing_plugin_collection(q, options): + setenv(options['configs'], config_name=False, bypass_config_lookup=True) + + import origen + q.put(('configs', origen.__config_metadata__['files'])) + q.put(('plugins', origen.plugins.names)) + +def test_enumerating_plugins_to_load(q, options): + setenv(options['configs'], config_name=False, bypass_config_lookup=True) + + import origen + q.put(('configs', origen.__config_metadata__['files'])) + q.put(('plugins', origen.plugins.names)) diff --git a/test_apps/python_no_app/tests/configs/aux_cmds/add_aux_cmd.toml b/test_apps/python_no_app/tests/configs/aux_cmds/add_aux_cmd.toml new file mode 100644 index 00000000..a6097e95 --- /dev/null +++ b/test_apps/python_no_app/tests/configs/aux_cmds/add_aux_cmd.toml @@ -0,0 +1,3 @@ +[[command]] +name = "add_aux_cmd" +help = "Test aux command" diff --git a/test_apps/python_no_app/tests/configs/aux_cmds/add_aux_cmd_config.toml b/test_apps/python_no_app/tests/configs/aux_cmds/add_aux_cmd_config.toml new file mode 100644 index 00000000..618e759c --- /dev/null +++ b/test_apps/python_no_app/tests/configs/aux_cmds/add_aux_cmd_config.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./add_aux_cmd" diff --git a/test_apps/python_no_app/tests/configs/aux_cmds/conflicting_namespaces_config.toml b/test_apps/python_no_app/tests/configs/aux_cmds/conflicting_namespaces_config.toml new file mode 100644 index 00000000..618e759c --- /dev/null +++ b/test_apps/python_no_app/tests/configs/aux_cmds/conflicting_namespaces_config.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./add_aux_cmd" diff --git a/test_apps/python_no_app/tests/configs/aux_cmds/invalid_aux_cmd_path_config.toml b/test_apps/python_no_app/tests/configs/aux_cmds/invalid_aux_cmd_path_config.toml new file mode 100644 index 00000000..8f41b8d2 --- /dev/null +++ b/test_apps/python_no_app/tests/configs/aux_cmds/invalid_aux_cmd_path_config.toml @@ -0,0 +1,7 @@ +# Even if one path is invalid, other should be added + +[[auxillary_commands]] +path = "./invalid_aux_cmd_path" + +[[auxillary_commands]] +path = "./add_aux_cmd" diff --git a/test_apps/python_no_app/tests/configs/dummy_config.toml b/test_apps/python_no_app/tests/configs/dummy_config.toml new file mode 100644 index 00000000..1b13c6ba --- /dev/null +++ b/test_apps/python_no_app/tests/configs/dummy_config.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] + path = "./aux_cmds_from_cli_dir" diff --git a/test_apps/python_no_app/tests/configs/dummy_dir/origen.toml b/test_apps/python_no_app/tests/configs/dummy_dir/origen.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_no_app/tests/configs/python_plugin_and_2nd_only.toml b/test_apps/python_no_app/tests/configs/python_plugin_and_2nd_only.toml new file mode 100644 index 00000000..03ffcf2a --- /dev/null +++ b/test_apps/python_no_app/tests/configs/python_plugin_and_2nd_only.toml @@ -0,0 +1,6 @@ +[plugins] +collect = false +load = [ + { name = "python_plugin" }, + { name = "python_plugin_the_second" }, +] diff --git a/test_apps/python_no_app/tests/dummy_aux_cmds/aux_cmds_from_cli_dir.toml b/test_apps/python_no_app/tests/dummy_aux_cmds/aux_cmds_from_cli_dir.toml new file mode 100644 index 00000000..27a00f5b --- /dev/null +++ b/test_apps/python_no_app/tests/dummy_aux_cmds/aux_cmds_from_cli_dir.toml @@ -0,0 +1,5 @@ +help = "Aux Commands from the Origen CLI directory" + +[[command]] +name = "cli_dir_says_hi" +help = "Say 'hi' from the CLI dir" \ No newline at end of file diff --git a/test_apps/python_no_app/tests/dummy_aux_cmds/aux_cmds_from_cli_dir/cli_dir_says_hi.py b/test_apps/python_no_app/tests/dummy_aux_cmds/aux_cmds_from_cli_dir/cli_dir_says_hi.py new file mode 100644 index 00000000..eca98e83 --- /dev/null +++ b/test_apps/python_no_app/tests/dummy_aux_cmds/aux_cmds_from_cli_dir/cli_dir_says_hi.py @@ -0,0 +1,2 @@ +def run(**kwargs): + print(f"Hi from CLI dir!! ({__file__})") \ No newline at end of file diff --git a/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds.toml b/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds.toml new file mode 100644 index 00000000..47ead6d5 --- /dev/null +++ b/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds.toml @@ -0,0 +1,7 @@ +[[command]] + name = "say_hi" + help = "Say hi!" + +[[command]] + name = "say_bye" + help = "Say bye!" diff --git a/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds/say_hi.py b/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds/say_hi.py new file mode 100644 index 00000000..5bebfd0d --- /dev/null +++ b/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds/say_hi.py @@ -0,0 +1,2 @@ +def run(**kwargs): + print("Hi from python-no-app's dummy aux commands!") diff --git a/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds_2nd.toml b/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds_2nd.toml new file mode 100644 index 00000000..5cde8603 --- /dev/null +++ b/test_apps/python_no_app/tests/dummy_aux_cmds/dummy_aux_cmds_2nd.toml @@ -0,0 +1,23 @@ +[[command]] + name = "python_no_app_tests" + help = "Test commands for python-no-app workspace" + +[[command]] + name = "test_current_command" + help = "Tests origen.current_command" + + [[command.subcommand]] + name = "test_nested_level_1" + help = "Tests origen.current_command L1" + + [[command.subcommand.subcommand]] + name = "test_nested_level_2" + help = "Tests origen.current_command L2" + + [[command.subcommand.subcommand.subcommand]] + name = "test_nested_level_3_a" + help = "Tests origen.current_command L3a" + + [[command.subcommand.subcommand.subcommand]] + name = "test_nested_level_3_b" + help = "Tests origen.current_command L3b" diff --git a/test_apps/python_no_app/tests/misc_test.py b/test_apps/python_no_app/tests/misc_test.py deleted file mode 100644 index e4a9998b..00000000 --- a/test_apps/python_no_app/tests/misc_test.py +++ /dev/null @@ -1,4 +0,0 @@ -import origen - -def test_import(): - assert "2." in origen.version diff --git a/test_apps/python_no_app/tests/shared.py b/test_apps/python_no_app/tests/shared.py new file mode 100644 index 00000000..e8ae7ba2 --- /dev/null +++ b/test_apps/python_no_app/tests/shared.py @@ -0,0 +1,13 @@ +from pathlib import Path + +tests_root = Path(__file__).parent +working_dir = Path(__file__).parent.parent +working_dir_config = working_dir.joinpath("origen.toml") + +def tmp_dir(offset=None): + t = Path(__file__).parent.parent.parent.joinpath('tmp/pytest') + if offset: + t = t.joinpath(offset) + if not t.exists(): + t.mkdir(parents=True, exist_ok=True) + return t diff --git a/test_apps/python_no_app/tests/test_cli.py b/test_apps/python_no_app/tests/test_cli.py new file mode 100644 index 00000000..07567099 --- /dev/null +++ b/test_apps/python_no_app/tests/test_cli.py @@ -0,0 +1,40 @@ +from .cli.tests__global_cmds import T_GlobalCmds +from .cli.tests__cmd__aux_cmds import T_AuxCmds +from .cli.tests__cmd__credentials import T_Credentials +from .cli.tests__cmd__eval import T_Eval +from .cli.tests__cmd__exec import T_Exec +from .cli.tests__cmd__plugin import T_Plugin +from .cli.tests__cmd__plugins import T_Plugins +from .cli.tests__origen_v import T_OrigenVersion +from .cli.tests__origen_help import T_OrigenHelp +from .cli.tests__invocation_errors import T_InvocationErrors + +class TestGlobalCmds(T_GlobalCmds): + pass + +class TestOrigenHelp(T_OrigenHelp): + pass + +class TestAuxCmds(T_AuxCmds): + pass + +class TestCredentials(T_Credentials): + pass + +class TestEval(T_Eval): + pass + +class TestExec(T_Exec): + pass + +class TestPlugin(T_Plugin): + pass + +class TestPlugins(T_Plugins): + pass + +class TestOrigenVersion(T_OrigenVersion): + pass + +class TestInvocationErrors(T_InvocationErrors): + pass \ No newline at end of file diff --git a/test_apps/python_no_app/tests/test_cmd_building.py b/test_apps/python_no_app/tests/test_cmd_building.py new file mode 100644 index 00000000..80e2d739 --- /dev/null +++ b/test_apps/python_no_app/tests/test_cmd_building.py @@ -0,0 +1,25 @@ +import pytest +from .cmd_building.tests__standard_opts import T_StandardOpts +from .cmd_building.tests__arg_buildling import T_ArgBuilding +from .cmd_building.tests__opt_building import T_OptBuilding +from .cmd_building.tests__loading_aux_cmds import T_LoadingAuxCommands +from .cmd_building.tests__loading_plugin_cmds import T_LoadingPluginCmds +from .cmd_building.tests__intra_cmd_conflicts import T_IntraCmdConflicts + +class TestLoadingAuxCommands(T_LoadingAuxCommands): + pass + +class TestStandardOpts(T_StandardOpts): + pass + +class TestArgBuilding(T_ArgBuilding): + pass + +class TestOptBuilding(T_OptBuilding): + pass + +class TestLoadingPluginCmds(T_LoadingPluginCmds): + pass + +class TestIntraCmdConflicts(T_IntraCmdConflicts): + pass diff --git a/test_apps/python_no_app/tests/test_cmd_exts.py b/test_apps/python_no_app/tests/test_cmd_exts.py new file mode 100644 index 00000000..088ab57a --- /dev/null +++ b/test_apps/python_no_app/tests/test_cmd_exts.py @@ -0,0 +1,8 @@ +from .cmd_exts.tests__extending_cmds import T_ExtendingCmds +from .cmd_exts.tests__ext_conflicts import T_ExtConflicts + +class TestExtendingCmds(T_ExtendingCmds): + pass + +class TestExtConflicts(T_ExtConflicts): + pass diff --git a/test_apps/python_no_app/tests/test_configs.py b/test_apps/python_no_app/tests/test_configs.py new file mode 100644 index 00000000..fab05146 --- /dev/null +++ b/test_apps/python_no_app/tests/test_configs.py @@ -0,0 +1,123 @@ +import pytest, origen, shutil, os +from .shared import tests_root, working_dir, working_dir_config +from pathlib import Path +from origen.helpers.env import in_new_origen_proc, run_cli_cmd +from tests import configs as config_funcs + +from test_apps_shared_test_helpers.cli import CLIShared + +class Common(CLIShared): + tests_root = tests_root + working_dir = working_dir + working_dir_config = working_dir_config + cli_config = CLIShared.cli_dir.joinpath("origen.toml") + + configs_dir = Path(__file__).parent.joinpath("configs") + dummy_config = configs_dir.joinpath("dummy_config.toml") + dummy_configs_dir = configs_dir.joinpath("dummy_dir") + dummy_origen_config = dummy_configs_dir.joinpath("origen.toml") + + python_plugin_and_2nd_only_config = configs_dir.joinpath("python_plugin_and_2nd_only.toml") + + aux_cmds_dir = Path(__file__).parent.joinpath("dummy_aux_cmds") + cli_aux_cmds_toml = aux_cmds_dir.joinpath("aux_cmds_from_cli_dir.toml") + cli_aux_cmds_impl = aux_cmds_dir.joinpath("aux_cmds_from_cli_dir") + + cmd_testers_root = tests_root.joinpath("cmd_building/cmd_testers") + aux_cmd_configs_dir = configs_dir.joinpath("aux_cmds") + + # Test relative paths, so leave these as relative to python_no_app root + python_plugin_config_dir_str = "../python_plugin/config" + python_plugin_config_toml = Path(python_plugin_config_dir_str).joinpath("origen.toml") + + @pytest.fixture + def existing_configs(self): + return origen.__config_metadata__['files'] + +class TestConfig(Common): + def test_local_config_is_added(self, existing_configs): + assert self.working_dir_config in origen.__config_metadata__['files'] + + @pytest.mark.skip + def test_package_root_config_is_found(self): + retn = in_new_origen_proc(mod=config_funcs) + assert retn['files'] == [] + + def test_config_from_cli_source_is_added(self, existing_configs): + assert self.cli_config not in existing_configs + shutil.copy(self.configs.empty_config, self.cli_config) + try: + out = run_cli_cmd(["eval", "print( origen.__config_metadata__['files'] )"]) + from pathlib import WindowsPath, PosixPath + configs = eval(out.split("\n")[-2]) + finally: + os.remove(self.cli_config) + + # ensure the config at the CLI directory is removed + assert self.cli_config in configs + + def test_config_dir_from_env_is_added(self, existing_configs): + # Add directory + retn = in_new_origen_proc(mod=config_funcs, func_kwargs={'config_dir': self.dummy_configs_dir}) + assert retn['files'] == [ + self.dummy_origen_config, + *existing_configs, + ] + + def test_direct_config_from_env_is_added(self, existing_configs): + # Add direct toml source + retn = in_new_origen_proc(mod=config_funcs, func_kwargs={'config_toml': self.dummy_config}) + assert retn['files'] == [ + self.dummy_config, + *existing_configs + ] + + def test_multiple_configs_from_env_are_added(self, existing_configs): + retn = in_new_origen_proc(mod=config_funcs, func_kwargs={'configs': [self.dummy_config, self.dummy_configs_dir]}) + assert retn['files'] == [ + self.dummy_config, + self.dummy_origen_config, + *existing_configs + ] + + def test_relative_config_from_env_is_added(self, existing_configs): + retn = in_new_origen_proc(mod=config_funcs, func_kwargs={'configs': self.python_plugin_config_dir_str}) + assert retn['files'] == [ + self.python_plugin_config_toml, + *existing_configs + ] + + @pytest.mark.skip + def test_error_on_non_toml_config_in_env(self, existing_configs): + # TEST_NEEDED CLI + retn = in_new_origen_proc(mod=config_funcs, func_kwargs={'configs': self.dummy_configs_dir.parent.joinpath("__init__.py")}) + assert retn['files'] == [ + self.python_plugin_config_toml, + *existing_configs + ] + + @pytest.mark.skip + def test_error_on_missing_config_dir_in_env(self): + # TEST_NEEDED CLI + fail + + @pytest.mark.skip + def test_error_on_missing_toml_config_in_env(self): + # TEST_NEEDED CLI + fail + + @pytest.mark.skip + def test_config_locations_can_stack(self): + # TEST_NEEDED CLI + fail + + @pytest.mark.skip + def test_bypassing_default_config_lookups(self): + # TEST_NEEDED CLI + # No configs + retn = in_new_origen_proc(mod=config_funcs, bypass_config_lookup=True) + assert retn['files'] == [] + + # Configs from the env are added though + retn = in_new_origen_proc(func=config_funcs.test_bypassing_config_lookup_with_env, bypass_config_lookup=True, with_config=[...]) + assert retn['files'] == [] diff --git a/test_apps/python_no_app/tests/test_current_command.py b/test_apps/python_no_app/tests/test_current_command.py new file mode 100644 index 00000000..196d8063 --- /dev/null +++ b/test_apps/python_no_app/tests/test_current_command.py @@ -0,0 +1,91 @@ +import origen, pytest +from types import SimpleNamespace +from test_apps_shared_test_helpers.cli import CLIShared, CmdOpt, CmdArg + +class TestCurrentCommand(CLIShared): + @classmethod + def parse_current_cmd(cls, out): + out = out.split("Start Action For CMD: display_current_command\n")[1].split("End Action For CMD: display_current_command")[0].split("\n")[:-1] + print(out) + assert out[0] == "Class: CurrentCommand" + return SimpleNamespace(**{ + "base_cmd": out[1].split("Base Cmd: ")[1], + "subcmds": eval(out[2].split("Sub Cmds: ")[1]), + "args": eval(out[3].split("Args: ")[1]), + "exts": eval(out[4].split("Exts: ")[1]), + }) + + @classmethod + def assert_current_cmd(cls, out, base, subcmds, args, exts): + cmd = cls.parse_current_cmd(out) + assert cmd.base_cmd == base + assert cmd.subcmds == subcmds + assert cmd.args == args + assert cmd.exts == exts + + def test_current_command_is_none(self): + assert origen.current_command is None + + @pytest.mark.skip + def test_current_command_from_core_cmd(self): + # TEST_NEEDED Current Command core case + eval_cmd + + def test_current_command_from_pl_cmd(self): + out = self.python_plugin.do_actions.run("display_current_command") + self.assert_current_cmd( + out, + "_plugin_dispatch_", + ["do_actions"], + {"actions": ['display_current_command']}, + {} + ) + + def test_arg_indices(self): + cmd = CLIShared.python_plugin.plugin_test_args.extend( + CLIShared.exts.exts["plugin.python_plugin.plugin_test_args"]["exts"], + from_configs=CLIShared.exts.exts_workout_cfg + ) + + ext_flag = cmd.flag_extension + ext_ha = cmd.hidden_opt + ext_action = cmd.exts_workout_action + + args = "show_arg_indices" + exts = "show_ext_arg_indices" + # Index 0 is the command name + # NOTE: per the clap API, when flags (options not accepting values) are used, only the last index is given + out = cmd.run( + "sv", "m0", "m1", "m2", # indices 1, 2-4 + ext_flag.ln_to_cli(), # 5 + cmd.opt_taking_value.ln_to_cli(), "opt_val", # 6 (opt name), 7 (value) + ext_flag.sn_to_cli(), # 8 + ext_ha.ln_to_cli(), # 9 + ext_action.ln_to_cli(), args, exts, # 10 (opt name), 11, 12 (values) + cmd.multi_val_delim_opt.ln_to_cli(), "d0,d1,d2" + ) + parsed = self.get_action_results(out, [args, exts]) + assert eval(parsed[args]["Before"]) == { + cmd.single_arg.name: [1], + cmd.multi_arg.name: [2, 3, 4], + cmd.opt_taking_value.name: [7] + } + assert eval(parsed[exts]["Before"]) == { + "aux.exts_workout": { + ext_flag.name: [8], + ext_ha.name: [9], + ext_action.name: [11, 12], + cmd.multi_val_delim_opt.name: [14, 15, 16], + } + } + + @pytest.mark.skip + def test_current_command_from_aux_cmd(self): + # TEST_NEEDED Current Command core case + aux_cmd + + @pytest.mark.skip + def test_current_command_from_app_cmd(self): + # TEST_NEEDED Current Command app case + # Obviously move to app + app_cmd \ No newline at end of file diff --git a/test_apps/python_no_app/tests/test_global_invocation.py b/test_apps/python_no_app/tests/test_global_invocation.py new file mode 100644 index 00000000..0f4acca2 --- /dev/null +++ b/test_apps/python_no_app/tests/test_global_invocation.py @@ -0,0 +1,38 @@ +import origen, origen_metal, _origen, getpass, pytest, pathlib, sys +from .shared import working_dir +from python_app_tests.version_test import TestOrigenVersion as T_OrigenVersion + +sys.path.insert(-1, str(pathlib.Path(__file__).parent.parent.parent.joinpath("no_workspace"))) +from t_invocation_env import T_InvocationBaseTests + +def test_import(): + assert "2." in str(origen.version) + +def test_app_is_none(): + assert origen.app is None + +def test_is_app_present(): + assert origen.is_app_present is False + assert _origen.is_app_present() is False + assert origen.status["is_app_present"] is False + +class TestWorkspaceInvocation(T_InvocationBaseTests): + @classmethod + def set_params(cls): + cls.invocation = cls.PyProjectSrc.Workspace + cls.target_pyproj_dir = working_dir + +class TestGlobalFEIntegration: + def test_frontend_is_accessible(self): + assert (origen_metal.frontend.frontend() is not None) + + def test_current_user_is_available(self): + assert origen.current_user.id == getpass.getuser() + + @pytest.mark.skip + def test_datastores_are_available(self): + # TEST_NEEDED Datastores in global invocation + assert origen.datastores.keys() == ['ldaps'] + +class TestVersion(T_OrigenVersion): + pass \ No newline at end of file diff --git a/test_apps/python_no_app/tests/test_plugin_loading.py b/test_apps/python_no_app/tests/test_plugin_loading.py new file mode 100644 index 00000000..445306f7 --- /dev/null +++ b/test_apps/python_no_app/tests/test_plugin_loading.py @@ -0,0 +1,95 @@ +import pytest, origen, _origen +from origen.helpers.env import in_new_origen_proc, run_cli_cmd +from tests import configs as config_funcs +from tests.test_configs import Common as ConfigCommon +from pathlib import WindowsPath, PosixPath + +class TestLoadingGlobalPlugins(ConfigCommon): + def get_configs_and_plugins_from_cli(cls, configs=None, bypass_config_lookup=False): + header = 'Configs and Plugin Names' + out = run_cli_cmd( + ["eval", f"print( '{header}' ); print( origen.__config_metadata__['files'] ); print( origen.plugins.names )"], + bypass_config_lookup=bypass_config_lookup, + with_configs=configs or None + ) + out = out.split("\n")[0:-1] + print(out) + i = out.index(header) + configs = eval(out[i+1].strip()) + plugins = eval(out[i+2].strip()) + return { + 'configs': configs, + 'plugins': plugins, + } + + def test_plugins_are_collected_by_default(self): + retn = in_new_origen_proc(mod=config_funcs) + assert retn['configs'] == [] + # TODO consistent plugin loading + assert set(retn['plugins']) == set(self.plugins.python_no_app_collected_pl_names) + + # Test from CLI + retn = self.get_configs_and_plugins_from_cli(bypass_config_lookup=True) + assert retn['configs'] == [] + # TODO consistent plugin loading + assert set(retn['plugins']) == set(self.plugins.python_no_app_collected_pl_names) + + def test_plugins_are_accessible(self): + pls = origen.plugins + # TODO + # assert isinstance(pls, _origen.plugins.Plugins) + assert isinstance(pls, origen.core.plugins.Plugins) + pl = pls[self.python_plugin.name] + assert pls.names == self.plugins.python_no_app_config_pl_names + # TODO + assert isinstance(pl, origen.application.Base) + # assert isinstance(pl, _origen.plugins.Plugin) + # TODO + assert pl.is_plugin == True + + # TODO needed? + @pytest.mark.skip + def test_registering_global_plugins(self): + assert origen.plugins.names == self.plugins.python_no_app_config_pl_names + # retn = in_new_origen_proc(mod=config_funcs, func_kwargs={'configs': self.dummy_configs_dir.joinpath("__init__.py")}) + # assert retn['files'] == [ + # self.python_plugin_config_toml, + # *existing_configs + # ] + + def test_suppressing_plugin_collection(self): + c = self.configs.suppress_plugin_collecting_config + retn = in_new_origen_proc( + mod=config_funcs, + func_kwargs={'configs': c} + ) + assert retn['configs'] == [c] + assert retn['plugins'] == [] + + # Try from CLI + retn = self.get_configs_and_plugins_from_cli(configs=c, bypass_config_lookup=True) + assert retn['configs'] == [c] + assert retn['plugins'] == [] + + def test_enumerating_plugins_to_load(self): + c = self.python_plugin_and_2nd_only_config + exp_pls = [self.plugins.python_plugin.name, self.plugins.python_plugin_the_second.name] + retn = in_new_origen_proc( + mod=config_funcs, + func_kwargs={'configs': c} + ) + assert retn['configs'] == [c] + assert retn['plugins'] == exp_pls + + # Try from CLI + retn = self.get_configs_and_plugins_from_cli(configs=c, bypass_config_lookup=True) + assert retn['configs'] == [c] + assert retn['plugins'] == exp_pls + + @pytest.mark.skip + def test_error_on_missing_plugin(self): + fail + + @pytest.mark.skip + def test_error_on_loading_plugins(self): + fail diff --git a/test_apps/python_plugin/poetry.lock b/test_apps/python_plugin/poetry.lock index 793cf428..74f65dab 100644 --- a/test_apps/python_plugin/poetry.lock +++ b/test_apps/python_plugin/poetry.lock @@ -8,7 +8,7 @@ python-versions = "*" [[package]] name = "atomicwrites" -version = "1.4.0" +version = "1.4.1" description = "Atomic file writes." category = "dev" optional = false @@ -16,44 +16,29 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "21.2.0" +version = "22.1.0" description = "Classes Without Boilerplate" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.5" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] +tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] +dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] [[package]] name = "babel" -version = "2.9.1" +version = "2.10.3" description = "Internationalization utilities" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] pytz = ">=2015.7" -[[package]] -name = "backports.entry-points-selectable" -version = "1.1.0" -description = "Compatibility shim providing selectable entry points for older implementations" -category = "main" -optional = false -python-versions = ">=2.7" - -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-flake8", "pytest-cov", "pytest-black (>=0.3.7)", "pytest-mypy", "pytest-checkdocs (>=2.4)", "pytest-enabler (>=1.0.1)"] - [[package]] name = "beautifulsoup4" version = "4.8.2" @@ -82,11 +67,11 @@ beautifulsoup4 = "*" [[package]] name = "cachecontrol" -version = "0.12.6" +version = "0.12.11" description = "httplib2 caching for requests" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" [package.dependencies] lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} @@ -112,15 +97,15 @@ msgpack = ["msgpack-python (>=0.5,<0.6)"] [[package]] name = "certifi" -version = "2021.5.30" +version = "2022.6.15" description = "Python package for providing Mozilla's CA Bundle." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [[package]] name = "cffi" -version = "1.14.6" +version = "1.15.1" description = "Foreign Function Interface for Python calling C code." category = "main" optional = false @@ -131,11 +116,11 @@ pycparser = "*" [[package]] name = "charset-normalizer" -version = "2.0.4" +version = "2.1.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." category = "main" optional = false -python-versions = ">=3.5.0" +python-versions = ">=3.6.0" [package.extras] unicode_backport = ["unicodedata2"] @@ -166,7 +151,7 @@ pylev = ">=1.3,<2.0" [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.5" description = "Cross-platform colored terminal text." category = "main" optional = false @@ -193,7 +178,7 @@ python-versions = ">=3.6,<4.0" [[package]] name = "cryptography" -version = "3.4.8" +version = "37.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." category = "main" optional = false @@ -204,15 +189,15 @@ cffi = ">=1.12" [package.extras] docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] +sdist = ["setuptools_rust (>=0.11.4)"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] [[package]] name = "distlib" -version = "0.3.2" +version = "0.3.5" description = "Distribution utilities" category = "main" optional = false @@ -220,19 +205,23 @@ python-versions = "*" [[package]] name = "docutils" -version = "0.17.1" +version = "0.19" description = "Docutils -- Python Documentation Utilities" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [[package]] name = "filelock" -version = "3.0.12" +version = "3.8.0" description = "A platform independent file lock." category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" + +[package.extras] +testing = ["pytest-timeout (>=2.1)", "pytest-cov (>=3)", "pytest (>=7.1.2)", "coverage (>=6.4.2)", "covdefaults (>=2.2)"] +docs = ["sphinx-autodoc-typehints (>=1.19.1)", "sphinx (>=5.1.1)", "furo (>=2022.6.21)"] [[package]] name = "html5lib" @@ -254,7 +243,7 @@ lxml = ["lxml"] [[package]] name = "idna" -version = "3.2" +version = "3.3" description = "Internationalized Domain Names in Applications (IDNA)" category = "main" optional = false @@ -262,7 +251,7 @@ python-versions = ">=3.5" [[package]] name = "imagesize" -version = "1.2.0" +version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "main" optional = false @@ -283,50 +272,35 @@ zipp = ">=0.5" docs = ["sphinx", "rst.linker"] testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] -[[package]] -name = "importlib-resources" -version = "5.2.2" -description = "Read resources from Python packages" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-black (>=0.3.7)", "pytest-mypy"] - [[package]] name = "jeepney" -version = "0.7.1" +version = "0.8.0" description = "Low-level, pure Python DBus protocol wrapper." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -test = ["pytest", "pytest-trio", "pytest-asyncio", "testpath", "trio", "async-timeout"] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] trio = ["trio", "async-generator"] [[package]] name = "jinja2" -version = "2.11.3" +version = "3.1.2" description = "A very fast and expressive template engine." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "keyring" -version = "21.8.0" +version = "22.3.0" description = "Store and access your passwords safely." category = "main" optional = false @@ -340,7 +314,7 @@ SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] [[package]] name = "lockfile" @@ -350,20 +324,6 @@ category = "main" optional = false python-versions = "*" -[[package]] -name = "lxml" -version = "4.6.3" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] -source = ["Cython (>=0.29.7)"] - [[package]] name = "mako" version = "1.1.0" @@ -377,15 +337,15 @@ MarkupSafe = ">=0.9.2" [[package]] name = "markupsafe" -version = "2.0.1" +version = "2.1.1" description = "Safely add untrusted strings to HTML/XML markup." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "more-itertools" -version = "8.8.0" +version = "8.14.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false @@ -393,8 +353,8 @@ python-versions = ">=3.5" [[package]] name = "msgpack" -version = "1.0.2" -description = "MessagePack (de)serializer." +version = "1.0.4" +description = "MessagePack serializer" category = "main" optional = false python-versions = "*" @@ -405,7 +365,7 @@ version = "2.0.0.dev5" description = "Semiconductor Developer's Kit" category = "main" optional = false -python-versions = ">=3.6,<3.11" +python-versions = ">=3.7,<3.11" develop = true [package.dependencies] @@ -413,12 +373,11 @@ beautifulsoup4 = "4.8.2" bs4 = "0.0.1" colorama = "^0.4" importlib-metadata = ">= 1.7.0" -Jinja2 = "^2" -lxml = "4.6.3" +Jinja2 = "^3" mako = "1.1.0" origen_autoapi = "2.0.1" -origen_metal = "= 0.3.0" -poetry = "1.1.6" +origen_metal = "= 0.4.0" +poetry = "^1.1.14" recommonmark = ">= 0" sphinx = "3.0.2" sphinxbootstrap4theme = ">= 0" @@ -442,11 +401,21 @@ sphinx = "*" [[package]] name = "origen-metal" -version = "0.3.0" -description = "" +version = "0.4.0" +description = "Bare metal APIs for the Origen SDK" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +colorama = ">= 0.4.4" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../python/origen_metal" [[package]] name = "packaging" @@ -480,26 +449,26 @@ ptyprocess = ">=0.5" [[package]] name = "pkginfo" -version = "1.7.1" +version = "1.8.3" description = "Query metadatdata from sdists / bdists / installed packages." category = "main" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.extras] testing = ["nose", "coverage"] [[package]] name = "platformdirs" -version = "2.2.0" +version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] -test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] [[package]] name = "pluggy" @@ -518,25 +487,25 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "poetry" -version = "1.1.6" +version = "1.1.14" description = "Python dependency management and packaging made easy." category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] -cachecontrol = {version = ">=0.12.4,<0.13.0", extras = ["filecache"]} +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} cachy = ">=0.3.0,<0.4.0" cleo = ">=0.8.1,<0.9.0" clikit = ">=0.6.2,<0.7.0" crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} html5lib = ">=1.0,<2.0" importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} -keyring = {version = ">=21.2.0,<22.0.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} packaging = ">=20.4,<21.0" pexpect = ">=4.7.0,<5.0.0" pkginfo = ">=1.4,<2.0" -poetry-core = ">=1.0.3,<1.1.0" +poetry-core = ">=1.0.7,<1.1.0" requests = ">=2.18,<3.0" requests-toolbelt = ">=0.9.1,<0.10.0" shellingham = ">=1.1,<2.0" @@ -545,7 +514,7 @@ virtualenv = ">=20.0.26,<21.0.0" [[package]] name = "poetry-core" -version = "1.0.4" +version = "1.0.8" description = "Poetry PEP 517 Build Backend" category = "main" optional = false @@ -564,15 +533,15 @@ python-versions = "*" [[package]] name = "py" -version = "1.10.0" +version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "pycparser" -version = "2.20" +version = "2.21" description = "C parser in Python" category = "main" optional = false @@ -580,11 +549,11 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "pygments" -version = "2.10.0" +version = "2.12.0" description = "Pygments is a syntax highlighting package written in Python." category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" [[package]] name = "pylev" @@ -596,11 +565,22 @@ python-versions = "*" [[package]] name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +category = "main" +optional = false +python-versions = "*" [[package]] name = "pytest" @@ -621,7 +601,7 @@ six = ">=1.10.0" [[package]] name = "pytz" -version = "2021.1" +version = "2022.2.1" description = "World timezone definitions, modern and historical" category = "main" optional = false @@ -650,21 +630,21 @@ sphinx = ">=1.3.1" [[package]] name = "requests" -version = "2.26.0" +version = "2.28.1" description = "Python HTTP for Humans." category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.7, <4" [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} -idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" urllib3 = ">=1.21.1,<1.27" [package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-toolbelt" @@ -679,7 +659,7 @@ requests = ">=2.0.1,<3.0.0" [[package]] name = "secretstorage" -version = "3.3.1" +version = "3.3.3" description = "Python bindings to FreeDesktop.org Secret Service API" category = "main" optional = false @@ -691,11 +671,11 @@ jeepney = ">=0.6" [[package]] name = "shellingham" -version = "1.4.0" +version = "1.5.0" description = "Tool to Detect Surrounding Shell" category = "main" optional = false -python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,>=2.6" +python-versions = ">=3.4" [[package]] name = "six" @@ -707,7 +687,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "snowballstemmer" -version = "2.1.0" +version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." category = "main" optional = false @@ -715,7 +695,7 @@ python-versions = "*" [[package]] name = "soupsieve" -version = "2.2.1" +version = "2.3.2.post1" description = "A modern CSS selector implementation for Beautiful Soup." category = "main" optional = false @@ -841,45 +821,42 @@ python-versions = "*" [[package]] name = "tomlkit" -version = "0.7.2" +version = "0.11.4" description = "Style preserving TOML library" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.6,<4.0" [[package]] name = "urllib3" -version = "1.26.6" +version = "1.26.11" 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.*, <4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" [package.extras] -brotli = ["brotlipy (>=0.6.0)"] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] name = "virtualenv" -version = "20.7.2" +version = "20.16.2" description = "Virtual Python Environment builder" category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" [package.dependencies] -"backports.entry-points-selectable" = ">=1.0.4" distlib = ">=0.3.1,<1" -filelock = ">=3.0.0,<4" +filelock = ">=3.2,<4" importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -importlib-resources = {version = ">=1.0", markers = "python_version < \"3.7\""} platformdirs = ">=2,<3" -six = ">=1.9.0,<2" [package.extras] -docs = ["proselint (>=0.10.2)", "sphinx (>=3)", "sphinx-argparse (>=0.2.5)", "sphinx-rtd-theme (>=0.4.3)", "towncrier (>=19.9.0rc1)"] -testing = ["coverage (>=4)", "coverage-enable-subprocess (>=1)", "flaky (>=3)", "pytest (>=4)", "pytest-env (>=0.6.2)", "pytest-freezegun (>=0.4.1)", "pytest-mock (>=2)", "pytest-randomly (>=1)", "pytest-timeout (>=1)", "packaging (>=20.0)"] +testing = ["pytest-timeout (>=1)", "pytest-randomly (>=1)", "pytest-mock (>=2)", "pytest-freezegun (>=0.4.1)", "pytest-env (>=0.6.2)", "pytest (>=4)", "packaging (>=20.0)", "flaky (>=3)", "coverage-enable-subprocess (>=1)", "coverage (>=4)"] +docs = ["towncrier (>=21.3)", "sphinx-rtd-theme (>=0.4.3)", "sphinx-argparse (>=0.2.5)", "sphinx (>=3)", "proselint (>=0.10.2)"] [[package]] name = "webencodings" @@ -899,20 +876,20 @@ python-versions = "*" [[package]] name = "zipp" -version = "3.5.0" +version = "3.8.1" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] [metadata] lock-version = "1.1" -python-versions = ">=3.6,<3.11" -content-hash = "85dfca7cea21f93ff011a5eb8c242cac42612a7abf505806cc8db053cabe4c3f" +python-versions = ">=3.7,<3.11" +content-hash = "1f4c2af7a73abea014b8d078693c410088ef6c775fb5d4b9e8e06aa06b9a5680" [metadata.files] alabaster = [ @@ -920,20 +897,15 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, ] attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, ] babel = [ - {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, - {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, -] -"backports.entry-points-selectable" = [ - {file = "backports.entry_points_selectable-1.1.0-py2.py3-none-any.whl", hash = "sha256:a6d9a871cde5e15b4c4a53e3d43ba890cc6861ec1332c9c2428c92f977192acc"}, - {file = "backports.entry_points_selectable-1.1.0.tar.gz", hash = "sha256:988468260ec1c196dab6ae1149260e2f5472c9110334e5d51adcb77867361f6a"}, + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, ] beautifulsoup4 = [ {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, @@ -944,62 +916,86 @@ bs4 = [ {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, ] cachecontrol = [ - {file = "CacheControl-0.12.6-py2.py3-none-any.whl", hash = "sha256:10d056fa27f8563a271b345207402a6dcce8efab7e5b377e270329c62471b10d"}, - {file = "CacheControl-0.12.6.tar.gz", hash = "sha256:be9aa45477a134aee56c8fac518627e1154df063e85f67d4f83ce0ccc23688e8"}, + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, ] cachy = [ {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, ] certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, ] cffi = [ - {file = "cffi-1.14.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:22b9c3c320171c108e903d61a3723b51e37aaa8c81255b5e7ce102775bd01e2c"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:f0c5d1acbfca6ebdd6b1e3eded8d261affb6ddcf2186205518f1428b8569bb99"}, - {file = "cffi-1.14.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99f27fefe34c37ba9875f224a8f36e31d744d8083e00f520f133cab79ad5e819"}, - {file = "cffi-1.14.6-cp27-cp27m-win32.whl", hash = "sha256:55af55e32ae468e9946f741a5d51f9896da6b9bf0bbdd326843fec05c730eb20"}, - {file = "cffi-1.14.6-cp27-cp27m-win_amd64.whl", hash = "sha256:7bcac9a2b4fdbed2c16fa5681356d7121ecabf041f18d97ed5b8e0dd38a80224"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ed38b924ce794e505647f7c331b22a693bee1538fdf46b0222c4717b42f744e7"}, - {file = "cffi-1.14.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e22dcb48709fc51a7b58a927391b23ab37eb3737a98ac4338e2448bef8559b33"}, - {file = "cffi-1.14.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e8c6a99be100371dbb046880e7a282152aa5d6127ae01783e37662ef73850d8f"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:19ca0dbdeda3b2615421d54bef8985f72af6e0c47082a8d26122adac81a95872"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d950695ae4381ecd856bcaf2b1e866720e4ab9a1498cba61c602e56630ca7195"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9dc245e3ac69c92ee4c167fbdd7428ec1956d4e754223124991ef29eb57a09d"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8661b2ce9694ca01c529bfa204dbb144b275a31685a075ce123f12331be790b"}, - {file = "cffi-1.14.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b315d709717a99f4b27b59b021e6207c64620790ca3e0bde636a6c7f14618abb"}, - {file = "cffi-1.14.6-cp36-cp36m-win32.whl", hash = "sha256:80b06212075346b5546b0417b9f2bf467fea3bfe7352f781ffc05a8ab24ba14a"}, - {file = "cffi-1.14.6-cp36-cp36m-win_amd64.whl", hash = "sha256:a9da7010cec5a12193d1af9872a00888f396aba3dc79186604a09ea3ee7c029e"}, - {file = "cffi-1.14.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4373612d59c404baeb7cbd788a18b2b2a8331abcc84c3ba40051fcd18b17a4d5"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f10afb1004f102c7868ebfe91c28f4a712227fe4cb24974350ace1f90e1febbf"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fd4305f86f53dfd8cd3522269ed7fc34856a8ee3709a5e28b2836b2db9d4cd69"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d6169cb3c6c2ad50db5b868db6491a790300ade1ed5d1da29289d73bbe40b56"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d4b68e216fc65e9fe4f524c177b54964af043dde734807586cf5435af84045c"}, - {file = "cffi-1.14.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33791e8a2dc2953f28b8d8d300dde42dd929ac28f974c4b4c6272cb2955cb762"}, - {file = "cffi-1.14.6-cp37-cp37m-win32.whl", hash = "sha256:0c0591bee64e438883b0c92a7bed78f6290d40bf02e54c5bf0978eaf36061771"}, - {file = "cffi-1.14.6-cp37-cp37m-win_amd64.whl", hash = "sha256:8eb687582ed7cd8c4bdbff3df6c0da443eb89c3c72e6e5dcdd9c81729712791a"}, - {file = "cffi-1.14.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba6f2b3f452e150945d58f4badd92310449876c4c954836cfb1803bdd7b422f0"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:64fda793737bc4037521d4899be780534b9aea552eb673b9833b01f945904c2e"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:9f3e33c28cd39d1b655ed1ba7247133b6f7fc16fa16887b120c0c670e35ce346"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26bb2549b72708c833f5abe62b756176022a7b9a7f689b571e74c8478ead51dc"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb687a11f0a7a1839719edd80f41e459cc5366857ecbed383ff376c4e3cc6afd"}, - {file = "cffi-1.14.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ad4d668a5c0645d281dcd17aff2be3212bc109b33814bbb15c4939f44181cc"}, - {file = "cffi-1.14.6-cp38-cp38-win32.whl", hash = "sha256:487d63e1454627c8e47dd230025780e91869cfba4c753a74fda196a1f6ad6548"}, - {file = "cffi-1.14.6-cp38-cp38-win_amd64.whl", hash = "sha256:c33d18eb6e6bc36f09d793c0dc58b0211fccc6ae5149b808da4a62660678b156"}, - {file = "cffi-1.14.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:06c54a68935738d206570b20da5ef2b6b6d92b38ef3ec45c5422c0ebaf338d4d"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:f174135f5609428cc6e1b9090f9268f5c8935fddb1b25ccb8255a2d50de6789e"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f3ebe6e73c319340830a9b2825d32eb6d8475c1dac020b4f0aa774ee3b898d1c"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c8d896becff2fa653dc4438b54a5a25a971d1f4110b32bd3068db3722c80202"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4922cd707b25e623b902c86188aca466d3620892db76c0bdd7b99a3d5e61d35f"}, - {file = "cffi-1.14.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e005e9bd57bc987764c32a1bee4364c44fdc11a3cc20a40b93b444984f2b87"}, - {file = "cffi-1.14.6-cp39-cp39-win32.whl", hash = "sha256:eb9e2a346c5238a30a746893f23a9535e700f8192a68c07c0258e7ece6ff3728"}, - {file = "cffi-1.14.6-cp39-cp39-win_amd64.whl", hash = "sha256:818014c754cd3dba7229c0f5884396264d51ffb87ec86e927ef0be140bfdb0d2"}, - {file = "cffi-1.14.6.tar.gz", hash = "sha256:c9a875ce9d7fe32887784274dd533c57909b7b1dcadcc128a2ac21331a9765dd"}, + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] charset-normalizer = [ - {file = "charset-normalizer-2.0.4.tar.gz", hash = "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"}, - {file = "charset_normalizer-2.0.4-py3-none-any.whl", hash = "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b"}, + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, ] cleo = [ {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, @@ -1010,7 +1006,8 @@ clikit = [ {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, ] colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, ] commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, @@ -1021,208 +1018,182 @@ crashtest = [ {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, ] cryptography = [ - {file = "cryptography-3.4.8-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a00cf305f07b26c351d8d4e1af84ad7501eca8a342dedf24a7acb0e7b7406e14"}, - {file = "cryptography-3.4.8-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:f44d141b8c4ea5eb4dbc9b3ad992d45580c1d22bf5e24363f2fbf50c2d7ae8a7"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0a7dcbcd3f1913f664aca35d47c1331fce738d44ec34b7be8b9d332151b0b01e"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34dae04a0dce5730d8eb7894eab617d8a70d0c97da76b905de9efb7128ad7085"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1eb7bb0df6f6f583dd8e054689def236255161ebbcf62b226454ab9ec663746b"}, - {file = "cryptography-3.4.8-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:9965c46c674ba8cc572bc09a03f4c649292ee73e1b683adb1ce81e82e9a6a0fb"}, - {file = "cryptography-3.4.8-cp36-abi3-win32.whl", hash = "sha256:21ca464b3a4b8d8e86ba0ee5045e103a1fcfac3b39319727bc0fc58c09c6aff7"}, - {file = "cryptography-3.4.8-cp36-abi3-win_amd64.whl", hash = "sha256:3520667fda779eb788ea00080124875be18f2d8f0848ec00733c0ec3bb8219fc"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d2a6e5ef66503da51d2110edf6c403dc6b494cc0082f85db12f54e9c5d4c3ec5"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a305600e7a6b7b855cd798e00278161b681ad6e9b7eca94c721d5f588ab212af"}, - {file = "cryptography-3.4.8-pp36-pypy36_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:3fa3a7ccf96e826affdf1a0a9432be74dc73423125c8f96a909e3835a5ef194a"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:d9ec0e67a14f9d1d48dd87a2531009a9b251c02ea42851c060b25c782516ff06"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5b0fbfae7ff7febdb74b574055c7466da334a5371f253732d7e2e7525d570498"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94fff993ee9bc1b2440d3b7243d488c6a3d9724cc2b09cdb297f6a886d040ef7"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:8695456444f277af73a4877db9fc979849cd3ee74c198d04fc0776ebc3db52b9"}, - {file = "cryptography-3.4.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:cd65b60cfe004790c795cc35f272e41a3df4631e2fb6b35aa7ac6ef2859d554e"}, - {file = "cryptography-3.4.8.tar.gz", hash = "sha256:94cc5ed4ceaefcbe5bf38c8fba6a21fc1d365bb8fb826ea1688e3370b2e24a1c"}, + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, + {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, + {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, + {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, ] distlib = [ - {file = "distlib-0.3.2-py2.py3-none-any.whl", hash = "sha256:23e223426b28491b1ced97dc3bbe183027419dfc7982b4fa2f05d5f3ff10711c"}, - {file = "distlib-0.3.2.zip", hash = "sha256:106fef6dc37dd8c0e2c0a60d3fca3e77460a48907f335fa28420463a6f799736"}, + {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, + {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, ] docutils = [ - {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, - {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, ] filelock = [ - {file = "filelock-3.0.12-py3-none-any.whl", hash = "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836"}, - {file = "filelock-3.0.12.tar.gz", hash = "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59"}, + {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, + {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, ] html5lib = [ {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, ] idna = [ - {file = "idna-3.2-py3-none-any.whl", hash = "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a"}, - {file = "idna-3.2.tar.gz", hash = "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"}, + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, ] imagesize = [ - {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, - {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, ] importlib-metadata = [ {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, ] -importlib-resources = [ - {file = "importlib_resources-5.2.2-py3-none-any.whl", hash = "sha256:2480d8e07d1890056cb53c96e3de44fead9c62f2ba949b0f2e4c4345f4afa977"}, - {file = "importlib_resources-5.2.2.tar.gz", hash = "sha256:a65882a4d0fe5fbf702273456ba2ce74fe44892c25e42e057aca526b702a6d4b"}, -] jeepney = [ - {file = "jeepney-0.7.1-py3-none-any.whl", hash = "sha256:1b5a0ea5c0e7b166b2f5895b91a08c14de8915afda4407fb5022a195224958ac"}, - {file = "jeepney-0.7.1.tar.gz", hash = "sha256:fa9e232dfa0c498bd0b8a3a73b8d8a31978304dcef0515adc859d4e096f96f4f"}, + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, ] jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] keyring = [ - {file = "keyring-21.8.0-py3-none-any.whl", hash = "sha256:4be9cbaaaf83e61d6399f733d113ede7d1c73bc75cb6aeb64eee0f6ac39b30ea"}, - {file = "keyring-21.8.0.tar.gz", hash = "sha256:1746d3ac913d449a090caf11e9e4af00e26c3f7f7e81027872192b2398b98675"}, + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, ] lockfile = [ {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, ] -lxml = [ - {file = "lxml-4.6.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:df7c53783a46febb0e70f6b05df2ba104610f2fb0d27023409734a3ecbb78fb2"}, - {file = "lxml-4.6.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1b7584d421d254ab86d4f0b13ec662a9014397678a7c4265a02a6d7c2b18a75f"}, - {file = "lxml-4.6.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:079f3ae844f38982d156efce585bc540c16a926d4436712cf4baee0cce487a3d"}, - {file = "lxml-4.6.3-cp27-cp27m-win32.whl", hash = "sha256:bc4313cbeb0e7a416a488d72f9680fffffc645f8a838bd2193809881c67dd106"}, - {file = "lxml-4.6.3-cp27-cp27m-win_amd64.whl", hash = "sha256:8157dadbb09a34a6bd95a50690595e1fa0af1a99445e2744110e3dca7831c4ee"}, - {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7728e05c35412ba36d3e9795ae8995e3c86958179c9770e65558ec3fdfd3724f"}, - {file = "lxml-4.6.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4bff24dfeea62f2e56f5bab929b4428ae6caba2d1eea0c2d6eb618e30a71e6d4"}, - {file = "lxml-4.6.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:64812391546a18896adaa86c77c59a4998f33c24788cadc35789e55b727a37f4"}, - {file = "lxml-4.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c1a40c06fd5ba37ad39caa0b3144eb3772e813b5fb5b084198a985431c2f1e8d"}, - {file = "lxml-4.6.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:74f7d8d439b18fa4c385f3f5dfd11144bb87c1da034a466c5b5577d23a1d9b51"}, - {file = "lxml-4.6.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f90ba11136bfdd25cae3951af8da2e95121c9b9b93727b1b896e3fa105b2f586"}, - {file = "lxml-4.6.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:4c61b3a0db43a1607d6264166b230438f85bfed02e8cff20c22e564d0faff354"}, - {file = "lxml-4.6.3-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:5c8c163396cc0df3fd151b927e74f6e4acd67160d6c33304e805b84293351d16"}, - {file = "lxml-4.6.3-cp35-cp35m-win32.whl", hash = "sha256:f2380a6376dfa090227b663f9678150ef27543483055cc327555fb592c5967e2"}, - {file = "lxml-4.6.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c4f05c5a7c49d2fb70223d0d5bcfbe474cf928310ac9fa6a7c6dddc831d0b1d4"}, - {file = "lxml-4.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d2e35d7bf1c1ac8c538f88d26b396e73dd81440d59c1ef8522e1ea77b345ede4"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:289e9ca1a9287f08daaf796d96e06cb2bc2958891d7911ac7cae1c5f9e1e0ee3"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bccbfc27563652de7dc9bdc595cb25e90b59c5f8e23e806ed0fd623755b6565d"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d916d31fd85b2f78c76400d625076d9124de3e4bda8b016d25a050cc7d603f24"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:820628b7b3135403540202e60551e741f9b6d3304371712521be939470b454ec"}, - {file = "lxml-4.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c47ff7e0a36d4efac9fd692cfa33fbd0636674c102e9e8d9b26e1b93a94e7617"}, - {file = "lxml-4.6.3-cp36-cp36m-win32.whl", hash = "sha256:5a0a14e264069c03e46f926be0d8919f4105c1623d620e7ec0e612a2e9bf1c04"}, - {file = "lxml-4.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:92e821e43ad382332eade6812e298dc9701c75fe289f2a2d39c7960b43d1e92a"}, - {file = "lxml-4.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:efd7a09678fd8b53117f6bae4fa3825e0a22b03ef0a932e070c0bdbb3a35e654"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:efac139c3f0bf4f0939f9375af4b02c5ad83a622de52d6dfa8e438e8e01d0eb0"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:0fbcf5565ac01dff87cbfc0ff323515c823081c5777a9fc7703ff58388c258c3"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:36108c73739985979bf302006527cf8a20515ce444ba916281d1c43938b8bb96"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:122fba10466c7bd4178b07dba427aa516286b846b2cbd6f6169141917283aae2"}, - {file = "lxml-4.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cdaf11d2bd275bf391b5308f86731e5194a21af45fbaaaf1d9e8147b9160ea92"}, - {file = "lxml-4.6.3-cp37-cp37m-win32.whl", hash = "sha256:3439c71103ef0e904ea0a1901611863e51f50b5cd5e8654a151740fde5e1cade"}, - {file = "lxml-4.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:4289728b5e2000a4ad4ab8da6e1db2e093c63c08bdc0414799ee776a3f78da4b"}, - {file = "lxml-4.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b007cbb845b28db4fb8b6a5cdcbf65bacb16a8bd328b53cbc0698688a68e1caa"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:76fa7b1362d19f8fbd3e75fe2fb7c79359b0af8747e6f7141c338f0bee2f871a"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:26e761ab5b07adf5f555ee82fb4bfc35bf93750499c6c7614bd64d12aaa67927"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:e1cbd3f19a61e27e011e02f9600837b921ac661f0c40560eefb366e4e4fb275e"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:66e575c62792c3f9ca47cb8b6fab9e35bab91360c783d1606f758761810c9791"}, - {file = "lxml-4.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1b38116b6e628118dea5b2186ee6820ab138dbb1e24a13e478490c7db2f326ae"}, - {file = "lxml-4.6.3-cp38-cp38-win32.whl", hash = "sha256:89b8b22a5ff72d89d48d0e62abb14340d9e99fd637d046c27b8b257a01ffbe28"}, - {file = "lxml-4.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:2a9d50e69aac3ebee695424f7dbd7b8c6d6eb7de2a2eb6b0f6c7db6aa41e02b7"}, - {file = "lxml-4.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ce256aaa50f6cc9a649c51be3cd4ff142d67295bfc4f490c9134d0f9f6d58ef0"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:7610b8c31688f0b1be0ef882889817939490a36d0ee880ea562a4e1399c447a1"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f8380c03e45cf09f8557bdaa41e1fa7c81f3ae22828e1db470ab2a6c96d8bc23"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:3082c518be8e97324390614dacd041bb1358c882d77108ca1957ba47738d9d59"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:884ab9b29feaca361f7f88d811b1eea9bfca36cf3da27768d28ad45c3ee6f969"}, - {file = "lxml-4.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:6f12e1427285008fd32a6025e38e977d44d6382cf28e7201ed10d6c1698d2a9a"}, - {file = "lxml-4.6.3-cp39-cp39-win32.whl", hash = "sha256:33bb934a044cf32157c12bfcfbb6649807da20aa92c062ef51903415c704704f"}, - {file = "lxml-4.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:542d454665a3e277f76954418124d67516c5f88e51a900365ed54a9806122b83"}, - {file = "lxml-4.6.3.tar.gz", hash = "sha256:39b78571b3b30645ac77b95f7c69d1bffc4cf8c3b157c435a34da72e78c82468"}, -] mako = [ {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, ] markupsafe = [ - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, ] more-itertools = [ - {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, - {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, + {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, + {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, ] msgpack = [ - {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:b6d9e2dae081aa35c44af9c4298de4ee72991305503442a5c74656d82b581fe9"}, - {file = "msgpack-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a99b144475230982aee16b3d249170f1cccebf27fb0a08e9f603b69637a62192"}, - {file = "msgpack-1.0.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1026dcc10537d27dd2d26c327e552f05ce148977e9d7b9f1718748281b38c841"}, - {file = "msgpack-1.0.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:fe07bc6735d08e492a327f496b7850e98cb4d112c56df69b0c844dbebcbb47f6"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:9ea52fff0473f9f3000987f313310208c879493491ef3ccf66268eff8d5a0326"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:26a1759f1a88df5f1d0b393eb582ec022326994e311ba9c5818adc5374736439"}, - {file = "msgpack-1.0.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:497d2c12426adcd27ab83144057a705efb6acc7e85957a51d43cdcf7f258900f"}, - {file = "msgpack-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:e89ec55871ed5473a041c0495b7b4e6099f6263438e0bd04ccd8418f92d5d7f2"}, - {file = "msgpack-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:a4355d2193106c7aa77c98fc955252a737d8550320ecdb2e9ac701e15e2943bc"}, - {file = "msgpack-1.0.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:d6c64601af8f3893d17ec233237030e3110f11b8a962cb66720bf70c0141aa54"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f484cd2dca68502de3704f056fa9b318c94b1539ed17a4c784266df5d6978c87"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f3e6aaf217ac1c7ce1563cf52a2f4f5d5b1f64e8729d794165db71da57257f0c"}, - {file = "msgpack-1.0.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:8521e5be9e3b93d4d5e07cb80b7e32353264d143c1f072309e1863174c6aadb1"}, - {file = "msgpack-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:31c17bbf2ae5e29e48d794c693b7ca7a0c73bd4280976d408c53df421e838d2a"}, - {file = "msgpack-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8ffb24a3b7518e843cd83538cf859e026d24ec41ac5721c18ed0c55101f9775b"}, - {file = "msgpack-1.0.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:b28c0876cce1466d7c2195d7658cf50e4730667196e2f1355c4209444717ee06"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:87869ba567fe371c4555d2e11e4948778ab6b59d6cc9d8460d543e4cfbbddd1c"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b55f7db883530b74c857e50e149126b91bb75d35c08b28db12dcb0346f15e46e"}, - {file = "msgpack-1.0.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ac25f3e0513f6673e8b405c3a80500eb7be1cf8f57584be524c4fa78fe8e0c83"}, - {file = "msgpack-1.0.2-cp38-cp38-win32.whl", hash = "sha256:0cb94ee48675a45d3b86e61d13c1e6f1696f0183f0715544976356ff86f741d9"}, - {file = "msgpack-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:e36a812ef4705a291cdb4a2fd352f013134f26c6ff63477f20235138d1d21009"}, - {file = "msgpack-1.0.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2a5866bdc88d77f6e1370f82f2371c9bc6fc92fe898fa2dec0c5d4f5435a2694"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:92be4b12de4806d3c36810b0fe2aeedd8d493db39e2eb90742b9c09299eb5759"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:de6bd7990a2c2dabe926b7e62a92886ccbf809425c347ae7de277067f97c2887"}, - {file = "msgpack-1.0.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:5a9ee2540c78659a1dd0b110f73773533ee3108d4e1219b5a15a8d635b7aca0e"}, - {file = "msgpack-1.0.2-cp39-cp39-win32.whl", hash = "sha256:c747c0cc08bd6d72a586310bda6ea72eeb28e7505990f342552315b229a19b33"}, - {file = "msgpack-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:d8167b84af26654c1124857d71650404336f4eb5cc06900667a493fc619ddd9f"}, - {file = "msgpack-1.0.2.tar.gz", hash = "sha256:fae04496f5bc150eefad4e9571d1a76c55d021325dcd484ce45065ebbdd00984"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, ] origen = [] origen-autoapi = [ {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, ] -origen-metal = [ - {file = "origen_metal-0.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:309378f4f4361d8a5b0700e865a056ae0574eeed2566aff839000e92a5335eea"}, - {file = "origen_metal-0.3.0-cp36-none-win_amd64.whl", hash = "sha256:709e973b1ae66bf5f951a072cad12193909a7f5258ecd55c2aebfa6d46474385"}, - {file = "origen_metal-0.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e7ffe6cdbd78b706854a52a5a8f16fda4f85962a43a80852c033849b9b12ae5b"}, - {file = "origen_metal-0.3.0-cp37-none-win_amd64.whl", hash = "sha256:6b34d02fab1fb1bc3fc69b0e83956893f3ec0c7231483963e1ebaad6a9fd4718"}, - {file = "origen_metal-0.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e94d674b6451429e087d2e860dc7dd091e8a042d64c42e13ad3a6ac1c691791f"}, - {file = "origen_metal-0.3.0-cp38-none-win_amd64.whl", hash = "sha256:9d2661e5586ffdc6a1c296e7e88080ce292c66355e413b2a27e98650dfbce43e"}, -] +origen-metal = [] packaging = [ {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, @@ -1236,56 +1207,60 @@ pexpect = [ {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] pkginfo = [ - {file = "pkginfo-1.7.1-py2.py3-none-any.whl", hash = "sha256:37ecd857b47e5f55949c41ed061eb51a0bee97a87c969219d144c0e023982779"}, - {file = "pkginfo-1.7.1.tar.gz", hash = "sha256:e7432f81d08adec7297633191bbf0bd47faf13cd8724c3a13250e51d542635bd"}, + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, ] platformdirs = [ - {file = "platformdirs-2.2.0-py3-none-any.whl", hash = "sha256:4666d822218db6a262bdfdc9c39d21f23b4cfdb08af331a81e92751daf6c866c"}, - {file = "platformdirs-2.2.0.tar.gz", hash = "sha256:632daad3ab546bd8e6af0537d09805cec458dce201bccfe23012df73332e181e"}, + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, ] pluggy = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] poetry = [ - {file = "poetry-1.1.6-py2.py3-none-any.whl", hash = "sha256:768d87fdad55c8b2512996aea74bc389b4772680dcafea90643bdf8eaedf6ca0"}, - {file = "poetry-1.1.6.tar.gz", hash = "sha256:e7c58a50c14aebc18e7de9df64f1dad74b194f21b8e5257251449f0feb4784fa"}, + {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, + {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, ] poetry-core = [ - {file = "poetry-core-1.0.4.tar.gz", hash = "sha256:4b3847ad3e7b5deb88a35b23fa19762b9cef26828770cef3a5b47ffb508119c1"}, - {file = "poetry_core-1.0.4-py2.py3-none-any.whl", hash = "sha256:a99fa921cf84f0521644714bb4b531d9d8f839c64de20aa71fa137f7461a1516"}, + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, ] ptyprocess = [ {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, ] py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, ] pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] pygments = [ - {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, - {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, ] pylev = [ {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, ] pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyreadline3 = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, ] pytest = [ {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"}, {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"}, ] pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, + {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, + {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, ] pywin32-ctypes = [ {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, @@ -1296,32 +1271,32 @@ recommonmark = [ {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, ] requests = [ - {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, - {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] requests-toolbelt = [ {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, ] secretstorage = [ - {file = "SecretStorage-3.3.1-py3-none-any.whl", hash = "sha256:422d82c36172d88d6a0ed5afdec956514b189ddbfb72fefab0c8a1cee4eaf71f"}, - {file = "SecretStorage-3.3.1.tar.gz", hash = "sha256:fd666c51a6bf200643495a04abb261f83229dcb6fd8472ec393df7ffc8b6f195"}, + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, ] shellingham = [ - {file = "shellingham-1.4.0-py2.py3-none-any.whl", hash = "sha256:536b67a0697f2e4af32ab176c00a50ac2899c5a05e0d8e2dadac8e58888283f9"}, - {file = "shellingham-1.4.0.tar.gz", hash = "sha256:4855c2458d6904829bd34c299f11fdeed7cfefbf8a2c522e4caea6cd76b3171e"}, + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, ] six = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] snowballstemmer = [ - {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, - {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, ] soupsieve = [ - {file = "soupsieve-2.2.1-py3-none-any.whl", hash = "sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"}, - {file = "soupsieve-2.2.1.tar.gz", hash = "sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc"}, + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, ] sphinx = [ {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, @@ -1358,16 +1333,16 @@ termcolor = [ {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, ] tomlkit = [ - {file = "tomlkit-0.7.2-py2.py3-none-any.whl", hash = "sha256:173ad840fa5d2aac140528ca1933c29791b79a374a0861a80347f42ec9328117"}, - {file = "tomlkit-0.7.2.tar.gz", hash = "sha256:d7a454f319a7e9bd2e249f239168729327e4dd2d27b17dc68be264ad1ce36754"}, + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, ] urllib3 = [ - {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, - {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, + {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, + {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, ] virtualenv = [ - {file = "virtualenv-20.7.2-py2.py3-none-any.whl", hash = "sha256:e4670891b3a03eb071748c569a87cceaefbf643c5bac46d996c5a45c34aa0f06"}, - {file = "virtualenv-20.7.2.tar.gz", hash = "sha256:9ef4e8ee4710826e98ff3075c9a4739e2cb1040de6a2a8d35db0055840dc96a0"}, + {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, + {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, ] webencodings = [ {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, @@ -1378,6 +1353,6 @@ yapf = [ {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, ] zipp = [ - {file = "zipp-3.5.0-py3-none-any.whl", hash = "sha256:957cfda87797e389580cb8b9e3870841ca991e2125350677b2ca83a0e99390a3"}, - {file = "zipp-3.5.0.tar.gz", hash = "sha256:f5812b1e007e48cff63449a5e9f4e7ebea716b4111f9c4f9a645f91d579bf0c4"}, + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, ] diff --git a/test_apps/python_plugin/pyproject.toml b/test_apps/python_plugin/pyproject.toml index 25b5c749..7cd51b25 100644 --- a/test_apps/python_plugin/pyproject.toml +++ b/test_apps/python_plugin/pyproject.toml @@ -5,7 +5,7 @@ description = "Example Origen Plugin" authors = ["Origen-SDK"] [tool.poetry.dependencies] -python = ">=3.7,<3.11" +python = ">=3.7.0,<3.13" origen = { path = "../../python/origen", develop = true } [tool.poetry.dev-dependencies] @@ -13,4 +13,4 @@ pytest = "^3" [build-system] requires = ["poetry-core>=1.0.0"] -build-backend = "poetry.core.masonry.api" +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands.toml b/test_apps/python_plugin/python_plugin/commands.toml new file mode 100644 index 00000000..740d1424 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands.toml @@ -0,0 +1,468 @@ +[[command]] + name = "plugin_says_hi" + help = "Say 'hi' from the python plugin" + + [[command.opt]] + name = "times" + takes_value = true + short = "x" + long = "times" + help = "Number of times for the python plugin to say" + value_name = "TIMES" + multiple = false + + [[command.opt]] + name = "loudly" + takes_value = false + short = "l" + long = "loudly" + help = "LOUDLY say hi" + + [[command.opt]] + name = "to" + help = "Specify who should be greeted" + takes_value = true + multiple = true + use_delimiter = true + +[[command]] +name = "plugin_test_args" +help = "Test command for a plugin" + + [[command.arg]] + name = "single_arg" + help = "Single Arg" + + [[command.arg]] + name = "multi_arg" + multiple = true + help = "Multi Arg" + + [[command.opt]] + name = "opt_taking_value" + takes_value = true + help = "Opt taking a single value" + long = "opt" + + [[command.opt]] + name = "flag_opt" + help = "Flag Opt" + long = "flag" + + [[command.opt]] + name = "sn_only" + help = "Opt with short name only" + short = "n" + + [[command.opt]] + name = "opt_with_aliases" + help = "Opt with aliases" + long_aliases = ["alias", "opt_alias"] + short_aliases = ["a", "b"] + + [[command.subcommand]] + name = "subc" + help = "Test Subcommand for plugin_test_args" + + [[command.subcommand.arg]] + name = "single_arg" + help = "Single Arg For Subcommand" + + [[command.subcommand.opt]] + name = "flag_opt" + help = "Flag Opt For Subcommand" + + [[command.subcommand.opt]] + name = "subc_sn_only" + help = "Opt with short name only for subc" + short = "n" + + [[command.subcommand.opt]] + name = "subc_opt_with_aliases" + help = "Opt with aliases for subc" + long = "subc_opt" + long_aliases = ["subc_alias", "subc_opt_alias"] + short_aliases = ["a", "b"] + +[[command]] +name = "plugin_test_ext_stacking" +help = "Test ext stacking for plugin command" + + [[command.arg]] + name = "single_arg" + help = "Single Arg" + + [[command.opt]] + name = "flag_opt" + help = "Flag Opt" + + [[command.subcommand]] + name = "subc" + help = "Test Subcommand for ext stacking" + + [[command.subcommand.arg]] + name = "single_arg" + help = "Single Arg" + + [[command.subcommand.opt]] + name = "flag_opt" + help = "Flag Opt" + +[[command]] +name = "echo" +help = "Echos the input" + + [[command.arg]] + name = "input" + use_delimiter = true + help = "Input to echo" + required = true + + [[command.opt]] + name = "repeat" + help = "Echo again (repeat)" + long = "repeat" + short = "r" + +[[command]] + name = "do_actions" + help = "Perform the given actions" + + [[command.arg]] + name = "actions" + required = true + use_delimiter = true + help = "Actions to perform" + +# Command disabling standard app opts +[[command]] +name = "disabling_app_opts_from_pl" +help = "Test disabling standard app opts from plugin commands" +in_global_context = false + + [[command.subcommand]] + name = "disable_targets_opt" + help = "Disable the targets and no-targets opt" + add_target_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_target_opt = true + + [[command.subcommand]] + name = "disable_mode_opt" + help = "Disable the mode opt" + add_mode_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_mode_opt = true + + [[command.subcommand]] + name = "disable_app_opts" + help = "Disable all app opts" + add_target_opt = false + add_mode_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_target_opt = true + add_mode_opt = true + +[[command]] +name = "intra_cmd_conflicts" +help = "PL cmd with conflicting args and opts within the cmd" +on_env=["ORIGEN_PL_INTRA_CMD_CONFLICTS"] + + [[command.arg]] + name = "arg0" + help = "Arg 0" + + [[command.arg]] + name = "arg0" + help = "Duplicate: Arg 0" + + [[command.arg]] + name = "arg1" + help = "Arg 1" + + [[command.arg]] + name = "arg2" + help = "Arg 2" + + [[command.arg]] + name = "arg1" + help = "Duplicate: Arg 1" + + [[command.arg]] + name = "ext_opt.arg" + help = "Arg with reserved prefix" + + [[command.opt]] + name = "opt" + help = "Opt 0" + long_aliases=["opt0"] + + [[command.opt]] + name = "opt" + help = "Duplicate: Opt 0" + + [[command.opt]] + name = "ext_opt.opt" + help = "Reserved Prefix" + + [[command.opt]] + name = "arg0" + help = "Arg-Opt clash" + + [[command.opt]] + name = "arg_clash" + help = "Arg-Opt clash in ln/lna (okay)" + long = "arg0" + long_aliases = ["arg1"] + + [[command.opt]] + name= "reserved_prefix_in_ln_lna" + help = "Reserved prefix in ln and lna" + long = "ext_opt.ln" + long_aliases = ["ext_opt.lna", "ext_opt_lna"] + + [[command.opt]] + name= "intra_opt_conflicts" + help = "Various intra-opt conflicts" + long = "intra_opt_cons" + short = "c" + long_aliases = ["intra_opt_conflicts", "intra_opt_cons", "intra_opt_cons2", "intra_opt_cons2"] + short_aliases = ["a", "b", "c", "b", "c", "e", "e"] + + [[command.opt]] + name= "inter_opt_conflicts" + help = "Various inter-opt conflicts" + long = "intra_opt_conflicts" + short = "a" + long_aliases = ["intra_opt_cons", "ext_opt_lna", "reserved_prefix_in_ln_lna"] + short_aliases = ["b", "c", "d"] + + [[command.opt]] + name = "opt0" + help = "Inferred long name clash" + + [[command.subcommand]] + name = "conflicts_subc" + help = "Subcommand with conflicts" + + [[command.subcommand.arg]] + name = "arg0" + help = "Arg 0" + + [[command.subcommand.arg]] + name = "sub_arg_1" + help = "Subc Arg 1" + + [[command.subcommand.arg]] + name = "sub_arg_1" + help = "Duplicate" + + [[command.subcommand.arg]] + name = "ext_opt.subc_arg" + help = "Arg with reserved prefix" + + [[command.subcommand.opt]] + name = "ext_opt.subc_opt" + help = "Reserved opt prefix" + short = "r" + + [[command.subcommand.opt]] + name = "opt" + help = "Opt 0" + long_aliases=["subc_opt", "ext_opt.subc_opt_lna"] + + [[command.subcommand.opt]] + name = "intra_subc_conflicts" + help = "Intra-opt conflicts for subc" + long = "intra_subc_conflicts" + short = "r" + long_aliases=["intra_subc_conflicts"] + short_aliases=["r"] + + [[command.subcommand.opt]] + name = "intra_subc_lna_iln_conflict" + help = "Intra-opt iln conflict" + long_aliases=["intra_subc_lna_iln_conflict"] + + [[command.subcommand.opt]] + name = "inter_subc_conflicts" + help = "Inter-opt conflicts for subc" + long = "opt" + long_aliases=["intra_subc_conflicts"] + short_aliases=["r"] + + [[command.subcommand.opt]] + name = "intra_subc_conflicts" + help = "Duplicate Opt" + +[[extension]] + # Extend eval command only in global context + extend = "origen.eval" + in_global_context = true + in_app_context = false + + [[extension.opt]] + name = "say_hi_before_eval" + short = "b" + help = "Have the plugin say hi before evaluating (global)" + + [[extension.opt]] + name = "say_hi_after_eval" + short = "a" + help = "Have the plugin say hi after evaluating (global)" + +# TESTS_NEEDED CLI explicit global vs. app case. Have global, need app +# [[extension]] +# # Extend eval command only in an application context +# extend = "origen.eval" +# in_global_context = false +# in_app_context = true + +# [[extension.opt]] +# name = "say_hi_before_eval" +# short = "y" +# help = "Have the plugin say hi before evaluating (app)" + +# [[extension.opt]] +# name = "say_hi_after_eval" +# short = "z" +# help = "Have the plugin say hi after evaluating (app)" + +[[extension]] + # Extend eval command in both contexts + extend = "origen.eval" + in_global_context = true + in_app_context = true + + [[extension.opt]] + name = "say_hi_during_cleanup" + help = "Have the plugin say hi during cleanup" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd" +on_env = ["ORIGEN_DUMMY_AUX_CMDS"] + + [[extension.opt]] + name = "python_plugin_action" + multiple = true + help = "Action from python_plugin" + + [[extension.opt]] + name = "python_plugin_flag" + help = "Flag from python_plugin" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd.subc" +on_env = ["ORIGEN_DUMMY_AUX_CMDS"] + + [[extension.opt]] + name = "python_plugin_action_subc" + multiple = true + help = "Action from python_plugin subc" + + [[extension.opt]] + name = "python_plugin_flag_subc" + help = "Flag from python_plugin subc" + +[[extension]] +extend = "app.arg_opt_warmup" +on_env = ["ORIGEN_APP_EXT_ARG_OPT_WARMUP"] + + [[extension.opt]] + name = "pypl_single_opt" + help = "Single opt from PYPL" + takes_value = true + + [[extension.opt]] + name = "pypl_multi_opt" + help = "Multi opt from PYPL" + multiple = true + long_aliases=["PYPL"] + + [[extension.opt]] + name = "pypl_hidden" + help = "Hidden opt from PYPL" + long="pypl_h_opt" + short = "p" + hidden = true + +[[extension]] +extend = "app.arg_opt_warmup" +on_env = ["ORIGEN_APP_EXT_CONFLICTS_ARG_OPT_WARMUP"] + + [[extension.opt]] + name = "flag_opt" + help = "Flag opt from Python Plugin" + + [[extension.opt]] + name = "conflicts_from_python_plugin" + help = "Some conflicts from Python Plugin" + long = "single_opt" + short = "m" + long_aliases=["m_opt", "python_plugin_conflicts"] + short_aliases=["a"] + +[[extension]] +extend = "app.nested_app_cmds.nested_l1" +on_env = ["ORIGEN_APP_EXT_NESTED"] + + [[extension.opt]] + name = "pypl_single_opt_shallow" + help = "Single opt from PYPL" + short = "p" + takes_value = true + + [[extension.opt]] + name = "pypl_flag_opt_shallow" + help = "Flag opt from PYPL" + +[[extension]] +extend = "app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a" +on_env = ["ORIGEN_APP_EXT_NESTED"] + + [[extension.opt]] + name = "pypl_single_opt_deep" + help = "Single opt from PYPL" + short = "q" + takes_value = true + + [[extension.opt]] + name = "pypl_flag_opt_deep" + help = "Flag opt from PYPL" + long= "py_f" + short = "f" + +[[extension]] +extend = "origen.target" +on_env = ["ORIGEN_EXT_TARGET_CMD"] + [[extension.opt]] + name = "test_ext" + help = "Test target" + +[[extension]] +extend = "origen.target.view" +on_env = ["ORIGEN_EXT_TARGET_CMD"] + [[extension.opt]] + name = "test_ext" + help = "Test target view" diff --git a/test_apps/python_plugin/python_plugin/commands/do_actions.py b/test_apps/python_plugin/python_plugin/commands/do_actions.py new file mode 100644 index 00000000..5cf7d490 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/do_actions.py @@ -0,0 +1,4 @@ +from test_apps_shared_test_helpers.cli.ext_helpers import do_action + +def run(**args): + do_action(args.get("actions"), None) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/echo.py b/test_apps/python_plugin/python_plugin/commands/echo.py new file mode 100644 index 00000000..0de8159f --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/echo.py @@ -0,0 +1,5 @@ +def run(input, repeat=False): + s = f"Echoing '" + ','.join(input) + "' from python_plugin" + print(s) + if repeat: + print(f"(repeat) {s}") diff --git a/test_apps/python_plugin/python_plugin/commands/extensions/app.arg_opt_warmup.py b/test_apps/python_plugin/python_plugin/commands/extensions/app.arg_opt_warmup.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/extensions/app.arg_opt_warmup.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/extensions/app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py b/test_apps/python_plugin/python_plugin/commands/extensions/app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/extensions/app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/extensions/app.nested_app_cmds.nested_l1.py b/test_apps/python_plugin/python_plugin/commands/extensions/app.nested_app_cmds.nested_l1.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/extensions/app.nested_app_cmds.nested_l1.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py b/test_apps/python_plugin/python_plugin/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.subc.py b/test_apps/python_plugin/python_plugin/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/extensions/core.eval.py b/test_apps/python_plugin/python_plugin/commands/extensions/core.eval.py new file mode 100644 index 00000000..9f477db0 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/extensions/core.eval.py @@ -0,0 +1,12 @@ +import origen +from origen.boot import before_cmd, after_cmd + +@before_cmd +def before_cmd(**ext_kwargs): + if "say_hi_before_eval" in ext_kwargs: + print("Hi from python-plugin during 'eval'!") + +@after_cmd +def after_cmd(**ext_kwargs): + if "say_hi_after_eval" in ext_kwargs: + print("Hi again from python-plugin during 'eval'!") diff --git a/test_apps/python_plugin/python_plugin/commands/intra_cmd_conflicts.conflicts_subc.py b/test_apps/python_plugin/python_plugin/commands/intra_cmd_conflicts.conflicts_subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/intra_cmd_conflicts.conflicts_subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_plugin/python_plugin/commands/intra_cmd_conflicts.py b/test_apps/python_plugin/python_plugin/commands/intra_cmd_conflicts.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/intra_cmd_conflicts.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_plugin/python_plugin/commands/plugin_says_hi.py b/test_apps/python_plugin/python_plugin/commands/plugin_says_hi.py new file mode 100644 index 00000000..984f92d7 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/plugin_says_hi.py @@ -0,0 +1,6 @@ +def run(times=1, loudly=False, to=None): + t = int(times) + print(f"Saying hi {t} time(s)...") + for _ in range(t): + s = f"Hi{(' ' + ','.join(to)) if to else ''} from the python plugin!" + print(s if not loudly else s.upper()) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/plugin_test_args.py b/test_apps/python_plugin/python_plugin/commands/plugin_test_args.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/plugin_test_args.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_plugin/python_plugin/commands/plugin_test_args.subc.py b/test_apps/python_plugin/python_plugin/commands/plugin_test_args.subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/plugin_test_args.subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_plugin/python_plugin/commands/plugin_test_ext_stacking.py b/test_apps/python_plugin/python_plugin/commands/plugin_test_ext_stacking.py new file mode 100644 index 00000000..c0f86705 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/plugin_test_ext_stacking.py @@ -0,0 +1,9 @@ +from test_apps_shared_test_helpers.aux_cmds import run as tas_run +from origen.boot import run as run_wrapper + +def run(**args): + raise RuntimeError("This shouldn't be used!") + +@run_wrapper +def run_func(**args): + tas_run(**args) \ No newline at end of file diff --git a/test_apps/python_plugin/python_plugin/commands/plugin_test_ext_stacking.subc.py b/test_apps/python_plugin/python_plugin/commands/plugin_test_ext_stacking.subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/python_plugin/python_plugin/commands/plugin_test_ext_stacking.subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/python_plugin/python_plugin/origen.plugin.toml b/test_apps/python_plugin/python_plugin/origen.plugin.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/.gitignore b/test_apps/python_plugin_no_cmds/.gitignore new file mode 100644 index 00000000..47275fc7 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/.gitignore @@ -0,0 +1,6 @@ +/.origen +/output +/web/source/_static/build +/web/source/interbuild +/tmp +/.ref \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/config/application.toml b/test_apps/python_plugin_no_cmds/config/application.toml new file mode 100644 index 00000000..415a9cf4 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/config/application.toml @@ -0,0 +1 @@ +name = "python_plugin_no_cmds" \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/config/commands.toml b/test_apps/python_plugin_no_cmds/config/commands.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/config/origen.toml b/test_apps/python_plugin_no_cmds/config/origen.toml new file mode 100644 index 00000000..eee0cdec --- /dev/null +++ b/test_apps/python_plugin_no_cmds/config/origen.toml @@ -0,0 +1,14 @@ +# Use this to define your application-specific Origen configuration +# Do not delete it even if you don't use it since it is also used by the Origen +# command line interface to determine when it is in an Origen application workspace + +# Specify what command should be used to invoke python, if not specified +# Origen will try python, python3, python3.8, etc. until one is found that +# satisfies the minimum Python version requirement +#python_cmd = "mypython" + +# If your company has an internal package server enter it here: +#pkg_server = "https://pkgs.company.net:9292" +# or here, if you need to use different urls for push and pull (write and read): +#pkg_server_push = "https://pkgs.company.net:9292" +#pkg_server_pull = "https://pkgs.company.net:9292" \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/poetry.lock b/test_apps/python_plugin_no_cmds/poetry.lock new file mode 100644 index 00000000..74f65dab --- /dev/null +++ b/test_apps/python_plugin_no_cmds/poetry.lock @@ -0,0 +1,1358 @@ +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] +dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] + +[[package]] +name = "babel" +version = "2.10.3" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "beautifulsoup4" +version = "4.8.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +soupsieve = ">=1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "cachecontrol" +version = "0.12.11" +description = "httplib2 caching for requests" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "cachy" +version = "0.3.0" +description = "Cachy provides a simple yet effective caching library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +redis = ["redis (>=3.3.6,<4.0.0)"] +memcached = ["python-memcached (>=1.59,<2.0)"] +msgpack = ["msgpack-python (>=0.5,<0.6)"] + +[[package]] +name = "certifi" +version = "2022.6.15" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cleo" +version = "0.8.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +clikit = ">=0.6.0,<0.7.0" + +[[package]] +name = "clikit" +version = "0.6.2" +description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +pastel = ">=0.2.0,<0.3.0" +pylev = ">=1.3,<2.0" + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "crashtest" +version = "0.3.1" +description = "Manage Python errors with ease" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "cryptography" +version = "37.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "distlib" +version = "0.3.5" +description = "Distribution utilities" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "filelock" +version = "3.8.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +testing = ["pytest-timeout (>=2.1)", "pytest-cov (>=3)", "pytest (>=7.1.2)", "coverage (>=6.4.2)", "covdefaults (>=2.2)"] +docs = ["sphinx-autodoc-typehints (>=1.19.1)", "sphinx (>=5.1.1)", "furo (>=2022.6.21)"] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "importlib-metadata" +version = "1.7.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keyring" +version = "22.3.0" +description = "Store and access your passwords safely." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mako" +version = "1.1.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "more-itertools" +version = "8.14.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "origen" +version = "2.0.0.dev5" +description = "Semiconductor Developer's Kit" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +beautifulsoup4 = "4.8.2" +bs4 = "0.0.1" +colorama = "^0.4" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" +mako = "1.1.0" +origen_autoapi = "2.0.1" +origen_metal = "= 0.4.0" +poetry = "^1.1.14" +recommonmark = ">= 0" +sphinx = "3.0.2" +sphinxbootstrap4theme = ">= 0" +termcolor = ">= 1.1.0" +yapf = "0.30" + +[package.source] +type = "directory" +url = "../../python/origen" + +[[package]] +name = "origen-autoapi" +version = "2.0.1" +description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +sphinx = "*" + +[[package]] +name = "origen-metal" +version = "0.4.0" +description = "Bare metal APIs for the Origen SDK" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +colorama = ">= 0.4.4" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../python/origen_metal" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pkginfo" +version = "1.8.3" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.1.14" +description = "Python dependency management and packaging made easy." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +cachy = ">=0.3.0,<0.4.0" +cleo = ">=0.8.1,<0.9.0" +clikit = ">=0.6.2,<0.7.0" +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} +keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +packaging = ">=20.4,<21.0" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.4,<2.0" +poetry-core = ">=1.0.7,<1.1.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +shellingham = ">=1.1,<2.0" +tomlkit = ">=0.7.0,<1.0.0" +virtualenv = ">=20.0.26,<21.0.0" + +[[package]] +name = "poetry-core" +version = "1.0.8" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pylev" +version = "1.4.0" +description = "A pure Python Levenshtein implementation that's not freaking GPL'd." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pytest" +version = "3.10.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +more-itertools = ">=4.0.0" +pluggy = ">=0.7" +py = ">=1.5.0" +six = ">=1.10.0" + +[[package]] +name = "pytz" +version = "2022.2.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "shellingham" +version = "1.5.0" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.4" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "sphinx" +version = "3.0.2" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.12" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] + +[[package]] +name = "sphinxbootstrap4theme" +version = "0.6.0" +description = "Sphinx Bootstrap4 Theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tomlkit" +version = "0.11.4" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "urllib3" +version = "1.26.11" +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.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.16.2" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +platformdirs = ">=2,<3" + +[package.extras] +testing = ["pytest-timeout (>=1)", "pytest-randomly (>=1)", "pytest-mock (>=2)", "pytest-freezegun (>=0.4.1)", "pytest-env (>=0.6.2)", "pytest (>=4)", "packaging (>=20.0)", "flaky (>=3)", "coverage-enable-subprocess (>=1)", "coverage (>=4)"] +docs = ["towncrier (>=21.3)", "sphinx-rtd-theme (>=0.4.3)", "sphinx-argparse (>=0.2.5)", "sphinx (>=3)", "proselint (>=0.10.2)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.8.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = ">=3.7,<3.11" +content-hash = "1f4c2af7a73abea014b8d078693c410088ef6c775fb5d4b9e8e06aa06b9a5680" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +babel = [ + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] +bs4 = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] +cachecontrol = [ + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, +] +cachy = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] +certifi = [ + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, +] +cffi = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, +] +cleo = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] +clikit = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, +] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] +crashtest = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] +cryptography = [ + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, + {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, + {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, + {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, +] +distlib = [ + {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, + {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, +] +docutils = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] +filelock = [ + {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, + {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +imagesize = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +keyring = [ + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, +] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] +mako = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +more-itertools = [ + {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, + {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, +] +msgpack = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] +origen = [] +origen-autoapi = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] +origen-metal = [] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pastel = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pkginfo = [ + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poetry = [ + {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, + {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, +] +poetry-core = [ + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pylev = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyreadline3 = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] +pytest = [ + {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"}, + {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"}, +] +pytz = [ + {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, + {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +recommonmark = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] +requests = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] +shellingham = [ + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +sphinx = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] +sphinxbootstrap4theme = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] +tomlkit = [ + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, +] +urllib3 = [ + {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, + {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, +] +virtualenv = [ + {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, + {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +yapf = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] +zipp = [ + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, +] diff --git a/test_apps/python_plugin_no_cmds/pyproject.toml b/test_apps/python_plugin_no_cmds/pyproject.toml new file mode 100644 index 00000000..1b1dbbcb --- /dev/null +++ b/test_apps/python_plugin_no_cmds/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "python_plugin_no_cmds" +version = "0.1.0" +description = "Example Origen Plugin Without Any Commands" +authors = ["Origen-SDK"] + +[tool.poetry.dependencies] +python = ">=3.7.0,<3.13" +origen = { path = "../../python/origen", develop = true } +origen_metal = { path = "../../python/origen_metal", develop = true } + +[tool.poetry.dev-dependencies] +pytest = "^3" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/application.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/application.py new file mode 100644 index 00000000..5b9a0cb4 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/application.py @@ -0,0 +1,6 @@ +from origen.application import Base + +# This class represents this application and is automatically instantiated as `origen.app` +# It is required by Origen and should not be renamed or removed under any circumstances +class Application(Base): + pass diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/commands.toml b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/commands.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/attributes.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/attributes.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/controller.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/controller.py new file mode 100644 index 00000000..2e09abc1 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/controller.py @@ -0,0 +1,18 @@ +from origen.controller import TopLevel as BaseController +import origen + + +class Controller(BaseController): + def write_register(self, reg_or_val, size=None, address=None, **kwargs): + # Invoke your driver of choice to dispatch this write_register request, + # here is a JTAG example: + #self.jtag.write_ir(0xF, size=8) + #self.jtag.write_dr(reg_or_val, size) + raise RuntimeError(f"A request to write a register was received by '{self.path}' ({type(self)}), however the logic to implement it has not been defined yet") + + def verify_register(self, reg_or_val, size=None, address=None, **kwargs): + # Invoke your driver of choice to dispatch this verify_register request, + # here is a JTAG example: + #self.jtag.write_ir(0x1F, size=8) + #self.jtag.verify_dr(reg_or_val, size) + raise RuntimeError(f"A request to verify a register was received by '{self.path}' ({type(self)}), however the logic to implement it has not been defined yet") diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/attributes.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/attributes.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/controller.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/controller.py new file mode 100644 index 00000000..05ae2a5e --- /dev/null +++ b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/controller.py @@ -0,0 +1,16 @@ +from ...controller import Controller as Parent +import origen + + +class Controller(Parent): + def write_register(self, reg_or_val, size=None, address=None, **kwargs): + # All write register requests originated from within this block (or one of its children) + # will be sent to the parent class by default, however you can intercept it here and do + # something else if required + super().write_register(reg_or_val, size, address, **kwargs) + + def verify_register(self, reg_or_val, size=None, address=None, **kwargs): + # A verify register requests originated from within this block (or one of its children) + # will be sent to the parent class by default, however you can intercept it here and do + # something else if required + super().verify_register(reg_or_val, size, address, **kwargs) diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/levels.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/levels.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/pins.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/pins.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/registers.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/registers.py new file mode 100644 index 00000000..591d55e9 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/registers.py @@ -0,0 +1,33 @@ +########################################################################################## +# Any registers defined here will be added to this DUT and all of its derivative children +########################################################################################## + +# Example of a simple register definition with all bits r/w, 0x0 is the local offset address: +# +# SimpleReg("my_reg1", 0x0, size=32) # 32 is the default size if not specified +SimpleReg("hawk_reg1", 0x0, size=32) # 32 is the default size if not specified +# +# Example of a richer definition with bitfields: +# +# with Reg("my_reg2", 0x4): +# Field("coco", offset=7, access="ro") +# Field("aien", offset=6) +# Field("diff", offset=5) +# Field( +# "adch", +# offset=0, +# width=5, +# reset=0x1F, +# enums={ +# # A simple enum +# "val1": 3, +# # A more complex enum, all fields except for value are optional +# "val2": { +# "value": 5, +# "usage": "w", +# "description": "The value of something" +# }, +# }) +# +# For more examples and full documentation see: https://origen-sdk.org/o2/guides/registers + diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/services.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/services.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/sub_blocks.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/sub_blocks.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/timing.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/derivatives/pigeon/timing.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/levels.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/levels.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/pins.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/pins.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/registers.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/registers.py new file mode 100644 index 00000000..5de5f73c --- /dev/null +++ b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/registers.py @@ -0,0 +1,32 @@ +########################################################################################## +# Any registers defined here will be added to all DUTs in your application +########################################################################################## + +# Example of a simple register definition with all bits r/w, 0x0 is the local offset address: +# +# SimpleReg("my_reg1", 0x0, size=32) # 32 is the default size if not specified +# +# Example of a richer definition with bitfields: +# +# with Reg("my_reg2", 0x4): +# Field("coco", offset=7, access="ro") +# Field("aien", offset=6) +# Field("diff", offset=5) +# Field( +# "adch", +# offset=0, +# width=5, +# reset=0x1F, +# enums={ +# # A simple enum +# "val1": 3, +# # A more complex enum, all fields except for value are optional +# "val2": { +# "value": 5, +# "usage": "w", +# "description": "The value of something" +# }, +# }) +# +# For more examples and full documentation see: https://origen-sdk.org/o2/guides/registers + diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/services.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/services.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/sub_blocks.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/sub_blocks.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/timing.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/dut/timing.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/flows/.gitkeep b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/flows/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/interface/interface.py b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/interface/interface.py new file mode 100644 index 00000000..97544bae --- /dev/null +++ b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/interface/interface.py @@ -0,0 +1,5 @@ +from origen.interface import BaseInterface + + +class Interface(BaseInterface): + pass \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/origen.plugin.toml b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/origen.plugin.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/patterns/.gitkeep b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/patterns/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/templates/.gitkeep b/test_apps/python_plugin_no_cmds/python_plugin_no_cmds/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/setup.cfg b/test_apps/python_plugin_no_cmds/setup.cfg new file mode 100644 index 00000000..6e1cfdfa --- /dev/null +++ b/test_apps/python_plugin_no_cmds/setup.cfg @@ -0,0 +1,2 @@ +[tool:pytest] +testpaths = tests \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/targets/dut/pigeon.py b/test_apps/python_plugin_no_cmds/targets/dut/pigeon.py new file mode 100644 index 00000000..5b6932d7 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/targets/dut/pigeon.py @@ -0,0 +1 @@ +origen.app.instantiate_dut("dut.pigeon") \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/targets/tester/smt7.py b/test_apps/python_plugin_no_cmds/targets/tester/smt7.py new file mode 100644 index 00000000..9335607f --- /dev/null +++ b/test_apps/python_plugin_no_cmds/targets/tester/smt7.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT7") \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/targets/tester/smt8.py b/test_apps/python_plugin_no_cmds/targets/tester/smt8.py new file mode 100644 index 00000000..7a378261 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/targets/tester/smt8.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT8") \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/targets/tester/uflex.py b/test_apps/python_plugin_no_cmds/targets/tester/uflex.py new file mode 100644 index 00000000..da6c3b88 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/targets/tester/uflex.py @@ -0,0 +1 @@ +origen.tester.target("Ultraflex") \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/tests/README.md b/test_apps/python_plugin_no_cmds/tests/README.md new file mode 100644 index 00000000..218887c3 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/tests/README.md @@ -0,0 +1,16 @@ +Note that the `tests` folder is the place to create tests to verify the +functionality of this Origen application, it does not refer to silicon +tests! + +This is setup to use a popular Python test framework called `pytest` which +requires that following naming convention is followed: + +* All files containing tests must be named `_test.py`, e.g. `tests/example_test.py` +* Functions that define tests within such files must be named `test_`, + e.g. `def test_example():` + +To execute the tests, run the following command from the command line: + +~~~ +poetry run pytest +~~~ \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/tests/example_test.py b/test_apps/python_plugin_no_cmds/tests/example_test.py new file mode 100644 index 00000000..374f68a0 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/tests/example_test.py @@ -0,0 +1,6 @@ +import origen +import pytest +from tests.shared import * + +def test_example(): + assert 1 == 1 \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/tests/shared/__init__.py b/test_apps/python_plugin_no_cmds/tests/shared/__init__.py new file mode 100644 index 00000000..5579f7f3 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/tests/shared/__init__.py @@ -0,0 +1,5 @@ +# This is a good place to add helper functions that you want to make +# available to all of your tests + +import pytest +import origen \ No newline at end of file diff --git a/test_apps/python_plugin_no_cmds/vendor/.gitkeep b/test_apps/python_plugin_no_cmds/vendor/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/web/Makefile b/test_apps/python_plugin_no_cmds/web/Makefile new file mode 100644 index 00000000..d0c3cbf1 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/web/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/test_apps/python_plugin_no_cmds/web/make.bat b/test_apps/python_plugin_no_cmds/web/make.bat new file mode 100644 index 00000000..9534b018 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/web/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/test_apps/python_plugin_no_cmds/web/source/_static/.gitkeep b/test_apps/python_plugin_no_cmds/web/source/_static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_no_cmds/web/source/conf.py b/test_apps/python_plugin_no_cmds/web/source/conf.py new file mode 100644 index 00000000..97ffc3a8 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/web/source/conf.py @@ -0,0 +1,76 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) +import origen +import origen.web + +import sys, os +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'python_plugin_no_cmds' +copyright = '2020, Origen Core Team' +author = 'Origen Core Team' + +# The full version, including alpha/beta/rc tags +release = '0.0.0' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'origen.web.origen_sphinx_extension', 'origen_autoapi.sphinx', + 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.autosectionlabel', + 'recommonmark', 'origen.web.shorthand' +] + +autosectionlabel_prefix_document = True +autoapi_modules = { + 'python_plugin_no_cmds.application': { + 'module-members': ['undoc-members'], + 'class-members': ['members', 'undoc-members'] + } +} +autoapi_output_dir = origen.web.interbuild_dir.joinpath('autoapi') + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme_options = { +# 'navbar_links': +# [('Github', 'https://github.com/Origen-SDK/o2/tree/master/example', True)], +# 'logos': [{ +# 'src': '_static/example_logo.png', +# 'alt': 'Example', +# 'rel_src': True, +# }] +#} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/test_apps/python_plugin_no_cmds/web/source/index.rst b/test_apps/python_plugin_no_cmds/web/source/index.rst new file mode 100644 index 00000000..da79fe72 --- /dev/null +++ b/test_apps/python_plugin_no_cmds/web/source/index.rst @@ -0,0 +1,22 @@ +.. example documentation master file, created by + sphinx-quickstart on Wed Apr 15 21:59:35 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to python_plugin_no_cmds's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + interbuild/autoapi/python_plugin_no_cmds.application/python_plugin_no_cmds.application + +For information on how to build documentation with Origen, see :link-to:`the documentation guides `. + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/test_apps/python_plugin_the_second/.gitignore b/test_apps/python_plugin_the_second/.gitignore new file mode 100644 index 00000000..47275fc7 --- /dev/null +++ b/test_apps/python_plugin_the_second/.gitignore @@ -0,0 +1,6 @@ +/.origen +/output +/web/source/_static/build +/web/source/interbuild +/tmp +/.ref \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/config/application.toml b/test_apps/python_plugin_the_second/config/application.toml new file mode 100644 index 00000000..fafb9dd7 --- /dev/null +++ b/test_apps/python_plugin_the_second/config/application.toml @@ -0,0 +1,5 @@ +name = "python_plugin_the_second" +# Define a default target/environment that will be used by a new workspace +#target = ["dut/falcon", "tester/v93k"] +# To make your application workspace run in production mode by default +#mode = "production" \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/config/commands.toml b/test_apps/python_plugin_the_second/config/commands.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/config/origen.toml b/test_apps/python_plugin_the_second/config/origen.toml new file mode 100644 index 00000000..eee0cdec --- /dev/null +++ b/test_apps/python_plugin_the_second/config/origen.toml @@ -0,0 +1,14 @@ +# Use this to define your application-specific Origen configuration +# Do not delete it even if you don't use it since it is also used by the Origen +# command line interface to determine when it is in an Origen application workspace + +# Specify what command should be used to invoke python, if not specified +# Origen will try python, python3, python3.8, etc. until one is found that +# satisfies the minimum Python version requirement +#python_cmd = "mypython" + +# If your company has an internal package server enter it here: +#pkg_server = "https://pkgs.company.net:9292" +# or here, if you need to use different urls for push and pull (write and read): +#pkg_server_push = "https://pkgs.company.net:9292" +#pkg_server_pull = "https://pkgs.company.net:9292" \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/poetry.lock b/test_apps/python_plugin_the_second/poetry.lock new file mode 100644 index 00000000..74f65dab --- /dev/null +++ b/test_apps/python_plugin_the_second/poetry.lock @@ -0,0 +1,1358 @@ +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] +dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] + +[[package]] +name = "babel" +version = "2.10.3" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "beautifulsoup4" +version = "4.8.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +soupsieve = ">=1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "cachecontrol" +version = "0.12.11" +description = "httplib2 caching for requests" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "cachy" +version = "0.3.0" +description = "Cachy provides a simple yet effective caching library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +redis = ["redis (>=3.3.6,<4.0.0)"] +memcached = ["python-memcached (>=1.59,<2.0)"] +msgpack = ["msgpack-python (>=0.5,<0.6)"] + +[[package]] +name = "certifi" +version = "2022.6.15" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cleo" +version = "0.8.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +clikit = ">=0.6.0,<0.7.0" + +[[package]] +name = "clikit" +version = "0.6.2" +description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +pastel = ">=0.2.0,<0.3.0" +pylev = ">=1.3,<2.0" + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "crashtest" +version = "0.3.1" +description = "Manage Python errors with ease" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "cryptography" +version = "37.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "distlib" +version = "0.3.5" +description = "Distribution utilities" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "filelock" +version = "3.8.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +testing = ["pytest-timeout (>=2.1)", "pytest-cov (>=3)", "pytest (>=7.1.2)", "coverage (>=6.4.2)", "covdefaults (>=2.2)"] +docs = ["sphinx-autodoc-typehints (>=1.19.1)", "sphinx (>=5.1.1)", "furo (>=2022.6.21)"] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "importlib-metadata" +version = "1.7.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keyring" +version = "22.3.0" +description = "Store and access your passwords safely." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mako" +version = "1.1.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "more-itertools" +version = "8.14.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "origen" +version = "2.0.0.dev5" +description = "Semiconductor Developer's Kit" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +beautifulsoup4 = "4.8.2" +bs4 = "0.0.1" +colorama = "^0.4" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" +mako = "1.1.0" +origen_autoapi = "2.0.1" +origen_metal = "= 0.4.0" +poetry = "^1.1.14" +recommonmark = ">= 0" +sphinx = "3.0.2" +sphinxbootstrap4theme = ">= 0" +termcolor = ">= 1.1.0" +yapf = "0.30" + +[package.source] +type = "directory" +url = "../../python/origen" + +[[package]] +name = "origen-autoapi" +version = "2.0.1" +description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +sphinx = "*" + +[[package]] +name = "origen-metal" +version = "0.4.0" +description = "Bare metal APIs for the Origen SDK" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +colorama = ">= 0.4.4" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../python/origen_metal" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pkginfo" +version = "1.8.3" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.1.14" +description = "Python dependency management and packaging made easy." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +cachy = ">=0.3.0,<0.4.0" +cleo = ">=0.8.1,<0.9.0" +clikit = ">=0.6.2,<0.7.0" +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} +keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +packaging = ">=20.4,<21.0" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.4,<2.0" +poetry-core = ">=1.0.7,<1.1.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +shellingham = ">=1.1,<2.0" +tomlkit = ">=0.7.0,<1.0.0" +virtualenv = ">=20.0.26,<21.0.0" + +[[package]] +name = "poetry-core" +version = "1.0.8" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pylev" +version = "1.4.0" +description = "A pure Python Levenshtein implementation that's not freaking GPL'd." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pytest" +version = "3.10.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +more-itertools = ">=4.0.0" +pluggy = ">=0.7" +py = ">=1.5.0" +six = ">=1.10.0" + +[[package]] +name = "pytz" +version = "2022.2.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "shellingham" +version = "1.5.0" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.4" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "sphinx" +version = "3.0.2" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.12" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] + +[[package]] +name = "sphinxbootstrap4theme" +version = "0.6.0" +description = "Sphinx Bootstrap4 Theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tomlkit" +version = "0.11.4" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "urllib3" +version = "1.26.11" +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.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.16.2" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +platformdirs = ">=2,<3" + +[package.extras] +testing = ["pytest-timeout (>=1)", "pytest-randomly (>=1)", "pytest-mock (>=2)", "pytest-freezegun (>=0.4.1)", "pytest-env (>=0.6.2)", "pytest (>=4)", "packaging (>=20.0)", "flaky (>=3)", "coverage-enable-subprocess (>=1)", "coverage (>=4)"] +docs = ["towncrier (>=21.3)", "sphinx-rtd-theme (>=0.4.3)", "sphinx-argparse (>=0.2.5)", "sphinx (>=3)", "proselint (>=0.10.2)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.8.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = ">=3.7,<3.11" +content-hash = "1f4c2af7a73abea014b8d078693c410088ef6c775fb5d4b9e8e06aa06b9a5680" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +babel = [ + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] +bs4 = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] +cachecontrol = [ + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, +] +cachy = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] +certifi = [ + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, +] +cffi = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, +] +cleo = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] +clikit = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, +] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] +crashtest = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] +cryptography = [ + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, + {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, + {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, + {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, +] +distlib = [ + {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, + {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, +] +docutils = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] +filelock = [ + {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, + {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +imagesize = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +keyring = [ + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, +] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] +mako = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +more-itertools = [ + {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, + {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, +] +msgpack = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] +origen = [] +origen-autoapi = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] +origen-metal = [] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pastel = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pkginfo = [ + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poetry = [ + {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, + {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, +] +poetry-core = [ + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pylev = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyreadline3 = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] +pytest = [ + {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"}, + {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"}, +] +pytz = [ + {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, + {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +recommonmark = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] +requests = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] +shellingham = [ + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +sphinx = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] +sphinxbootstrap4theme = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] +tomlkit = [ + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, +] +urllib3 = [ + {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, + {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, +] +virtualenv = [ + {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, + {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +yapf = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] +zipp = [ + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, +] diff --git a/test_apps/python_plugin_the_second/pyproject.toml b/test_apps/python_plugin_the_second/pyproject.toml new file mode 100644 index 00000000..c1058842 --- /dev/null +++ b/test_apps/python_plugin_the_second/pyproject.toml @@ -0,0 +1,17 @@ +[tool.poetry] +name = "python_plugin_the_second" +version = "0.1.0" +description = "Another Example Origen Plugin" +authors = ["Origen-SDK"] + +[tool.poetry.dependencies] +python = ">=3.7.0,<3.13" +origen = { path = "../../python/origen", develop = true } +origen_metal = { path = "../../python/origen_metal", develop = true } + +[tool.poetry.dev-dependencies] +pytest = "^3" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/application.py b/test_apps/python_plugin_the_second/python_plugin_the_second/application.py new file mode 100644 index 00000000..5b9a0cb4 --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/application.py @@ -0,0 +1,6 @@ +from origen.application import Base + +# This class represents this application and is automatically instantiated as `origen.app` +# It is required by Origen and should not be renamed or removed under any circumstances +class Application(Base): + pass diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/commands.toml b/test_apps/python_plugin_the_second/python_plugin_the_second/commands.toml new file mode 100644 index 00000000..f44e1faf --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/commands.toml @@ -0,0 +1,49 @@ +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking" + + [[extension.opt]] + name = "python_plugin_the_second_action" + multiple = true + help = "Action from pl_the_2nd plugin" + + [[extension.opt]] + name = "python_plugin_the_second_flag" + help = "Flag from pl_the_2nd plugin" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking.subc" + + [[extension.opt]] + name = "python_plugin_the_second_action_subc" + multiple = true + help = "Action from pl_the_2nd plugin subc" + + [[extension.opt]] + name = "python_plugin_the_second_flag_subc" + help = "Flag from pl_the_2nd plugin subc" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd" +on_env = ["ORIGEN_DUMMY_AUX_CMDS"] + + [[extension.opt]] + name = "python_plugin_the_second_action" + multiple = true + help = "Action from pl_the_2nd plugin" + + [[extension.opt]] + name = "python_plugin_the_second_flag" + help = "Flag from pl_the_2nd plugin" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd.subc" +on_env = ["ORIGEN_DUMMY_AUX_CMDS"] + + [[extension.opt]] + name = "python_plugin_the_second_action_subc" + multiple = true + help = "Action from pl_the_2nd plugin subc" + + [[extension.opt]] + name = "python_plugin_the_second_flag_subc" + help = "Flag from pl_the_2nd plugin subc" diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py new file mode 100644 index 00000000..bc7b4dd2 --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/aux_ns.dummy_cmds.dummy_cmd.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli import after_cmd_ext_args_str, before_cmd_ext_args_str, clean_up_ext_args_str +from origen.boot import before_cmd, after_cmd, clean_up + +@before_cmd +def before(**args): + print(before_cmd_ext_args_str(args)) + +@after_cmd +def after(**args): + print(after_cmd_ext_args_str(args)) + +@clean_up +def clean_up(**args): + print(clean_up_ext_args_str(args)) diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/aux_ns/dummy_cmds/dummy_cmd/subc.py b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/aux_ns/dummy_cmds/dummy_cmd/subc.py new file mode 100644 index 00000000..bc7b4dd2 --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/aux_ns/dummy_cmds/dummy_cmd/subc.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli import after_cmd_ext_args_str, before_cmd_ext_args_str, clean_up_ext_args_str +from origen.boot import before_cmd, after_cmd, clean_up + +@before_cmd +def before(**args): + print(before_cmd_ext_args_str(args)) + +@after_cmd +def after(**args): + print(after_cmd_ext_args_str(args)) + +@clean_up +def clean_up(**args): + print(clean_up_ext_args_str(args)) diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/plugin.python_plugin.plugin_test_ext_stacking.py b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/plugin.python_plugin.plugin_test_ext_stacking.py new file mode 100644 index 00000000..47fb03cf --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/plugin.python_plugin.plugin_test_ext_stacking.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli import after_cmd_ext_args_str, before_cmd_ext_args_str, clean_up_ext_args_str +from origen.boot import before_cmd, after_cmd, clean_up + +@before_cmd +def before(**args): + print(before_cmd_ext_args_str(args)) + +@after_cmd +def after(**args): + print(after_cmd_ext_args_str(args)) + +@clean_up +def clean_up(**args): + print(clean_up_ext_args_str(args)) \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/plugin.python_plugin.plugin_test_ext_stacking.subc.py b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/plugin.python_plugin.plugin_test_ext_stacking.subc.py new file mode 100644 index 00000000..47fb03cf --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/commands/extensions/plugin.python_plugin.plugin_test_ext_stacking.subc.py @@ -0,0 +1,14 @@ +from test_apps_shared_test_helpers.cli import after_cmd_ext_args_str, before_cmd_ext_args_str, clean_up_ext_args_str +from origen.boot import before_cmd, after_cmd, clean_up + +@before_cmd +def before(**args): + print(before_cmd_ext_args_str(args)) + +@after_cmd +def after(**args): + print(after_cmd_ext_args_str(args)) + +@clean_up +def clean_up(**args): + print(clean_up_ext_args_str(args)) \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/attributes.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/attributes.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/controller.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/controller.py new file mode 100644 index 00000000..2e09abc1 --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/controller.py @@ -0,0 +1,18 @@ +from origen.controller import TopLevel as BaseController +import origen + + +class Controller(BaseController): + def write_register(self, reg_or_val, size=None, address=None, **kwargs): + # Invoke your driver of choice to dispatch this write_register request, + # here is a JTAG example: + #self.jtag.write_ir(0xF, size=8) + #self.jtag.write_dr(reg_or_val, size) + raise RuntimeError(f"A request to write a register was received by '{self.path}' ({type(self)}), however the logic to implement it has not been defined yet") + + def verify_register(self, reg_or_val, size=None, address=None, **kwargs): + # Invoke your driver of choice to dispatch this verify_register request, + # here is a JTAG example: + #self.jtag.write_ir(0x1F, size=8) + #self.jtag.verify_dr(reg_or_val, size) + raise RuntimeError(f"A request to verify a register was received by '{self.path}' ({type(self)}), however the logic to implement it has not been defined yet") diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/attributes.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/attributes.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/controller.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/controller.py new file mode 100644 index 00000000..05ae2a5e --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/controller.py @@ -0,0 +1,16 @@ +from ...controller import Controller as Parent +import origen + + +class Controller(Parent): + def write_register(self, reg_or_val, size=None, address=None, **kwargs): + # All write register requests originated from within this block (or one of its children) + # will be sent to the parent class by default, however you can intercept it here and do + # something else if required + super().write_register(reg_or_val, size, address, **kwargs) + + def verify_register(self, reg_or_val, size=None, address=None, **kwargs): + # A verify register requests originated from within this block (or one of its children) + # will be sent to the parent class by default, however you can intercept it here and do + # something else if required + super().verify_register(reg_or_val, size, address, **kwargs) diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/levels.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/levels.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/pins.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/pins.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/registers.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/registers.py new file mode 100644 index 00000000..591d55e9 --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/registers.py @@ -0,0 +1,33 @@ +########################################################################################## +# Any registers defined here will be added to this DUT and all of its derivative children +########################################################################################## + +# Example of a simple register definition with all bits r/w, 0x0 is the local offset address: +# +# SimpleReg("my_reg1", 0x0, size=32) # 32 is the default size if not specified +SimpleReg("hawk_reg1", 0x0, size=32) # 32 is the default size if not specified +# +# Example of a richer definition with bitfields: +# +# with Reg("my_reg2", 0x4): +# Field("coco", offset=7, access="ro") +# Field("aien", offset=6) +# Field("diff", offset=5) +# Field( +# "adch", +# offset=0, +# width=5, +# reset=0x1F, +# enums={ +# # A simple enum +# "val1": 3, +# # A more complex enum, all fields except for value are optional +# "val2": { +# "value": 5, +# "usage": "w", +# "description": "The value of something" +# }, +# }) +# +# For more examples and full documentation see: https://origen-sdk.org/o2/guides/registers + diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/services.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/services.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/sub_blocks.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/sub_blocks.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/timing.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/derivatives/quail/timing.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/levels.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/levels.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/pins.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/pins.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/registers.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/registers.py new file mode 100644 index 00000000..5de5f73c --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/registers.py @@ -0,0 +1,32 @@ +########################################################################################## +# Any registers defined here will be added to all DUTs in your application +########################################################################################## + +# Example of a simple register definition with all bits r/w, 0x0 is the local offset address: +# +# SimpleReg("my_reg1", 0x0, size=32) # 32 is the default size if not specified +# +# Example of a richer definition with bitfields: +# +# with Reg("my_reg2", 0x4): +# Field("coco", offset=7, access="ro") +# Field("aien", offset=6) +# Field("diff", offset=5) +# Field( +# "adch", +# offset=0, +# width=5, +# reset=0x1F, +# enums={ +# # A simple enum +# "val1": 3, +# # A more complex enum, all fields except for value are optional +# "val2": { +# "value": 5, +# "usage": "w", +# "description": "The value of something" +# }, +# }) +# +# For more examples and full documentation see: https://origen-sdk.org/o2/guides/registers + diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/services.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/services.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/sub_blocks.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/sub_blocks.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/dut/timing.py b/test_apps/python_plugin_the_second/python_plugin_the_second/dut/timing.py new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/flows/.gitkeep b/test_apps/python_plugin_the_second/python_plugin_the_second/flows/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/interface/interface.py b/test_apps/python_plugin_the_second/python_plugin_the_second/interface/interface.py new file mode 100644 index 00000000..97544bae --- /dev/null +++ b/test_apps/python_plugin_the_second/python_plugin_the_second/interface/interface.py @@ -0,0 +1,5 @@ +from origen.interface import BaseInterface + + +class Interface(BaseInterface): + pass \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/origen.plugin.toml b/test_apps/python_plugin_the_second/python_plugin_the_second/origen.plugin.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/patterns/.gitkeep b/test_apps/python_plugin_the_second/python_plugin_the_second/patterns/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/python_plugin_the_second/templates/.gitkeep b/test_apps/python_plugin_the_second/python_plugin_the_second/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/setup.cfg b/test_apps/python_plugin_the_second/setup.cfg new file mode 100644 index 00000000..6e1cfdfa --- /dev/null +++ b/test_apps/python_plugin_the_second/setup.cfg @@ -0,0 +1,2 @@ +[tool:pytest] +testpaths = tests \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/targets/dut/quail.py b/test_apps/python_plugin_the_second/targets/dut/quail.py new file mode 100644 index 00000000..c6e37819 --- /dev/null +++ b/test_apps/python_plugin_the_second/targets/dut/quail.py @@ -0,0 +1 @@ +origen.app.instantiate_dut("dut.quail") \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/targets/tester/smt7.py b/test_apps/python_plugin_the_second/targets/tester/smt7.py new file mode 100644 index 00000000..9335607f --- /dev/null +++ b/test_apps/python_plugin_the_second/targets/tester/smt7.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT7") \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/targets/tester/smt8.py b/test_apps/python_plugin_the_second/targets/tester/smt8.py new file mode 100644 index 00000000..7a378261 --- /dev/null +++ b/test_apps/python_plugin_the_second/targets/tester/smt8.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT8") \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/targets/tester/uflex.py b/test_apps/python_plugin_the_second/targets/tester/uflex.py new file mode 100644 index 00000000..da6c3b88 --- /dev/null +++ b/test_apps/python_plugin_the_second/targets/tester/uflex.py @@ -0,0 +1 @@ +origen.tester.target("Ultraflex") \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/tests/README.md b/test_apps/python_plugin_the_second/tests/README.md new file mode 100644 index 00000000..218887c3 --- /dev/null +++ b/test_apps/python_plugin_the_second/tests/README.md @@ -0,0 +1,16 @@ +Note that the `tests` folder is the place to create tests to verify the +functionality of this Origen application, it does not refer to silicon +tests! + +This is setup to use a popular Python test framework called `pytest` which +requires that following naming convention is followed: + +* All files containing tests must be named `_test.py`, e.g. `tests/example_test.py` +* Functions that define tests within such files must be named `test_`, + e.g. `def test_example():` + +To execute the tests, run the following command from the command line: + +~~~ +poetry run pytest +~~~ \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/tests/example_test.py b/test_apps/python_plugin_the_second/tests/example_test.py new file mode 100644 index 00000000..374f68a0 --- /dev/null +++ b/test_apps/python_plugin_the_second/tests/example_test.py @@ -0,0 +1,6 @@ +import origen +import pytest +from tests.shared import * + +def test_example(): + assert 1 == 1 \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/tests/shared/__init__.py b/test_apps/python_plugin_the_second/tests/shared/__init__.py new file mode 100644 index 00000000..5579f7f3 --- /dev/null +++ b/test_apps/python_plugin_the_second/tests/shared/__init__.py @@ -0,0 +1,5 @@ +# This is a good place to add helper functions that you want to make +# available to all of your tests + +import pytest +import origen \ No newline at end of file diff --git a/test_apps/python_plugin_the_second/vendor/.gitkeep b/test_apps/python_plugin_the_second/vendor/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/web/Makefile b/test_apps/python_plugin_the_second/web/Makefile new file mode 100644 index 00000000..d0c3cbf1 --- /dev/null +++ b/test_apps/python_plugin_the_second/web/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/test_apps/python_plugin_the_second/web/make.bat b/test_apps/python_plugin_the_second/web/make.bat new file mode 100644 index 00000000..9534b018 --- /dev/null +++ b/test_apps/python_plugin_the_second/web/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/test_apps/python_plugin_the_second/web/source/_static/.gitkeep b/test_apps/python_plugin_the_second/web/source/_static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/python_plugin_the_second/web/source/conf.py b/test_apps/python_plugin_the_second/web/source/conf.py new file mode 100644 index 00000000..b1758f34 --- /dev/null +++ b/test_apps/python_plugin_the_second/web/source/conf.py @@ -0,0 +1,76 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) +import origen +import origen.web + +import sys, os +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'python_plugin_the_second' +copyright = '2020, Origen Core Team' +author = 'Origen Core Team' + +# The full version, including alpha/beta/rc tags +release = '0.0.0' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'origen.web.origen_sphinx_extension', 'origen_autoapi.sphinx', + 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.autosectionlabel', + 'recommonmark', 'origen.web.shorthand' +] + +autosectionlabel_prefix_document = True +autoapi_modules = { + 'python_plugin_the_second.application': { + 'module-members': ['undoc-members'], + 'class-members': ['members', 'undoc-members'] + } +} +autoapi_output_dir = origen.web.interbuild_dir.joinpath('autoapi') + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme_options = { +# 'navbar_links': +# [('Github', 'https://github.com/Origen-SDK/o2/tree/master/example', True)], +# 'logos': [{ +# 'src': '_static/example_logo.png', +# 'alt': 'Example', +# 'rel_src': True, +# }] +#} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/test_apps/python_plugin_the_second/web/source/index.rst b/test_apps/python_plugin_the_second/web/source/index.rst new file mode 100644 index 00000000..b06db959 --- /dev/null +++ b/test_apps/python_plugin_the_second/web/source/index.rst @@ -0,0 +1,22 @@ +.. example documentation master file, created by + sphinx-quickstart on Wed Apr 15 21:59:35 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to python_plugin_the_second's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + interbuild/autoapi/python_plugin_the_second.application/python_plugin_the_second.application + +For information on how to build documentation with Origen, see :link-to:`the documentation guides `. + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/test_apps/test_apps_shared_test_helpers/.gitignore b/test_apps/test_apps_shared_test_helpers/.gitignore new file mode 100644 index 00000000..47275fc7 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/.gitignore @@ -0,0 +1,6 @@ +/.origen +/output +/web/source/_static/build +/web/source/interbuild +/tmp +/.ref \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/config/application.toml b/test_apps/test_apps_shared_test_helpers/config/application.toml new file mode 100644 index 00000000..3db0e67e --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/config/application.toml @@ -0,0 +1 @@ +name = "test_apps_shared_test_helpers" \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/config/commands.toml b/test_apps/test_apps_shared_test_helpers/config/commands.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/config/origen.toml b/test_apps/test_apps_shared_test_helpers/config/origen.toml new file mode 100644 index 00000000..eee0cdec --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/config/origen.toml @@ -0,0 +1,14 @@ +# Use this to define your application-specific Origen configuration +# Do not delete it even if you don't use it since it is also used by the Origen +# command line interface to determine when it is in an Origen application workspace + +# Specify what command should be used to invoke python, if not specified +# Origen will try python, python3, python3.8, etc. until one is found that +# satisfies the minimum Python version requirement +#python_cmd = "mypython" + +# If your company has an internal package server enter it here: +#pkg_server = "https://pkgs.company.net:9292" +# or here, if you need to use different urls for push and pull (write and read): +#pkg_server_push = "https://pkgs.company.net:9292" +#pkg_server_pull = "https://pkgs.company.net:9292" \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/poetry.lock b/test_apps/test_apps_shared_test_helpers/poetry.lock new file mode 100644 index 00000000..74f65dab --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/poetry.lock @@ -0,0 +1,1358 @@ +[[package]] +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +tests_no_zope = ["cloudpickle", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +tests = ["cloudpickle", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] +docs = ["sphinx-notfound-page", "zope.interface", "sphinx", "furo"] +dev = ["cloudpickle", "pre-commit", "sphinx-notfound-page", "sphinx", "furo", "zope.interface", "pytest-mypy-plugins", "mypy (>=0.900,!=0.940)", "pytest (>=4.3.0)", "pympler", "hypothesis", "coverage[toml] (>=5.0.2)"] + +[[package]] +name = "babel" +version = "2.10.3" +description = "Internationalization utilities" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "beautifulsoup4" +version = "4.8.2" +description = "Screen-scraping library" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +soupsieve = ">=1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bs4" +version = "0.0.1" +description = "Dummy package for Beautiful Soup" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +beautifulsoup4 = "*" + +[[package]] +name = "cachecontrol" +version = "0.12.11" +description = "httplib2 caching for requests" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +lockfile = {version = ">=0.9", optional = true, markers = "extra == \"filecache\""} +msgpack = ">=0.5.2" +requests = "*" + +[package.extras] +filecache = ["lockfile (>=0.9)"] +redis = ["redis (>=2.10.5)"] + +[[package]] +name = "cachy" +version = "0.3.0" +description = "Cachy provides a simple yet effective caching library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.extras] +redis = ["redis (>=3.3.6,<4.0.0)"] +memcached = ["python-memcached (>=1.59,<2.0)"] +msgpack = ["msgpack-python (>=0.5,<0.6)"] + +[[package]] +name = "certifi" +version = "2022.6.15" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "2.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "cleo" +version = "0.8.1" +description = "Cleo allows you to create beautiful and testable command-line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +clikit = ">=0.6.0,<0.7.0" + +[[package]] +name = "clikit" +version = "0.6.2" +description = "CliKit is a group of utilities to build beautiful and testable command line interfaces." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +pastel = ">=0.2.0,<0.3.0" +pylev = ">=1.3,<2.0" + +[[package]] +name = "colorama" +version = "0.4.5" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] + +[[package]] +name = "crashtest" +version = "0.3.1" +description = "Manage Python errors with ease" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "cryptography" +version = "37.0.4" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cffi = ">=1.12" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +sdist = ["setuptools_rust (>=0.11.4)"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] + +[[package]] +name = "distlib" +version = "0.3.5" +description = "Distribution utilities" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "docutils" +version = "0.19" +description = "Docutils -- Python Documentation Utilities" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "filelock" +version = "3.8.0" +description = "A platform independent file lock." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +testing = ["pytest-timeout (>=2.1)", "pytest-cov (>=3)", "pytest (>=7.1.2)", "coverage (>=6.4.2)", "covdefaults (>=2.2)"] +docs = ["sphinx-autodoc-typehints (>=1.19.1)", "sphinx (>=5.1.1)", "furo (>=2022.6.21)"] + +[[package]] +name = "html5lib" +version = "1.1" +description = "HTML parser based on the WHATWG HTML specification" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "lxml"] +chardet = ["chardet (>=2.2)"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "importlib-metadata" +version = "1.7.0" +description = "Read metadata from Python packages" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] + +[[package]] +name = "jeepney" +version = "0.8.0" +description = "Low-level, pure Python DBus protocol wrapper." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest", "pytest-trio", "pytest-asyncio (>=0.17)", "testpath", "trio", "async-timeout"] +trio = ["trio", "async-generator"] + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "keyring" +version = "22.3.0" +description = "Store and access your passwords safely." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=1", markers = "python_version < \"3.8\""} +jeepney = {version = ">=0.4.2", markers = "sys_platform == \"linux\""} +pywin32-ctypes = {version = "<0.1.0 || >0.1.0,<0.1.1 || >0.1.1", markers = "sys_platform == \"win32\""} +SecretStorage = {version = ">=3.2", markers = "sys_platform == \"linux\""} + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[[package]] +name = "lockfile" +version = "0.12.2" +description = "Platform-independent file locking module" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "mako" +version = "1.1.0" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "more-itertools" +version = "8.14.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "msgpack" +version = "1.0.4" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "origen" +version = "2.0.0.dev5" +description = "Semiconductor Developer's Kit" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +beautifulsoup4 = "4.8.2" +bs4 = "0.0.1" +colorama = "^0.4" +importlib-metadata = ">= 1.7.0" +Jinja2 = "^3" +mako = "1.1.0" +origen_autoapi = "2.0.1" +origen_metal = "= 0.4.0" +poetry = "^1.1.14" +recommonmark = ">= 0" +sphinx = "3.0.2" +sphinxbootstrap4theme = ">= 0" +termcolor = ">= 1.1.0" +yapf = "0.30" + +[package.source] +type = "directory" +url = "../../python/origen" + +[[package]] +name = "origen-autoapi" +version = "2.0.1" +description = "Automatic API reference documentation generation for Sphinx inspired by Doxygen, with changes for the Origen project." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +sphinx = "*" + +[[package]] +name = "origen-metal" +version = "0.4.0" +description = "Bare metal APIs for the Origen SDK" +category = "main" +optional = false +python-versions = ">=3.7,<3.11" +develop = true + +[package.dependencies] +colorama = ">= 0.4.4" +pyreadline3 = {version = "^3.3", markers = "sys_platform == \"win32\""} +termcolor = ">= 1.1.0" + +[package.source] +type = "directory" +url = "../../python/origen_metal" + +[[package]] +name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pkginfo" +version = "1.8.3" +description = "Query metadatdata from sdists / bdists / installed packages." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.extras] +testing = ["nose", "coverage"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poetry" +version = "1.1.14" +description = "Python dependency management and packaging made easy." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +cachecontrol = {version = ">=0.12.9,<0.13.0", extras = ["filecache"], markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +cachy = ">=0.3.0,<0.4.0" +cleo = ">=0.8.1,<0.9.0" +clikit = ">=0.6.2,<0.7.0" +crashtest = {version = ">=0.3.0,<0.4.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +html5lib = ">=1.0,<2.0" +importlib-metadata = {version = ">=1.6.0,<2.0.0", markers = "python_version < \"3.8\""} +keyring = {version = ">=21.2.0", markers = "python_version >= \"3.6\" and python_version < \"4.0\""} +packaging = ">=20.4,<21.0" +pexpect = ">=4.7.0,<5.0.0" +pkginfo = ">=1.4,<2.0" +poetry-core = ">=1.0.7,<1.1.0" +requests = ">=2.18,<3.0" +requests-toolbelt = ">=0.9.1,<0.10.0" +shellingham = ">=1.1,<2.0" +tomlkit = ">=0.7.0,<1.0.0" +virtualenv = ">=20.0.26,<21.0.0" + +[[package]] +name = "poetry-core" +version = "1.0.8" +description = "Poetry PEP 517 Build Backend" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +importlib-metadata = {version = ">=1.7.0,<2.0.0", markers = "python_version >= \"2.7\" and python_version < \"2.8\" or python_version >= \"3.5\" and python_version < \"3.8\""} + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pygments" +version = "2.12.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "pylev" +version = "1.4.0" +description = "A pure Python Levenshtein implementation that's not freaking GPL'd." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pyreadline3" +version = "3.4.1" +description = "A python implementation of GNU readline." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pytest" +version = "3.10.1" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +more-itertools = ">=4.0.0" +pluggy = ">=0.7" +py = ">=1.5.0" +six = ">=1.10.0" + +[[package]] +name = "pytz" +version = "2022.2.1" +description = "World timezone definitions, modern and historical" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "recommonmark" +version = "0.7.1" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +commonmark = ">=0.8.1" +docutils = ">=0.11" +sphinx = ">=1.3.1" + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7, <4" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "requests-toolbelt" +version = "0.9.1" +description = "A utility belt for advanced users of python-requests" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +requests = ">=2.0.1,<3.0.0" + +[[package]] +name = "secretstorage" +version = "3.3.3" +description = "Python bindings to FreeDesktop.org Secret Service API" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +cryptography = ">=2.0" +jeepney = ">=0.6" + +[[package]] +name = "shellingham" +version = "1.5.0" +description = "Tool to Detect Surrounding Shell" +category = "main" +optional = false +python-versions = ">=3.4" + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "soupsieve" +version = "2.3.2.post1" +description = "A modern CSS selector implementation for Beautiful Soup." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "sphinx" +version = "3.0.2" +description = "Python documentation generator" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.12" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.770)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "typed-ast", "cython"] + +[[package]] +name = "sphinxbootstrap4theme" +version = "0.6.0" +description = "Sphinx Bootstrap4 Theme" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "termcolor" +version = "1.1.0" +description = "ANSII Color formatting for output in terminal." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tomlkit" +version = "0.11.4" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" + +[[package]] +name = "urllib3" +version = "1.26.11" +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.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "virtualenv" +version = "20.16.2" +description = "Virtual Python Environment builder" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +distlib = ">=0.3.1,<1" +filelock = ">=3.2,<4" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +platformdirs = ">=2,<3" + +[package.extras] +testing = ["pytest-timeout (>=1)", "pytest-randomly (>=1)", "pytest-mock (>=2)", "pytest-freezegun (>=0.4.1)", "pytest-env (>=0.6.2)", "pytest (>=4)", "packaging (>=20.0)", "flaky (>=3)", "coverage-enable-subprocess (>=1)", "coverage (>=4)"] +docs = ["towncrier (>=21.3)", "sphinx-rtd-theme (>=0.4.3)", "sphinx-argparse (>=0.2.5)", "sphinx (>=3)", "proselint (>=0.10.2)"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "yapf" +version = "0.30.0" +description = "A formatter for Python code." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.8.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "jaraco.tidelift (>=1.4)"] +testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)"] + +[metadata] +lock-version = "1.1" +python-versions = ">=3.7,<3.11" +content-hash = "1f4c2af7a73abea014b8d078693c410088ef6c775fb5d4b9e8e06aa06b9a5680" + +[metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +babel = [ + {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, + {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.8.2-py2-none-any.whl", hash = "sha256:e1505eeed31b0f4ce2dbb3bc8eb256c04cc2b3b72af7d551a4ab6efd5cbe5dae"}, + {file = "beautifulsoup4-4.8.2-py3-none-any.whl", hash = "sha256:9fbb4d6e48ecd30bcacc5b63b94088192dcda178513b2ae3c394229f8911b887"}, + {file = "beautifulsoup4-4.8.2.tar.gz", hash = "sha256:05fd825eb01c290877657a56df4c6e4c311b3965bda790c613a3d6fb01a5462a"}, +] +bs4 = [ + {file = "bs4-0.0.1.tar.gz", hash = "sha256:36ecea1fd7cc5c0c6e4a1ff075df26d50da647b75376626cc186e2212886dd3a"}, +] +cachecontrol = [ + {file = "CacheControl-0.12.11-py2.py3-none-any.whl", hash = "sha256:2c75d6a8938cb1933c75c50184549ad42728a27e9f6b92fd677c3151aa72555b"}, + {file = "CacheControl-0.12.11.tar.gz", hash = "sha256:a5b9fcc986b184db101aa280b42ecdcdfc524892596f606858e0b7a8b4d9e144"}, +] +cachy = [ + {file = "cachy-0.3.0-py2.py3-none-any.whl", hash = "sha256:338ca09c8860e76b275aff52374330efedc4d5a5e45dc1c5b539c1ead0786fe7"}, + {file = "cachy-0.3.0.tar.gz", hash = "sha256:186581f4ceb42a0bbe040c407da73c14092379b1e4c0e327fdb72ae4a9b269b1"}, +] +certifi = [ + {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, + {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, +] +cffi = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, + {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, +] +cleo = [ + {file = "cleo-0.8.1-py2.py3-none-any.whl", hash = "sha256:141cda6dc94a92343be626bb87a0b6c86ae291dfc732a57bf04310d4b4201753"}, + {file = "cleo-0.8.1.tar.gz", hash = "sha256:3d0e22d30117851b45970b6c14aca4ab0b18b1b53c8af57bed13208147e4069f"}, +] +clikit = [ + {file = "clikit-0.6.2-py2.py3-none-any.whl", hash = "sha256:71268e074e68082306e23d7369a7b99f824a0ef926e55ba2665e911f7208489e"}, + {file = "clikit-0.6.2.tar.gz", hash = "sha256:442ee5db9a14120635c5990bcdbfe7c03ada5898291f0c802f77be71569ded59"}, +] +colorama = [ + {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, + {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, +] +commonmark = [ + {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, + {file = "commonmark-0.9.1.tar.gz", hash = "sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60"}, +] +crashtest = [ + {file = "crashtest-0.3.1-py3-none-any.whl", hash = "sha256:300f4b0825f57688b47b6d70c6a31de33512eb2fa1ac614f780939aa0cf91680"}, + {file = "crashtest-0.3.1.tar.gz", hash = "sha256:42ca7b6ce88b6c7433e2ce47ea884e91ec93104a4b754998be498a8e6c3d37dd"}, +] +cryptography = [ + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884"}, + {file = "cryptography-37.0.4-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8"}, + {file = "cryptography-37.0.4-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3"}, + {file = "cryptography-37.0.4-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59"}, + {file = "cryptography-37.0.4-cp36-abi3-win32.whl", hash = "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157"}, + {file = "cryptography-37.0.4-cp36-abi3-win_amd64.whl", hash = "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b"}, + {file = "cryptography-37.0.4-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282"}, + {file = "cryptography-37.0.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a"}, + {file = "cryptography-37.0.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab"}, + {file = "cryptography-37.0.4.tar.gz", hash = "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82"}, +] +distlib = [ + {file = "distlib-0.3.5-py2.py3-none-any.whl", hash = "sha256:b710088c59f06338ca514800ad795a132da19fda270e3ce4affc74abf955a26c"}, + {file = "distlib-0.3.5.tar.gz", hash = "sha256:a7f75737c70be3b25e2bee06288cec4e4c221de18455b2dd037fe2a795cab2fe"}, +] +docutils = [ + {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, + {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, +] +filelock = [ + {file = "filelock-3.8.0-py3-none-any.whl", hash = "sha256:617eb4e5eedc82fc5f47b6d61e4d11cb837c56cb4544e39081099fa17ad109d4"}, + {file = "filelock-3.8.0.tar.gz", hash = "sha256:55447caa666f2198c5b6b13a26d2084d26fa5b115c00d065664b2124680c4edc"}, +] +html5lib = [ + {file = "html5lib-1.1-py2.py3-none-any.whl", hash = "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d"}, + {file = "html5lib-1.1.tar.gz", hash = "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +imagesize = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, + {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, +] +jeepney = [ + {file = "jeepney-0.8.0-py3-none-any.whl", hash = "sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755"}, + {file = "jeepney-0.8.0.tar.gz", hash = "sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +keyring = [ + {file = "keyring-22.3.0-py3-none-any.whl", hash = "sha256:2bc8363ebdd63886126a012057a85c8cb6e143877afa02619ac7dbc9f38a207b"}, + {file = "keyring-22.3.0.tar.gz", hash = "sha256:16927a444b2c73f983520a48dec79ddab49fe76429ea05b8d528d778c8339522"}, +] +lockfile = [ + {file = "lockfile-0.12.2-py2.py3-none-any.whl", hash = "sha256:6c3cb24f344923d30b2785d5ad75182c8ea7ac1b6171b08657258ec7429d50fa"}, + {file = "lockfile-0.12.2.tar.gz", hash = "sha256:6aed02de03cba24efabcd600b30540140634fc06cfa603822d508d5361e9f799"}, +] +mako = [ + {file = "Mako-1.1.0.tar.gz", hash = "sha256:a36919599a9b7dc5d86a7a8988f23a9a3a3d083070023bab23d64f7f1d1e0a4b"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +more-itertools = [ + {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, + {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, +] +msgpack = [ + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ab251d229d10498e9a2f3b1e68ef64cb393394ec477e3370c457f9430ce9250"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:112b0f93202d7c0fef0b7810d465fde23c746a2d482e1e2de2aafd2ce1492c88"}, + {file = "msgpack-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:002b5c72b6cd9b4bafd790f364b8480e859b4712e91f43014fe01e4f957b8467"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35bc0faa494b0f1d851fd29129b2575b2e26d41d177caacd4206d81502d4c6a6"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4733359808c56d5d7756628736061c432ded018e7a1dff2d35a02439043321aa"}, + {file = "msgpack-1.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb514ad14edf07a1dbe63761fd30f89ae79b42625731e1ccf5e1f1092950eaa6"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c23080fdeec4716aede32b4e0ef7e213c7b1093eede9ee010949f2a418ced6ba"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:49565b0e3d7896d9ea71d9095df15b7f75a035c49be733051c34762ca95bbf7e"}, + {file = "msgpack-1.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:aca0f1644d6b5a73eb3e74d4d64d5d8c6c3d577e753a04c9e9c87d07692c58db"}, + {file = "msgpack-1.0.4-cp310-cp310-win32.whl", hash = "sha256:0dfe3947db5fb9ce52aaea6ca28112a170db9eae75adf9339a1aec434dc954ef"}, + {file = "msgpack-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dea20515f660aa6b7e964433b1808d098dcfcabbebeaaad240d11f909298075"}, + {file = "msgpack-1.0.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e83f80a7fec1a62cf4e6c9a660e39c7f878f603737a0cdac8c13131d11d97f52"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c11a48cf5e59026ad7cb0dc29e29a01b5a66a3e333dc11c04f7e991fc5510a9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1276e8f34e139aeff1c77a3cefb295598b504ac5314d32c8c3d54d24fadb94c9"}, + {file = "msgpack-1.0.4-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c9566f2c39ccced0a38d37c26cc3570983b97833c365a6044edef3574a00c08"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fcb8a47f43acc113e24e910399376f7277cf8508b27e5b88499f053de6b115a8"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:76ee788122de3a68a02ed6f3a16bbcd97bc7c2e39bd4d94be2f1821e7c4a64e6"}, + {file = "msgpack-1.0.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:0a68d3ac0104e2d3510de90a1091720157c319ceeb90d74f7b5295a6bee51bae"}, + {file = "msgpack-1.0.4-cp36-cp36m-win32.whl", hash = "sha256:85f279d88d8e833ec015650fd15ae5eddce0791e1e8a59165318f371158efec6"}, + {file = "msgpack-1.0.4-cp36-cp36m-win_amd64.whl", hash = "sha256:c1683841cd4fa45ac427c18854c3ec3cd9b681694caf5bff04edb9387602d661"}, + {file = "msgpack-1.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a75dfb03f8b06f4ab093dafe3ddcc2d633259e6c3f74bb1b01996f5d8aa5868c"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9667bdfdf523c40d2511f0e98a6c9d3603be6b371ae9a238b7ef2dc4e7a427b0"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11184bc7e56fd74c00ead4f9cc9a3091d62ecb96e97653add7a879a14b003227"}, + {file = "msgpack-1.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ac5bd7901487c4a1dd51a8c58f2632b15d838d07ceedaa5e4c080f7190925bff"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1e91d641d2bfe91ba4c52039adc5bccf27c335356055825c7f88742c8bb900dd"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2a2df1b55a78eb5f5b7d2a4bb221cd8363913830145fad05374a80bf0877cb1e"}, + {file = "msgpack-1.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:545e3cf0cf74f3e48b470f68ed19551ae6f9722814ea969305794645da091236"}, + {file = "msgpack-1.0.4-cp37-cp37m-win32.whl", hash = "sha256:2cc5ca2712ac0003bcb625c96368fd08a0f86bbc1a5578802512d87bc592fe44"}, + {file = "msgpack-1.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:eba96145051ccec0ec86611fe9cf693ce55f2a3ce89c06ed307de0e085730ec1"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:7760f85956c415578c17edb39eed99f9181a48375b0d4a94076d84148cf67b2d"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:449e57cc1ff18d3b444eb554e44613cffcccb32805d16726a5494038c3b93dab"}, + {file = "msgpack-1.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d603de2b8d2ea3f3bcb2efe286849aa7a81531abc52d8454da12f46235092bcb"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f5d88c99f64c456413d74a975bd605a9b0526293218a3b77220a2c15458ba9"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6916c78f33602ecf0509cc40379271ba0f9ab572b066bd4bdafd7434dee4bc6e"}, + {file = "msgpack-1.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81fc7ba725464651190b196f3cd848e8553d4d510114a954681fd0b9c479d7e1"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5b5b962221fa2c5d3a7f8133f9abffc114fe218eb4365e40f17732ade576c8e"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:77ccd2af37f3db0ea59fb280fa2165bf1b096510ba9fe0cc2bf8fa92a22fdb43"}, + {file = "msgpack-1.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b17be2478b622939e39b816e0aa8242611cc8d3583d1cd8ec31b249f04623243"}, + {file = "msgpack-1.0.4-cp38-cp38-win32.whl", hash = "sha256:2bb8cdf50dd623392fa75525cce44a65a12a00c98e1e37bf0fb08ddce2ff60d2"}, + {file = "msgpack-1.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:26b8feaca40a90cbe031b03d82b2898bf560027160d3eae1423f4a67654ec5d6"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:462497af5fd4e0edbb1559c352ad84f6c577ffbbb708566a0abaaa84acd9f3ae"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2999623886c5c02deefe156e8f869c3b0aaeba14bfc50aa2486a0415178fce55"}, + {file = "msgpack-1.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f0029245c51fd9473dc1aede1160b0a29f4a912e6b1dd353fa6d317085b219da"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed6f7b854a823ea44cf94919ba3f727e230da29feb4a99711433f25800cf747f"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0df96d6eaf45ceca04b3f3b4b111b86b33785683d682c655063ef8057d61fd92"}, + {file = "msgpack-1.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6a4192b1ab40f8dca3f2877b70e63799d95c62c068c84dc028b40a6cb03ccd0f"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e3590f9fb9f7fbc36df366267870e77269c03172d086fa76bb4eba8b2b46624"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1576bd97527a93c44fa856770197dec00d223b0b9f36ef03f65bac60197cedf8"}, + {file = "msgpack-1.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63e29d6e8c9ca22b21846234913c3466b7e4ee6e422f205a2988083de3b08cae"}, + {file = "msgpack-1.0.4-cp39-cp39-win32.whl", hash = "sha256:fb62ea4b62bfcb0b380d5680f9a4b3f9a2d166d9394e9bbd9666c0ee09a3645c"}, + {file = "msgpack-1.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:4d5834a2a48965a349da1c5a79760d94a1a0172fbb5ab6b5b33cbf8447e109ce"}, + {file = "msgpack-1.0.4.tar.gz", hash = "sha256:f5d869c18f030202eb412f08b28d2afeea553d6613aee89e200d7aca7ef01f5f"}, +] +origen = [] +origen-autoapi = [ + {file = "origen_autoapi-2.0.1-py3-none-any.whl", hash = "sha256:2807aaa7c861e54679a572bdf36d5c77ea4f26f61464b5dba293f44dd4db8dca"}, + {file = "origen_autoapi-2.0.1.tar.gz", hash = "sha256:df282703e9a430a4242299684d69d0631ea8c6e323c920e57580dc04d78c0c3d"}, +] +origen-metal = [] +packaging = [ + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pastel = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] +pexpect = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] +pkginfo = [ + {file = "pkginfo-1.8.3-py2.py3-none-any.whl", hash = "sha256:848865108ec99d4901b2f7e84058b6e7660aae8ae10164e015a6dcf5b242a594"}, + {file = "pkginfo-1.8.3.tar.gz", hash = "sha256:a84da4318dd86f870a9447a8c98340aa06216bfc6f2b7bdc4b8766984ae1867c"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +poetry = [ + {file = "poetry-1.1.14-py2.py3-none-any.whl", hash = "sha256:fbd0b2536b730cd1d7a1fabb3a292a2cc423c5da3d59c4db44335a449f5acd9a"}, + {file = "poetry-1.1.14.tar.gz", hash = "sha256:8b5a7676cda9b9e85c71743c672352cabcb6e2f647b6b88fa95e4f374bc8edce"}, +] +poetry-core = [ + {file = "poetry-core-1.0.8.tar.gz", hash = "sha256:951fc7c1f8d710a94cb49019ee3742125039fc659675912ea614ac2aa405b118"}, + {file = "poetry_core-1.0.8-py2.py3-none-any.whl", hash = "sha256:54b0fab6f7b313886e547a52f8bf52b8cf43e65b2633c65117f8755289061924"}, +] +ptyprocess = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pycparser = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] +pygments = [ + {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, + {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, +] +pylev = [ + {file = "pylev-1.4.0-py2.py3-none-any.whl", hash = "sha256:7b2e2aa7b00e05bb3f7650eb506fc89f474f70493271a35c242d9a92188ad3dd"}, + {file = "pylev-1.4.0.tar.gz", hash = "sha256:9e77e941042ad3a4cc305dcdf2b2dec1aec2fbe3dd9015d2698ad02b173006d1"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pyreadline3 = [ + {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, + {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, +] +pytest = [ + {file = "pytest-3.10.1-py2.py3-none-any.whl", hash = "sha256:3f193df1cfe1d1609d4c583838bea3d532b18d6160fd3f55c9447fdca30848ec"}, + {file = "pytest-3.10.1.tar.gz", hash = "sha256:e246cf173c01169b9617fc07264b7b1316e78d7a650055235d6d897bc80d9660"}, +] +pytz = [ + {file = "pytz-2022.2.1-py2.py3-none-any.whl", hash = "sha256:220f481bdafa09c3955dfbdddb7b57780e9a94f5127e35456a48589b9e0c0197"}, + {file = "pytz-2022.2.1.tar.gz", hash = "sha256:cea221417204f2d1a2aa03ddae3e867921971d0d76f14d87abb4414415bbdcf5"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +recommonmark = [ + {file = "recommonmark-0.7.1-py2.py3-none-any.whl", hash = "sha256:1b1db69af0231efce3fa21b94ff627ea33dee7079a01dd0a7f8482c3da148b3f"}, + {file = "recommonmark-0.7.1.tar.gz", hash = "sha256:bdb4db649f2222dcd8d2d844f0006b958d627f732415d399791ee436a3686d67"}, +] +requests = [ + {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, + {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, +] +requests-toolbelt = [ + {file = "requests-toolbelt-0.9.1.tar.gz", hash = "sha256:968089d4584ad4ad7c171454f0a5c6dac23971e9472521ea3b6d49d610aa6fc0"}, + {file = "requests_toolbelt-0.9.1-py2.py3-none-any.whl", hash = "sha256:380606e1d10dc85c3bd47bf5a6095f815ec007be7a8b69c878507068df059e6f"}, +] +secretstorage = [ + {file = "SecretStorage-3.3.3-py3-none-any.whl", hash = "sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99"}, + {file = "SecretStorage-3.3.3.tar.gz", hash = "sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77"}, +] +shellingham = [ + {file = "shellingham-1.5.0-py2.py3-none-any.whl", hash = "sha256:a8f02ba61b69baaa13facdba62908ca8690a94b8119b69f5ec5873ea85f7391b"}, + {file = "shellingham-1.5.0.tar.gz", hash = "sha256:72fb7f5c63103ca2cb91b23dee0c71fe8ad6fbfd46418ef17dbe40db51592dad"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] +soupsieve = [ + {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, + {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, +] +sphinx = [ + {file = "Sphinx-3.0.2-py3-none-any.whl", hash = "sha256:3145d87d0962366d4c5264c39094eae3f5788d01d4b1a12294051bfe4271d91b"}, + {file = "Sphinx-3.0.2.tar.gz", hash = "sha256:d7c6e72c6aa229caf96af82f60a0d286a1521d42496c226fe37f5a75dcfe2941"}, +] +sphinxbootstrap4theme = [ + {file = "sphinxbootstrap4theme-0.6.0.tar.gz", hash = "sha256:d3b2e413785afc74aa178872aa553d7b4156206037fdb39b7ff1490c7926d138"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, +] +termcolor = [ + {file = "termcolor-1.1.0.tar.gz", hash = "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"}, +] +tomlkit = [ + {file = "tomlkit-0.11.4-py3-none-any.whl", hash = "sha256:25d4e2e446c453be6360c67ddfb88838cfc42026322770ba13d1fbd403a93a5c"}, + {file = "tomlkit-0.11.4.tar.gz", hash = "sha256:3235a9010fae54323e727c3ac06fb720752fe6635b3426e379daec60fbd44a83"}, +] +urllib3 = [ + {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, + {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, +] +virtualenv = [ + {file = "virtualenv-20.16.2-py2.py3-none-any.whl", hash = "sha256:635b272a8e2f77cb051946f46c60a54ace3cb5e25568228bd6b57fc70eca9ff3"}, + {file = "virtualenv-20.16.2.tar.gz", hash = "sha256:0ef5be6d07181946891f5abc8047fda8bc2f0b4b9bf222c64e6e8963baee76db"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +yapf = [ + {file = "yapf-0.30.0-py2.py3-none-any.whl", hash = "sha256:3abf61ba67cf603069710d30acbc88cfe565d907e16ad81429ae90ce9651e0c9"}, + {file = "yapf-0.30.0.tar.gz", hash = "sha256:3000abee4c28daebad55da6c85f3cd07b8062ce48e2e9943c8da1b9667d48427"}, +] +zipp = [ + {file = "zipp-3.8.1-py3-none-any.whl", hash = "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009"}, + {file = "zipp-3.8.1.tar.gz", hash = "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2"}, +] diff --git a/test_apps/test_apps_shared_test_helpers/pyproject.toml b/test_apps/test_apps_shared_test_helpers/pyproject.toml new file mode 100644 index 00000000..013eb91b --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/pyproject.toml @@ -0,0 +1,18 @@ +[tool.poetry] +name = "test_apps_shared_test_helpers" +version = "0.1.0" +description = "Shared Regression Test Helpers for Test Apps" +authors = ["Origen-SDK"] + +[tool.poetry.dependencies] +python = ">=3.7.0,<3.13" +pytest = ">=7.2.1" +origen = { path = "../../python/origen", develop = true } +pl_ext_cmds = { path = "../pl_ext_cmds", develop = true } + +[tool.poetry.dev-dependencies] +pytest = "^3" + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/setup.cfg b/test_apps/test_apps_shared_test_helpers/setup.cfg new file mode 100644 index 00000000..6e1cfdfa --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/setup.cfg @@ -0,0 +1,2 @@ +[tool:pytest] +testpaths = tests \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/targets/dut/.keep b/test_apps/test_apps_shared_test_helpers/targets/dut/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/targets/tester/smt7.py b/test_apps/test_apps_shared_test_helpers/targets/tester/smt7.py new file mode 100644 index 00000000..9335607f --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/targets/tester/smt7.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT7") \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/targets/tester/smt8.py b/test_apps/test_apps_shared_test_helpers/targets/tester/smt8.py new file mode 100644 index 00000000..7a378261 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/targets/tester/smt8.py @@ -0,0 +1 @@ +origen.tester.target("::V93K::SMT8") \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/targets/tester/uflex.py b/test_apps/test_apps_shared_test_helpers/targets/tester/uflex.py new file mode 100644 index 00000000..da6c3b88 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/targets/tester/uflex.py @@ -0,0 +1 @@ +origen.tester.target("Ultraflex") \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/application.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/application.py new file mode 100644 index 00000000..5b9a0cb4 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/application.py @@ -0,0 +1,6 @@ +from origen.application import Base + +# This class represents this application and is automatically instantiated as `origen.app` +# It is required by Origen and should not be renamed or removed under any circumstances +class Application(Base): + pass diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/__init__.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/__init__.py new file mode 100644 index 00000000..20660985 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/__init__.py @@ -0,0 +1,4 @@ +from test_apps_shared_test_helpers.cli import output_args + +def run(**args): + print(output_args(None, args)) diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts.toml new file mode 100644 index 00000000..160df9ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts.toml @@ -0,0 +1,14 @@ +[[extension]] +extend = "origen.app" +global = false + + [[extension.opt]] + name = "generic_ext_core_from_aux" + help = "Generic Extension From Aux Commands" + +[[extension]] +extend = "origen.eval" + + [[extension.opt]] + name = "core_cmd_exts_generic_core_ext" + help = "Generic core ext from aux commands" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts/core/eval.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts/core/eval.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts/core/eval.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts_cfg.toml new file mode 100644 index 00000000..90a3a7c8 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/core_cmd_exts_cfg.toml @@ -0,0 +1,8 @@ +[[auxillary_commands]] +path = "./core_cmd_exts.toml" + +[plugins] +collect = false +load = [ + { name = "pl_ext_cmds" }, +] diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds.toml new file mode 100644 index 00000000..14161c17 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds.toml @@ -0,0 +1,21 @@ +[[command]] +name = "dummy_cmd" +help = "Dummy Aux Command" + + [[command.arg]] + name = "action_arg" + help = "Dummy Aux Action" + multiple = true + + [[command.subcommand]] + name = "subc" + help = "Dummy Aux Subcommand" + + [[command.subcommand.arg]] + name = "action_arg" + help = "Dummy Aux Subc Action" + multiple = true + + [[command.subcommand.opt]] + name = "flag_opt" + help = "Dummy Aux Subc Flag" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds/dummy_cmd.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds/dummy_cmd.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds/dummy_cmd.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds/dummy_cmd/subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds/dummy_cmd/subc.py new file mode 100644 index 00000000..c30a3947 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds/dummy_cmd/subc.py @@ -0,0 +1 @@ +from test_apps_shared_test_helpers.aux_cmds import run diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds_cfg.toml new file mode 100644 index 00000000..09e75bc6 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/dummy_cmds_cfg.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./dummy_cmds.toml" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns.toml new file mode 100644 index 00000000..0f3637af --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns.toml @@ -0,0 +1 @@ +help = "Aux namespace without any commands defined" \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns_cfg.toml new file mode 100644 index 00000000..216d6826 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/empty_aux_ns_cfg.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./empty_aux_ns.toml" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts.toml new file mode 100644 index 00000000..e866e783 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts.toml @@ -0,0 +1,204 @@ +# Conflict with core cmd arg name +[[extension]] +extend = "origen.eval" +help = "Conflict with core cmd arg" +on_env=["ORIGEN_EXT_CONFLICTS_CORE_CMD_EVAL"] + + [[extension.opt]] + name = "code" + help = "Conflict with core cmd arg name from AUX" + +[[extension]] +extend = "origen.credentials.clear" +help = "Conflict with core cmd opt from AUX" +on_env=["ORIGEN_EXT_CONFLICTS_CORE_CMD_CREDS_CLEAR"] + + [[extension.opt]] + name = "all" + help = "Conflict with core cmd opt name. Uses full name" + + [[extension.opt]] + name = "cmd_conflicts_aux" + help = "Conflict with core cmd opt from AUX" + long = "all" + short = "a" + long_aliases = ["datasets", "pl_datasets"] + short_aliases = ["d", "e", "f"] + +# TESTS_NEEDED CLI Conflict with help opt +# [[extension]] +# extend = "origen.eval" +# help = "Conflict with help arg" +# [[extension.opt]] +# name = "help" +# help = "Conflict with help arg" + +# [[extension]] +# extend = "origen.eval" +# help = "Conflict with help arg" +# [[extension.opt]] +# name = "conflict_sn_help" +# help = "Conflict with help arg" +# short = "h" + +# [[extension]] +# extend = "origen.eval" +# help = "Conflict with help arg" +# [[extension.opt]] +# name = "conflict_help" +# help = "Conflict with help arg" +# short = "g" +# long = "help" + +# [[extension]] +# extend = "origen.eval" +# help = "Conflict with help arg" +# [[extension.opt]] +# name = "conflict_help" +# help = "Conflict with help arg" +# short = "g" +# long = "help1" +# long_aliases = ["help2", "help"] +# short_aliases = ["h", "i"] + +# TESTS_NEEDED CLI Opt conflict with v, vk + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args" +help = "Conflict with plugin from aux ext" +on_env=["ORIGEN_EXT_CONFLICTS_PL_TEST_ARGS"] + [[extension.opt]] + name = "single_arg" + help = "Conflict with cmd arg" + [[extension.opt]] + name = "opt_taking_value" + help = "Conflict with cmd opt name but long name okay" + long = "otv" + [[extension.opt]] + name = "conflict_sn" + help = "Conflict with cmd opt sn" + short = "n" + [[extension.opt]] + name = "pl_aux_conflict" + help = "plugin-aux conflict (Aux)" + [[extension.opt]] + name = "pl_aux_sn_conflict_aux" + help = "plugin-aux conflict (sn) (Aux)" + short = "s" + [[extension.opt]] + name = "aux_conflict_ln_and_aliases" + help = "Conflict with cmd opt ln and some aliases (Aux)" + long = "alias" + long_aliases = ["opt_alias", "other_alias_pl", "other_alias_aux"] + short_aliases = ["a", "b", "c", "d"] + [[extension.opt]] + name = "flag" + help = "Conflict with inferred long name (Aux)" + [[extension.opt]] + name = "alias" + help = "Conflict with inferred long name with aliases (Aux)" + long_aliases = ["alias_aux"] + [[extension.opt]] + name = "subc" + help = "Conflict with plugin subcommand" + [[extension.opt]] + name = "ns_self_conflict" + help = "Conflict within the namespace" + long = "subc" + short = "d" + [[extension.opt]] + name = "ns_self_conflict" + help = "Conflict within the namespace" + long = "another_self_conflict" + [[extension.opt]] + name = "ext_self_conflict" + help = "Ln conflict within the extension" + long = "ns_self_conflict" + [[extension.opt]] + name = "ext_self_conflict" + help = "Ln conflict within the extension" + [[extension.opt]] + name = "ext_self_conflict_2" + help = "Ilna conflicts within the extension" + long_aliases = ["ext_self_conflict", "ext_self_conflict_2", "ext_self_conflict_2_1"] + [[extension.opt]] + name = "ext_opt_in_ln" + help = "Reserved prefix in ln" + long = "ext_opt.in_ln" + [[extension.opt]] + name = "ext_opt_in_lna" + help = "Reserved prefix in lna" + long_aliases = ["ext_opt_in_lna_2", "ext_opt.in_lna"] + [[extension.opt]] + name = "ext_opt.reserved_name" + help = "Conflict with reserved name" + long = "reserved_name" + [[extension.opt]] + name = "same_ln_and_ln_alias" + help = "Same ln and lna" + long = "same_ln_and_ln_alias" + long_aliases = ["same_ln_and_ln_alias"] + [[extension.opt]] + name = "same_iln_and_ln_alias" + help = "Same inferred ln and lna" + long_aliases = ["same_iln_and_ln_alias"] + [[extension.opt]] + name = "repeated_sn_and_aliases" + help = "Repeated sna and lna, with sn conflict" + short = "g" + long_aliases = ["repeated_lna", "repeated_lna", "repeated_lna_2"] + short_aliases = ["g", "e", "e", "e"] + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args.subc" +on_env=["ORIGEN_EXT_CONFLICTS_PL_TEST_ARGS_SUBC"] + [[extension.opt]] + name = "subc_pl_aux_conflict" + help = "plugin-aux conflict (AUX)" + long = "subc_pl_aux" + sn = "c" + long_aliases = ["pl0", "aux0", "subc_pl_aux"] + short_aliases = ["a", "e", "b"] + [[extension.opt]] + name = "subc_pl_aux_conflict" + help = "plugin-aux conflict" + [[extension.opt]] + name = "flag_opt" + help = "Conflict with inferred long name (AUX)" + [[extension.opt]] + name = "more_conflicts" + help = "More conflicts (AUX)" + long_aliases = ["more_conflicts", "subc_opt"] + short_aliases = ["d", "n"] + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args" +on_env = ["ORIGEN_APP_PL_CMD_CONFLICTS"] + + [[extension.opt]] + name = "ec_opt" + help = "Opt from EC" + long = "ec" + short = "e" + long_aliases = ["e_opt"] + short_aliases = ["a", "b", "c", "d"] + + [[extension.opt]] + name = "tas_iln" + short = "n" + long_aliases = ["t_opt"] + help = "More conflicts" + +[[extension]] +extend = "app.arg_opt_warmup" +on_env = ["ORIGEN_APP_EXT_CONFLICTS_ARG_OPT_WARMUP"] + + [[extension.opt]] + name = "flag_opt" + help = "Conflict with flag opt from ext_conflicts AUX" + + [[extension.opt]] + name = "conflicts_from_ext_conflicts" + help = "Some conflicts from ext_conflicts AUX" + long_aliases=["python_plugin_conflicts", "TAS", "EX_Conflicts", "hidden"] + short_aliases=["a", "b", "c"] \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/app.arg_opt_warmup.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/app.arg_opt_warmup.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/app.arg_opt_warmup.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/plugin.python_plugin.plugin_test_args.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/plugin.python_plugin.plugin_test_args.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/plugin.python_plugin.plugin_test_args.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/plugin.python_plugin.plugin_test_args.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/plugin.python_plugin.plugin_test_args.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts/plugin.python_plugin.plugin_test_args.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts_cfg.toml new file mode 100644 index 00000000..f3297831 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/ext_conflicts_cfg.toml @@ -0,0 +1,9 @@ +[[auxillary_commands]] +path = "./ext_conflicts.toml" + +[plugins] +collect = false +load = [ + { name = "python_plugin" }, + { name = "test_apps_shared_test_helpers"} +] diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout.toml new file mode 100644 index 00000000..71983402 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout.toml @@ -0,0 +1,95 @@ +[[extension]] +extend = "plugin.python_plugin.plugin_test_args" +help = "Extend plugin command from aux command" + + [[extension.opt]] + name = "flag_extension" + help = "Single flag extension" + short = "f" + long = "flag_ext" + + [[extension.opt]] + name = "single_val_opt" + short = "s" + takes_value = true + help = "Extended opt taking a single value" + + [[extension.opt]] + name = "multi_val_opt" + long = "multi" + short_aliases = ["m"] + long_aliases = ["multi_non_delim"] + multiple = true + help = "Extended opt taking a multiple, non-delimited values" + + [[extension.opt]] + name = "multi_val_delim_opt" + long_aliases = ["multi_delim"] + use_delimiter = true + help = "Extended opt taking a multiple, delimited values" + + [[extension.opt]] + name = "exts_workout_action" + takes_value = true + multiple = true + required = true + help = "Additional actions for testing purposes" + + [[extension.opt]] + name = "hidden_opt" + help = "Hidden extended opt" + hidden = true + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args.subc" +help = "Extend plugin command's subcommand from aux command" + + [[extension.opt]] + name = "exts_workout_action" + long = "action" + multiple = true + help = "Action for the extended opt" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking" + + [[extension.opt]] + name = "exts_workout_action" + long = "action" + multiple = true + help = "Action for the extended opt" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking.subc" + + [[extension.opt]] + name = "exts_workout_action_subc" + long = "action" + multiple = true + help = "Action for the extended opt subc" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd" + + [[extension.opt]] + name = "exts_workout_action" + long = "action" + multiple = true + help = "Action for the extended opt" + + [[extension.opt]] + name = "exts_workout_flag" + help = "Flag for the extended opt" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd.subc" + + [[extension.opt]] + name = "exts_workout_action" + long = "action" + multiple = true + help = "Action for the extended opt subc" + + [[extension.opt]] + name = "exts_workout_flag_subc" + help = "Flag for the extended opt subc" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/aux_ns/dummy_cmds/dummy_cmd.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/aux_ns/dummy_cmds/dummy_cmd.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/aux_ns/dummy_cmds/dummy_cmd.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/aux_ns/dummy_cmds/dummy_cmd.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/aux_ns/dummy_cmds/dummy_cmd.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/aux_ns/dummy_cmds/dummy_cmd.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_args.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_args.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_args.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_args.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_args.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_args.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_ext_stacking.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_ext_stacking.py new file mode 100644 index 00000000..eb4549b1 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_ext_stacking.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_ext_stacking/subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_ext_stacking/subc.py new file mode 100644 index 00000000..eb4549b1 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout/plugin/python_plugin/plugin_test_ext_stacking/subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout_cfg.toml new file mode 100644 index 00000000..d1ab1c16 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/exts_workout_cfg.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./exts_workout.toml" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux.toml new file mode 100644 index 00000000..056676e9 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux.toml @@ -0,0 +1,47 @@ +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_action" + multiple = true + help = "Action from pl_ext_stacking aux cmds" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_flag" + help = "Flag from pl_ext_stacking aux cmds" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking.subc" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_action_subc" + multiple = true + help = "Action from pl_ext_stacking aux cmds subc" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_flag_subc" + help = "Flag from pl_ext_stacking aux cmds subc" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_action" + multiple = true + help = "Action from pl_ext_stacking aux cmds" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_flag" + help = "Flag from pl_ext_stacking aux cmds" + +[[extension]] +extend = "aux.dummy_cmds.dummy_cmd.subc" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_action_subc" + multiple = true + help = "Action from pl_ext_stacking aux cmds subc" + + [[extension.opt]] + name = "pl_ext_stacking_from_aux_flag_subc" + help = "Flag from pl_ext_stacking aux cmds subc" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/aux_ns.dummy_cmds.dummy_cmd.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/aux_ns.dummy_cmds.dummy_cmd.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/aux_ns.dummy_cmds.dummy_cmd.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/aux_ns.dummy_cmds.dummy_cmd.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/aux_ns.dummy_cmds.dummy_cmd.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/aux_ns.dummy_cmds.dummy_cmd.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/plugin.python_plugin.plugin_test_ext_stacking.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/plugin.python_plugin.plugin_test_ext_stacking.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/plugin.python_plugin.plugin_test_ext_stacking.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/plugin.python_plugin.plugin_test_ext_stacking.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/plugin.python_plugin.plugin_test_ext_stacking.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux/plugin.python_plugin.plugin_test_ext_stacking.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux_cfg.toml new file mode 100644 index 00000000..b258e306 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/pl_ext_stacking_from_aux_cfg.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./pl_ext_stacking_from_aux.toml" \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_aux_cmds.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_aux_cmds.toml new file mode 100644 index 00000000..0c76bc61 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_aux_cmds.toml @@ -0,0 +1,48 @@ +[[command]] +name = "disabling_app_opts_from_aux" +help = "Test disabling standard app opts from aux commands" +in_global_context = false + + [[command.subcommand]] + name = "disable_targets_opt" + help = "Disable the targets and no-targets opt" + add_target_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_target_opt = true + + [[command.subcommand]] + name = "disable_mode_opt" + help = "Disable the mode opt" + add_mode_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_mode_opt = true + + [[command.subcommand]] + name = "disable_app_opts" + help = "Disable all app opts" + add_target_opt = false + add_mode_opt = false + + [[command.subcommand.subcommand]] + name = "disable_subc" + help = "Disables inherited from parent" + + [[command.subcommand.subcommand]] + name = "override_subc" + help = "Overrides disable inherited from parent" + add_target_opt = true + add_mode_opt = true \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_aux_cmds_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_aux_cmds_cfg.toml new file mode 100644 index 00000000..6a736033 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_aux_cmds_cfg.toml @@ -0,0 +1,2 @@ +[[auxillary_commands]] +path = "./python_app_aux_cmds.toml" \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts.toml new file mode 100644 index 00000000..62665494 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts.toml @@ -0,0 +1,43 @@ +[[extension]] +extend = "app.arg_opt_warmup" + [[extension.opt]] + name = "ec_single_opt" + help = "Single opt from EC" + takes_value = true + [[extension.opt]] + name = "ec_multi_opt" + help = "Multi opt from EC" + long = "ec_multi_opt" + short = "e" + long_aliases=["ec_multi", "EC"] + multiple=true + [[extension.opt]] + name = "ec_hidden" + long = "ec_h_opt" + help = "Hidden opt from EC" + hidden = true + +[[extension]] +extend = "app.nested_app_cmds.nested_l1" + [[extension.opt]] + name = "ec_single_opt_shallow" + help = "Single opt from EC" + takes_value = true + [[extension.opt]] + name = "ec_flag_opt_shallow" + help = "Flag opt from EC" + long= "ec_f" + +[[extension]] +extend = "app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a" + [[extension.opt]] + name = "ec_single_opt_deep" + help = "Single opt from EC" + long = "ec_opt" + long_aliases = ["ec_deep"] + takes_value = true + [[extension.opt]] + name = "ec_flag_opt_deep" + help = "Flag opt from EC" + long= "ec_df" + short = "c" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.arg_opt_warmup.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.arg_opt_warmup.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.arg_opt_warmup.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.nested_app_cmds.nested_l1.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.nested_app_cmds.nested_l1.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts/app.nested_app_cmds.nested_l1.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts_cfg.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts_cfg.toml new file mode 100644 index 00000000..fc3f2923 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/aux_cmds/python_app_exts_cfg.toml @@ -0,0 +1,9 @@ +[[auxillary_commands]] +path = "./python_app_exts.toml" + +[plugins] +collect = false +load = [ + { name = "python_plugin" }, + { name = "test_apps_shared_test_helpers"} +] diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/__init__.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/__init__.py new file mode 100644 index 00000000..09d6a629 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/__init__.py @@ -0,0 +1,150 @@ +from origen.helpers.regressions import cli +from origen.helpers import calling_filename +from pathlib import Path, PurePosixPath +import pytest, re + +from .cmd_models import Cmd, CmdArg, CmdOpt, CmdExtOpt +from .cmd_models.auxs import Aux +from .cmd_models.exts import ExtensionDrivers +from .cmd_models.plugins import Plugins +from .error_cases import ErrorCases +from . import dirs + +from .assertions import AssertionHelpers + +develop_origen = "develop_origen" +def develop_origen_cmd(): + return Cmd( + develop_origen, + help="Commands to assist with Origen core development", + aliases=["origen"], + subcmds=[ + Cmd("build"), + Cmd("fmt"), + ] + ) + +cli.GlobalCommands.Names.develop_origen = develop_origen +cli.GlobalCommands.develop_origen = develop_origen_cmd() +cli.GlobalCommands.commands.insert(2, cli.GlobalCommands.develop_origen) + +cli.InAppCommands.Names.develop_origen = develop_origen +cli.InAppCommands.develop_origen = develop_origen_cmd() +cli.InAppCommands.commands.insert(4, cli.InAppCommands.develop_origen) + +def apply_ext_output_args(mod): + from origen.boot import before_cmd, after_cmd, clean_up + from .ext_helpers import do_action + n = get_ext_name() + + def before(**args): + print(before_cmd_ext_args_str(args, ext_name=n)) + do_action(args.get(f"{n}_action", None), "Before") + mod.before = before + before_cmd(mod.before) + + def after(**args): + print(after_cmd_ext_args_str(args, ext_name=n)) + do_action(args.get(f"{n}_action", None), "After") + mod.after = after + after_cmd(mod.after) + + def clean(**args): + print(clean_up_ext_args_str(args, ext_name=n)) + do_action(args.get(f"{n}_action", None), "CleanUp") + mod.clean = clean + clean_up(mod.clean) + +def get_ext_name(frame=None): + split = re.split(r"/plugin\.|/plugin/|/aux_ns\.|/aux_ns/|/core\.|/core/|/app\.|/app/", str(PurePosixPath(calling_filename(frame or 3)))) + if len(split) > 2: + ext_name = split[-2] + else: + ext_name = split[0] + ext_name = Path(ext_name) + if ext_name.stem == "extensions": + ext_name = ext_name.parent.parent + return ext_name.stem + +def output_args(preface, args): + if preface is None: + preface = "(CMD)" + retn = [] + retn.append(f"All Keys: {preface}: {list(args.keys())}") + if len(args) > 0: + for n, arg in args.items(): + retn.append(f"Arg: {preface}: {n} ({arg.__class__}): {arg}") + else: + retn.append(f"Arg: {preface}: No args or opts given!") + return '\n'.join(retn) + +def before_cmd_ext_args_str(ext_args, ext_name=None, frame=None): + if ext_name is None: + ext_name = get_ext_name(frame=frame) + return output_args(f"(Ext) ({ext_name}) (Before Cmd)", ext_args) + +def after_cmd_ext_args_str(ext_args, ext_name=None): + if ext_name is None: + ext_name = get_ext_name() + return output_args(f"(Ext) ({ext_name}) (After Cmd)", ext_args) + +def clean_up_ext_args_str(ext_args, ext_name=None): + if ext_name is None: + ext_name = get_ext_name() + return output_args(f"(Ext) ({ext_name}) (CleanUp Cmd)", ext_args) + +class Configs: + configs_dir = Path(__file__).parent.joinpath("configs") + suppress_plugin_collecting_config = configs_dir.joinpath("suppress_plugin_collecting.toml") + no_plugins_no_aux_cmds_config = configs_dir.joinpath("no_plugins_no_aux_cmds.toml") + empty_config = configs_dir.joinpath("empty.toml") + +class CLIShared(cli.CLI, AssertionHelpers): + Cmd = Cmd + error_messages = ErrorCases() + na = "no_action" + + def get_action_results(self, *args): + from .ext_helpers import get_action_results as get_action_results_wrap + return get_action_results_wrap(*args) + + @pytest.fixture + def cmd(self): + return self._cmd + + @pytest.fixture + def cached_help(self): + return self.get_cached_help() + + def get_cached_help(self): + if not hasattr(self, "_cached_help"): + self._cached_help = self._cmd.get_help_msg() + return self._cached_help + + @classmethod + def add_no_pl_aux_cfg(cls, cmd): + return cmd.extend([], from_configs=cls.configs.no_plugins_no_aux_cmds_config, with_env={"origen_bypass_config_lookup": "1"}) + + pln__python_plugin = "python_plugin" + + cmd_shortcuts__default_plugins = { + "plugin_says_hi": (pln__python_plugin, "plugin_says_hi"), + "echo": (pln__python_plugin, "echo"), + } + + plugins = Plugins() + aux = Aux() + exts = ExtensionDrivers() + exts.init_conflicts(plugins, aux) + + python_plugin = plugins.python_plugin + cmd_testers = aux.namespaces.cmd_testers + cmd_testers_cmd = cmd_testers.cmd_testers + + configs = Configs() + + project_dir = dirs.project_dir + cli_dir = dirs.cli_dir + rust_build_cli_dir = dirs.rust_build_cli_dir + test_apps_dir = dirs.test_apps_dir + plugins_dir = dirs.plugins_dir \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/assertions.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/assertions.py new file mode 100644 index 00000000..a4dd1518 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/assertions.py @@ -0,0 +1,119 @@ +import re +from .dirs import rust_cli_toml +from origen.helpers.regressions.cli.origen import CoreErrorMessages as Errs +from origen_metal.utils.version import from_cargo + +class AssertionHelpers: + @classmethod + def assert_v(cls, out, v_lvl, v_keywords=None): + if v_lvl is not False: + base = r"\[DEBUG\] \(..:..:..\....\): Logger Verbosity:" + if v_lvl is None or v_lvl < 2: + assert re.search(f"{base}", out) is None + else: + assert re.search(f"{base} {v_lvl}", out) is not None + if v_keywords is not False: + if isinstance(v_keywords, str): + v_keywords = [v_keywords] + base = r"\[DEBUG\] \(..:..:..\....\): Setting Verbosity Keywords:" + if v_keywords is None: + if v_lvl is None or v_lvl < 2: + assert re.search(f"{base}", out) is None + else: + assert re.search(rf"{base} \[\]", out) is not None + else: + v_keywords = [f"\"{k}\"" for k in v_keywords] + assert re.search(rf"{base} \[{', '.join(v_keywords)}\]", out) is not None + + assert_verbosity = assert_v + + @classmethod + def assert_invalid_subc_msg(cls, out, subc): + assert Errs.invalid_subc_msg(subc) in out + + @classmethod + def assert_args_required_msg(cls, out, *missing_args): + assert Errs.missing_required_arg(*missing_args) in out + + @classmethod + def assert_missing_arg_msg(cls, out, arg): + assert Errs.missing_required_arg(arg) in out + + @classmethod + def assert_missing_ln_val_msg(cls, out, arg, value_name=None): + assert Errs.missing_ln_val_msg(arg, value_name=value_name) in out + + @classmethod + def assert_invalid_arg_msg(cls, out, arg_or_subc): + assert Errs.unknown_arg_msg(arg_or_subc) in out + + @classmethod + def assert_invalid_ln_msg(cls, out, offender): + assert Errs.unknown_opt_msg(offender, True) in out + + @classmethod + def assert_invalid_sn_msg(cls, out, offender): + assert Errs.unknown_opt_msg(offender, False) in out + + @classmethod + def assert_origen_v(cls, out, version=None, version_only=True, app=None, cli_version=None): + import origen + v = version or origen.__version__ + if app: + if app is True: + a = origen.app.version + else: + a = app + s = "\n".join([ + f"App: {a}", + f"Origen: {v}", + '' + ]) + else: + cli_ver = from_cargo(rust_cli_toml).pep440_str + + s = "\n".join([ + f"Origen: {v}", + f"CLI: {cli_ver}", + '' + ]) + if version_only: + assert s == out + else: + assert s in out + + @classmethod + def assert_no_app_origen_v(cls, out, version=None, version_only=True): + cls.assert_origen_v(out, version=version, app=False, version_only=version_only) + + @classmethod + def assert_core_help(cls, out): + help = cls.HelpMsg(out) + assert help.root_cmd is True + assert "Origen: 2." in help.version_str + help.assert_bare_opts() + + # TODO check order? + assert set(s["name"] for s in help.subcmds) == set(cls.global_cmds.all_names_add_help) + assert help.app_cmd_shortcuts == None + assert help.pl_cmd_shortcuts == { + "do_actions": ("python_plugin", "do_actions"), + "plugin_says_hi": ("python_plugin", "plugin_says_hi"), + "echo": ("python_plugin", "echo"), + "plugin_test_args": ("python_plugin", "plugin_test_args"), + "plugin_test_ext_stacking": ("python_plugin", "plugin_test_ext_stacking"), + } + assert help.aux_cmd_shortcuts == { + "python_no_app_tests": ("cmd_testers", "python_no_app_tests"), + "test_nested_level_1": ("cmd_testers", "test_nested_level_1"), + "test_arguments": ("cmd_testers", "test_arguments"), + "error_cases": ("cmd_testers", "error_cases"), + "say_hi": ("python_no_app_aux_cmds", "say_hi"), + "say_bye": ("python_no_app_aux_cmds", "say_bye"), + } + + @classmethod + def assert_ext_non_ext_cmd_msg(self, out, target, offenders): + offenders = "\n".join([f"\t{o.displayed}" for o in offenders]) + msg = f"Command '{target.full_name}' does not support extensions but an extension was attempted from:\n{offenders}" + assert msg in out \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/auditors.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/auditors.py new file mode 100644 index 00000000..e4597f21 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/auditors.py @@ -0,0 +1,171 @@ +import pytest +from abc import ABC, abstractclassmethod +from . import CLIShared + +class CLIAudit(CLIShared): + @pytest.fixture + def cmd(self): + return self._cmd + +class CmdNamespaceAuditor(CLIAudit, ABC): + @property + @abstractclassmethod + def nspace(self): + raise NotImplemented + + @property + @abstractclassmethod + def nspace_help_offset(cls): + raise NotImplemented + + @property + @abstractclassmethod + def empty_nspace(cls): + raise NotImplemented + + @property + def nspace_subcmds(self): + cmds = list(self.nspace.base_cmd.subcmds.values()) + cmds.insert(self.nspace_help_offset, "help") + return cmds + + @pytest.fixture + def cached_no_subc_help(self): + if not hasattr(self, "_cached_no_subc_help"): + self._cached_no_subc_help = self.nspace.base_cmd.get_help_msg() + return self._cached_no_subc_help + + def test_nspace_help_msg(self, cached_no_subc_help): + help = cached_no_subc_help + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds(*self.nspace_subcmds) + help.assert_not_extendable() + + def test_nspace_help_with_no_subcmds_given(self, cached_no_subc_help): + out = self.nspace.base_cmd.gen_error() + assert out == cached_no_subc_help.text + + def test_nspace_without_subcmds(self): + cmd = self.empty_nspace.base_cmd + help = cmd.get_help_msg() + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds(None) + help.assert_not_extendable() + +class CmdNamespaceContainerAuditor(CmdNamespaceAuditor, ABC): + @property + @abstractclassmethod + def container(self): + raise NotImplemented + + @property + @abstractclassmethod + def container_help_offset(self): + raise NotImplemented + + @abstractclassmethod + def container_nspaces(self): + raise NotImplemented + + @property + def container_subcmds(self): + l = [n.base_cmd for n in self.container_nspaces] + l.insert(self.container_help_offset, "help") + return l + + @classmethod + def setup_class(cls): + cls._cmd = cls.container + + def test_help_msg_with_cmds(self, cmd, cached_help): + help = cached_help + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds(*self.container_subcmds) + help.assert_not_extendable() + help.assert_summary(cmd.help) + + def test_help_with_no_subcmds_given(self, cmd, cached_help): + out = cmd.gen_error() + assert out == cached_help.text + + def test_no_cmds_present(self, cmd): + cmd = self.add_no_pl_aux_cfg(cmd) + help = cmd.get_help_msg() + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds(None) + help.assert_not_extendable() + +class PluginsCmdAudit(CLIShared, ABC): + import origen + if origen.app: + cmd = CLIShared.global_cmds.pls + else: + cmd = CLIShared.in_app_cmds.pls + + @property + @abstractclassmethod + def loaded_plugins(cls): + raise NotImplementedError + + check_pl_list_order = True + + class TestBaseCmd(CLIShared): + def test_help_msg(self, cmd, cached_help): + help = cached_help + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds("help", cmd.list) + help.assert_not_extendable() + help.assert_summary(cmd.help) + + def test_help_on_no_subc(self, cmd, cached_help): + assert cmd.gen_error() == cached_help.text + + class TestListSubc(CLIShared): + def assert_out(self, out, plugins): + if plugins is None: + assert out == "There are no available plugins!\n" + else: + if self.check_pl_list_order: + pls = "\n".join([pl.name for pl in plugins]) + assert out == f"Available plugins:\n\n{pls}\n" + else: + assert out.startswith(f"Available plugins:\n\n") + out = out.split("\n") + print(out) + assert len(out) == 3 + len(plugins) + for pl in plugins: + assert pl.name in out + + def test_help_msg(self, cmd): + help = cmd.get_help_msg() + help.assert_summary(cmd.help) + help.assert_args(None) + help.assert_bare_opts() + help.assert_subcmds(None) + help.assert_not_extendable() + + def test_listing_plugins(self, cmd): + out = cmd.run() + self.assert_out( + out, + self.loaded_plugins + ) + + def test_listing_with_no_plugins(self, cmd): + out = self.add_no_pl_aux_cfg(cmd).run() + self.assert_out(out, None) + + def setup_class(cls): + c = cls.TestBaseCmd + c._cmd = cls.cmd + c.loaded_plugins = cls.loaded_plugins + + c = cls.TestListSubc + c._cmd = cls.cmd.list + c.loaded_plugins = cls.loaded_plugins + c.check_pl_list_order = cls.check_pl_list_order diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/__init__.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/__init__.py new file mode 100644 index 00000000..d63c8ebe --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/__init__.py @@ -0,0 +1,170 @@ +from origen.helpers.regressions import cli + +class Cmd(cli.cmd.Cmd): + def assert_args(self, output, *vals, finalize_ext_args=None): + ext_args = {} + args = [] + exp_ext_vals = {} + cmd_args = [] + if vals[0] is None: + vals = () + + for v in vals: + opts = v[1] if isinstance(v[1], dict) else {} + opts = v[2] if len(v) > 2 else {} + + if isinstance(v[0], CmdExtOpt): + ext = ext_args.setdefault(v[0].src_name, {}) + if opts.get("Before", True): + before = ext.setdefault("Before Cmd", []) + if not (("Before" in opts and opts["Before"] is None) or v[1] is None): + before.append(v[0].name) + if opts.get("After", True): + after = ext.setdefault("After Cmd", []) + if not (("After" in opts and opts["After"] is None) or v[1] is None): + after.append(v[0].name) + if opts.get("CleanUp", True): + clean_up = ext.setdefault("CleanUp Cmd", []) + if not (("CleanUp" in opts and opts["CleanUp"] is None) or v[1] is None): + clean_up.append(v[0].name) + else: + # TODO support args/opts (not extension) with options + if v[1] is not None: + args.append(v[0]) + expected = v[0].to_assert_str(v[1], **opts) + if isinstance(expected, str): + expected = [expected] + + if isinstance(v[0], CmdExtOpt): + vals = exp_ext_vals.setdefault(v[0].src_name, [(v[0], None)]) + if not (v[1] is None and ("Before" not in opts and "After" not in opts and "CleanUp" not in opts)): + if vals[0][1] is None: + exp_ext_vals[v[0].src_name] = [] + vals = exp_ext_vals[v[0].src_name] + vals.append((v[0], expected)) + else: + if v[1] is not None: + cmd_args.append(expected) + if len(cmd_args) == 0: + e = "All Keys: (CMD): []" + print(f"expecting: {e}") + assert e in output + + e = "Arg: (CMD): No args or opts given!" + print(f"expecting: {e}") + assert e in output + else: + for exp in cmd_args: + for e in exp: + print(f"expecting: {e}") + assert e in output + for ns, opt in exp_ext_vals.items(): + if len(opt) == 1 and opt[0][1] is None: + for e in opt[0][0].to_assert_str(None): + print(f"expecting: {e}") + assert e in output + else: + for exp in opt: + for e in exp[1]: + print(f"expecting: {e}") + assert e in output + + actual = Cmd.parse_arg_keys(output) + assert len(actual) == len(args) + actual = Cmd.parse_ext_keys(output) + print(actual) + print(ext_args) + if finalize_ext_args: + finalize_ext_args(ext_args) + assert actual == ext_args + + @classmethod + def parse_arg_keys(cls, cmd_output): + return eval(cmd_output.split("All Keys: (CMD):", 1)[1].split("\n")[0]) + + @classmethod + def parse_ext_keys(cls, cmd_output): + arg_lines = cmd_output.split("All Keys: (Ext) ") + retn = {} + for a in arg_lines[1:]: + a = a.split("\n")[0] + n, keys = a.split(":", 1) + n, phase = n.split(") (") + retn.setdefault(n[1:], {})[phase[0:-1]] = eval(keys) + return retn + +class CmdArgOpt(cli.cmd.CmdArgOpt): + def to_assert_str(self, vals, **opts): + if vals is None: + return f"Arg: (CMD): {self.name}: No args or opts given!" + elif self.multi: + c = list + if self.use_delimiter: + vals = [x for v in vals for x in v.split(',')] + elif isinstance(vals, int): + c = int + else: + c = str + return f"Arg: (CMD): {self.name} ({c}): {vals}" + + def assert_present(self, vals, in_str, **opts): + exp = self.__class__.to_assert_str(self, vals, **opts) + if isinstance(exp, str): + exp = [exp] + for e in exp: + assert e in in_str + +class CmdArg(cli.cmd.CmdArg, CmdArgOpt): + pass + +class CmdOpt(cli.cmd.CmdOpt, CmdArgOpt): + pass + +class CmdExtOpt(cli.cmd.CmdExtOpt, CmdArgOpt): + def to_assert_str(self, vals, **opts): + if isinstance(vals, dict): + opts = vals + preface = f"Arg: (Ext) ({self.src_name})" + + retn = [] + before_val = opts["Before"] if "Before" in opts else vals + after_val = opts["After"] if "After" in opts else vals + cleanup_val = opts["CleanUp"] if "CleanUp" in opts else vals + if not before_val is False: + if before_val is None: + retn.append(f"{preface} (Before Cmd):{CmdArgOpt.to_assert_str(self, before_val).split(':', 3)[3]}") + else: + retn.append(f"{preface} (Before Cmd):{CmdArgOpt.to_assert_str(self, before_val).split(':', 2)[2]}") + if not after_val is False: + if after_val is None: + retn.append(f"{preface} (After Cmd):{CmdArgOpt.to_assert_str(self, after_val).split(':', 3)[3]}") + else: + retn.append(f"{preface} (After Cmd):{CmdArgOpt.to_assert_str(self, after_val).split(':', 2)[2]}") + if not cleanup_val is False: + if cleanup_val is None: + retn.append(f"{preface} (CleanUp Cmd):{CmdArgOpt.to_assert_str(self, cleanup_val).split(':', 3)[3]}") + else: + retn.append(f"{preface} (CleanUp Cmd):{CmdArgOpt.to_assert_str(self, cleanup_val).split(':', 2)[2]}") + return retn + +class SrcBase(cli.CLI): + Cmd = Cmd + + @property + def displayed(self): + return self.src_type.displayed(self.name) + + @property + def base_cmd(self): + if self.src_type == cli.SrcTypes.APP: + return self.app_cmds + else: + return getattr(self, self.name) + + def __getattr__(self, name: str): + try: + return self.__getattribute__(name) + except AttributeError as e: + if name in self.base_cmd.subcmds.keys(): + return self.base_cmd.subcmds[name] + raise(e) diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/auxs.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/auxs.py new file mode 100644 index 00000000..aa896d9e --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/auxs.py @@ -0,0 +1,496 @@ +from pathlib import Path +from origen.helpers.regressions import cli +from . import Cmd, CmdArg, CmdOpt, SrcBase + +aux_cmds_dir = Path(__file__).parent.parent.parent.joinpath("aux_cmds") + +class AuxNS(SrcBase): + @property + def src_type(self): + return cli.SrcTypes.AUX + +class AuxCmdsFromCliDir(AuxNS): + Cmd = Cmd + + def __init__(self): + self.name = "aux_cmds_from_cli_dir" + self.aux_cmds_from_cli_dir = self.aux_cmd( + self.name, + help="Aux Commands from the Origen CLI directory", + subcmds = [ + Cmd("cli_dir_says_hi") + ], + ) + + @property + def base_cmd(self): + return self.aux_cmds_from_cli_dir + +class AddAuxCmds(AuxNS): + Cmd = Cmd + + def __init__(self): + self.name = "add_aux_cmd" + self.add_aux_cmd = self.aux_cmd( + self.name, + help=None, + ) + + @property + def base_cmd(self): + return self.add_aux_cmd + +class CmdTesters(AuxNS): + Cmd = Cmd + + def __init__(self): + self.name = "cmd_testers" + self.cmd_testers = self.aux_cmd( + self.name, + help="Commands to assist in testing aux commands when no app is present", + subcmds=[ + Cmd( + "error_cases", + help="Commands to test error messages and improper command configuration", + subcmds=[ + Cmd( + "missing_impl_dir", + subcmds=[ + Cmd("missing_impl_dir_subc") + ] + ), + Cmd("missing_impl_file"), + Cmd("test_missing_run_function"), + Cmd("test_exception_in_run"), + ] + ), + Cmd("python_no_app_tests", help="Test commands for python-no-app workspace"), + Cmd( + "test_arguments", + help="Test various argument and option schemes from commands", + subcmds=[ + Cmd("display_verbosity_opts"), + Cmd( + "no_args_or_opts", + help="Command taking no arguments or options" + ), + Cmd( + "optional_arg", + help="Command taking a single, optional argument", + args=[CmdArg("single_val", "Single value")], + ), + Cmd( + "required_arg", + help="Command taking a required and optional arg", + args=[ + CmdArg("required_val", "Single required value", required=True), + CmdArg("optional_val", "Single optional value") + ], + ), + Cmd( + "multi_arg", + help="Command taking a multi-arg", + args=[ + CmdArg("multi_arg", "Multi-arg value", True) + ], + ), + Cmd( + "delim_multi_arg", + help="Command taking a delimited multi-arg", + args=[ + CmdArg("delim_m_arg", "Delimited Multi-arg value ('multiple' implied)", True) + ], + ), + Cmd( + "single_and_multi_arg", + help="Command taking a single and multi-arg", + args=[ + CmdArg("single_val", "Single value"), + CmdArg("multi_arg", "Multi-arg value", True) + ], + ), + Cmd( + "args_with_value_names", + help="Single and multi arg with value custom value names", + args=[ + CmdArg("s_arg", "Single value arg with custom value name", value_name="Single Arg Val"), + CmdArg("m_arg", "Multi value arg with custom value name", True, value_name="Multi Arg Val") + ], + ), + Cmd( + "single_value_optional_opt", + help="Command taking optional, single option", + opts=[ + CmdOpt( + name="implicit_single_val", + help='Implicit non-required single value', + takes_value=True, + required=False, + ), + CmdOpt( + name="explicit_single_val", + help='Explicit non-required single value', + takes_value=True, + required=False, + ), + ] + ), + Cmd( + "single_value_required_opt", + help="Command with single-value optional and required options", + opts=[ + CmdOpt( + name="non_req_val", + help="Non-required single value", + takes_value=True, + ), + CmdOpt( + name="req_val", + help="Required single value", + takes_value=True, + required=True, + ), + ] + ), + Cmd( + "multi_opts", + help="Command with multi-value optional and required options", + opts=[ + CmdOpt( + name="m_opt", + help="Opt with multiple values", + multi=True, + ), + CmdOpt( + name="im_m_opt", + help="Opt accepting multiple values were 'takes value' is implied", + multi=True, + ), + CmdOpt( + name="req_m_opt", + help="Required opt accepting multiple values", + multi=True, + required=True, + ), + CmdOpt( + name="d_m_opt", + help="Delimited multi opt", + multi=True, + ), + CmdOpt( + name="d_im_m_opt", + help="Delimited opt where 'multi' and 'takes value' is implied", + multi=True, + ), + ] + ), + Cmd( + "flag_opts", + help="Command with flag-style options only", + opts=[ + CmdOpt( + name="im_f_opt", + help="Stackable flag opt with 'takes value=false' implied", + ), + CmdOpt( + name="ex_f_opt", + help="Stackable flag opt with 'takes value=false' set", + ), + ] + ), + Cmd( + "opts_with_value_names", + help="Command with single/multi-opts with custom value names", + opts=[ + CmdOpt( + name="s_opt_nv_im_tv", + help="Single opt with value name, implying 'takes_value'=true", + value_name="s_val_impl", + ), + CmdOpt( + name="s_opt_nv_ex_tv", + help="Single opt with value name and explicit 'takes_value'=true", + value_name="s_val_expl", + takes_value=True, + ), + CmdOpt( + name="m_opt_named_val", + help="Multi-opt with value name", + value_name="m_val", + multi=True, + ), + CmdOpt( + name="s_opt_ln_nv", + help="Single opt with long name and value name", + value_name="ln_nv", + ), + ] + ), + Cmd( + "opts_with_aliases", + help="Command with option aliasing, custom long, and short names", + opts=[ + CmdOpt( + name="single_opt", + help="Single opt with long/short name", + takes_value=True, + ln="s_opt", + sn="s" + ), + CmdOpt( + name="multi_opt", + help="Multi-opt with long/short name", + takes_value=True, + multi=True, + ln="m_opt", + sn="m" + ), + CmdOpt( + name="occurrence_counter", + help="Flag opt with long/short name", + ln="cnt", + sn="o", + ), + CmdOpt( + name="flag_opt_short_name", + help="Flag opt with short name only", + sn="f" + ), + CmdOpt( + name="flag_opt_long_name", + help="Flag opt with long name only", + ln="ln_f_opt" + ), + CmdOpt( + name="flag_opt_dupl_ln_sn", + help="Flag opt with ln matching another's sn", + ln="f" + ), + CmdOpt( + name="fo_sn_aliases", + help="Flag opt with short aliases", + sn_aliases=['a', 'b'] + ), + CmdOpt( + name="fo_sn_and_aliases", + help="Flag opt with short name and short aliases", + sn="c", + sn_aliases=['d', 'e'] + ), + CmdOpt( + name="fo_ln_aliases", + help="Flag opt with long aliases", + ln_aliases=['fa', 'fb'] + ), + CmdOpt( + name="fo_ln_and_aliases", + help="Flag opt with long name and long aliases", + ln="fc", + ln_aliases=['fd', 'fe'] + ), + CmdOpt( + name="fo_sn_ln_aliases", + help="Flag opt with long and short aliases", + ln_aliases=['sn_ln_1', 'sn_ln_2'], + sn_aliases=['z'], + ), + ] + ), + Cmd( + "hidden_opt", + help="Command with a hidden opt", + opts=[ + CmdOpt( + name="hidden_opt", + help="Hidden opt", + hidden=True, + ), + CmdOpt( + # name="non_hidden_opt", + name="visible_opt", + help="Visible, non-hidden, opt", + ), + ] + ), + ] + ), + Cmd( + "test_nested_level_1", + help="Tests origen.current_command L1", + subcmds=[ + Cmd( + "test_nested_level_2", + help="Tests origen.current_command L2", + subcmds=[ + Cmd("test_nested_level_3_a", help="Tests origen.current_command L3a"), + Cmd("test_nested_level_3_b", help="Tests origen.current_command L3b"), + ] + ) + ] + ), + ] + ) + + @property + def base_cmd(self): + return self.cmd_testers + + @property + def test_args(self): + return self.base_cmd.test_arguments + + @property + def display_v(self): + return self.test_args.display_verbosity_opts + + @property + def error_cases(self): + return self.base_cmd.error_cases + + @property + def subc_l1(self): + return self.base_cmd.test_nested_level_1 + + @property + def subc_l2(self): + return self.subc_l1.test_nested_level_2 + + @property + def subc_l3_a(self): + return self.subc_l2.test_nested_level_3_a + + @property + def subc_l3_b(self): + return self.subc_l2.test_nested_level_3_b + + +class DummyCmds(AuxNS): + Cmd = Cmd + cfg_toml = aux_cmds_dir.joinpath("dummy_cmds_cfg.toml") + + def __init__(self): + self.name = "dummy_cmds" + self.dummy_cmds = self.aux_cmd( + self.name, + subcmds = [ + Cmd( + "dummy_cmd", + help="Dummy Aux Command", + args=[ + CmdArg( + name="action_arg", + help="Dummy Aux Action", + multi=True, + ), + ], + subcmds=[ + Cmd( + "subc", + help="Dummy Aux Subcommand", + args=[ + CmdArg( + name="action_arg", + help="Dummy Aux Subc Action", + multi=True, + ), + ], + opts=[ + CmdOpt( + name="flag_opt", + help="Dummy Aux Subc Flag", + ), + ], + ) + ], + use_configs=[self.cfg_toml] + ) + ] + ) + + @property + def dummy_cmd(self): + return self.dummy_cmds.dummy_cmd + + +class PythonNoAppAuxCmds(AuxNS): + Cmd = Cmd + + def __init__(self): + self.name = "python_no_app_aux_cmds" + self.python_no_app_aux_cmds = self.aux_cmd( + self.name, + subcmds=[ + Cmd("say_bye", help="Say bye!"), + Cmd("say_hi", help="Say hi!"), + ] + ) + + @property + def base_cmd(self): + return self.python_no_app_aux_cmds + +class PythonAppAuxCmds(AuxNS): + Cmd = Cmd + + def __init__(self): + self.name = "python_app_aux_cmds" + self.config_toml = aux_cmds_dir.joinpath(f"{self.name}_cfg.toml") + self.exts_cfg = aux_cmds_dir.joinpath("python_app_exts_cfg.toml") + self.ext_conflicts_cfg = aux_cmds_dir.joinpath("python_app_ext_conflicts_cfg.toml") + self.disabling_app_opts_from_aux = self.aux_sub_cmd( + self.name, + "disabling_app_opts_from_aux", + help="Test disabling standard app opts from plugin commands", + from_config=self.config_toml, + subcmds=[ + Cmd( + "disable_targets_opt", + help="Disable the targets and no-targets opt", + subcmds=[ + Cmd("disable_subc", help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ), + Cmd( + "disable_mode_opt", + help="Disable the mode opt", + subcmds=[ + Cmd("disable_subc",help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ), + Cmd( + "disable_app_opts", + help="Disable all app opts", + subcmds=[ + Cmd("disable_subc",help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ) + ] + ) + + @property + def base_cmd(self): + return self.python_app_aux_cmds + +class EmptyAuxNS(AuxNS): + def __init__(self): + self.name = "empty_aux_ns" + self.config_toml = aux_cmds_dir.joinpath(f"{self.name}_cfg.toml") + self.empty_aux_ns = self.aux_cmd(self.name, help="Aux namespace without any commands defined") + +class AuxNamespaces: + def __init__(self) -> None: + self.dummy_cmds = DummyCmds() + self.cmd_testers = CmdTesters() + self.python_no_app_aux_cmds = PythonNoAppAuxCmds() + self.python_app_aux_cmds = PythonAppAuxCmds() + self.aux_cmds_from_cli_dir = AuxCmdsFromCliDir() + self.add_aux_cmd = AddAuxCmds() + self.empty_aux_ns = EmptyAuxNS() + +class Aux: + namespaces = AuxNamespaces() + ns = namespaces + aux_cmds_dir = aux_cmds_dir \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/exts.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/exts.py new file mode 100644 index 00000000..8cf5885c --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/exts.py @@ -0,0 +1,697 @@ +from origen.helpers.regressions import cli +from . import CmdExtOpt +from .auxs import aux_cmds_dir +from types import SimpleNamespace + +class ExtensionDrivers: + exts_workout_cfg = aux_cmds_dir.joinpath("exts_workout_cfg.toml") + exts_workout_toml = aux_cmds_dir.joinpath("exts_workout.toml") + pl_ext_stacking_from_aux_cfg = aux_cmds_dir.joinpath("pl_ext_stacking_from_aux_cfg.toml") + pl_ext_stacking_from_aux_toml = aux_cmds_dir.joinpath("pl_ext_stacking_from_aux.toml") + core_cmd_exts_cfg = aux_cmds_dir.joinpath("core_cmd_exts_cfg.toml") + core_cmd_exts_toml = aux_cmds_dir.joinpath("core_cmd_exts.toml") + enable_dummy_cmds_exts_env = {"ORIGEN_DUMMY_AUX_CMDS": "1"} + + test_apps_shared_generic_exts = CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "test_apps_shared_ext_action", + help="Action from test_apps_shared_test_helpers plugin", + multi=True, + ), + CmdExtOpt( + "test_apps_shared_ext_flag", + help="Flag from test_apps_shared_test_helpers plugin", + ), + ) + + @classmethod + def partition_exts(cls, exts): + tas = {} + ec = {} + pypl = {} + app = {} + other = [] + for e in exts: + n = e.name + if e.src_name == "test_apps_shared_test_helpers": + tas[n] = e + elif e.src_name == "ext_conflicts": + ec[n] = e + elif e.src_name == "python_plugin": + pypl[n] = e + elif e.src_type == cli.cmd.SrcTypes.APP: + app[n] = e + else: + other.append(e) + + partitioned = SimpleNamespace(**{ + "tas": SimpleNamespace(**tas), + "ec": SimpleNamespace(**ec), + "pypl": SimpleNamespace(**pypl), + "app": SimpleNamespace(**app), + "_other_": other + }) + return partitioned + + exts = { + "origen.eval": { + "global_exts": [ + *CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "ext_action", + multi=True, + help="Action for the extended opt", + ln="action", + ), + ), + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "say_hi_before_eval", + help="Have the plugin say hi before evaluating (global)", + sn="b", + ), + CmdExtOpt( + "say_hi_after_eval", + help="Have the plugin say hi after evaluating (global)", + sn="a", + ), + CmdExtOpt( + "say_hi_during_cleanup", + help="Have the plugin say hi during cleanup", + ), + ), + ] + }, + "plugin.python_plugin.plugin_test_args": { + "exts": CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "flag_extension", + help="Single flag extension", + sn="f", + ln="flag_ext", + ), + CmdExtOpt( + "single_val_opt", + takes_value=True, + sn="s", + help="Extended opt taking a single value", + ), + CmdExtOpt( + "multi_val_opt", + ln="multi", + sn_aliases=["m"], + ln_aliases=["multi_non_delim"], + multi=True, + value_name="MULTI_VAL", + help="Extended opt taking a multiple, non-delimited values", + ), + CmdExtOpt( + "multi_val_delim_opt", + ln_aliases=["multi_delim"], + multi=True, + use_delimiter=True, + help="Extended opt taking a multiple, delimited values", + ), + CmdExtOpt( + "exts_workout_action", + takes_value=True, + required=True, + multi=True, + help="Additional actions for testing purposes", + ), + CmdExtOpt( + "hidden_opt", + hidden=True, + help="Hidden extended opt", + ), + ), + "toml": exts_workout_toml, + }, + "plugin.python_plugin.plugin_test_args.subc": { + "exts": CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "exts_workout_action", + multi=True, + help="Action for the extended opt", + ln="action", + ), + ), + "toml": exts_workout_toml, + }, + "plugin.python_plugin.plugin_test_ext_stacking": { + "exts": [ + *CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "exts_workout_action", + multi=True, + help="Action for the extended opt", + ln="action", + ), + ), + *CmdExtOpt.from_src( + "pl_ext_stacking_from_aux", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "pl_ext_stacking_from_aux_action", + multi=True, + help="Action from pl_ext_stacking aux cmds", + ), + CmdExtOpt( + "pl_ext_stacking_from_aux_flag", + help="Flag from pl_ext_stacking aux cmds", + ), + ), + *CmdExtOpt.from_src( + "python_plugin_the_second", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "python_plugin_the_second_action", + help="Action from pl_the_2nd plugin", + multi=True, + ), + CmdExtOpt( + "python_plugin_the_second_flag", + help="Flag from pl_the_2nd plugin", + ), + ) + ] + }, + "plugin.python_plugin.plugin_test_ext_stacking.subc": { + "exts": [ + *CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "exts_workout_action_subc", + multi=True, + help="Action for the extended opt subc", + ln="action", + ), + ), + *CmdExtOpt.from_src( + "pl_ext_stacking_from_aux", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "pl_ext_stacking_from_aux_action_subc", + multi=True, + help="Action from pl_ext_stacking aux cmds subc", + ), + CmdExtOpt( + "pl_ext_stacking_from_aux_flag_subc", + help="Flag from pl_ext_stacking aux cmds subc", + ), + ), + *CmdExtOpt.from_src( + "python_plugin_the_second", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "python_plugin_the_second_action_subc", + help="Action from pl_the_2nd plugin subc", + multi=True, + ), + CmdExtOpt( + "python_plugin_the_second_flag_subc", + help="Flag from pl_the_2nd plugin subc", + ), + ), + *test_apps_shared_generic_exts + ], + }, + "aux.dummy_cmds.dummy_cmd": { + "exts": [ + *CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "exts_workout_action", + multi=True, + help="Action for the extended opt", + ln="action", + ), + CmdExtOpt( + "exts_workout_flag", + help="Flag for the extended opt", + ), + ), + *CmdExtOpt.from_src( + "pl_ext_stacking_from_aux", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "pl_ext_stacking_from_aux_action", + multi=True, + help="Action from pl_ext_stacking aux cmds", + ), + CmdExtOpt( + "pl_ext_stacking_from_aux_flag", + help="Flag from pl_ext_stacking aux cmds", + ), + ), + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "python_plugin_action", + help="Action from python_plugin", + multi=True, + ), + CmdExtOpt( + "python_plugin_flag", + help="Flag from python_plugin", + ), + ), + *CmdExtOpt.from_src( + "python_plugin_the_second", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "python_plugin_the_second_action", + help="Action from pl_the_2nd plugin", + multi=True, + ), + CmdExtOpt( + "python_plugin_the_second_flag", + help="Flag from pl_the_2nd plugin", + ), + ), + ], + "env": enable_dummy_cmds_exts_env + }, + "aux.dummy_cmds.dummy_cmd.subc": { + "exts": [ + *CmdExtOpt.from_src( + "exts_workout", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "exts_workout_action", + multi=True, + help="Action for the extended opt subc", + ln="action", + ), + CmdExtOpt( + "exts_workout_flag_subc", + help="Flag for the extended opt subc", + ), + ), + *CmdExtOpt.from_src( + "pl_ext_stacking_from_aux", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "pl_ext_stacking_from_aux_action_subc", + multi=True, + help="Action from pl_ext_stacking aux cmds subc", + ), + CmdExtOpt( + "pl_ext_stacking_from_aux_flag_subc", + help="Flag from pl_ext_stacking aux cmds subc", + ), + ), + *CmdExtOpt.from_src( + "python_plugin", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "python_plugin_action_subc", + help="Action from python_plugin subc", + multi=True, + ), + CmdExtOpt( + "python_plugin_flag_subc", + help="Flag from python_plugin subc", + ), + ), + *CmdExtOpt.from_src( + "python_plugin_the_second", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "python_plugin_the_second_action_subc", + help="Action from pl_the_2nd plugin subc", + multi=True, + ), + CmdExtOpt( + "python_plugin_the_second_flag_subc", + help="Flag from pl_the_2nd plugin subc", + ), + ), + ], + "env": enable_dummy_cmds_exts_env + }, + "generic_core_ext": { + "exts": [ + *CmdExtOpt.from_src( + "pl_ext_cmds", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "pl_ext_cmds_generic_ext", + help="Generic ext from pl_ext_cmds plugin", + ), + ), + *CmdExtOpt.from_src( + "core_cmd_exts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "core_cmd_exts_generic_core_ext", + help="Generic core ext from aux commands", + ), + ), + ] + } + } + + ext_conflicts = { + "plugin.python_plugin.plugin_test_args": { + "exts": [ + *CmdExtOpt.from_src( + "ext_conflicts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "single_arg", + help="Conflict with cmd arg", + ), + CmdExtOpt( + "opt_taking_value", + help="Conflict with cmd opt name but long name okay", + ln="otv", + ), + CmdExtOpt( + "conflict_sn", + help="Conflict with cmd opt sn", + ), + CmdExtOpt( + "pl_aux_conflict", + help="plugin-aux conflict (Aux)", + access_with_full_name=True, + ), + CmdExtOpt( + "pl_aux_sn_conflict_aux", + help="plugin-aux conflict (sn) (Aux)", + ), + CmdExtOpt( + "aux_conflict_ln_and_aliases", + help="Conflict with cmd opt ln and some aliases (Aux)", + ln_aliases=["other_alias_aux"], + sn_aliases=["d"], + ), + CmdExtOpt( + "flag", + help="Conflict with inferred long name (Aux)", + access_with_full_name=True, + ), + CmdExtOpt( + "alias", + help="Conflict with inferred long name with aliases (Aux)", + ln_aliases=["alias_aux"], + access_with_full_name=True, + ), + CmdExtOpt( + "subc", + help="Conflict with plugin subcommand" + ), + CmdExtOpt( + "ns_self_conflict", + help="Conflict within the namespace", + ), + CmdExtOpt( + "ext_self_conflict", + help="Ln conflict within the extension", + ), + CmdExtOpt( + "ext_self_conflict_2", + help="Ilna conflicts within the extension", + ln_aliases = ["ext_self_conflict_2_1"], + ), + CmdExtOpt( + "ext_opt_in_ln", + help="Reserved prefix in ln", + ), + CmdExtOpt( + "ext_opt_in_lna", + help="Reserved prefix in lna", + ln_aliases = ["ext_opt_in_lna_2"], + ), + CmdExtOpt( + "same_ln_and_ln_alias", + help="Same ln and lna", + ), + CmdExtOpt( + "same_iln_and_ln_alias", + help="Same inferred ln and lna", + ), + CmdExtOpt( + "repeated_sn_and_aliases", + help="Repeated sna and lna, with sn conflict", + sn="g", + ln_aliases=["repeated_lna", "repeated_lna_2"], + sn_aliases=["e"], + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "pl_aux_conflict", + help="plugin-aux conflict (PL)" + ), + CmdExtOpt( + "pl_aux_sn_conflict_pl", + help="plugin-aux conflict (sn) (PL)", + sn="s", + ), + CmdExtOpt( + "opt_taking_value", + help="Conflict with cmd opt (PL)", + ), + CmdExtOpt( + "pl_conflict_ln_and_aliases", + help="Conflict with cmd opt ln and some aliases (PL)", + ln_aliases=["other_alias_pl"], + sn_aliases=["c"] + ), + CmdExtOpt( + "flag", + help="Conflict with inferred long name (PL)", + access_with_full_name=True, + ), + ) + ], + "env": {"ORIGEN_EXT_CONFLICTS_PL_TEST_ARGS": "1"}, + "cfg": aux_cmds_dir.joinpath("ext_conflicts_cfg.toml"), + }, + "plugin.python_plugin.plugin_test_args.subc": { + "exts": [ + *CmdExtOpt.from_src( + "ext_conflicts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "subc_pl_aux_conflict", + help="plugin-aux conflict (AUX)", + ln_aliases=["aux0"], + sn_aliases=["e"], + ), + CmdExtOpt( + "flag_opt", + help="Conflict with inferred long name (AUX)", + access_with_full_name=True, + ), + CmdExtOpt( + "more_conflicts", + help="More conflicts (AUX)", + access_with_full_name=True, + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "subc_pl_aux_conflict", + help="plugin-aux conflict (PL)", + ln="subc_pl_aux", + sn="c", + ln_aliases=["pl0", "pl1"], + ), + CmdExtOpt( + "flag_opt", + help="Conflict with inferred long name (PL)", + access_with_full_name=True, + ), + CmdExtOpt( + "more_conflicts", + help="More conflicts (PL)", + sn_aliases=["d"], + ), + ) + ], + "env": {"ORIGEN_EXT_CONFLICTS_PL_TEST_ARGS_SUBC": "1"}, + "cfg": aux_cmds_dir.joinpath("ext_conflicts_cfg.toml"), + }, + "origen.eval": { + "exts": [ + *CmdExtOpt.from_src( + "ext_conflicts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "code", + help="Conflict with core cmd arg name from AUX", + access_with_full_name=True, + ) + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "code", + help="Conflict with core cmd arg name from PL", + ) + ), + ], + "env": {"ORIGEN_EXT_CONFLICTS_CORE_CMD_EVAL": "1"}, + "cfg": aux_cmds_dir.joinpath("ext_conflicts_cfg.toml"), + }, + "origen.credentials.clear": { + "exts": [ + *CmdExtOpt.from_src( + "ext_conflicts", + cli.cmd.SrcTypes.AUX, + CmdExtOpt( + "all", + help="Conflict with core cmd opt name. Uses full name", + access_with_full_name=True, + ), + CmdExtOpt( + "cmd_conflicts_aux", + help="Conflict with core cmd opt from AUX", + sn_aliases=["f"], + ), + ), + *CmdExtOpt.from_src( + "test_apps_shared_test_helpers", + cli.cmd.SrcTypes.PLUGIN, + CmdExtOpt( + "all", + help="Conflict with core cmd opt name. Uses full name", + access_with_full_name=True, + ), + CmdExtOpt( + "cmd_conflicts_pl", + help="Conflict with core cmd opt from PL", + ln_aliases=["pl_datasets"], + sn_aliases=["e"], + ), + ) + ], + "env": {"ORIGEN_EXT_CONFLICTS_CORE_CMD_CREDS_CLEAR": "1"}, + "cfg": aux_cmds_dir.joinpath("ext_conflicts_cfg.toml"), + }, + } + + def init_conflicts(self, plugins, aux): + ext_conflicts = self.ext_conflicts + n = "exts_by_ns" + + _cmd_str_ = "plugin.python_plugin.plugin_test_args" + cmd = plugins.python_plugin.plugin_test_args + exts = self.partition_exts(ext_conflicts[_cmd_str_]["exts"]) + ext_conflicts[_cmd_str_][n] = exts + ec_displayed = exts.ec.ns_self_conflict.displayed + ext_conflicts[_cmd_str_]["conflicts_list"] = [ + ["duplicate", exts.tas.pl_aux_conflict, 0], + ["duplicate", exts.ec.ns_self_conflict, 9], + ["duplicate", exts.ec.ext_self_conflict, 11], + ["self_lna_iln", exts.ec.ext_self_conflict_2], + ["reserved_prefix_ln", exts.ec.ext_opt_in_ln, "ext_opt.in_ln"], + ["reserved_prefix_lna", exts.ec.ext_opt_in_lna, "ext_opt.in_lna"], + ["reserved_prefix_opt_name", "ext_opt.reserved_name", ec_displayed], + ["inter_ext_lna_ln", exts.ec.same_ln_and_ln_alias, "same_ln_and_ln_alias"], + ["inter_ext_lna_iln", exts.ec.same_iln_and_ln_alias], + ["inter_ext_sna_sn", exts.ec.repeated_sn_and_aliases, "g"], + ["repeated_sna", exts.ec.repeated_sn_and_aliases, "e", 1], # Purposefully repeated + ["repeated_sna", exts.ec.repeated_sn_and_aliases, "e", 1], + ["repeated_lna", exts.ec.repeated_sn_and_aliases, "repeated_lna", 0], + ["ln", "lna", exts.tas.pl_conflict_ln_and_aliases, cmd.opt_with_aliases, "alias"], + ["sn", "sn", exts.tas.pl_conflict_ln_and_aliases, cmd.sn_only, "n"], + ["lna", "lna", exts.tas.pl_conflict_ln_and_aliases, cmd.opt_with_aliases, "opt_alias"], + ["sna", "sna", exts.tas.pl_conflict_ln_and_aliases, cmd.opt_with_aliases, "a"], + ["sna", "sna", exts.tas.pl_conflict_ln_and_aliases, cmd.opt_with_aliases, "b"], + ["iln", "ln", exts.tas.flag, cmd.flag_opt, "flag"], + ["sn", "sn", exts.ec.conflict_sn, cmd.sn_only, "n"], + ["iln", "iln", exts.ec.pl_aux_conflict, exts.tas.pl_aux_conflict, "pl_aux_conflict"], + ["sn", "sn", exts.ec.pl_aux_sn_conflict_aux, exts.tas.pl_aux_sn_conflict_pl, "s"], + ["ln", "lna", exts.ec.aux_conflict_ln_and_aliases, cmd.opt_with_aliases, "alias"], + ["lna", "lna", exts.ec.aux_conflict_ln_and_aliases, cmd.opt_with_aliases, "opt_alias"], + ["lna", "lna", exts.ec.aux_conflict_ln_and_aliases, exts.tas.pl_conflict_ln_and_aliases, "other_alias_pl"], + ["sna", "sna", exts.ec.aux_conflict_ln_and_aliases, cmd.opt_with_aliases, "a"], + ["sna", "sna", exts.ec.aux_conflict_ln_and_aliases, cmd.opt_with_aliases, "b"], + ["sna", "sna", exts.ec.aux_conflict_ln_and_aliases, exts.tas.pl_conflict_ln_and_aliases, "c"], + ["iln", "ln", exts.ec.flag, cmd.flag_opt, 'flag'], + ["iln", "lna", exts.ec.alias, cmd.opt_with_aliases, 'alias'], + ["ln", "iln", exts.ec.ns_self_conflict, exts.ec.subc, "subc"], + ["sn", "sna", exts.ec.ns_self_conflict, exts.ec.aux_conflict_ln_and_aliases, "d"], + ["ln", "iln", exts.ec.ext_self_conflict, exts.ec.ns_self_conflict, "ns_self_conflict"], + ["lna", "iln", exts.ec.ext_self_conflict_2, exts.ec.ext_self_conflict, "ext_self_conflict"], + ] + + _cmd_str_ = "plugin.python_plugin.plugin_test_args.subc" + cmd = plugins.python_plugin.plugin_test_args.subc + exts = self.partition_exts(ext_conflicts[_cmd_str_]["exts"]) + ext_conflicts[_cmd_str_][n] = exts + ext_conflicts[_cmd_str_]["conflicts_list"] = [ + ["reserved_prefix_opt_name", "ext_opt.subc_reserved", exts.tas.subc_pl_aux_conflict.displayed], + ["inter_ext_sna_sn", exts.tas.subc_pl_aux_conflict, "c"], + ["inter_ext_lna_ln", exts.tas.subc_pl_aux_conflict, "subc_pl_aux"], + ["duplicate", exts.tas.subc_pl_aux_conflict, 1], + ["reserved_prefix_lna", exts.tas.more_conflicts, "ext_opt.subc_lna"], + + ["inter_ext_lna_ln", exts.ec.subc_pl_aux_conflict, "subc_pl_aux"], + ["duplicate", exts.ec.subc_pl_aux_conflict, 0], + ["inter_ext_lna_iln", exts.ec.more_conflicts], + + ["sna", "sna", exts.tas.subc_pl_aux_conflict, cmd.subc_opt_with_aliases, "a"], + ["iln", "iln", exts.tas.flag_opt, cmd.flag_opt], + ["lna", "ln", exts.tas.more_conflicts, exts.tas.subc_pl_aux_conflict, "subc_pl_aux"], + ["lna", "ln", exts.tas.more_conflicts, cmd.subc_opt_with_aliases, "subc_opt"], + ["lna", "lna", exts.tas.more_conflicts, cmd.subc_opt_with_aliases, "subc_opt_alias"], + ["sna", "sn", exts.tas.more_conflicts, cmd.subc_sn_only, "n"], + + ["ln", "ln", exts.ec.subc_pl_aux_conflict, exts.tas.subc_pl_aux_conflict, "subc_pl_aux"], + ["lna", "lna", exts.ec.subc_pl_aux_conflict, exts.tas.subc_pl_aux_conflict, "pl0"], + ["sna", "sna", exts.ec.subc_pl_aux_conflict, cmd.subc_opt_with_aliases, "a"], + ["sna", "sna", exts.ec.subc_pl_aux_conflict, cmd.subc_opt_with_aliases, "b"], + ["iln", "iln", exts.ec.flag_opt, cmd.flag_opt], + ["iln", "iln", exts.ec.more_conflicts, exts.tas.more_conflicts], + ["lna", "ln", exts.ec.more_conflicts, cmd.subc_opt_with_aliases, "subc_opt"], + ["sna", "sna", exts.ec.more_conflicts, exts.tas.more_conflicts, "d"], + ["sna", "sn", exts.ec.more_conflicts, cmd.subc_sn_only, "n"], + ] + + _cmd_str_ = "origen.eval" + ext_conflicts[_cmd_str_]["conflicts_list"] = [ + ["iln", "iln", ext_conflicts[_cmd_str_]["exts"][0], ext_conflicts[_cmd_str_]["exts"][1]] + ] + + _cmd_str_ = "origen.credentials.clear" + cmd = cli.CLI.cmds.creds.clear + exts = self.partition_exts(ext_conflicts[_cmd_str_]["exts"]) + ext_conflicts[_cmd_str_][n] = exts + ext_conflicts[_cmd_str_]["conflicts_list"] = [ + ["iln", "ln", exts.tas.all, cmd.all], + ["ln", "ln", exts.tas.cmd_conflicts_pl, cmd.all, "all"], + ["sn", "sn", exts.tas.cmd_conflicts_pl, cmd.all, "a"], + ["lna", "ln", exts.tas.cmd_conflicts_pl, cmd.datasets, "datasets"], + ["sna", "sn", exts.tas.cmd_conflicts_pl, cmd.datasets, "d"], + ["iln", "ln", exts.ec.all, cmd.all], + ["ln", "ln", exts.ec.cmd_conflicts_aux, cmd.all, "all"], + ["sn", "sn", exts.ec.cmd_conflicts_aux, cmd.all, "a"], + ["lna", "ln", exts.ec.cmd_conflicts_aux, cmd.datasets, "datasets"], + ["lna", "lna", exts.ec.cmd_conflicts_aux, exts.tas.cmd_conflicts_pl, "pl_datasets"], + ["sna", "sn", exts.ec.cmd_conflicts_aux, cmd.datasets, "d"], + ["sna", "sna", exts.ec.cmd_conflicts_aux, exts.tas.cmd_conflicts_pl, "e"], + ] diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/plugins.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/plugins.py new file mode 100644 index 00000000..473550e9 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/cmd_models/plugins.py @@ -0,0 +1,442 @@ +import origen +from origen.helpers.regressions import cli +from . import Cmd, CmdArg, CmdOpt, SrcBase + +class Plugin(SrcBase): + @property + def src_type(self): + return cli.SrcTypes.PLUGIN + +class PlExtCmds(Plugin): + def __init__(self): + self.name = "pl_ext_cmds" + self.pl_ext_cmds = self.pl_cmd( + self.name, + ) + +class PythonPlugin(Plugin): + Cmd = Cmd + + def __init__(self): + self.name = "python_plugin" + subcmds = [ + Cmd( + "do_actions", + help="Perform the given actions", + args=[CmdArg( + name="actions", + help="Actions to perform", + use_delimiter=True, + )], + ), + Cmd( + "echo", + help="Echos the input", + args=[CmdArg( + name="input", + help="Input to echo", + use_delimiter=True, + )], + opts=[CmdOpt( + name="repeat", + help="Echo again (repeat)", + ln="repeat", + sn="r", + )], + ), + Cmd( + "plugin_says_hi", + help="Say 'hi' from the python plugin", + opts=[ + CmdOpt( + name="times", + help="Number of times for the python plugin to say", + value_name="TIMES", + ln="times", + sn="x" + ), + CmdOpt( + name="loudly", + help="LOUDLY say hi", + ln="loudly", + sn="l" + ), + CmdOpt( + name="to", + help="Specify who should be greeted", + multi=True, + ) + ] + ), + Cmd( + "plugin_test_args", + help="Test command for a plugin", + args=[ + CmdArg( + name="single_arg", + help="Single Arg", + ), + CmdArg( + name="multi_arg", + help="Multi Arg", + multi=True, + ), + ], + opts=[ + CmdOpt( + name="opt_taking_value", + help="Opt taking a single value", + ln="opt", + ), + CmdOpt( + name="flag_opt", + help="Flag Opt", + ln="flag", + ), + CmdOpt( + name="sn_only", + help="Opt with short name only", + sn="n", + ), + CmdOpt( + name="opt_with_aliases", + help="Opt with aliases", + ln_aliases=["alias", "opt_alias"], + sn_aliases=["a", "b"], + ) + ], + subcmds=[ + Cmd( + "subc", + help="Test Subcommand for plugin_test_args", + args=[ + CmdArg( + name="single_arg", + help="Single Arg For Subcommand", + ), + ], + opts=[ + CmdOpt( + name="flag_opt", + help="Flag Opt For Subcommand", + ), + CmdOpt( + name="subc_sn_only", + help="Opt with short name only for subc", + sn="n", + ), + CmdOpt( + name="subc_opt_with_aliases", + help="Opt with aliases for subc", + ln="subc_opt", + ln_aliases=["subc_alias", "subc_opt_alias"], + sn_aliases=["a", "b"] + ), + ] + ) + ] + ), + Cmd( + "plugin_test_ext_stacking", + help="Test ext stacking for plugin command", + args=[ + CmdArg( + name="single_arg", + help="Single Arg", + ), + ], + opts=[ + CmdOpt( + name="flag_opt", + help="Flag Opt", + ), + ], + subcmds=[ + Cmd( + "subc", + help="Test Subcommand for ext stacking", + args=[ + CmdArg( + name="single_arg", + help="Single Arg", + ), + ], + opts=[ + CmdOpt( + name="flag_opt", + help="Flag Opt", + ), + ], + ) + ] + ) + ] + if origen.app: + subcmds.insert(0, Cmd( + "disabling_app_opts_from_pl", + help="Test disabling standard app opts from plugin commands" + )) + + self.python_plugin = self.pl_cmd( + self.name, + subcmds=subcmds + ) + + self.disabling_app_opts_from_pl = self.pl_sub_cmd( + self.name, + "disabling_app_opts_from_pl", + help="Test disabling standard app opts from plugin commands", + subcmds=[ + Cmd( + "disable_targets_opt", + help="Disable the targets and no-targets opt", + subcmds=[ + Cmd("disable_subc", help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ), + Cmd( + "disable_mode_opt", + help="Disable the mode opt", + subcmds=[ + Cmd("disable_subc",help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ), + Cmd( + "disable_app_opts", + help="Disable all app opts", + subcmds=[ + Cmd("disable_subc",help="Disables inherited from parent"), + Cmd("override_subc", help="Overrides disable inherited from parent"), + ] + ) + ], + ) + self.intra_cmd_conflicts = self.pl_sub_cmd( + self.name, + "intra_cmd_conflicts", + help="PL cmd with conflicting args and opts within the cmd", + with_env={"ORIGEN_PL_INTRA_CMD_CONFLICTS": "1"}, + **self.intra_cmd_conflicts_args_opts_subcs(), + ) + + @property + def intra_cmd_conflicts_list(self): + if not hasattr(self, "_intra_cmd_conflicts_list"): + self._intra_cmd_conflicts_list = self.get_intra_cmd_conflicts_list(self.intra_cmd_conflicts) + return self._intra_cmd_conflicts_list + + @classmethod + def intra_cmd_conflicts_args_opts_subcs(cls): + return { + "args": [ + CmdArg( + name="arg0", + help="Arg 0", + ), + CmdArg( + name="arg1", + help="Arg 1", + ), + CmdArg( + name="arg2", + help="Arg 2", + ), + ], + "opts": [ + CmdOpt( + name="opt", + help="Opt 0", + ln_aliases=["opt0"] + ), + CmdOpt( + name="arg_clash", + help="Arg-Opt clash in ln/lna (okay)", + ln="arg0", + ln_aliases=["arg1"], + ), + CmdOpt( + name="reserved_prefix_in_ln_lna", + help="Reserved prefix in ln and lna", + ln_aliases=["ext_opt_lna"], + ), + CmdOpt( + name="intra_opt_conflicts", + help="Various intra-opt conflicts", + ln="intra_opt_cons", + sn="c", + ln_aliases=["intra_opt_conflicts", "intra_opt_cons2"], + sn_aliases=["a", "b", "e"] + ), + CmdOpt( + name="inter_opt_conflicts", + help="Various inter-opt conflicts", + sn_aliases=["d"], + ), + CmdOpt( + name="opt0", + help="Inferred long name clash", + ), + ], + "subcmds": [ + Cmd( + "conflicts_subc", + help="Subcommand with conflicts", + args=[ + CmdArg( + name="arg0", + help="Arg 0", + ), + CmdArg( + name="sub_arg_1", + help="Subc Arg 1", + ), + ], + opts=[ + CmdOpt( + name="opt", + help="Opt 0", + ln_aliases=["subc_opt"], + ), + CmdOpt( + name="intra_subc_conflicts", + help="Intra-opt conflicts for subc", + sn="r", + ln="intra_subc_conflicts", + ), + CmdOpt( + name="intra_subc_lna_iln_conflict", + help="Intra-opt iln conflict", + ), + CmdOpt( + name="inter_subc_conflicts", + help="Inter-opt conflicts for subc", + ), + ] + ) + ] + } + + @classmethod + def get_intra_cmd_conflicts_list(self, base_cmd): + return [ + ["duplicate", base_cmd.arg0, 0], + ["duplicate", base_cmd.arg1, 2], + ["reserved_prefix_arg_name", "ext_opt.arg"], + ["duplicate", base_cmd.opt, 0], + ["reserved_prefix_opt_name", "ext_opt.opt", None], + ["reserved_prefix_ln", base_cmd.reserved_prefix_in_ln_lna,"ext_opt.ln"], + ["reserved_prefix_lna", base_cmd.reserved_prefix_in_ln_lna, "ext_opt.lna"], + ["inter_ext_sna_sn", base_cmd.intra_opt_conflicts, "c"], + ["repeated_sna", base_cmd.intra_opt_conflicts, "b", 1], + ["inter_ext_sna_sn", base_cmd.intra_opt_conflicts, "c"], + ["repeated_sna", base_cmd.intra_opt_conflicts, "e", 5], + ["inter_ext_lna_ln", base_cmd.intra_opt_conflicts, "intra_opt_cons"], + ["repeated_lna", base_cmd.intra_opt_conflicts, "intra_opt_cons2", 2], + ["arg_opt_name_conflict", base_cmd.arg0, 0], + [base_cmd.conflicts_subc, "duplicate", base_cmd.conflicts_subc.sub_arg_1, 1], + [base_cmd.conflicts_subc, "reserved_prefix_arg_name", "ext_opt.subc_arg"], + [base_cmd.conflicts_subc, "reserved_prefix_opt_name", "ext_opt.subc_opt", None], + [base_cmd.conflicts_subc, "reserved_prefix_lna", base_cmd.conflicts_subc.opt, "ext_opt.subc_opt_lna"], + [base_cmd.conflicts_subc, "inter_ext_sna_sn", base_cmd.conflicts_subc.intra_subc_conflicts, "r"], + [base_cmd.conflicts_subc, "inter_ext_lna_ln", base_cmd.conflicts_subc.intra_subc_conflicts, "intra_subc_conflicts"], + [base_cmd.conflicts_subc, "inter_ext_lna_iln", base_cmd.conflicts_subc.intra_subc_lna_iln_conflict], + [base_cmd.conflicts_subc, "duplicate", base_cmd.conflicts_subc.intra_subc_conflicts, 2], + ["ln", "lna", base_cmd.inter_opt_conflicts, base_cmd.intra_opt_conflicts, "intra_opt_conflicts"], + ["sn", "sna", base_cmd.inter_opt_conflicts, base_cmd.intra_opt_conflicts, "a"], + ["lna", "ln", base_cmd.inter_opt_conflicts, base_cmd.intra_opt_conflicts, "intra_opt_cons"], + ["lna", "lna", base_cmd.inter_opt_conflicts, base_cmd.reserved_prefix_in_ln_lna, "ext_opt_lna"], + ["lna", "iln", base_cmd.inter_opt_conflicts, base_cmd.reserved_prefix_in_ln_lna, "reserved_prefix_in_ln_lna"], + ["sna", "sna", base_cmd.inter_opt_conflicts, base_cmd.intra_opt_conflicts, "b"], + ["sna", "sn", base_cmd.inter_opt_conflicts, base_cmd.intra_opt_conflicts, "c"], + ["iln", "lna", "opt0", base_cmd.opt], + ["intra_cmd_not_placed", "opt0"], + [base_cmd.conflicts_subc, "ln", "iln", base_cmd.conflicts_subc.inter_subc_conflicts, base_cmd.conflicts_subc.opt, "opt"], + [base_cmd.conflicts_subc, "lna", "ln", base_cmd.conflicts_subc.inter_subc_conflicts, base_cmd.conflicts_subc.intra_subc_conflicts, "intra_subc_conflicts"], + [base_cmd.conflicts_subc, "sna", "sn", base_cmd.conflicts_subc.inter_subc_conflicts, base_cmd.conflicts_subc.intra_subc_conflicts, "r"], + ] + + @property + def base_cmd(self): + return self.python_plugin + + @property + def ordered_subcmds(self): + return [ + self.do_actions, + self.echo, + "help", + self.plugin_says_hi, + self.plugin_test_args, + self.plugin_test_ext_stacking, + ] + +class PythonPluginNoCmds(Plugin): + def __init__(self): + self.name = "python_plugin_no_cmds" + self.python_plugin_no_cmds = self.pl_cmd( + self.name + ) + + @property + def base_cmd(self): + return self.python_plugin_no_cmds + +class PythonPluginTheSecond(Plugin): + def __init__(self): + self.name = "python_plugin_the_second" + self.python_plugin_the_second = self.pl_cmd( + self.name + ) + + @property + def base_cmd(self): + return self.python_plugin_the_second + +class TestAppsSharedTestHelpers(Plugin): + def __init__(self): + self.name = "test_apps_shared_test_helpers" + self.test_apps_shared_test_helpers = self.pl_cmd( + self.name + ) + + @property + def base_cmd(self): + return self.test_apps_shared_test_helpers + +class Plugins: + def __init__(self): + self.plugins = { + "pl_ext_cmds": PlExtCmds(), + "python_plugin": PythonPlugin(), + "python_plugin_no_cmds": PythonPluginNoCmds(), + "python_plugin_the_second": PythonPluginTheSecond(), + "test_apps_shared_test_helpers": TestAppsSharedTestHelpers() + } + + @property + def tas(self): + return self.test_apps_shared_test_helpers + + @property + def py_pl(self): + return self.python_plugin + + @property + def python_no_app_collected_pl_names(self): + return list(self.plugins.keys()) + + @property + def python_no_app_config_pl_names(self): + return [ + 'python_plugin', + 'python_plugin_the_second', + 'python_plugin_no_cmds' + ] + + def __getattr__(self, name): + if name in self.plugins: + return self.plugins[name] + else: + return object.__getattribute__(self, name) diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/empty.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/empty.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/no_plugins_no_aux_cmds.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/no_plugins_no_aux_cmds.toml new file mode 100644 index 00000000..79346f1e --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/no_plugins_no_aux_cmds.toml @@ -0,0 +1,5 @@ +auxillary_commands = [] + +[plugins] +collect = false +load = [] diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/suppress_plugin_collecting.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/suppress_plugin_collecting.toml new file mode 100644 index 00000000..a962ef67 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/configs/suppress_plugin_collecting.toml @@ -0,0 +1,2 @@ +[plugins] +collect = false diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/dirs.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/dirs.py new file mode 100644 index 00000000..d1876049 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/dirs.py @@ -0,0 +1,15 @@ +from pathlib import Path + +project_dir = Path(__file__).parent.parent.parent.parent.parent +o2_root = project_dir +cli_dir = project_dir.joinpath("python/origen/origen/__bin__/bin") + +# Rust Directories +rust_dir = project_dir.joinpath("rust") +rust_origen_dir = rust_dir.joinpath("origen") +rust_cli_dir = rust_origen_dir.joinpath("cli") +rust_cli_toml = rust_cli_dir.joinpath("Cargo.toml") +rust_build_cli_dir = project_dir.joinpath(f"rust/origen/target/debug") + +test_apps_dir = project_dir.joinpath("test_apps") +plugins_dir = test_apps_dir # Currently the same but may change if test_apps dir is re-organized \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/error_cases.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/error_cases.py new file mode 100644 index 00000000..c5ee84b9 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/error_cases.py @@ -0,0 +1,121 @@ +from origen.helpers.regressions.cli import CoreErrorMessages + +class ErrorCases(CoreErrorMessages): + ''' Error cases, messages, and generators too esoteric to be relevant to global origen package''' + + @classmethod + def to_conflict_msg(cls, cmd, conflict): + if not isinstance(conflict[0], str): + cmd = conflict[0] + conflict = conflict[1:] + + type = conflict[0] + def tname(t, cap=False): + if t in ["lna", "repeated_lna"]: + n = "long name alias" + elif t == "ln": + n = "long name" + elif t == "iln": + n = "inferred long name" + elif t in ["sna", "repeated_sna"]: + n = "short name alias" + elif t == "sn": + n = "short name" + else: + raise RuntimeError(f"Cannot get conflict name from conflict type {t}") + if cap: + n = n.capitalize() + return n + + prefix = f"When processing command '{cmd.full_name}':" + if type in ["lna", "ln", "sna", "sn", "iln"]: + with_type = conflict[1] + offender_opt = conflict[2] + with_opt = conflict[3] + if type == "iln": + if not isinstance(offender_opt, str): + c = offender_opt.name + else: + c = offender_opt + else: + c = conflict[4] + if with_opt is None: + with_opt = offender_opt + + if (not isinstance(offender_opt, str)) and offender_opt.is_ext: + if with_opt.is_ext: + msg = f"{tname(type, True)} '{c}' for extension option '{offender_opt.name}', from {offender_opt.displayed}, conflicts with {tname(with_type, False)} for extension '{with_opt.name}' provided by {with_opt.displayed}" + else: + msg = f"{tname(type, True)} '{c}' for extension option '{offender_opt.name}', from {offender_opt.displayed}, conflicts with {tname(with_type, False)} from command option '{with_opt.name}'" + else: + if not isinstance(offender_opt, str): + offender_opt = offender_opt.name + msg = f"{tname(type, True)} '{c}' for command option '{offender_opt}' conflicts with {tname(with_type, False)} from option '{with_opt.name}'" + elif type in ["inter_ext_sna_sn", "inter_ext_lna_ln", "inter_ext_lna_iln"]: + offending_opt = conflict[1] + if type == "inter_ext_sna_sn": + type = "sna" + with_type = "sn" + name = conflict[2] + elif type == "inter_ext_lna_ln": + type = "lna" + with_type = "ln" + name = conflict[2] + elif "inter_ext_lna_iln": + type = "lna" + with_type = "iln" + name = offending_opt.name + if offending_opt.is_ext: + msg = f"Option '{offending_opt.name}' extended from {offending_opt.displayed} specifies {tname(type, False)} '{name}' but it conflicts with the option's {tname(with_type, False)}" + else: + msg = f"Option '{offending_opt.name}' specifies {tname(type, False)} '{name}' but it conflicts with the option's {tname(with_type, False)}" + elif type in ["repeated_sna", "repeated_lna"]: + offending_opt = conflict[1] + if offending_opt.is_ext: + offending_src = f"extended from {conflict[1].displayed} " + else: + offending_src = '' + name = conflict[2] + index = conflict[3] + msg = f"Option '{offending_opt.name}' {offending_src}repeats {tname(type, False)} '{name}' (first occurrence at index {index})" + elif type == "reserved_prefix_arg_name": + offending_arg = conflict[1] + msg = f"Argument '{offending_arg}' uses reserved prefix 'ext_opt'. This option will not be available" + elif type == "reserved_prefix_opt_name": + offending_opt = conflict[1] + offending_src = conflict[2] + if offending_src is None: + msg = f"Option '{offending_opt}' uses reserved prefix 'ext_opt'. This option will not be available" + else: + msg = f"Option '{offending_opt}' extended from {offending_src} uses reserved prefix 'ext_opt'. This option will not be available" + elif type in ["reserved_prefix_ln", "reserved_prefix_lna"]: + offending_opt = conflict[1] + name = conflict[2] + if type == "reserved_prefix_ln": + type = "ln" + elif type == "reserved_prefix_lna": + type = "lna" + if offending_opt.is_ext: + msg = f"Option '{offending_opt.name}' extended from {offending_opt.displayed} uses reserved prefix 'ext_opt' in {tname(type, False)} '{name}' and will not be available as '--{name}'" + else: + msg = f"Option '{offending_opt.name}' uses reserved prefix 'ext_opt' in {tname(type, False)} '{name}' and will not be available as '--{name}'" + elif type == "self_lna_iln": + offending_opt = conflict[1] + msg = f"Option '{offending_opt.name}' extended from {offending_opt.displayed} specifies long name alias '{offending_opt.name}' but it conflicts with the option's inferred long name. If this is intentional, please set this as the option's long name" + elif type == "duplicate": + offending_opt = conflict[1] + index = conflict[2] + if offending_opt.is_ext: + msg = f"Option '{offending_opt.name}' extended from {offending_opt.displayed} is already present. Subsequent occurrences will be skipped (first occurrence at index {index})" + elif offending_opt.is_arg: + msg = f"Argument '{offending_opt.name}' is already present. Subsequent occurrences will be skipped (first occurrence at index {index})" + else: + msg = f"Option '{offending_opt.name}' is already present. Subsequent occurrences will be skipped (first occurrence at index {index})" + elif type == "intra_cmd_not_placed": + msg = f"Unable to place unique long name, short name, or inferred long name for command option '{conflict[1]}'. Please resolve any previous conflicts regarding this option or add/update this option's name, long name, or short name" + elif type == "arg_opt_name_conflict": + msg = f"Option '{conflict[1].name}' conflicts with Arg of the same name (Arg #{conflict[2]})" + else: + raise RuntimeError(f"Unrecognized conflict type {conflict[0]}") + msg = f"{prefix} {msg}" + return msg \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/ext_helpers.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/ext_helpers.py new file mode 100644 index 00000000..70e0b547 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/cli/ext_helpers.py @@ -0,0 +1,108 @@ +import origen + +def extract_args_flag(action): + _, is_cmd, f = action.split("__", 2) + if is_cmd == "cmd": + args = origen.current_command.args + else: + print("Exts:") + print(origen.current_command.exts.keys()) + ext = f.rsplit("_flag", 1)[0] + t = is_cmd.split("_")[0] + args = origen.current_command.exts[f"{t}.{ext}"].args + return (args, f) + +def extract(action): + a, is_cmd, rest = action.split("__", 2) + if is_cmd == "cmd": + args = origen.current_command.args + (name, rest) = rest.split("__", 1) + params = rest.split("__") + else: + t = is_cmd.split("_")[0] + (ext, rest) = rest.split("__", 1) + args = origen.current_command.exts[f"{t}.{ext}"].args + (name, rest) = rest.split("__", 1) + name = f"{ext}_{name}" + params = rest.split("__") + return (a, args, name, params) + +def do_action(actions, phase): + if actions: + for action in actions: + if phase is None: + p_out = 'For' + else: + p_out = phase + print(f"Start Action {p_out} CMD: {action}") + if action.startswith("inc_flag__"): + if phase == "Before": + _, is_cmd, f = action.split("__", 2) + if is_cmd == "cmd": + args = origen.current_command.args + else: + ext = f.rsplit("_flag", 1)[0] + t = is_cmd.split("_")[0] + args = origen.current_command.exts[f"{t}.{ext}"].args + args[f] += 1 + elif action.startswith("set_flag"): + if phase == "Before": + args, f = extract_args_flag(action) + args[f] = -1 + elif action.startswith("inc_multi_arg"): + if phase == "Before": + (_, args, name, params) = extract(action) + args[name] = params + elif action.startswith("set_arg__"): + if phase == "Before": + _, args, arg, vals = extract(action) + args[arg] = vals[0] + elif action == "show_cmd_args": + print(origen.current_command.args) + elif action == "show_ext_args": + print({ext_name: ext.args for ext_name, ext in origen.current_command.exts.items()}) + elif action == "exts_workout__test_updating_args": + if phase == "Before": + args = origen.current_command.exts["aux.exts_workout"].args + # Increment the counter + args["flag_extension"] += 1 + + # Append to a multi-arg + args["multi_val_opt"].append("update_mv_opt") + + # Overwrite an arg + args["single_val_opt"] = "update_sv_opt" + + # Set a new arg + args["new_arg"] = "new_arg_for_ext" + elif action == "display_current_command": + cc = origen.current_command + print(f"Class: {cc.__class__.__name__}") + print(f"Base Cmd: {cc.base_cmd}") + print(f"Sub Cmds: {cc.subcmds}") + print(f"Args: {cc.args}") + print(f"Exts: {dict(cc.exts)}") + elif action == "show_ext_mods": + # TEST_NEEDED CLI check for extension mods + for n, e in origen.current_command.exts.items(): + print(f"{n}: {e.mod}") + elif action == "show_arg_indices": + print(origen.current_command.arg_indices) + elif action == "show_ext_arg_indices": + print({ n: v.arg_indices for n, v in origen.current_command.exts.items() }) + elif action == "no_action": + pass + else: + raise RuntimeError(f"No action '{action}' is known!") + print(f"End Action {p_out} CMD: {action}") + +def get_action_results(output, actions): + retn = {} + for action in actions: + a = {} + r = output.split(f"Start Action Before CMD: {action}")[1].strip() + a["Before"], r = r.split(f"End Action Before CMD: {action}") + r = output.split(f"Start Action After CMD: {action}")[1].strip() + a["After"], r = r.split(f"End Action After CMD: {action}") + retn[action] = a + return retn diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands.toml new file mode 100644 index 00000000..e19d262d --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands.toml @@ -0,0 +1,201 @@ +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking" + + [[extension.opt]] + name = "test_apps_shared_ext_action" + multiple = true + help = "Action from test_apps_shared_test_helpers plugin" + + [[extension.opt]] + name = "test_apps_shared_ext_flag" + help = "Flag from test_apps_shared_test_helpers plugin" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_ext_stacking.subc" + + [[extension.opt]] + name = "test_apps_shared_ext_action" + multiple = true + help = "Action from test_apps_shared_test_helpers plugin" + + [[extension.opt]] + name = "test_apps_shared_ext_flag" + help = "Flag from test_apps_shared_test_helpers plugin" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args" +on_env=["ORIGEN_EXT_CONFLICTS_PL_TEST_ARGS"] + [[extension.opt]] + name = "pl_aux_conflict" + help = "plugin-aux conflict (PL)" + [[extension.opt]] + name = "pl_aux_conflict" + help = "plugin-aux conflict" + long = "duplicate_from_pl" + [[extension.opt]] + name = "pl_aux_sn_conflict_pl" + help = "plugin-aux conflict (sn) (PL)" + short = "s" + [[extension.opt]] + name = "opt_taking_value" + help = "Conflict with cmd opt (PL)" + [[extension.opt]] + name = "pl_conflict_ln_and_aliases" + help = "Conflict with cmd opt ln and some aliases (PL)" + long = "alias" + short = "n" + long_aliases = ["opt_alias", "other_alias_pl"] + short_aliases = ["a", "b", "c"] + [[extension.opt]] + name = "flag" + help = "Conflict with inferred long name (PL)" + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args.subc" +on_env=["ORIGEN_EXT_CONFLICTS_PL_TEST_ARGS_SUBC"] + [[extension.opt]] + name = "ext_opt.subc_reserved" + help = "Reserved Prefix" + [[extension.opt]] + name = "subc_pl_aux_conflict" + help = "plugin-aux conflict (PL)" + long = "subc_pl_aux" + short = "c" + long_aliases = ["pl0", "pl1", "subc_pl_aux"] + short_aliases = ["a", "c"] + [[extension.opt]] + name = "subc_pl_aux_conflict" + help = "plugin-aux conflict" + long = "duplicate_from_pl" + [[extension.opt]] + name = "flag_opt" + help = "Conflict with inferred long name (PL)" + [[extension.opt]] + name = "more_conflicts" + help = "More conflicts (PL)" + long_aliases = ["subc_pl_aux", "subc_opt", "subc_opt_alias", "ext_opt.subc_lna"] + short_aliases = ["d", "n"] + +[[extension]] +extend = "plugin.python_plugin.plugin_test_args" +on_env = ["ORIGEN_APP_PL_CMD_CONFLICTS"] + + [[extension.opt]] + name = "tas_opt" + help = "Opt from TAS" + long = "tas" + short = "z" + long_aliases = ["t_opt"] + short_aliases = ["b", "c"] + + [[extension.opt]] + name = "tas_iln" + help = "ILN from TAS" + +[[extension]] +extend = "origen.eval" +help = "Conflict with core cmd arg" +on_env=["ORIGEN_EXT_CONFLICTS_CORE_CMD_EVAL"] + + [[extension.opt]] + name = "code" + help = "Conflict with core cmd arg name from PL" + +[[extension]] +extend = "origen.credentials.clear" +help = "Conflict with core cmd opt from PL" +on_env=["ORIGEN_EXT_CONFLICTS_CORE_CMD_CREDS_CLEAR"] + + [[extension.opt]] + name = "all" + help = "Conflict with core cmd opt name. Uses full name" + + [[extension.opt]] + name = "cmd_conflicts_pl" + help = "Conflict with core cmd opt from PL" + long = "all" + short = "a" + long_aliases = ["datasets", "pl_datasets"] + short_aliases = ["d", "e"] + +[[extension]] +extend = "app.arg_opt_warmup" +on_env = ["ORIGEN_APP_EXT_ARG_OPT_WARMUP"] + + [[extension.opt]] + name = "tas_single_opt" + help = "Single opt from TAS" + long = "tas_sv" + takes_value = true + + [[extension.opt]] + name = "tas_multi_opt" + help = "Multi opt from TAS" + long = "tas_multi_opt" + multiple = true + long_aliases=["tas_multi", "TAS"] + short_aliases=["a"] + + [[extension.opt]] + name = "tas_hidden" + help = "Hidden opt from TAS" + hidden = true + +[[extension]] +extend = "app.arg_opt_warmup" +on_env = ["ORIGEN_APP_EXT_CONFLICTS_ARG_OPT_WARMUP"] + + [[extension.opt]] + name = "flag_opt" + help = "Conflict with flag opt from TAS" + + [[extension.opt]] + name = "conflicts_from_test_apps_shared" + help = "Some conflicts from Test Apps Shared PL" + long = "TAS" + long_aliases=["hidden", "python_plugin_conflicts", "TAS"] + short_aliases=["m", "a", "b"] + +[[extension]] +extend = "app.nested_app_cmds.nested_l1" +on_env = ["ORIGEN_APP_EXT_NESTED"] + + [[extension.opt]] + name = "tas_multi_opt_shallow" + help = "Multi opt from TAS" + long_aliases = ["tas_m_opt", "tas_shallow"] + multiple = true + + [[extension.opt]] + name = "tas_flag_opt_shallow" + help = "Flag opt from TAS" + long= "tas_f" + short = "f" + +[[extension]] +extend = "app.nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a" +on_env = ["ORIGEN_APP_EXT_NESTED"] + + [[extension.opt]] + name = "tas_multi_opt_deep" + help = "Multi opt from TAS" + long = "tas_opt" + multiple = true + + [[extension.opt]] + name = "tas_flag_opt_deep" + help = "Flag opt from TAS" + +[[extension]] +extend = "origen.target" +on_env = ["ORIGEN_EXT_TARGET_CMD"] + [[extension.opt]] + name = "test_ext" + help = "Test target" + +[[extension]] +extend = "origen.target.view" +on_env = ["ORIGEN_EXT_TARGET_CMD"] + [[extension.opt]] + name = "test_ext" + help = "Test target view" diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/arg_opt_warmup.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/arg_opt_warmup.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/arg_opt_warmup.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/nested_app_cmds.nested_l1.nested_l2_b.nested_l3_a.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/nested_app_cmds.nested_l1.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/nested_app_cmds.nested_l1.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/app/nested_app_cmds.nested_l1.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_args.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_args.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_args.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_args.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_args.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_args.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.subc.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.subc.py new file mode 100644 index 00000000..e8bce0ef --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/commands/extensions/plugin/python_plugin/plugin_test_ext_stacking.subc.py @@ -0,0 +1,6 @@ +from test_apps_shared_test_helpers.cli import apply_ext_output_args +from origen.boot import on_load + +@on_load +def load_ext(mod): + apply_ext_output_args(mod) \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/dut/.keep b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/dut/.keep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/flows/.gitkeep b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/flows/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/interface/interface.py b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/interface/interface.py new file mode 100644 index 00000000..97544bae --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/interface/interface.py @@ -0,0 +1,5 @@ +from origen.interface import BaseInterface + + +class Interface(BaseInterface): + pass \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/origen.plugin.toml b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/origen.plugin.toml new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/patterns/.gitkeep b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/patterns/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/templates/.gitkeep b/test_apps/test_apps_shared_test_helpers/test_apps_shared_test_helpers/templates/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/tests/README.md b/test_apps/test_apps_shared_test_helpers/tests/README.md new file mode 100644 index 00000000..218887c3 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/tests/README.md @@ -0,0 +1,16 @@ +Note that the `tests` folder is the place to create tests to verify the +functionality of this Origen application, it does not refer to silicon +tests! + +This is setup to use a popular Python test framework called `pytest` which +requires that following naming convention is followed: + +* All files containing tests must be named `_test.py`, e.g. `tests/example_test.py` +* Functions that define tests within such files must be named `test_`, + e.g. `def test_example():` + +To execute the tests, run the following command from the command line: + +~~~ +poetry run pytest +~~~ \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/tests/example_test.py b/test_apps/test_apps_shared_test_helpers/tests/example_test.py new file mode 100644 index 00000000..374f68a0 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/tests/example_test.py @@ -0,0 +1,6 @@ +import origen +import pytest +from tests.shared import * + +def test_example(): + assert 1 == 1 \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/tests/shared/__init__.py b/test_apps/test_apps_shared_test_helpers/tests/shared/__init__.py new file mode 100644 index 00000000..5579f7f3 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/tests/shared/__init__.py @@ -0,0 +1,5 @@ +# This is a good place to add helper functions that you want to make +# available to all of your tests + +import pytest +import origen \ No newline at end of file diff --git a/test_apps/test_apps_shared_test_helpers/vendor/.gitkeep b/test_apps/test_apps_shared_test_helpers/vendor/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/web/Makefile b/test_apps/test_apps_shared_test_helpers/web/Makefile new file mode 100644 index 00000000..d0c3cbf1 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/web/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = source +BUILDDIR = build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/test_apps/test_apps_shared_test_helpers/web/make.bat b/test_apps/test_apps_shared_test_helpers/web/make.bat new file mode 100644 index 00000000..9534b018 --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/web/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=source +set BUILDDIR=build + +if "%1" == "" goto help + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/test_apps/test_apps_shared_test_helpers/web/source/_static/.gitkeep b/test_apps/test_apps_shared_test_helpers/web/source/_static/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/test_apps/test_apps_shared_test_helpers/web/source/conf.py b/test_apps/test_apps_shared_test_helpers/web/source/conf.py new file mode 100644 index 00000000..92e0859d --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/web/source/conf.py @@ -0,0 +1,76 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) +import origen +import origen.web + +import sys, os +sys.path.insert(0, os.path.abspath('../../')) + +# -- Project information ----------------------------------------------------- + +project = 'test_apps_shared_test_helpers' +copyright = '2020, Origen Core Team' +author = 'Origen Core Team' + +# The full version, including alpha/beta/rc tags +release = '0.0.0' + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'origen.web.origen_sphinx_extension', 'origen_autoapi.sphinx', + 'sphinx.ext.autodoc', 'sphinx.ext.napoleon', 'sphinx.ext.autosectionlabel', + 'recommonmark', 'origen.web.shorthand' +] + +autosectionlabel_prefix_document = True +autoapi_modules = { + 'test_apps_shared_test_helpers.application': { + 'module-members': ['undoc-members'], + 'class-members': ['members', 'undoc-members'] + } +} +autoapi_output_dir = origen.web.interbuild_dir.joinpath('autoapi') + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +#html_theme_options = { +# 'navbar_links': +# [('Github', 'https://github.com/Origen-SDK/o2/tree/master/example', True)], +# 'logos': [{ +# 'src': '_static/example_logo.png', +# 'alt': 'Example', +# 'rel_src': True, +# }] +#} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] diff --git a/test_apps/test_apps_shared_test_helpers/web/source/index.rst b/test_apps/test_apps_shared_test_helpers/web/source/index.rst new file mode 100644 index 00000000..136694aa --- /dev/null +++ b/test_apps/test_apps_shared_test_helpers/web/source/index.rst @@ -0,0 +1,22 @@ +.. example documentation master file, created by + sphinx-quickstart on Wed Apr 15 21:59:35 2020. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to test_apps_shared_test_helpers's documentation! +=================================== + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + interbuild/autoapi/test_apps_shared_test_helpers.application/test_apps_shared_test_helpers.application + +For information on how to build documentation with Origen, see :link-to:`the documentation guides `. + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search`