# This file is a template, and might need editing before it works on your project.
# Official language image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/python/tags/
image: $CI_DOCKER_REGISTRY/python:3.8

#commands to run in the Docker container before starting each job.
before_script:
  - pip install -e .[dev]

# different stages in the pipeline
stages:
  - Formatter
  - Test
  - AdditionalTests
  - Deploy

formatter:
  stage: Formatter
  script:
    - pip install black
    - black --check --diff --color --line-length=100 ./

pylint:
  stage: Formatter
  script:
    - pip install pylint pylint-exit anybadge
    - pip install -e .[dev]
    - mkdir ./pylint
    - pylint ./ophyd_devices --output-format=text --output=./pylint/pylint.log | tee ./pylint/pylint.log || pylint-exit $?
    - PYLINT_SCORE=$(sed -n 's/^Your code has been rated at \([-0-9.]*\)\/.*/\1/p' ./pylint/pylint.log)
    - anybadge --label=Pylint --file=pylint/pylint.svg --value=$PYLINT_SCORE 2=red 4=orange 8=yellow 10=green
    - echo "Pylint score is $PYLINT_SCORE"
  artifacts:
    paths:
      - ./pylint/
    expire_in: 1 week

pytest:
  stage: Test
  script:
    - pip install coverage
    - coverage run --source=./ophyd_devices -m pytest -v --junitxml=report.xml --random-order --full-trace ./tests
    - coverage report 
    - coverage xml
  coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/'
  artifacts:
    reports:
      junit: report.xml
      cobertura: coverage.xml

tests-3.9:
  stage: AdditionalTests
  image: $CI_DOCKER_REGISTRY/python:3.9
  needs: ["pytest"]
  script:
    - pytest -v --random-order ./tests
  allow_failure: true

tests-3.10:
  extends: "tests-3.9"
  stage: AdditionalTests
  image: $CI_DOCKER_REGISTRY/python:3.10
  allow_failure: true

tests-3.11:
  extends: "tests-3.9"
  stage: AdditionalTests
  image: $CI_DOCKER_REGISTRY/python:3.11
  allow_failure: true
  
semver:
  stage: Deploy
  needs: ["pytest"]
  script:
    - git config --global user.name "ci_update_bot"
    - git config --global user.email "ci_update_bot@bec.ch"
    - git checkout "$CI_COMMIT_REF_NAME"
    - git reset --hard origin/"$CI_COMMIT_REF_NAME"

    # delete all local tags
    - git tag -l | xargs git tag -d
    - git fetch --tags
    - git tag

    # build
    - pip install python-semantic-release==7.* wheel
    - export GL_TOKEN=$CI_UPDATES
    - export REPOSITORY_USERNAME=__token__
    - export REPOSITORY_PASSWORD=$CI_PYPI_TOKEN
    - >
      semantic-release publish -v DEBUG 
      -D version_variable=./setup.py:__version__ 
      -D hvcs=gitlab 
      
  allow_failure: false
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master"'
