{"action":"created","comment":{"url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/comments/88803988","pull_request_review_id":9366458,"id":88803988,"diff_hunk":"@@ -662,82 +687,113 @@ class Visualizer extends NCubeGroovyController\n \n \tprivate boolean getTraitMaps(VisualizerInfo visInfo, VisualizerRelInfo relInfo, Map traitMaps)\n \t{\n-\t\tMap scope = relInfo.targetScope\n-\t\tNCube cube = relInfo.targetCube\n-\t\tString cubeName = cube.name\n-\t\ttry\n-\t\t{\n-\t\t\thelper.getTraitMaps(cubeName, scope, traitMaps)\n+\t\tString cubeName = relInfo.targetCube.name\n+\t\ttry {\n+\t\t\thelper.getTraitMaps(cubeName, relInfo.targetScope, traitMaps)\n \t\t\trelInfo.targetTraitMaps = traitMaps\n \t\t}\n \t\tcatch (Exception e)\n \t\t{\n-\t\t\tString scopedName\n-\t\t\tSet notes = []\n-\t\t\tString rootCause = getRootCause(e).toString()\n-\t\t\tif (rootCause.contains(NOT_ALL_REQUIRED_SCOPE_KEYS))\n-\t\t\t{\n-\t\t\t\tSet<String> missingScope = findMissingScope(scope, rootCause)\n-\t\t\t\tif (missingScope)\n-\t\t\t\t{\n-\t\t\t\t\tMap expandedScope = scope == null ? new LinkedHashMap(DEFAULT_SCOPE) : new LinkedHashMap(scope)\n-\t\t\t\t\tmissingScope.each { String key ->\n-\t\t\t\t\t\texpandedScope[key] = DEFAULT_SCOPE_VALUE\n-\t\t\t\t\t}\n-\t\t\t\t\tmissingRequiredScopeKeys.addAll(missingScope)\n-\t\t\t\t\tvisInfo.scope = expandedScope\n-\t\t\t\t\tscopedName = MISSING_SCOPE\n-\t\t\t\t\tnotes << 'Additional scope is required. Please add scope value(s) for the following scope key(s):' + BREAK + BREAK + String.join(COMMA_SPACE, missingScope)\n-\t\t\t\t}\n-\t\t\t\telse\n-\t\t\t\t{\n-\t\t\t\t\tthrow new IllegalStateException('Exception message contains \"' + NOT_ALL_REQUIRED_SCOPE_KEYS + '\", but no missing keys found for ' + cubeName + ' and scope ' + scope.toString() + '.', e)\n-\t\t\t\t}\n+\t\t\tThrowable t = getDeepestException(e)\n+\t\t\tif (t instanceof InvalidCoordinateException ) {\n+\t\t\t\thandleInvalidCoordinateException(t, visInfo, relInfo)\n+\t\t\t}\n+\t\t\telse if (t instanceof CoordinateNotFoundException ) {\n+\t\t\t\thandleCoordinateNotFoundException(t, relInfo)\n+\t\t\t}\n+\t\t\telse{\n+\t\t\t\thandleException(t, relInfo)\n \t\t\t}\n-\t\t\telse\n-\t\t\t{\n-\t\t\t\tscopedName = UNABLE_TO_LOAD\n-\t\t\t\tString message = 'An exception was thrown while loading fields and traits for cube ' + cubeName + '.' + BREAK + BREAK + '<strong>Message:</strong> ' + BREAK + BREAK + e.message + BREAK + BREAK +  '<strong>Root cause: </strong>'+ BREAK + BREAK + rootCause\n-\t\t\t\tnotes << message\n-\t\t\t\tmessages << message\n- \t\t\t}\n-\t\t\ttraitMaps = [(CLASS_TRAITS): [(R_SCOPED_NAME): scopedName]]\n-\t\t\trelInfo.targetTraitMaps = traitMaps\n-\t\t\trelInfo.loadFieldsAndTraits = false\n-\t\t\trelInfo.notes = notes\n \t\t\treturn false\n \t\t}\n \t\treturn true\n \t}\n \n-\tprivate static Throwable getRootCause(Throwable cause) {\n-\t\tThrowable rootCause = null;\n-\t\twhile (cause != null && cause != rootCause) {\n-\t\t\trootCause = cause;\n-\t\t\tcause = cause.getCause();\n+\tprivate void handleCoordinateNotFoundException(CoordinateNotFoundException e, VisualizerRelInfo relInfo)\n+\t{\n+\t\tString cubeName = e.cubeName\n+\t\tString axisName = e.axisName\n+\t\tObject value = e.value ?: 'null'\n+\n+\t\tif (cubeName && axisName) {\n+\t\t\tString message = 'The scope value ' + value + ' for scope key ' + axisName + ' cannot be found on axis ' + axisName + ' on ' + cubeName + getSourceMessage(relInfo) + '.' +\n+\t\t\t\t\t' Please supply a different value for ' + axisName + '.'\n+\t\t\trelInfo.notes << message\n+\t\t\tmessages << message\n+\t\t\trelInfo.targetTraitMaps = [(CLASS_TRAITS): [(R_SCOPED_NAME): SCOPE_VALUE_NOT_FOUND]]\n+\t\t\trelInfo.loadFieldsAndTraits = false\n+\t\t}\n+\t\telse{\n+\t\t\thandleException(e as Exception, relInfo)\n \t\t}\n-\t\treturn rootCause;\n \t}\n \n-\tprivate static Set<String> findMissingScope(Map scope, String requiredScopeKeyString)\n+\tprivate static String getSourceMessage(VisualizerRelInfo relInfo)\n+\t{\n+\t\tif (relInfo.sourceTraitMaps)\n+\t\t{\n+\t\t\tString sourceScopedName = getScopedName(relInfo.sourceTraitMaps)\n+\t\t\treturn sourceScopedName ? ', the target of ' + sourceScopedName + ' on ' + relInfo.sourceCube.name : ''\n+\t\t}\n+\t\treturn ''\n+\t}\n+\n+\tprivate void handleInvalidCoordinateException(InvalidCoordinateException e,  VisualizerInfo visInfo, VisualizerRelInfo relInfo)\n+\t{\n+\t\tString cubeName = e.cubeName\n+\t\tSet requiredKeys = e.requiredKeys\n+\t\tSet<String> missingScope = findMissingScope(relInfo.targetScope, requiredKeys)\n+\t\tif (missingScope)\n+\t\t{\n+\t\t\tMap expandedScope = new LinkedHashMap(visInfo.scope)\n+\t\t\tmissingScope.each { String key ->\n+\t\t\t\texpandedScope[key] = DEFAULT_SCOPE_VALUE\n+\t\t\t}\n+\t\t\tvisInfo.scope = expandedScope\n+\t\t\trelInfo.targetTraitMaps = [(CLASS_TRAITS): [(R_SCOPED_NAME): MISSING_SCOPE]]\n+\t\t\tString message = 'Additional scope is required to load ' + cubeName + getSourceMessage(relInfo) +\n+\t\t\t\t\t'. Please add scope value(s) for the following scope key(s): ' + String.join(COMMA_SPACE, missingScope) + '.'\n+\t\t\trelInfo.notes << message\n+\t\t\tmessages << message\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\tthrow new IllegalStateException('An InvalidCoordinateException was thrown, but no missing scope keys found for ' + relInfo.targetCube.name + ' and scope ' + visInfo.scope.toString() + '.', e)\n+\t\t}\n+\t}\n+\n+\tprivate static Set<String> findMissingScope(Map scope, Set<String> requiredKeys)\n \t{\n \t\tSet<String> missingScope = []\n-\t\tString part1 = Splitter.on(NOT_ALL_REQUIRED_SCOPE_KEYS).split(requiredScopeKeyString).last()\n-\t\tString part2 = Splitter.on('[').split(part1).last()\n-\t\tString part3 = Splitter.on(']').split(part2).first()\n-\t\tSet<String> requiredKeys = Splitter.on(',').split(part3) as Set\n-\t\trequiredKeys.each {\n-\t\t\tString key = it.trim()\n-\t\t\tif (scope == null || (!scope.containsKey(key) && !MANDATORY_RPM_SCOPE_KEYS.contains(key)))\n+\t\trequiredKeys.each {String key ->\n+\t\t\tif (!MANDATORY_RPM_SCOPE_KEYS.contains(key) && (scope == null || !scope.containsKey(key)))\n \t\t\t{\n \t\t\t\tmissingScope << key\n \t\t\t}\n \t\t}\n \t\treturn missingScope.size() > 0 ? missingScope : null\n \t}\n \n-\tprivate List getScopeAllReferenced(NCube cube, List<Set> scopeKeys)\t{\n+\tprivate void handleException(Throwable e, VisualizerRelInfo relInfo)\n+\t{\n+\t\tString message = 'An exception was thrown while loading fields and traits for ' + relInfo.targetCube.name + getSourceMessage(relInfo) + '.' + BREAK + BREAK + '<strong>Message:</strong> ' + BREAK + BREAK + e.message + BREAK + BREAK +  '<strong>Root cause: </strong>'+ BREAK + BREAK + getDeepestException(e).toString()","path":"src/main/groovy/com/cedarsoftware/util/Visualizer.groovy","position":391,"original_position":391,"commit_id":"2dfae72d6bb18a678d946d319c7f61fbea14caf8","original_commit_id":"2dfae72d6bb18a678d946d319c7f61fbea14caf8","user":{"login":"jdereg","id":5373774,"avatar_url":"https://avatars.githubusercontent.com/u/5373774?v=3","gravatar_id":"","url":"https://api.github.com/users/jdereg","html_url":"https://github.com/jdereg","followers_url":"https://api.github.com/users/jdereg/followers","following_url":"https://api.github.com/users/jdereg/following{/other_user}","gists_url":"https://api.github.com/users/jdereg/gists{/gist_id}","starred_url":"https://api.github.com/users/jdereg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdereg/subscriptions","organizations_url":"https://api.github.com/users/jdereg/orgs","repos_url":"https://api.github.com/users/jdereg/repos","events_url":"https://api.github.com/users/jdereg/events{/privacy}","received_events_url":"https://api.github.com/users/jdereg/received_events","type":"User","site_admin":false},"body":"use double \" and inline ${vars} instead of String +","created_at":"2016-11-20T15:33:15Z","updated_at":"2016-11-20T15:38:52Z","html_url":"https://github.com/jdereg/n-cube-editor/pull/298#discussion_r88803988","pull_request_url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298","_links":{"self":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/comments/88803988"},"html":{"href":"https://github.com/jdereg/n-cube-editor/pull/298#discussion_r88803988"},"pull_request":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298"}}},"pull_request":{"url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298","id":94475441,"html_url":"https://github.com/jdereg/n-cube-editor/pull/298","diff_url":"https://github.com/jdereg/n-cube-editor/pull/298.diff","patch_url":"https://github.com/jdereg/n-cube-editor/pull/298.patch","issue_url":"https://api.github.com/repos/jdereg/n-cube-editor/issues/298","number":298,"state":"open","locked":false,"title":"Visualizer improved handling of initial scope and exceptions","user":{"login":"bheekin","id":15614948,"avatar_url":"https://avatars.githubusercontent.com/u/15614948?v=3","gravatar_id":"","url":"https://api.github.com/users/bheekin","html_url":"https://github.com/bheekin","followers_url":"https://api.github.com/users/bheekin/followers","following_url":"https://api.github.com/users/bheekin/following{/other_user}","gists_url":"https://api.github.com/users/bheekin/gists{/gist_id}","starred_url":"https://api.github.com/users/bheekin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bheekin/subscriptions","organizations_url":"https://api.github.com/users/bheekin/orgs","repos_url":"https://api.github.com/users/bheekin/repos","events_url":"https://api.github.com/users/bheekin/events{/privacy}","received_events_url":"https://api.github.com/users/bheekin/received_events","type":"User","site_admin":false},"body":"**NOTE!!! Don't merge until the following pull request for n-cube has been merged: https://github.com/jdereg/n-cube/pull/225**\r\n\r\nVisualizer changes: \r\n\r\n1. Improved handling of exceptions occurring during load of classes due to missing scope (requires new release of NCube, PR is pending)\r\n2. Added default values to initial minimum scope.\r\n3. Improved handling and messages for missing minimum scope.\r\n","created_at":"2016-11-19T08:33:55Z","updated_at":"2016-11-20T15:38:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8e60792f694b922a5ace67065f6a68a4bf1b598d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298/commits","review_comments_url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298/comments","review_comment_url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/comments{/number}","comments_url":"https://api.github.com/repos/jdereg/n-cube-editor/issues/298/comments","statuses_url":"https://api.github.com/repos/jdereg/n-cube-editor/statuses/2dfae72d6bb18a678d946d319c7f61fbea14caf8","head":{"label":"bheekin:visualizerScopeAndExists","ref":"visualizerScopeAndExists","sha":"2dfae72d6bb18a678d946d319c7f61fbea14caf8","user":{"login":"bheekin","id":15614948,"avatar_url":"https://avatars.githubusercontent.com/u/15614948?v=3","gravatar_id":"","url":"https://api.github.com/users/bheekin","html_url":"https://github.com/bheekin","followers_url":"https://api.github.com/users/bheekin/followers","following_url":"https://api.github.com/users/bheekin/following{/other_user}","gists_url":"https://api.github.com/users/bheekin/gists{/gist_id}","starred_url":"https://api.github.com/users/bheekin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bheekin/subscriptions","organizations_url":"https://api.github.com/users/bheekin/orgs","repos_url":"https://api.github.com/users/bheekin/repos","events_url":"https://api.github.com/users/bheekin/events{/privacy}","received_events_url":"https://api.github.com/users/bheekin/received_events","type":"User","site_admin":false},"repo":{"id":53554554,"name":"n-cube-editor","full_name":"bheekin/n-cube-editor","owner":{"login":"bheekin","id":15614948,"avatar_url":"https://avatars.githubusercontent.com/u/15614948?v=3","gravatar_id":"","url":"https://api.github.com/users/bheekin","html_url":"https://github.com/bheekin","followers_url":"https://api.github.com/users/bheekin/followers","following_url":"https://api.github.com/users/bheekin/following{/other_user}","gists_url":"https://api.github.com/users/bheekin/gists{/gist_id}","starred_url":"https://api.github.com/users/bheekin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bheekin/subscriptions","organizations_url":"https://api.github.com/users/bheekin/orgs","repos_url":"https://api.github.com/users/bheekin/repos","events_url":"https://api.github.com/users/bheekin/events{/privacy}","received_events_url":"https://api.github.com/users/bheekin/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/bheekin/n-cube-editor","description":"web-based (HTML 5) UI for editing and publishing n-cubes","fork":true,"url":"https://api.github.com/repos/bheekin/n-cube-editor","forks_url":"https://api.github.com/repos/bheekin/n-cube-editor/forks","keys_url":"https://api.github.com/repos/bheekin/n-cube-editor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/bheekin/n-cube-editor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/bheekin/n-cube-editor/teams","hooks_url":"https://api.github.com/repos/bheekin/n-cube-editor/hooks","issue_events_url":"https://api.github.com/repos/bheekin/n-cube-editor/issues/events{/number}","events_url":"https://api.github.com/repos/bheekin/n-cube-editor/events","assignees_url":"https://api.github.com/repos/bheekin/n-cube-editor/assignees{/user}","branches_url":"https://api.github.com/repos/bheekin/n-cube-editor/branches{/branch}","tags_url":"https://api.github.com/repos/bheekin/n-cube-editor/tags","blobs_url":"https://api.github.com/repos/bheekin/n-cube-editor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/bheekin/n-cube-editor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/bheekin/n-cube-editor/git/refs{/sha}","trees_url":"https://api.github.com/repos/bheekin/n-cube-editor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/bheekin/n-cube-editor/statuses/{sha}","languages_url":"https://api.github.com/repos/bheekin/n-cube-editor/languages","stargazers_url":"https://api.github.com/repos/bheekin/n-cube-editor/stargazers","contributors_url":"https://api.github.com/repos/bheekin/n-cube-editor/contributors","subscribers_url":"https://api.github.com/repos/bheekin/n-cube-editor/subscribers","subscription_url":"https://api.github.com/repos/bheekin/n-cube-editor/subscription","commits_url":"https://api.github.com/repos/bheekin/n-cube-editor/commits{/sha}","git_commits_url":"https://api.github.com/repos/bheekin/n-cube-editor/git/commits{/sha}","comments_url":"https://api.github.com/repos/bheekin/n-cube-editor/comments{/number}","issue_comment_url":"https://api.github.com/repos/bheekin/n-cube-editor/issues/comments{/number}","contents_url":"https://api.github.com/repos/bheekin/n-cube-editor/contents/{+path}","compare_url":"https://api.github.com/repos/bheekin/n-cube-editor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/bheekin/n-cube-editor/merges","archive_url":"https://api.github.com/repos/bheekin/n-cube-editor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/bheekin/n-cube-editor/downloads","issues_url":"https://api.github.com/repos/bheekin/n-cube-editor/issues{/number}","pulls_url":"https://api.github.com/repos/bheekin/n-cube-editor/pulls{/number}","milestones_url":"https://api.github.com/repos/bheekin/n-cube-editor/milestones{/number}","notifications_url":"https://api.github.com/repos/bheekin/n-cube-editor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/bheekin/n-cube-editor/labels{/name}","releases_url":"https://api.github.com/repos/bheekin/n-cube-editor/releases{/id}","deployments_url":"https://api.github.com/repos/bheekin/n-cube-editor/deployments","created_at":"2016-03-10T04:19:59Z","updated_at":"2016-03-10T04:20:01Z","pushed_at":"2016-11-20T01:42:48Z","git_url":"git://github.com/bheekin/n-cube-editor.git","ssh_url":"git@github.com:bheekin/n-cube-editor.git","clone_url":"https://github.com/bheekin/n-cube-editor.git","svn_url":"https://github.com/bheekin/n-cube-editor","homepage":null,"size":10645,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"jdereg:master","ref":"master","sha":"47bd3cc5ad9435e1dfe8052cc831396f2b0cbc6f","user":{"login":"jdereg","id":5373774,"avatar_url":"https://avatars.githubusercontent.com/u/5373774?v=3","gravatar_id":"","url":"https://api.github.com/users/jdereg","html_url":"https://github.com/jdereg","followers_url":"https://api.github.com/users/jdereg/followers","following_url":"https://api.github.com/users/jdereg/following{/other_user}","gists_url":"https://api.github.com/users/jdereg/gists{/gist_id}","starred_url":"https://api.github.com/users/jdereg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdereg/subscriptions","organizations_url":"https://api.github.com/users/jdereg/orgs","repos_url":"https://api.github.com/users/jdereg/repos","events_url":"https://api.github.com/users/jdereg/events{/privacy}","received_events_url":"https://api.github.com/users/jdereg/received_events","type":"User","site_admin":false},"repo":{"id":15418824,"name":"n-cube-editor","full_name":"jdereg/n-cube-editor","owner":{"login":"jdereg","id":5373774,"avatar_url":"https://avatars.githubusercontent.com/u/5373774?v=3","gravatar_id":"","url":"https://api.github.com/users/jdereg","html_url":"https://github.com/jdereg","followers_url":"https://api.github.com/users/jdereg/followers","following_url":"https://api.github.com/users/jdereg/following{/other_user}","gists_url":"https://api.github.com/users/jdereg/gists{/gist_id}","starred_url":"https://api.github.com/users/jdereg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdereg/subscriptions","organizations_url":"https://api.github.com/users/jdereg/orgs","repos_url":"https://api.github.com/users/jdereg/repos","events_url":"https://api.github.com/users/jdereg/events{/privacy}","received_events_url":"https://api.github.com/users/jdereg/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jdereg/n-cube-editor","description":"web-based (HTML 5) UI for editing and publishing n-cubes","fork":false,"url":"https://api.github.com/repos/jdereg/n-cube-editor","forks_url":"https://api.github.com/repos/jdereg/n-cube-editor/forks","keys_url":"https://api.github.com/repos/jdereg/n-cube-editor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jdereg/n-cube-editor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jdereg/n-cube-editor/teams","hooks_url":"https://api.github.com/repos/jdereg/n-cube-editor/hooks","issue_events_url":"https://api.github.com/repos/jdereg/n-cube-editor/issues/events{/number}","events_url":"https://api.github.com/repos/jdereg/n-cube-editor/events","assignees_url":"https://api.github.com/repos/jdereg/n-cube-editor/assignees{/user}","branches_url":"https://api.github.com/repos/jdereg/n-cube-editor/branches{/branch}","tags_url":"https://api.github.com/repos/jdereg/n-cube-editor/tags","blobs_url":"https://api.github.com/repos/jdereg/n-cube-editor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jdereg/n-cube-editor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jdereg/n-cube-editor/git/refs{/sha}","trees_url":"https://api.github.com/repos/jdereg/n-cube-editor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jdereg/n-cube-editor/statuses/{sha}","languages_url":"https://api.github.com/repos/jdereg/n-cube-editor/languages","stargazers_url":"https://api.github.com/repos/jdereg/n-cube-editor/stargazers","contributors_url":"https://api.github.com/repos/jdereg/n-cube-editor/contributors","subscribers_url":"https://api.github.com/repos/jdereg/n-cube-editor/subscribers","subscription_url":"https://api.github.com/repos/jdereg/n-cube-editor/subscription","commits_url":"https://api.github.com/repos/jdereg/n-cube-editor/commits{/sha}","git_commits_url":"https://api.github.com/repos/jdereg/n-cube-editor/git/commits{/sha}","comments_url":"https://api.github.com/repos/jdereg/n-cube-editor/comments{/number}","issue_comment_url":"https://api.github.com/repos/jdereg/n-cube-editor/issues/comments{/number}","contents_url":"https://api.github.com/repos/jdereg/n-cube-editor/contents/{+path}","compare_url":"https://api.github.com/repos/jdereg/n-cube-editor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jdereg/n-cube-editor/merges","archive_url":"https://api.github.com/repos/jdereg/n-cube-editor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jdereg/n-cube-editor/downloads","issues_url":"https://api.github.com/repos/jdereg/n-cube-editor/issues{/number}","pulls_url":"https://api.github.com/repos/jdereg/n-cube-editor/pulls{/number}","milestones_url":"https://api.github.com/repos/jdereg/n-cube-editor/milestones{/number}","notifications_url":"https://api.github.com/repos/jdereg/n-cube-editor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jdereg/n-cube-editor/labels{/name}","releases_url":"https://api.github.com/repos/jdereg/n-cube-editor/releases{/id}","deployments_url":"https://api.github.com/repos/jdereg/n-cube-editor/deployments","created_at":"2013-12-24T13:21:25Z","updated_at":"2016-10-24T16:29:27Z","pushed_at":"2016-11-20T01:42:48Z","git_url":"git://github.com/jdereg/n-cube-editor.git","ssh_url":"git@github.com:jdereg/n-cube-editor.git","clone_url":"https://github.com/jdereg/n-cube-editor.git","svn_url":"https://github.com/jdereg/n-cube-editor","homepage":null,"size":10623,"stargazers_count":4,"watchers_count":4,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":14,"mirror_url":null,"open_issues_count":2,"forks":14,"open_issues":2,"watchers":4,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298"},"html":{"href":"https://github.com/jdereg/n-cube-editor/pull/298"},"issue":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/issues/298"},"comments":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/issues/298/comments"},"review_comments":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298/comments"},"review_comment":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/pulls/298/commits"},"statuses":{"href":"https://api.github.com/repos/jdereg/n-cube-editor/statuses/2dfae72d6bb18a678d946d319c7f61fbea14caf8"}}}}
{"actor":{"display_login":"jdereg"}}