/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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.
 */
plugins {
    id 'com.github.johnrengelman.shadow' version '1.2.4'
    id 'scala'
}

sourceCompatibility = 1.8
targetCompatibility = 1.8

shadowJar {
    zip64 true
}

repositories {
    maven {
        url "https://plugins.gradle.org/m2/"
    }
    mavenCentral()
}

configurations {
    provided
    compile.extendsFrom provided
}

dependencies {
    compile 'org.scala-lang:scala-library:2.11.8'
    compile group: 'com.github.nscala-time', name: 'nscala-time_2.11', version: '2.2.0'
    compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.9'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.9'
    compile group: 'com.fasterxml.jackson.core', name: 'jackson-annotations', version: '2.9.4'

    // currently we have to use this specific mesos version to prevent from
    // clashing with spark
    compile('org.apache.mesos:mesos:0.22.2:shaded-protobuf') {
        exclude group: 'com.google.protobuf', module: 'protobuf-java'
    }
    provided group: 'org.apache.hadoop', name: 'hadoop-yarn-client', version: '2.7.3'
    provided group: 'org.apache.hadoop', name: 'hadoop-common', version: '2.7.3'
    provided group: 'org.apache.hadoop', name: 'hadoop-yarn-api', version: '2.7.3'
    provided group: 'org.apache.hadoop', name: 'hadoop-hdfs', version: '2.7.3'

    testCompile "gradle.plugin.com.github.maiflai:gradle-scalatest:0.14"
    testRuntime 'org.pegdown:pegdown:1.1.0'
    testCompile 'junit:junit:4.11'
    testCompile 'org.scalatest:scalatest_2.11:3.0.1'
    testCompile 'org.scala-lang:scala-library:2.11.8'
}

task copyToHome() {
}


