/*
 * 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.
 */
buildscript {
    repositories {
        mavenCentral()
        maven {
            url 'http://repository.jetbrains.com/all'
        }
        maven {
            url "https://jetbrains.jfrog.io/jetbrains/spek-snapshots"
        }
    }

    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'org.junit.platform:junit-platform-gradle-plugin:1.0.0'
    }
}

plugins {
    id 'com.github.johnrengelman.shadow' version '1.2.4'
    id 'com.github.maiflai.scalatest' version '0.22'
}

shadowJar {
    zip64 true
}

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

apply plugin: 'kotlin'


dependencies {
    compile project(':common')
    compile project(':leader-common')
    compile project(':amaterasu-sdk')
    compile project(':python-dispatcher')
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    compile "org.jetbrains.kotlin:kotlin-reflect"
    compile 'com.uchuhimo:konf:0.11'
}

task copyToHomeBin(type: Copy) {
    dependsOn shadowJar
    from 'build/libs'
    into '../../../build/amaterasu/bin'
}

task copyToHome() {
    dependsOn copyToHomeBin
}