{"action":"created","comment":{"url":"https://api.github.com/repos/apache/groovy/pulls/comments/70920341","id":70920341,"diff_hunk":"@@ -0,0 +1,536 @@\n+/*\n+ * Licensed to the Apache Software Foundation (ASF) under one\n+ * or more contributor license agreements.  See the NOTICE file\n+ * distributed with this work for additional information\n+ * regarding copyright ownership.  The ASF licenses this file\n+ * to you under the Apache License, Version 2.0 (the\n+ * \"License\"); you may not use this file except in compliance\n+ * with the License.  You may obtain a copy of the License at\n+ *\n+ *   http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing,\n+ * software distributed under the License is distributed on an\n+ * \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n+ * KIND, either express or implied.  See the License for the\n+ * specific language governing permissions and limitations\n+ * under the License.\n+ *\n+ */\n+package groovy.lang;\n+\n+import org.codehaus.groovy.runtime.InvokerHelper;\n+import org.codehaus.groovy.runtime.IteratorClosureAdapter;\n+\n+import java.math.BigDecimal;\n+import java.math.BigInteger;\n+import java.util.AbstractList;\n+import java.util.Iterator;\n+import java.util.List;\n+\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareEqual;\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareGreaterThan;\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareGreaterThanEqual;\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareLessThan;\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareLessThanEqual;\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareNotEqual;\n+import static org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareTo;\n+import static org.codehaus.groovy.runtime.dgmimpl.NumberNumberMinus.minus;\n+import static org.codehaus.groovy.runtime.dgmimpl.NumberNumberPlus.plus;\n+import static org.codehaus.groovy.runtime.dgmimpl.NumberNumberMultiply.multiply;\n+\n+/**\n+ * Represents an inclusive list of Numbers from a value to a value with a particular step size.\n+ */\n+public class NumberRange extends AbstractList<Comparable> implements Range<Comparable> {\n+\n+    /**\n+     * The first value in the range.\n+     */\n+    private final Comparable from;\n+\n+    /**\n+     * The last value in the range.\n+     */\n+    private final Comparable to;\n+\n+    /**\n+     * The step size in the range.\n+     */\n+    private final Number stepSize;\n+\n+    /**\n+     * The cached size, or -1 if not yet computed\n+     */\n+    private int size = -1;\n+\n+    /**\n+     * <code>true</code> if the range counts backwards from <code>to</code> to <code>from</code>.\n+     */\n+    private final boolean reverse;\n+\n+    /**\n+     * <code>true</code> if the range includes the upper bound.\n+     */\n+    private final boolean inclusive;\n+\n+    /**\n+     * Creates an inclusive {@link NumberRange} with step size 1.\n+     * Creates a reversed range if <code>from</code> &lt; <code>to</code>.\n+     *\n+     * @param from the first value in the range\n+     * @param to   the last value in the range\n+     */\n+    public <T extends Number & Comparable, U extends Number & Comparable>\n+    NumberRange(T from, U to) {\n+        this(from, to, null, true);\n+    }\n+\n+    /**\n+     * Creates a new {@link NumberRange} with step size 1.\n+     * Creates a reversed range if <code>from</code> &lt; <code>to</code>.\n+     *\n+     * @param from start of the range\n+     * @param to   end of the range\n+     * @param inclusive whether the range is inclusive\n+     */\n+    public <T extends Number & Comparable, U extends Number & Comparable>\n+    NumberRange(T from, U to, boolean inclusive) {\n+        this(from, to, null, inclusive);\n+    }\n+\n+    /**\n+     * Creates an inclusive {@link NumberRange}.\n+     * Creates a reversed range if <code>from</code> &lt; <code>to</code>.\n+     *\n+     * @param from start of the range\n+     * @param to   end of the range\n+     * @param stepSize the gap between discrete elements in the range\n+     */\n+    public <T extends Number & Comparable, U extends Number & Comparable, V extends\n+            Number & Comparable<? super Number>>\n+    NumberRange(T from, U to, V stepSize) {\n+        this(from, to, stepSize, true);\n+    }\n+\n+    /**\n+     * Creates a {@link NumberRange}.\n+     * Creates a reversed range if <code>from</code> &lt; <code>to</code>.\n+     *\n+     * @param from start of the range\n+     * @param to   end of the range\n+     * @param stepSize the gap between discrete elements in the range\n+     * @param inclusive whether the range is inclusive\n+     */\n+    public <T extends Number & Comparable, U extends Number & Comparable, V extends\n+            Number & Comparable>\n+    NumberRange(T from, U to, V stepSize, boolean inclusive) {\n+        if (from == null) {\n+            throw new IllegalArgumentException(\"Must specify a non-null value for the 'from' index in a Range\");\n+        }\n+        if (to == null) {\n+            throw new IllegalArgumentException(\"Must specify a non-null value for the 'to' index in a Range\");\n+        }\n+        reverse = areReversed(from, to);\n+        Number tempFrom;\n+        Number tempTo;\n+        if (reverse) {\n+            tempFrom = to;\n+            tempTo = from;\n+        } else {\n+            tempFrom = from;\n+            tempTo = to;\n+        }\n+        if (tempFrom instanceof Short) {\n+            tempFrom = tempFrom.intValue();\n+        } else if (tempFrom instanceof Float) {\n+            tempFrom = tempFrom.doubleValue();\n+        }\n+        if (tempTo instanceof Short) {\n+            tempTo = tempTo.intValue();\n+        } else if (tempTo instanceof Float) {\n+            tempTo = tempTo.doubleValue();\n+        }\n+\n+        if (tempFrom instanceof Integer && tempTo instanceof Long) {\n+            tempFrom = tempFrom.longValue();\n+        } else if (tempTo instanceof Integer && tempFrom instanceof Long) {\n+            tempTo = tempTo.longValue();\n+        }\n+\n+        this.from = (Comparable) tempFrom;\n+        this.to = (Comparable) tempTo;\n+        this.stepSize = stepSize == null ? 1 : stepSize;\n+        this.inclusive = inclusive;\n+    }\n+\n+    /**\n+     * For a NumberRange with step size 1, creates a new NumberRange with the same\n+     * <code>from</code> and <code>to</code> as this NumberRange\n+     * but with a step size of <code>stepSize</code>.\n+     *\n+     * @param stepSize the desired step size\n+     * @return a new NumberRange\n+     */\n+    public <T extends Number & Comparable> NumberRange by(T stepSize) {\n+        if (!Integer.valueOf(1).equals(this.stepSize)) {\n+            throw new IllegalStateException(\"by only allowed on ranges with original stepSize = 1 but found \" + this.stepSize);\n+        }\n+        return new NumberRange(comparableNumber(from), comparableNumber(to), stepSize, inclusive);\n+    }\n+\n+    @SuppressWarnings(\"unchecked\")\n+    /* package private */ static <T extends Number & Comparable> T comparableNumber(Comparable c) {\n+        return (T) c;\n+    }\n+\n+    @SuppressWarnings(\"unchecked\")\n+    /* package private */ static <T extends Number & Comparable> T comparableNumber(Number n) {\n+        return (T) n;\n+    }\n+\n+    private static boolean areReversed(Number from, Number to) {\n+        try {\n+            return compareGreaterThan(from, to);\n+        } catch (ClassCastException cce) {\n+            throw new IllegalArgumentException(\"Unable to create range due to incompatible types: \" + from.getClass().getSimpleName() + \"..\" + to.getClass().getSimpleName() + \" (possible missing brackets around range?)\", cce);\n+        }\n+    }\n+\n+    public boolean equals(Object that) {\n+        return (that instanceof NumberRange) ? equals((NumberRange) that) : super.equals(that);\n+    }\n+\n+    /**\n+     * Compares an {@link NumberRange} to another {@link NumberRange}.\n+     *\n+     * @param that the object to check equality with\n+     * @return <code>true</code> if the ranges are equal\n+     */\n+    public boolean equals(NumberRange that) {","path":"src/main/groovy/lang/NumberRange.java","position":null,"original_position":210,"commit_id":"cb71a8f516e27ffa2c999330e0d0910cec08b983","original_commit_id":"114509be60dbf7556bc6675b49b9fc0e507e4194","user":{"login":"paulk-asert","id":280016,"avatar_url":"https://avatars.githubusercontent.com/u/280016?v=3","gravatar_id":"","url":"https://api.github.com/users/paulk-asert","html_url":"https://github.com/paulk-asert","followers_url":"https://api.github.com/users/paulk-asert/followers","following_url":"https://api.github.com/users/paulk-asert/following{/other_user}","gists_url":"https://api.github.com/users/paulk-asert/gists{/gist_id}","starred_url":"https://api.github.com/users/paulk-asert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulk-asert/subscriptions","organizations_url":"https://api.github.com/users/paulk-asert/orgs","repos_url":"https://api.github.com/users/paulk-asert/repos","events_url":"https://api.github.com/users/paulk-asert/events{/privacy}","received_events_url":"https://api.github.com/users/paulk-asert/received_events","type":"User","site_admin":false},"body":"I would favor the current implementation for hashCode compared with returning a constant value. I think the common case would be to use 1..3 and [1, 2, 3] interchangeably which is what the current implementation allows (and honors the equals/hashCode contract). It's only when you start wanting to treat integer 1 and some other Number 1 as the same where things are a little strange wrt that contract.","created_at":"2016-07-15T04:28:54Z","updated_at":"2016-07-15T04:28:54Z","html_url":"https://github.com/apache/groovy/pull/366#discussion_r70920341","pull_request_url":"https://api.github.com/repos/apache/groovy/pulls/366","_links":{"self":{"href":"https://api.github.com/repos/apache/groovy/pulls/comments/70920341"},"html":{"href":"https://github.com/apache/groovy/pull/366#discussion_r70920341"},"pull_request":{"href":"https://api.github.com/repos/apache/groovy/pulls/366"}}},"pull_request":{"url":"https://api.github.com/repos/apache/groovy/pulls/366","id":77257145,"html_url":"https://github.com/apache/groovy/pull/366","diff_url":"https://github.com/apache/groovy/pull/366.diff","patch_url":"https://github.com/apache/groovy/pull/366.patch","issue_url":"https://api.github.com/repos/apache/groovy/issues/366","number":366,"state":"open","locked":false,"title":"GROOVY-7877: The Range abstraction could support numeric ranges where…","user":{"login":"paulk-asert","id":280016,"avatar_url":"https://avatars.githubusercontent.com/u/280016?v=3","gravatar_id":"","url":"https://api.github.com/users/paulk-asert","html_url":"https://github.com/paulk-asert","followers_url":"https://api.github.com/users/paulk-asert/followers","following_url":"https://api.github.com/users/paulk-asert/following{/other_user}","gists_url":"https://api.github.com/users/paulk-asert/gists{/gist_id}","starred_url":"https://api.github.com/users/paulk-asert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulk-asert/subscriptions","organizations_url":"https://api.github.com/users/paulk-asert/orgs","repos_url":"https://api.github.com/users/paulk-asert/repos","events_url":"https://api.github.com/users/paulk-asert/events{/privacy}","received_events_url":"https://api.github.com/users/paulk-asert/received_events","type":"User","site_admin":false},"body":"… the items in the range differ by some step size different to 1","created_at":"2016-07-13T09:30:13Z","updated_at":"2016-07-15T04:28:54Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e2c53ea3fe992f43622bb2d5308dfe1ebf1ff266","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/apache/groovy/pulls/366/commits","review_comments_url":"https://api.github.com/repos/apache/groovy/pulls/366/comments","review_comment_url":"https://api.github.com/repos/apache/groovy/pulls/comments{/number}","comments_url":"https://api.github.com/repos/apache/groovy/issues/366/comments","statuses_url":"https://api.github.com/repos/apache/groovy/statuses/cb71a8f516e27ffa2c999330e0d0910cec08b983","head":{"label":"paulk-asert:groovy7877b","ref":"groovy7877b","sha":"cb71a8f516e27ffa2c999330e0d0910cec08b983","user":{"login":"paulk-asert","id":280016,"avatar_url":"https://avatars.githubusercontent.com/u/280016?v=3","gravatar_id":"","url":"https://api.github.com/users/paulk-asert","html_url":"https://github.com/paulk-asert","followers_url":"https://api.github.com/users/paulk-asert/followers","following_url":"https://api.github.com/users/paulk-asert/following{/other_user}","gists_url":"https://api.github.com/users/paulk-asert/gists{/gist_id}","starred_url":"https://api.github.com/users/paulk-asert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulk-asert/subscriptions","organizations_url":"https://api.github.com/users/paulk-asert/orgs","repos_url":"https://api.github.com/users/paulk-asert/repos","events_url":"https://api.github.com/users/paulk-asert/events{/privacy}","received_events_url":"https://api.github.com/users/paulk-asert/received_events","type":"User","site_admin":false},"repo":{"id":34248558,"name":"groovy","full_name":"paulk-asert/groovy","owner":{"login":"paulk-asert","id":280016,"avatar_url":"https://avatars.githubusercontent.com/u/280016?v=3","gravatar_id":"","url":"https://api.github.com/users/paulk-asert","html_url":"https://github.com/paulk-asert","followers_url":"https://api.github.com/users/paulk-asert/followers","following_url":"https://api.github.com/users/paulk-asert/following{/other_user}","gists_url":"https://api.github.com/users/paulk-asert/gists{/gist_id}","starred_url":"https://api.github.com/users/paulk-asert/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/paulk-asert/subscriptions","organizations_url":"https://api.github.com/users/paulk-asert/orgs","repos_url":"https://api.github.com/users/paulk-asert/repos","events_url":"https://api.github.com/users/paulk-asert/events{/privacy}","received_events_url":"https://api.github.com/users/paulk-asert/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/paulk-asert/groovy","description":"Mirror of Apache Groovy","fork":true,"url":"https://api.github.com/repos/paulk-asert/groovy","forks_url":"https://api.github.com/repos/paulk-asert/groovy/forks","keys_url":"https://api.github.com/repos/paulk-asert/groovy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/paulk-asert/groovy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/paulk-asert/groovy/teams","hooks_url":"https://api.github.com/repos/paulk-asert/groovy/hooks","issue_events_url":"https://api.github.com/repos/paulk-asert/groovy/issues/events{/number}","events_url":"https://api.github.com/repos/paulk-asert/groovy/events","assignees_url":"https://api.github.com/repos/paulk-asert/groovy/assignees{/user}","branches_url":"https://api.github.com/repos/paulk-asert/groovy/branches{/branch}","tags_url":"https://api.github.com/repos/paulk-asert/groovy/tags","blobs_url":"https://api.github.com/repos/paulk-asert/groovy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/paulk-asert/groovy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/paulk-asert/groovy/git/refs{/sha}","trees_url":"https://api.github.com/repos/paulk-asert/groovy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/paulk-asert/groovy/statuses/{sha}","languages_url":"https://api.github.com/repos/paulk-asert/groovy/languages","stargazers_url":"https://api.github.com/repos/paulk-asert/groovy/stargazers","contributors_url":"https://api.github.com/repos/paulk-asert/groovy/contributors","subscribers_url":"https://api.github.com/repos/paulk-asert/groovy/subscribers","subscription_url":"https://api.github.com/repos/paulk-asert/groovy/subscription","commits_url":"https://api.github.com/repos/paulk-asert/groovy/commits{/sha}","git_commits_url":"https://api.github.com/repos/paulk-asert/groovy/git/commits{/sha}","comments_url":"https://api.github.com/repos/paulk-asert/groovy/comments{/number}","issue_comment_url":"https://api.github.com/repos/paulk-asert/groovy/issues/comments{/number}","contents_url":"https://api.github.com/repos/paulk-asert/groovy/contents/{+path}","compare_url":"https://api.github.com/repos/paulk-asert/groovy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/paulk-asert/groovy/merges","archive_url":"https://api.github.com/repos/paulk-asert/groovy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/paulk-asert/groovy/downloads","issues_url":"https://api.github.com/repos/paulk-asert/groovy/issues{/number}","pulls_url":"https://api.github.com/repos/paulk-asert/groovy/pulls{/number}","milestones_url":"https://api.github.com/repos/paulk-asert/groovy/milestones{/number}","notifications_url":"https://api.github.com/repos/paulk-asert/groovy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/paulk-asert/groovy/labels{/name}","releases_url":"https://api.github.com/repos/paulk-asert/groovy/releases{/id}","deployments_url":"https://api.github.com/repos/paulk-asert/groovy/deployments","created_at":"2015-04-20T08:35:22Z","updated_at":"2016-02-29T19:51:03Z","pushed_at":"2016-07-15T04:12:15Z","git_url":"git://github.com/paulk-asert/groovy.git","ssh_url":"git@github.com:paulk-asert/groovy.git","clone_url":"https://github.com/paulk-asert/groovy.git","svn_url":"https://github.com/paulk-asert/groovy","homepage":"","size":154992,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"apache:master","ref":"master","sha":"c612fe94df7ba871e0618cc0806f1cb23834e394","user":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"repo":{"id":34039690,"name":"groovy","full_name":"apache/groovy","owner":{"login":"apache","id":47359,"avatar_url":"https://avatars.githubusercontent.com/u/47359?v=3","gravatar_id":"","url":"https://api.github.com/users/apache","html_url":"https://github.com/apache","followers_url":"https://api.github.com/users/apache/followers","following_url":"https://api.github.com/users/apache/following{/other_user}","gists_url":"https://api.github.com/users/apache/gists{/gist_id}","starred_url":"https://api.github.com/users/apache/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/apache/subscriptions","organizations_url":"https://api.github.com/users/apache/orgs","repos_url":"https://api.github.com/users/apache/repos","events_url":"https://api.github.com/users/apache/events{/privacy}","received_events_url":"https://api.github.com/users/apache/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/apache/groovy","description":"Mirror of Apache Groovy","fork":false,"url":"https://api.github.com/repos/apache/groovy","forks_url":"https://api.github.com/repos/apache/groovy/forks","keys_url":"https://api.github.com/repos/apache/groovy/keys{/key_id}","collaborators_url":"https://api.github.com/repos/apache/groovy/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/apache/groovy/teams","hooks_url":"https://api.github.com/repos/apache/groovy/hooks","issue_events_url":"https://api.github.com/repos/apache/groovy/issues/events{/number}","events_url":"https://api.github.com/repos/apache/groovy/events","assignees_url":"https://api.github.com/repos/apache/groovy/assignees{/user}","branches_url":"https://api.github.com/repos/apache/groovy/branches{/branch}","tags_url":"https://api.github.com/repos/apache/groovy/tags","blobs_url":"https://api.github.com/repos/apache/groovy/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/apache/groovy/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/apache/groovy/git/refs{/sha}","trees_url":"https://api.github.com/repos/apache/groovy/git/trees{/sha}","statuses_url":"https://api.github.com/repos/apache/groovy/statuses/{sha}","languages_url":"https://api.github.com/repos/apache/groovy/languages","stargazers_url":"https://api.github.com/repos/apache/groovy/stargazers","contributors_url":"https://api.github.com/repos/apache/groovy/contributors","subscribers_url":"https://api.github.com/repos/apache/groovy/subscribers","subscription_url":"https://api.github.com/repos/apache/groovy/subscription","commits_url":"https://api.github.com/repos/apache/groovy/commits{/sha}","git_commits_url":"https://api.github.com/repos/apache/groovy/git/commits{/sha}","comments_url":"https://api.github.com/repos/apache/groovy/comments{/number}","issue_comment_url":"https://api.github.com/repos/apache/groovy/issues/comments{/number}","contents_url":"https://api.github.com/repos/apache/groovy/contents/{+path}","compare_url":"https://api.github.com/repos/apache/groovy/compare/{base}...{head}","merges_url":"https://api.github.com/repos/apache/groovy/merges","archive_url":"https://api.github.com/repos/apache/groovy/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/apache/groovy/downloads","issues_url":"https://api.github.com/repos/apache/groovy/issues{/number}","pulls_url":"https://api.github.com/repos/apache/groovy/pulls{/number}","milestones_url":"https://api.github.com/repos/apache/groovy/milestones{/number}","notifications_url":"https://api.github.com/repos/apache/groovy/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/apache/groovy/labels{/name}","releases_url":"https://api.github.com/repos/apache/groovy/releases{/id}","deployments_url":"https://api.github.com/repos/apache/groovy/deployments","created_at":"2015-04-16T07:00:05Z","updated_at":"2016-07-15T04:07:08Z","pushed_at":"2016-07-15T04:12:15Z","git_url":"git://github.com/apache/groovy.git","ssh_url":"git@github.com:apache/groovy.git","clone_url":"https://github.com/apache/groovy.git","svn_url":"https://github.com/apache/groovy","homepage":"","size":165301,"stargazers_count":1263,"watchers_count":1263,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":465,"mirror_url":"git://git.apache.org/groovy.git","open_issues_count":26,"forks":465,"open_issues":26,"watchers":1263,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/apache/groovy/pulls/366"},"html":{"href":"https://github.com/apache/groovy/pull/366"},"issue":{"href":"https://api.github.com/repos/apache/groovy/issues/366"},"comments":{"href":"https://api.github.com/repos/apache/groovy/issues/366/comments"},"review_comments":{"href":"https://api.github.com/repos/apache/groovy/pulls/366/comments"},"review_comment":{"href":"https://api.github.com/repos/apache/groovy/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/apache/groovy/pulls/366/commits"},"statuses":{"href":"https://api.github.com/repos/apache/groovy/statuses/cb71a8f516e27ffa2c999330e0d0910cec08b983"}}}}
{"actor":{"display_login":"paulk-asert"}}