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

dependencies {
  // Example jobs
  // compile project(':gobblin-example')

  // Admin Web Server
  // compile project(':gobblin-admin')

  // Gobblin Azkaban integration
  // compile project(':gobblin-modules:gobblin-azkaban')

  // Source/converters for compliance-related processing
  // compile project(':gobblin-modules:gobblin-compliance')

  // Couchbase writer
  // compile project(':gobblin-modules:gobblin-couchbase')

  // Google ingestion integration: Drive, Analytics, Webmaster
  // compile project(':gobblin-modules:google-ingestion')

  // Kafka integration (source, writer, metrics) -- choose one
  // compile project(':gobblin-modules:gobblin-kafka-08')
  // compile project(':gobblin-modules:gobblin-kafka-09')

  // Gobblin Helix modules
  // compile project(':gobblin-modules:gobblin-helix')
}
