Merge pull request #1159 from gsmet/check-run-enum

Fix issues related to introduction of new values in GHEvent
This commit is contained in:
Liam Newman
2021-06-01 16:13:28 -07:00
committed by GitHub
9 changed files with 72 additions and 69 deletions

View File

@@ -1,9 +1,12 @@
package org.kohsuke.github; package org.kohsuke.github;
import org.kohsuke.github.internal.EnumUtils;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import static org.kohsuke.github.internal.Previews.MACHINE_MAN; import static org.kohsuke.github.internal.Previews.MACHINE_MAN;
@@ -20,7 +23,7 @@ public class GHApp extends GHObject {
private String description; private String description;
private String externalUrl; private String externalUrl;
private Map<String, String> permissions; private Map<String, String> permissions;
private List<GHEvent> events; private List<String> events;
private long installationsCount; private long installationsCount;
private String htmlUrl; private String htmlUrl;
@@ -114,7 +117,9 @@ public class GHApp extends GHObject {
* @return the events * @return the events
*/ */
public List<GHEvent> getEvents() { public List<GHEvent> getEvents() {
return events; return events.stream()
.map(e -> EnumUtils.getEnumOrDefault(GHEvent.class, e, GHEvent.UNKNOWN))
.collect(Collectors.toList());
} }
/** /**
@@ -126,7 +131,7 @@ public class GHApp extends GHObject {
*/ */
@Deprecated @Deprecated
public void setEvents(List<GHEvent> events) { public void setEvents(List<GHEvent> events) {
this.events = events; this.events = events.stream().map(GHEvent::symbol).collect(Collectors.toList());
} }
/** /**

View File

@@ -1,12 +1,14 @@
package org.kohsuke.github; package org.kohsuke.github;
import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonProperty;
import org.kohsuke.github.internal.EnumUtils;
import java.io.IOException; import java.io.IOException;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import static org.kohsuke.github.internal.Previews.GAMBIT; import static org.kohsuke.github.internal.Previews.GAMBIT;
import static org.kohsuke.github.internal.Previews.MACHINE_MAN; import static org.kohsuke.github.internal.Previews.MACHINE_MAN;
@@ -35,7 +37,7 @@ public class GHAppInstallation extends GHObject {
@JsonProperty("target_type") @JsonProperty("target_type")
private GHTargetType targetType; private GHTargetType targetType;
private Map<String, GHPermissionType> permissions; private Map<String, GHPermissionType> permissions;
private List<GHEvent> events; private List<String> events;
@JsonProperty("single_file_name") @JsonProperty("single_file_name")
private String singleFileName; private String singleFileName;
@JsonProperty("repository_selection") @JsonProperty("repository_selection")
@@ -250,7 +252,9 @@ public class GHAppInstallation extends GHObject {
* @return the events * @return the events
*/ */
public List<GHEvent> getEvents() { public List<GHEvent> getEvents() {
return events; return events.stream()
.map(e -> EnumUtils.getEnumOrDefault(GHEvent.class, e, GHEvent.UNKNOWN))
.collect(Collectors.toList());
} }
/** /**
@@ -262,7 +266,7 @@ public class GHAppInstallation extends GHObject {
*/ */
@Deprecated @Deprecated
public void setEvents(List<GHEvent> events) { public void setEvents(List<GHEvent> events) {
this.events = events; this.events = events.stream().map(GHEvent::symbol).collect(Collectors.toList());
} }
/** /**

View File

@@ -1,11 +1,7 @@
package org.kohsuke.github; package org.kohsuke.github;
import org.kohsuke.github.internal.EnumUtils;
import java.util.Locale; import java.util.Locale;
import javax.annotation.Nonnull;
/** /**
* Hook event type. * Hook event type.
* *
@@ -24,6 +20,8 @@ public enum GHEvent {
DEPLOY_KEY, DEPLOY_KEY,
DEPLOYMENT, DEPLOYMENT,
DEPLOYMENT_STATUS, DEPLOYMENT_STATUS,
DISCUSSION,
DISCUSSION_COMMENT,
DOWNLOAD, DOWNLOAD,
FOLLOW, FOLLOW,
FORK, FORK,
@@ -89,46 +87,4 @@ public enum GHEvent {
return "*"; return "*";
return name().toLowerCase(Locale.ENGLISH); return name().toLowerCase(Locale.ENGLISH);
} }
/**
* Representation of GitHub Event Type
*
* @see <a href="https://docs.github.com/en/developers/webhooks-and-events/github-event-types">GitHub event
* types</a>
*/
enum GitHubEventType {
CommitCommentEvent(COMMIT_COMMENT),
CreateEvent(CREATE),
DeleteEvent(DELETE),
ForkEvent(FORK),
GollumEvent(GOLLUM),
IssueCommentEvent(ISSUE_COMMENT),
IssuesEvent(ISSUES),
MemberEvent(MEMBER),
PublicEvent(PUBLIC),
PullRequestEvent(PULL_REQUEST),
PullRequestReviewEvent(PULL_REQUEST_REVIEW),
PullRequestReviewCommentEvent(PULL_REQUEST_REVIEW_COMMENT),
PushEvent(PUSH),
ReleaseEvent(RELEASE),
WatchEvent(WATCH),
UnknownEvent(UNKNOWN);
private final GHEvent event;
GitHubEventType(GHEvent event) {
this.event = event;
}
/**
* Required due to different naming conventions between different GitHub event names for Webhook events and
* GitHub events
*
* @param event
* the github event as a string to convert to Event enum
* @return GHEvent
*/
static GHEvent transformToGHEvent(@Nonnull String event) {
return EnumUtils.getEnumOrDefault(GitHubEventType.class, event, UnknownEvent).event;
}
}
} }

