/*
 * 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 'executor'
project(':executor')

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')
        }
    }
}