{"action":"created","comment":{"url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/comments/122578758","pull_request_review_id":44709424,"id":122578758,"diff_hunk":"@@ -0,0 +1,261 @@\n+from inginious import input, feedback\n+from enum import Enum\n+import subprocess\n+import io\n+import json\n+import rst\n+import difflib\n+import itertools\n+import sys\n+import html\n+from . import languages\n+\n+CODE_WORKING_DIR = 'student/'\n+\n+class GraderResult(Enum):\n+    ACCEPTED = 1\n+    COMPILATION_ERROR = 2\n+    RUNTIME_ERROR = 3\n+    WRONG_ANSWER = 4\n+    MEMORY_LIMIT_EXCEEDED = 5\n+    TIME_LIMIT_EXCEEDED = 6\n+    INTERNAL_ERROR = 7\n+\n+def _html_to_rst(html):\n+    return '\\n\\n.. raw:: html\\n\\n' + rst.indent_block(1, html) + '\\n'\n+\n+def _check_output(actual_output, expected_output):\n+    \"\"\"\n+    Compares the output of a program against an expected output. Returns true if the actual and the\n+    expected output match.\n+    \"\"\"\n+    return actual_output == expected_output\n+\n+def _compute_single_feedback(code_file, language, input_file_name, expected_output_file_name,\n+    debug_info=None, options=None):\n+    \"\"\"\n+    Runs the script in file_name and returns a GraderResult depending on the output for\n+    input_file_name.\n+\n+    code_file: The file name with the code.\n+    language: A ProgrammingLanguage instance.\n+    input_file_name: The test case input file name.\n+    expected_output_file_name: The test case output file name.\n+    debug_info: An optional dictionary to write debug information\n+    options: An optional dictionary with grader settings. Currently supported options are\n+        - compute_diff: bool. Whether or not to compute diff for admins. Defaults to True\n+        - diff_max_lines: int. The maximum number of lines of diff to be saved, or None if unbounded.\n+        - diff_context_lines: int. The lines of context to be included for diff.\n+        - check_output: function. A custom function that compares the program output against the\n+            expected output. This function takes two strings (actual and expected output) and returns\n+            a boolean that indicates whether the outputs match.\n+    \"\"\"\n+\n+    if options is None:\n+        options = {}\n+\n+    compute_diff = options.get(\"compute_diff\", True)\n+    diff_max_lines = options.get(\"diff_max_lines\", 100)\n+    diff_context_lines = options.get(\"diff_context_lines\", 3)\n+    check_output = options.get(\"check_output\", _check_output)\n+\n+    if debug_info is not None:\n+        if \"files_feedback\" not in debug_info:\n+            debug_info[\"files_feedback\"] = {}\n+\n+    command = language.get_compilation_command(code_file)\n+    if command is not None:\n+        try:\n+            subprocess.run([\"run_student\"] + command, stderr=subprocess.PIPE,\n+                check=True, cwd=CODE_WORKING_DIR)\n+        except subprocess.CalledProcessError as e:\n+            if debug_info is not None:\n+                debug_info[\"compilation_output\"] = e.stderr.decode()\n+            return GraderResult.COMPILATION_ERROR\n+\n+    result = None\n+    stdout = None\n+    stderr = None\n+    return_code = None\n+    expected_output = None\n+\n+    with open(expected_output_file_name) as expected_output_file:\n+        expected_output = expected_output_file.read()\n+\n+    with open(input_file_name, \"r\") as input_file:\n+        try:\n+            command = language.get_execution_command(code_file)\n+            completed_process = subprocess.run([\"run_student\"] + command,\n+                stdin=input_file, stderr=subprocess.PIPE, stdout=subprocess.PIPE, check=True,\n+                cwd=CODE_WORKING_DIR)\n+            stdout = completed_process.stdout.decode()\n+            stderr = completed_process.stderr.decode()\n+            return_code = 0\n+\n+            output_matches = check_output(stdout, expected_output)\n+            result = GraderResult.ACCEPTED if output_matches else GraderResult.WRONG_ANSWER\n+\n+        except subprocess.CalledProcessError as e:\n+            return_code = e.returncode\n+            stderr = e.stderr.decode()\n+            stdout = e.stdout.decode()\n+\n+            if return_code == 252:\n+                result = GraderResult.MEMORY_LIMIT_EXCEEDED\n+            elif return_code == 253:\n+                result = GraderResult.TIME_LIMIT_EXCEEDED\n+            elif return_code == 254:\n+                result = GraderResult.INTERNAL_ERROR\n+            else:\n+                result = GraderResult.RUNTIME_ERROR\n+\n+    if debug_info is not None and result != GraderResult.ACCEPTED:\n+        diff = None\n+        if compute_diff and result != GraderResult.COMPILATION_ERROR:\n+            diff_generator = difflib.unified_diff(expected_output.split('\\n'), stdout.split('\\n'),\n+                n=diff_context_lines, fromfile='expected_output', tofile='your_output')\n+\n+            # Remove file names (legend will be added in the frontend)\n+            start = 2\n+            diff_output = '\\n'.join(itertools.islice(diff_generator, start,\n+                start + diff_max_lines if diff_max_lines is not None else sys.maxsize))\n+\n+            end_of_diff_reached = next(diff_generator, None) is None\n+\n+            if not end_of_diff_reached:\n+                diff_output += '\\n...'\n+\n+            diff = diff_output\n+\n+        debug_info[\"files_feedback\"][input_file_name] = {\n+            \"input_file\": input_file_name,\n+            \"stdout\": html.escape(stdout),\n+            \"stderr\": html.escape(stderr),\n+            \"return_code\": return_code,\n+            \"diff\": html.escape(diff),\n+        }\n+\n+    return result\n+\n+def _compute_feedback(code_file, language, test_cases, options):\n+    grader_results = []\n+    debug_info = {}\n+\n+    for input_file_name, output_file_name in test_cases:\n+        grader_results.append(_compute_single_feedback(code_file, language, input_file_name,\n+            output_file_name, debug_info, options))\n+\n+    return grader_results, debug_info\n+\n+def grade_with_partial_scores(code, test_cases, language_name, weights=None, options=None):\n+    \"\"\"\n+    Partially grade the specified code with the given test cases and weights.\n+\n+    test_cases: A list of tuples (input_file_name, output_file_name). Must have at least one test\n+        case.\n+    language_name: The name of the programming language the code is written in.\n+    weights: A list of weights for each test case. If None, all test_cases are assumed to have the\n+        same weight. If not None, it must have the same number of elements as test_cases.\n+    options: A dictionary of settings for the grader. This function accepts the following options:\n+        - output_diff_for: list with the names of the input files for which the diff will be shown\n+            to the user. Defaults to an empty list. Only valid if compute_diff is True.\n+\n+        The remaining options will be forwarded to _compute_single_feedback.\n+    \"\"\"\n+\n+    assert code is not None\n+    assert test_cases is not None and len(test_cases) > 0, \\\n+        \"test_cases must be provided and should have at least one test case\"\n+\n+    if weights is None:\n+        weights = [1] * len(test_cases)\n+\n+    assert len(weights) == len(test_cases), \\\n+        \"If provided, the number of elements in weights must match the number of elements in test_cases\"\n+\n+    if options is None:\n+        options = {}\n+\n+    output_diff_for = set(options.get(\"output_diff_for\", []))\n+\n+    language = languages.get_language_from_name(language_name)\n+    file_name = 'Main.' + language.get_file_extension()\n+    with open(CODE_WORKING_DIR + file_name, 'w') as f:\n+        f.write(code)\n+\n+    results, debug_info = _compute_feedback(file_name, language, test_cases, options)\n+    passing = sum(1 for result in results if result == GraderResult.ACCEPTED)\n+    score = sum(weights[i] for i, result in enumerate(results) if result == GraderResult.ACCEPTED)\n+    total_sum = sum(weight for weight in weights)\n+\n+    assert total_sum != 0, \"The sum of weights must not be zero\"\n+\n+    if GraderResult.COMPILATION_ERROR in results:\n+        compilation_output = debug_info.get(\"compilation_output\", \"\")\n+        feedback_str = \"**Compilation error**:\\n\\n\" + _html_to_rst(\"<pre>%s</pre>\" % (compilation_output,))\n+    else:\n+        def generate_feedback_for_test(i, result):\n+            input_file_name = test_cases[i][0]\n+\n+            if input_file_name in output_diff_for:\n+                panel_id = \"collapseDiff\" + str(i)\n+                block_id = \"diffBlock\" + str(i)\n+                diff_result = (\n+                    debug_info.get(\"files_feedback\", {}).get(input_file_name, {}).get(\"diff\", None)\n+                )\n+\n+                diff_available = diff_result is not None\n+                diff_html = None\n+\n+                if diff_available:\n+                    diff_html = \"\"\"<ul><li><strong>Test {0}: {1} </strong>\n+                        <a class=\"btn btn-default btn-link btn-xs\" role=\"button\"\n+                        data-toggle=\"collapse\" href=\"#{2}\" aria-expanded=\"false\" aria-controls=\"{2}\">\n+                      Toggle diff\n+                    </a>\n+                    <div class=\"collapse\" id=\"{2}\">\n+                      <pre id=\"{4}\">{3}</pre>\n+                    </div></li></ul><script>updateDiffBlock(\"{4}\");</script>\"\"\".format(\n+                        i + 1, result.name, panel_id, diff_result, block_id)\n+                else:\n+                    diff_html = \"\"\"<ul><li><strong>Test {0}: {1} </strong></li></ul>\"\"\".format(\n+                        i + 1, result.name)\n+\n+                feedback = _html_to_rst(diff_html)\n+            else:\n+                feedback = '- **Test %d: %s**' % (i + 1, result.name)\n+\n+\n+            return feedback\n+\n+        feedback_str = '\\n\\n'.join(generate_feedback_for_test(i, result)\n+            for i, result in enumerate(results))\n+\n+    feedback.set_custom_value(\"additional_info\", json.dumps(debug_info))\n+    feedback.set_global_result(\"success\" if passing == len(test_cases) else \"failed\")\n+    feedback.set_grade(score * 100.0 / total_sum)\n+    feedback.set_global_feedback(feedback_str)\n+\n+def grade_problem_with_partial_scores(problem_id, test_cases, language_name=None, weights=None,\n+    options=None):\n+    \"\"\"\n+    Similar to grade_with_partial_scores(), but extracts the code from the problem with the given\n+    id. If language_name is None, it will be automatically inferred from the problem with the given\n+    id (assuming it's a \"code multiple language\" problem)\n+    \"\"\"","path":"grading/base/grading/graders.py","position":242,"original_position":245,"commit_id":"80c531eadbf21e69d00505b00bdb672d6082646d","original_commit_id":"0cc4503b52ae1534c57105df0a4558660129b077","user":{"login":"amrondonp","id":6508705,"avatar_url":"https://avatars0.githubusercontent.com/u/6508705?v=3","gravatar_id":"","url":"https://api.github.com/users/amrondonp","html_url":"https://github.com/amrondonp","followers_url":"https://api.github.com/users/amrondonp/followers","following_url":"https://api.github.com/users/amrondonp/following{/other_user}","gists_url":"https://api.github.com/users/amrondonp/gists{/gist_id}","starred_url":"https://api.github.com/users/amrondonp/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/amrondonp/subscriptions","organizations_url":"https://api.github.com/users/amrondonp/orgs","repos_url":"https://api.github.com/users/amrondonp/repos","events_url":"https://api.github.com/users/amrondonp/events{/privacy}","received_events_url":"https://api.github.com/users/amrondonp/received_events","type":"User","site_admin":false},"body":"same here with the Options","created_at":"2017-06-17T23:31:07Z","updated_at":"2017-06-17T23:49:39Z","html_url":"https://github.com/JuezUN/INGInious-containers/pull/1#discussion_r122578758","pull_request_url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/comments/122578758"},"html":{"href":"https://github.com/JuezUN/INGInious-containers/pull/1#discussion_r122578758"},"pull_request":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1","id":126160299,"html_url":"https://github.com/JuezUN/INGInious-containers/pull/1","diff_url":"https://github.com/JuezUN/INGInious-containers/pull/1.diff","patch_url":"https://github.com/JuezUN/INGInious-containers/pull/1.patch","issue_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/1","number":1,"state":"open","locked":false,"title":"Add grading lib","user":{"login":"0xDCA","id":563028,"avatar_url":"https://avatars3.githubusercontent.com/u/563028?v=3","gravatar_id":"","url":"https://api.github.com/users/0xDCA","html_url":"https://github.com/0xDCA","followers_url":"https://api.github.com/users/0xDCA/followers","following_url":"https://api.github.com/users/0xDCA/following{/other_user}","gists_url":"https://api.github.com/users/0xDCA/gists{/gist_id}","starred_url":"https://api.github.com/users/0xDCA/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/0xDCA/subscriptions","organizations_url":"https://api.github.com/users/0xDCA/orgs","repos_url":"https://api.github.com/users/0xDCA/repos","events_url":"https://api.github.com/users/0xDCA/events{/privacy}","received_events_url":"https://api.github.com/users/0xDCA/received_events","type":"User","site_admin":false},"body":"This PR adds the core grading library, with diff and multiple language support\r\n\r\n@amrondonp @milderhc ","created_at":"2017-06-17T16:32:56Z","updated_at":"2017-06-17T23:49:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"59164a929a119473cce9654193f68853f7bb72a1","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1/commits","review_comments_url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1/comments","review_comment_url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/comments{/number}","comments_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/1/comments","statuses_url":"https://api.github.com/repos/JuezUN/INGInious-containers/statuses/80c531eadbf21e69d00505b00bdb672d6082646d","head":{"label":"JuezUN:grading-lib","ref":"grading-lib","sha":"80c531eadbf21e69d00505b00bdb672d6082646d","user":{"login":"JuezUN","id":28381056,"avatar_url":"https://avatars3.githubusercontent.com/u/28381056?v=3","gravatar_id":"","url":"https://api.github.com/users/JuezUN","html_url":"https://github.com/JuezUN","followers_url":"https://api.github.com/users/JuezUN/followers","following_url":"https://api.github.com/users/JuezUN/following{/other_user}","gists_url":"https://api.github.com/users/JuezUN/gists{/gist_id}","starred_url":"https://api.github.com/users/JuezUN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuezUN/subscriptions","organizations_url":"https://api.github.com/users/JuezUN/orgs","repos_url":"https://api.github.com/users/JuezUN/repos","events_url":"https://api.github.com/users/JuezUN/events{/privacy}","received_events_url":"https://api.github.com/users/JuezUN/received_events","type":"Organization","site_admin":false},"repo":{"id":93015403,"name":"INGInious-containers","full_name":"JuezUN/INGInious-containers","owner":{"login":"JuezUN","id":28381056,"avatar_url":"https://avatars3.githubusercontent.com/u/28381056?v=3","gravatar_id":"","url":"https://api.github.com/users/JuezUN","html_url":"https://github.com/JuezUN","followers_url":"https://api.github.com/users/JuezUN/followers","following_url":"https://api.github.com/users/JuezUN/following{/other_user}","gists_url":"https://api.github.com/users/JuezUN/gists{/gist_id}","starred_url":"https://api.github.com/users/JuezUN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuezUN/subscriptions","organizations_url":"https://api.github.com/users/JuezUN/orgs","repos_url":"https://api.github.com/users/JuezUN/repos","events_url":"https://api.github.com/users/JuezUN/events{/privacy}","received_events_url":"https://api.github.com/users/JuezUN/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JuezUN/INGInious-containers","description":"Containers for INGInious. INGInious is a free and open-source platform for secure and automated code assessment.","fork":true,"url":"https://api.github.com/repos/JuezUN/INGInious-containers","forks_url":"https://api.github.com/repos/JuezUN/INGInious-containers/forks","keys_url":"https://api.github.com/repos/JuezUN/INGInious-containers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuezUN/INGInious-containers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuezUN/INGInious-containers/teams","hooks_url":"https://api.github.com/repos/JuezUN/INGInious-containers/hooks","issue_events_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/events{/number}","events_url":"https://api.github.com/repos/JuezUN/INGInious-containers/events","assignees_url":"https://api.github.com/repos/JuezUN/INGInious-containers/assignees{/user}","branches_url":"https://api.github.com/repos/JuezUN/INGInious-containers/branches{/branch}","tags_url":"https://api.github.com/repos/JuezUN/INGInious-containers/tags","blobs_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuezUN/INGInious-containers/statuses/{sha}","languages_url":"https://api.github.com/repos/JuezUN/INGInious-containers/languages","stargazers_url":"https://api.github.com/repos/JuezUN/INGInious-containers/stargazers","contributors_url":"https://api.github.com/repos/JuezUN/INGInious-containers/contributors","subscribers_url":"https://api.github.com/repos/JuezUN/INGInious-containers/subscribers","subscription_url":"https://api.github.com/repos/JuezUN/INGInious-containers/subscription","commits_url":"https://api.github.com/repos/JuezUN/INGInious-containers/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuezUN/INGInious-containers/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuezUN/INGInious-containers/contents/{+path}","compare_url":"https://api.github.com/repos/JuezUN/INGInious-containers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuezUN/INGInious-containers/merges","archive_url":"https://api.github.com/repos/JuezUN/INGInious-containers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuezUN/INGInious-containers/downloads","issues_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues{/number}","pulls_url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls{/number}","milestones_url":"https://api.github.com/repos/JuezUN/INGInious-containers/milestones{/number}","notifications_url":"https://api.github.com/repos/JuezUN/INGInious-containers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuezUN/INGInious-containers/labels{/name}","releases_url":"https://api.github.com/repos/JuezUN/INGInious-containers/releases{/id}","deployments_url":"https://api.github.com/repos/JuezUN/INGInious-containers/deployments","created_at":"2017-06-01T04:08:45Z","updated_at":"2017-06-01T04:08:47Z","pushed_at":"2017-06-17T23:22:18Z","git_url":"git://github.com/JuezUN/INGInious-containers.git","ssh_url":"git@github.com:JuezUN/INGInious-containers.git","clone_url":"https://github.com/JuezUN/INGInious-containers.git","svn_url":"https://github.com/JuezUN/INGInious-containers","homepage":"http://www.inginious.org","size":28299,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"base":{"label":"JuezUN:master","ref":"master","sha":"56d42bfb72b5d3451fda85302cde7935b9213a72","user":{"login":"JuezUN","id":28381056,"avatar_url":"https://avatars3.githubusercontent.com/u/28381056?v=3","gravatar_id":"","url":"https://api.github.com/users/JuezUN","html_url":"https://github.com/JuezUN","followers_url":"https://api.github.com/users/JuezUN/followers","following_url":"https://api.github.com/users/JuezUN/following{/other_user}","gists_url":"https://api.github.com/users/JuezUN/gists{/gist_id}","starred_url":"https://api.github.com/users/JuezUN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuezUN/subscriptions","organizations_url":"https://api.github.com/users/JuezUN/orgs","repos_url":"https://api.github.com/users/JuezUN/repos","events_url":"https://api.github.com/users/JuezUN/events{/privacy}","received_events_url":"https://api.github.com/users/JuezUN/received_events","type":"Organization","site_admin":false},"repo":{"id":93015403,"name":"INGInious-containers","full_name":"JuezUN/INGInious-containers","owner":{"login":"JuezUN","id":28381056,"avatar_url":"https://avatars3.githubusercontent.com/u/28381056?v=3","gravatar_id":"","url":"https://api.github.com/users/JuezUN","html_url":"https://github.com/JuezUN","followers_url":"https://api.github.com/users/JuezUN/followers","following_url":"https://api.github.com/users/JuezUN/following{/other_user}","gists_url":"https://api.github.com/users/JuezUN/gists{/gist_id}","starred_url":"https://api.github.com/users/JuezUN/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JuezUN/subscriptions","organizations_url":"https://api.github.com/users/JuezUN/orgs","repos_url":"https://api.github.com/users/JuezUN/repos","events_url":"https://api.github.com/users/JuezUN/events{/privacy}","received_events_url":"https://api.github.com/users/JuezUN/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/JuezUN/INGInious-containers","description":"Containers for INGInious. INGInious is a free and open-source platform for secure and automated code assessment.","fork":true,"url":"https://api.github.com/repos/JuezUN/INGInious-containers","forks_url":"https://api.github.com/repos/JuezUN/INGInious-containers/forks","keys_url":"https://api.github.com/repos/JuezUN/INGInious-containers/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JuezUN/INGInious-containers/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JuezUN/INGInious-containers/teams","hooks_url":"https://api.github.com/repos/JuezUN/INGInious-containers/hooks","issue_events_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/events{/number}","events_url":"https://api.github.com/repos/JuezUN/INGInious-containers/events","assignees_url":"https://api.github.com/repos/JuezUN/INGInious-containers/assignees{/user}","branches_url":"https://api.github.com/repos/JuezUN/INGInious-containers/branches{/branch}","tags_url":"https://api.github.com/repos/JuezUN/INGInious-containers/tags","blobs_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/refs{/sha}","trees_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JuezUN/INGInious-containers/statuses/{sha}","languages_url":"https://api.github.com/repos/JuezUN/INGInious-containers/languages","stargazers_url":"https://api.github.com/repos/JuezUN/INGInious-containers/stargazers","contributors_url":"https://api.github.com/repos/JuezUN/INGInious-containers/contributors","subscribers_url":"https://api.github.com/repos/JuezUN/INGInious-containers/subscribers","subscription_url":"https://api.github.com/repos/JuezUN/INGInious-containers/subscription","commits_url":"https://api.github.com/repos/JuezUN/INGInious-containers/commits{/sha}","git_commits_url":"https://api.github.com/repos/JuezUN/INGInious-containers/git/commits{/sha}","comments_url":"https://api.github.com/repos/JuezUN/INGInious-containers/comments{/number}","issue_comment_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/comments{/number}","contents_url":"https://api.github.com/repos/JuezUN/INGInious-containers/contents/{+path}","compare_url":"https://api.github.com/repos/JuezUN/INGInious-containers/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JuezUN/INGInious-containers/merges","archive_url":"https://api.github.com/repos/JuezUN/INGInious-containers/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JuezUN/INGInious-containers/downloads","issues_url":"https://api.github.com/repos/JuezUN/INGInious-containers/issues{/number}","pulls_url":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls{/number}","milestones_url":"https://api.github.com/repos/JuezUN/INGInious-containers/milestones{/number}","notifications_url":"https://api.github.com/repos/JuezUN/INGInious-containers/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JuezUN/INGInious-containers/labels{/name}","releases_url":"https://api.github.com/repos/JuezUN/INGInious-containers/releases{/id}","deployments_url":"https://api.github.com/repos/JuezUN/INGInious-containers/deployments","created_at":"2017-06-01T04:08:45Z","updated_at":"2017-06-01T04:08:47Z","pushed_at":"2017-06-17T23:22:18Z","git_url":"git://github.com/JuezUN/INGInious-containers.git","ssh_url":"git@github.com:JuezUN/INGInious-containers.git","clone_url":"https://github.com/JuezUN/INGInious-containers.git","svn_url":"https://github.com/JuezUN/INGInious-containers","homepage":"http://www.inginious.org","size":28299,"stargazers_count":0,"watchers_count":0,"language":"Python","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":0,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1"},"html":{"href":"https://github.com/JuezUN/INGInious-containers/pull/1"},"issue":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/1"},"comments":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/JuezUN/INGInious-containers/statuses/80c531eadbf21e69d00505b00bdb672d6082646d"}}}}
{"actor":{"display_login":"amrondonp"}}