{"action":"created","comment":{"url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/comments/165829660","pull_request_review_id":93819500,"id":165829660,"diff_hunk":"@@ -0,0 +1,51 @@\n+module IML.IntegrationTest.IntegrationTest\n+\n+open Fable.Import.Jest.Matchers\n+open IML.StatefulMonad.StatefulPromise\n+open IML.IntegrationTest.IntegrationTestFramework\n+open Fable.Import.Node.PowerPack\n+open Fable.Import.Node\n+open Fable.PowerPack\n+open Fable.Import.Jest\n+\n+type ExecOk = Stdout * Stderr\n+type ExecErr = ChildProcess.ExecError * Stdout * Stderr\n+type CommandFn = unit -> Fable.Import.JS.Promise<Result<ExecOk, ExecErr>>\n+\n+let command = StatefulPromise()\n+\n+let rb1 () =\n+  ChildProcess.exec (shellCommand \"echo 'rollback1' >> /tmp/integration_test.txt\") None\n+\n+let rb2 () =\n+  ChildProcess.exec (shellCommand \"echo 'rollback2' >> /tmp/integration_test.txt\") None\n+\n+let rb3 () =\n+  ChildProcess.exec (shellCommand \"echo 'rollback3' >> /tmp/integration_test.txt\") None\n+\n+let rb4 () =\n+  ChildProcess.exec (shellCommand \"echo 'rollback4' > /tmp/integration_test.txt\") None\n+\n+\n+Exports.testAsync \"Stateful Promise should rollback starting with the last command\" <| fun () ->\n+  command {\n+        let! _ = runTestCommand \"rm -f /tmp/integration_test.txt && touch /tmp/integration_test.txt\" None\n+        let! _ = runTestCommand \"echo 'hello'\" (Some(rb1))\n+        let! _ = runTestCommand \"echo 'goodbye'\" (Some(rb2))\n+        let! _ = runTestCommand \"echo 'another command'\" (Some(rb3))\n+        let! _ = runTestCommand \"echo 'done'\" (Some(rb4))\n+        ()\n+      } |> testRun []\n+      |> Promise.map (fun _ ->\n+        promise {\n+          let! x = ChildProcess.exec (shellCommand \"cat /tmp/integration_test.txt\") None\n+          x\n+            |> Result.map(fun (Stdout(result), _) ->\n+              result == \"rollback4\\nrollback3\\nrollback2\\nrollback1\\n\"\n+            )\n+            |> Result.mapError(fun (e, _, _) ->\n+              let message = sprintf \"Error reading from /tmp/integration_test.txt %s\" e.message\n+              raise (System.Exception(message))\n+            ) |> ignore\n+        }\n+      )","path":"IML.IntegrationTest/IntegrationTest.fs","position":51,"original_position":51,"commit_id":"cb01074bfc39a1073a22a1c9d82a369b9e47c9aa","original_commit_id":"cb01074bfc39a1073a22a1c9d82a369b9e47c9aa","user":{"login":"jgrund","id":458717,"avatar_url":"https://avatars0.githubusercontent.com/u/458717?v=4","gravatar_id":"","url":"https://api.github.com/users/jgrund","html_url":"https://github.com/jgrund","followers_url":"https://api.github.com/users/jgrund/followers","following_url":"https://api.github.com/users/jgrund/following{/other_user}","gists_url":"https://api.github.com/users/jgrund/gists{/gist_id}","starred_url":"https://api.github.com/users/jgrund/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgrund/subscriptions","organizations_url":"https://api.github.com/users/jgrund/orgs","repos_url":"https://api.github.com/users/jgrund/repos","events_url":"https://api.github.com/users/jgrund/events{/privacy}","received_events_url":"https://api.github.com/users/jgrund/received_events","type":"User","site_admin":false},"body":"I tried this out locally and came up with:\r\n\r\n```\r\nmodule IML.IntegrationTest.IntegrationTest\r\n\r\nopen Fable.Import.Jest.Matchers\r\nopen IML.StatefulMonad.StatefulPromise\r\nopen IML.IntegrationTest.IntegrationTestFramework\r\nopen Fable.Import.Node.PowerPack\r\nopen Fable.PowerPack\r\nopen Fable.Import.Jest\r\n\r\nlet private rb cnt () =\r\n  execShell (sprintf \"echo 'rollback%d' >> /tmp/integration_test.txt\" cnt)\r\n\r\nlet private doCmd x cnt =\r\n  cmd x\r\n    >> rollback (rb cnt)\r\n    >> ignoreCmd\r\n\r\n\r\ntestAsync \"Stateful Promise should rollback starting with the last command\" <| fun () ->\r\n    expect.assertions 2\r\n\r\n    command {\r\n      do! cmd \"rm -f /tmp/integration_test.txt && touch /tmp/integration_test.txt\" >> ignoreCmd\r\n      do! doCmd \"echo 'hello'\" 1\r\n      do! doCmd \"echo 'goodbye'\" 2\r\n      do! doCmd \"echo 'another command'\" 3\r\n      do! doCmd \"echo 'done'\" 4\r\n\r\n      return! cmd \"cat /tmp/integration_test.txt\" \r\n    }\r\n      |> testRun []\r\n      |> Promise.bind (fun x ->\r\n        x == (Stdout(\"\"), Stderr(\"\"))\r\n\r\n        promise {\r\n          let! x = execShell \"cat /tmp/integration_test.txt\"\r\n          \r\n          match x with\r\n            | Ok y ->\r\n              y == (Stdout(\"rollback4\\nrollback3\\nrollback2\\nrollback1\\n\"), Stderr(\"\"))\r\n            | Error (e, _, _) ->\r\n              failwithf \"Error reading from /tmp/integration_test.txt %s\" e.message\r\n        }\r\n      )\r\n```\r\n\r\nI removed the discrete rollbacks into a reusable fn. I also changed the `let! _ =` to `do!`","created_at":"2018-02-04T00:28:44Z","updated_at":"2018-02-04T00:31:49Z","html_url":"https://github.com/intel-hpdd/device-scanner/pull/55#discussion_r165829660","pull_request_url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/comments/165829660"},"html":{"href":"https://github.com/intel-hpdd/device-scanner/pull/55#discussion_r165829660"},"pull_request":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55"}}},"pull_request":{"url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55","id":161188668,"html_url":"https://github.com/intel-hpdd/device-scanner/pull/55","diff_url":"https://github.com/intel-hpdd/device-scanner/pull/55.diff","patch_url":"https://github.com/intel-hpdd/device-scanner/pull/55.patch","issue_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/55","number":55,"state":"open","locked":false,"title":"Add integration test framework","user":{"login":"johnsonw","id":1100657,"avatar_url":"https://avatars0.githubusercontent.com/u/1100657?v=4","gravatar_id":"","url":"https://api.github.com/users/johnsonw","html_url":"https://github.com/johnsonw","followers_url":"https://api.github.com/users/johnsonw/followers","following_url":"https://api.github.com/users/johnsonw/following{/other_user}","gists_url":"https://api.github.com/users/johnsonw/gists{/gist_id}","starred_url":"https://api.github.com/users/johnsonw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/johnsonw/subscriptions","organizations_url":"https://api.github.com/users/johnsonw/orgs","repos_url":"https://api.github.com/users/johnsonw/repos","events_url":"https://api.github.com/users/johnsonw/events{/privacy}","received_events_url":"https://api.github.com/users/johnsonw/received_events","type":"User","site_admin":false},"body":" - [x] Create integration test framework\r\n   - [x] Should launch a vm upon beginning of test\r\n   - [x] Should execute test commands over the vm\r\n   - [x] Create a computation expression that will perform asynchronous tasks during the tests. If a failure point is encountered, it should \"rewind\" and perform any necessary \"undo\" steps for that test.\r\n   - [ ] Should halt and restore snapshot after running a test\r\n- [x] Add integration tests to test:\r\n   - [x] Initial udev data after triggering\r\n   - [ ] Updated udev after removing a device\r\n   - [ ] Updated udev after adding a device\r\n   - [ ] Updated udev after modifying a partition\r\n   - [ ] Updated udev after adding, removing, modifying DM devices\r\n   - [ ] Update with mdraid\r\n   - [ ] Testing ZED \r\n      - [ ] `yum install zfs`\r\n      - [ ] Creating a zpool\r\n      - [ ] Destroying a zpool\r\n      - [ ] Creating a dataset\r\n      - [ ] Destroying a dataset\r\n      - [ ] Importing and exporting pools\r\n      - [ ] Adding a new device to a pool\r\n      - [ ] Faulting a pool\r\n      - [ ] Setting properties on a pool\r\n      - [ ] Removing properties on a pool\r\n      - [ ] Setting properties on a dataset\r\n      - [ ] Removing properties on a dataset\r\n","created_at":"2018-01-04T18:35:37Z","updated_at":"2018-02-04T00:31:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dd5d7cd5ca89f96d81ee0eff19d07eda374bd460","assignee":{"login":"johnsonw","id":1100657,"avatar_url":"https://avatars0.githubusercontent.com/u/1100657?v=4","gravatar_id":"","url":"https://api.github.com/users/johnsonw","html_url":"https://github.com/johnsonw","followers_url":"https://api.github.com/users/johnsonw/followers","following_url":"https://api.github.com/users/johnsonw/following{/other_user}","gists_url":"https://api.github.com/users/johnsonw/gists{/gist_id}","starred_url":"https://api.github.com/users/johnsonw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/johnsonw/subscriptions","organizations_url":"https://api.github.com/users/johnsonw/orgs","repos_url":"https://api.github.com/users/johnsonw/repos","events_url":"https://api.github.com/users/johnsonw/events{/privacy}","received_events_url":"https://api.github.com/users/johnsonw/received_events","type":"User","site_admin":false},"assignees":[{"login":"johnsonw","id":1100657,"avatar_url":"https://avatars0.githubusercontent.com/u/1100657?v=4","gravatar_id":"","url":"https://api.github.com/users/johnsonw","html_url":"https://github.com/johnsonw","followers_url":"https://api.github.com/users/johnsonw/followers","following_url":"https://api.github.com/users/johnsonw/following{/other_user}","gists_url":"https://api.github.com/users/johnsonw/gists{/gist_id}","starred_url":"https://api.github.com/users/johnsonw/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/johnsonw/subscriptions","organizations_url":"https://api.github.com/users/johnsonw/orgs","repos_url":"https://api.github.com/users/johnsonw/repos","events_url":"https://api.github.com/users/johnsonw/events{/privacy}","received_events_url":"https://api.github.com/users/johnsonw/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"milestone":null,"commits_url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55/commits","review_comments_url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55/comments","review_comment_url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/comments{/number}","comments_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/55/comments","statuses_url":"https://api.github.com/repos/intel-hpdd/device-scanner/statuses/cb01074bfc39a1073a22a1c9d82a369b9e47c9aa","head":{"label":"intel-hpdd:integration-test-framework","ref":"integration-test-framework","sha":"cb01074bfc39a1073a22a1c9d82a369b9e47c9aa","user":{"login":"intel-hpdd","id":20727479,"avatar_url":"https://avatars3.githubusercontent.com/u/20727479?v=4","gravatar_id":"","url":"https://api.github.com/users/intel-hpdd","html_url":"https://github.com/intel-hpdd","followers_url":"https://api.github.com/users/intel-hpdd/followers","following_url":"https://api.github.com/users/intel-hpdd/following{/other_user}","gists_url":"https://api.github.com/users/intel-hpdd/gists{/gist_id}","starred_url":"https://api.github.com/users/intel-hpdd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intel-hpdd/subscriptions","organizations_url":"https://api.github.com/users/intel-hpdd/orgs","repos_url":"https://api.github.com/users/intel-hpdd/repos","events_url":"https://api.github.com/users/intel-hpdd/events{/privacy}","received_events_url":"https://api.github.com/users/intel-hpdd/received_events","type":"Organization","site_admin":false},"repo":{"id":89747077,"name":"device-scanner","full_name":"intel-hpdd/device-scanner","owner":{"login":"intel-hpdd","id":20727479,"avatar_url":"https://avatars3.githubusercontent.com/u/20727479?v=4","gravatar_id":"","url":"https://api.github.com/users/intel-hpdd","html_url":"https://github.com/intel-hpdd","followers_url":"https://api.github.com/users/intel-hpdd/followers","following_url":"https://api.github.com/users/intel-hpdd/following{/other_user}","gists_url":"https://api.github.com/users/intel-hpdd/gists{/gist_id}","starred_url":"https://api.github.com/users/intel-hpdd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intel-hpdd/subscriptions","organizations_url":"https://api.github.com/users/intel-hpdd/orgs","repos_url":"https://api.github.com/users/intel-hpdd/repos","events_url":"https://api.github.com/users/intel-hpdd/events{/privacy}","received_events_url":"https://api.github.com/users/intel-hpdd/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/intel-hpdd/device-scanner","description":"Builds an in-memory representation of devices using Udev and ZED.","fork":false,"url":"https://api.github.com/repos/intel-hpdd/device-scanner","forks_url":"https://api.github.com/repos/intel-hpdd/device-scanner/forks","keys_url":"https://api.github.com/repos/intel-hpdd/device-scanner/keys{/key_id}","collaborators_url":"https://api.github.com/repos/intel-hpdd/device-scanner/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/intel-hpdd/device-scanner/teams","hooks_url":"https://api.github.com/repos/intel-hpdd/device-scanner/hooks","issue_events_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/events{/number}","events_url":"https://api.github.com/repos/intel-hpdd/device-scanner/events","assignees_url":"https://api.github.com/repos/intel-hpdd/device-scanner/assignees{/user}","branches_url":"https://api.github.com/repos/intel-hpdd/device-scanner/branches{/branch}","tags_url":"https://api.github.com/repos/intel-hpdd/device-scanner/tags","blobs_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/refs{/sha}","trees_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/trees{/sha}","statuses_url":"https://api.github.com/repos/intel-hpdd/device-scanner/statuses/{sha}","languages_url":"https://api.github.com/repos/intel-hpdd/device-scanner/languages","stargazers_url":"https://api.github.com/repos/intel-hpdd/device-scanner/stargazers","contributors_url":"https://api.github.com/repos/intel-hpdd/device-scanner/contributors","subscribers_url":"https://api.github.com/repos/intel-hpdd/device-scanner/subscribers","subscription_url":"https://api.github.com/repos/intel-hpdd/device-scanner/subscription","commits_url":"https://api.github.com/repos/intel-hpdd/device-scanner/commits{/sha}","git_commits_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/commits{/sha}","comments_url":"https://api.github.com/repos/intel-hpdd/device-scanner/comments{/number}","issue_comment_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/comments{/number}","contents_url":"https://api.github.com/repos/intel-hpdd/device-scanner/contents/{+path}","compare_url":"https://api.github.com/repos/intel-hpdd/device-scanner/compare/{base}...{head}","merges_url":"https://api.github.com/repos/intel-hpdd/device-scanner/merges","archive_url":"https://api.github.com/repos/intel-hpdd/device-scanner/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/intel-hpdd/device-scanner/downloads","issues_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues{/number}","pulls_url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls{/number}","milestones_url":"https://api.github.com/repos/intel-hpdd/device-scanner/milestones{/number}","notifications_url":"https://api.github.com/repos/intel-hpdd/device-scanner/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/intel-hpdd/device-scanner/labels{/name}","releases_url":"https://api.github.com/repos/intel-hpdd/device-scanner/releases{/id}","deployments_url":"https://api.github.com/repos/intel-hpdd/device-scanner/deployments","created_at":"2017-04-28T21:45:57Z","updated_at":"2018-01-04T03:31:57Z","pushed_at":"2018-02-02T22:37:04Z","git_url":"git://github.com/intel-hpdd/device-scanner.git","ssh_url":"git@github.com:intel-hpdd/device-scanner.git","clone_url":"https://github.com/intel-hpdd/device-scanner.git","svn_url":"https://github.com/intel-hpdd/device-scanner","homepage":"","size":581,"stargazers_count":4,"watchers_count":4,"language":"F#","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":1,"watchers":4,"default_branch":"master"}},"base":{"label":"intel-hpdd:master","ref":"master","sha":"b81282a1aa16bffdfca8945ab0e8235605805217","user":{"login":"intel-hpdd","id":20727479,"avatar_url":"https://avatars3.githubusercontent.com/u/20727479?v=4","gravatar_id":"","url":"https://api.github.com/users/intel-hpdd","html_url":"https://github.com/intel-hpdd","followers_url":"https://api.github.com/users/intel-hpdd/followers","following_url":"https://api.github.com/users/intel-hpdd/following{/other_user}","gists_url":"https://api.github.com/users/intel-hpdd/gists{/gist_id}","starred_url":"https://api.github.com/users/intel-hpdd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intel-hpdd/subscriptions","organizations_url":"https://api.github.com/users/intel-hpdd/orgs","repos_url":"https://api.github.com/users/intel-hpdd/repos","events_url":"https://api.github.com/users/intel-hpdd/events{/privacy}","received_events_url":"https://api.github.com/users/intel-hpdd/received_events","type":"Organization","site_admin":false},"repo":{"id":89747077,"name":"device-scanner","full_name":"intel-hpdd/device-scanner","owner":{"login":"intel-hpdd","id":20727479,"avatar_url":"https://avatars3.githubusercontent.com/u/20727479?v=4","gravatar_id":"","url":"https://api.github.com/users/intel-hpdd","html_url":"https://github.com/intel-hpdd","followers_url":"https://api.github.com/users/intel-hpdd/followers","following_url":"https://api.github.com/users/intel-hpdd/following{/other_user}","gists_url":"https://api.github.com/users/intel-hpdd/gists{/gist_id}","starred_url":"https://api.github.com/users/intel-hpdd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/intel-hpdd/subscriptions","organizations_url":"https://api.github.com/users/intel-hpdd/orgs","repos_url":"https://api.github.com/users/intel-hpdd/repos","events_url":"https://api.github.com/users/intel-hpdd/events{/privacy}","received_events_url":"https://api.github.com/users/intel-hpdd/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/intel-hpdd/device-scanner","description":"Builds an in-memory representation of devices using Udev and ZED.","fork":false,"url":"https://api.github.com/repos/intel-hpdd/device-scanner","forks_url":"https://api.github.com/repos/intel-hpdd/device-scanner/forks","keys_url":"https://api.github.com/repos/intel-hpdd/device-scanner/keys{/key_id}","collaborators_url":"https://api.github.com/repos/intel-hpdd/device-scanner/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/intel-hpdd/device-scanner/teams","hooks_url":"https://api.github.com/repos/intel-hpdd/device-scanner/hooks","issue_events_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/events{/number}","events_url":"https://api.github.com/repos/intel-hpdd/device-scanner/events","assignees_url":"https://api.github.com/repos/intel-hpdd/device-scanner/assignees{/user}","branches_url":"https://api.github.com/repos/intel-hpdd/device-scanner/branches{/branch}","tags_url":"https://api.github.com/repos/intel-hpdd/device-scanner/tags","blobs_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/refs{/sha}","trees_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/trees{/sha}","statuses_url":"https://api.github.com/repos/intel-hpdd/device-scanner/statuses/{sha}","languages_url":"https://api.github.com/repos/intel-hpdd/device-scanner/languages","stargazers_url":"https://api.github.com/repos/intel-hpdd/device-scanner/stargazers","contributors_url":"https://api.github.com/repos/intel-hpdd/device-scanner/contributors","subscribers_url":"https://api.github.com/repos/intel-hpdd/device-scanner/subscribers","subscription_url":"https://api.github.com/repos/intel-hpdd/device-scanner/subscription","commits_url":"https://api.github.com/repos/intel-hpdd/device-scanner/commits{/sha}","git_commits_url":"https://api.github.com/repos/intel-hpdd/device-scanner/git/commits{/sha}","comments_url":"https://api.github.com/repos/intel-hpdd/device-scanner/comments{/number}","issue_comment_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/comments{/number}","contents_url":"https://api.github.com/repos/intel-hpdd/device-scanner/contents/{+path}","compare_url":"https://api.github.com/repos/intel-hpdd/device-scanner/compare/{base}...{head}","merges_url":"https://api.github.com/repos/intel-hpdd/device-scanner/merges","archive_url":"https://api.github.com/repos/intel-hpdd/device-scanner/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/intel-hpdd/device-scanner/downloads","issues_url":"https://api.github.com/repos/intel-hpdd/device-scanner/issues{/number}","pulls_url":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls{/number}","milestones_url":"https://api.github.com/repos/intel-hpdd/device-scanner/milestones{/number}","notifications_url":"https://api.github.com/repos/intel-hpdd/device-scanner/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/intel-hpdd/device-scanner/labels{/name}","releases_url":"https://api.github.com/repos/intel-hpdd/device-scanner/releases{/id}","deployments_url":"https://api.github.com/repos/intel-hpdd/device-scanner/deployments","created_at":"2017-04-28T21:45:57Z","updated_at":"2018-01-04T03:31:57Z","pushed_at":"2018-02-02T22:37:04Z","git_url":"git://github.com/intel-hpdd/device-scanner.git","ssh_url":"git@github.com:intel-hpdd/device-scanner.git","clone_url":"https://github.com/intel-hpdd/device-scanner.git","svn_url":"https://github.com/intel-hpdd/device-scanner","homepage":"","size":581,"stargazers_count":4,"watchers_count":4,"language":"F#","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":1,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":1,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55"},"html":{"href":"https://github.com/intel-hpdd/device-scanner/pull/55"},"issue":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/55"},"comments":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/issues/55/comments"},"review_comments":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55/comments"},"review_comment":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/pulls/55/commits"},"statuses":{"href":"https://api.github.com/repos/intel-hpdd/device-scanner/statuses/cb01074bfc39a1073a22a1c9d82a369b9e47c9aa"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"jgrund"}}