/*
 * 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: 'java'

dependencies {
    compile externalDependency.guava
    compile externalDependency.gson
    compile externalDependency.jasypt
    compile externalDependency.jodaTime
    compile externalDependency.commonsLang3
    compile externalDependency.slf4j
    compile externalDependency.commonsCli
    compile externalDependency.commonsIo
    compile externalDependency.reflections
    compile externalDependency.typesafeConfig
    compile externalDependency.reactivex

    testCompile externalDependency.testng
    testCompile externalDependency.mockito
    testCompile externalDependency.log4j
    testCompile externalDependency.slf4jToLog4j
}

configurations {
    compile {
        transitive = true
    }
}

test {
    workingDir rootProject.rootDir
    beforeTest { testDescriptor ->
       println String.format("%20s STARTED : %s", new Date(), testDescriptor.getClassName())
    }
    afterTest { testDescriptor, testResult ->
       println String.format("%20s FINISHED: %s %s (%7.3g s)",
                          new Date(), testDescriptor.getClassName(), testResult,
                          (testResult.getEndTime() - testResult.getStartTime())/1000.0)
    }
}

ext.classification="library"
