diff --git a/.github/actions/poetry-setup/action.yml b/.github/actions/poetry-setup/action.yml new file mode 100644 index 0000000..2095ff1 --- /dev/null +++ b/.github/actions/poetry-setup/action.yml @@ -0,0 +1,54 @@ +name: "Resolve dependencies with Poetry" +description: "Setup Python, install and cache Poetry and resolves dependencies using it." + +inputs: + python-version: + description: "Version of Python to setup" + required: true + poetry-version: + description: "Version of Poetry to install" + default: "1.8.2" + +runs: + using: "composite" + steps: + - name: Setup Pipx Local Variables + id: pipx-env-setup + run: | + SEP="${{ startsWith(runner.os, 'windows-') && '\\' || '/' }}" + PIPX_CACHE="${{ github.workspace }}${SEP}pipx_cache" + echo "pipx-cache-path=${PIPX_CACHE}" >> $GITHUB_OUTPUT + echo "pipx-version=$(pipx --version)" >> $GITHUB_OUTPUT + echo "PIPX_HOME=${PIPX_CACHE}${SEP}home" >> $GITHUB_ENV + echo "PIPX_BIN_DIR=${PIPX_CACHE}${SEP}bin" >> $GITHUB_ENV + echo "PIPX_MAN_DIR=${PIPX_CACHE}${SEP}man" >> $GITHUB_ENV + echo "${PIPX_CACHE}${SEP}bin" >> $GITHUB_PATH + shell: bash + + - name: Load cached Poetry installation + id: cached-poetry + uses: actions/cache@v4 + with: + path: | + ${{ steps.pipx-env-setup.outputs.pipx-cache-path }} + key: poetry-v${{ inputs.poetry-version }}-${{ runner.os }}-Python${{ inputs.python-version }} + + - name: Install Poetry ${{ inputs.poetry-version }} + if: steps.cached-poetry.outputs.cache-hit != 'true' + run: pipx install poetry==${{ inputs.poetry-version }} + shell: bash + + - name: Configure Poetry + run: poetry config virtualenvs.in-project true + shell: bash + + - name: Setup Python ${{ inputs.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ inputs.python-version }} + cache: "poetry" + + - name: Install Poetry dependencies + # Should be cached by the action above + run: poetry install + shell: bash diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 22a4b0f..510e54d 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -33,19 +33,10 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Setup Python - uses: actions/setup-python@v5 + - name: Setup Python ${{ env.PYTHON_VERSION }} and resolve Poetry dependencies + uses: ./.github/actions/poetry-setup with: python-version: ${{ env.PYTHON_VERSION }} - cache: "poetry" - - - name: Install poetry - run: pipx install poetry - - - name: Setup poetry - run: | - poetry config virtualenvs.in-project true - poetry install --without dev - name: Build package run: | diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 97e036c..a749856 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -32,17 +32,12 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Install and configure poetry - run: | - pipx install poetry - poetry config virtualenvs.in-project true - - name: Setup Python - uses: actions/setup-python@v5 + + - name: Setup Python ${{ env.PYTHON_VERSION }} and resolve Poetry dependencies + uses: ./.github/actions/poetry-setup with: python-version: ${{ env.PYTHON_VERSION }} - cache: "poetry" - - name: Setup poetry - run: poetry install + - name: Run tests run: | source .venv/bin/activate @@ -53,27 +48,25 @@ jobs: steps: - name: Checkout uses: actions/checkout@v4 - - name: Install and configure poetry - run: | - pipx install poetry - poetry config virtualenvs.in-project true - - name: Setup Python - uses: actions/setup-python@v5 + + - name: Setup Python ${{ env.PYTHON_VERSION }} and resolve Poetry dependencies + uses: ./.github/actions/poetry-setup with: python-version: ${{ env.PYTHON_VERSION }} - cache: "poetry" - - name: Setup poetry - run: poetry install - - uses: actions/setup-node@v4 + + - name: Setup NodeJS ${{ env.NODE_VERSION }} + uses: actions/setup-node@v4 with: node-version: ${{ env.NODE_VERSION }} cache: "npm" cache-dependency-path: tests/apollo-server/ + - name: Install deps and run server run: | cd tests/apollo-server/ npm ci node src/index.js & + - name: Wait for server run: | for i in {0..10}; do @@ -88,6 +81,7 @@ jobs: exit 1 fi done + - name: Test with pytest run: | source .venv/bin/activate @@ -96,28 +90,23 @@ jobs: lint: runs-on: ubuntu-latest - if: false steps: - name: Checkout uses: actions/checkout@v4 - - name: Install and configure poetry - run: | - pipx install poetry - poetry config virtualenvs.in-project true - - name: Setup Python - uses: actions/setup-python@v5 + + - name: Setup Python ${{ env.PYTHON_VERSION }} and resolve Poetry dependencies + uses: ./.github/actions/poetry-setup with: python-version: ${{ env.PYTHON_VERSION }} - cache: "poetry" - - name: Setup poetry - run: poetry install + - name: Run lint - if: always() + # A few checks are skipped for now because the code can't pass them + # TODO: reactivate them run: | source .venv/bin/activate - isort -m 9 --line-length 160 $MODULE_NAME tests --check-only - pylint $MODULE_NAME tests + isort -m 9 --line-length 160 $MODULE_NAME tests --gitignore --check-only + # pylint $MODULE_NAME tests docformatter --wrap-summaries 160 --wrap-descriptions 160 -cr $MODULE_NAME tests black --check $MODULE_NAME tests mypy -V - mypy $MODULE_NAME tests + # mypy $MODULE_NAME tests diff --git a/clairvoyance/oracle.py b/clairvoyance/oracle.py index d4dc9f6..3d2c8a6 100644 --- a/clairvoyance/oracle.py +++ b/clairvoyance/oracle.py @@ -7,8 +7,8 @@ from clairvoyance import graphql from clairvoyance.entities import GraphQLPrimitive -from clairvoyance.entities.errors import EndpointError from clairvoyance.entities.context import client, config, log +from clairvoyance.entities.errors import EndpointError from clairvoyance.entities.oracle import FuzzingContext from clairvoyance.utils import track