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

dependencies {
  distTarBall project(path: ":sdks:python", configuration: "distTarBall")
}

task preCommitIT {
  getVersionsAsList('dataflow_precommit_it_task_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:preCommitIT_batch")
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:preCommitIT_streaming")
  }
}

task mongodbioIT {
  getVersionsAsList('dataflow_mongodbio_it_task_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:mongodbioIT")
  }
}

task chicagoTaxiExample {
  getVersionsAsList('dataflow_chicago_taxi_example_task_py_versions').each {
    dependsOn.add("sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:chicagoTaxiExample")
  }
}

task validatesRunnerBatchTests {
  getVersionsAsList('dataflow_validates_runner_batch_tests').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesRunnerBatchTests")
  }
}

task validatesRunnerStreamingTests {
  getVersionsAsList('dataflow_validates_runner_streaming_tests').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesRunnerStreamingTests")
  }
}

task validatesContainerTests {
  getVersionsAsList('python_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesContainer")
  }
}

task validatesDistrolessContainerTests {
  getVersionsAsList('python_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:validatesDistrolessContainer")
  }
}

task examplesPostCommit {
  getVersionsAsList('dataflow_examples_postcommit_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:examples")
  }
}

task gcpCrossLanguagePostCommit {
  getVersionsAsList('cross_language_validates_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:gcpCrossLanguagePythonUsingJava")
  }
}

task ioCrossLanguagePostCommit {
  getVersionsAsList('cross_language_validates_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:ioCrossLanguagePythonUsingJava")
  }
}

task tftTests {
  getVersionsAsList('dataflow_cloudml_benchmark_tests_py_versions').each {
    dependsOn.add(":sdks:python:test-suites:dataflow:py${getVersionSuffix(it)}:tftTests")
  }
}
