{"action":"created","comment":{"url":"https://api.github.com/repos/open-craft/problem-builder/pulls/comments/132623035","pull_request_review_id":55717805,"id":132623035,"diff_hunk":"@@ -0,0 +1,417 @@\n+Native API Documentation\n+========================\n+\n+This documents the APIs that can be used to implement native wrappers. There are\n+three types of APIs:\n+\n+- `student_view_data`: Exposes block settings and content as JSON data. Can be\n+  retrieved via the edX Course Blocks API. Does not include user-specific data\n+  (i.e. items derived from `Scope.user_state` fields).\n+- `student_view_user_state`: XBlock handler which returns user state data in\n+  JSON format.\n+- Custom XBlock handlers used for submitting user input and recording user actions.\n+\n+Problem Builder (`problem-builder`)\n+-----------------------------------\n+\n+### `student_view_data`\n+\n+- `max_attempts`: Max number of allowed attempts (integer).\n+- `extended_feedback`: `true` if extended feedback is enabled for this block\n+  (boolean).\n+- `feedback_label`: Feedback message header (string).\n+- `messages`: A dict with three string entries: `completed`, `incomplete`, and\n+  `max_attempts_reached`. See below for info on each (object).\n+- `components`: A list of `student_view_data` output of all immediate child\n+  components which implement `student_view_data`. Child components which don't\n+  implement `student_view_data` are omitted from the list (array).\n+\n+#### `messages`\n+\n+These messages are displayed as feedback, depending on the state of the block.\n+\n+- `completed`: Message to be shown if the user successfully completes the\n+  problem. May contain HTML (string).\n+- `incomplete`: Message to be shown if the user did not successfully complete\n+  the problem, but still has available attempts left. May contain HTML (string).\n+- `max_attempts_reached`: Message to be shown if the user did not complete the\n+  problem and has no available attempts left.\n+\n+### `student_view_user_state`\n+\n+- `num_attempts`: Number of attempts used so far (integer).\n+- `completed`: `true` if the user successfully completed the problem at least\n+  once (boolean).\n+- `student_results`: A list of user submitted answers with metadata for each\n+  child component. See below for more info (array).\n+- `components`: A dict of `student_view_user_state` output of all immediate\n+  child components which implement `student_view_user_state`. Dict keys are\n+  component IDs and the value corresponding to each key is the output of\n+  `student_view_user_state`(object). Child components which don't implement\n+  `student_view_user_state` are not included in the dict.\n+\n+#### `student_results`\n+\n+The `student_results` field is an array of two-element arrays. Each nested array\n+has the form of `[component_name, data]`. Only components which the student\n+already submitted are present in the array. The structure of the `data` object\n+depends on the type of the child component and is described separately for each\n+type of child component below.\n+\n+### Custom Handlers\n+\n+#### `submit`\n+\n+The `submit` XBlock JSON handler is used for submitting student input. The\n+`POST` data should be a dict where keys are child component names. The values\n+depend on the component type and are described separately for each type of child\n+component below.\n+\n+Returns a JSON object which contains these fields:\n+\n+- `results`: Same as `student_results` described under\n+  `student_view_user_state` above.\n+- `completed`: Same as `completed` described under `student_view_user_state`\n+  above.\n+- `message`: One of the `completed`, `incomplete`, or `max_attempts_reached`\n+  feedback messages described under `messages` above. Can be `null` if no\n+  messages has been defined. May contain HTML (string).\n+- `max_attempts`: Same as `max_attempts` under `student_view_data`.\n+- `num_attempts`: Same as `num_attempts` under `student_view_user_state`.\n+\n+\n+Step Builder (`step-builder`)\n+-----------------------------\n+\n+### `student_view_data`\n+\n+- `title`: The display name of the component (string).\n+- `show_title`: `true` if the title should be displayed (boolean).\n+- `weight`: The weight of the problem (float).\n+- `extended_feedback`: `true` if extended feedback is enabled for this block\n+  (boolean).\n+- `max_attempts`: Max number of allowed attempts (integer).\n+- `components`: A list of `student_view_data` output of all immediate child\n+  components which implement `student_view_data`. For `step-builder`, immediate\n+  children are typically `sb-step` and `sb-review-step` type components. Child\n+  components which don't implement `student_view_data` are omitted from the list\n+  (array).\n+\n+### `student_view_user_state`\n+\n+Same as Problem Builder above, but also contains these additional fields:\n+\n+- `active_step`: The index of the step which is currently active. Starts at zero\n+  (integer).\n+\n+### Custom Handlers\n+\n+#### `submit`\n+\n+The `submit` XBlock JSON handler is used for submitting student input. The\n+`POST` data should be a dict where keys are child component names. The values\n+depend on the component type and are described separately for each type of child\n+component below.\n+\n+In addition to child component names, the `POST` data should also include the\n+`active_step` field. The value should be the index of the current step.\n+\n+#### `try_again`\n+\n+The `try_again` XBlock JSON handler can be used when the student reaches the\n+final step. Sending a `POST` request to `try_again` will reset the problem and\n+all of its children.\n+\n+Returns a JSON object containing the new value of `active_step`.\n+\n+Mentoring Step (`sb-step`)\n+--------------------------\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"sb-step\"` for Mentoring Step components (string).\n+- `title`: Step component's display name (string).\n+- `show_title`: `true` if the title should be displayed (boolean).\n+- `next_button_label`: Text label of the \"Next Step\" button (string).\n+- `message`: Feedback or instructional message which should be displayed after\n+  student submits the step (string).\n+- `components`: A list of `student_view_data` output of all immediate child\n+  components which implement `student_view_data`. Child components which don't\n+  implement `student_view_data` are omitted from the list (array).\n+\n+### `student_view_user_state`\n+\n+- `student_results`: Same as `student_results` described under\n+  `student_view_user_state` in the Problem Builder section.\n+- `components`: Same as `components` described under `student_view_user_state`\n+  in the Problem Builder section.\n+\n+Review Step (`sb-review-step`)\n+------------------------------\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"sb-review-step`\" for Review Step components (string).\n+- `title`: Display name of the component (string).\n+- `components`: A list of `student_view_data` output of all immediate child\n+  components which implement `student_view_data`. Child components which don't\n+  implement `student_view_data` are omitted from the list (array).\n+\n+Conditional Message (`sb-conditional-message`)\n+----------------------------------------------\n+\n+Conditional Message component is always child of a Review Step component.\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"sb-conditional-message\"` for Conditional Message\n+  components (string).\n+- `content`: Content of the message. May contain HTML (string).\n+- `score_condition`: One of `\"perfect\"`, `\"imperfect\"`, or `\"any\"` (string).\n+- `num_attempts_condition`: One of `\"can_try_again\"`, `\"cannot_try_again\"`, or\n+  `\"any\"` (string).\n+\n+Score Summary (`sb-review-score`)\n+---------------------------------\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"sb-review-score\"` for Score Summary components\n+  (string).\n+\n+Per-Question Feedback (`sb-review-per-question-feedback`)\n+---------------------------------------------------------\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"sb-review-per-question-feedback\"` for Score Summary\n+  components (string).\n+\n+Long Answer (`pb-answer`)\n+-------------------------\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"pb-answer\"` for Long Answer components (string).\n+- `id`: Unique ID (name) of the component (string).\n+- `weight`: The weight of this component (float).\n+- `question`: The question/text displayed above the input field (string).\n+\n+### `student_view_user_state`\n+\n+- `answer_data`: A dict with info about students submitted answer. See below for\n+  more info(object).\n+\n+#### `answer_data`\n+\n+The `answer_data` field contains these items:\n+\n+- `student_input`: Text that the student entered (string).\n+- `created_on`: Date/Time when the answer was first submitted (string).\n+- `modified_on`: Date/Time when the answer was last modified (string).\n+\n+### `student_results`\n+\n+- `status`: One of `\"correct\"` or `\"incorrect\"` (string).\n+- `score`: Student's score. One of `1` or `0` (integer).\n+- `weight`: Child component's weight attribute (float).\n+- `student_input`: Text entered by the user (string).\n+\n+### POST Submit Data\n+\n+When submitting the problem either via Problem Builder or Step Builder, the data\n+entry corresponding to the Long Answer block should be an array with a single\n+object containing the `\"value\"` property: `[{\"value\": \"Student's input\"}]`.\n+\n+Multiple Choice Question (`pb-mcq`)\n+-----------------------------------\n+\n+### `student_view_data`\n+\n+- `type`: Always equals `\"pb-mcq\"` for MCQ components (string).\n+- `id`: Unique ID (name) of the component (string).\n+- `question`: The content of the question (string).\n+- `message`: General feedback provided when submitting (string).\n+- `weight`: The weight of the problem (float).\n+- `choices`: A list of objects providing info about available choices. See below\n+  for more info (array).\n+- `tips`: A list of objects providing info about tips defined for the\n+  problem. See below for more info (array).\n+\n+#### `choices`\n+\n+Each entry in the `choices` array contains these values:\n+\n+- `content`: Display name of the choice (string).\n+- `value`: The value of the choice. This is the value that gets submitted and\n+  stored when users submits their answer (string).\n+\n+#### `tips`\n+\n+Each entry in the `tips` array contains these values:\n+\n+- `content`: The text content of the tip (string).\n+- `for_choices`: A list of string values corresponding to choices to which this\n+  tip applies to (array).\n+\n+### `student_view_user_state`\n+\n+- `student_choice`: The value of the last submitted choice (string).\n+\n+### `student_results`\n+\n+- `status`: One of `\"correct\"` or `\"incorrect\"` (string).\n+- `score`: Student's score. One of `1` or `0` (integer).\n+- `weight`: Child component's weight attribute (float).\n+- `submission`: The value of the choice that the user selected (string).\n+- `message`: General feedback. May contain HTML (string).\n+- `tips`: HTML representation of tips. May be `null` (string).\n+\n+### POST Submit Data\n+\n+When submitting the problem the data should equal to the string value of the\n+selected choice.\n+\n+Rating Question (`pb-rating`)\n+-----------------------------\n+\n+### `student_view_data`\n+\n+Identical to MCQ questions except that the `type` field always equals\n+`\"pb-rating\"`.\n+\n+### `student_view_user_state`\n+\n+- `student_choice`: The value of the last submitted choice (string).\n+\n+### `student_results`\n+\n+Identical to MCQ questions.","path":"doc/Native APIs.md","position":289,"original_position":289,"commit_id":"0c707f3c7c1317720d8552e76a14697c25857548","original_commit_id":"0c707f3c7c1317720d8552e76a14697c25857548","user":{"login":"pomegranited","id":7556571,"avatar_url":"https://avatars3.githubusercontent.com/u/7556571?v=4","gravatar_id":"","url":"https://api.github.com/users/pomegranited","html_url":"https://github.com/pomegranited","followers_url":"https://api.github.com/users/pomegranited/followers","following_url":"https://api.github.com/users/pomegranited/following{/other_user}","gists_url":"https://api.github.com/users/pomegranited/gists{/gist_id}","starred_url":"https://api.github.com/users/pomegranited/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pomegranited/subscriptions","organizations_url":"https://api.github.com/users/pomegranited/orgs","repos_url":"https://api.github.com/users/pomegranited/repos","events_url":"https://api.github.com/users/pomegranited/events{/privacy}","received_events_url":"https://api.github.com/users/pomegranited/received_events","type":"User","site_admin":false},"body":"Add link: [MCQ questions](#pb-mcq)","created_at":"2017-08-11T06:34:21Z","updated_at":"2017-08-11T06:43:53Z","html_url":"https://github.com/open-craft/problem-builder/pull/156#discussion_r132623035","pull_request_url":"https://api.github.com/repos/open-craft/problem-builder/pulls/156","_links":{"self":{"href":"https://api.github.com/repos/open-craft/problem-builder/pulls/comments/132623035"},"html":{"href":"https://github.com/open-craft/problem-builder/pull/156#discussion_r132623035"},"pull_request":{"href":"https://api.github.com/repos/open-craft/problem-builder/pulls/156"}}},"pull_request":{"url":"https://api.github.com/repos/open-craft/problem-builder/pulls/156","id":135097082,"html_url":"https://github.com/open-craft/problem-builder/pull/156","diff_url":"https://github.com/open-craft/problem-builder/pull/156.diff","patch_url":"https://github.com/open-craft/problem-builder/pull/156.patch","issue_url":"https://api.github.com/repos/open-craft/problem-builder/issues/156","number":156,"state":"open","locked":false,"title":"Add docs about API methods which can be used form native apps","user":{"login":"mtyaka","id":32585,"avatar_url":"https://avatars0.githubusercontent.com/u/32585?v=4","gravatar_id":"","url":"https://api.github.com/users/mtyaka","html_url":"https://github.com/mtyaka","followers_url":"https://api.github.com/users/mtyaka/followers","following_url":"https://api.github.com/users/mtyaka/following{/other_user}","gists_url":"https://api.github.com/users/mtyaka/gists{/gist_id}","starred_url":"https://api.github.com/users/mtyaka/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mtyaka/subscriptions","organizations_url":"https://api.github.com/users/mtyaka/orgs","repos_url":"https://api.github.com/users/mtyaka/repos","events_url":"https://api.github.com/users/mtyaka/events{/privacy}","received_events_url":"https://api.github.com/users/mtyaka/received_events","type":"User","site_admin":false},"body":"This documents `student_view_data`, `student_view_user_state`, and custom handlers for each supported component.\r\n\r\n**Notes and Concerns**:\r\n\r\nThe APIs are not very consistent between some components. Some APIs consume data in weird shape, most notably [freeform answer submit handler](https://github.com/open-craft/problem-builder/blob/502d6eeea33a364261ee36c3e5dcbd40134ec0f1/doc/Native%20APIs.md#post-submit-data), probably because it was never designed to be public.\r\n\r\nCurrently `components` entry in `student_view_user_state` is a dict where keys edX block keys (i.e. `'i4x://TstCrs/TS111/pb-answer/a0b04a13d3074229b6be33fbc31de233'`), but in `student_view_data` we typically use our internal customizable unique IDs (`self.name`).\r\nWe might want to make that more consistent.\r\n\r\nI don't like how we simply expose all `Scope.user_state` fields in `student_view_user_state` by default. We should hand pick the fields that we want to expose directly instead, and we might also prefer to include data derived from user state in a form that is more suitable for API consumers. We perform normalizations in several places internally, which is skipped if we expose the fields directly.\r\n\r\n**Reviewers**:\r\n\r\n- [ ] @pomegranited ","created_at":"2017-08-10T11:00:20Z","updated_at":"2017-08-11T06:43:53Z","closed_at":null,"merged_at":null,"merge_commit_sha":"91b234825ef76102d6cc8f8481df31373022e576","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/open-craft/problem-builder/pulls/156/commits","review_comments_url":"https://api.github.com/repos/open-craft/problem-builder/pulls/156/comments","review_comment_url":"https://api.github.com/repos/open-craft/problem-builder/pulls/comments{/number}","comments_url":"https://api.github.com/repos/open-craft/problem-builder/issues/156/comments","statuses_url":"https://api.github.com/repos/open-craft/problem-builder/statuses/0c707f3c7c1317720d8552e76a14697c25857548","head":{"label":"open-craft:mtyaka/native-api-docs","ref":"mtyaka/native-api-docs","sha":"0c707f3c7c1317720d8552e76a14697c25857548","user":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"repo":{"id":33264452,"name":"problem-builder","full_name":"open-craft/problem-builder","owner":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/open-craft/problem-builder","description":"An XBlock for posing questions to students","fork":false,"url":"https://api.github.com/repos/open-craft/problem-builder","forks_url":"https://api.github.com/repos/open-craft/problem-builder/forks","keys_url":"https://api.github.com/repos/open-craft/problem-builder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-craft/problem-builder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-craft/problem-builder/teams","hooks_url":"https://api.github.com/repos/open-craft/problem-builder/hooks","issue_events_url":"https://api.github.com/repos/open-craft/problem-builder/issues/events{/number}","events_url":"https://api.github.com/repos/open-craft/problem-builder/events","assignees_url":"https://api.github.com/repos/open-craft/problem-builder/assignees{/user}","branches_url":"https://api.github.com/repos/open-craft/problem-builder/branches{/branch}","tags_url":"https://api.github.com/repos/open-craft/problem-builder/tags","blobs_url":"https://api.github.com/repos/open-craft/problem-builder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-craft/problem-builder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-craft/problem-builder/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-craft/problem-builder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-craft/problem-builder/statuses/{sha}","languages_url":"https://api.github.com/repos/open-craft/problem-builder/languages","stargazers_url":"https://api.github.com/repos/open-craft/problem-builder/stargazers","contributors_url":"https://api.github.com/repos/open-craft/problem-builder/contributors","subscribers_url":"https://api.github.com/repos/open-craft/problem-builder/subscribers","subscription_url":"https://api.github.com/repos/open-craft/problem-builder/subscription","commits_url":"https://api.github.com/repos/open-craft/problem-builder/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-craft/problem-builder/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-craft/problem-builder/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-craft/problem-builder/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-craft/problem-builder/contents/{+path}","compare_url":"https://api.github.com/repos/open-craft/problem-builder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-craft/problem-builder/merges","archive_url":"https://api.github.com/repos/open-craft/problem-builder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-craft/problem-builder/downloads","issues_url":"https://api.github.com/repos/open-craft/problem-builder/issues{/number}","pulls_url":"https://api.github.com/repos/open-craft/problem-builder/pulls{/number}","milestones_url":"https://api.github.com/repos/open-craft/problem-builder/milestones{/number}","notifications_url":"https://api.github.com/repos/open-craft/problem-builder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-craft/problem-builder/labels{/name}","releases_url":"https://api.github.com/repos/open-craft/problem-builder/releases{/id}","deployments_url":"https://api.github.com/repos/open-craft/problem-builder/deployments","created_at":"2015-04-01T18:18:42Z","updated_at":"2017-06-30T00:29:45Z","pushed_at":"2017-08-10T11:00:21Z","git_url":"git://github.com/open-craft/problem-builder.git","ssh_url":"git@github.com:open-craft/problem-builder.git","clone_url":"https://github.com/open-craft/problem-builder.git","svn_url":"https://github.com/open-craft/problem-builder","homepage":null,"size":4007,"stargazers_count":13,"watchers_count":13,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":1,"forks":13,"open_issues":1,"watchers":13,"default_branch":"master"}},"base":{"label":"open-craft:master","ref":"master","sha":"3b500caf8c33035c9e3bc9ee49ae7b9ed5aa3d27","user":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"repo":{"id":33264452,"name":"problem-builder","full_name":"open-craft/problem-builder","owner":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars0.githubusercontent.com/u/7414786?v=4","gravatar_id":"","url":"https://api.github.com/users/open-craft","html_url":"https://github.com/open-craft","followers_url":"https://api.github.com/users/open-craft/followers","following_url":"https://api.github.com/users/open-craft/following{/other_user}","gists_url":"https://api.github.com/users/open-craft/gists{/gist_id}","starred_url":"https://api.github.com/users/open-craft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/open-craft/subscriptions","organizations_url":"https://api.github.com/users/open-craft/orgs","repos_url":"https://api.github.com/users/open-craft/repos","events_url":"https://api.github.com/users/open-craft/events{/privacy}","received_events_url":"https://api.github.com/users/open-craft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/open-craft/problem-builder","description":"An XBlock for posing questions to students","fork":false,"url":"https://api.github.com/repos/open-craft/problem-builder","forks_url":"https://api.github.com/repos/open-craft/problem-builder/forks","keys_url":"https://api.github.com/repos/open-craft/problem-builder/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-craft/problem-builder/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-craft/problem-builder/teams","hooks_url":"https://api.github.com/repos/open-craft/problem-builder/hooks","issue_events_url":"https://api.github.com/repos/open-craft/problem-builder/issues/events{/number}","events_url":"https://api.github.com/repos/open-craft/problem-builder/events","assignees_url":"https://api.github.com/repos/open-craft/problem-builder/assignees{/user}","branches_url":"https://api.github.com/repos/open-craft/problem-builder/branches{/branch}","tags_url":"https://api.github.com/repos/open-craft/problem-builder/tags","blobs_url":"https://api.github.com/repos/open-craft/problem-builder/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-craft/problem-builder/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-craft/problem-builder/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-craft/problem-builder/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-craft/problem-builder/statuses/{sha}","languages_url":"https://api.github.com/repos/open-craft/problem-builder/languages","stargazers_url":"https://api.github.com/repos/open-craft/problem-builder/stargazers","contributors_url":"https://api.github.com/repos/open-craft/problem-builder/contributors","subscribers_url":"https://api.github.com/repos/open-craft/problem-builder/subscribers","subscription_url":"https://api.github.com/repos/open-craft/problem-builder/subscription","commits_url":"https://api.github.com/repos/open-craft/problem-builder/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-craft/problem-builder/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-craft/problem-builder/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-craft/problem-builder/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-craft/problem-builder/contents/{+path}","compare_url":"https://api.github.com/repos/open-craft/problem-builder/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-craft/problem-builder/merges","archive_url":"https://api.github.com/repos/open-craft/problem-builder/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-craft/problem-builder/downloads","issues_url":"https://api.github.com/repos/open-craft/problem-builder/issues{/number}","pulls_url":"https://api.github.com/repos/open-craft/problem-builder/pulls{/number}","milestones_url":"https://api.github.com/repos/open-craft/problem-builder/milestones{/number}","notifications_url":"https://api.github.com/repos/open-craft/problem-builder/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-craft/problem-builder/labels{/name}","releases_url":"https://api.github.com/repos/open-craft/problem-builder/releases{/id}","deployments_url":"https://api.github.com/repos/open-craft/problem-builder/deployments","created_at":"2015-04-01T18:18:42Z","updated_at":"2017-06-30T00:29:45Z","pushed_at":"2017-08-10T11:00:21Z","git_url":"git://github.com/open-craft/problem-builder.git","ssh_url":"git@github.com:open-craft/problem-builder.git","clone_url":"https://github.com/open-craft/problem-builder.git","svn_url":"https://github.com/open-craft/problem-builder","homepage":null,"size":4007,"stargazers_count":13,"watchers_count":13,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":13,"mirror_url":null,"open_issues_count":1,"forks":13,"open_issues":1,"watchers":13,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/open-craft/problem-builder/pulls/156"},"html":{"href":"https://github.com/open-craft/problem-builder/pull/156"},"issue":{"href":"https://api.github.com/repos/open-craft/problem-builder/issues/156"},"comments":{"href":"https://api.github.com/repos/open-craft/problem-builder/issues/156/comments"},"review_comments":{"href":"https://api.github.com/repos/open-craft/problem-builder/pulls/156/comments"},"review_comment":{"href":"https://api.github.com/repos/open-craft/problem-builder/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/open-craft/problem-builder/pulls/156/commits"},"statuses":{"href":"https://api.github.com/repos/open-craft/problem-builder/statuses/0c707f3c7c1317720d8552e76a14697c25857548"}}}}
{"actor":{"display_login":"pomegranited"}}