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

repositories {
    mavenCentral()
}

dependencies {
    ext.groovyVersion = '2.5.9'
    ext.asciidocVersion = '2.2.0'
    compile "org.codehaus.groovy:groovy:$groovyVersion"
    compile "org.codehaus.groovy:groovy-dateutil:$groovyVersion"
    compile "org.codehaus.groovy:groovy-json:$groovyVersion"
    compile "org.codehaus.groovy:groovy-templates:$groovyVersion"
    compile("org.asciidoctor:asciidoctorj:$asciidocVersion") {
        // to fix intermittent errors, e.g. as described here:
        // https://github.com/asciidoctor/asciidoctorj/issues/680
        // you might need to use a custom jruby version
        //exclude(group: 'org.jruby', module: 'jruby-complete')
    }
    //compile "org.jruby:jruby-complete:9.1.17.0"
}

compileGroovy.sourceCompatibility = '1.8'
compileGroovy.targetCompatibility = '1.8'
