From a8530271b0207ea5f9ca16cfd92bc9f8f8758c79 Mon Sep 17 00:00:00 2001 From: Rob Spieldenner Date: Tue, 29 Nov 2016 10:13:13 -0800 Subject: [PATCH 1/3] Progress test utilities --- README.md | 4 +- .../GradleDependencyGenerator.groovy | 6 +++ .../test/dependencies/ivy/Descriptor.groovy | 7 +++ .../test/dependencies/maven/Artifact.groovy | 23 ++++++++++ .../nebula/test/dependencies/maven/Pom.groovy | 45 +++++++++++++++++++ .../dependencies/repositories/IvyRepo.groovy | 19 ++++++++ .../repositories/MavenRepo.groovy | 22 +++++++++ .../GradleDependencyGeneratorSpec.groovy | 26 +++++++++++ 8 files changed, 150 insertions(+), 2 deletions(-) create mode 100644 src/main/groovy/nebula/test/dependencies/ivy/Descriptor.groovy create mode 100644 src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy create mode 100644 src/main/groovy/nebula/test/dependencies/maven/Pom.groovy create mode 100644 src/main/groovy/nebula/test/dependencies/repositories/IvyRepo.groovy create mode 100644 src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy diff --git a/README.md b/README.md index 17de824..7af9b78 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,12 @@ Gradle Compatibility Tested | 2.5 | no | | 2.6 | yes - must force to 'org.spockframework:spock-core:1.0-groovy-2.3' | | 2.7 | yes - must force to 'org.spockframework:spock-core:1.0-groovy-2.3' | -| 2.8-rc-1 | yes | +| 2.8 | yes | LICENSE ======= -Copyright 2014-2015 Netflix, Inc. +Copyright 2014-2016 Netflix, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy b/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy index 54074bc..968cb9e 100644 --- a/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy +++ b/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy @@ -92,6 +92,12 @@ class GradleDependencyGenerator { ivyRepoDir } + File generateTestIvyRepo(String status) { + runTasks('publishIvyPublicationToIvyRepository', "-Pstatus=${status}") + + ivyRepoDir + } + String getIvyRepoDirPath() { ivyRepoDir.absolutePath } diff --git a/src/main/groovy/nebula/test/dependencies/ivy/Descriptor.groovy b/src/main/groovy/nebula/test/dependencies/ivy/Descriptor.groovy new file mode 100644 index 0000000..c1c149c --- /dev/null +++ b/src/main/groovy/nebula/test/dependencies/ivy/Descriptor.groovy @@ -0,0 +1,7 @@ +package nebula.test.dependencies.ivy + +/** + * Created by rspieldenner on 11/14/16. + */ +class Descriptor { +} diff --git a/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy b/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy new file mode 100644 index 0000000..f6663dd --- /dev/null +++ b/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy @@ -0,0 +1,23 @@ +/* + * Copyright 2016 Netflix, Inc. + * + * 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. + */ +package nebula.test.dependencies.maven + + +class Artifact { + String group + String artifact + String version +} diff --git a/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy b/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy new file mode 100644 index 0000000..1f20cfb --- /dev/null +++ b/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy @@ -0,0 +1,45 @@ +/* + * Copyright 2016 Netflix, Inc. + * + * 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. + */ +package nebula.test.dependencies.maven + +class Pom { + String group + String artifact + String version + + Set dependencies + Set dependencyManagementArtifacts + + Pom addDependency(Artifact artifact) { + dependencies.add(artifact) + } + + Pom addDependency(String group, String name, String version) { + dependencies.add(new Artifact(group, name, version)) + } + + Pom addManagementDependency(Artifact artifact) { + dependencyManagementArtifacts.add(artifact) + } + + Pom addManagementDependency(String group, String name, String version) { + dependencyManagementArtifacts.add(new Artifact(group, name, version)) + } + + String generate() { + + } +} diff --git a/src/main/groovy/nebula/test/dependencies/repositories/IvyRepo.groovy b/src/main/groovy/nebula/test/dependencies/repositories/IvyRepo.groovy new file mode 100644 index 0000000..5560e94 --- /dev/null +++ b/src/main/groovy/nebula/test/dependencies/repositories/IvyRepo.groovy @@ -0,0 +1,19 @@ +/* + * Copyright 2016 Netflix, Inc. + * + * 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. + */ +package nebula.test.dependencies.repositories + +class IvyRepo { +} diff --git a/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy b/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy new file mode 100644 index 0000000..33f3499 --- /dev/null +++ b/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy @@ -0,0 +1,22 @@ +/* + * Copyright 2016 Netflix, Inc. + * + * 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. + */ +package nebula.test.dependencies.repositories + +/** + * Created by rspieldenner on 11/14/16. + */ +class MavenRepo { +} diff --git a/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy b/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy index 5db97c6..4819797 100644 --- a/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy +++ b/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy @@ -61,6 +61,32 @@ class GradleDependencyGeneratorSpec extends Specification { new File(ivyRepo, 'test/ivy/foo/1.0.0/foo-1.0.0.jar').exists() } + def 'check ivy status'() { + def directory = 'build/testdependencies/ivyxml' + def graph = ['test.ivy:foo:1.0.0'] + def generator = new GradleDependencyGenerator(new DependencyGraph(graph), directory) + + when: + generator.generateTestIvyRepo() + + then: + def repo = new File(directory) + new File(repo, 'ivyrepo/test/ivy/foo/1.0.0/foo-1.0.0-ivy.xml').text.contains 'status="integration"' + } + + def 'allow different ivy status'() { + def directory = 'build/testdependencies/ivyxml' + def graph = ['test.ivy:foo:1.0.0'] + def generator = new GradleDependencyGenerator(new DependencyGraph(graph), directory) + + when: + generator.generateTestIvyRepo('release') + + then: + def repo = new File(directory) + new File(repo, 'ivyrepo/test/ivy/foo/1.0.0/foo-1.0.0-ivy.xml').text.contains 'status="release"' + } + def 'check ivy xml'() { def directory = 'build/testdependencies/ivyxml' def graph = ['test.ivy:foo:1.0.0 -> test.ivy:bar:1.1.0'] From dabe015060ed7d84a2a3b674895b9d31e217dbef Mon Sep 17 00:00:00 2001 From: Rob Spieldenner Date: Tue, 6 Dec 2016 15:39:36 -0800 Subject: [PATCH 2/3] Generate maven boms --- gradle/wrapper/gradle-wrapper.jar | Bin 53324 -> 54224 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 23 +++-- gradlew.bat | 6 -- .../test/dependencies/maven/Artifact.groovy | 11 +++ .../dependencies/maven/ArtifactType.groovy | 27 ++++++ .../nebula/test/dependencies/maven/Pom.groovy | 66 ++++++++++++-- .../repositories/MavenRepo.groovy | 25 +++++- .../test/dependencies/maven/PomSpec.groovy | 82 ++++++++++++++++++ .../repositories/MavenRepoSpec.groovy | 25 ++++++ 10 files changed, 245 insertions(+), 24 deletions(-) create mode 100644 src/main/groovy/nebula/test/dependencies/maven/ArtifactType.groovy create mode 100644 src/test/groovy/nebula/test/dependencies/maven/PomSpec.groovy create mode 100644 src/test/groovy/nebula/test/dependencies/repositories/MavenRepoSpec.groovy diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 3baa851b28c65f87dd36a6748e1a85cf360c1301..d6e2637affb74a80bfbe87bd2da57e81b2f3c661 100644 GIT binary patch delta 21179 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6c5566e..7ae94c1 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Aug 16 14:44:48 PDT 2016 +#Mon Nov 14 15:10:56 PST 2016 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-3.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-bin.zip diff --git a/gradlew b/gradlew index 27309d9..4ef3a87 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -154,11 +154,18 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") -} -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +# Escape application args +for s in "${@}" ; do + s=\"$s\" + APP_ARGS=$APP_ARGS" "$s +done + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- "$DEFAULT_JVM_OPTS" "$JAVA_OPTS" "$GRADLE_OPTS" "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f6d5974..e95643d 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -49,7 +49,6 @@ goto fail @rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line diff --git a/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy b/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy index f6663dd..00bc0df 100644 --- a/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy +++ b/src/main/groovy/nebula/test/dependencies/maven/Artifact.groovy @@ -15,9 +15,20 @@ */ package nebula.test.dependencies.maven +import groovy.transform.Canonical +import groovy.transform.Sortable +@Canonical +@Sortable class Artifact { String group String artifact String version + ArtifactType type = ArtifactType.JAR + + Artifact(String group, String artifact, String version) { + this.group = group + this.artifact = artifact + this.version = version + } } diff --git a/src/main/groovy/nebula/test/dependencies/maven/ArtifactType.groovy b/src/main/groovy/nebula/test/dependencies/maven/ArtifactType.groovy new file mode 100644 index 0000000..91ad226 --- /dev/null +++ b/src/main/groovy/nebula/test/dependencies/maven/ArtifactType.groovy @@ -0,0 +1,27 @@ +/* + * Copyright 2016 Netflix, Inc. + * + * 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. + */ +package nebula.test.dependencies.maven + +enum ArtifactType { + POM('pom'), + JAR('jar') + + ArtifactType(String packaging) { + this.packaging = packaging + } + + String packaging +} diff --git a/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy b/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy index 1f20cfb..d315a53 100644 --- a/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy +++ b/src/main/groovy/nebula/test/dependencies/maven/Pom.groovy @@ -15,31 +15,87 @@ */ package nebula.test.dependencies.maven +import groovy.xml.MarkupBuilder + class Pom { - String group - String artifact - String version + Artifact artifact + Set dependencies = new TreeSet<>() + Set dependencyManagementArtifacts = new TreeSet<>() - Set dependencies - Set dependencyManagementArtifacts + Pom(String group, String artifact, String version) { + this.artifact = new Artifact(group, artifact, version) + } + + Pom(String group, String artifact, String version, ArtifactType type) { + this(group, artifact, version) + this.artifact.type = type + } Pom addDependency(Artifact artifact) { dependencies.add(artifact) + + this } Pom addDependency(String group, String name, String version) { dependencies.add(new Artifact(group, name, version)) + + this } Pom addManagementDependency(Artifact artifact) { dependencyManagementArtifacts.add(artifact) + + this } Pom addManagementDependency(String group, String name, String version) { dependencyManagementArtifacts.add(new Artifact(group, name, version)) + + this + } + + String getFilename() { + "${artifact.artifact}-${artifact.version}.pom" } String generate() { + def writer = new StringWriter() + def pom = new MarkupBuilder(writer) + pom.setDoubleQuotes(true) + pom.mkp.xmlDeclaration(version: '1.0', encoding: 'UTF-8') + pom.project('xsi:schemaLocation' : 'http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd', 'xmlns' : 'http://maven.apache.org/POM/4.0.0', 'xmlns:xsi' : 'http://www.w3.org/2001/XMLSchema-instance') { + modelVersion('4.0.0') + groupId(artifact.group) + artifactId(artifact.artifact) + version(artifact.version) + if (artifact.type != ArtifactType.JAR) { + packaging(artifact.type.packaging) + } + if (dependencyManagementArtifacts) { + dependencyManagement { + dependencyManagementArtifacts.each { Artifact a -> + dependency { + groupId(a.group) + artifactId(a.artifact) + version(a.version) + } + } + } + } + if (dependencies) { + dependencies { + dependencies.each { Artifact a -> + dependency { + groupId(a.group) + artifactId(a.artifact) + version(a.version) + } + } + } + } + } + writer.toString() } } diff --git a/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy b/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy index 33f3499..c91e28f 100644 --- a/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy +++ b/src/main/groovy/nebula/test/dependencies/repositories/MavenRepo.groovy @@ -15,8 +15,27 @@ */ package nebula.test.dependencies.repositories -/** - * Created by rspieldenner on 11/14/16. - */ +import nebula.test.dependencies.maven.Pom + class MavenRepo { + Set poms = new HashSet<>() + File root + + String repoString() { + """\ + maven { url '${root.absolutePath}' } + """.stripIndent() + } + + void generate() { + if (!root.exists()) { + root.mkdirs() + } + poms.each { Pom pom -> + def path = "${pom.artifact.group.replaceAll(/\./, '/')}/${pom.artifact.artifact}/${pom.artifact.version}" + def dir = new File(root, path) + dir.mkdirs() + new File(dir, pom.filename).text = pom.generate() + } + } } diff --git a/src/test/groovy/nebula/test/dependencies/maven/PomSpec.groovy b/src/test/groovy/nebula/test/dependencies/maven/PomSpec.groovy new file mode 100644 index 0000000..b599363 --- /dev/null +++ b/src/test/groovy/nebula/test/dependencies/maven/PomSpec.groovy @@ -0,0 +1,82 @@ +package nebula.test.dependencies.maven + +import spock.lang.Specification + +class PomSpec extends Specification { + def 'generate basic pom'() { + def pom = new Pom('nebula.test', 'basic', '0.1.0') + + when: + def pomXml = pom.generate() + + then: + def expected = '''\ + + + 4.0.0 + nebula.test + basic + 0.1.0 + '''.stripIndent() + pomXml == expected + } + + def 'generate bom'() { + def pom = new Pom('nebula.test', 'basic', '0.1.0', ArtifactType.POM) + pom.addManagementDependency('foo', 'bar', '1.2.3') + + when: + def pomXml = pom.generate() + + then: + def expected = '''\ + + + 4.0.0 + nebula.test + basic + 0.1.0 + pom + + + foo + bar + 1.2.3 + + + '''.stripIndent() + pomXml == expected + } + + def 'generate pom with dependency'() { + def pom = new Pom('nebula.test', 'basic', '0.1.0') + pom.addDependency('foo', 'bar', '1.2.3') + pom.addDependency(new Artifact('baz', 'qux', '2.0.1')) + + when: + def pomXml = pom.generate() + + then: + def expected = '''\ + + + 4.0.0 + nebula.test + basic + 0.1.0 + + + baz + qux + 2.0.1 + + + foo + bar + 1.2.3 + + + '''.stripIndent() + pomXml == expected + } +} diff --git a/src/test/groovy/nebula/test/dependencies/repositories/MavenRepoSpec.groovy b/src/test/groovy/nebula/test/dependencies/repositories/MavenRepoSpec.groovy new file mode 100644 index 0000000..0f3694a --- /dev/null +++ b/src/test/groovy/nebula/test/dependencies/repositories/MavenRepoSpec.groovy @@ -0,0 +1,25 @@ +package nebula.test.dependencies.repositories + +import nebula.test.dependencies.maven.ArtifactType +import nebula.test.dependencies.maven.Pom +import spock.lang.Specification + +class MavenRepoSpec extends Specification { + def 'create repo'() { + def repo = new MavenRepo() + final String rootDir = 'build/test/nebula.test.dependencies.repositories.MavenRepoSpec/create_repo/mavenrepo' + repo.root = new File(rootDir) + if (repo.root.exists()) { + repo.root.deleteDir() + } + def example = new Pom('test.nebula', 'ourbom', '0.1.0', ArtifactType.POM) + repo.poms.add(example) + + when: + repo.generate() + + then: + def pom = new File("${rootDir}/test/nebula/ourbom/0.1.0/ourbom-0.1.0.pom") + pom.exists() + } +} From 7689f8eecee3d9f1eaa14a5bb14391681a9dcc39 Mon Sep 17 00:00:00 2001 From: Rob Spieldenner Date: Tue, 6 Dec 2016 16:04:55 -0800 Subject: [PATCH 3/3] Remove test for ivy status feature --- .../test/dependencies/GradleDependencyGenerator.groovy | 6 ------ src/test/groovy/nebula/test/ChangingTestDirSpec.groovy | 2 +- .../test/dependencies/GradleDependencyGeneratorSpec.groovy | 2 ++ 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy b/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy index 968cb9e..54074bc 100644 --- a/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy +++ b/src/main/groovy/nebula/test/dependencies/GradleDependencyGenerator.groovy @@ -92,12 +92,6 @@ class GradleDependencyGenerator { ivyRepoDir } - File generateTestIvyRepo(String status) { - runTasks('publishIvyPublicationToIvyRepository', "-Pstatus=${status}") - - ivyRepoDir - } - String getIvyRepoDirPath() { ivyRepoDir.absolutePath } diff --git a/src/test/groovy/nebula/test/ChangingTestDirSpec.groovy b/src/test/groovy/nebula/test/ChangingTestDirSpec.groovy index 69ddf84..12447f7 100644 --- a/src/test/groovy/nebula/test/ChangingTestDirSpec.groovy +++ b/src/test/groovy/nebula/test/ChangingTestDirSpec.groovy @@ -5,7 +5,7 @@ import com.energizedwork.spock.extensions.TempDirectory class ChangingTestDirSpec extends IntegrationSpec { - @TempDirectory(clean = false, baseDir = 'test/build1') File projectDir + @TempDirectory(clean = false, baseDir = 'build/test/build1') File projectDir def 'can change name of project dir'() { expect: diff --git a/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy b/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy index 4819797..a58c1cb 100644 --- a/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy +++ b/src/test/groovy/nebula/test/dependencies/GradleDependencyGeneratorSpec.groovy @@ -15,6 +15,7 @@ */ package nebula.test.dependencies +import spock.lang.Ignore import spock.lang.Specification class GradleDependencyGeneratorSpec extends Specification { @@ -74,6 +75,7 @@ class GradleDependencyGeneratorSpec extends Specification { new File(repo, 'ivyrepo/test/ivy/foo/1.0.0/foo-1.0.0-ivy.xml').text.contains 'status="integration"' } + @Ignore def 'allow different ivy status'() { def directory = 'build/testdependencies/ivyxml' def graph = ['test.ivy:foo:1.0.0']