# https://dev.azure.com/home-assistant

trigger:
  batch: true
  branches:
    include:
    - rc
    - dev
    - master
pr:
  - rc
  - dev
  - master

resources:
  containers:
  - container: 36
    image: homeassistant/ci-azure:3.6
  - container: 37
    image: homeassistant/ci-azure:3.7
  repositories:
    - repository: azure
      type: github
      name: 'home-assistant/ci-azure'
      endpoint: 'home-assistant'
variables:
  - name: PythonMain
    value: '36'
  - group: codecov

stages:

- stage: 'Overview'
  jobs:
  - job: 'Lint'
    pool:
      vmImage: 'ubuntu-latest'
    container: $[ variables['PythonMain'] ]
    steps:
    - template: templates/azp-step-cache.yaml@azure
      parameters:
        keyfile: 'requirements_test.txt | homeassistant/package_constraints.txt'
        build: |
          python -m venv venv

          . venv/bin/activate
          pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
          pre-commit install-hooks --config .pre-commit-config-all.yaml
    - script: |
        . venv/bin/activate
        pre-commit run flake8 --all-files
      displayName: 'Run flake8'
    - script: |
        . venv/bin/activate
        pre-commit run bandit --all-files
      displayName: 'Run bandit'
  - job: 'Validate'
    pool:
      vmImage: 'ubuntu-latest'
    container: $[ variables['PythonMain'] ]
    steps:
    - template: templates/azp-step-cache.yaml@azure
      parameters:
        keyfile: 'homeassistant/package_constraints.txt'
        build: |
          python -m venv venv

          . venv/bin/activate
          pip install -e .
    - script: |
        . venv/bin/activate
        python -m script.hassfest validate
      displayName: 'Validate manifests'
    - script: |
        . venv/bin/activate
        ./script/gen_requirements_all.py validate
      displayName: 'requirements_all validate'
  - job: 'CheckFormat'
    pool:
      vmImage: 'ubuntu-latest'
    container: $[ variables['PythonMain'] ]
    steps:
    - template: templates/azp-step-cache.yaml@azure
      parameters:
        keyfile: 'requirements_test.txt | homeassistant/package_constraints.txt'
        build: |
          python -m venv venv

          . venv/bin/activate
          pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
          pre-commit install-hooks --config .pre-commit-config-all.yaml
    - script: |
        . venv/bin/activate
        pre-commit run black --all-files
      displayName: 'Check Black formatting'

- stage: 'Tests'
  dependsOn:
    - 'Overview'
  jobs:
  - job: 'PyTest'
    pool:
      vmImage: 'ubuntu-latest'
    strategy:
      maxParallel: 3
      matrix:
        Python36:
          python.container: '36'
        Python37:
          python.container: '37'
    container: $[ variables['python.container'] ]
    steps:
    - template: templates/azp-step-cache.yaml@azure
      parameters:
        keyfile: 'requirements_test_all.txt | homeassistant/package_constraints.txt'
        build: |
          set -e
          python -m venv venv

          . venv/bin/activate
          pip install -U pip setuptools pytest-azurepipelines pytest-xdist -c homeassistant/package_constraints.txt
          pip install -r requirements_test_all.txt -c homeassistant/package_constraints.txt
          # This is a TEMP. Eventually we should make sure our 4 dependencies drop typing.
          # Find offending deps with `pipdeptree -r -p typing`
          pip uninstall -y typing
    - script: |
        . venv/bin/activate
        pip install -e .
      displayName: 'Install Home Assistant'
    - script: |
        set -e

        . venv/bin/activate
        pytest --timeout=9 --durations=10 -n auto --dist=loadfile -qq -o console_output_style=count -p no:sugar tests
        script/check_dirty
      displayName: 'Run pytest for python $(python.container)'
      condition: and(succeeded(), ne(variables['python.container'], variables['PythonMain']))
    - script: |
        set -e

        . venv/bin/activate
        pytest --timeout=9 --durations=10 -n auto --dist=loadfile --cov homeassistant --cov-report html -qq -o console_output_style=count -p no:sugar tests
        codecov --token $(codecovToken)
        script/check_dirty
      displayName: 'Run pytest for python $(python.container) / coverage'
      condition: and(succeeded(), eq(variables['python.container'], variables['PythonMain']))

- stage: 'FullCheck'
  dependsOn:
    - 'Overview'
  jobs:
  - job: 'Pylint'
    pool:
      vmImage: 'ubuntu-latest'
    container: $[ variables['PythonMain'] ]
    steps:
    - template: templates/azp-step-cache.yaml@azure
      parameters:
        keyfile: 'requirements_all.txt | requirements_test.txt | homeassistant/package_constraints.txt'
        build: |
          set -e
          python -m venv venv

          . venv/bin/activate
          pip install -U pip setuptools wheel
          pip install -r requirements_all.txt -c homeassistant/package_constraints.txt
          pip install -r requirements_test.txt -c homeassistant/package_constraints.txt
    - script: |
        . venv/bin/activate
        pip install -e .
      displayName: 'Install Home Assistant'
    - script: |
        . venv/bin/activate
        pylint homeassistant
      displayName: 'Run pylint'
  - job: 'Mypy'
    pool:
      vmImage: 'ubuntu-latest'
    container: $[ variables['PythonMain'] ]
    steps:
    - template: templates/azp-step-cache.yaml@azure
      parameters:
        keyfile: 'requirements_test.txt | setup.py | homeassistant/package_constraints.txt'
        build: |
          python -m venv venv

          . venv/bin/activate
          pip install -e . -r requirements_test.txt -c homeassistant/package_constraints.txt
          pre-commit install-hooks --config .pre-commit-config-all.yaml
    - script: |
        . venv/bin/activate
        pre-commit run --config .pre-commit-config-all.yaml mypy --all-files
      displayName: 'Run mypy'