# Copyright [2018] Apache Marvin-AI
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

matrix:
  include:
    # Engine Executor
    - language: scala
      scala:
        - 2.12.6
      jdk: oraclejdk8
      cache:
        directories:
        - $HOME/.sbt
        - $HOME/.m2
        - $HOME/.ivy2
      before_cache:
        - find $HOME/.ivy2 -name \"ivydata-*.properties\" -delete
        - find $HOME/.sbt -name \"*.lock\" -delete
      before_script:
        - cd engine-executor
        - unset SBT_OPTS
      script: travis_retry sbt ++$TRAVIS_SCALA_VERSION coverage test coverageReport
    # Python Toolbox
    # Python Toolbox - Linux
    - language: python
      os: linux
      python:
        - 2.7
        - 3.6
      before_install:
        - cd python-toolbox
        - travis_retry curl https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.6.tgz -o ./spark-2.1.1-bin-hadoop2.6.tgz
        - sudo tar -xf ./spark-2.1.1-bin-hadoop2.6.tgz
        - mkdir -p marvin_data
        - mkdir -p marvin_home
        - export MARVIN_HOME=./marvin_home
        - export MARVIN_DATA_PATH=./marvin_data
        - export SPARK_HOME=./spark-2.1.1-bin-hadoop2.6
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py  ; fi
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo python get-pip.py         ; fi
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update                    ; fi
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install openssl graphviz  ; fi
        - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libsasl2-dev python-pip graphviz -y    ; fi
        - travis_retry sudo pip install --upgrade pip
        - travis_retry sudo pip install virtualenvwrapper --ignore-installed six
        - source virtualenvwrapper.sh
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mkvirtualenv marvin-env        ; fi
      install:
        - travis_retry pip install codecov
        - make marvin
      script:
        - marvin test
        - codecov
    # Python Toolbox - OSX
    - language: generic
      os: osx
      before_install:
        - cd python-toolbox
        - travis_retry curl https://d3kbcqa49mib13.cloudfront.net/spark-2.1.1-bin-hadoop2.6.tgz -o ./spark-2.1.1-bin-hadoop2.6.tgz
        - sudo tar -xf ./spark-2.1.1-bin-hadoop2.6.tgz
        - mkdir -p marvin_data
        - mkdir -p marvin_home
        - export MARVIN_HOME=./marvin_home
        - export MARVIN_DATA_PATH=./marvin_data
        - export SPARK_HOME=./spark-2.1.1-bin-hadoop2.6
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py  ; fi
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then sudo python get-pip.py         ; fi
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew update                    ; fi
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then brew install openssl graphviz  ; fi
        - if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libsasl2-dev python-pip graphviz -y    ; fi
        - travis_retry sudo pip install --upgrade pip
        - travis_retry sudo pip install virtualenvwrapper --ignore-installed six
        - source virtualenvwrapper.sh
        - if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then mkvirtualenv marvin-env        ; fi
      install:
        - travis_retry pip install codecov
        - make marvin
      script:
        - marvin test
        - codecov
