This is an automated email from the ASF dual-hosted git repository. dblevins pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tomee-site-generator.git
commit 1e0eed4c9a0f95ec26ba7c53e30716342a54d97c Author: David Blevins <[email protected]> AuthorDate: Fri May 21 20:01:07 2021 -0700 Create a unique list of contributors from a list of duplicates --- .../org/apache/tomee/website/Configuration.java | 2 +- .../tomee/website/contributors/Contributor.java | 31 ++++++++ .../website/contributors/ContributorData.java | 15 ++++ .../website/contributors/ContributorTest.java | 86 ++++++++++++++++++++++ 4 files changed, 133 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/tomee/website/Configuration.java b/src/main/java/org/apache/tomee/website/Configuration.java index d137778..9323bfe 100644 --- a/src/main/java/org/apache/tomee/website/Configuration.java +++ b/src/main/java/org/apache/tomee/website/Configuration.java @@ -89,7 +89,7 @@ public class Configuration { new Source("https://github.com/eclipse-ee4j/websocket-api.git", "master", "websocket-api-ee9") }; -// if (1 == 1) return new Source[0]; + if (1 == 1) return new Source[0]; return new Source[]{ // new Source("https://github.com/apache/tomee.git", "master", "tomee-8.0"), new Source("https://github.com/apache/tomee.git", "master", "tomee-9.0").label("milestone").related(microProfile2).related(jakartaEE9).javadoc("^org.apache.(openejb|tomee).*"), diff --git a/src/main/java/org/apache/tomee/website/contributors/Contributor.java b/src/main/java/org/apache/tomee/website/contributors/Contributor.java index bdfa002..0ff60aa 100644 --- a/src/main/java/org/apache/tomee/website/contributors/Contributor.java +++ b/src/main/java/org/apache/tomee/website/contributors/Contributor.java @@ -19,6 +19,10 @@ package org.apache.tomee.website.contributors; import lombok.Builder; import lombok.Data; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + @Data @Builder public class Contributor { @@ -27,4 +31,31 @@ public class Contributor { private String name; private String github; private String avatar; + private Stats stats; + + public Contributor add(final Contributor that) { + return new Contributor(id, committer, name, github, avatar, stats.add(that.stats)); + } + + /** + * Take the specified list of Contributors, which may have duplicates, and + * combine each duplicate down to one Contributor instance while keeping a + * total of all their stats. + */ + public static List<Contributor> unique(final List<Contributor> listWithDuplicates) { + final Map<String, List<Contributor>> map = listWithDuplicates.stream() + .collect(Collectors.groupingBy(Contributor::getName)); + + return map.values().stream() + .map(Contributor::reduce) + .collect(Collectors.toList()); + } + + private static Contributor reduce(final List<Contributor> instances) { + return instances.stream() + .reduce(Contributor::add) + .orElseThrow(IllegalStateException::new); + } + + } diff --git a/src/main/java/org/apache/tomee/website/contributors/ContributorData.java b/src/main/java/org/apache/tomee/website/contributors/ContributorData.java index 3ace899..4a6bfa3 100644 --- a/src/main/java/org/apache/tomee/website/contributors/ContributorData.java +++ b/src/main/java/org/apache/tomee/website/contributors/ContributorData.java @@ -48,6 +48,21 @@ public class ContributorData { .orElse(new Stats(0, 0, 0)); } + /** + * Convert the ContributorData to a Contributor instance + */ + public Contributor asContributor() { + final ContributorData.Author author = this.getAuthor(); + + return Contributor.builder() + .id(author.getId() + "") + .name(author.getLogin()) + .github("https://github.com/" + author.getLogin()) + .avatar(author.getAvatar()) + .stats(this.getStats()) + .build(); + } + @Data @NoArgsConstructor @AllArgsConstructor diff --git a/src/test/java/org/apache/tomee/website/contributors/ContributorTest.java b/src/test/java/org/apache/tomee/website/contributors/ContributorTest.java new file mode 100644 index 0000000..51da5d1 --- /dev/null +++ b/src/test/java/org/apache/tomee/website/contributors/ContributorTest.java @@ -0,0 +1,86 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.tomee.website.contributors; + +import org.apache.openejb.loader.IO; +import org.junit.Test; + +import javax.json.bind.Jsonb; +import javax.json.bind.JsonbBuilder; +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; + +public class ContributorTest { + + @Test + public void unique() throws IOException { + final URL resource = this.getClass().getClassLoader().getResource("contributor-data.json"); + final String json = IO.slurp(resource); + final Jsonb jsonb = JsonbBuilder.create(); + final ContributorData[] data = jsonb.fromJson(json, ContributorData[].class); + + final List<ContributorData> list = new ArrayList<>(Arrays.asList(data)); + list.add(data[3]); // djencks + list.add(data[5]); // rzo1 + list.add(data[5]); // rzo1 + list.add(data[5]); // rzo1 + list.add(data[10]); // dblevins + + final List<Contributor> duplicates = list.stream() + .map(ContributorData::asContributor) + .collect(Collectors.toList()); + + final List<Contributor> unique = Contributor.unique(duplicates); + final Map<String, Contributor> map = unique.stream().collect(Collectors.toMap(Contributor::getName, Function.identity())); + + assertEquals(17, duplicates.size()); + assertEquals(12, unique.size()); + assertEquals(12, map.size()); + + final Contributor djencks = map.get("djencks"); + assertEquals("djencks", djencks.getName()); + assertEquals(72, djencks.getStats().getCommits()); + assertEquals(70486, djencks.getStats().getLinesAdded()); + assertEquals(50040, djencks.getStats().getLinesRemoved()); + + final Contributor rzo1 = map.get("rzo1"); + assertEquals("rzo1", rzo1.getName()); + assertEquals(48, rzo1.getStats().getCommits()); + assertEquals(5952, rzo1.getStats().getLinesAdded()); + assertEquals(4164, rzo1.getStats().getLinesRemoved()); + + final Contributor dblevins = map.get("dblevins"); + assertEquals("dblevins", dblevins.getName()); + assertEquals(158, dblevins.getStats().getCommits()); + assertEquals(88898, dblevins.getStats().getLinesAdded()); + assertEquals(139256, dblevins.getStats().getLinesRemoved()); + + final Contributor cesarhernandezgt = map.get("cesarhernandezgt"); + assertEquals("cesarhernandezgt", cesarhernandezgt.getName()); + assertEquals(14, cesarhernandezgt.getStats().getCommits()); + assertEquals(1073, cesarhernandezgt.getStats().getLinesAdded()); + assertEquals(356, cesarhernandezgt.getStats().getLinesRemoved()); + } +}
