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()

Reply via email to