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

description = "Apache Zest™ RDF Library provides commonalities of various RDF based services in Apache Zest™, such as RDF Indexing."

jar { manifest { name = "Apache Zest™ Library - RDF" }}

dependencies {
  compile(project(":org.apache.zest.core:org.apache.zest.core.spi"))
  compile(project(':org.apache.zest.libraries:org.apache.zest.library.constraints'))
  compile(project(":org.apache.zest.libraries:org.apache.zest.library.fileconfig"))
  compile(libraries.sesame)
//  compile("org.openrdf.sesame:sesame-model:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-repository-dataset:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-repository-http:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-rio-n3:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-rio-rdfxml:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-sail-memory:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-sail-nativerdf:$rdfVersion")
//  compile("org.openrdf.sesame:sesame-sail-rdbms:$rdfVersion")

  testCompile(project(":org.apache.zest.core:org.apache.zest.core.testsupport"))
  testCompile project( ':org.apache.zest.extensions:org.apache.zest.extension.valueserialization-orgjson' )

  testRuntime(project(":org.apache.zest.core:org.apache.zest.core.runtime"))
  testRuntime(libraries.logback)
}