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

jar {
  from {
    configurations.runtime.collect {
      it.isDirectory() ? it : zipTree(it)
    }
  }

  manifest {
    attributes 'Title': 'BigPetStore Data Generator', 'Version': version
    attributes 'Main-Class': 'org.apache.bigtop.datagenerators.bigpetstore.cli.Driver'
  }
}

dependencies {
  compile 'com.google.guava:guava:18.0'
  compile 'com.google.code.gson:gson:2.3'
  compile 'org.apache.commons:commons-lang3:3.4'
  compile project(":bigtop-samplers")
  compile project(":bigtop-name-generator")
  compile project(":bigtop-location-data")

  testCompile 'junit:junit:4.+'
}
