{"action":"created","comment":{"url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/comments/23533727","id":23533727,"diff_hunk":"@@ -0,0 +1,410 @@\n+//\n+//  TWTJSONObjectValidatorGenerator.m\n+//  TWTValidation\n+//\n+//  Created by Jill Cohen on 1/14/15.\n+//  Copyright (c) 2015 Two Toasters, LLC.\n+//\n+//  Permission is hereby granted, free of charge, to any person obtaining a copy\n+//  of this software and associated documentation files (the \"Software\"), to deal\n+//  in the Software without restriction, including without limitation the rights\n+//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n+//  copies of the Software, and to permit persons to whom the Software is\n+//  furnished to do so, subject to the following conditions:\n+//\n+//  The above copyright notice and this permission notice shall be included in\n+//  all copies or substantial portions of the Software.\n+//\n+//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n+//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n+//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n+//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n+//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n+//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n+//  THE SOFTWARE.\n+//\n+\n+#import <TWTValidation/TWTJSONObjectValidatorGenerator.h>\n+\n+#import <TWTValidation/TWTValidation.h>\n+\n+#import <TWTValidation/TWTJSONSchemaASTCommon.h>\n+#import <TWTValidation/TWTJSONSchemaParser.h>\n+#import <TWTValidation/TWTJSONSchemaArrayValidator.h>\n+#import <TWTValidation/TWTJSONSchemaObjectValidator.h>\n+\n+\n+@interface TWTJSONObjectValidatorGenerator ()\n+\n+@property (nonatomic, strong, readonly) NSMutableArray *objectStack;\n+\n+@end\n+\n+\n+@implementation TWTJSONObjectValidatorGenerator\n+\n+- (instancetype)init\n+{\n+    self = [super init];\n+    if (self) {\n+        _objectStack = [[NSMutableArray alloc] init];\n+    }\n+    return self;\n+}\n+\n+\n+- (TWTJSONObjectValidator *)validatorFromJSONSchema:(NSDictionary *)schema error:(NSError *__autoreleasing *)outError warnings:(NSArray *__autoreleasing *)outWarnings\n+{\n+    [self.objectStack removeAllObjects];\n+\n+    TWTJSONSchemaParser *parser = [[TWTJSONSchemaParser alloc] initWithJSONSchema:schema];\n+    NSError *parsingError = nil;\n+    TWTJSONSchemaTopLevelASTNode *topLevelNode = [parser parseWithError:&parsingError warnings:outWarnings];\n+    if (parsingError) {\n+        if (outError) {\n+            *outError = parsingError;\n+        }\n+        return nil;\n+    }\n+\n+    [topLevelNode acceptProcessor:self];\n+    return [self popCurrentObject];\n+}\n+\n+\n+#pragma mark - ASTNodeProcessor protocol methods\n+\n+- (void)processTopLevelNode:(TWTJSONSchemaTopLevelASTNode *)topLevelNode\n+{\n+    [topLevelNode.schema acceptProcessor:self];\n+}\n+\n+\n+- (void)processGenericNode:(TWTJSONSchemaGenericASTNode *)genericNode\n+{\n+    TWTValidator *commonValidator = [self commonValidatorFromNode:genericNode];\n+    TWTValidator *typeValidator = nil;\n+\n+    if ([genericNode.validTypes containsObject:TWTJSONSchemaTypeKeywordBoolean]) {\n+        typeValidator = [[TWTBlockValidator alloc] initWithBlock:^BOOL(id value, NSError *__autoreleasing *outError) {\n+            return [value isKindOfClass:[NSNumber class]] && strcmp([(NSValue *)value objCType], @encode(BOOL)) == 0;\n+        }];\n+    } else if ([genericNode.validTypes containsObject:TWTJSONSchemaTypeKeywordNull]) {\n+        typeValidator = [TWTValueValidator valueValidatorWithClass:[NSNull class] allowsNil:NO allowsNull:YES];\n+    }\n+\n+    [self pushJSONObjectValidatorWithCommonValidator:commonValidator typeValidator:typeValidator node:genericNode];\n+}\n+\n+\n+- (void)processArrayNode:(TWTJSONSchemaArrayASTNode *)arrayNode\n+{\n+    TWTValidator *commonValidator = [self commonValidatorFromNode:arrayNode];\n+\n+    TWTValidator *itemValidator = nil;\n+    NSArray *indexedItemValidators = nil;\n+    if (arrayNode.itemSchema) {\n+        itemValidator = [self validatorFromNode:arrayNode.itemSchema];\n+    } else {\n+        indexedItemValidators = [self validatorsFromNodeArray:arrayNode.indexedItemSchemas];\n+    }\n+\n+    TWTValidator *additionalItemsValidator = [self validatorFromNode:arrayNode.additionalItemsNode];\n+    TWTJSONSchemaArrayValidator *typeValidator = [[TWTJSONSchemaArrayValidator alloc] initWithMaximumItemCount:arrayNode.maximumItemCount\n+                                                                                              minimumItemCount:arrayNode.minimumItemCount\n+                                                                                           requiresUniqueItems:arrayNode.requiresUniqueItems\n+                                                                                                 itemValidator:itemValidator\n+                                                                                         indexedItemValidators:indexedItemValidators\n+                                                                                      additionalItemsValidator:additionalItemsValidator];\n+\n+    [self pushJSONObjectValidatorWithCommonValidator:commonValidator typeValidator:typeValidator node:arrayNode];\n+}\n+\n+\n+- (void)processNumberNode:(TWTJSONSchemaNumberASTNode *)numberNode\n+{\n+    TWTValidator *commonValidator = [self commonValidatorFromNode:numberNode];\n+\n+    [self pushNewObject:[[NSMutableArray alloc] init]];\n+\n+    [self addSubvalidator:[[TWTBlockValidator alloc] initWithBlock:^BOOL(id value, NSError *__autoreleasing *outError) {\n+        return [value isKindOfClass:[NSNumber class]] && strcmp([(NSValue *)value objCType], @encode(BOOL)) != 0;\n+    }]];\n+\n+    if (numberNode.minimum || numberNode.maximum || numberNode.requireIntegralValue) {\n+        TWTNumberValidator *validator = [[TWTNumberValidator alloc] initWithMinimum:numberNode.minimum maximum:numberNode.maximum];\n+        validator.maximumExclusive = numberNode.exclusiveMaximum;\n+        validator.minimumExclusive = numberNode.exclusiveMinimum;\n+        validator.requiresIntegralValue = numberNode.requireIntegralValue;\n+        [self addSubvalidator:validator];\n+    }\n+\n+    if (numberNode.multipleOf) {\n+        double multipleOfValue = numberNode.multipleOf.doubleValue;\n+        [self addSubvalidator:[[TWTBlockValidator alloc] initWithBlock:^BOOL(id value, NSError *__autoreleasing *outError) {\n+            double result = [(NSNumber *)value doubleValue] / multipleOfValue;\n+            return result == trunc(result);","path":"TWTValidation/JSON Validator/Processors/TWTJSONObjectValidatorGenerator.m","position":146,"original_position":146,"commit_id":"f513cd6442448a3e3fd9c038fefa58d90c17c328","original_commit_id":"f513cd6442448a3e3fd9c038fefa58d90c17c328","user":{"login":"prachigauriar","id":4042148,"avatar_url":"https://avatars.githubusercontent.com/u/4042148?v=3","gravatar_id":"","url":"https://api.github.com/users/prachigauriar","html_url":"https://github.com/prachigauriar","followers_url":"https://api.github.com/users/prachigauriar/followers","following_url":"https://api.github.com/users/prachigauriar/following{/other_user}","gists_url":"https://api.github.com/users/prachigauriar/gists{/gist_id}","starred_url":"https://api.github.com/users/prachigauriar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prachigauriar/subscriptions","organizations_url":"https://api.github.com/users/prachigauriar/orgs","repos_url":"https://api.github.com/users/prachigauriar/repos","events_url":"https://api.github.com/users/prachigauriar/events{/privacy}","received_events_url":"https://api.github.com/users/prachigauriar/received_events","type":"User","site_admin":false},"body":"Two things: \r\n\r\n1. You don’t know value is an NSNumber, do you?\r\n2. You can do this a little more cleanly using `fmod`. \r\n\r\n```objc\r\nreturn fmod([value doubleValue], multipleOfValue]) == 0.0;\r\n```","created_at":"2015-01-26T14:36:48Z","updated_at":"2015-01-26T14:36:48Z","html_url":"https://github.com/twotoasters/TWTValidation/pull/31#discussion_r23533727","pull_request_url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31","_links":{"self":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/comments/23533727"},"html":{"href":"https://github.com/twotoasters/TWTValidation/pull/31#discussion_r23533727"},"pull_request":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31"}}},"pull_request":{"url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31","id":27785743,"html_url":"https://github.com/twotoasters/TWTValidation/pull/31","diff_url":"https://github.com/twotoasters/TWTValidation/pull/31.diff","patch_url":"https://github.com/twotoasters/TWTValidation/pull/31.patch","issue_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues/31","number":31,"state":"open","locked":false,"title":"Generate validators, validate JSON objects, pretty printer testing","user":{"login":"jillhc","id":7916504,"avatar_url":"https://avatars.githubusercontent.com/u/7916504?v=3","gravatar_id":"","url":"https://api.github.com/users/jillhc","html_url":"https://github.com/jillhc","followers_url":"https://api.github.com/users/jillhc/followers","following_url":"https://api.github.com/users/jillhc/following{/other_user}","gists_url":"https://api.github.com/users/jillhc/gists{/gist_id}","starred_url":"https://api.github.com/users/jillhc/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jillhc/subscriptions","organizations_url":"https://api.github.com/users/jillhc/orgs","repos_url":"https://api.github.com/users/jillhc/repos","events_url":"https://api.github.com/users/jillhc/events{/privacy}","received_events_url":"https://api.github.com/users/jillhc/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-01-21T19:08:32Z","updated_at":"2015-01-26T14:36:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b61cd41993271d4ecf1d4e8e2daa060608a1b6b2","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31/commits","review_comments_url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31/comments","review_comment_url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/comments/{number}","comments_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues/31/comments","statuses_url":"https://api.github.com/repos/twotoasters/TWTValidation/statuses/f513cd6442448a3e3fd9c038fefa58d90c17c328","head":{"label":"twotoasters:test-printer","ref":"test-printer","sha":"f513cd6442448a3e3fd9c038fefa58d90c17c328","user":{"login":"twotoasters","id":112994,"avatar_url":"https://avatars.githubusercontent.com/u/112994?v=3","gravatar_id":"","url":"https://api.github.com/users/twotoasters","html_url":"https://github.com/twotoasters","followers_url":"https://api.github.com/users/twotoasters/followers","following_url":"https://api.github.com/users/twotoasters/following{/other_user}","gists_url":"https://api.github.com/users/twotoasters/gists{/gist_id}","starred_url":"https://api.github.com/users/twotoasters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twotoasters/subscriptions","organizations_url":"https://api.github.com/users/twotoasters/orgs","repos_url":"https://api.github.com/users/twotoasters/repos","events_url":"https://api.github.com/users/twotoasters/events{/privacy}","received_events_url":"https://api.github.com/users/twotoasters/received_events","type":"Organization","site_admin":false},"repo":{"id":18248731,"name":"TWTValidation","full_name":"twotoasters/TWTValidation","owner":{"login":"twotoasters","id":112994,"avatar_url":"https://avatars.githubusercontent.com/u/112994?v=3","gravatar_id":"","url":"https://api.github.com/users/twotoasters","html_url":"https://github.com/twotoasters","followers_url":"https://api.github.com/users/twotoasters/followers","following_url":"https://api.github.com/users/twotoasters/following{/other_user}","gists_url":"https://api.github.com/users/twotoasters/gists{/gist_id}","starred_url":"https://api.github.com/users/twotoasters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twotoasters/subscriptions","organizations_url":"https://api.github.com/users/twotoasters/orgs","repos_url":"https://api.github.com/users/twotoasters/repos","events_url":"https://api.github.com/users/twotoasters/events{/privacy}","received_events_url":"https://api.github.com/users/twotoasters/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/twotoasters/TWTValidation","description":"TWTValidation is a Cocoa framework for declaratively validating data.","fork":false,"url":"https://api.github.com/repos/twotoasters/TWTValidation","forks_url":"https://api.github.com/repos/twotoasters/TWTValidation/forks","keys_url":"https://api.github.com/repos/twotoasters/TWTValidation/keys{/key_id}","collaborators_url":"https://api.github.com/repos/twotoasters/TWTValidation/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/twotoasters/TWTValidation/teams","hooks_url":"https://api.github.com/repos/twotoasters/TWTValidation/hooks","issue_events_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues/events{/number}","events_url":"https://api.github.com/repos/twotoasters/TWTValidation/events","assignees_url":"https://api.github.com/repos/twotoasters/TWTValidation/assignees{/user}","branches_url":"https://api.github.com/repos/twotoasters/TWTValidation/branches{/branch}","tags_url":"https://api.github.com/repos/twotoasters/TWTValidation/tags","blobs_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/refs{/sha}","trees_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/trees{/sha}","statuses_url":"https://api.github.com/repos/twotoasters/TWTValidation/statuses/{sha}","languages_url":"https://api.github.com/repos/twotoasters/TWTValidation/languages","stargazers_url":"https://api.github.com/repos/twotoasters/TWTValidation/stargazers","contributors_url":"https://api.github.com/repos/twotoasters/TWTValidation/contributors","subscribers_url":"https://api.github.com/repos/twotoasters/TWTValidation/subscribers","subscription_url":"https://api.github.com/repos/twotoasters/TWTValidation/subscription","commits_url":"https://api.github.com/repos/twotoasters/TWTValidation/commits{/sha}","git_commits_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/commits{/sha}","comments_url":"https://api.github.com/repos/twotoasters/TWTValidation/comments{/number}","issue_comment_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues/comments/{number}","contents_url":"https://api.github.com/repos/twotoasters/TWTValidation/contents/{+path}","compare_url":"https://api.github.com/repos/twotoasters/TWTValidation/compare/{base}...{head}","merges_url":"https://api.github.com/repos/twotoasters/TWTValidation/merges","archive_url":"https://api.github.com/repos/twotoasters/TWTValidation/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/twotoasters/TWTValidation/downloads","issues_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues{/number}","pulls_url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls{/number}","milestones_url":"https://api.github.com/repos/twotoasters/TWTValidation/milestones{/number}","notifications_url":"https://api.github.com/repos/twotoasters/TWTValidation/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/twotoasters/TWTValidation/labels{/name}","releases_url":"https://api.github.com/repos/twotoasters/TWTValidation/releases{/id}","created_at":"2014-03-29T19:19:21Z","updated_at":"2015-01-21T02:40:14Z","pushed_at":"2015-01-23T22:46:10Z","git_url":"git://github.com/twotoasters/TWTValidation.git","ssh_url":"git@github.com:twotoasters/TWTValidation.git","clone_url":"https://github.com/twotoasters/TWTValidation.git","svn_url":"https://github.com/twotoasters/TWTValidation","homepage":"","size":1021,"stargazers_count":16,"watchers_count":16,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":16,"default_branch":"master"}},"base":{"label":"twotoasters:master","ref":"master","sha":"4c7c8442f4c9340d829be9d33b68d9561a03a461","user":{"login":"twotoasters","id":112994,"avatar_url":"https://avatars.githubusercontent.com/u/112994?v=3","gravatar_id":"","url":"https://api.github.com/users/twotoasters","html_url":"https://github.com/twotoasters","followers_url":"https://api.github.com/users/twotoasters/followers","following_url":"https://api.github.com/users/twotoasters/following{/other_user}","gists_url":"https://api.github.com/users/twotoasters/gists{/gist_id}","starred_url":"https://api.github.com/users/twotoasters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twotoasters/subscriptions","organizations_url":"https://api.github.com/users/twotoasters/orgs","repos_url":"https://api.github.com/users/twotoasters/repos","events_url":"https://api.github.com/users/twotoasters/events{/privacy}","received_events_url":"https://api.github.com/users/twotoasters/received_events","type":"Organization","site_admin":false},"repo":{"id":18248731,"name":"TWTValidation","full_name":"twotoasters/TWTValidation","owner":{"login":"twotoasters","id":112994,"avatar_url":"https://avatars.githubusercontent.com/u/112994?v=3","gravatar_id":"","url":"https://api.github.com/users/twotoasters","html_url":"https://github.com/twotoasters","followers_url":"https://api.github.com/users/twotoasters/followers","following_url":"https://api.github.com/users/twotoasters/following{/other_user}","gists_url":"https://api.github.com/users/twotoasters/gists{/gist_id}","starred_url":"https://api.github.com/users/twotoasters/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/twotoasters/subscriptions","organizations_url":"https://api.github.com/users/twotoasters/orgs","repos_url":"https://api.github.com/users/twotoasters/repos","events_url":"https://api.github.com/users/twotoasters/events{/privacy}","received_events_url":"https://api.github.com/users/twotoasters/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/twotoasters/TWTValidation","description":"TWTValidation is a Cocoa framework for declaratively validating data.","fork":false,"url":"https://api.github.com/repos/twotoasters/TWTValidation","forks_url":"https://api.github.com/repos/twotoasters/TWTValidation/forks","keys_url":"https://api.github.com/repos/twotoasters/TWTValidation/keys{/key_id}","collaborators_url":"https://api.github.com/repos/twotoasters/TWTValidation/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/twotoasters/TWTValidation/teams","hooks_url":"https://api.github.com/repos/twotoasters/TWTValidation/hooks","issue_events_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues/events{/number}","events_url":"https://api.github.com/repos/twotoasters/TWTValidation/events","assignees_url":"https://api.github.com/repos/twotoasters/TWTValidation/assignees{/user}","branches_url":"https://api.github.com/repos/twotoasters/TWTValidation/branches{/branch}","tags_url":"https://api.github.com/repos/twotoasters/TWTValidation/tags","blobs_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/refs{/sha}","trees_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/trees{/sha}","statuses_url":"https://api.github.com/repos/twotoasters/TWTValidation/statuses/{sha}","languages_url":"https://api.github.com/repos/twotoasters/TWTValidation/languages","stargazers_url":"https://api.github.com/repos/twotoasters/TWTValidation/stargazers","contributors_url":"https://api.github.com/repos/twotoasters/TWTValidation/contributors","subscribers_url":"https://api.github.com/repos/twotoasters/TWTValidation/subscribers","subscription_url":"https://api.github.com/repos/twotoasters/TWTValidation/subscription","commits_url":"https://api.github.com/repos/twotoasters/TWTValidation/commits{/sha}","git_commits_url":"https://api.github.com/repos/twotoasters/TWTValidation/git/commits{/sha}","comments_url":"https://api.github.com/repos/twotoasters/TWTValidation/comments{/number}","issue_comment_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues/comments/{number}","contents_url":"https://api.github.com/repos/twotoasters/TWTValidation/contents/{+path}","compare_url":"https://api.github.com/repos/twotoasters/TWTValidation/compare/{base}...{head}","merges_url":"https://api.github.com/repos/twotoasters/TWTValidation/merges","archive_url":"https://api.github.com/repos/twotoasters/TWTValidation/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/twotoasters/TWTValidation/downloads","issues_url":"https://api.github.com/repos/twotoasters/TWTValidation/issues{/number}","pulls_url":"https://api.github.com/repos/twotoasters/TWTValidation/pulls{/number}","milestones_url":"https://api.github.com/repos/twotoasters/TWTValidation/milestones{/number}","notifications_url":"https://api.github.com/repos/twotoasters/TWTValidation/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/twotoasters/TWTValidation/labels{/name}","releases_url":"https://api.github.com/repos/twotoasters/TWTValidation/releases{/id}","created_at":"2014-03-29T19:19:21Z","updated_at":"2015-01-21T02:40:14Z","pushed_at":"2015-01-23T22:46:10Z","git_url":"git://github.com/twotoasters/TWTValidation.git","ssh_url":"git@github.com:twotoasters/TWTValidation.git","clone_url":"https://github.com/twotoasters/TWTValidation.git","svn_url":"https://github.com/twotoasters/TWTValidation","homepage":"","size":1021,"stargazers_count":16,"watchers_count":16,"language":"Objective-C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":1,"forks":2,"open_issues":1,"watchers":16,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31"},"html":{"href":"https://github.com/twotoasters/TWTValidation/pull/31"},"issue":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/issues/31"},"comments":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/issues/31/comments"},"review_comments":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31/comments"},"review_comment":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/pulls/31/commits"},"statuses":{"href":"https://api.github.com/repos/twotoasters/TWTValidation/statuses/f513cd6442448a3e3fd9c038fefa58d90c17c328"}}}}