diff --git a/.mvn/wrapper/MavenWrapperDownloader.java b/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100755 index 0000000..fa4f7b4 --- /dev/null +++ b/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,110 @@ +/* +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. +*/ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar old mode 100644 new mode 100755 index 5fd4d50..01e6799 Binary files a/.mvn/wrapper/maven-wrapper.jar and b/.mvn/wrapper/maven-wrapper.jar differ diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties old mode 100644 new mode 100755 index eb91947..b6e6781 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -1 +1 @@ -distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.3.3/apache-maven-3.3.3-bin.zip \ No newline at end of file +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.0/apache-maven-3.6.0-bin.zip \ No newline at end of file diff --git a/mvnw b/mvnw index a1ba1bf..5551fde 100755 --- a/mvnw +++ b/mvnw @@ -54,38 +54,16 @@ case "`uname`" in CYGWIN*) cygwin=true ;; MINGW*) mingw=true;; Darwin*) darwin=true - # - # Look for the Apple JDKs first to preserve the existing behaviour, and then look - # for the new JDKs provided by Oracle. - # - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L /System/Library/Java/JavaVirtualMachines/CurrentJDK ] ; then - # - # Apple JDKs - # - export JAVA_HOME=/System/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -L "/Library/Java/JavaVirtualMachines/CurrentJDK" ] ; then - # - # Oracle JDKs - # - export JAVA_HOME=/Library/Java/JavaVirtualMachines/CurrentJDK/Contents/Home - fi - - if [ -z "$JAVA_HOME" ] && [ -x "/usr/libexec/java_home" ]; then - # - # Apple JDKs - # - export JAVA_HOME=`/usr/libexec/java_home` - fi - ;; + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; esac if [ -z "$JAVA_HOME" ] ; then @@ -130,7 +108,7 @@ if $cygwin ; then CLASSPATH=`cygpath --path --unix "$CLASSPATH"` fi -# For Migwn, ensure paths are in UNIX format before anything is touched +# For Mingw, ensure paths are in UNIX format before anything is touched if $mingw ; then [ -n "$M2_HOME" ] && M2_HOME="`(cd "$M2_HOME"; pwd)`" @@ -184,27 +162,28 @@ fi CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` -fi - # traverses directory structure from process work directory to filesystem root # first directory with .mvn subdirectory is considered project base directory find_maven_basedir() { - local basedir=$(pwd) - local wdir=$(pwd) + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" while [ "$wdir" != '/' ] ; do if [ -d "$wdir"/.mvn ] ; then basedir=$wdir break fi - wdir=$(cd "$wdir/.."; pwd) + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround done echo "${basedir}" } @@ -216,13 +195,87 @@ concat_lines() { fi } -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)} +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" -# Provide a "standardized" way to retrieve the CLI args that will -# work with both Windows and non-Windows executions. -MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" -export MAVEN_CMD_LINE_ARGS +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain @@ -230,4 +283,4 @@ exec "$JAVACMD" \ $MAVEN_OPTS \ -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} "$@" + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/mvnw.cmd b/mvnw.cmd old mode 100644 new mode 100755 index 2b934e8..e5cfb0a --- a/mvnw.cmd +++ b/mvnw.cmd @@ -35,6 +35,8 @@ @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off +@REM set title of command window +title %0 @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @@ -80,8 +82,6 @@ goto error :init -set MAVEN_CMD_LINE_ARGS=%* - @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. @@ -117,11 +117,27 @@ for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do s :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" - -set WRAPPER_JAR="".\.mvn\wrapper\maven-wrapper.jar"" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CMD_LINE_ARGS% +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end @@ -142,4 +158,4 @@ if "%MAVEN_BATCH_PAUSE%" == "on" pause if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% -exit /B %ERROR_CODE% \ No newline at end of file +exit /B %ERROR_CODE% diff --git a/src/main/java/io/spring/issuebot/github/Event.java b/src/main/java/io/spring/issuebot/github/Event.java index 37bb90c..f175bcd 100644 --- a/src/main/java/io/spring/issuebot/github/Event.java +++ b/src/main/java/io/spring/issuebot/github/Event.java @@ -20,6 +20,8 @@ import java.time.OffsetDateTime; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * An event that has been performed on an {@link Issue}. @@ -28,6 +30,8 @@ import com.fasterxml.jackson.annotation.JsonProperty; */ public class Event { + private static final Logger log = LoggerFactory.getLogger(Event.class); + private final Type type; private final OffsetDateTime creationTime; @@ -69,39 +73,9 @@ public class Event { public enum Type { /** - * The issue was closed by the actor. + * The issue was added to a project board. */ - CLOSED("closed"), - - /** - * The issue was reopened by the actor. - */ - REOPENED("reopened"), - - /** - * The actor subscribed to receive notifications for an issue. - */ - SUBSCRIBED("subscribed"), - - /** - * The actor unsubscribed from receibing notifications for an issue. - */ - UNSUBSCRIBED("unsubscribed"), - - /** - * The issue was merged by the actor. - */ - MERGED("merged"), - - /** - * The issue was referenced from a commit message. - */ - REFERENCED("referenced"), - - /** - * The actor was {@code @mentioned} in an issue body. - */ - MENTIONED("mentioned"), + ADDED_TO_PROJECT("added_to_project"), /** * The issue was assigned to the actor. @@ -109,45 +83,25 @@ public class Event { ASSIGNED("assigned"), /** - * The actor was unassigned from the issue. + * The issue was closed by the actor. */ - UNASSIGNED("unassigned"), + CLOSED("closed"), /** - * A label was added to the issue. + * A comment on the issue has been deleted by the actor. */ - LABELED("labeled"), + COMMENT_DELETED("comment_deleted"), /** - * A label was removed from the issue. + * The issue was created by converting a note in a project board to an issue. */ - UNLABELED("unlabeled"), - - /** - * The issue was added to a milestone. - */ - MILESTONED("milestoned"), + CONVERTED_NOTE_TO_ISSUE("converted_note_to_issue"), /** * The issue was removed from a milestone. */ DEMILESTONED("demilestoned"), - /** - * The issue title was changed. - */ - RENAMED("renamed"), - - /** - * The issue was locked by the actor. - */ - LOCKED("locked"), - - /** - * The issue was unlocked by the actor. - */ - UNLOCKED("unlocked"), - /** * The pull request's branch was deleted. */ @@ -159,16 +113,106 @@ public class Event { HEAD_REF_RESTORED("head_ref_restored"), /** - * Something was added to project. + * A label was added to the issue. */ - ADDED_TO_PROJECT("added_to_project"), + LABELED("labeled"), /** - * Something was removed from project. + * The issue was locked by the actor. */ - REMOVED_FROM_PROJECT("removed_from_project"); + LOCKED("locked"), - private String type; + /** + * The issue was marked as a duplicate. + */ + MARKED_AS_DUPLICATE("marked_as_duplicate"), + + /** + * The actor was {@code @mentioned} in an issue body. + */ + MENTIONED("mentioned"), + + /** + * The issue was merged by the actor. + */ + MERGED("merged"), + + /** + * The issue was added to a milestone. + */ + MILESTONED("milestoned"), + + /** + * The issue was moved between columns in a project board. + */ + MOVED_COLUMNS_IN_PROJECT("moved_columns_in_project"), + + /** + * The issue was referenced from a commit message. + */ + REFERENCED("referenced"), + + /** + * The issue was removed from a project board. + */ + REMOVED_FROM_PROJECT("removed_from_project"), + + /** + * The issue title was changed. + */ + RENAMED("renamed"), + + /** + * The issue was reopened by the actor. + */ + REOPENED("reopened"), + + /** + * The actor dismissed a review from the pull request. + */ + REVIEW_DISMISSED("review_dismissed"), + + /** + * The actor requested a review from the subject on the pull request. + */ + REVIEW_REQUESTED("review_requested"), + + /** + * The actor removed the review request from the subject on the pull request. + */ + REVIEW_REQUEST_REMOVED("review_request_removed"), + + /** + * The actor subscribed to receive notifications for an issue. + */ + SUBSCRIBED("subscribed"), + + /** + * The actor was unassigned from the issue. + */ + UNASSIGNED("unassigned"), + + /** + * A label was removed from the issue. + */ + UNLABELED("unlabeled"), + + /** + * The issue was unlocked by the actor. + */ + UNLOCKED("unlocked"), + + /** + * The issue was unmarked as a duplicate. + */ + UNMARKED_AS_DUPLICATE("unmarked_as_duplicate"), + + /** + * The actor unsubscribed from receiving notifications for an issue. + */ + UNSUBSCRIBED("unsubscribed"); + + private final String type; Type(String type) { this.type = type; @@ -180,8 +224,10 @@ public class Event { return value; } } - throw new IllegalArgumentException( - "'" + type + "' is not a valid event type"); + if (log.isInfoEnabled()) { + log.info("Received unknown event type '" + type + "'"); + } + return null; } } diff --git a/src/test/java/io/spring/issuebot/github/GitHubTemplateTests.java b/src/test/java/io/spring/issuebot/github/GitHubTemplateTests.java index b5a4a5a..22e76ac 100644 --- a/src/test/java/io/spring/issuebot/github/GitHubTemplateTests.java +++ b/src/test/java/io/spring/issuebot/github/GitHubTemplateTests.java @@ -221,7 +221,7 @@ public class GitHubTemplateTests { assertThat(pageOne.getContent()).hasSize(12); Page pageTwo = pageOne.next(); assertThat(pageTwo).isNotNull(); - assertThat(pageTwo.getContent()).hasSize(3); + assertThat(pageTwo.getContent()).hasSize(4); } @Test diff --git a/src/test/resources/io/spring/issuebot/github/events-page-two.json b/src/test/resources/io/spring/issuebot/github/events-page-two.json index 27cf59c..c52e321 100644 --- a/src/test/resources/io/spring/issuebot/github/events-page-two.json +++ b/src/test/resources/io/spring/issuebot/github/events-page-two.json @@ -79,5 +79,34 @@ "commit_id": "ffd6e8d7eb944d8a3613e40e6aa1f6aa57127046", "commit_url": "https://api.github.com/repos/spring-projects/spring-boot/commits/ffd6e8d7eb944d8a3613e40e6aa1f6aa57127046", "created_at": "2015-12-02T14:02:24Z" + }, + { + "actor": { + "avatar_url": "https://avatars0.githubusercontent.com/u/317776?v=4", + "events_url": "https://api.github.com/users/spring-projects/events{/privacy}", + "followers_url": "https://api.github.com/users/spring-projects/followers", + "following_url": "https://api.github.com/users/spring-projects/following{/other_user}", + "gists_url": "https://api.github.com/users/spring-projects/gists{/gist_id}", + "gravatar_id": "", + "html_url": "https://github.com/spring-projects", + "id": 317776, + "login": "spring-projects", + "node_id": "MDEyOk9yZ2FuaXphdGlvbjMxNzc3Ng==", + "organizations_url": "https://api.github.com/users/spring-projects/orgs", + "received_events_url": "https://api.github.com/users/spring-projects/received_events", + "repos_url": "https://api.github.com/users/spring-projects/repos", + "site_admin": false, + "starred_url": "https://api.github.com/users/spring-projects/starred{/owner}{/repo}", + "subscriptions_url": "https://api.github.com/users/spring-projects/subscriptions", + "type": "Organization", + "url": "https://api.github.com/users/spring-projects" + }, + "commit_id": null, + "commit_url": null, + "created_at": "2018-12-04T13:51:24Z", + "event": "comment_deleted", + "id": 2004328133, + "node_id": "MDE5OkNvbW1lbnREZWxldGVkRXZlbnQyMDA0MzI4MTMz", + "url": "https://api.github.com/repos/spring-projects/spring-boot/issues/events/2004328133" } ]