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

apply plugin: org.apache.beam.gradle.BeamModulePlugin
applyPythonNature()

tasks.register("flinkValidatesRunner") {
  getVersionsAsList('flink_validates_runner_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:flinkValidatesRunner")
  }
}

tasks.register("samzaValidatesRunner") {
  getVersionsAsList('samza_validates_runner_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:samzaValidatesRunner")
  }
}

tasks.register("prismValidatesRunner") {
  getVersionsAsList('prism_validates_runner_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:prismValidatesRunner")
  }
}

tasks.register("flinkValidatesRunnerPrecommit") {
  getVersionsAsList('flink_validates_runner_precommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:flinkValidatesRunner")
  }
}

tasks.register("prismValidatesRunnerPrecommit") {
  getVersionsAsList('prism_validates_runner_precommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:prismValidatesRunner")
  }
}

// TODO merge with above once passing. Currently for convenience.
tasks.register("prismTriggerTranscript") {
  getVersionsAsList('prism_validates_runner_precommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:prismTriggerTranscript")
  }
}

tasks.register("flinkExamplesPostCommit") {
  getVersionsAsList('flink_examples_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:flinkExamples")
  }
}

tasks.register("sparkExamplesPostCommit") {
  getVersionsAsList('spark_examples_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:sparkExamples")
  }
}

tasks.register("prismExamplesPostCommit") {
  getVersionsAsList('prism_examples_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:portable:py${getVersionSuffix(it)}:prismExamples")
  }
}
