/*
 * 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' }
applyPortabilityNature(
    automaticModuleName: 'org.apache.beam.model.job.management',
    shadowJarValidationExcludes: [
        "org/apache/beam/model/expansion/v1/**",
        "org/apache/beam/model/jobmanagement/v1/**",
    ])

description = "Apache Beam :: Model :: Job Management"
ext.summary = "Portable definitions for submitting pipelines."

dependencies {
  // We purposely depend on the unshaded classes for protobuf compilation and
  // export the shaded variant as the actual runtime dependency.
  compile project(path: ":model:pipeline", configuration: "unshaded")
  runtime project(path: ":model:pipeline", configuration: "shadow")
}
