{"action":"created","comment":{"url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/comments/78545737","id":78545737,"diff_hunk":"@@ -0,0 +1,280 @@\n+# View Model Example\n+\n+This file lays out an example of view model use from the Prezto project.\n+\n+Prezto is an app used to create and share slideshows (preztos) directly on your mobile device.\n+\n+For this example, we show the implemenation of the \"saved preztos\" screen, which allows a user to:\n+\n+- Create a new prezto\n+- View a list of existing prezto's\n+- Delete a prezto\n+\n+![SavedPreztosViewController](prezto.png)\n+\n+NOTE: While this page does show code used in an actual project, the snippets here show only the relevant parts to illustrate view model use. The full versions of these files can be found here:\n+\n+- [`SavedPreztosViewModel.swift`](https://github.com/IntrepidPursuits/prezto-ios/blob/kevin/saved-preztos/prezto-ios/Features/SavedPreztos/SavedPreztosViewModel.swift)\n+- [`SavedPreztoViewModel.swift`](https://github.com/IntrepidPursuits/prezto-ios/blob/kevin/saved-preztos/prezto-ios/Features/SavedPreztos/SavedPreztoViewModel.swift)\n+- [`SavedPreztosViewController.swift`](https://github.com/IntrepidPursuits/prezto-ios/blob/kevin/saved-preztos/prezto-ios/Features/SavedPreztos/SavedPreztosViewController.swift)\n+- [`SavedPreztoTableViewCell.swift`](https://github.com/IntrepidPursuits/prezto-ios/blob/kevin/saved-preztos/prezto-ios/Features/SavedPreztos/SavedPreztoTableViewCell.swift)\n+\n+## Parent View Model\n+\n+The `SavedPreztosViewController` contains a `SavedPreztosViewModel` that provides the backing logic for fetching and deleting prezto's. \n+\n+The relevant portion is shown below:\n+\n+### SavedPreztosViewController.swift\n+```swift\n+class SavedPreztosViewModel {\n+\n+    var savedPreztos = [Prezto]() \n+\n+    var count: Int {\n+        return savedPreztos.count\n+    }\n+\n+    func retrievePreztos(completion: (RequestResult<[Prezto]>) -> ()) {\n+        RequestManager.sharedInstance.getMyPreztos { result in\n+            switch result {\n+            case .Success(let preztos):\n+                self.savedPreztos = preztos\n+            case .Failure(let error):\n+                print(\"Error refreshing preztos: \\(error)\")\n+                return\n+            }\n+            completion(result)\n+        }\n+    }\n+\n+    func getPrezto(index: Int) -> Prezto {\n+        return savedPreztos[index]\n+    }\n+\n+    func deletePreztoAtIndex(index: Int, completion: (RequestResult<Void>) -> ()) {\n+        guard index < savedPreztos.count else {\n+            completion(.Failure(\"No prezto found to delete.\"))\n+            return\n+        }\n+        let prezto = savedPreztos[index]\n+        guard let id = prezto.id else {\n+            completion(.Failure(\"No id found on prezto.\"))\n+            return\n+        }\n+\n+        RequestManager.sharedInstance.deletePrezto(id) { result in\n+            self.savedPreztos.removeAtIndex(index)\n+            completion(.Success())\n+        }\n+    }\n+}\n+```\n+\n+## Child View Models\n+\n+This `SavedPreztosViewModel` also contains an array of `SavedPreztoViewModel` objects that are used in displaying information about an individual prezto.\n+\n+### SavedPreztosViewController.swift\n+```swift\n+class SavedPreztosViewModel {\n+\n+    var savedPreztos = [Prezto]() {\n+        didSet {\n+            viewModels = [SavedPreztoViewModel?](count: savedPreztos.count, repeatedValue: nil)\n+        }\n+    }\n+\n+    var viewModels = [SavedPreztoViewModel?]()\n+\n+    func viewModelForPreztoAtIndex(index: Int) -> SavedPreztoViewModel {\n+        if let viewModel = viewModels[index] {\n+            return viewModel\n+        } else {\n+            let viewModel = SavedPreztoViewModel(prezto: savedPreztos[index])\n+            viewModels[index] = viewModel\n+            return viewModel\n+        }\n+    }\n+}\n+```\n+\n+The `SavedPreztoViewModel` encapsulates view styling logic for individual cells, as well as the logic to download thumbnail images.\n+\n+### SavedPreztoViewModel.swift\n+\n+```swift\n+class SavedPreztoViewModel {\n+\n+    let prezto: Prezto\n+    var images: [UIImage]?\n+\n+    init(prezto: Prezto) {\n+        self.prezto = prezto\n+    }\n+\n+    var titleLabelText: String {\n+        return prezto.title ?? \"\"\n+    }\n+\n+    var accessCodeLabelText: String {\n+        guard let code = prezto.accessCode else {\n+            return \"\"\n+        }\n+        return \"Access code: \\(code)\"\n+    }\n+\n+    var modifiedLabelText: String {\n+        guard let updatedAt = prezto.updatedAt else {\n+            return \"\"\n+        }\n+        return \"Modified on \\(updatedAt.dateInLocalTimeZone())\"\n+    }\n+\n+    func getImages(completion: () -> Void) {\n+        if let _ = images {\n+            completion()\n+        } else {\n+            prezto.thumbnailImages { images in\n+                self.images = images\n+                completion()\n+            }\n+        }\n+    }\n+```\n+\n+## Using the view models\n+\n+Below is a stripped-down version of `SavedPreztosViewController` showing the relevant places where the view models are used:\n+\n+### SavedPreztosViewController.swift\n+\n+```swift\n+class SavedPreztosViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UIScrollViewDelegate, SWTableViewCellDelegate {\n+    \n+    @IBOutlet weak var tableView: UITableView!\n+\n+    let viewModel = SavedPreztosViewModel()\n+\n+    /********************************************************************\n+     * Skipping a bunch of view controller setup and life-cycle code... *\n+     ********************************************************************/\n+\n+    override func didReceiveMemoryWarning() {\n+        super.didReceiveMemoryWarning()\n+\n+        viewModel.clearCachedImages()\n+    }\n+    \n+    /****************************************\n+     * Skipping a bunch of UI setup code... *\n+     ****************************************/\n+\n+    private func refreshSavedPreztosList() {\n+        viewModel.retrievePreztos { result in\n+            switch result {\n+            case .Success:\n+                dispatch_async(dispatch_get_main_queue()) {\n+                    self.tableView.reloadData()\n+                    self.setupBunnyImage()\n+                }\n+            case .Failure(let error):\n+                // TODO: Need UI here to retry\n+                print(\"Error refreshing preztos: \\(error)\")\n+                return\n+            }\n+        }\n+    }\n+\n+    private func deletePreztoAtIndex(index: Int) {\n+        viewModel.deletePreztoAtIndex(index) { result in\n+            dispatch_async(dispatch_get_main_queue()) {\n+                switch result {\n+                case .Success:\n+                    if self.viewModel.count == 0 {\n+                        self.goToEmptyVC()\n+                    } else {\n+                        self.tableView.reloadData()\n+                        self.setupBunnyImage()\n+                    }\n+                case .Failure(let e):\n+                    print(\"Error deleting prezto: \\(e)\")\n+                    self.presentAlertWithTitle(\"Error\", message: \"There was an unexpected problem deleting a Prezto.\")\n+                }\n+            }\n+        }\n+    }\n+\n+    /*****************************************\n+     * Skipping a bunch of helper methods... *\n+     *****************************************/\n+\n+    // MARK: - UITableViewDataSource\n+    \n+    func numberOfSectionsInTableView(tableView: UITableView) -> Int {\n+        return viewModel.count + 1","path":"ios/viewmodels/view-model-example.md","position":215,"original_position":215,"commit_id":"e9d69ff559d445e6d56518bff7027ed754b32798","original_commit_id":"e9d69ff559d445e6d56518bff7027ed754b32798","user":{"login":"colinbrash","id":1577513,"avatar_url":"https://avatars.githubusercontent.com/u/1577513?v=3","gravatar_id":"","url":"https://api.github.com/users/colinbrash","html_url":"https://github.com/colinbrash","followers_url":"https://api.github.com/users/colinbrash/followers","following_url":"https://api.github.com/users/colinbrash/following{/other_user}","gists_url":"https://api.github.com/users/colinbrash/gists{/gist_id}","starred_url":"https://api.github.com/users/colinbrash/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/colinbrash/subscriptions","organizations_url":"https://api.github.com/users/colinbrash/orgs","repos_url":"https://api.github.com/users/colinbrash/repos","events_url":"https://api.github.com/users/colinbrash/events{/privacy}","received_events_url":"https://api.github.com/users/colinbrash/received_events","type":"User","site_admin":false},"body":"I think this logic should be in the ViewModel?","created_at":"2016-09-13T12:11:39Z","updated_at":"2016-09-13T12:11:39Z","html_url":"https://github.com/IntrepidPursuits/sherpa/pull/47#discussion_r78545737","pull_request_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47","_links":{"self":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/comments/78545737"},"html":{"href":"https://github.com/IntrepidPursuits/sherpa/pull/47#discussion_r78545737"},"pull_request":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47"}}},"pull_request":{"url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47","id":84970938,"html_url":"https://github.com/IntrepidPursuits/sherpa/pull/47","diff_url":"https://github.com/IntrepidPursuits/sherpa/pull/47.diff","patch_url":"https://github.com/IntrepidPursuits/sherpa/pull/47.patch","issue_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/47","number":47,"state":"open","locked":false,"title":"First pass at extracting a view model example from the prezto project.","user":{"login":"nivektric","id":697810,"avatar_url":"https://avatars.githubusercontent.com/u/697810?v=3","gravatar_id":"","url":"https://api.github.com/users/nivektric","html_url":"https://github.com/nivektric","followers_url":"https://api.github.com/users/nivektric/followers","following_url":"https://api.github.com/users/nivektric/following{/other_user}","gists_url":"https://api.github.com/users/nivektric/gists{/gist_id}","starred_url":"https://api.github.com/users/nivektric/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nivektric/subscriptions","organizations_url":"https://api.github.com/users/nivektric/orgs","repos_url":"https://api.github.com/users/nivektric/repos","events_url":"https://api.github.com/users/nivektric/events{/privacy}","received_events_url":"https://api.github.com/users/nivektric/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-09-13T01:13:56Z","updated_at":"2016-09-13T12:11:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"012f3dca2bb3940960486d4d0f05cf94d74a2ba9","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47/commits","review_comments_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47/comments","review_comment_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/comments{/number}","comments_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/47/comments","statuses_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/statuses/e9d69ff559d445e6d56518bff7027ed754b32798","head":{"label":"IntrepidPursuits:kevin/viewmodel-example","ref":"kevin/viewmodel-example","sha":"e9d69ff559d445e6d56518bff7027ed754b32798","user":{"login":"IntrepidPursuits","id":2151424,"avatar_url":"https://avatars.githubusercontent.com/u/2151424?v=3","gravatar_id":"","url":"https://api.github.com/users/IntrepidPursuits","html_url":"https://github.com/IntrepidPursuits","followers_url":"https://api.github.com/users/IntrepidPursuits/followers","following_url":"https://api.github.com/users/IntrepidPursuits/following{/other_user}","gists_url":"https://api.github.com/users/IntrepidPursuits/gists{/gist_id}","starred_url":"https://api.github.com/users/IntrepidPursuits/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IntrepidPursuits/subscriptions","organizations_url":"https://api.github.com/users/IntrepidPursuits/orgs","repos_url":"https://api.github.com/users/IntrepidPursuits/repos","events_url":"https://api.github.com/users/IntrepidPursuits/events{/privacy}","received_events_url":"https://api.github.com/users/IntrepidPursuits/received_events","type":"Organization","site_admin":false},"repo":{"id":39629319,"name":"sherpa","full_name":"IntrepidPursuits/sherpa","owner":{"login":"IntrepidPursuits","id":2151424,"avatar_url":"https://avatars.githubusercontent.com/u/2151424?v=3","gravatar_id":"","url":"https://api.github.com/users/IntrepidPursuits","html_url":"https://github.com/IntrepidPursuits","followers_url":"https://api.github.com/users/IntrepidPursuits/followers","following_url":"https://api.github.com/users/IntrepidPursuits/following{/other_user}","gists_url":"https://api.github.com/users/IntrepidPursuits/gists{/gist_id}","starred_url":"https://api.github.com/users/IntrepidPursuits/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IntrepidPursuits/subscriptions","organizations_url":"https://api.github.com/users/IntrepidPursuits/orgs","repos_url":"https://api.github.com/users/IntrepidPursuits/repos","events_url":"https://api.github.com/users/IntrepidPursuits/events{/privacy}","received_events_url":"https://api.github.com/users/IntrepidPursuits/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/IntrepidPursuits/sherpa","description":"Development best practices for Intrepid","fork":false,"url":"https://api.github.com/repos/IntrepidPursuits/sherpa","forks_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/forks","keys_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/teams","hooks_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/hooks","issue_events_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/events{/number}","events_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/events","assignees_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/assignees{/user}","branches_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/branches{/branch}","tags_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/tags","blobs_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/refs{/sha}","trees_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/statuses/{sha}","languages_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/languages","stargazers_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/stargazers","contributors_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/contributors","subscribers_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/subscribers","subscription_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/subscription","commits_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/commits{/sha}","git_commits_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/commits{/sha}","comments_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/comments{/number}","issue_comment_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/comments{/number}","contents_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/contents/{+path}","compare_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/merges","archive_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/downloads","issues_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues{/number}","pulls_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls{/number}","milestones_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/milestones{/number}","notifications_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/labels{/name}","releases_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/releases{/id}","deployments_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/deployments","created_at":"2015-07-24T11:31:35Z","updated_at":"2016-07-18T13:48:13Z","pushed_at":"2016-09-13T01:13:56Z","git_url":"git://github.com/IntrepidPursuits/sherpa.git","ssh_url":"git@github.com:IntrepidPursuits/sherpa.git","clone_url":"https://github.com/IntrepidPursuits/sherpa.git","svn_url":"https://github.com/IntrepidPursuits/sherpa","homepage":null,"size":4290,"stargazers_count":8,"watchers_count":8,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":5,"forks":2,"open_issues":5,"watchers":8,"default_branch":"master"}},"base":{"label":"IntrepidPursuits:ying/viewmodels","ref":"ying/viewmodels","sha":"46dce0a7cd2e7bbe40afd639854ffebfe7bd546d","user":{"login":"IntrepidPursuits","id":2151424,"avatar_url":"https://avatars.githubusercontent.com/u/2151424?v=3","gravatar_id":"","url":"https://api.github.com/users/IntrepidPursuits","html_url":"https://github.com/IntrepidPursuits","followers_url":"https://api.github.com/users/IntrepidPursuits/followers","following_url":"https://api.github.com/users/IntrepidPursuits/following{/other_user}","gists_url":"https://api.github.com/users/IntrepidPursuits/gists{/gist_id}","starred_url":"https://api.github.com/users/IntrepidPursuits/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IntrepidPursuits/subscriptions","organizations_url":"https://api.github.com/users/IntrepidPursuits/orgs","repos_url":"https://api.github.com/users/IntrepidPursuits/repos","events_url":"https://api.github.com/users/IntrepidPursuits/events{/privacy}","received_events_url":"https://api.github.com/users/IntrepidPursuits/received_events","type":"Organization","site_admin":false},"repo":{"id":39629319,"name":"sherpa","full_name":"IntrepidPursuits/sherpa","owner":{"login":"IntrepidPursuits","id":2151424,"avatar_url":"https://avatars.githubusercontent.com/u/2151424?v=3","gravatar_id":"","url":"https://api.github.com/users/IntrepidPursuits","html_url":"https://github.com/IntrepidPursuits","followers_url":"https://api.github.com/users/IntrepidPursuits/followers","following_url":"https://api.github.com/users/IntrepidPursuits/following{/other_user}","gists_url":"https://api.github.com/users/IntrepidPursuits/gists{/gist_id}","starred_url":"https://api.github.com/users/IntrepidPursuits/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/IntrepidPursuits/subscriptions","organizations_url":"https://api.github.com/users/IntrepidPursuits/orgs","repos_url":"https://api.github.com/users/IntrepidPursuits/repos","events_url":"https://api.github.com/users/IntrepidPursuits/events{/privacy}","received_events_url":"https://api.github.com/users/IntrepidPursuits/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/IntrepidPursuits/sherpa","description":"Development best practices for Intrepid","fork":false,"url":"https://api.github.com/repos/IntrepidPursuits/sherpa","forks_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/forks","keys_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/keys{/key_id}","collaborators_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/teams","hooks_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/hooks","issue_events_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/events{/number}","events_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/events","assignees_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/assignees{/user}","branches_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/branches{/branch}","tags_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/tags","blobs_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/refs{/sha}","trees_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/trees{/sha}","statuses_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/statuses/{sha}","languages_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/languages","stargazers_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/stargazers","contributors_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/contributors","subscribers_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/subscribers","subscription_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/subscription","commits_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/commits{/sha}","git_commits_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/git/commits{/sha}","comments_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/comments{/number}","issue_comment_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/comments{/number}","contents_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/contents/{+path}","compare_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/compare/{base}...{head}","merges_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/merges","archive_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/downloads","issues_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues{/number}","pulls_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls{/number}","milestones_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/milestones{/number}","notifications_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/labels{/name}","releases_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/releases{/id}","deployments_url":"https://api.github.com/repos/IntrepidPursuits/sherpa/deployments","created_at":"2015-07-24T11:31:35Z","updated_at":"2016-07-18T13:48:13Z","pushed_at":"2016-09-13T01:13:56Z","git_url":"git://github.com/IntrepidPursuits/sherpa.git","ssh_url":"git@github.com:IntrepidPursuits/sherpa.git","clone_url":"https://github.com/IntrepidPursuits/sherpa.git","svn_url":"https://github.com/IntrepidPursuits/sherpa","homepage":null,"size":4290,"stargazers_count":8,"watchers_count":8,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":5,"forks":2,"open_issues":5,"watchers":8,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47"},"html":{"href":"https://github.com/IntrepidPursuits/sherpa/pull/47"},"issue":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/47"},"comments":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/issues/47/comments"},"review_comments":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47/comments"},"review_comment":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/pulls/47/commits"},"statuses":{"href":"https://api.github.com/repos/IntrepidPursuits/sherpa/statuses/e9d69ff559d445e6d56518bff7027ed754b32798"}}}}
{"actor":{"display_login":"colinbrash"}}