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

plugins { id 'org.apache.beam.module' }
applyJavaNature(
  enableChecker: false,
  ignoreRawtypeErrors: true,
  automaticModuleName: 'org.apache.beam.runners.core.construction')

description = "Apache Beam :: Runners :: Core Construction Java"
ext.summary = """Beam Runners Core provides utilities to aid runner authors interact with a Pipeline
prior to execution."""


// Exclude tests that need a runner
test {
  systemProperty "beamUseDummyRunner", "true"
  useJUnit {
    excludeCategories "org.apache.beam.sdk.testing.NeedsRunner"
  }
}

dependencies {
  compile project(path: ":model:pipeline", configuration: "shadow")
  compile project(path: ":model:job-management", configuration: "shadow")
  compile project(path: ":sdks:java:core", configuration: "shadow")
  compile project(path: ":sdks:java:fn-execution")
  compile library.java.vendored_grpc_1_26_0
  compile library.java.vendored_guava_26_0_jre
  compile library.java.classgraph
  compile library.java.jackson_core
  compile library.java.jackson_databind
  compile library.java.joda_time
  compile library.java.slf4j_api
  testCompile library.java.hamcrest_core
  testCompile library.java.hamcrest_library
  testCompile library.java.junit
  testCompile library.java.mockito_core
  testCompile library.java.jackson_annotations
  testCompile library.java.jackson_dataformat_yaml
  testCompile project(path: ":model:fn-execution", configuration: "shadow")
  testCompile project(path: ":sdks:java:core", configuration: "testRuntime")
  testRuntimeOnly library.java.slf4j_jdk14
}
