/*
 * 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("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")
  }
}
