{"action":"created","comment":{"url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/comments/43874938","id":43874938,"diff_hunk":"@@ -0,0 +1,387 @@\n+\"\"\"An XBlock that allows course authors to define vector drawing exercises.\"\"\"\n+\n+import json\n+import logging\n+\n+from xblock.core import XBlock\n+from xblock.exceptions import JsonHandlerError\n+from xblock.fields import Scope, Boolean, Dict, Float, Integer, String\n+from xblock.fragment import Fragment\n+from xblockutils.resources import ResourceLoader\n+from xblockutils.studio_editable import StudioEditableXBlockMixin\n+\n+try:\n+    # Used to detect if we're in the workbench so we can add Underscore.js\n+    from workbench.runtime import WorkbenchRuntime\n+except ImportError:\n+    WorkbenchRuntime = False  # pylint: disable=invalid-name\n+\n+from .grader import Grader\n+\n+\n+loader = ResourceLoader(__name__)  # pylint: disable=invalid-name\n+\n+log = logging.getLogger(__name__)  # pylint: disable=invalid-name\n+\n+\n+class VectorDrawXBlock(StudioEditableXBlockMixin, XBlock):\n+    \"\"\"\n+    An XBlock that allows course authors to define vector drawing exercises.\n+    \"\"\"\n+\n+    # Content\n+    display_name = String(\n+        display_name=\"Title (display name)\",\n+        help=\"Title to display\",\n+        default=\"Vector Drawing\",\n+        scope=Scope.content\n+    )\n+\n+    description = String(\n+        display_name=\"Description\",\n+        help=\"Exercise description displayed above vector drawing box\",\n+        default=\"\",\n+        multiline_editor=\"html\",\n+        resettable_editor=False,\n+        scope=Scope.content\n+    )\n+\n+    width = Integer(\n+        display_name=\"Width\",\n+        help=\"The width of the board in pixels\",\n+        default=550,\n+        scope=Scope.content\n+    )\n+\n+    height = Integer(\n+        display_name=\"Height\",\n+        help=\"The height of the board in pixels\",\n+        default=400,\n+        scope=Scope.content\n+    )\n+\n+    bounding_box_size = Integer(\n+        display_name=\"Bounding box size\",\n+        help=(\n+            \"Defines the bounding box height of the graph area. \"\n+            \"The bounding box width is calculated from the width/height ratio.\"\n+        ),\n+        default=10,\n+        scope=Scope.content\n+    )\n+\n+    axis = Boolean(\n+        display_name=\"Show axis\",\n+        help=\"Show the graph axis\",\n+        default=False,\n+        scope=Scope.content\n+    )\n+\n+    show_navigation = Boolean(\n+        display_name=\"Show navigation\",\n+        help=\"Show navigation arrows and zoom controls\",\n+        default=False,\n+        scope=Scope.content\n+    )\n+\n+    show_vector_properties = Boolean(\n+        display_name=\"Show vector properties\",\n+        help=\"Show box detailing vector properties\",\n+        default=True,\n+        scope=Scope.content\n+    )\n+\n+    show_slope_for_lines = Boolean(\n+        display_name=\"Show slope for lines\",\n+        help=\"If True, slope will be shown for line objects.\",\n+        default=False,\n+        scope=Scope.content\n+    )\n+\n+    add_vector_label = String(\n+        display_name=\"Add vector label\",\n+        help=\"Label for button that allows to add vectors to the board\",\n+        default=\"Add Selected Force\",\n+        scope=Scope.content\n+    )\n+\n+    vector_properties_label = String(\n+        display_name=\"Vector properties label\",\n+        help=\"Label for box that displays vector properties\",\n+        default=\"Vector Properties\",\n+        scope=Scope.content\n+    )\n+\n+    background_url = String(\n+        display_name=\"Background URL\",\n+        help=\"URL for background image\",\n+        default=\"\",\n+        scope=Scope.content\n+    )\n+\n+    background_width = Integer(\n+        display_name=\"Background width\",\n+        help=\"Width of background image\",\n+        default=0,\n+        scope=Scope.content\n+    )\n+\n+    background_height = Integer(\n+        display_name=\"Background height\",\n+        help=\"Height of background image\",\n+        default=0,\n+        scope=Scope.content\n+    )\n+\n+    vectors = String(\n+        display_name=\"Vectors\",\n+        help=(\n+            \"List of vectors to use for the exercise. \"\n+            \"You must specify it as an array of entries \"\n+            \"where each entry represents an individual vector.\"\n+        ),\n+        default=\"[]\",\n+        multiline_editor=True,\n+        resettable_editor=False,\n+        scope=Scope.content\n+    )\n+\n+    points = String(\n+        display_name=\"Points\",\n+        help=(\n+            \"List of points to be drawn on the board for reference, or to be placed by the student.\"\n+            \"You must specify it as an array of entries \"\n+            \"where each entry represents an individual point.\"\n+        ),\n+        default=\"[]\",\n+        multiline_editor=True,\n+        resettable_editor=False,\n+        scope=Scope.content\n+    )\n+\n+    expected_result = String(\n+        display_name=\"Expected result\",\n+        help=(\n+            \"Defines vector properties for grading. \"\n+            \"Vectors omitted from this setting are ignored when grading.\"\n+        ),\n+        default=\"{}\",\n+        multiline_editor=True,\n+        resettable_editor=False,\n+        scope=Scope.content\n+    )\n+\n+    custom_checks = String(\n+        display_name=\"Custom checks\",\n+        help=(\n+            'List of custom checks to use for grading. '\n+            'This is needed when grading is more complex '\n+            'and cannot be defined in terms of \"Expected results\" only.'\n+        ),\n+        default=\"[]\",\n+        multiline_editor=True,\n+        resettable_editor=False,\n+        scope=Scope.content\n+    )\n+\n+    weight = Float(\n+        display_name=\"Weight\",\n+        default=1,\n+        scope=Scope.settings,\n+        enforce_type=True\n+    )\n+\n+    # User state\n+\n+    # Dictionary containing vectors and points present on the board when user last clicked \"Check\",\n+    # as well as checks to perform in order to obtain grade\n+    answer = Dict(scope=Scope.user_state)\n+    # Dictionary that represents result returned by the grader for the most recent answer;\n+    # contains info about correctness of answer and feedback message\n+    result = Dict(scope=Scope.user_state)\n+\n+    editable_fields = (\n+        'display_name',\n+        'description',\n+        'width',\n+        'height',\n+        'bounding_box_size',\n+        'axis',\n+        'show_navigation',\n+        'show_vector_properties',\n+        'show_slope_for_lines',\n+        'add_vector_label',\n+        'vector_properties_label',\n+        'background_url',\n+        'background_width',\n+        'background_height',\n+        'vectors',\n+        'points',\n+        'expected_result',\n+        'custom_checks'\n+    )\n+\n+    has_score = True\n+\n+    @property\n+    def settings(self):\n+        \"\"\"\n+        Return settings for this exercise.\n+        \"\"\"\n+        return {\n+            'width': self.width,\n+            'height': self.height,\n+            'bounding_box_size': self.bounding_box_size,\n+            'axis': self.axis,\n+            'show_navigation': self.show_navigation,\n+            'show_vector_properties': self.show_vector_properties,\n+            'show_slope_for_lines': self.show_slope_for_lines,\n+            'add_vector_label': self.add_vector_label,\n+            'vector_properties_label': self.vector_properties_label,\n+            'background': self.background,\n+            'vectors': self.get_vectors,\n+            'points': self.get_points,\n+            'expected_result': self.get_expected_result\n+        }\n+\n+    @property\n+    def user_state(self):\n+        \"\"\"\n+        Return user state, which is a combination of most recent answer and result.\n+        \"\"\"\n+        user_state = self.answer\n+        if self.result:\n+            user_state['result'] = self.result\n+        return user_state\n+\n+    @property\n+    def background(self):\n+        \"\"\"\n+        Return information about background to draw for this exercise.\n+        \"\"\"\n+        return {\n+            'src': self.background_url,\n+            'width': self.background_width,\n+            'height': self.background_height,\n+        }\n+\n+    @property\n+    def get_vectors(self):\n+        \"\"\"\n+        Load info about vectors for this exercise from JSON string specified by course author.\n+        \"\"\"\n+        return json.loads(self.vectors)\n+\n+    @property\n+    def get_points(self):\n+        \"\"\"\n+        Load info about points for this exercise from JSON string specified by course author.\n+        \"\"\"\n+        points = json.loads(self.points)\n+        for point in points:\n+            # If author did not specify whether point should be drawn in fixed location (True)\n+            # or placed by student (False), we default to True;\n+            # template needs this info to determine whether it should add option\n+            # for selecting point to dropdown menu:\n+            if 'fixed' not in point:\n+                point['fixed'] = True\n+        return points\n+\n+    @property\n+    def get_expected_result(self):\n+        \"\"\"\n+        Load info about expected result for this exercise\n+        from JSON string specified by course author.\n+        \"\"\"\n+        return json.loads(self.expected_result)\n+\n+    def student_view(self, context=None):\n+        \"\"\"\n+        The primary view of the VectorDrawXBlock, shown to students\n+        when viewing courses.\n+        \"\"\"\n+        context['self'] = self\n+        fragment = Fragment()\n+        fragment.add_content(loader.render_template('static/html/vectordraw.html', context))\n+        fragment.add_css_url(\n+            \"//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.3.0/css/font-awesome.min.css\"\n+        )\n+        fragment.add_css(loader.load_unicode('static/css/vectordraw.css'))\n+        # Workbench doesn't have Underscore.js, so add it:\n+        if WorkbenchRuntime and isinstance(self.runtime, WorkbenchRuntime):\n+            fragment.add_javascript_url(\n+                \"//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.2/underscore-min.js\"\n+            )\n+        fragment.add_javascript_url(\n+            \"//cdnjs.cloudflare.com/ajax/libs/jsxgraph/0.98/jsxgraphcore.js\"\n+        )\n+        fragment.add_javascript(loader.load_unicode(\"static/js/src/vectordraw.js\"))","path":"vectordraw/vectordraw.py","position":318,"original_position":318,"commit_id":"fbc4ea4885de2deb0a006bc7e9f5d59595270349","original_commit_id":"fbc4ea4885de2deb0a006bc7e9f5d59595270349","user":{"login":"smarnach","id":249196,"avatar_url":"https://avatars.githubusercontent.com/u/249196?v=3","gravatar_id":"","url":"https://api.github.com/users/smarnach","html_url":"https://github.com/smarnach","followers_url":"https://api.github.com/users/smarnach/followers","following_url":"https://api.github.com/users/smarnach/following{/other_user}","gists_url":"https://api.github.com/users/smarnach/gists{/gist_id}","starred_url":"https://api.github.com/users/smarnach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/smarnach/subscriptions","organizations_url":"https://api.github.com/users/smarnach/orgs","repos_url":"https://api.github.com/users/smarnach/repos","events_url":"https://api.github.com/users/smarnach/events{/privacy}","received_events_url":"https://api.github.com/users/smarnach/received_events","type":"User","site_admin":false},"body":"@itsjeyd The three directories are for different purposes.  `templates` is for templates of any kind, `static` is for content that is used as-is by the Python code, but not served directly by the runtime and `public` is for static content that is served directly from the filesystem by the runtime.\r\n\r\nIf you have a small JS snippet you want to inline, you would put it in `static`, since it's only loaded by the Python code in your XBlock.  If you want to include the JS code by URL, it needs to be served directly from the filesystem, so it has to go into `public`.","created_at":"2015-11-04T12:32:17Z","updated_at":"2015-11-04T12:32:17Z","html_url":"https://github.com/open-craft/xblock-vectordraw/pull/1#discussion_r43874938","pull_request_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1","_links":{"self":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/comments/43874938"},"html":{"href":"https://github.com/open-craft/xblock-vectordraw/pull/1#discussion_r43874938"},"pull_request":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1"}}},"pull_request":{"url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1","id":49297422,"html_url":"https://github.com/open-craft/xblock-vectordraw/pull/1","diff_url":"https://github.com/open-craft/xblock-vectordraw/pull/1.diff","patch_url":"https://github.com/open-craft/xblock-vectordraw/pull/1.patch","issue_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/1","number":1,"state":"open","locked":false,"title":"Initial implementation","user":{"login":"itsjeyd","id":961441,"avatar_url":"https://avatars.githubusercontent.com/u/961441?v=3","gravatar_id":"","url":"https://api.github.com/users/itsjeyd","html_url":"https://github.com/itsjeyd","followers_url":"https://api.github.com/users/itsjeyd/followers","following_url":"https://api.github.com/users/itsjeyd/following{/other_user}","gists_url":"https://api.github.com/users/itsjeyd/gists{/gist_id}","starred_url":"https://api.github.com/users/itsjeyd/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/itsjeyd/subscriptions","organizations_url":"https://api.github.com/users/itsjeyd/orgs","repos_url":"https://api.github.com/users/itsjeyd/repos","events_url":"https://api.github.com/users/itsjeyd/events{/privacy}","received_events_url":"https://api.github.com/users/itsjeyd/received_events","type":"User","site_admin":false},"body":"**Testing**\r\n\r\n1. Install the XBlock on Devstack via:\r\n\r\n        pip install -e .\r\n\r\n2. Add `vectordraw` to the Advanced Module List in your course settings.\r\n3. Add a \"Vector Drawing\" block to a unit.\r\n4. Customize the Vector Drawing block. You can use one of the examples from the jsinput-vectordraw repository (e.g., [2_boxIncline_multiVector](https://raw.githubusercontent.com/open-craft/jsinput-vectordraw/master/Notes_and_Examples/2_boxIncline_multiVector/2_boxIncline.html)) for this purpose. Note that values of \"Vectors\", \"Points\", \"Expected result\" settings need to be valid JSON.\r\n","created_at":"2015-10-30T17:18:57Z","updated_at":"2015-11-04T12:32:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3da4bd6e01e3b95034eaff5e2cc9dafee39223f6","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1/commits","review_comments_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1/comments","review_comment_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/comments{/number}","comments_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/1/comments","statuses_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/statuses/fbc4ea4885de2deb0a006bc7e9f5d59595270349","head":{"label":"open-craft:initial-implementation","ref":"initial-implementation","sha":"fbc4ea4885de2deb0a006bc7e9f5d59595270349","user":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars.githubusercontent.com/u/7414786?v=3","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":45102882,"name":"xblock-vectordraw","full_name":"open-craft/xblock-vectordraw","owner":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars.githubusercontent.com/u/7414786?v=3","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/xblock-vectordraw","description":"An XBlock for creating vector drawing exercises","fork":false,"url":"https://api.github.com/repos/open-craft/xblock-vectordraw","forks_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/forks","keys_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/teams","hooks_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/hooks","issue_events_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/events{/number}","events_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/events","assignees_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/assignees{/user}","branches_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/branches{/branch}","tags_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/tags","blobs_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/statuses/{sha}","languages_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/languages","stargazers_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/stargazers","contributors_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/contributors","subscribers_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/subscribers","subscription_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/subscription","commits_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/contents/{+path}","compare_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/merges","archive_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/downloads","issues_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues{/number}","pulls_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls{/number}","milestones_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/milestones{/number}","notifications_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/labels{/name}","releases_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/releases{/id}","created_at":"2015-10-28T09:45:59Z","updated_at":"2015-10-28T09:45:59Z","pushed_at":"2015-11-03T15:57:48Z","git_url":"git://github.com/open-craft/xblock-vectordraw.git","ssh_url":"git@github.com:open-craft/xblock-vectordraw.git","clone_url":"https://github.com/open-craft/xblock-vectordraw.git","svn_url":"https://github.com/open-craft/xblock-vectordraw","homepage":null,"size":0,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"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":"open-craft:master","ref":"master","sha":"4fdb02a55a5e5ccc9824e2a85147dc9589e29d53","user":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars.githubusercontent.com/u/7414786?v=3","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":45102882,"name":"xblock-vectordraw","full_name":"open-craft/xblock-vectordraw","owner":{"login":"open-craft","id":7414786,"avatar_url":"https://avatars.githubusercontent.com/u/7414786?v=3","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/xblock-vectordraw","description":"An XBlock for creating vector drawing exercises","fork":false,"url":"https://api.github.com/repos/open-craft/xblock-vectordraw","forks_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/forks","keys_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/keys{/key_id}","collaborators_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/teams","hooks_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/hooks","issue_events_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/events{/number}","events_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/events","assignees_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/assignees{/user}","branches_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/branches{/branch}","tags_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/tags","blobs_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/refs{/sha}","trees_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/trees{/sha}","statuses_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/statuses/{sha}","languages_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/languages","stargazers_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/stargazers","contributors_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/contributors","subscribers_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/subscribers","subscription_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/subscription","commits_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/commits{/sha}","git_commits_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/git/commits{/sha}","comments_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/comments{/number}","issue_comment_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/comments{/number}","contents_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/contents/{+path}","compare_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/compare/{base}...{head}","merges_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/merges","archive_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/downloads","issues_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues{/number}","pulls_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls{/number}","milestones_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/milestones{/number}","notifications_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/labels{/name}","releases_url":"https://api.github.com/repos/open-craft/xblock-vectordraw/releases{/id}","created_at":"2015-10-28T09:45:59Z","updated_at":"2015-10-28T09:45:59Z","pushed_at":"2015-11-03T15:57:48Z","git_url":"git://github.com/open-craft/xblock-vectordraw.git","ssh_url":"git@github.com:open-craft/xblock-vectordraw.git","clone_url":"https://github.com/open-craft/xblock-vectordraw.git","svn_url":"https://github.com/open-craft/xblock-vectordraw","homepage":null,"size":0,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_downloads":true,"has_wiki":true,"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/open-craft/xblock-vectordraw/pulls/1"},"html":{"href":"https://github.com/open-craft/xblock-vectordraw/pull/1"},"issue":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/1"},"comments":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/issues/1/comments"},"review_comments":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1/comments"},"review_comment":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/pulls/1/commits"},"statuses":{"href":"https://api.github.com/repos/open-craft/xblock-vectordraw/statuses/fbc4ea4885de2deb0a006bc7e9f5d59595270349"}}}}