Repository: nikitastupin/clairvoyance (language: python)

Issue:
[CD] Speed up github actions
 - [x] Cache Poetry itself (potential [solution](https://github.com/pypa/pipx/discussions/1051#discussioncomment-6946826))
 - [x] Replace `npm` with `pnpm` or other fast alternative
 - [x] Cache node packet manager itself
 - [x] Apply other optimizations


Discussion / hints:

Fix patch:
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/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
 


Test patch:
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