diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 10f5088e..0c6fd695 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java: [8, 11, 17, 18] # todo: update to latest Gradle version for Java 21 support + java: [ 8, 11, 17, 18, 21 ] fail-fast: false max-parallel: 4 name: JDK ${{ matrix.java }} diff --git a/build.gradle b/build.gradle index 56c09ffa..21ebbaaa 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,6 @@ buildscript { } } dependencies { - classpath 'com.github.jengelman.gradle.plugins:shadow:5.2.0' classpath 'biz.aQute.bnd:biz.aQute.bnd.gradle:6.1.0' } } @@ -114,10 +113,10 @@ subprojects { mavenJava(MavenPublication) { from components.java - artifactId = jar.baseName + artifactId = jar.archiveBaseName pom { - name = jar.baseName + name = jar.archiveBaseName description = 'A library to query and verify JSON' url = 'https://github.com/jayway/JsonPath' @@ -149,9 +148,6 @@ subprojects { } wrapper { - gradleVersion = '7.4.2' + gradleVersion = '8.5' } -//Task used by Heroku for staging -task stage(dependsOn: [':json-path-web-test:clean', 'json-path-web-test:jar', 'json-path-web-test:shadowJar']) {} - diff --git a/gradle/binaryCompatibility.gradle b/gradle/binaryCompatibility.gradle deleted file mode 100644 index 57111001..00000000 --- a/gradle/binaryCompatibility.gradle +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright 2003-2014 the original author or authors. - * - * Licensed 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. - */ - -import groovy.text.markup.MarkupTemplateEngine -import groovy.text.markup.TemplateConfiguration - - -buildscript { - // this block should not be necessary, but for some reason it fails without! - repositories { - mavenCentral() - maven { - url "https://plugins.gradle.org/m2/" - } - } - - dependencies { - classpath 'me.champeau.gradle:japicmp-gradle-plugin:0.4.0' - } -} - - -task checkBinaryCompatibility { - description = 'Generates binary compatibility reports' -} - - -if (JavaVersion.current().isJava7Compatible()) { - apply plugin: 'me.champeau.gradle.japicmp' - - - def reportGenerator = { model -> - outputProcessor { - - def skipClass = { c -> c.fullyQualifiedName.startsWith('com.jayway.jsonpath.internal') || c.fullyQualifiedName.contains('$')} - def skipMethod = { c, m -> skipClass(c) || m.name =~ /access\$[0-9]+/ } - def violations = [:].withDefault { - // key = class name - // value = map of violations - [:].withDefault { [] } - } - removedMethod { c, m -> - if (!skipMethod(c, m)) { - def level = m.name.startsWith('super$') ? 'warning' : 'error' - violations[c.fullyQualifiedName][level] << "Method ${m.name} has been removed" - } - } - removedClass { c -> - if (!skipClass(c)) { - violations[c.fullyQualifiedName].error << "Class has been removed" - } - } - modifiedMethod { c, m -> - if (!skipMethod(c, m)) { - violations[c.fullyQualifiedName].warning << """

Method ${m.name} has been modified

-

From

${m.oldMethod.get()?.longName}
to
${m.newMethod.get()?.longName}

""" - } - } - newClass { c -> - if (!skipClass(c)) { - violations[c.fullyQualifiedName].info << "Class has been added" - } - } - newMethod { c, m -> - if (!skipMethod(c, m)) { - violations[c.fullyQualifiedName].info << """

Method ${m.name} has been added

-

Signature:

${m.newMethod.get()?.longName}

