{"action":"created","comment":{"url":"https://api.github.com/repos/Polymer/tattoo/pulls/comments/88598104","pull_request_review_id":9167504,"id":88598104,"diff_hunk":"@@ -0,0 +1,578 @@\n+/**\n+ * @license\n+ * Copyright (c) 2016 The Polymer Project Authors. All rights reserved.\n+ * This code may only be used under the BSD style license found at\n+ * http://polymer.github.io/LICENSE.txt\n+ * The complete set of authors may be found at\n+ * http://polymer.github.io/AUTHORS.txt\n+ * The complete set of contributors may be found at\n+ * http://polymer.github.io/CONTRIBUTORS.txt\n+ * Code distributed by Google as part of the polymer project is also\n+ * subject to an additional IP rights grant found at\n+ * http://polymer.github.io/PATENTS.txt\n+ */\n+\n+'use strict';\n+\n+declare function require(name: string): any; try {\n+  require('source-map-support').install();\n+} catch (err) {\n+}\n+\n+import * as Bottleneck from 'bottleneck';\n+import * as child_process from 'child_process';\n+import * as fs from 'fs';\n+import * as hydrolysis from 'hydrolysis';\n+import * as GitHub from 'github';\n+import * as nodegit from 'nodegit';\n+import * as pad from 'pad';\n+import * as path from 'path';\n+import * as promisify from 'promisify-node';\n+import * as rimraf from 'rimraf';\n+import * as resolve from 'resolve';\n+\n+import * as git from './git';\n+import {test} from './test';\n+import {TestResult, TestResultValue} from './test-result';\n+import * as util from './util';\n+import {Workspace, WorkspaceRepo} from './workspace';\n+\n+/**\n+ * RunnerOptions contains all configuration used when constructing an instance\n+ * of the Runner.\n+ */\n+export interface RunnerOptions {\n+  // An array of repo expressions for filtering out repos to load.\n+  excludeRepos?: string[];\n+\n+  // The github token needed to use the github API.\n+  githubToken: string;\n+\n+  // If true, each run will clone new copies of repos instead of updating those\n+  // already in-place.\n+  fresh?: boolean;\n+\n+  // If true, repo clones will be pointed towards last tagged released version\n+  // instead of the default master branch.  This will not override explicit\n+  // refs in the  repo expression if present.\n+  latestRelease?: boolean;\n+\n+  // An array of repo expressions defining the set of repos to require/load\n+  // but not specifically to test.\n+  repos?: string[];\n+\n+  // An array of repo expressions representing repos to exclude from testing\n+  // should any matching ones be encountered in the tests array.\n+  skipTests?: string[];\n+\n+  // An array of repo expressions defining the set of repos to test with the\n+  // web-component-tester.  Note that repos in this list do not have to be\n+  // present in the repos array.\n+  tests: string[];\n+\n+  // If true, output will information used primarily for debug purposes.\n+  verbose?: boolean;\n+\n+  // Command-line flags to send to web-component-tester.\n+  wctFlags?: string[];\n+\n+  // The folder to clone repositories into and run tests from.  Defaults to\n+  // './repos' if not provided.\n+  workspaceDir?: string;\n+}\n+\n+export class Runner {\n+  // The repository patterns we do not want to load.\n+  private _excludeRepos: string[];\n+\n+  // Always clone a fresh copy of the repository (don't just update existing\n+  // clone.)\n+  private _fresh: boolean;\n+\n+  private _github?: git.GitHubConnection;\n+  private _repos: string[];\n+  private _skipTests: string[];\n+  private _tests: string[];\n+  private _testRateLimiter: Bottleneck;\n+  private _verbose: boolean;\n+  private _wctFlags: string;\n+  private _workspace: Workspace;\n+\n+  // TODO(usergenic): This constructor is getting long.  Break up some of\n+  // these stanzas into supporting methods.\n+  constructor(options: RunnerOptions) {\n+    this._excludeRepos = options.excludeRepos || [];\n+    this._fresh = !!options.fresh;\n+    // TODO(usergenic): Pass an option to gitUtil.connectToGitHub for the\n+    // rate limiter it uses.\n+    this._github = new git.GitHubConnection(options.githubToken);\n+    this._repos = options.repos || [];\n+    this._skipTests = options.skipTests || [];\n+    this._tests = options.tests || [];\n+    this._verbose = !!options.verbose;\n+    this._wctFlags = options.wctFlags ? options.wctFlags.join(' ') : '';\n+    this._workspace = {\n+      dir: (options.workspaceDir || './tattoo_workspace'),\n+      repos: new Map()\n+    };\n+\n+    // TODO(usergenic): Rate limit should be an option.\n+    this._testRateLimiter = new Bottleneck(1, 100);\n+\n+    if (this._verbose) {\n+      console.log('Tattoo Runner configuration:');\n+      console.log({\n+        excludeRepos: this._excludeRepos,\n+        fresh: this._fresh,\n+        repos: this._repos,\n+        skipTests: this._skipTests,\n+        tests: this._tests,\n+        wctFlags: this._wctFlags,\n+        workspaceDir: this._workspace.dir\n+      });\n+    }\n+  }\n+\n+  /**\n+ * Analyzes all of the HTML in 'repos/*' with hydrolysis.\n+ *\n+ * @returns a promise of the hydrolysis.Analyzer with all of the info loaded.\n+ */\n+  async _analyzeRepos() {\n+    const dirs = fs.readdirSync(this._workspace.dir);\n+    const htmlFiles: string[] = [];\n+\n+    for (const dir of dirs) {\n+      for (const fn of fs.readdirSync(path.join('repos', dir))) {\n+        if (/index\\.html|dependencies\\.html/.test(fn) ||\n+            !fn.endsWith('.html')) {\n+          continue;\n+        }\n+        // We want to ignore files with 'demo' in them, unless the element's\n+        // directory has the word 'demo' in it, in which case that's\n+        // the whole point of the element.\n+        if (!/\\bdemo\\b/.test(dir) && /demo/.test(fn)) {\n+          continue;\n+        }\n+        htmlFiles.push(path.join('repos', dir, fn));\n+      }\n+    }\n+\n+    function filter(repo: string) {\n+      return !util.existsSync(repo);\n+    }\n+\n+    // This code is conceptually simple, it's only complex due to ordering\n+    // and the progress bar. Basically we call analyzer.metadataTree on each\n+    // html file in sequence, then finally call analyzer.annotate() and return.\n+    const analyzer = await hydrolysis.Analyzer.analyze(\n+        path.join(this._workspace.dir, 'polymer', 'polymer.html'), {filter});\n+\n+    const progressBar =\n+        util.standardProgressBar('Analyzing...', htmlFiles.length + 1);\n+\n+    for (const htmlFile of htmlFiles) {\n+      await analyzer.metadataTree(htmlFile);","path":"src/runner.ts","position":null,"original_position":175,"commit_id":"9a88a6e0804a7b3da121d9f8944060c92af48f80","original_commit_id":"c0e6bb8f6da68858de83c0d426d8f5445414fcd7","user":{"login":"usergenic","id":578,"avatar_url":"https://avatars.githubusercontent.com/u/578?v=3","gravatar_id":"","url":"https://api.github.com/users/usergenic","html_url":"https://github.com/usergenic","followers_url":"https://api.github.com/users/usergenic/followers","following_url":"https://api.github.com/users/usergenic/following{/other_user}","gists_url":"https://api.github.com/users/usergenic/gists{/gist_id}","starred_url":"https://api.github.com/users/usergenic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/usergenic/subscriptions","organizations_url":"https://api.github.com/users/usergenic/orgs","repos_url":"https://api.github.com/users/usergenic/repos","events_url":"https://api.github.com/users/usergenic/events{/privacy}","received_events_url":"https://api.github.com/users/usergenic/received_events","type":"User","site_admin":false},"body":"Moot.  Function removed in 9a88a6e0804a7b3da121d9f8944060c92af48f80 after it was discovered to be not being called anywhere.\r\n","created_at":"2016-11-18T04:27:33Z","updated_at":"2016-11-18T04:27:33Z","html_url":"https://github.com/Polymer/tattoo/pull/22#discussion_r88598104","pull_request_url":"https://api.github.com/repos/Polymer/tattoo/pulls/22","_links":{"self":{"href":"https://api.github.com/repos/Polymer/tattoo/pulls/comments/88598104"},"html":{"href":"https://github.com/Polymer/tattoo/pull/22#discussion_r88598104"},"pull_request":{"href":"https://api.github.com/repos/Polymer/tattoo/pulls/22"}}},"pull_request":{"url":"https://api.github.com/repos/Polymer/tattoo/pulls/22","id":94082996,"html_url":"https://github.com/Polymer/tattoo/pull/22","diff_url":"https://github.com/Polymer/tattoo/pull/22.diff","patch_url":"https://github.com/Polymer/tattoo/pull/22.patch","issue_url":"https://api.github.com/repos/Polymer/tattoo/issues/22","number":22,"state":"open","locked":false,"title":"Make Tattoo General Purpose","user":{"login":"usergenic","id":578,"avatar_url":"https://avatars.githubusercontent.com/u/578?v=3","gravatar_id":"","url":"https://api.github.com/users/usergenic","html_url":"https://github.com/usergenic","followers_url":"https://api.github.com/users/usergenic/followers","following_url":"https://api.github.com/users/usergenic/following{/other_user}","gists_url":"https://api.github.com/users/usergenic/gists{/gist_id}","starred_url":"https://api.github.com/users/usergenic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/usergenic/subscriptions","organizations_url":"https://api.github.com/users/usergenic/orgs","repos_url":"https://api.github.com/users/usergenic/repos","events_url":"https://api.github.com/users/usergenic/events{/privacy}","received_events_url":"https://api.github.com/users/usergenic/received_events","type":"User","site_admin":false},"body":"This is almost a rewrite.  Lots has changed, but the goal is to be easy for end users.  Perhaps the README.md will be the most explanatory of what it is supposed to be like.\r\n\r\nThere are a few things not working yet, notably:\r\n\r\n - Wildcard syntax (`PolymerElements/iron-*`) only works for org repos, not user repos. \r\n - The `--latest-release` option doesn't do anything yet.\r\n - Multiple occurrences of the same repo name in the list of repos determined to clone for a workspace will cause tattoo to bail instead of dedup.\r\n - You can't wildcard with a branch ref like `PolymerElements/paper-*#2.0-preview`\r\n\r\nOtherwise its pretty good.  Output probably should be tweaked a lot esp in the non-verbose case (like failures just show number of failures-- need to show the details in the non-verbose case).\r\n ","created_at":"2016-11-17T01:01:23Z","updated_at":"2016-11-18T04:27:33Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ed312905c8ce0e254116f698ced0cbbb3c8c99d5","assignee":{"login":"rictic","id":1659,"avatar_url":"https://avatars.githubusercontent.com/u/1659?v=3","gravatar_id":"","url":"https://api.github.com/users/rictic","html_url":"https://github.com/rictic","followers_url":"https://api.github.com/users/rictic/followers","following_url":"https://api.github.com/users/rictic/following{/other_user}","gists_url":"https://api.github.com/users/rictic/gists{/gist_id}","starred_url":"https://api.github.com/users/rictic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rictic/subscriptions","organizations_url":"https://api.github.com/users/rictic/orgs","repos_url":"https://api.github.com/users/rictic/repos","events_url":"https://api.github.com/users/rictic/events{/privacy}","received_events_url":"https://api.github.com/users/rictic/received_events","type":"User","site_admin":false},"assignees":[{"login":"rictic","id":1659,"avatar_url":"https://avatars.githubusercontent.com/u/1659?v=3","gravatar_id":"","url":"https://api.github.com/users/rictic","html_url":"https://github.com/rictic","followers_url":"https://api.github.com/users/rictic/followers","following_url":"https://api.github.com/users/rictic/following{/other_user}","gists_url":"https://api.github.com/users/rictic/gists{/gist_id}","starred_url":"https://api.github.com/users/rictic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rictic/subscriptions","organizations_url":"https://api.github.com/users/rictic/orgs","repos_url":"https://api.github.com/users/rictic/repos","events_url":"https://api.github.com/users/rictic/events{/privacy}","received_events_url":"https://api.github.com/users/rictic/received_events","type":"User","site_admin":false},{"login":"justinfagnani","id":522948,"avatar_url":"https://avatars.githubusercontent.com/u/522948?v=3","gravatar_id":"","url":"https://api.github.com/users/justinfagnani","html_url":"https://github.com/justinfagnani","followers_url":"https://api.github.com/users/justinfagnani/followers","following_url":"https://api.github.com/users/justinfagnani/following{/other_user}","gists_url":"https://api.github.com/users/justinfagnani/gists{/gist_id}","starred_url":"https://api.github.com/users/justinfagnani/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/justinfagnani/subscriptions","organizations_url":"https://api.github.com/users/justinfagnani/orgs","repos_url":"https://api.github.com/users/justinfagnani/repos","events_url":"https://api.github.com/users/justinfagnani/events{/privacy}","received_events_url":"https://api.github.com/users/justinfagnani/received_events","type":"User","site_admin":false},{"login":"FredKSchott","id":622227,"avatar_url":"https://avatars.githubusercontent.com/u/622227?v=3","gravatar_id":"","url":"https://api.github.com/users/FredKSchott","html_url":"https://github.com/FredKSchott","followers_url":"https://api.github.com/users/FredKSchott/followers","following_url":"https://api.github.com/users/FredKSchott/following{/other_user}","gists_url":"https://api.github.com/users/FredKSchott/gists{/gist_id}","starred_url":"https://api.github.com/users/FredKSchott/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FredKSchott/subscriptions","organizations_url":"https://api.github.com/users/FredKSchott/orgs","repos_url":"https://api.github.com/users/FredKSchott/repos","events_url":"https://api.github.com/users/FredKSchott/events{/privacy}","received_events_url":"https://api.github.com/users/FredKSchott/received_events","type":"User","site_admin":false},{"login":"garlicnation","id":1105965,"avatar_url":"https://avatars.githubusercontent.com/u/1105965?v=3","gravatar_id":"","url":"https://api.github.com/users/garlicnation","html_url":"https://github.com/garlicnation","followers_url":"https://api.github.com/users/garlicnation/followers","following_url":"https://api.github.com/users/garlicnation/following{/other_user}","gists_url":"https://api.github.com/users/garlicnation/gists{/gist_id}","starred_url":"https://api.github.com/users/garlicnation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/garlicnation/subscriptions","organizations_url":"https://api.github.com/users/garlicnation/orgs","repos_url":"https://api.github.com/users/garlicnation/repos","events_url":"https://api.github.com/users/garlicnation/events{/privacy}","received_events_url":"https://api.github.com/users/garlicnation/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/Polymer/tattoo/pulls/22/commits","review_comments_url":"https://api.github.com/repos/Polymer/tattoo/pulls/22/comments","review_comment_url":"https://api.github.com/repos/Polymer/tattoo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Polymer/tattoo/issues/22/comments","statuses_url":"https://api.github.com/repos/Polymer/tattoo/statuses/9a88a6e0804a7b3da121d9f8944060c92af48f80","head":{"label":"Polymer:open-repo-config","ref":"open-repo-config","sha":"9a88a6e0804a7b3da121d9f8944060c92af48f80","user":{"login":"Polymer","id":2159051,"avatar_url":"https://avatars.githubusercontent.com/u/2159051?v=3","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"repo":{"id":51868019,"name":"tattoo","full_name":"Polymer/tattoo","owner":{"login":"Polymer","id":2159051,"avatar_url":"https://avatars.githubusercontent.com/u/2159051?v=3","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Polymer/tattoo","description":"Test All The Things Over and Over","fork":false,"url":"https://api.github.com/repos/Polymer/tattoo","forks_url":"https://api.github.com/repos/Polymer/tattoo/forks","keys_url":"https://api.github.com/repos/Polymer/tattoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Polymer/tattoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Polymer/tattoo/teams","hooks_url":"https://api.github.com/repos/Polymer/tattoo/hooks","issue_events_url":"https://api.github.com/repos/Polymer/tattoo/issues/events{/number}","events_url":"https://api.github.com/repos/Polymer/tattoo/events","assignees_url":"https://api.github.com/repos/Polymer/tattoo/assignees{/user}","branches_url":"https://api.github.com/repos/Polymer/tattoo/branches{/branch}","tags_url":"https://api.github.com/repos/Polymer/tattoo/tags","blobs_url":"https://api.github.com/repos/Polymer/tattoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Polymer/tattoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Polymer/tattoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/Polymer/tattoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Polymer/tattoo/statuses/{sha}","languages_url":"https://api.github.com/repos/Polymer/tattoo/languages","stargazers_url":"https://api.github.com/repos/Polymer/tattoo/stargazers","contributors_url":"https://api.github.com/repos/Polymer/tattoo/contributors","subscribers_url":"https://api.github.com/repos/Polymer/tattoo/subscribers","subscription_url":"https://api.github.com/repos/Polymer/tattoo/subscription","commits_url":"https://api.github.com/repos/Polymer/tattoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/Polymer/tattoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/Polymer/tattoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/Polymer/tattoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/Polymer/tattoo/contents/{+path}","compare_url":"https://api.github.com/repos/Polymer/tattoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Polymer/tattoo/merges","archive_url":"https://api.github.com/repos/Polymer/tattoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Polymer/tattoo/downloads","issues_url":"https://api.github.com/repos/Polymer/tattoo/issues{/number}","pulls_url":"https://api.github.com/repos/Polymer/tattoo/pulls{/number}","milestones_url":"https://api.github.com/repos/Polymer/tattoo/milestones{/number}","notifications_url":"https://api.github.com/repos/Polymer/tattoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Polymer/tattoo/labels{/name}","releases_url":"https://api.github.com/repos/Polymer/tattoo/releases{/id}","deployments_url":"https://api.github.com/repos/Polymer/tattoo/deployments","created_at":"2016-02-16T20:36:18Z","updated_at":"2016-11-15T01:53:00Z","pushed_at":"2016-11-18T04:25:24Z","git_url":"git://github.com/Polymer/tattoo.git","ssh_url":"git@github.com:Polymer/tattoo.git","clone_url":"https://github.com/Polymer/tattoo.git","svn_url":"https://github.com/Polymer/tattoo","homepage":null,"size":111,"stargazers_count":6,"watchers_count":6,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":18,"forks":0,"open_issues":18,"watchers":6,"default_branch":"master"}},"base":{"label":"Polymer:v2","ref":"v2","sha":"e2a9398fae914b7089ce48c02ed85792ed480591","user":{"login":"Polymer","id":2159051,"avatar_url":"https://avatars.githubusercontent.com/u/2159051?v=3","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"repo":{"id":51868019,"name":"tattoo","full_name":"Polymer/tattoo","owner":{"login":"Polymer","id":2159051,"avatar_url":"https://avatars.githubusercontent.com/u/2159051?v=3","gravatar_id":"","url":"https://api.github.com/users/Polymer","html_url":"https://github.com/Polymer","followers_url":"https://api.github.com/users/Polymer/followers","following_url":"https://api.github.com/users/Polymer/following{/other_user}","gists_url":"https://api.github.com/users/Polymer/gists{/gist_id}","starred_url":"https://api.github.com/users/Polymer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Polymer/subscriptions","organizations_url":"https://api.github.com/users/Polymer/orgs","repos_url":"https://api.github.com/users/Polymer/repos","events_url":"https://api.github.com/users/Polymer/events{/privacy}","received_events_url":"https://api.github.com/users/Polymer/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Polymer/tattoo","description":"Test All The Things Over and Over","fork":false,"url":"https://api.github.com/repos/Polymer/tattoo","forks_url":"https://api.github.com/repos/Polymer/tattoo/forks","keys_url":"https://api.github.com/repos/Polymer/tattoo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Polymer/tattoo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Polymer/tattoo/teams","hooks_url":"https://api.github.com/repos/Polymer/tattoo/hooks","issue_events_url":"https://api.github.com/repos/Polymer/tattoo/issues/events{/number}","events_url":"https://api.github.com/repos/Polymer/tattoo/events","assignees_url":"https://api.github.com/repos/Polymer/tattoo/assignees{/user}","branches_url":"https://api.github.com/repos/Polymer/tattoo/branches{/branch}","tags_url":"https://api.github.com/repos/Polymer/tattoo/tags","blobs_url":"https://api.github.com/repos/Polymer/tattoo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Polymer/tattoo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Polymer/tattoo/git/refs{/sha}","trees_url":"https://api.github.com/repos/Polymer/tattoo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Polymer/tattoo/statuses/{sha}","languages_url":"https://api.github.com/repos/Polymer/tattoo/languages","stargazers_url":"https://api.github.com/repos/Polymer/tattoo/stargazers","contributors_url":"https://api.github.com/repos/Polymer/tattoo/contributors","subscribers_url":"https://api.github.com/repos/Polymer/tattoo/subscribers","subscription_url":"https://api.github.com/repos/Polymer/tattoo/subscription","commits_url":"https://api.github.com/repos/Polymer/tattoo/commits{/sha}","git_commits_url":"https://api.github.com/repos/Polymer/tattoo/git/commits{/sha}","comments_url":"https://api.github.com/repos/Polymer/tattoo/comments{/number}","issue_comment_url":"https://api.github.com/repos/Polymer/tattoo/issues/comments{/number}","contents_url":"https://api.github.com/repos/Polymer/tattoo/contents/{+path}","compare_url":"https://api.github.com/repos/Polymer/tattoo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Polymer/tattoo/merges","archive_url":"https://api.github.com/repos/Polymer/tattoo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Polymer/tattoo/downloads","issues_url":"https://api.github.com/repos/Polymer/tattoo/issues{/number}","pulls_url":"https://api.github.com/repos/Polymer/tattoo/pulls{/number}","milestones_url":"https://api.github.com/repos/Polymer/tattoo/milestones{/number}","notifications_url":"https://api.github.com/repos/Polymer/tattoo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Polymer/tattoo/labels{/name}","releases_url":"https://api.github.com/repos/Polymer/tattoo/releases{/id}","deployments_url":"https://api.github.com/repos/Polymer/tattoo/deployments","created_at":"2016-02-16T20:36:18Z","updated_at":"2016-11-15T01:53:00Z","pushed_at":"2016-11-18T04:25:24Z","git_url":"git://github.com/Polymer/tattoo.git","ssh_url":"git@github.com:Polymer/tattoo.git","clone_url":"https://github.com/Polymer/tattoo.git","svn_url":"https://github.com/Polymer/tattoo","homepage":null,"size":111,"stargazers_count":6,"watchers_count":6,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":18,"forks":0,"open_issues":18,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Polymer/tattoo/pulls/22"},"html":{"href":"https://github.com/Polymer/tattoo/pull/22"},"issue":{"href":"https://api.github.com/repos/Polymer/tattoo/issues/22"},"comments":{"href":"https://api.github.com/repos/Polymer/tattoo/issues/22/comments"},"review_comments":{"href":"https://api.github.com/repos/Polymer/tattoo/pulls/22/comments"},"review_comment":{"href":"https://api.github.com/repos/Polymer/tattoo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Polymer/tattoo/pulls/22/commits"},"statuses":{"href":"https://api.github.com/repos/Polymer/tattoo/statuses/9a88a6e0804a7b3da121d9f8944060c92af48f80"}}}}
{"actor":{"display_login":"usergenic"}}