{"action":"created","comment":{"url":"https://api.github.com/repos/cgclever/redbox/pulls/comments/80844398","pull_request_review_id":1869343,"id":80844398,"diff_hunk":"@@ -0,0 +1,243 @@\n+package s3box\n+\n+import (\n+\t\"encoding/json\"\n+\t\"fmt\"\n+\t\"log\"\n+\t\"sync\"\n+\t\"time\"\n+\n+\t\"github.com/aws/aws-sdk-go/aws\"\n+\t\"github.com/aws/aws-sdk-go/aws/credentials\"\n+\t\"github.com/aws/aws-sdk-go/aws/session\"\n+\t\"github.com/aws/aws-sdk-go/service/s3\"\n+)\n+\n+const (\n+\t// DefaultBufferSize is set to 10MB\n+\tDefaultBufferSize = 10000000\n+)\n+\n+var (\n+\t// ErrS3BucketRequired signals an s3 bucket wasn't provided\n+\tErrS3BucketRequired = fmt.Errorf(\"An s3 bucket is required to create an s3box.\")\n+\n+\t// ErrBoxIsSealed signals an operation which can't occur when a box is sealed.\n+\tErrBoxIsSealed = fmt.Errorf(\"Cannot perform action when box is sealed.\")\n+\n+\t// ErrBoxNotSealed signals an operation which can't occur when a box is not sealed.\n+\tErrBoxNotSealed = fmt.Errorf(\"Cannot perform action when box is not sealed.\")\n+\n+\t// ErrInvalidJSONInput captures when the input data can't be marshalled into JSON.\n+\tErrInvalidJSONInput = fmt.Errorf(\"Only JSON-able inputs are supported for syncing to Redshift.\")\n+)\n+\n+// S3Box manages piping data into S3. The mechanics are to buffer data locally, ship to s3 when too much is buffered, and finally create manifests pointing to the data files.\n+type S3Box struct {\n+\t// Inheret mutex locking/unlocking\n+\tsync.Mutex\n+\n+\t// s3Bucket specifies the intermediary bucket before ultimately piping to Redshift. The user should have access to this bucket.\n+\ts3Bucket string\n+\n+\t// s3Handler manages the piping of data to s3\n+\ts3Handler *s3.S3\n+\n+\t// bufferSize is the maximum size of data we're willing to buffer before creating an s3 file\n+\tbufferSize int\n+\n+\t// bufferedData is the data currently buffered in the box. Calling Dump ships this data into s3\n+\tbufferedData []byte\n+\n+\t// timestamp tracks the time a box was created or reset\n+\ttimestamp time.Time\n+\n+\t// fileNumber indicates the number of s3 files which have currently been created\n+\tfileNumber int\n+\n+\t// fileLocations stores the s3 files already created\n+\tfileLocations []string\n+\n+\t// isSealed indicates whether writes are currently allows to the buffer\n+\tisSealed bool\n+}\n+\n+// NewS3BoxOptions is the expected input for creating a new S3Box.\n+// Currently only an S3Bucket is required. If AWS vars aren't explicitly provided, they'll\n+// be pulled from your environment.\n+type NewS3BoxOptions struct {\n+\t// S3Bucket is the destination s3 bucket.\n+\t// This is required.\n+\tS3Bucket string\n+\n+\t// AWSKey is the AWS ACCESS KEY ID.\n+\t// By default grabs from your environment.\n+\tAWSKey string\n+\n+\t// AWSPassword is the AWS SECRET ACCESS KEY.\n+\t// By default grabs from your environment.\n+\tAWSPassword string\n+\n+\t// AWSToken is the AWS SESSION TOKEN.\n+\t// By default grabs from your environment.\n+\tAWSToken string\n+\n+\t// BufferSize is the maximum size of data we buffer internally\n+\t// before creating an s3 file.\n+\t// This is optional and defaults to 10MB.\n+\tBufferSize int\n+}\n+\n+// NewS3Box creates a new S3Box given the input options.\n+// Errors occur if there's an invalid input or if there's difficulty setting up an s3 connection.\n+func NewS3Box(options NewS3BoxOptions) (*S3Box, error) {\n+\t// Check for required inputs and a valid destination config\n+\tif options.S3Bucket == \"\" {\n+\t\treturn nil, ErrS3BucketRequired\n+\t}\n+\n+\tbufferSize := DefaultBufferSize\n+\tif options.BufferSize > 0 {\n+\t\tbufferSize = options.BufferSize\n+\t}\n+\n+\t// Setup s3 handler and aws configuration. If no creds are explicitly provided, they'll be grabbed from the environment.\n+\tregion, err := getRegionForBucket(options.S3Bucket)\n+\tif err != nil {\n+\t\treturn nil, fmt.Errorf(\"Failed to get AWS region for bucket %s: (%s)\", options.S3Bucket, err)\n+\t}\n+\n+\t// If AWS creds were provided use those, otherwise grab them from your environment\n+\tvar awsCreds *credentials.Credentials\n+\tif options.AWSKey == \"\" && options.AWSPassword == \"\" && options.AWSToken == \"\" {\n+\t\tawsCreds = credentials.NewEnvCredentials()\n+\t} else {\n+\t\tawsCreds = credentials.NewStaticCredentials(options.AWSKey, options.AWSPassword, options.AWSToken)\n+\t}\n+\tawsConfig := aws.NewConfig().WithRegion(region).WithS3ForcePathStyle(true).WithCredentials(awsCreds)\n+\tawsSession := session.New()\n+\n+\treturn &S3Box{\n+\t\ts3Bucket:   options.S3Bucket,\n+\t\ttimestamp:  time.Now(),\n+\t\ts3Handler:  s3.New(awsSession, awsConfig),\n+\t\tbufferSize: bufferSize,\n+\t}, nil\n+}\n+\n+// NextBox gives you a new box, forgetting everything about previously packaged data\n+func (sb *S3Box) NextBox() {","path":"s3box_review/s3box.go","position":129,"original_position":129,"commit_id":"19a93ebc4030acc63c6e9781ca1fc0d930f4b859","original_commit_id":"19a93ebc4030acc63c6e9781ca1fc0d930f4b859","user":{"login":"cgclever","id":13650281,"avatar_url":"https://avatars.githubusercontent.com/u/13650281?v=3","gravatar_id":"","url":"https://api.github.com/users/cgclever","html_url":"https://github.com/cgclever","followers_url":"https://api.github.com/users/cgclever/followers","following_url":"https://api.github.com/users/cgclever/following{/other_user}","gists_url":"https://api.github.com/users/cgclever/gists{/gist_id}","starred_url":"https://api.github.com/users/cgclever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgclever/subscriptions","organizations_url":"https://api.github.com/users/cgclever/orgs","repos_url":"https://api.github.com/users/cgclever/repos","events_url":"https://api.github.com/users/cgclever/events{/privacy}","received_events_url":"https://api.github.com/users/cgclever/received_events","type":"User","site_admin":false},"body":"We could do that. The reason I didn't before is because it would be recreating the s3 connection which feels like a little overhead. Whether or not it's nice, this way also has the property that \"NextBox\" won't error.\r\n\r\nWhat's your preference here?","created_at":"2016-09-28T05:16:42Z","updated_at":"2016-09-28T05:16:42Z","html_url":"https://github.com/cgclever/redbox/pull/13#discussion_r80844398","pull_request_url":"https://api.github.com/repos/cgclever/redbox/pulls/13","_links":{"self":{"href":"https://api.github.com/repos/cgclever/redbox/pulls/comments/80844398"},"html":{"href":"https://github.com/cgclever/redbox/pull/13#discussion_r80844398"},"pull_request":{"href":"https://api.github.com/repos/cgclever/redbox/pulls/13"}}},"pull_request":{"url":"https://api.github.com/repos/cgclever/redbox/pulls/13","id":86422940,"html_url":"https://github.com/cgclever/redbox/pull/13","diff_url":"https://github.com/cgclever/redbox/pull/13.diff","patch_url":"https://github.com/cgclever/redbox/pull/13.patch","issue_url":"https://api.github.com/repos/cgclever/redbox/issues/13","number":13,"state":"open","locked":false,"title":"S3Box code review","user":{"login":"cgclever","id":13650281,"avatar_url":"https://avatars.githubusercontent.com/u/13650281?v=3","gravatar_id":"","url":"https://api.github.com/users/cgclever","html_url":"https://github.com/cgclever","followers_url":"https://api.github.com/users/cgclever/followers","following_url":"https://api.github.com/users/cgclever/following{/other_user}","gists_url":"https://api.github.com/users/cgclever/gists{/gist_id}","starred_url":"https://api.github.com/users/cgclever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgclever/subscriptions","organizations_url":"https://api.github.com/users/cgclever/orgs","repos_url":"https://api.github.com/users/cgclever/repos","events_url":"https://api.github.com/users/cgclever/events{/privacy}","received_events_url":"https://api.github.com/users/cgclever/received_events","type":"User","site_admin":false},"body":"**Overview**\r\n\r\nS3Box is a manager for easily and uniformly streaming data to multiple files, after which the user can create Redshift manifest files pointing to said files.\r\n\r\nHere I've siphoned off a new directory meant explicitly for external code review.\r\n\r\n**Open Questions**\r\n\r\n1. Should `Pack` be more lenient about checking for JSON inputs? Arguably S3Box should be agnostic and more flexible, while a Redbox will want to create the checks.\r\n2. Should we have a `Seal` method, or should that happen behind the scenes in the `CreateManifests` function? One disadvantage of `Seal` is it's another step for the user. One advantage of `Seal` is that it prevents writes and alerts the user that no more writes should be occurring.","created_at":"2016-09-22T22:04:47Z","updated_at":"2016-09-28T05:16:42Z","closed_at":null,"merged_at":null,"merge_commit_sha":"1331f23dce606d15b333ae6d6cf7bcce1a9186a1","assignee":{"login":"schimmy","id":603357,"avatar_url":"https://avatars.githubusercontent.com/u/603357?v=3","gravatar_id":"","url":"https://api.github.com/users/schimmy","html_url":"https://github.com/schimmy","followers_url":"https://api.github.com/users/schimmy/followers","following_url":"https://api.github.com/users/schimmy/following{/other_user}","gists_url":"https://api.github.com/users/schimmy/gists{/gist_id}","starred_url":"https://api.github.com/users/schimmy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/schimmy/subscriptions","organizations_url":"https://api.github.com/users/schimmy/orgs","repos_url":"https://api.github.com/users/schimmy/repos","events_url":"https://api.github.com/users/schimmy/events{/privacy}","received_events_url":"https://api.github.com/users/schimmy/received_events","type":"User","site_admin":false},"assignees":[{"login":"schimmy","id":603357,"avatar_url":"https://avatars.githubusercontent.com/u/603357?v=3","gravatar_id":"","url":"https://api.github.com/users/schimmy","html_url":"https://github.com/schimmy","followers_url":"https://api.github.com/users/schimmy/followers","following_url":"https://api.github.com/users/schimmy/following{/other_user}","gists_url":"https://api.github.com/users/schimmy/gists{/gist_id}","starred_url":"https://api.github.com/users/schimmy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/schimmy/subscriptions","organizations_url":"https://api.github.com/users/schimmy/orgs","repos_url":"https://api.github.com/users/schimmy/repos","events_url":"https://api.github.com/users/schimmy/events{/privacy}","received_events_url":"https://api.github.com/users/schimmy/received_events","type":"User","site_admin":false},{"login":"kvigen","id":5514539,"avatar_url":"https://avatars.githubusercontent.com/u/5514539?v=3","gravatar_id":"","url":"https://api.github.com/users/kvigen","html_url":"https://github.com/kvigen","followers_url":"https://api.github.com/users/kvigen/followers","following_url":"https://api.github.com/users/kvigen/following{/other_user}","gists_url":"https://api.github.com/users/kvigen/gists{/gist_id}","starred_url":"https://api.github.com/users/kvigen/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kvigen/subscriptions","organizations_url":"https://api.github.com/users/kvigen/orgs","repos_url":"https://api.github.com/users/kvigen/repos","events_url":"https://api.github.com/users/kvigen/events{/privacy}","received_events_url":"https://api.github.com/users/kvigen/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/cgclever/redbox/pulls/13/commits","review_comments_url":"https://api.github.com/repos/cgclever/redbox/pulls/13/comments","review_comment_url":"https://api.github.com/repos/cgclever/redbox/pulls/comments{/number}","comments_url":"https://api.github.com/repos/cgclever/redbox/issues/13/comments","statuses_url":"https://api.github.com/repos/cgclever/redbox/statuses/19a93ebc4030acc63c6e9781ca1fc0d930f4b859","head":{"label":"cgclever:s3box-code-review","ref":"s3box-code-review","sha":"19a93ebc4030acc63c6e9781ca1fc0d930f4b859","user":{"login":"cgclever","id":13650281,"avatar_url":"https://avatars.githubusercontent.com/u/13650281?v=3","gravatar_id":"","url":"https://api.github.com/users/cgclever","html_url":"https://github.com/cgclever","followers_url":"https://api.github.com/users/cgclever/followers","following_url":"https://api.github.com/users/cgclever/following{/other_user}","gists_url":"https://api.github.com/users/cgclever/gists{/gist_id}","starred_url":"https://api.github.com/users/cgclever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgclever/subscriptions","organizations_url":"https://api.github.com/users/cgclever/orgs","repos_url":"https://api.github.com/users/cgclever/repos","events_url":"https://api.github.com/users/cgclever/events{/privacy}","received_events_url":"https://api.github.com/users/cgclever/received_events","type":"User","site_admin":false},"repo":{"id":66228856,"name":"redbox","full_name":"cgclever/redbox","owner":{"login":"cgclever","id":13650281,"avatar_url":"https://avatars.githubusercontent.com/u/13650281?v=3","gravatar_id":"","url":"https://api.github.com/users/cgclever","html_url":"https://github.com/cgclever","followers_url":"https://api.github.com/users/cgclever/followers","following_url":"https://api.github.com/users/cgclever/following{/other_user}","gists_url":"https://api.github.com/users/cgclever/gists{/gist_id}","starred_url":"https://api.github.com/users/cgclever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgclever/subscriptions","organizations_url":"https://api.github.com/users/cgclever/orgs","repos_url":"https://api.github.com/users/cgclever/repos","events_url":"https://api.github.com/users/cgclever/events{/privacy}","received_events_url":"https://api.github.com/users/cgclever/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cgclever/redbox","description":null,"fork":false,"url":"https://api.github.com/repos/cgclever/redbox","forks_url":"https://api.github.com/repos/cgclever/redbox/forks","keys_url":"https://api.github.com/repos/cgclever/redbox/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cgclever/redbox/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cgclever/redbox/teams","hooks_url":"https://api.github.com/repos/cgclever/redbox/hooks","issue_events_url":"https://api.github.com/repos/cgclever/redbox/issues/events{/number}","events_url":"https://api.github.com/repos/cgclever/redbox/events","assignees_url":"https://api.github.com/repos/cgclever/redbox/assignees{/user}","branches_url":"https://api.github.com/repos/cgclever/redbox/branches{/branch}","tags_url":"https://api.github.com/repos/cgclever/redbox/tags","blobs_url":"https://api.github.com/repos/cgclever/redbox/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cgclever/redbox/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cgclever/redbox/git/refs{/sha}","trees_url":"https://api.github.com/repos/cgclever/redbox/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cgclever/redbox/statuses/{sha}","languages_url":"https://api.github.com/repos/cgclever/redbox/languages","stargazers_url":"https://api.github.com/repos/cgclever/redbox/stargazers","contributors_url":"https://api.github.com/repos/cgclever/redbox/contributors","subscribers_url":"https://api.github.com/repos/cgclever/redbox/subscribers","subscription_url":"https://api.github.com/repos/cgclever/redbox/subscription","commits_url":"https://api.github.com/repos/cgclever/redbox/commits{/sha}","git_commits_url":"https://api.github.com/repos/cgclever/redbox/git/commits{/sha}","comments_url":"https://api.github.com/repos/cgclever/redbox/comments{/number}","issue_comment_url":"https://api.github.com/repos/cgclever/redbox/issues/comments{/number}","contents_url":"https://api.github.com/repos/cgclever/redbox/contents/{+path}","compare_url":"https://api.github.com/repos/cgclever/redbox/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cgclever/redbox/merges","archive_url":"https://api.github.com/repos/cgclever/redbox/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cgclever/redbox/downloads","issues_url":"https://api.github.com/repos/cgclever/redbox/issues{/number}","pulls_url":"https://api.github.com/repos/cgclever/redbox/pulls{/number}","milestones_url":"https://api.github.com/repos/cgclever/redbox/milestones{/number}","notifications_url":"https://api.github.com/repos/cgclever/redbox/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cgclever/redbox/labels{/name}","releases_url":"https://api.github.com/repos/cgclever/redbox/releases{/id}","deployments_url":"https://api.github.com/repos/cgclever/redbox/deployments","created_at":"2016-08-22T01:05:02Z","updated_at":"2016-08-25T02:11:25Z","pushed_at":"2016-09-23T16:52:23Z","git_url":"git://github.com/cgclever/redbox.git","ssh_url":"git@github.com:cgclever/redbox.git","clone_url":"https://github.com/cgclever/redbox.git","svn_url":"https://github.com/cgclever/redbox","homepage":null,"size":46,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"base":{"label":"cgclever:master","ref":"master","sha":"40fbcb899feb78de98974e7a3ab35a676c0b0afc","user":{"login":"cgclever","id":13650281,"avatar_url":"https://avatars.githubusercontent.com/u/13650281?v=3","gravatar_id":"","url":"https://api.github.com/users/cgclever","html_url":"https://github.com/cgclever","followers_url":"https://api.github.com/users/cgclever/followers","following_url":"https://api.github.com/users/cgclever/following{/other_user}","gists_url":"https://api.github.com/users/cgclever/gists{/gist_id}","starred_url":"https://api.github.com/users/cgclever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgclever/subscriptions","organizations_url":"https://api.github.com/users/cgclever/orgs","repos_url":"https://api.github.com/users/cgclever/repos","events_url":"https://api.github.com/users/cgclever/events{/privacy}","received_events_url":"https://api.github.com/users/cgclever/received_events","type":"User","site_admin":false},"repo":{"id":66228856,"name":"redbox","full_name":"cgclever/redbox","owner":{"login":"cgclever","id":13650281,"avatar_url":"https://avatars.githubusercontent.com/u/13650281?v=3","gravatar_id":"","url":"https://api.github.com/users/cgclever","html_url":"https://github.com/cgclever","followers_url":"https://api.github.com/users/cgclever/followers","following_url":"https://api.github.com/users/cgclever/following{/other_user}","gists_url":"https://api.github.com/users/cgclever/gists{/gist_id}","starred_url":"https://api.github.com/users/cgclever/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cgclever/subscriptions","organizations_url":"https://api.github.com/users/cgclever/orgs","repos_url":"https://api.github.com/users/cgclever/repos","events_url":"https://api.github.com/users/cgclever/events{/privacy}","received_events_url":"https://api.github.com/users/cgclever/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cgclever/redbox","description":null,"fork":false,"url":"https://api.github.com/repos/cgclever/redbox","forks_url":"https://api.github.com/repos/cgclever/redbox/forks","keys_url":"https://api.github.com/repos/cgclever/redbox/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cgclever/redbox/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cgclever/redbox/teams","hooks_url":"https://api.github.com/repos/cgclever/redbox/hooks","issue_events_url":"https://api.github.com/repos/cgclever/redbox/issues/events{/number}","events_url":"https://api.github.com/repos/cgclever/redbox/events","assignees_url":"https://api.github.com/repos/cgclever/redbox/assignees{/user}","branches_url":"https://api.github.com/repos/cgclever/redbox/branches{/branch}","tags_url":"https://api.github.com/repos/cgclever/redbox/tags","blobs_url":"https://api.github.com/repos/cgclever/redbox/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cgclever/redbox/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cgclever/redbox/git/refs{/sha}","trees_url":"https://api.github.com/repos/cgclever/redbox/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cgclever/redbox/statuses/{sha}","languages_url":"https://api.github.com/repos/cgclever/redbox/languages","stargazers_url":"https://api.github.com/repos/cgclever/redbox/stargazers","contributors_url":"https://api.github.com/repos/cgclever/redbox/contributors","subscribers_url":"https://api.github.com/repos/cgclever/redbox/subscribers","subscription_url":"https://api.github.com/repos/cgclever/redbox/subscription","commits_url":"https://api.github.com/repos/cgclever/redbox/commits{/sha}","git_commits_url":"https://api.github.com/repos/cgclever/redbox/git/commits{/sha}","comments_url":"https://api.github.com/repos/cgclever/redbox/comments{/number}","issue_comment_url":"https://api.github.com/repos/cgclever/redbox/issues/comments{/number}","contents_url":"https://api.github.com/repos/cgclever/redbox/contents/{+path}","compare_url":"https://api.github.com/repos/cgclever/redbox/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cgclever/redbox/merges","archive_url":"https://api.github.com/repos/cgclever/redbox/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cgclever/redbox/downloads","issues_url":"https://api.github.com/repos/cgclever/redbox/issues{/number}","pulls_url":"https://api.github.com/repos/cgclever/redbox/pulls{/number}","milestones_url":"https://api.github.com/repos/cgclever/redbox/milestones{/number}","notifications_url":"https://api.github.com/repos/cgclever/redbox/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cgclever/redbox/labels{/name}","releases_url":"https://api.github.com/repos/cgclever/redbox/releases{/id}","deployments_url":"https://api.github.com/repos/cgclever/redbox/deployments","created_at":"2016-08-22T01:05:02Z","updated_at":"2016-08-25T02:11:25Z","pushed_at":"2016-09-23T16:52:23Z","git_url":"git://github.com/cgclever/redbox.git","ssh_url":"git@github.com:cgclever/redbox.git","clone_url":"https://github.com/cgclever/redbox.git","svn_url":"https://github.com/cgclever/redbox","homepage":null,"size":46,"stargazers_count":0,"watchers_count":0,"language":"Go","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":2,"forks":0,"open_issues":2,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/cgclever/redbox/pulls/13"},"html":{"href":"https://github.com/cgclever/redbox/pull/13"},"issue":{"href":"https://api.github.com/repos/cgclever/redbox/issues/13"},"comments":{"href":"https://api.github.com/repos/cgclever/redbox/issues/13/comments"},"review_comments":{"href":"https://api.github.com/repos/cgclever/redbox/pulls/13/comments"},"review_comment":{"href":"https://api.github.com/repos/cgclever/redbox/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/cgclever/redbox/pulls/13/commits"},"statuses":{"href":"https://api.github.com/repos/cgclever/redbox/statuses/19a93ebc4030acc63c6e9781ca1fc0d930f4b859"}}}}
{"actor":{"display_login":"cgclever"}}