name: Python API Checks

on:
  workflow_dispatch:
  push:
    paths:
      - 'src/bindings/python/**'
      - 'samples/python/**'
      - '.github/workflows/py_checks.yml'
    branches:
      - 'master'
      - 'releases/**'
  pull_request:
    paths:
      - 'src/bindings/python/**'
      - 'samples/python/**'
      - '.github/workflows/py_checks.yml'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

permissions: read-all

jobs:
  linters:
    runs-on: ubuntu-20.04
    if: ${{ github.repository_owner == 'openvinotoolkit' }}
    steps:
      - name: Clone OpenVINO
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
        timeout-minutes: 15

      - name: Setup Python
        uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # v5.3.0
        with:
          python-version: '3.9'

      - name: Install dependencies
        run: python -m pip install -r src/bindings/python/requirements_test.txt

      # samples code-style
      - name: Run flake8 on samples
        run: python -m flake8 ./ --config=setup.cfg
        working-directory: samples/python

      - name: Create code style diff for samples
        if: failure()
        run: |
          python -m black -l 160 -S ./
          git diff > samples_diff.diff
        working-directory: samples/python

      - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
        if: failure()
        with:
          name: samples_diff
          path: samples_diff.diff

      # Python API Flake code-style
      - name: Run flake8 on Python API
        run: python -m flake8 ./src/openvino --config=setup.cfg
        working-directory: src/bindings/python

      - name: Create code style diff for Python API
        if: failure()
        run: |
          python -m black -l 160 -S ./
          git diff > pyopenvino_diff.diff
        working-directory: src/bindings/python/src/openvino

      - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
        if: failure()
        with:
          name: pyopenvino_diff
          path: pyopenvino_diff.diff

      # wheel Flake code-style
      - name: Run flake8 on wheel
        run: python -m flake8 ./ --config=../setup.cfg
        working-directory: src/bindings/python/wheel

      - name: Create code style diff for wheel
        if: failure()
        run: |
          python -m black -l 160 -S ./
          git diff > wheel_diff.diff
        working-directory: src/bindings/python/wheel

      - uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3
        if: failure()
        with:
          name: wheel_diff
          path: wheel_diff.diff

      # Python API tests Flake code-style
      - name: Run flake8 on python tests
        # ignore lack of docs in tests
        run: python -m flake8 tests/ --config=setup.cfg
        working-directory: src/bindings/python

      # Python API mypy check
      - name: Run mypy on Python API
        run: python -m mypy ./src/openvino --config-file ./setup.cfg
        working-directory: src/bindings/python

        # layer_tests Flake code-style
      - name: Run flake8 on python tests in openvino/tests/layer_tests
        run: |
          modified_files=$(git diff --name-only)
          for file in $modified_files; do
            if [[ $file == "openvino/tests/layer_tests/"* ]]; then
              if [[ -f "$file" ]]; then
                python -m flake8 "$file" --config= ./setup.cfg
              fi
            fi
          done