""" - } - } - after { - model.violations = violations - } - } - } - -// using a global engine for all tasks in order to increase performance - def configDir = file("$rootDir/gradle") - def templateFile = 'binarycompat-report.groovy' - def templateConfiguration = new TemplateConfiguration() - templateConfiguration.with { - autoIndent = true - autoNewLine = true - } - def engine = new MarkupTemplateEngine(this.class.classLoader, configDir, templateConfiguration) - - - subprojects { - - tasks.register("japicmp", me.champeau.gradle.japicmp.JapicmpTask) { - //task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask) { - dependsOn jar - //baseline = "com.jayway.jsonpath:${project.name}:+@jar" //latest release - baseline = 'com.jayway.jsonpath:json-path:2.0.0@jar' - to = jar.archivePath - accessModifier = 'protected' - onlyModified = true - failOnModification = false - txtOutputFile = file("$buildDir/reports/japi.txt") - - def htmlReportFile = file("${buildDir}/reports/binary-compat-${project.name}.html") - inputs.file file("$configDir/$templateFile") - outputs.file htmlReportFile - - def model = [title : "Binary compatibility report for ${project.name}", - project : project, - baseline: baseline, - archive : to.name] - outputProcessor(reportGenerator.curry(model)) - - doLast { - htmlReportFile.withWriter('utf-8') { wrt -> - engine.createTemplateByPath(templateFile).make(model).writeTo(wrt) - } - } - } - } - - subprojects { - check.dependsOn(checkBinaryCompatibility) - - tasks.register("checkCompatibility", me.champeau.gradle.japicmp.JapicmpTask) { task -> - checkBinaryCompatibility.dependsOn(task) - } - } -} diff --git a/gradle/binarycompat-report.groovy b/gradle/binarycompat-report.groovy deleted file mode 100644 index 9e3e6633..00000000 --- a/gradle/binarycompat-report.groovy +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright 2003-2014 the original author or authors. - * - * Licensed 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. - */ - -/** - * A template which generates an HTML report from the bincompat XML report - */ -modelTypes = { - String title - String baseline - String archive - Map>> violations -} - -def severityMapping = [ - error : 'danger', - warning: 'warning', - info : 'info', - ignore : 'success' -] - -yieldUnescaped '' - - -html { - head { - meta 'charset': "utf-8" - meta 'http-equiv': "content-type", content: "text/html; charset=utf-8" - meta 'http-equiv': "X-UA-Compatible", content: "IE=edge" - meta name: "viewport", content: "width=device-width, initial-scale=1" - - title(title) - link href: "http://maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css", rel: "stylesheet" - link href: "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css", rel: "stylesheet" - link href: "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css", rel: "stylesheet" - } - - body { - div(class:'navbar navbar-inverse navbar-fixed-top', role:'navigation') { - div(class:'container') { - div(class:'navbar-header') { - button(type:'button', class:'navbar-toggle', 'data-toggle':'collapse', 'data-target':'navbar-collaspe') { - span(class:'sr-only', 'Toggle navigation') - span(class:'icon-bar'){} - span(class:'icon-bar'){} - span(class:'icon-bar'){} - } - a(class:'navbar-brand',href:'#', 'Binary compatibility report') - } - div(class:'navbar-collapse collapse') { - ul(class:"nav navbar-nav") { - li(class: 'dropdown') { - a(id: 'severityDropdown', href: '#', class: 'dropdown-toggle', 'data-toggle': 'dropdown', 'Severity ') - ul(class: "dropdown-menu dropdown-severity", role: "menu") { - li(role: 'presentation', class: 'active') { - a(role: 'menuitem', tabindex: '-1', href: '#', 'All levels') - } - li(role: 'presentation') { a(role: 'menuitem', tabindex: '-1', href: '#', 'Error') } - li(role: 'presentation') { a(role: 'menuitem', tabindex: '-1', href: '#', 'Warning') } - li(role: 'presentation') { a(role: 'menuitem', tabindex: '-1', href: '#', 'Info') } - } - } - - } - } - } - } - - - div(class: 'container') { - div(class:'jumbotron') { - div(class:'container') { - div(class: 'page-header') { - h1 'Binary compatibility' - p "Comparing ${archive} to reference ${baseline}" - p { - yield "Be warned that this report is not perfect and depends on what " - a(href: 'https://github.com/siom79/japicmp', 'JApicmp') - yield " is capable to detect." - } - } - } - } - violations.each { fqcn, classViolations -> - def errors = classViolations.keySet() - def severities = errors.collect { "severity-${it}" } - div(class: "panel panel-default ${severities.join(' ')}") { - div(class: "panel-heading") { - h3(class: 'panel-title', "Class $fqcn") - } - div(class: 'panel-body') { - table(class: "table table-striped table-bordered") { - tbody { - classViolations.each { err, list -> - list.each { item -> - tr(class: "bincompat-error severity-${err}") { - td { - h4 { - span(class: "label label-${severityMapping[err]}", err.capitalize()) - } - } - td { span(item) } - } - } - } - } - } - } - } - } - - script(src: "http://code.jquery.com/jquery-1.11.0.min.js") {} - script(src: "http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js") {} - script { - yieldUnescaped ''' -$(document).ready(function () { - var severity = null; - doFilter(); - function doFilter() { - var severityClass = "severity-" + severity; - $('.panel').hide(); - $('.bincompat-error').hide(); - $('.bincompat-error').filter(function () { - return (severity==null || $(this).hasClass(severityClass)); - }).show(); - $('.panel').filter(function () { - return (severity==null || $(this).hasClass(severityClass)); - }).show(); - } - $(".dropdown-severity li a").click(function() { - severity = $(this).text().toLowerCase(); - if (severity==="all levels") { - severity = null; - } - doFilter(); - }); -});''' - } - } - } -} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index aa991fce..a5952066 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/json-path-assert/build.gradle b/json-path-assert/build.gradle index 3c922b32..1cd0f795 100644 --- a/json-path-assert/build.gradle +++ b/json-path-assert/build.gradle @@ -1,7 +1,6 @@ description = "Assertions on Json using JsonPath" jar { - baseName 'json-path-assert' bnd( 'Implementation-Title': 'json-path-assert', 'Implementation-Version': archiveVersion ) diff --git a/json-path/build.gradle b/json-path/build.gradle index ed90337b..0ed3fbf7 100644 --- a/json-path/build.gradle +++ b/json-path/build.gradle @@ -1,7 +1,7 @@ description = "Java port of Stefan Goessner JsonPath." + jar { - baseName 'json-path' bnd( 'Automatic-Module-Name': 'json.path', 'Implementation-Title': 'json-path', 'Implementation-Version': archiveVersion,