/*
 * 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.
 */

// Core
//include 'leader'
//project(':leader')

include 'leader-common'
project(':leader-common')

include 'leader-mesos'
project(':leader-mesos')


include 'leader-yarn'
project(':leader-yarn')

include 'common'
project(':common')

include 'sdk'
findProject(':sdk')?.name = 'amaterasu-sdk'

// Frameworks
// Spark
include 'spark-runtime'
project(':spark-runtime').projectDir=file("frameworks/spark/runtime")
include 'spark-dispatcher'
project(':spark-dispatcher').projectDir=file("frameworks/spark/dispatcher")

// Python
include 'python-dispatcher'
project(':python-dispatcher').projectDir=file("frameworks/python/dispatcher")
include 'pyspark-runtime'
project(':pyspark-runtime').projectDir=file("frameworks/spark/pyspark_runtime")
include 'sdk-python'
project(':sdk-python').projectDir=file("sdk_python")
include 'python-runtime'
project(':python-runtime').projectDir=file("frameworks/python/python_runtime")
include 'python-pandas'
project(':python-pandas').projectDir=file("frameworks/python/pandas_runtime")

include 'jvm-common'
project(':jvm-common').projectDir=file("frameworks/jvm-common")

File spekProject = file("../../kotlin/spek")
if (spekProject.exists()) {
    // Composite build
    includeBuild(spekProject) {
        dependencySubstitution {
            substitute module('org.jetbrains.spek:spek-api') with project(':spek-api')
            substitute module('org.jetbrains.spek:spek-junit-platform-engine') with project(':spek-junit-platform-engine')
        }
    }
}