/*
 *  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 {
    jcenter()
}

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'
