name: Code-Analysis

on:
  push:
  workflow_dispatch:
  schedule:
    - cron: '0 5 * * 1'  # Every Monday at 5:00 AM UTC (7:00 AM CEST)

jobs:
  pylint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: "3.11"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install $(find . -name "requirement*" -type f -printf ' -r %p')
        pip install pylint
    - name: Analysing the code with pylint
      run: |
        pylint  -d C0301,R0913,W1202 $(git ls-files '*.py') --ignored-modules "rdkit"  --max-positional-arguments 10
  mypy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: "3.11"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install mypy
        mypy . || exit_code=$?
        mypy --install-types --non-interactive
    - name: Analysing the code with mypy
      run: |
        mypy --ignore-missing-imports --disallow-any-generics --disallow-untyped-defs --no-implicit-optional --disallow-incomplete-defs . 
  pydocstyle:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: "3.11"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pydocstyle
    - name: Analysing the code with pydocstyle
      run: |
        pydocstyle .

  docsig:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: "3.11"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install docsig
    - name: Analysing the code with docsig
      run: |
        docsig --check-class-constructor --check-dunders --check-protected-class-methods --check-nested --check-overridden --check-protected .

  black:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python
      uses: actions/setup-python@v3
      with:
        python-version: "3.11"
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install black[jupyter]
    - name: Analysing the code with black
      run: |
        black --check .

  flake8:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install flake8
      - name: Analysing the code with flake8
        run: |
          flake8 --extend-ignore=D203,E203,E501,W503 .

  interrogate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install interrogate
      - name: Analysing the code with interrogate
        run: |
         interrogate --ignore-overloaded-functions -vv .

  bandit:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install bandit
      - name: Analysing the code with bandit
        run: |
         bandit -r --skip=B404,B603,B602 .

  isort:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python
        uses: actions/setup-python@v3
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install isort
      - name: Analysing the code with isort
        run: |
          isort --profile black --check-only .

  test_basis:
    needs:
        - pylint
        - mypy
        - pydocstyle
        - docsig
        - black
        - flake8
        - interrogate
        - bandit
        - isort
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.10", "3.11", "3.12"]
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v3
        with:
          python-version: ${{ matrix.python-version }}
      - name: Install package
        run: |
          python -m pip install --upgrade pip
          pip install coverage
          pip install .
      - name: Run unit-tests
        run: |
          # Run only the core test suite in the tests directory.
          coverage run --source=molpipeline,tests -m unittest discover tests
          # Create a coverage report. Fail if the coverage is below 85%. Exclude extra packages from the report.
          coverage report --fail-under=85 --omit="*chemprop*","*/*chemprop*/*"

  test_chemprop:
    needs:
      - test_basis
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python 3.11
        uses: actions/setup-python@v3
        with:
          python-version: "3.11"
      - name: Install package
        run: |
          python -m pip install --upgrade pip
          pip install coverage
          pip install torch
          pip install .[chemprop]
      - name: Run unit-tests for chemprop
        run: |
          # Run only the chemprop test suite.
          coverage run --source=molpipeline,tests -m unittest discover test_extras/test_chemprop
          # Create a coverage report. Fail if the coverage is below 85%. Include only chemprop files in the report.
          coverage report --fail-under=85 --include="*chemprop*","*/*chemprop*/*"

  test_notebooks:
    needs:
      - test_basis
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Set up Python 3.11
        uses: actions/setup-python@v3
        with:
          python-version: "3.11"
      - name: Install package
        run: |
          python -m pip install --upgrade pip
          pip install .[notebooks]
      - name: Run unit-tests for notebooks
        run: |
          python test_extras/test_notebooks/test_notebooks.py  --continue-on-failure