This is an automated email from the ASF dual-hosted git repository. jdaugherty pushed a commit to branch expandedDevelopers in repository https://gitbox.apache.org/repos/asf/grails-gradle-publish.git
commit 532af1d858141f6b25181bf21b23bbd2d7f41f29 Author: James Daugherty <[email protected]> AuthorDate: Tue Dec 2 11:07:24 2025 -0500 feature: add support for further customizing developer information --- README.md | 29 ++++++++++++- .../gradle/publish/GrailsPublishExtension.groovy | 35 +++++++++++++-- .../publish/GrailsPublishGradlePlugin.groovy | 50 ++++++++++++++++++++-- .../publish/GrailsPublishGradlePluginTest.groovy | 4 +- 4 files changed, 107 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 7dc0dbe..8359fdc 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ Example Configuration: vcsUrl = 'https://github.com/myname/myplugin' title = 'My plugin title' desc = 'My plugin description' - developers = [johndoe: 'John Doe'] + developers = [janedoe: 'Jane Doe', johndoe: 'John Doe'] } or @@ -93,13 +93,38 @@ or } title = 'My plugin title' desc = 'My plugin description' - developers = [johndoe: 'John Doe'] + developers = [janedoe: 'Jane Doe', johndoe: 'John Doe'] organization { name = 'My Company' url = 'http://mycompany.com' } } +or + + grailsPublish { + githubSlug = 'foo/bar' + license { + name = 'Apache-2.0' + } + title = 'My plugin title' + desc = 'My plugin description' + developer { + id = 'janedoe' + name = 'Jane Doe' + } + developer { + id = 'johndoe' + name = 'John Doe' + } + organization { + name = 'My Company' + url = 'http://mycompany.com' + } + } + + + By default, this plugin will publish to the specified `MAVEN_PUBLISH` instance for snapshots, and `NEXUS_PUBLISH` for releases. To change the snapshot publish behavior, set `snapshotRepoType` to `PublishType.NEXUS_PUBLISH`. To change the release publish behavior, set `releaseRepoType` to `PublishType.MAVEN_PUBLISH`. diff --git a/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishExtension.groovy b/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishExtension.groovy index cc95513..59a4de2 100644 --- a/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishExtension.groovy +++ b/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishExtension.groovy @@ -23,8 +23,10 @@ import org.gradle.api.Action import org.gradle.api.Project import org.gradle.api.file.Directory import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.MapProperty +import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property +import org.gradle.api.publish.maven.MavenPomDeveloper +import org.gradle.api.publish.maven.internal.publication.DefaultMavenPomDeveloper import org.gradle.api.tasks.Nested import javax.inject.Inject @@ -71,7 +73,8 @@ class GrailsPublishExtension { /** * The developers of the project */ - final MapProperty<String, String> developers + @Nested + final ListProperty<MavenPomDeveloper> developers /** * Title of the project, defaults to the project name @@ -134,8 +137,14 @@ class GrailsPublishExtension { */ final Property<Boolean> transitiveDependencies + private ObjectFactory objects + private Project project + @Inject GrailsPublishExtension(ObjectFactory objects, Project project) { + this.objects = objects + this.project = project + githubSlug = objects.property(String).convention( project.provider { project.findProperty('githubSlug') as String @@ -157,7 +166,7 @@ class GrailsPublishExtension { String githubSlug = githubSlug.getOrNull() githubSlug ? "[email protected]:${githubSlug}.git" as String : null }) - developers = objects.mapProperty(String, String).convention([:]) + developers = objects.listProperty(MavenPomDeveloper).convention([]) title = objects.property(String).convention(project.provider { project.name }) desc = objects.property(String).convention(project.provider { title.getOrNull() @@ -214,5 +223,25 @@ class GrailsPublishExtension { this.license.name = license } + /** + * Convenience method to maintain backwards compatibility + */ + void setDevelopers(Map<String, String> developers) { + developers.each { entry -> + developer { + it.id.set(entry.key) + it.name.set(entry.value) + } + } + } + + /** + * Syntactic sugar to allow for easier developer creation + */ + void developer(Action<? super MavenPomDeveloper> action) { + MavenPomDeveloper dev = objects.newInstance(MavenPomDeveloper) + action.execute(dev) + developers.add(dev) + } } diff --git a/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePlugin.groovy b/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePlugin.groovy index 0ab8725..921e2fb 100644 --- a/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePlugin.groovy +++ b/plugin/src/main/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePlugin.groovy @@ -41,6 +41,11 @@ import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.api.plugins.JavaPlatformExtension import org.gradle.api.plugins.JavaPluginExtension import org.gradle.api.plugins.PluginManager +import org.gradle.api.provider.ListProperty +import org.gradle.api.provider.MapProperty +import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider +import org.gradle.api.provider.SetProperty import org.gradle.api.publish.PublicationContainer import org.gradle.api.publish.PublishingExtension import org.gradle.api.publish.maven.MavenPom @@ -63,6 +68,8 @@ import org.gradle.plugins.signing.Sign import org.gradle.plugins.signing.SigningExtension import org.gradle.plugins.signing.SigningPlugin +import java.lang.reflect.Modifier + import static org.gradle.api.plugins.BasePlugin.BUILD_GROUP /** @@ -380,10 +387,9 @@ Note: if project properties are used, the properties must be defined prior to ap if (gpe.developers) { pom.developers { MavenPomDeveloperSpec devs -> - for (entry in gpe.developers.get().entrySet()) { - devs.developer { MavenPomDeveloper dev -> - dev.id.set(entry.key) - dev.name.set(entry.value) + for (MavenPomDeveloper source : gpe.developers.get()) { + devs.developer { MavenPomDeveloper target -> + cloneDeveloper(source, target) } } } @@ -461,6 +467,42 @@ Note: if project properties are used, the properties must be defined prior to ap } } + static void cloneDeveloper(MavenPomDeveloper source, MavenPomDeveloper target) { + source.metaClass.properties.each { + if(!Modifier.isPublic(it.modifiers)) { + return + } + + String propertyName = it.name + def sourceProperty = it.getProperty(source) + if(sourceProperty == null || !Provider.isAssignableFrom(sourceProperty.class)) { + return + } + + if (!target.hasProperty(propertyName)) { + return + } + + def targetProperty = ((GroovyObject)target).getProperty(propertyName) + switch (sourceProperty) { + case Property: + (targetProperty as Property).set((sourceProperty as Property).orNull) + break + case SetProperty: + (targetProperty as SetProperty).addAll((sourceProperty as SetProperty).getOrElse([] as Set)) + break + case ListProperty: + (targetProperty as ListProperty).addAll((sourceProperty as ListProperty).getOrElse([])) + break + case MapProperty: + (targetProperty as MapProperty).putAll((sourceProperty as MapProperty).getOrElse([:]) as Map) + break + default: + throw new IllegalStateException("Could not handle type [${targetProperty.class}] for property [${propertyName}]") + } + } + } + protected void setDependencyVersions(Node pomNode, Project project) { def mavenPomNamespace = 'http://maven.apache.org/POM/4.0.0' def dependenciesQName = new QName(mavenPomNamespace, 'dependencies') diff --git a/plugin/src/test/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePluginTest.groovy b/plugin/src/test/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePluginTest.groovy index b620626..8010cdc 100644 --- a/plugin/src/test/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePluginTest.groovy +++ b/plugin/src/test/groovy/org/apache/grails/gradle/publish/GrailsPublishGradlePluginTest.groovy @@ -85,7 +85,7 @@ class GrailsPublishGradlePluginTest extends Specification { } gpe.title.set('Grails Gradle Publish Plugin') gpe.desc.set('A plugin to assist in publishing Grails artifacts') - gpe.developers.set(['jdaugherty': 'James Daugherty']) + gpe.developers = ['jdaugherty': 'James Daugherty'] when: ((ProjectInternal) project).evaluate() @@ -179,7 +179,7 @@ class GrailsPublishGradlePluginTest extends Specification { } gpe.title.set('Grails Gradle Publish Plugin') gpe.desc.set('A plugin to assist in publishing Grails artifacts') - gpe.developers.set(['jdaugherty': 'James Daugherty']) + gpe.developers = ['jdaugherty': 'James Daugherty'] when: ((ProjectInternal) project).evaluate()
