Skip to content

Commit

Permalink
Merge pull request #186 from nebula-plugins/VerifyPublicationTask-con…
Browse files Browse the repository at this point in the history
…fig-cache-support

Verify publication task config cache support
  • Loading branch information
rpalcolea authored Mar 21, 2023
2 parents 4e84395 + 111c4ad commit 15c0d11
Show file tree
Hide file tree
Showing 8 changed files with 33 additions and 29 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package nebula.plugin.publishing.verification

import groovy.transform.Canonical
import groovy.transform.Immutable
import groovy.transform.ToString

@Canonical
@Immutable
@ToString
class DeclaredDependency implements Serializable {
String group
String name
String version
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,13 +57,13 @@ class PublishVerificationPlugin implements Plugin<Project> {
void execute(VerifyPublicationTask verifyPublicationTask) {
verifyPublicationTask.projectName.set(project.name)
verifyPublicationTask.targetStatus.set(project.status.toString())
verifyPublicationTask.runtimeClasspath.set(project.configurations.named(sourceSet.getRuntimeClasspathConfigurationName()))
verifyPublicationTask.resolvedComponentResultProvider = project.configurations.named(sourceSet.getRuntimeClasspathConfigurationName()).get().incoming.resolutionResult.rootComponent
verifyPublicationTask.ignore.set(extension.ignore)
verifyPublicationTask.ignoreGroups.set(extension.ignoreGroups)
verifyPublicationTask.verificationViolationsCollectorHolderExtension.set(verificationViolationsCollectorHolderExtension)
verifyPublicationTask.definedDependencies.set(project.configurations.collect { Configuration configuration ->
configuration.dependencies
}.flatten() as List<Dependency>)
}.flatten().collect { Dependency dependency -> new DeclaredDependency(dependency.group, dependency.name, dependency.version) } as List<DeclaredDependency>)

}
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.*
import org.gradle.api.artifacts.component.ProjectComponentIdentifier
import org.gradle.api.artifacts.result.DependencyResult
import org.gradle.api.artifacts.result.ResolvedComponentResult
import org.gradle.api.artifacts.result.ResolvedDependencyResult
import org.gradle.api.artifacts.result.UnresolvedDependencyResult
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.SetProperty
import org.gradle.api.tasks.Classpath
import org.gradle.api.tasks.Input
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import org.gradle.work.DisableCachingByDefault
Expand All @@ -28,36 +28,32 @@ abstract class VerifyPublicationTask extends DefaultTask {
@Input
abstract Property<String> getTargetStatus()

@InputFiles
@Classpath
abstract Property<Configuration> getRuntimeClasspath()

@Input
abstract Property<String> getProjectName()

@Internal
Provider<ResolvedComponentResult> resolvedComponentResultProvider

@Input
abstract ListProperty<Dependency> getDefinedDependencies()
abstract ListProperty<DeclaredDependency> getDefinedDependencies()

@Internal
abstract Property<PublishVerificationPlugin.VerificationViolationsCollectorHolderExtension> getVerificationViolationsCollectorHolderExtension()

VerifyPublicationTask() {
this.notCompatibleWithConfigurationCache("VerifyPublicationTask uses disallowed types")
}

@TaskAction
void verifyDependencies() {
Set<ResolvedDependencyResult> firstLevel = getNonProjectDependencies(runtimeClasspath.get())
Set<ResolvedDependencyResult> firstLevel = getNonProjectDependencies(resolvedComponentResultProvider.get())
List<StatusVerificationViolation> violations = new StatusVerification(ignore.get(), ignoreGroups.get(), targetStatus.get()).verify(firstLevel)

List<VersionSelectorVerificationViolation> versionViolations = new VersionSelectorVerification(ignore.get(), ignoreGroups.get()).verify(definedDependencies.get())

verificationViolationsCollectorHolderExtension.get().collector.put(projectName.get(), new ViolationsContainer(statusViolations: violations, versionSelectorViolations: versionViolations))
}

private static Set<ResolvedDependencyResult> getNonProjectDependencies(Configuration runtimeClasspath) {
Set<? extends DependencyResult> firstLevelDependencies = runtimeClasspath.incoming.resolutionResult.root.getDependencies()
private static Set<ResolvedDependencyResult> getNonProjectDependencies(ResolvedComponentResult resolvedComponentResult) {
Set<? extends DependencyResult> firstLevelDependencies = resolvedComponentResult.dependencies
.findAll { !it.constraint }

List<UnresolvedDependencyResult> unresolvedDependencies = firstLevelDependencies.findAll { it instanceof UnresolvedDependencyResult } as List<UnresolvedDependencyResult>
if (! unresolvedDependencies.isEmpty()) {
UnresolvedDependencyResult unresolvedDependencyResult = (UnresolvedDependencyResult) unresolvedDependencies.first()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,15 @@ class VersionSelectorVerification {
this.ignore = ignore
}

List<VersionSelectorVerificationViolation> verify(List<Dependency> dependencies) {
List<VersionSelectorVerificationViolation> verify(List<DeclaredDependency> dependencies) {
dependencies.findAll { it.version != null }
.findAll { ! ignoreGroups.contains(it.group) }
.findAll { ! ignore.contains(DefaultModuleIdentifier.newId(it.group, it.name)) }
.findAll { dependency -> verifySubVersion(dependency) }
.collect { dependency -> new VersionSelectorVerificationViolation(dependency: dependency) }
}

private boolean verifySubVersion(Dependency dependency) {
private boolean verifySubVersion(DeclaredDependency dependency) {
VersionSelector selector = parseSelector(dependency.version)
selector instanceof SubVersionSelector && !selector.selector.endsWith(".+")
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package nebula.plugin.publishing.verification

import org.gradle.api.artifacts.Dependency

class VersionSelectorVerificationViolation {
Dependency dependency
DeclaredDependency dependency
}
Original file line number Diff line number Diff line change
Expand Up @@ -122,11 +122,7 @@ class VerificationReportGeneratorSpec extends Specification {
}

VersionSelectorVerificationViolation createVersionViolation(String group, String name, String version) {
new VersionSelectorVerificationViolation(dependency: Mock(Dependency) {
getName() >> name
getGroup() >> group
getVersion() >> version
})
new VersionSelectorVerificationViolation(dependency: new DeclaredDependency(group, name, version))
}

void assertStatusViolationsForProjects(String report, Map<String, ViolationsContainer> violationsPerProject, String targetStatus) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ class VerificationReportTaskSpec extends Specification {
]),
new ViolationsContainer(
versionSelectorViolations: [
new VersionSelectorVerificationViolation(dependency: Mock(Dependency))
new VersionSelectorVerificationViolation(dependency: GroovyMock(DeclaredDependency))
])
]
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@ class VerifyPublicationTaskSpec extends Specification {
task.configure {
ignore.set(Collections.emptySet())
ignoreGroups.set(Collections.emptySet())
runtimeClasspath.set(project.configurations.getByName(project.sourceSets.main.getRuntimeClasspathConfigurationName()))
resolvedComponentResultProvider = project.configurations.named(project.sourceSets.main.getRuntimeClasspathConfigurationName()).get().incoming.resolutionResult.rootComponent
definedDependencies.set(project.configurations.collect { Configuration configuration ->
configuration.dependencies
}.flatten() as List<Dependency>)
}.flatten().collect { Dependency dependency -> new DeclaredDependency(dependency.group, dependency.name, dependency.version) } as List<DeclaredDependency>)
projectName.set(project.name)
targetStatus.set(project.status.toString())
verificationViolationsCollectorHolderExtension.set(extension)
Expand Down

0 comments on commit 15c0d11

Please sign in to comment.