{"action":"created","comment":{"url":"https://api.github.com/repos/graalvm/truffleruby/pulls/comments/132448788","pull_request_review_id":55526624,"id":132448788,"diff_hunk":"@@ -0,0 +1,376 @@\n+/*\n+ * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. This\n+ * code is released under a tri EPL/GPL/LGPL license. You can use it,\n+ * redistribute it and/or modify it under the terms of the:\n+ *\n+ * Eclipse Public License version 1.0\n+ * GNU General Public License version 2\n+ * GNU Lesser General Public License version 2.1\n+ */\n+package org.truffleruby.integration;\n+\n+import org.graalvm.options.OptionDescriptor;\n+import org.graalvm.polyglot.Context;\n+import org.graalvm.polyglot.Engine;\n+import org.graalvm.polyglot.PolyglotException;\n+import org.graalvm.polyglot.Source;\n+import org.graalvm.polyglot.Value;\n+import org.graalvm.polyglot.proxy.Proxy;\n+import org.graalvm.polyglot.proxy.ProxyExecutable;\n+import org.graalvm.polyglot.proxy.ProxyObject;\n+import org.junit.Assert;\n+import org.junit.Before;\n+import org.junit.Ignore;\n+import org.junit.Test;\n+\n+import java.io.File;\n+import java.io.IOException;\n+import java.util.HashMap;\n+import java.util.Map;\n+\n+import static org.junit.Assert.assertEquals;\n+import static org.junit.Assert.assertNotNull;\n+import static org.junit.Assert.assertSame;\n+import static org.junit.Assert.assertTrue;\n+import static org.junit.Assert.fail;\n+\n+public class RubyBasicTest {\n+\n+    private Context context;\n+\n+    @Before\n+    public void before() {\n+        context = Context.create(\"ruby\");\n+    }\n+\n+    // ACCESS GUEST LANGUAGE DATASTRUCTUES\n+\n+    private Value eval(String code) {\n+        return context.eval(\"ruby\", code);\n+    }\n+\n+    @Test\n+    public void testReadArray() {\n+        Value value = eval(\"[42,2,3]\");\n+        assertEquals(42, value.getArrayElement(0).asInt());\n+    }\n+\n+    @Test\n+    public void testIterateArray() {\n+        Value value = eval(\"[42,43,44]\");\n+        for (int i = 0; i < value.getArraySize(); i++) {\n+            assertEquals(42 + i, value.getArrayElement(i).asInt());\n+        }\n+    }\n+\n+    @Test\n+    public void testWriteArray() {\n+        Value value = eval(\"[1,2,3]\");\n+        value.setArrayElement(0, 42);\n+        assertEquals(42, value.getArrayElement(0).asInt());\n+    }\n+\n+    @Test\n+    public void testExecuteFunction() {\n+        Value value = eval(\"proc { |a| a }\");\n+\n+        assertEquals(42, value.execute(42).asInt());\n+    }\n+\n+    @Test\n+    public void testIsNull() {\n+        assertTrue(eval(\"nil\").isNull());\n+    }\n+\n+    @Test\n+    public void testReadMember() {\n+        Value value = eval(\"a = Truffle::Interop.object_literal; a.foo = 42; a\");\n+        assertEquals(42, value.getMember(\"foo\").asInt());\n+    }\n+\n+    @Test\n+    public void testWriteMember() {\n+\n+        Value value = eval(\"a = Truffle::Interop.object_literal; a.foo = 1; a\");\n+        value.putMember(\"foo\", 42);\n+        assertEquals(42, value.getMember(\"foo\").asInt());\n+    }\n+\n+    @Test\n+    public void testReadAllMembers() {\n+\n+        Value value = eval(\"a = Truffle::Interop.object_literal(a: 42, b: 43, c: 44); a\");\n+        int index = 0;\n+        for (String memberKey : value.getMemberKeys()) {\n+            assertEquals(42 + index, value.getMember(memberKey).asInt());\n+            index++;\n+        }\n+    }\n+\n+    @Ignore(\"GR-5515 incoming foreign writes aren't checking their caches\")\n+    @Test\n+    public void testWriteAllMembers() {\n+\n+        Value value = eval(\"a = Truffle::Interop.object_literal(a: 1, b: 2, c: 3); a\");\n+        int index = 0;\n+        for (String memberKey : value.getMemberKeys()) {\n+            value.putMember(memberKey, 42 + index);\n+            index++;\n+        }\n+        index = 0;\n+        for (String memberKey : value.getMemberKeys()) {\n+            assertEquals(42 + index, value.getMember(memberKey).asInt());\n+            index++;\n+        }\n+    }\n+\n+    @Test\n+    public void testInvokeFunction() {\n+\n+        Value value = eval(\"a = Truffle::Interop.object_literal; a.foo = proc { |a| a }; a\");\n+        assertEquals(42, value.getMember(\"foo\").execute(42).asInt());\n+    }\n+\n+    // ACCESS DYNAMIC HOST LANUGAGE DATASTRUCTURES IN GUEST LANGUAGE\n+\n+    @Test\n+    public void testJavaExecutable() {\n+        Value value = eval(\"proc { |a| a.call }\");\n+\n+        assertEquals(42, value.execute(new ProxyExecutable() {\n+            public Object execute(Value... t) {\n+                return 42;\n+            }\n+        }).asInt());\n+    }\n+\n+    @Test\n+    public void testJavaReadMember() {\n+        Value value = eval(\"proc { |a| a.a }\");\n+\n+        Map<String, Object> values = new HashMap<>();\n+        values.put(\"a\", 42);\n+\n+        assertEquals(42, value.execute(ProxyObject.fromMap(values)).asInt());\n+    }\n+\n+    @Test\n+    public void testJavaWriteMember() {\n+        Value value = eval(\"proc { |a| a.a = 42 }\");\n+\n+        Map<String, Object> values = new HashMap<>();\n+        values.put(\"a\", 1);\n+\n+        ProxyObject mapObject = ProxyObject.fromMap(values);\n+        value.execute(mapObject);\n+        assertEquals(42, ((Value) values.get(\"a\")).asInt());\n+    }\n+\n+    @Ignore(\"GR-5516 we have no mechanism to instantiate polyglot Java classes\")\n+    @Test\n+    public void testJavaNewInstance() {\n+        Value value = eval(\"proc { |a| a.new }\");\n+\n+        HashMap<?, ?> map = value.execute(HashMap.class).asHostObject();\n+        assertNotNull(map);\n+    }\n+\n+    // ACCESS STATIC HOST LANGUAGE DATASTRUCTURES IN GUEST LANGUAGE\n+\n+    public static class MyJavaClass {\n+        public int foobar() {\n+            return 42;\n+        }\n+    }\n+\n+    @Test\n+    public void testJavaIdentityPreservation() {\n+        Value value = eval(\"proc { |a| a }\");\n+\n+        MyJavaClass myValue = new MyJavaClass();\n+        MyJavaClass myValue2 = value.execute(myValue).asHostObject();\n+\n+        assertSame(myValue, myValue2);\n+    }\n+\n+    @Test\n+    public void testPassJavaFunctionAsClojure() {\n+        Value value = eval(\"proc { |a| a.call }\");\n+\n+        assertEquals(42, value.execute((ProxyExecutable) (v) -> 42).asInt());\n+    }\n+\n+    public static int staticFunction() {\n+        return 42;\n+    }\n+\n+    // how to eval examples\n+\n+    @Test\n+    public void testEvalWithLanguageAndString() {\n+        assertEquals(42, eval(\"42\").asInt());\n+    }\n+\n+    @Test\n+    public void testEvalWithLanguageAndSource() {\n+        assertEquals(42, context.eval(Source.create(\"ruby\", \"42\")).asInt());\n+    }\n+\n+    // interop between multiple contexts\n+\n+    @Test\n+    public void testCreateMultipleContextsSameRuntime() {\n+        Engine e = Engine.create();\n+        Context context1 = Context.newBuilder(\"ruby\").engine(e).build();\n+        Context context2 = Context.newBuilder(\"ruby\").engine(e).build();\n+\n+        Value value1 = context1.eval(\"ruby\", \"proc { |a| 42 }\");\n+        Value value2 = context2.eval(\"ruby\", \"proc { |a| a.call }\");\n+\n+        assertEquals(42, value2.execute(value1).asInt());\n+    }\n+\n+    @Test\n+    public void testCreateMultipleContextsDifferentRuntime() {\n+        Context context1 = Context.create(\"ruby\");\n+        Context context2 = Context.create(\"ruby\");\n+\n+        Value value1 = context1.eval(\"ruby\", \"proc { |a| 42 }\");\n+        Value value2 = context2.eval(\"ruby\", \"proc { |a| a.call }\");\n+\n+        try {\n+            value2.execute(value1);\n+            assert false;\n+        } catch (IllegalArgumentException e) {\n+            // error expected. not allowed to pass values between runtimes\n+        }\n+    }\n+\n+    // Contexts and runtimes are auto-closable\n+\n+    // Context variable and lookup\n+\n+    @Test\n+    public void testLookup() {\n+        context.eval(\"ruby\", \"def foo(f); f; end\");\n+\n+        Value foo = context.lookup(\"ruby\", \"foo\");\n+        Proxy proxy = new Proxy() {\n+        };\n+        Assert.assertSame(proxy, foo.execute(proxy).asHostObject());\n+    }\n+\n+    @Test\n+    public void testAccessFieldInGlobal() {\n+        // Modified from JS, as our methods aren't members\n+\n+        Context rubyContext = Context.create(\"ruby\");\n+        rubyContext.eval(\"ruby\", \"Foo = Truffle::Interop.object_literal(a: 42)\");\n+\n+        // set context symbol\n+        Assert.assertEquals(42, rubyContext.lookup(\"ruby\", \"Foo\").getMember(\"a\").asInt());\n+    }\n+\n+    // polyglot context tests\n+\n+    @Test\n+    public void testPolyglotImportExport() {\n+        Context context = Context.create();\n+        context.eval(\"ruby\", \"Truffle::Interop.export('foo', proc { 42 });\");\n+        assertEquals(42, context.importSymbol(\"foo\").execute().asInt());\n+        Proxy barProxy = new Proxy() {\n+        };\n+        context.exportSymbol(\"bar\", barProxy);\n+        assertSame(barProxy, context.eval(\"ruby\", \"Truffle::Interop.import('bar')\").asHostObject());\n+\n+        context.exportSymbol(\"bar\", null);\n+        assertTrue(context.eval(\"ruby\", \"Truffle::Interop.import('bar')\").isNull());\n+    }\n+\n+    // test Java interop\n+\n+    @Ignore(\"GR-5517 GR-5518 we don't seem to have anything to read allowHostAccess, and our Java classes are boxed differently to polyglot\")\n+    @Test\n+    public void testLookupClassesInLanguages() {\n+        Context rubyContext = Context.newBuilder(\"ruby\").allowHostAccess(false).build();\n+        rubyContext.eval(\"ruby\", \"require 'java'\");\n+        try {\n+            rubyContext.eval(\"ruby\", \"java.util.HashMap\");\n+            // fail();\n+        } catch (PolyglotException e) {\n+            // java classes are not allowed to be accessed by default\n+        }\n+        rubyContext = Context.newBuilder(\"ruby\").allowHostAccess(true).build();\n+        rubyContext.eval(\"ruby\", \"require 'java'\");\n+\n+        assertEquals(HashMap.class, rubyContext.eval(\"ruby\", \"java.util.HashMap\").asHostObject());\n+    }\n+\n+    @Test\n+    public void testQuitting() {\n+        Context ruby = Context.create(\"ruby\");\n+\n+        try {\n+            ruby.eval(\"ruby\", \"exit 42\");\n+        } catch (PolyglotException e) {\n+            Assert.assertTrue(e.isExit());\n+            Assert.assertEquals(42, e.getExitStatus());\n+        }\n+    }\n+\n+    // SECURITY\n+\n+    @Test\n+    public void testPassValuesBetweenEngines() {\n+        Context c1 = Context.create(\"ruby\");\n+        Context c2 = Context.create(\"ruby\");\n+\n+        try {\n+            c1.eval(\"ruby\", \"proc { |a| a }\").execute(c2.eval(\"ruby\", \"42\"));\n+            fail();\n+        } catch (IllegalArgumentException e) {\n+        }\n+    }\n+\n+    @SuppressWarnings(\"try\")\n+    @Test\n+    public void testDisableSandbox() {\n+        // TODO\n+    }\n+\n+    @Test\n+    public void testAccessLanguageFromOtherContext() {\n+        Context rubyContext = Context.create(\"ruby\");\n+        try {\n+            rubyContext.eval(\"ruby\", \"Interop.eval('R', 'c(1,2,3)')\");\n+            fail();\n+        } catch (PolyglotException e) {\n+            // should not have access\n+        }\n+    }\n+\n+    @Test\n+    public void testDetectRubyFile() throws IOException {\n+        File file = File.createTempFile(\"ruby-detection\", null);","path":"src/test/java/org/truffleruby/integration/RubyBasicTest.java","position":354,"original_position":354,"commit_id":"741bdf379ebf6bbf90d751c640365d8fc1a2f940","original_commit_id":"741bdf379ebf6bbf90d751c640365d8fc1a2f940","user":{"login":"eregon","id":168854,"avatar_url":"https://avatars2.githubusercontent.com/u/168854?v=4","gravatar_id":"","url":"https://api.github.com/users/eregon","html_url":"https://github.com/eregon","followers_url":"https://api.github.com/users/eregon/followers","following_url":"https://api.github.com/users/eregon/following{/other_user}","gists_url":"https://api.github.com/users/eregon/gists{/gist_id}","starred_url":"https://api.github.com/users/eregon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eregon/subscriptions","organizations_url":"https://api.github.com/users/eregon/orgs","repos_url":"https://api.github.com/users/eregon/repos","events_url":"https://api.github.com/users/eregon/events{/privacy}","received_events_url":"https://api.github.com/users/eregon/received_events","type":"User","site_admin":false},"body":"Using `\".rb\"` for the 2nd (suffix) argument should be enough, no renaming.","created_at":"2017-08-10T13:15:32Z","updated_at":"2017-08-10T13:16:42Z","html_url":"https://github.com/graalvm/truffleruby/pull/409#discussion_r132448788","pull_request_url":"https://api.github.com/repos/graalvm/truffleruby/pulls/409","_links":{"self":{"href":"https://api.github.com/repos/graalvm/truffleruby/pulls/comments/132448788"},"html":{"href":"https://github.com/graalvm/truffleruby/pull/409#discussion_r132448788"},"pull_request":{"href":"https://api.github.com/repos/graalvm/truffleruby/pulls/409"}}},"pull_request":{"url":"https://api.github.com/repos/graalvm/truffleruby/pulls/409","id":134987988,"html_url":"https://github.com/graalvm/truffleruby/pull/409","diff_url":"https://github.com/graalvm/truffleruby/pull/409.diff","patch_url":"https://github.com/graalvm/truffleruby/pull/409.patch","issue_url":"https://api.github.com/repos/graalvm/truffleruby/issues/409","number":409,"state":"open","locked":false,"title":"GraalSDK integration tests and work to support them","user":{"login":"chrisseaton","id":341094,"avatar_url":"https://avatars2.githubusercontent.com/u/341094?v=4","gravatar_id":"","url":"https://api.github.com/users/chrisseaton","html_url":"https://github.com/chrisseaton","followers_url":"https://api.github.com/users/chrisseaton/followers","following_url":"https://api.github.com/users/chrisseaton/following{/other_user}","gists_url":"https://api.github.com/users/chrisseaton/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisseaton/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisseaton/subscriptions","organizations_url":"https://api.github.com/users/chrisseaton/orgs","repos_url":"https://api.github.com/users/chrisseaton/repos","events_url":"https://api.github.com/users/chrisseaton/events{/privacy}","received_events_url":"https://api.github.com/users/chrisseaton/received_events","type":"User","site_admin":false},"body":"","created_at":"2017-08-09T20:54:57Z","updated_at":"2017-08-10T13:16:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b6e50ef3d09739275a2644975a33ecbc4221f078","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/graalvm/truffleruby/pulls/409/commits","review_comments_url":"https://api.github.com/repos/graalvm/truffleruby/pulls/409/comments","review_comment_url":"https://api.github.com/repos/graalvm/truffleruby/pulls/comments{/number}","comments_url":"https://api.github.com/repos/graalvm/truffleruby/issues/409/comments","statuses_url":"https://api.github.com/repos/graalvm/truffleruby/statuses/741bdf379ebf6bbf90d751c640365d8fc1a2f940","head":{"label":"graalvm:integration-tests","ref":"integration-tests","sha":"741bdf379ebf6bbf90d751c640365d8fc1a2f940","user":{"login":"graalvm","id":10176827,"avatar_url":"https://avatars3.githubusercontent.com/u/10176827?v=4","gravatar_id":"","url":"https://api.github.com/users/graalvm","html_url":"https://github.com/graalvm","followers_url":"https://api.github.com/users/graalvm/followers","following_url":"https://api.github.com/users/graalvm/following{/other_user}","gists_url":"https://api.github.com/users/graalvm/gists{/gist_id}","starred_url":"https://api.github.com/users/graalvm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graalvm/subscriptions","organizations_url":"https://api.github.com/users/graalvm/orgs","repos_url":"https://api.github.com/users/graalvm/repos","events_url":"https://api.github.com/users/graalvm/events{/privacy}","received_events_url":"https://api.github.com/users/graalvm/received_events","type":"Organization","site_admin":false},"repo":{"id":51164398,"name":"truffleruby","full_name":"graalvm/truffleruby","owner":{"login":"graalvm","id":10176827,"avatar_url":"https://avatars3.githubusercontent.com/u/10176827?v=4","gravatar_id":"","url":"https://api.github.com/users/graalvm","html_url":"https://github.com/graalvm","followers_url":"https://api.github.com/users/graalvm/followers","following_url":"https://api.github.com/users/graalvm/following{/other_user}","gists_url":"https://api.github.com/users/graalvm/gists{/gist_id}","starred_url":"https://api.github.com/users/graalvm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graalvm/subscriptions","organizations_url":"https://api.github.com/users/graalvm/orgs","repos_url":"https://api.github.com/users/graalvm/repos","events_url":"https://api.github.com/users/graalvm/events{/privacy}","received_events_url":"https://api.github.com/users/graalvm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/graalvm/truffleruby","description":"A high performance implementation of the Ruby programming language. Built on the GraalVM by Oracle Labs.","fork":false,"url":"https://api.github.com/repos/graalvm/truffleruby","forks_url":"https://api.github.com/repos/graalvm/truffleruby/forks","keys_url":"https://api.github.com/repos/graalvm/truffleruby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/graalvm/truffleruby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/graalvm/truffleruby/teams","hooks_url":"https://api.github.com/repos/graalvm/truffleruby/hooks","issue_events_url":"https://api.github.com/repos/graalvm/truffleruby/issues/events{/number}","events_url":"https://api.github.com/repos/graalvm/truffleruby/events","assignees_url":"https://api.github.com/repos/graalvm/truffleruby/assignees{/user}","branches_url":"https://api.github.com/repos/graalvm/truffleruby/branches{/branch}","tags_url":"https://api.github.com/repos/graalvm/truffleruby/tags","blobs_url":"https://api.github.com/repos/graalvm/truffleruby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/graalvm/truffleruby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/graalvm/truffleruby/git/refs{/sha}","trees_url":"https://api.github.com/repos/graalvm/truffleruby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/graalvm/truffleruby/statuses/{sha}","languages_url":"https://api.github.com/repos/graalvm/truffleruby/languages","stargazers_url":"https://api.github.com/repos/graalvm/truffleruby/stargazers","contributors_url":"https://api.github.com/repos/graalvm/truffleruby/contributors","subscribers_url":"https://api.github.com/repos/graalvm/truffleruby/subscribers","subscription_url":"https://api.github.com/repos/graalvm/truffleruby/subscription","commits_url":"https://api.github.com/repos/graalvm/truffleruby/commits{/sha}","git_commits_url":"https://api.github.com/repos/graalvm/truffleruby/git/commits{/sha}","comments_url":"https://api.github.com/repos/graalvm/truffleruby/comments{/number}","issue_comment_url":"https://api.github.com/repos/graalvm/truffleruby/issues/comments{/number}","contents_url":"https://api.github.com/repos/graalvm/truffleruby/contents/{+path}","compare_url":"https://api.github.com/repos/graalvm/truffleruby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/graalvm/truffleruby/merges","archive_url":"https://api.github.com/repos/graalvm/truffleruby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/graalvm/truffleruby/downloads","issues_url":"https://api.github.com/repos/graalvm/truffleruby/issues{/number}","pulls_url":"https://api.github.com/repos/graalvm/truffleruby/pulls{/number}","milestones_url":"https://api.github.com/repos/graalvm/truffleruby/milestones{/number}","notifications_url":"https://api.github.com/repos/graalvm/truffleruby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/graalvm/truffleruby/labels{/name}","releases_url":"https://api.github.com/repos/graalvm/truffleruby/releases{/id}","deployments_url":"https://api.github.com/repos/graalvm/truffleruby/deployments","created_at":"2016-02-05T18:03:11Z","updated_at":"2017-08-10T07:47:02Z","pushed_at":"2017-08-10T12:22:50Z","git_url":"git://github.com/graalvm/truffleruby.git","ssh_url":"git@github.com:graalvm/truffleruby.git","clone_url":"https://github.com/graalvm/truffleruby.git","svn_url":"https://github.com/graalvm/truffleruby","homepage":"","size":220826,"stargazers_count":753,"watchers_count":753,"language":"Ruby","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":32,"mirror_url":null,"open_issues_count":8,"forks":32,"open_issues":8,"watchers":753,"default_branch":"master"}},"base":{"label":"graalvm:master","ref":"master","sha":"4280f819e30c7aec78bd141850ece00270afb464","user":{"login":"graalvm","id":10176827,"avatar_url":"https://avatars3.githubusercontent.com/u/10176827?v=4","gravatar_id":"","url":"https://api.github.com/users/graalvm","html_url":"https://github.com/graalvm","followers_url":"https://api.github.com/users/graalvm/followers","following_url":"https://api.github.com/users/graalvm/following{/other_user}","gists_url":"https://api.github.com/users/graalvm/gists{/gist_id}","starred_url":"https://api.github.com/users/graalvm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graalvm/subscriptions","organizations_url":"https://api.github.com/users/graalvm/orgs","repos_url":"https://api.github.com/users/graalvm/repos","events_url":"https://api.github.com/users/graalvm/events{/privacy}","received_events_url":"https://api.github.com/users/graalvm/received_events","type":"Organization","site_admin":false},"repo":{"id":51164398,"name":"truffleruby","full_name":"graalvm/truffleruby","owner":{"login":"graalvm","id":10176827,"avatar_url":"https://avatars3.githubusercontent.com/u/10176827?v=4","gravatar_id":"","url":"https://api.github.com/users/graalvm","html_url":"https://github.com/graalvm","followers_url":"https://api.github.com/users/graalvm/followers","following_url":"https://api.github.com/users/graalvm/following{/other_user}","gists_url":"https://api.github.com/users/graalvm/gists{/gist_id}","starred_url":"https://api.github.com/users/graalvm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/graalvm/subscriptions","organizations_url":"https://api.github.com/users/graalvm/orgs","repos_url":"https://api.github.com/users/graalvm/repos","events_url":"https://api.github.com/users/graalvm/events{/privacy}","received_events_url":"https://api.github.com/users/graalvm/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/graalvm/truffleruby","description":"A high performance implementation of the Ruby programming language. Built on the GraalVM by Oracle Labs.","fork":false,"url":"https://api.github.com/repos/graalvm/truffleruby","forks_url":"https://api.github.com/repos/graalvm/truffleruby/forks","keys_url":"https://api.github.com/repos/graalvm/truffleruby/keys{/key_id}","collaborators_url":"https://api.github.com/repos/graalvm/truffleruby/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/graalvm/truffleruby/teams","hooks_url":"https://api.github.com/repos/graalvm/truffleruby/hooks","issue_events_url":"https://api.github.com/repos/graalvm/truffleruby/issues/events{/number}","events_url":"https://api.github.com/repos/graalvm/truffleruby/events","assignees_url":"https://api.github.com/repos/graalvm/truffleruby/assignees{/user}","branches_url":"https://api.github.com/repos/graalvm/truffleruby/branches{/branch}","tags_url":"https://api.github.com/repos/graalvm/truffleruby/tags","blobs_url":"https://api.github.com/repos/graalvm/truffleruby/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/graalvm/truffleruby/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/graalvm/truffleruby/git/refs{/sha}","trees_url":"https://api.github.com/repos/graalvm/truffleruby/git/trees{/sha}","statuses_url":"https://api.github.com/repos/graalvm/truffleruby/statuses/{sha}","languages_url":"https://api.github.com/repos/graalvm/truffleruby/languages","stargazers_url":"https://api.github.com/repos/graalvm/truffleruby/stargazers","contributors_url":"https://api.github.com/repos/graalvm/truffleruby/contributors","subscribers_url":"https://api.github.com/repos/graalvm/truffleruby/subscribers","subscription_url":"https://api.github.com/repos/graalvm/truffleruby/subscription","commits_url":"https://api.github.com/repos/graalvm/truffleruby/commits{/sha}","git_commits_url":"https://api.github.com/repos/graalvm/truffleruby/git/commits{/sha}","comments_url":"https://api.github.com/repos/graalvm/truffleruby/comments{/number}","issue_comment_url":"https://api.github.com/repos/graalvm/truffleruby/issues/comments{/number}","contents_url":"https://api.github.com/repos/graalvm/truffleruby/contents/{+path}","compare_url":"https://api.github.com/repos/graalvm/truffleruby/compare/{base}...{head}","merges_url":"https://api.github.com/repos/graalvm/truffleruby/merges","archive_url":"https://api.github.com/repos/graalvm/truffleruby/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/graalvm/truffleruby/downloads","issues_url":"https://api.github.com/repos/graalvm/truffleruby/issues{/number}","pulls_url":"https://api.github.com/repos/graalvm/truffleruby/pulls{/number}","milestones_url":"https://api.github.com/repos/graalvm/truffleruby/milestones{/number}","notifications_url":"https://api.github.com/repos/graalvm/truffleruby/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/graalvm/truffleruby/labels{/name}","releases_url":"https://api.github.com/repos/graalvm/truffleruby/releases{/id}","deployments_url":"https://api.github.com/repos/graalvm/truffleruby/deployments","created_at":"2016-02-05T18:03:11Z","updated_at":"2017-08-10T07:47:02Z","pushed_at":"2017-08-10T12:22:50Z","git_url":"git://github.com/graalvm/truffleruby.git","ssh_url":"git@github.com:graalvm/truffleruby.git","clone_url":"https://github.com/graalvm/truffleruby.git","svn_url":"https://github.com/graalvm/truffleruby","homepage":"","size":220826,"stargazers_count":753,"watchers_count":753,"language":"Ruby","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":32,"mirror_url":null,"open_issues_count":8,"forks":32,"open_issues":8,"watchers":753,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/graalvm/truffleruby/pulls/409"},"html":{"href":"https://github.com/graalvm/truffleruby/pull/409"},"issue":{"href":"https://api.github.com/repos/graalvm/truffleruby/issues/409"},"comments":{"href":"https://api.github.com/repos/graalvm/truffleruby/issues/409/comments"},"review_comments":{"href":"https://api.github.com/repos/graalvm/truffleruby/pulls/409/comments"},"review_comment":{"href":"https://api.github.com/repos/graalvm/truffleruby/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/graalvm/truffleruby/pulls/409/commits"},"statuses":{"href":"https://api.github.com/repos/graalvm/truffleruby/statuses/741bdf379ebf6bbf90d751c640365d8fc1a2f940"}}}}
{"actor":{"display_login":"eregon"}}