View File

@@ -2,10 +2,9 @@ package org.kohsuke.github;
import com.fasterxml.jackson.databind.node.ObjectNode; import com.fasterxml.jackson.databind.node.ObjectNode;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.kohsuke.github.GHEvent.GitHubEventType;
import java.io.IOException; import java.io.IOException;
import java.util.Date; import java.util.*;
/** /**
* Represents an event. * Represents an event.
@@ -19,6 +18,16 @@ public class GHEventInfo extends GitHubInteractiveObject {
private long id; private long id;
private String created_at; private String created_at;
/**
* Representation of GitHub Event API Event Type.
*
* This is not the same as the values used for hook methods such as
* {@link GHRepository#createHook(String, Map, Collection, boolean)}.
*
* @see <a href="https://docs.github.com/en/developers/webhooks-and-events/github-event-types">GitHub event
* types</a>
*/
private String type; private String type;
// these are all shallow objects // these are all shallow objects
@@ -41,13 +50,45 @@ public class GHEventInfo extends GitHubInteractiveObject {
private String name; // owner/repo private String name; // owner/repo
} }
static final Map<String, GHEvent> mapTypeStringToEvent = createEventMap();
/**
* Map for GitHub Event API Event Type to GHEvent.
*
* @see <a href="https://docs.github.com/en/developers/webhooks-and-events/github-event-types">GitHub event
* types</a>
*/
private static Map<String, GHEvent> createEventMap() {
HashMap<String, GHEvent> map = new HashMap<>();
map.put("CommitCommentEvent", GHEvent.COMMIT_COMMENT);
map.put("CreateEvent", GHEvent.CREATE);
map.put("DeleteEvent", GHEvent.DELETE);
map.put("ForkEvent", GHEvent.FORK);
map.put("GollumEvent", GHEvent.GOLLUM);
map.put("IssueCommentEvent", GHEvent.ISSUE_COMMENT);
map.put("IssuesEvent", GHEvent.ISSUES);
map.put("MemberEvent", GHEvent.MEMBER);
map.put("PublicEvent", GHEvent.PUBLIC);
map.put("PullRequestEvent", GHEvent.PULL_REQUEST);
map.put("PullRequestReviewEvent", GHEvent.PULL_REQUEST_REVIEW);
map.put("PullRequestReviewCommentEvent", GHEvent.PULL_REQUEST_REVIEW_COMMENT);
map.put("PushEvent", GHEvent.PUSH);
map.put("ReleaseEvent", GHEvent.RELEASE);
map.put("WatchEvent", GHEvent.WATCH);
return Collections.unmodifiableMap(map);
}
static GHEvent transformTypeToGHEvent(String type) {
return mapTypeStringToEvent.getOrDefault(type, GHEvent.UNKNOWN);
}
/** /**
* Gets type. * Gets type.
* *
* @return the type * @return the type
*/ */
public GHEvent getType() { public GHEvent getType() {
return GitHubEventType.transformToGHEvent(type); return transformTypeToGHEvent(type);
} }
GHEventInfo wrapUp(GitHub root) { GHEventInfo wrapUp(GitHub root) {

View File

@@ -1,13 +1,13 @@
package org.kohsuke.github; package org.kohsuke.github;
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import org.kohsuke.github.internal.EnumUtils;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map; import java.util.Map;
/** /**
@@ -40,10 +40,7 @@ public abstract class GHHook extends GHObject {
public EnumSet<GHEvent> getEvents() { public EnumSet<GHEvent> getEvents() {
EnumSet<GHEvent> s = EnumSet.noneOf(GHEvent.class); EnumSet<GHEvent> s = EnumSet.noneOf(GHEvent.class);
for (String e : events) { for (String e : events) {
if (e.equals("*")) s.add(e.equals("*") ? GHEvent.ALL : EnumUtils.getEnumOrDefault(GHEvent.class, e, GHEvent.UNKNOWN));
s.add(GHEvent.ALL);
else
s.add(Enum.valueOf(GHEvent.class, e.toUpperCase(Locale.ENGLISH)));
} }
return s; return s;
} }

View File

@@ -30,7 +30,7 @@ public final class EnumUtils {
if (value == null) { if (value == null) {
return null; return null;
} }
return getEnumOrDefault(enumClass, value.toUpperCase(Locale.ROOT), defaultEnum); return getEnumOrDefault(enumClass, value, defaultEnum);
} }
/** /**
@@ -49,8 +49,8 @@ public final class EnumUtils {
*/ */
public static <E extends Enum<E>> E getEnumOrDefault(Class<E> enumClass, String value, E defaultEnum) { public static <E extends Enum<E>> E getEnumOrDefault(Class<E> enumClass, String value, E defaultEnum) {
try { try {
return Enum.valueOf(enumClass, value); return Enum.valueOf(enumClass, value.toUpperCase(Locale.ROOT));
} catch (IllegalArgumentException e) { } catch (NullPointerException | IllegalArgumentException e) {
LOGGER.warning("Unknown value " + value + " for enum class " + enumClass.getName() + ", defaulting to " LOGGER.warning("Unknown value " + value + " for enum class " + enumClass.getName() + ", defaulting to "
+ defaultEnum.name()); + defaultEnum.name());
return defaultEnum; return defaultEnum;

View File

@@ -27,7 +27,7 @@ public class EnumTest extends AbstractGitHubWireMockTest {
assertThat(GHDirection.values().length, equalTo(2)); assertThat(GHDirection.values().length, equalTo(2));
assertThat(GHEvent.values().length, equalTo(58)); assertThat(GHEvent.values().length, equalTo(60));
assertThat(GHEvent.ALL.symbol(), equalTo("*")); assertThat(GHEvent.ALL.symbol(), equalTo("*"));
assertThat(GHEvent.PULL_REQUEST.symbol(), equalTo(GHEvent.PULL_REQUEST.toString().toLowerCase())); assertThat(GHEvent.PULL_REQUEST.symbol(), equalTo(GHEvent.PULL_REQUEST.toString().toLowerCase()));

View File

@@ -1,7 +1,6 @@
package org.kohsuke.github; package org.kohsuke.github;
import org.junit.Test; import org.junit.Test;
import org.kohsuke.github.GHEvent.GitHubEventType;
import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.is;
@@ -26,10 +25,9 @@ public class GHEventTest {
@Test @Test
public void regressionTest() { public void regressionTest() {
assertThat(GitHubEventType.transformToGHEvent("NewlyAddedOrBogusEvent"), is(GHEvent.UNKNOWN)); assertThat(GHEventInfo.transformTypeToGHEvent("NewlyAddedOrBogusEvent"), is(GHEvent.UNKNOWN));
for (GitHubEventType gitHubEventType : GitHubEventType.values()) { for (String eventInfoType : GHEventInfo.mapTypeStringToEvent.keySet()) {
assertThat(GitHubEventType.transformToGHEvent(gitHubEventType.name()), assertThat(GHEventInfo.transformTypeToGHEvent(eventInfoType), is(oldTransformationFunction(eventInfoType)));
is(oldTransformationFunction(gitHubEventType.name())));
} }
} }
} }

View File

@@ -9,6 +9,8 @@ public class EnumUtilsTest {
@Test @Test
public void testGetEnum() { public void testGetEnum() {
assertThat(EnumUtils.getEnumOrDefault(TestEnum.class, null, TestEnum.UNKNOWN), equalTo(TestEnum.UNKNOWN));
assertThat(EnumUtils.getNullableEnumOrDefault(TestEnum.class, null, TestEnum.UNKNOWN), nullValue()); assertThat(EnumUtils.getNullableEnumOrDefault(TestEnum.class, null, TestEnum.UNKNOWN), nullValue());
assertThat(EnumUtils.getNullableEnumOrDefault(TestEnum.class, "foobar", TestEnum.UNKNOWN), assertThat(EnumUtils.getNullableEnumOrDefault(TestEnum.class, "foobar", TestEnum.UNKNOWN),
equalTo(TestEnum.UNKNOWN)); equalTo(TestEnum.UNKNOWN));