{"action":"created","comment":{"url":"https://api.github.com/repos/luna/luna-studio/pulls/comments/221577187","pull_request_review_id":160256104,"id":221577187,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyMTU3NzE4Nw==","diff_hunk":"@@ -0,0 +1,142 @@\n+module SpecUtils\n+    ( emptyCodeTemplate\n+    , evalEmp\n+    , noCheck\n+    , normalizeQQ\n+    , runEmp\n+    , runTests\n+    , testCase\n+    , testCaseWithMarkers\n+    , withChannels\n+    , xitWithReason\n+    , module X\n+    ) where\n+\n+\n+import           Control.Concurrent.MVar       (newEmptyMVar)\n+import           Control.Concurrent.STM        (atomically)\n+import           Control.Concurrent.STM.TChan  (newTChan)\n+import           Data.Char                     (isSpace)\n+import           Data.List                     (dropWhileEnd)\n+import qualified Data.Text                     as Text\n+import           Data.Reflection               (Given, give)\n+import qualified Empire.Commands.Graph         as Graph\n+import           Empire.Commands.Library       (createLibrary)\n+import           Control.Exception             (bracket)\n+import           Empire.Data.Graph             (CommandState (CommandState), defaultPMState)\n+import           Empire.Empire                 (CommunicationEnv (CommunicationEnv), Empire, Env\n+                                               , runEmpire)\n+import           Empire.Prelude\n+import qualified Empire.Data.Graph             as Graph\n+import           LunaStudio.Data.GraphLocation (GraphLocation (GraphLocation))\n+import qualified LunaStudio.Data.Node          as Node\n+import           Test.Hspec                    (Arg, Example, Expectation, Spec, SpecWith\n+                                               , around, before_, describe, it, parallel, pendingWith, shouldBe)\n+import           Text.RawString.QQ             (r)\n+\n+import           SpecUtils.Graph               as X\n+    \n+\n+withChannels :: (CommunicationEnv -> IO a) -> IO a\n+withChannels = bracket createChannels (const $ pure ()) where\n+    createChannels = CommunicationEnv \n+        <$> atomically newTChan <*> newEmptyMVar <*> newEmptyMVar\n+\n+runEmp :: CommunicationEnv -> (Given GraphLocation => Empire a) -> IO (a, CommandState Env)\n+runEmp env act = defaultPMState >>= \\pm ->\n+    runEmpire env (CommandState pm def) $ do\n+        let testFile = \"/TestFile\"\n+            topGl    = GraphLocation testFile def\n+        void $ createLibrary (Just testFile) testFile\n+        Graph.loadCode topGl \"def main:\\n    None\"\n+        [node] <- Graph.getNodes topGl\n+        give (topGl |>= (node ^. Node.nodeId)) act\n+\n+evalEmp :: CommunicationEnv -> (Given GraphLocation => Empire a) -> IO a\n+evalEmp env act = fst <$> runEmp env act\n+\n+\n+runTests :: String -> SpecWith CommunicationEnv -> Spec\n+runTests = around withChannels . parallel .: describe\n+\n+xitWithReason :: (HasCallStack, Example a) \n+    => String -> String -> a -> SpecWith (Arg a)\n+xitWithReason label reason action \n+    = before_ (pendingWith reason) $ it label action\n+\n+\n+emptyCodeTemplate :: Text\n+emptyCodeTemplate = [r|\n+import Std.Base\n+\n+def main:\n+    None\n+|]\n+\n+normalizeQQ :: Text -> Text\n+normalizeQQ str = Text.intercalate \"\\n\" $ Text.drop minWs <$> allLines where\n+    trimTrailingSpaces = Text.dropWhileEnd isSpace\n+    trimEmptyLines     = dropWhileEnd Text.null . dropWhile Text.null\n+    indentLength       = Text.length . Text.takeWhile isSpace\n+    allLines = trimEmptyLines $ trimTrailingSpaces <$> Text.lines str\n+    minWs    = minimum $ indentLength <$> filter (not . Text.null) allLines\n+\n+codeCheck :: Text -> (Text -> Expectation)\n+codeCheck expectedCode = \\resultCode -> \n+    Text.strip resultCode `shouldBe` normalizeQQ expectedCode\n+\n+noCheck :: a -> Expectation\n+noCheck _ = pure ()\n+\n+testCase\n+    :: Text\n+    -> Text\n+    -> (a -> Expectation)\n+    -> (GraphLocation -> Empire a)\n+    -> CommunicationEnv\n+    -> Expectation\n+testCase initialCode expectedCode resultCheck action env = let\n+        filePath = \"/TestPath\"\n+        topGl    = GraphLocation filePath def\n+        isMain n = n ^. Node.name == Just \"main\"\n+        execute  = do\n+            createLibrary Nothing filePath","path":"libs/luna-empire/test/SpecUtils.hs","position":73,"original_position":103,"commit_id":"1ae7dec09715a37ed12527f5221e4c205c2ad8a5","original_commit_id":"152386cf579b12aa82d4bb0c468d92d4d26ce1c6","user":{"login":"wdanilo","id":1623053,"node_id":"MDQ6VXNlcjE2MjMwNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/1623053?v=4","gravatar_id":"","url":"https://api.github.com/users/wdanilo","html_url":"https://github.com/wdanilo","followers_url":"https://api.github.com/users/wdanilo/followers","following_url":"https://api.github.com/users/wdanilo/following{/other_user}","gists_url":"https://api.github.com/users/wdanilo/gists{/gist_id}","starred_url":"https://api.github.com/users/wdanilo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wdanilo/subscriptions","organizations_url":"https://api.github.com/users/wdanilo/orgs","repos_url":"https://api.github.com/users/wdanilo/repos","events_url":"https://api.github.com/users/wdanilo/events{/privacy}","received_events_url":"https://api.github.com/users/wdanilo/received_events","type":"User","site_admin":false},"body":"I don't feel it. Its very not obvious why you could not provide the name then.","created_at":"2018-10-01T11:35:54Z","updated_at":"2018-10-01T11:35:58Z","html_url":"https://github.com/luna/luna-studio/pull/1150#discussion_r221577187","pull_request_url":"https://api.github.com/repos/luna/luna-studio/pulls/1150","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/luna/luna-studio/pulls/comments/221577187"},"html":{"href":"https://github.com/luna/luna-studio/pull/1150#discussion_r221577187"},"pull_request":{"href":"https://api.github.com/repos/luna/luna-studio/pulls/1150"}},"in_reply_to_id":221184106},"pull_request":{"url":"https://api.github.com/repos/luna/luna-studio/pulls/1150","id":218858297,"node_id":"MDExOlB1bGxSZXF1ZXN0MjE4ODU4Mjk3","html_url":"https://github.com/luna/luna-studio/pull/1150","diff_url":"https://github.com/luna/luna-studio/pull/1150.diff","patch_url":"https://github.com/luna/luna-studio/pull/1150.patch","issue_url":"https://api.github.com/repos/luna/luna-studio/issues/1150","number":1150,"state":"open","locked":false,"title":"Standard for tests in luna-studio backend","user":{"login":"ljkania","id":7061422,"node_id":"MDQ6VXNlcjcwNjE0MjI=","avatar_url":"https://avatars0.githubusercontent.com/u/7061422?v=4","gravatar_id":"","url":"https://api.github.com/users/ljkania","html_url":"https://github.com/ljkania","followers_url":"https://api.github.com/users/ljkania/followers","following_url":"https://api.github.com/users/ljkania/following{/other_user}","gists_url":"https://api.github.com/users/ljkania/gists{/gist_id}","starred_url":"https://api.github.com/users/ljkania/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ljkania/subscriptions","organizations_url":"https://api.github.com/users/ljkania/orgs","repos_url":"https://api.github.com/users/ljkania/repos","events_url":"https://api.github.com/users/ljkania/events{/privacy}","received_events_url":"https://api.github.com/users/ljkania/received_events","type":"User","site_admin":false},"body":"### Pull Request Description\r\n\r\nThis PR is preparation to fix this [issue](https://github.com/luna/luna-studio/issues/1110). I wanted to set standard for tests before I start to write one. I was able to organise our tests and their utils into nice structure with refactored pattern match tests made an example on how we want to do it.\r\n\r\nWe've spend last few days with @mikusp to come up with some standard for tests in backend and we will aim to refactor all tests eventually.\r\nWe were able to nicely separate preparation, expectations and real test from each other. We provide with function `testCase` which takes initial code (point from where code starts), expected code (result of modifications applied to initial code), additional check of the result, action which is main part of test and returns values needed for additional check to perform it.\r\nThis allows us to have nice separation from functions we are testing and preprocessing. What is more we require code check with every test what revealed some bugs not caught with previous version of test. 3 of pattern match tests are failing now and @mikusp contribution is needed to fix them.\r\n\r\n### Important Notes\r\n\r\n- `SpecUtils.hs` should export all the utils in `SpecUtils` folder and all its content\r\n- `SpecUtils` folder should contain utils grouped by area of luna-studio that they are helping to test (`SpecUtils.Graph` contains helpers for actions on graph, we could also have a similar modules for code, project, library...)\r\n- we should (almost) always use `testCase` to test operations on graph - we've unified all similar usage of this pattern and we aim to represent as many tests as possible in this fashion\r\n- we provide `runTests` function for easy environment setup\r\n- for test which are disabled for longer time please provide reason using `xitWithReason` which beside label takes also string describing reason why test is disabled\r\n\r\nWhile doing Code Review please focus on these two changes:\r\n- unification of `specifyCodeChange` from different modules into `testCase` in [this commit](https://github.com/luna/luna-studio/commit/636c83d73ea41b75e96713550dd59afc5369312e)\r\n- design of tests implementation presented in [this file](https://github.com/luna/luna-studio/compare/backend-tests?expand=1#diff-9a4bb29c6583e163829ad75054f05cbb)\r\n\r\n### Checklist\r\nPlease include the following checklist in your PR:\r\n\r\n- [  ] The documentation has been updated if necessary.\r\n- [  ] The code conforms to the [Luna Style Guide](https://github.com/luna/wiki/blob/master/code-style/01.general.md) if it is Haskell.\r\n- [  ] The code has been tested where possible.\r\n\r\n","created_at":"2018-09-28T05:35:49Z","updated_at":"2018-10-01T11:35:58Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0da1372caaf91a14441566189813523beddc301c","assignee":{"login":"kustosz","id":1214109,"node_id":"MDQ6VXNlcjEyMTQxMDk=","avatar_url":"https://avatars2.githubusercontent.com/u/1214109?v=4","gravatar_id":"","url":"https://api.github.com/users/kustosz","html_url":"https://github.com/kustosz","followers_url":"https://api.github.com/users/kustosz/followers","following_url":"https://api.github.com/users/kustosz/following{/other_user}","gists_url":"https://api.github.com/users/kustosz/gists{/gist_id}","starred_url":"https://api.github.com/users/kustosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kustosz/subscriptions","organizations_url":"https://api.github.com/users/kustosz/orgs","repos_url":"https://api.github.com/users/kustosz/repos","events_url":"https://api.github.com/users/kustosz/events{/privacy}","received_events_url":"https://api.github.com/users/kustosz/received_events","type":"User","site_admin":false},"assignees":[{"login":"kustosz","id":1214109,"node_id":"MDQ6VXNlcjEyMTQxMDk=","avatar_url":"https://avatars2.githubusercontent.com/u/1214109?v=4","gravatar_id":"","url":"https://api.github.com/users/kustosz","html_url":"https://github.com/kustosz","followers_url":"https://api.github.com/users/kustosz/followers","following_url":"https://api.github.com/users/kustosz/following{/other_user}","gists_url":"https://api.github.com/users/kustosz/gists{/gist_id}","starred_url":"https://api.github.com/users/kustosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kustosz/subscriptions","organizations_url":"https://api.github.com/users/kustosz/orgs","repos_url":"https://api.github.com/users/kustosz/repos","events_url":"https://api.github.com/users/kustosz/events{/privacy}","received_events_url":"https://api.github.com/users/kustosz/received_events","type":"User","site_admin":false},{"login":"wdanilo","id":1623053,"node_id":"MDQ6VXNlcjE2MjMwNTM=","avatar_url":"https://avatars2.githubusercontent.com/u/1623053?v=4","gravatar_id":"","url":"https://api.github.com/users/wdanilo","html_url":"https://github.com/wdanilo","followers_url":"https://api.github.com/users/wdanilo/followers","following_url":"https://api.github.com/users/wdanilo/following{/other_user}","gists_url":"https://api.github.com/users/wdanilo/gists{/gist_id}","starred_url":"https://api.github.com/users/wdanilo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wdanilo/subscriptions","organizations_url":"https://api.github.com/users/wdanilo/orgs","repos_url":"https://api.github.com/users/wdanilo/repos","events_url":"https://api.github.com/users/wdanilo/events{/privacy}","received_events_url":"https://api.github.com/users/wdanilo/received_events","type":"User","site_admin":false},{"login":"mikusp","id":2052578,"node_id":"MDQ6VXNlcjIwNTI1Nzg=","avatar_url":"https://avatars2.githubusercontent.com/u/2052578?v=4","gravatar_id":"","url":"https://api.github.com/users/mikusp","html_url":"https://github.com/mikusp","followers_url":"https://api.github.com/users/mikusp/followers","following_url":"https://api.github.com/users/mikusp/following{/other_user}","gists_url":"https://api.github.com/users/mikusp/gists{/gist_id}","starred_url":"https://api.github.com/users/mikusp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mikusp/subscriptions","organizations_url":"https://api.github.com/users/mikusp/orgs","repos_url":"https://api.github.com/users/mikusp/repos","events_url":"https://api.github.com/users/mikusp/events{/privacy}","received_events_url":"https://api.github.com/users/mikusp/received_events","type":"User","site_admin":false}],"requested_reviewers":[{"login":"kustosz","id":1214109,"node_id":"MDQ6VXNlcjEyMTQxMDk=","avatar_url":"https://avatars2.githubusercontent.com/u/1214109?v=4","gravatar_id":"","url":"https://api.github.com/users/kustosz","html_url":"https://github.com/kustosz","followers_url":"https://api.github.com/users/kustosz/followers","following_url":"https://api.github.com/users/kustosz/following{/other_user}","gists_url":"https://api.github.com/users/kustosz/gists{/gist_id}","starred_url":"https://api.github.com/users/kustosz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kustosz/subscriptions","organizations_url":"https://api.github.com/users/kustosz/orgs","repos_url":"https://api.github.com/users/kustosz/repos","events_url":"https://api.github.com/users/kustosz/events{/privacy}","received_events_url":"https://api.github.com/users/kustosz/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":827542222,"node_id":"MDU6TGFiZWw4Mjc1NDIyMjI=","url":"https://api.github.com/repos/luna/luna-studio/labels/D%20-%20Intermediate","name":"D - Intermediate","color":"b4fca6","default":false},{"id":827543179,"node_id":"MDU6TGFiZWw4Mjc1NDMxNzk=","url":"https://api.github.com/repos/luna/luna-studio/labels/P%20-%20Medium","name":"P - Medium","color":"c7b300","default":false},{"id":517524863,"node_id":"MDU6TGFiZWw1MTc1MjQ4NjM=","url":"https://api.github.com/repos/luna/luna-studio/labels/T%20-%20Enhancement","name":"T - Enhancement","color":"84b6eb","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/luna/luna-studio/pulls/1150/commits","review_comments_url":"https://api.github.com/repos/luna/luna-studio/pulls/1150/comments","review_comment_url":"https://api.github.com/repos/luna/luna-studio/pulls/comments{/number}","comments_url":"https://api.github.com/repos/luna/luna-studio/issues/1150/comments","statuses_url":"https://api.github.com/repos/luna/luna-studio/statuses/1ae7dec09715a37ed12527f5221e4c205c2ad8a5","head":{"label":"luna:backend-tests","ref":"backend-tests","sha":"1ae7dec09715a37ed12527f5221e4c205c2ad8a5","user":{"login":"luna","id":17415943,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3NDE1OTQz","avatar_url":"https://avatars0.githubusercontent.com/u/17415943?v=4","gravatar_id":"","url":"https://api.github.com/users/luna","html_url":"https://github.com/luna","followers_url":"https://api.github.com/users/luna/followers","following_url":"https://api.github.com/users/luna/following{/other_user}","gists_url":"https://api.github.com/users/luna/gists{/gist_id}","starred_url":"https://api.github.com/users/luna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luna/subscriptions","organizations_url":"https://api.github.com/users/luna/orgs","repos_url":"https://api.github.com/users/luna/repos","events_url":"https://api.github.com/users/luna/events{/privacy}","received_events_url":"https://api.github.com/users/luna/received_events","type":"Organization","site_admin":false},"repo":{"id":78853390,"node_id":"MDEwOlJlcG9zaXRvcnk3ODg1MzM5MA==","name":"luna-studio","full_name":"luna/luna-studio","private":false,"owner":{"login":"luna","id":17415943,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3NDE1OTQz","avatar_url":"https://avatars0.githubusercontent.com/u/17415943?v=4","gravatar_id":"","url":"https://api.github.com/users/luna","html_url":"https://github.com/luna","followers_url":"https://api.github.com/users/luna/followers","following_url":"https://api.github.com/users/luna/following{/other_user}","gists_url":"https://api.github.com/users/luna/gists{/gist_id}","starred_url":"https://api.github.com/users/luna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luna/subscriptions","organizations_url":"https://api.github.com/users/luna/orgs","repos_url":"https://api.github.com/users/luna/repos","events_url":"https://api.github.com/users/luna/events{/privacy}","received_events_url":"https://api.github.com/users/luna/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/luna/luna-studio","description":null,"fork":false,"url":"https://api.github.com/repos/luna/luna-studio","forks_url":"https://api.github.com/repos/luna/luna-studio/forks","keys_url":"https://api.github.com/repos/luna/luna-studio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/luna/luna-studio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/luna/luna-studio/teams","hooks_url":"https://api.github.com/repos/luna/luna-studio/hooks","issue_events_url":"https://api.github.com/repos/luna/luna-studio/issues/events{/number}","events_url":"https://api.github.com/repos/luna/luna-studio/events","assignees_url":"https://api.github.com/repos/luna/luna-studio/assignees{/user}","branches_url":"https://api.github.com/repos/luna/luna-studio/branches{/branch}","tags_url":"https://api.github.com/repos/luna/luna-studio/tags","blobs_url":"https://api.github.com/repos/luna/luna-studio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/luna/luna-studio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/luna/luna-studio/git/refs{/sha}","trees_url":"https://api.github.com/repos/luna/luna-studio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/luna/luna-studio/statuses/{sha}","languages_url":"https://api.github.com/repos/luna/luna-studio/languages","stargazers_url":"https://api.github.com/repos/luna/luna-studio/stargazers","contributors_url":"https://api.github.com/repos/luna/luna-studio/contributors","subscribers_url":"https://api.github.com/repos/luna/luna-studio/subscribers","subscription_url":"https://api.github.com/repos/luna/luna-studio/subscription","commits_url":"https://api.github.com/repos/luna/luna-studio/commits{/sha}","git_commits_url":"https://api.github.com/repos/luna/luna-studio/git/commits{/sha}","comments_url":"https://api.github.com/repos/luna/luna-studio/comments{/number}","issue_comment_url":"https://api.github.com/repos/luna/luna-studio/issues/comments{/number}","contents_url":"https://api.github.com/repos/luna/luna-studio/contents/{+path}","compare_url":"https://api.github.com/repos/luna/luna-studio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/luna/luna-studio/merges","archive_url":"https://api.github.com/repos/luna/luna-studio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/luna/luna-studio/downloads","issues_url":"https://api.github.com/repos/luna/luna-studio/issues{/number}","pulls_url":"https://api.github.com/repos/luna/luna-studio/pulls{/number}","milestones_url":"https://api.github.com/repos/luna/luna-studio/milestones{/number}","notifications_url":"https://api.github.com/repos/luna/luna-studio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/luna/luna-studio/labels{/name}","releases_url":"https://api.github.com/repos/luna/luna-studio/releases{/id}","deployments_url":"https://api.github.com/repos/luna/luna-studio/deployments","created_at":"2017-01-13T13:51:54Z","updated_at":"2018-09-28T11:53:58Z","pushed_at":"2018-10-01T11:30:39Z","git_url":"git://github.com/luna/luna-studio.git","ssh_url":"git@github.com:luna/luna-studio.git","clone_url":"https://github.com/luna/luna-studio.git","svn_url":"https://github.com/luna/luna-studio","homepage":null,"size":56709,"stargazers_count":438,"watchers_count":438,"language":"Haskell","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"archived":false,"open_issues_count":366,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":13,"open_issues":366,"watchers":438,"default_branch":"master"}},"base":{"label":"luna:master","ref":"master","sha":"37913af2cfee1f9f1f7be9134a7b393f20d128ea","user":{"login":"luna","id":17415943,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3NDE1OTQz","avatar_url":"https://avatars0.githubusercontent.com/u/17415943?v=4","gravatar_id":"","url":"https://api.github.com/users/luna","html_url":"https://github.com/luna","followers_url":"https://api.github.com/users/luna/followers","following_url":"https://api.github.com/users/luna/following{/other_user}","gists_url":"https://api.github.com/users/luna/gists{/gist_id}","starred_url":"https://api.github.com/users/luna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luna/subscriptions","organizations_url":"https://api.github.com/users/luna/orgs","repos_url":"https://api.github.com/users/luna/repos","events_url":"https://api.github.com/users/luna/events{/privacy}","received_events_url":"https://api.github.com/users/luna/received_events","type":"Organization","site_admin":false},"repo":{"id":78853390,"node_id":"MDEwOlJlcG9zaXRvcnk3ODg1MzM5MA==","name":"luna-studio","full_name":"luna/luna-studio","private":false,"owner":{"login":"luna","id":17415943,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE3NDE1OTQz","avatar_url":"https://avatars0.githubusercontent.com/u/17415943?v=4","gravatar_id":"","url":"https://api.github.com/users/luna","html_url":"https://github.com/luna","followers_url":"https://api.github.com/users/luna/followers","following_url":"https://api.github.com/users/luna/following{/other_user}","gists_url":"https://api.github.com/users/luna/gists{/gist_id}","starred_url":"https://api.github.com/users/luna/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/luna/subscriptions","organizations_url":"https://api.github.com/users/luna/orgs","repos_url":"https://api.github.com/users/luna/repos","events_url":"https://api.github.com/users/luna/events{/privacy}","received_events_url":"https://api.github.com/users/luna/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/luna/luna-studio","description":null,"fork":false,"url":"https://api.github.com/repos/luna/luna-studio","forks_url":"https://api.github.com/repos/luna/luna-studio/forks","keys_url":"https://api.github.com/repos/luna/luna-studio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/luna/luna-studio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/luna/luna-studio/teams","hooks_url":"https://api.github.com/repos/luna/luna-studio/hooks","issue_events_url":"https://api.github.com/repos/luna/luna-studio/issues/events{/number}","events_url":"https://api.github.com/repos/luna/luna-studio/events","assignees_url":"https://api.github.com/repos/luna/luna-studio/assignees{/user}","branches_url":"https://api.github.com/repos/luna/luna-studio/branches{/branch}","tags_url":"https://api.github.com/repos/luna/luna-studio/tags","blobs_url":"https://api.github.com/repos/luna/luna-studio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/luna/luna-studio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/luna/luna-studio/git/refs{/sha}","trees_url":"https://api.github.com/repos/luna/luna-studio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/luna/luna-studio/statuses/{sha}","languages_url":"https://api.github.com/repos/luna/luna-studio/languages","stargazers_url":"https://api.github.com/repos/luna/luna-studio/stargazers","contributors_url":"https://api.github.com/repos/luna/luna-studio/contributors","subscribers_url":"https://api.github.com/repos/luna/luna-studio/subscribers","subscription_url":"https://api.github.com/repos/luna/luna-studio/subscription","commits_url":"https://api.github.com/repos/luna/luna-studio/commits{/sha}","git_commits_url":"https://api.github.com/repos/luna/luna-studio/git/commits{/sha}","comments_url":"https://api.github.com/repos/luna/luna-studio/comments{/number}","issue_comment_url":"https://api.github.com/repos/luna/luna-studio/issues/comments{/number}","contents_url":"https://api.github.com/repos/luna/luna-studio/contents/{+path}","compare_url":"https://api.github.com/repos/luna/luna-studio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/luna/luna-studio/merges","archive_url":"https://api.github.com/repos/luna/luna-studio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/luna/luna-studio/downloads","issues_url":"https://api.github.com/repos/luna/luna-studio/issues{/number}","pulls_url":"https://api.github.com/repos/luna/luna-studio/pulls{/number}","milestones_url":"https://api.github.com/repos/luna/luna-studio/milestones{/number}","notifications_url":"https://api.github.com/repos/luna/luna-studio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/luna/luna-studio/labels{/name}","releases_url":"https://api.github.com/repos/luna/luna-studio/releases{/id}","deployments_url":"https://api.github.com/repos/luna/luna-studio/deployments","created_at":"2017-01-13T13:51:54Z","updated_at":"2018-09-28T11:53:58Z","pushed_at":"2018-10-01T11:30:39Z","git_url":"git://github.com/luna/luna-studio.git","ssh_url":"git@github.com:luna/luna-studio.git","clone_url":"https://github.com/luna/luna-studio.git","svn_url":"https://github.com/luna/luna-studio","homepage":null,"size":56709,"stargazers_count":438,"watchers_count":438,"language":"Haskell","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"archived":false,"open_issues_count":366,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":13,"open_issues":366,"watchers":438,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/luna/luna-studio/pulls/1150"},"html":{"href":"https://github.com/luna/luna-studio/pull/1150"},"issue":{"href":"https://api.github.com/repos/luna/luna-studio/issues/1150"},"comments":{"href":"https://api.github.com/repos/luna/luna-studio/issues/1150/comments"},"review_comments":{"href":"https://api.github.com/repos/luna/luna-studio/pulls/1150/comments"},"review_comment":{"href":"https://api.github.com/repos/luna/luna-studio/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/luna/luna-studio/pulls/1150/commits"},"statuses":{"href":"https://api.github.com/repos/luna/luna-studio/statuses/1ae7dec09715a37ed12527f5221e4c205c2ad8a5"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"wdanilo"}}