├── .nvmrc ├── .travis.yml ├── lib ├── adapter │ ├── response-browser.js │ ├── fetch-browser.js │ ├── response-node.js │ ├── fetch-node.js │ ├── files-browser.js │ └── files-node.js ├── index.d.ts └── index.js ├── test ├── _fixtures │ ├── https%3A__example.com_invalid-because-of-extra.json_GET_3938_body.raw │ ├── https%3A__example.com_invalid-because-of-extra.json_GET_3938_options.json │ ├── https%3A__google.com_404_GET_3938_options.json │ ├── https%3A__cnx.org_GET_3938_options.json │ ├── https%3A__archive.cnx.org_contents_9a1df55a-b167-4736-b5ad-15d996704270%25403.2.json_GET_3938_options.json │ ├── https%3A__api.github.com_search_repositories%3Fq%3Doctokat_GET_3938_options.json │ ├── https%3A__cnx.org_GET_3938_body.raw │ ├── https%3A__google.com_404_GET_3938_body.raw │ ├── https%3A__archive.cnx.org_contents_9a1df55a-b167-4736-b5ad-15d996704270%25403.2.json_GET_3938_body.raw │ └── https%3A__api.github.com_search_repositories%3Fq%3Doctokat_GET_3938_body.raw ├── index.html ├── jsdom-example.html └── index.js ├── script └── clean-for-test ├── .gitignore ├── rollup.config.js ├── package.json └── README.md /.nvmrc: -------------------------------------------------------------------------------- 1 | v10.16.3 -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: false 2 | language: node_js 3 | -------------------------------------------------------------------------------- /lib/adapter/response-browser.js: -------------------------------------------------------------------------------- 1 | require('./fetch-browser') 2 | module.exports = window.Response 3 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__example.com_invalid-because-of-extra.json_GET_3938_body.raw: -------------------------------------------------------------------------------- 1 | {}Xtra stuff 2 | -------------------------------------------------------------------------------- /lib/adapter/fetch-browser.js: -------------------------------------------------------------------------------- 1 | require('whatwg-fetch') 2 | // 'fetch' is now a global 3 | module.exports = window.fetch 4 | -------------------------------------------------------------------------------- /lib/adapter/response-node.js: -------------------------------------------------------------------------------- 1 | // This is so webpack can override this with a browser version 2 | module.exports = require('./fetch-node').Response 3 | -------------------------------------------------------------------------------- /script/clean-for-test: -------------------------------------------------------------------------------- 1 | #! /bin/bash 2 | 3 | [[ ! $(find ./test/_fixtures/ -name 'https%3A__openstax.org*' ) ]] || rm ./test/_fixtures/https%3A__openstax.org* 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | 3 | /test/_fixtures/https%3A__openstax.org_*_GET_*_body.raw 4 | /test/_fixtures/https%3A__openstax.org_*_GET_*_options.json 5 | 6 | /browser-bundle.js 7 | /browser-bundle.js.map 8 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__example.com_invalid-because-of-extra.json_GET_3938_options.json: -------------------------------------------------------------------------------- 1 | { 2 | "status":200, 3 | "statusText":"OK", 4 | "ok":true, 5 | "headers": { 6 | "content-type":["application/json; charset=UTF-8"] 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__google.com_404_GET_3938_options.json: -------------------------------------------------------------------------------- 1 | {"url":"https://google.com/404","status":404,"statusText":"Not Found","ok":false,"headers":{"content-type":["text/html; charset=UTF-8"],"referrer-policy":["no-referrer"],"content-length":["1564"],"date":["Sun, 14 May 2017 13:29:39 GMT"],"alt-svc":["quic=\":443\"; ma=2592000; v=\"37,36,35\""],"connection":["close"]}} -------------------------------------------------------------------------------- /lib/adapter/fetch-node.js: -------------------------------------------------------------------------------- 1 | // This is so webpack can override this with a browser version 2 | let fetchImpl 3 | 4 | // Try to load the hack-node-fetch package because jest allows remapping packages (useful for tests) 5 | try { 6 | fetchImpl = require('hack-node-fetch') 7 | } catch (err) { 8 | fetchImpl = require('node-fetch') 9 | } 10 | 11 | module.exports = fetchImpl 12 | -------------------------------------------------------------------------------- /lib/adapter/files-browser.js: -------------------------------------------------------------------------------- 1 | var fetch = require('./fetch-browser') 2 | 3 | function loadFile(root, filename) { 4 | return fetch(root + '/' + escape(filename)) 5 | .then(function(response) { 6 | return response.text() 7 | }) 8 | } 9 | 10 | function saveFile(root, filename, buffer) { 11 | throw new Error('fetch-vcr: Saving Fixture files is not supported in the browser yet') 12 | } 13 | 14 | module.exports = { 15 | loadFile: loadFile, 16 | saveFile: saveFile 17 | } 18 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | // This is used for building the ./test/browser-bundle.js for testing 2 | import resolve from 'rollup-plugin-node-resolve' 3 | import commonjs from 'rollup-plugin-commonjs' 4 | 5 | export default { 6 | input: './lib/index.js', 7 | plugins: [ 8 | resolve({ 9 | // jsnext: true, 10 | browser: true 11 | }), 12 | commonjs() 13 | ], 14 | output: [ 15 | { 16 | file: './browser-bundle.js', 17 | format: 'umd', 18 | name: 'fetchVCR', 19 | sourcemap: true 20 | } 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /test/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 |

Output from fetchVCR('https://cnx.org')

14 |
15 |
(not fetched yet)
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /test/jsdom-example.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 13 |

Output from fetch('https://cnx.org')

14 |
15 |
(not fetched yet)
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /lib/index.d.ts: -------------------------------------------------------------------------------- 1 | declare module 'fetch-vcr' { 2 | function fetchVCR(url: string, args: object): Promise; 3 | 4 | interface Config { 5 | mode?: 'playback' | 'cache' | 'record' | 'erase'; 6 | fixturePath?: string; 7 | ignoreUrls?: string[]; 8 | headerBlacklist?: string[] 9 | } 10 | namespace fetchVCR { 11 | function configure(config: Config): void; 12 | function loadFile(root: string, filename: string): Promise; 13 | function saveFile(root: string, filename: string, buffer: string): Promise<'fetch-saved'>; 14 | function getCalled(): void; 15 | function clearCalled(): void; 16 | } 17 | export default fetchVCR; 18 | } 19 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__cnx.org_GET_3938_options.json: -------------------------------------------------------------------------------- 1 | {"url":"https://cnx.org/?","status":200,"statusText":"OK","ok":true,"headers":{"server":["nginx"],"date":["Wed, 09 Jan 2019 19:32:54 GMT"],"content-type":["text/html"],"content-length":["740"],"last-modified":["Fri, 07 Dec 2018 21:22:20 GMT"],"vary":["Accept-Encoding"],"etag":["\"5c0ae48c-2e4\""],"content-encoding":["gzip"],"expires":["Wed, 09 Jan 2019 19:32:53 GMT"],"cache-control":["no-cache"],"x-varnish-status":["uncacheable - pass or hit-for-pass"],"x-varnish-backend":["webview"],"x-varnish-ttl":["0.000"],"x-varnish":["18712575"],"age":["0"],"via":["1.1 varnish-v4"],"x-varnish-cache":["MISS"],"accept-ranges":["bytes"],"connection":["close"],"strict-transport-security":["max-age=16000000"]}} 2 | -------------------------------------------------------------------------------- /lib/adapter/files-node.js: -------------------------------------------------------------------------------- 1 | // This is so webpack can override this with a browser version 2 | var fs = require('fs') 3 | var path = require('path') 4 | 5 | function loadFile(root, filename) { 6 | return new Promise(function(resolve, reject) { 7 | fs.readFile(path.join(root, filename), function(err, buffer) { 8 | if (err) { 9 | reject(err) 10 | } else { 11 | resolve(buffer) 12 | } 13 | }) 14 | }) 15 | } 16 | 17 | function saveFile(root, filename, buffer) { 18 | return new Promise(function(resolve, reject) { 19 | fs.writeFile(path.join(root, filename), buffer, function(err) { 20 | if (err) { 21 | reject(err) 22 | } else { 23 | resolve('fetch-saved') 24 | } 25 | }) 26 | }) 27 | } 28 | 29 | module.exports = { 30 | loadFile, 31 | saveFile 32 | } 33 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__archive.cnx.org_contents_9a1df55a-b167-4736-b5ad-15d996704270%25403.2.json_GET_3938_options.json: -------------------------------------------------------------------------------- 1 | {"url":"https://archive.cnx.org/contents/9a1df55a-b167-4736-b5ad-15d996704270%403.2.json","status":200,"statusText":"OK","ok":true,"headers":{"access-control-allow-headers":["origin,dnt,accept-encoding,accept-language,keep-alive,user-agent,x-requested-with,if-modified-since,cache-control,content-type"],"access-control-allow-methods":["GET, OPTIONS"],"access-control-allow-origin":["*"],"content-length":["19228"],"content-type":["application/json; charset=UTF-8"],"date":["Sun, 14 May 2017 18:48:46 GMT"],"server":["waitress"],"x-varnish-action":["FETCH (override - archive contents)"],"x-factor-ttl":["ttl: 604800.000"],"x-varnish":["64831876 65373231"],"via":["1.1 varnish-v4"],"x-cache":["HIT"],"x-varnish-age":["160"],"age":["0"],"accept-ranges":["bytes"],"connection":["close"],"strict-transport-security":["max-age=16000000; includeSubDomains; preload;"]}} -------------------------------------------------------------------------------- /test/_fixtures/https%3A__api.github.com_search_repositories%3Fq%3Doctokat_GET_3938_options.json: -------------------------------------------------------------------------------- 1 | {"url":"https://api.github.com/search/repositories?q=octokat","status":200,"statusText":"OK","ok":true,"headers":{"date":["Sun, 14 May 2017 18:08:35 GMT"],"content-type":["application/json; charset=utf-8"],"transfer-encoding":["chunked"],"connection":["close"],"server":["GitHub.com"],"status":["200 OK"],"x-ratelimit-limit":["10"],"x-ratelimit-remaining":["9"],"x-ratelimit-reset":["1494785375"],"cache-control":["no-cache"],"x-github-media-type":["github.v3; format=json"],"access-control-expose-headers":["ETag, Link, X-GitHub-OTP, X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-OAuth-Scopes, X-Accepted-OAuth-Scopes, X-Poll-Interval"],"access-control-allow-origin":["*"],"content-security-policy":["default-src 'none'"],"strict-transport-security":["max-age=31536000; includeSubdomains; preload"],"x-content-type-options":["nosniff"],"x-frame-options":["deny"],"x-xss-protection":["1; mode=block"],"vary":["Accept-Encoding, Accept-Encoding"],"x-served-by":["52437fedc85beec8da3449496900fb9a"],"content-encoding":["gzip"],"x-github-request-id":["DC3A:2AE86:B3A9E5:E290CE:59189D23"]}} -------------------------------------------------------------------------------- /test/_fixtures/https%3A__cnx.org_GET_3938_body.raw: -------------------------------------------------------------------------------- 1 | OpenStax CNX 2 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3.2.0", 3 | "name": "fetch-vcr", 4 | "description": "Stop mocking HTTP Requests. Just record and then play them back", 5 | "main": "./lib/index.js", 6 | "types": "./lib/index.d.ts", 7 | "scripts": { 8 | "pretest": "./script/clean-for-test", 9 | "test": "ava", 10 | "debug": "DEBUG=true node --inspect --debug-brk ./node_modules/ava/profile.js ./test/index.js", 11 | "build-browser": "rollup --config rollup.config.js" 12 | }, 13 | "dependencies": { 14 | "node-fetch": "^2.0.0", 15 | "whatwg-fetch": "^2.0.3" 16 | }, 17 | "devDependencies": { 18 | "ava": "^2.0.0", 19 | "jsdom": "^14.0.0", 20 | "rollup": "^1.1.1", 21 | "rollup-plugin-commonjs": "^10.0.0", 22 | "rollup-plugin-node-resolve": "^5.0.0", 23 | "standard": "^14.3.0" 24 | }, 25 | "directories": { 26 | "test": "test" 27 | }, 28 | "repository": { 29 | "type": "git", 30 | "url": "git+https://github.com/philschatz/fetch-vcr.git" 31 | }, 32 | "keywords": [ 33 | "fetch", 34 | "fixture", 35 | "cassette", 36 | "vcr" 37 | ], 38 | "browser": { 39 | "./lib/adapter/fetch-node.js": "./lib/adapter/fetch-browser.js", 40 | "./lib/adapter/files-node.js": "./lib/adapter/files-browser.js", 41 | "./lib/adapter/response-node.js": "./lib/adapter/response-browser.js" 42 | }, 43 | "author": "Philip Schatz", 44 | "license": "MIT", 45 | "bugs": { 46 | "url": "https://github.com/philschatz/fetch-vcr/issues" 47 | }, 48 | "homepage": "https://github.com/philschatz/fetch-vcr#readme" 49 | } 50 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__google.com_404_GET_3938_body.raw: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Error 404 (Not Found)!!1 6 | 9 | 10 |

404. That’s an error. 11 |

The requested URL /404 was not found on this server. That’s all we know. 12 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | import test from 'ava' 2 | import nodefetch from 'node-fetch' 3 | import assert from 'assert' 4 | import fetchVCR from '../lib/index' 5 | 6 | function createLongParams (num) { 7 | return 'abcdefghijklmnopqrstuvwxyz'.split('').map(letter => `${letter}=${num}`).join('&') 8 | } 9 | 10 | test.before(t => { 11 | fetchVCR.configure({ 12 | mode: 'playback', 13 | fixturePath: __dirname + '/_fixtures', 14 | ignoreUrls: [/.+ignore=true($|.+)/i] 15 | }) 16 | }) 17 | 18 | test('ignores urls in ignoreUrls', t => { 19 | return fetchVCR('https://test.com?ignore=true') 20 | .then(response => { 21 | return response.text() 22 | .then(text => t.pass()) 23 | }) 24 | }) 25 | 26 | test('fetches from the fixture', t => { 27 | // fetchVCR.configure({mode: 'record'}) 28 | return fetchVCR('https://cnx.org?') // the `?` is to make sure the fixture filename is escaped properly 29 | .then(response => { 30 | return response.text() 31 | .then(text => t.pass()) 32 | }) 33 | }) 34 | 35 | test('caches a 404 page', t => { 36 | // fetchVCR.configure({mode: 'record'}) 37 | return fetchVCR('https://google.com/404') 38 | .then(response => { 39 | return response.text() 40 | .then(text => t.pass()) 41 | }) 42 | }) 43 | 44 | test('saves JSON properly', t => { 45 | // fetchVCR.configure({mode: 'record'}) 46 | // return fetchVCR('https://api.github.com/search/repositories?q=octokat') 47 | return fetchVCR('https://archive.cnx.org/contents/9a1df55a-b167-4736-b5ad-15d996704270%403.2.json') 48 | .then(response => { 49 | return response.json() 50 | .then(text => t.pass()) 51 | }) 52 | }) 53 | 54 | test('can recover from invalid JSON', t => { 55 | return fetchVCR('https://example.com/invalid-because-of-extra.json') 56 | .then(response => { 57 | return response.json() 58 | .then(text => t.pass()) 59 | }) 60 | }) 61 | 62 | test('caches fixture with long name', async t => { 63 | const TEST_URL = `https://openstax.org?${createLongParams(1)}&${createLongParams(2)}` 64 | // Verify that the fixture does not yet exist 65 | fetchVCR.configure({mode: 'playback'}) 66 | try { 67 | await fetchVCR(TEST_URL) 68 | t.fail(`This URL Should not initially be in the fixtures directory ${TEST_URL}`) 69 | } catch (e) { 70 | assert(e) 71 | } 72 | // Save the response into the fixtures directory 73 | fetchVCR.configure({mode: 'cache'}) 74 | const origResp = await fetchVCR(TEST_URL) 75 | const originalText = await origResp.text() 76 | 77 | // Verify that it was saved into the fixtures directory 78 | fetchVCR.configure({mode: 'playback'}) 79 | const newResp = await fetchVCR(TEST_URL) 80 | const newText = await newResp.text() 81 | 82 | assert.equal(originalText, newText) 83 | t.pass() 84 | }) 85 | 86 | test.cb('runs in jsdom', t => { 87 | const fs = require('fs') 88 | const jsdom = require('jsdom') 89 | const JSDOM = jsdom.JSDOM 90 | 91 | const virtualConsole = new jsdom.VirtualConsole() 92 | virtualConsole.on('debug', () => { 93 | t.end() 94 | }) 95 | 96 | const dom = new JSDOM(fs.readFileSync(__dirname + '/jsdom-example.html'), { 97 | virtualConsole: virtualConsole, 98 | runScripts: 'dangerously', 99 | beforeParse: (window) => { 100 | window.fetch = fetchVCR 101 | } 102 | }) 103 | }) 104 | 105 | test('can use node-fetch.Request', t => { 106 | return fetchVCR(new nodefetch.Request('https://archive.cnx.org/contents/9a1df55a-b167-4736-b5ad-15d996704270%403.2.json')) 107 | .then(response => { 108 | return response.json() 109 | .then(text => t.pass()) 110 | }) 111 | }) 112 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # fetch-vcr 2 | 3 | [![gh-board][kanban-image]][kanban-url] 4 | [![NPM version][npm-image]][npm-url] 5 | [![Downloads][downloads-image]][downloads-url] 6 | [![build status][travis-image]][travis-url] 7 | [![dependency status][dependency-image]][dependency-url] 8 | [![dev dependency status][dev-dependency-image]][dev-dependency-url] 9 | 10 | Stop mocking HTTP Requests. Just record and then play them back. See [vcr/vcr](https://github.com/vcr/vcr) for the main idea. 11 | 12 | # Usage 13 | 14 | After setting up (see below), the basics are: 15 | 16 | 1. set the `VCR_MODE=cache` environment variable before running your tests 17 | 2. run your tests 18 | 19 | This will record (and load) all the HTTP responses into the `./_fixtures/` directory. 20 | 21 | And when you run the steps again, viola! no network traffic happens. 22 | 23 | 24 | # What are the different modes? 25 | 26 | - `playback`: (default) **only** uses the local fixture files 27 | - `cache`: tries to use the recorded response and if not found then it is fetched and then saved (useful when adding new tests) 28 | - `record`: forces HTTP requests and responses are saved to the filesystem (useful for regenerating all the fixtures) 29 | 30 | 31 | # How can I set the VCR mode? 32 | 33 | You can set the mode either by: 34 | 35 | - setting the `VCR_MODE=record` environment variable when running tests (NodeJS) 36 | - explicitly running `fetch.configure({mode: 'record'})` (NodeJS or browser) 37 | 38 | 39 | # How do I set this up? 40 | 41 | There are separate examples for NodeJS, Jest, and in a browser (PhantomJS or Selenium) 42 | 43 | ## NodeJS Setup 44 | 45 | Here is how you would use it in a typical NodeJS app: 46 | 47 | ```js 48 | // import fetch from 'fetch'; 49 | import fetch from 'fetch-vcr'; 50 | 51 | // Configure where the recordings should be loaded/saved to. 52 | // The path is relative to `process.cwd()` but can be absolute. 53 | fetch.configure({ 54 | fixturePath: './_fixtures', 55 | // mode: 'record' <-- This is optional 56 | }) 57 | 58 | // Use fetch like you would normally 59 | fetch('http://openstax.org') 60 | .then(response => { 61 | console.log(response.ok) 62 | }) 63 | ``` 64 | 65 | ## How do I ignore calls? 66 | 67 | Here is how you would configure it to ignore certain request: 68 | 69 | ```js 70 | // import fetch from 'fetch'; 71 | import fetch from 'fetch-vcr'; 72 | 73 | // Configure where the recordings should be loaded/saved to. 74 | // The path is relative to `process.cwd()` but can be absolute. 75 | fetch.configure({ 76 | fixturePath: './_fixtures', 77 | ignoreUrls: [/.+weedmaps\.com.+/] // <-- This is an array of Regular Expressions 78 | // mode: 'record' <-- This is optional 79 | }) 80 | 81 | fetch('https://weedmaps.com/sitemap') // <-- This will be ignored from vcr 82 | .then(response => { 83 | console.log(response) 84 | }) 85 | ``` 86 | 87 | ## How can I tell if the response was from the cache? 88 | 89 | You can check `response.wasCached`. It will be `true` if the response was loaded from the cache. 90 | 91 | ```js 92 | import fetch from 'fetch-vcr'; 93 | 94 | fetch('https://philschatz.com').then(response => { 95 | if (!response.wasCached) { 96 | sleep(1000) // wait before making another request 97 | } 98 | }) 99 | ``` 100 | 101 | ## Jest Setup 102 | 103 | Just add the following to `package.json`: 104 | 105 | ``` 106 | "jest": { 107 | "moduleNameMapper": { 108 | "hack-node-fetch": "node-fetch", 109 | "node-fetch": "fetch-vcr" 110 | } 111 | } 112 | ``` 113 | 114 | If you want to check which calls were made, you can use the following: 115 | 116 | ```js 117 | // Returns an array of {url, args, hash, bodyFilename, response, optionsFilename} 118 | const allCalls = fetchVCR.getCalled() 119 | 120 | // Clears the array of calls made 121 | fetchVCR.clearCalled() 122 | ``` 123 | 124 | ## jsdom Setup 125 | 126 | Many apps use `jsdom` for testing which makes it really easy to add `fetch-vcr`. Just replace the global `fetch` function with `fetchVCR` and you can record/play back the cassettes. See below for an example: 127 | 128 | ```js 129 | var fs = require('fs') 130 | var jsdom = require('jsdom') 131 | var fetchVCR = require('fetch-vcr') 132 | 133 | // Configure the path to find cassettes 134 | fetchVCR.configure({ 135 | fixturePath: './_fixtures/' 136 | }) 137 | 138 | var dom = new jsdom.JSDOM(fs.readFileSync('./jsdom-example.html'), { 139 | runScripts: 'dangerously', 140 | beforeParse: (window) => { 141 | // This changes the fetch global to be fetchVCR 142 | window.fetch = fetchVCR 143 | } 144 | }) 145 | ``` 146 | 147 | 148 | ## How can I use this in a browser? 149 | 150 | It is easy to record HTTP requests in NodeJS and play them back in the browser. 151 | 152 | To play them back in a browser, just run `fetchVCR.configure({fixturePath: './path/to/_fixtures'})` and `fetchVCR` will use that path to load the files via AJAX requests. 153 | 154 | To record HTTP requests in a browser you will need to do a little bit of work. Loading fixture files is relatively painless (using `XMLHTTPRequest`) but saving them to disk is non-trivial. 155 | 156 | In order to save the fixture files to disk you will need to override `fetchVCR.saveFile(rootPath, filename, contents) => Promise`. 157 | 158 | If you are using PhantomJS you will likely need to use the `alert(msg)` to get data out of PhantomJS and then save it to the filesystem (using `fs.writeFile(...)`) 159 | 160 | 161 | 162 | [kanban-image]: https://img.shields.io/github/issues/philschatz/fetch-vcr.svg?label=kanban%20board%20%28gh-board%29 163 | [kanban-url]: http://philschatz.com/gh-board/#/r/philschatz:fetch-vcr 164 | [npm-image]: https://img.shields.io/npm/v/fetch-vcr.svg 165 | [npm-url]: https://npmjs.org/package/fetch-vcr 166 | [downloads-image]: http://img.shields.io/npm/dm/fetch-vcr.svg 167 | [downloads-url]: https://npmjs.org/package/fetch-vcr 168 | [travis-image]: https://img.shields.io/travis/philschatz/fetch-vcr.svg 169 | [travis-url]: https://travis-ci.org/philschatz/fetch-vcr 170 | [dependency-image]: https://img.shields.io/david/philschatz/fetch-vcr.svg 171 | [dependency-url]: https://david-dm.org/philschatz/fetch-vcr 172 | [dev-dependency-image]: https://img.shields.io/david/dev/philschatz/fetch-vcr.svg 173 | [dev-dependency-url]: https://david-dm.org/philschatz/fetch-vcr#info=devDependencies 174 | [coverage-image]: https://img.shields.io/codecov/c/github/philschatz/fetch-vcr.svg 175 | [coverage-url]: https://codecov.io/gh/philschatz/fetch-vcr 176 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | var fetchImpl = require('./adapter/fetch-node') 2 | var Response = require('./adapter/response-node') 3 | 4 | var _require = require('./adapter/files-node') 5 | var loadFile = _require.loadFile 6 | var saveFile = _require.saveFile 7 | 8 | var VCR_MODE = typeof process !== 'undefined' ? process.env['VCR_MODE'] : null 9 | var DEBUG = typeof process !== 'undefined' ? process.env['DEBUG'] : false 10 | 11 | // Valid modes: 12 | // - 'playback': ONLY uses the fixture files (default) 13 | // - 'cache': tries to use the fixture and if not found then fetched and saves 14 | // - 'record': forces files to be written 15 | // - 'erase': deletes the fixture corresponding to the request 16 | 17 | 18 | // mode: 'playback' or 'cache' or 'record' 19 | // fixturePath: './_fixtures/' 20 | var CONFIGURATION = { 21 | mode: VCR_MODE, 22 | fixturePath: './_fixtures', 23 | headerBlacklist: ['authorization', 'user-agent'], // These need to be lowercase 24 | ignoreUrls: [] // regex of urls to ignore 25 | } 26 | 27 | function debug(url, message) { 28 | if (DEBUG) { 29 | console.log(url, message) 30 | } 31 | } 32 | 33 | // Use the correct constructor if there is a body. 34 | // In a browser it needs to be the single-arg constructor. 35 | function newResponse(bodyBuffer, opts) { 36 | if (bodyBuffer || typeof window === 'undefined') { 37 | return new Response(bodyBuffer, opts) 38 | } else { 39 | return new Response(null, opts) 40 | } 41 | } 42 | 43 | function hashCode(str) { 44 | var hash = 0, 45 | i, 46 | chr 47 | if (str.length === 0) return hash 48 | for (i = 0; i < str.length; i++) { 49 | chr = str.charCodeAt(i) 50 | hash = (hash << 5) - hash + chr 51 | hash |= 0 // Convert to 32bit integer 52 | } 53 | return hash 54 | } 55 | 56 | function parseHeader(headers) { 57 | if (headers.raw) return headers.raw(); 58 | var raw = {}; 59 | var itr = headers.entries() 60 | var next = itr.next(); 61 | while (!next.done) { 62 | raw[next.value[0]] = next.value[1]; 63 | next = itr.next(); 64 | } 65 | return raw; 66 | } 67 | 68 | function buildHash(url, args) { 69 | var json = {} 70 | if (args) { 71 | json.method = args.method 72 | json.redirect = args.redirect 73 | json.body = args.body // Include POST body in the hash 74 | 75 | // Filter out all the headers in the headerBlacklist 76 | if (args.headers) { 77 | json.headers = {} 78 | var headerKeys = Object.keys(args.headers) 79 | for (var index in headerKeys) { 80 | var key = headerKeys[index] 81 | if (CONFIGURATION.headerBlacklist.indexOf(key.toLowerCase()) < 0) { 82 | json.headers[key] = args.headers[key] 83 | } 84 | } 85 | } 86 | } 87 | // const hash = crypto.createHash('sha256') 88 | // hash.update(JSON.stringify(json)) 89 | // return hash.digest('hex') 90 | return hashCode(JSON.stringify(json)) 91 | } 92 | 93 | function buildFilenamePrefix(url, args, hash) { 94 | args = args || { } 95 | var [baseUrl, query] = url.split('?') 96 | url = escape(baseUrl).replace(/\//g, '_') 97 | var method = args.method || 'GET' 98 | method = method.toUpperCase() 99 | var paramsHash = query ? '_' + hashCode(query) : '' 100 | return url + paramsHash + '_' + method + '_' + hash 101 | } 102 | 103 | function buildOptionsFilename(url, args, hash) { 104 | return buildFilenamePrefix(url, args, hash) + '_options.json' 105 | } 106 | 107 | function buildBodyFilename(url, args, hash) { 108 | return buildFilenamePrefix(url, args, hash) + '_body.raw' 109 | } 110 | 111 | function loadFixture(url, args) { 112 | var hash = buildHash(url, args) 113 | var bodyFilename = buildBodyFilename(url, args, hash) 114 | var optionsFilename = buildOptionsFilename(url, args, hash) 115 | var root = CONFIGURATION.fixturePath 116 | 117 | return Promise.all([fetchVCR.loadFile(root, optionsFilename), fetchVCR.loadFile(root, bodyFilename)]).then(function (resolvedValues) { 118 | var optionsBuffer = resolvedValues[0] 119 | var bodyBuffer = resolvedValues[1] 120 | 121 | var opts = JSON.parse(optionsBuffer.toString()) 122 | if (opts.headers && opts.headers['content-type'] && opts.headers['content-type'][0] && /^application\/json/.test(opts.headers['content-type'][0])) { 123 | // Check that the JSON is parseable 124 | // There is an odd thing that happens for api.github.com/search/repositories?q=github 125 | // Extra text is at the end of the JSON when it is saved to the fixture. 126 | // TODO: remove this hack by fixing it in fetch-vcr 127 | try { 128 | bodyBuffer = bodyBuffer.toString() 129 | JSON.parse(bodyBuffer) 130 | } catch (e) { 131 | // JSON occasionally has extra stuff at the end. not sure why 132 | // Sample message: "Unexpected number in JSON at position 146432" 133 | var tokens = e.message.split(' ') 134 | var num = parseInt(tokens[tokens.length - 1]) 135 | console.log('---------------------------------') 136 | console.log('BUG: could not parse json. Using HACK') 137 | console.log(url + ' ' + (args && args.method || 'GET')) 138 | console.log('Message: "' + e.message + '"') 139 | console.log('Parse character:', num) 140 | console.log('---------------------------------') 141 | bodyBuffer = bodyBuffer.substring(0, num) 142 | } 143 | } 144 | 145 | // Use the correct constructor if there is a body 146 | const clone = newResponse(bodyBuffer, opts) 147 | clone.wasCached = true 148 | return clone 149 | }) 150 | } 151 | 152 | function saveFixture(url, args, response) { 153 | var hash = buildHash(url, args) 154 | var bodyFilename = buildBodyFilename(url, args, hash) 155 | var optionsFilename = buildOptionsFilename(url, args, hash) 156 | // const requestFilename = buildOptionsFilename(url, args, hash) + '_request.log' 157 | var root = CONFIGURATION.fixturePath 158 | 159 | // Convert the response body to a Buffer for saving 160 | debug(url, 'getting buffer to save') 161 | // DO NOT .clone() this response because response.clone() does not work well. See https://github.com/bitinn/node-fetch/issues/151 162 | return response.text().then(function (bodyBuffer) { 163 | // Write the Response contents and the Response options 164 | var json = { 165 | url: response.url, 166 | status: response.status, 167 | statusText: response.statusText, 168 | ok: response.ok, 169 | headers: parseHeader(response.headers), 170 | } 171 | 172 | var optionsRaw = JSON.stringify(json) 173 | 174 | return Promise.all([fetchVCR.saveFile(root, bodyFilename, bodyBuffer), fetchVCR.saveFile(root, optionsFilename, optionsRaw) /*, fetchVCR.saveFile(root, requestFilename, JSON.stringify(args || {})) */]).then(function () { 175 | // send a new buffer because response.clone() does not work well. See https://github.com/bitinn/node-fetch/issues/151 176 | // Use the correct constructor if there is a body 177 | return newResponse(bodyBuffer, json) 178 | }) 179 | }) 180 | } 181 | 182 | function ignoredUrl(url) { 183 | return CONFIGURATION.ignoreUrls.some(function (urlToIgnore) { 184 | return url.match(urlToIgnore) 185 | }) 186 | } 187 | 188 | // Log each call that was made so tests can verify 189 | var allCalled = [] 190 | 191 | function fetchVCR(urlOrReq, args) { 192 | let url = urlOrReq 193 | if (typeof url !== 'string') { 194 | url = url.url 195 | } 196 | 197 | // Try to load the response from the fixture. 198 | // Then, if a fixture was not found, either fetch it for reals or error (depending on the VCR_MODE) 199 | const promise = new Promise(function (resolve, reject) { 200 | if (ignoredUrl(url)) { 201 | debug(url, 'this url is ignored by configuration') 202 | fetchImpl(url, args).then(resolve).catch(reject) 203 | } else if (CONFIGURATION.mode === 'record') { 204 | // Perform the fetch, save the response, and then yield the original response 205 | fetchImpl(url, args).then(function (response) { 206 | saveFixture(url, args, response).then(resolve).catch(reject) 207 | }).catch(reject) 208 | } else { 209 | debug(url, 'checking for cached version') 210 | // Check if cached version exists 211 | loadFixture(url, args).then(resolve).catch(function (err) { 212 | // Cached version does not exist 213 | debug(url, 'cached version not found because', err.message) 214 | if (CONFIGURATION.mode === 'cache') { 215 | debug(url, 'making network request') 216 | // Perform the fetch, save the response, and then yield the original response 217 | fetchImpl(url, args).then(function (response) { 218 | debug(url, 'saving network request') 219 | saveFixture(url, args, response).then(function (val) { 220 | debug(url, 'done saving') 221 | resolve(val) 222 | }).catch(reject) 223 | }).catch(reject) 224 | } else { 225 | debug(url, 'NOT making network request because VCR_MODE=' + CONFIGURATION.mode) 226 | // throw new Error('fetch-vcr ERROR: Fixture file was not found.') 227 | reject(err) // TODO: Provide a more detailed message 228 | } 229 | }) 230 | } 231 | }) 232 | return promise.then(function (resp) { 233 | // Record that the request succeeded 234 | var hash = buildHash(url, args) 235 | var bodyFilename = buildBodyFilename(url, args, hash) 236 | var optionsFilename = buildOptionsFilename(url, args, hash) 237 | 238 | allCalled.push({ 239 | url: url, 240 | args: args, 241 | response: resp, 242 | hash: hash, 243 | bodyFilename: bodyFilename, 244 | optionsFilename: optionsFilename 245 | }) 246 | return resp 247 | }) 248 | } 249 | 250 | fetchVCR.configure = function (config) { 251 | CONFIGURATION.mode = VCR_MODE || config.mode 252 | CONFIGURATION.fixturePath = config.fixturePath || CONFIGURATION.fixturePath 253 | CONFIGURATION.ignoreUrls = config.ignoreUrls || CONFIGURATION.ignoreUrls 254 | if (config.headerBlacklist) { 255 | CONFIGURATION.headerBlacklist = [] 256 | config.headerBlacklist.forEach(function (key) { 257 | CONFIGURATION.headerBlacklist.push(key.toLowerCase()) 258 | }) 259 | } 260 | } 261 | 262 | function getCalled() { 263 | return allCalled 264 | } 265 | 266 | function clearCalled() { 267 | allCalled = [] 268 | } 269 | 270 | fetchVCR.loadFile = loadFile 271 | fetchVCR.saveFile = saveFile 272 | fetchVCR.getCalled = getCalled 273 | fetchVCR.clearCalled = clearCalled 274 | 275 | module.exports = fetchVCR 276 | -------------------------------------------------------------------------------- /test/_fixtures/https%3A__archive.cnx.org_contents_9a1df55a-b167-4736-b5ad-15d996704270%25403.2.json_GET_3938_body.raw: -------------------------------------------------------------------------------- 1 | {"googleAnalytics": "UA-30227798-18", "version": "3.2", "submitlog": "added preface", "abstract": "

", "revised": "2016-02-05T19:10:39Z", "printStyle": "ccap-calculus", "roles": null, "keywords": [], "id": "9a1df55a-b167-4736-b5ad-15d996704270", "title": "Calculus", "mediaType": "application/vnd.org.cnx.collection", "subjects": ["Mathematics and Statistics"], "legacy_id": "col11963", "parentId": null, "resources": [], "publishers": [{"surname": "OpenStax College", "suffix": "", "firstname": "", "title": "", "fullname": "OpenStax", "id": "OpenStaxCollege"}, {"surname": "Calculus", "suffix": "", "firstname": "OpenStax", "title": "", "fullname": "OpenStax Calculus", "id": "cnxcalc"}], "parent": {"authors": [], "shortId": null, "version": "", "id": null, "title": null}, "stateid": 1, "parentTitle": null, "shortId": "mh31WrFn", "authors": [{"surname": "OpenStax College", "suffix": "", "firstname": "", "title": "", "fullname": "OpenStax", "id": "OpenStaxCollege"}], "parentVersion": "", "legacy_version": "1.3", "licensors": [{"surname": "University", "suffix": "", "firstname": "Rice", "title": "", "fullname": "Rice University", "id": "OSCRiceUniversity"}], "language": "en", "license": {"url": "http://creativecommons.org/licenses/by-nc-sa/4.0/", "code": "by-nc-sa", "version": "4.0", "name": "Creative Commons Attribution-NonCommercial-ShareAlike License"}, "created": "2015-04-06T14:35:10Z", "tree": {"shortId": "mh31WrFn@3.2", "id": "9a1df55a-b167-4736-b5ad-15d996704270@3.2", "contents": [{"shortId": "_qmdFJwf@2", "id": "fea99d14-9c1f-46b3-a571-554afae6998f@2", "title": "Preface"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "H2TLb2-S@2", "id": "1f64cb6f-6f92-4ee8-a4e7-9c20c6eed1e7@2", "title": "Introduction"}, {"shortId": "fP4FUrwS@2", "id": "7cfe0552-bc12-452e-9c56-418ec508a280@2", "title": "Review of Functions"}, {"shortId": "056cQH8B@2", "id": "d39e9c40-7f01-4254-aaa8-8da23ce7621b@2", "title": "Basic Classes of Functions"}, {"shortId": "blZd_oDf@2", "id": "6e565dfe-80df-4361-96f3-4eb5aa11e52d@2", "title": "Trigonometric Functions"}, {"shortId": "Ib8OK9lb@2", "id": "21bf0e2b-d95b-4e26-b9b9-fb7179ceaed1@2", "title": "Inverse Functions"}, {"shortId": "TjgBKRr3@3", "id": "4e380129-1af7-4fd5-a8e8-2893f56fb2de@3", "title": "Exponential and Logarithmic Functions"}], "title": "Functions and Graphs"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "frtNG5jl@2", "id": "7ebb4d1b-98e5-4f5f-a950-b097168c8130@2", "title": "Introduction"}, {"shortId": "yvP8EaX1@2", "id": "caf3fc11-a5f5-49c6-b3c3-31d84cb93751@2", "title": "A Preview of Calculus"}, {"shortId": "dKCfyV9u@2", "id": "74a09fc9-5f6e-4f6d-a6da-b13c909ad307@2", "title": "The Limit of a Function"}, {"shortId": "-xC--8XH@2", "id": "fb10befb-c5c7-46f4-b066-10f3f7131b52@2", "title": "The Limit Laws"}, {"shortId": "eJ08AsuX@2", "id": "789d3c02-cb97-4f5f-9193-489f0a0cf050@2", "title": "Continuity"}, {"shortId": "jSsxLwzE@2", "id": "8d2b312f-0cc4-4c97-adbc-edb41bf05137@2", "title": "The Precise Definition of a Limit"}], "title": "Limits"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "tW8_YvJt@2", "id": "b56f3f62-f26d-4a04-a9fd-dd9bb6e23fda@2", "title": "Introduction"}, {"shortId": "h08mP8gb@2", "id": "874f263f-c81b-42ff-9d4f-0fc8db63974c@2", "title": "Defining the Derivative"}, {"shortId": "Jy0aWV6Z@2", "id": "272d1a59-5e99-4a80-90e1-ccf60fb3cc1c@2", "title": "The Derivative as a Function"}, {"shortId": "8aJUEzry@2", "id": "f1a25413-3af2-4f97-8aac-dd75a16c8aea@2", "title": "Differentiation Rules"}, {"shortId": "YQrOMCcP@2", "id": "610ace30-270f-4dfc-8fad-5e44c4723919@2", "title": "Derivatives as Rates of Change"}, {"shortId": "FH3fJfnQ@2", "id": "147ddf25-f9d0-479f-be13-eab353ffee90@2", "title": "Derivatives of Trigonometric Functions"}, {"shortId": "7Ge5cmgd@2", "id": "ec67b972-681d-403b-b456-82729dae0b91@2", "title": "The Chain Rule"}, {"shortId": "r7AskvUC@2", "id": "afb02c92-f502-4a0f-91cf-793930632bd6@2", "title": "Derivatives of Inverse Functions"}, {"shortId": "GfywCWZ3@2", "id": "19fcb009-6677-4691-bf1a-a8d40e32bf11@2", "title": "Implicit Differentiation"}, {"shortId": "QP7ySueQ@2", "id": "40fef24a-e790-49bf-9c6a-edc93696b724@2", "title": "Derivatives of Exponential and Logarithmic Functions"}], "title": "Derivatives"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "dwmwzwA6@2", "id": "7709b0cf-003a-479c-bd44-521eadfff68a@2", "title": "Introduction"}, {"shortId": "74vQD30u@2", "id": "ef8bd00f-7d2e-47a5-a840-2be08285798a@2", "title": "Related Rates"}, {"shortId": "27GhyJ6w@2", "id": "dbb1a1c8-9eb0-482b-9ded-66588adef938@2", "title": "Linear Approximations and Differentials"}, {"shortId": "84SZANHN@2", "id": "f3849900-d1cd-44c9-96ae-f30447c4cd35@2", "title": "Maxima and Minima"}, {"shortId": "Qx991MO0@2", "id": "431f7dd4-c3b4-46e3-aa21-dead3e83a5f4@2", "title": "The Mean Value Theorem"}, {"shortId": "zjNlU1zg@2", "id": "ce336553-5ce0-4a5d-afcb-21187fc5b29b@2", "title": "Derivatives and the Shape of a Graph"}, {"shortId": "MZp9AnQy@2", "id": "319a7d02-7432-42d8-aec3-7274b5591ceb@2", "title": "Limits at Infinity and Asymptotes"}, {"shortId": "svyieFe9@2", "id": "b2fca278-57bd-421d-aa85-21f539b4cc6f@2", "title": "Applied Optimization Problems"}, {"shortId": "u24zPEAt@2", "id": "bb6e333c-402d-4401-b750-4faac36169ff@2", "title": "L\u2019H\u00f4pital\u2019s Rule"}, {"shortId": "wORsTT1c@2", "id": "c0e46c4d-3d5c-400e-a3b9-af3cb3e066e2@2", "title": "Newton\u2019s Method"}, {"shortId": "MV_TDpBh@2", "id": "315fd30e-9061-44bc-8c4f-2db55d620f25@2", "title": "Antiderivatives"}], "title": "Applications of Derivatives"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "rrzms6rP@2", "id": "aebce6b3-aacf-45ce-86d3-44925fc0a4e6@2", "title": "Introduction"}, {"shortId": "MM9PEdsz@2", "id": "30cf4f11-db33-41bf-aa24-3dd0650b7d0b@2", "title": "Approximating Areas"}, {"shortId": "4_81Z6lJ@2", "id": "e3ff3567-a949-4c81-a266-c5dc47b654ad@2", "title": "The Definite Integral"}, {"shortId": "rn4DsBBU@2", "id": "ae7e03b0-1054-4c54-8211-a6411bd440ff@2", "title": "The Fundamental Theorem of Calculus"}, {"shortId": "cc3le9YP@2", "id": "71cde57b-d60f-4143-ba88-a7a1fde3dae2@2", "title": "Integration Formulas and the Net Change Theorem"}, {"shortId": "wxH1chTc@2", "id": "c311f572-14dc-47ed-89b1-3997a0c80e4c@2", "title": "Substitution"}, {"shortId": "sFtDIgDT@2", "id": "b05b4322-00d3-48e5-b476-66ceaa747220@2", "title": "Integrals Involving Exponential and Logarithmic Functions"}, {"shortId": "EA1LiVD9@2", "id": "100d4b89-50fd-47f5-b530-99221cb6a5bd@2", "title": "Integrals Resulting in Inverse Trigonometric Functions"}], "title": "Integration"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "DpsoyvCA@2", "id": "0e9b28ca-f080-4d11-add1-28820fd7b281@2", "title": "Introduction"}, {"shortId": "DSFrV7ZX@2", "id": "0d216b57-b657-418d-87a4-3f5474dc1750@2", "title": "Areas between Curves"}, {"shortId": "BTv9JcEw@2", "id": "053bfd25-c130-4dcb-9b51-41790a4db886@2", "title": "Determining Volumes by Slicing"}, {"shortId": "_Ni7SZ-c@2", "id": "fcd8bb49-9f9c-41ea-89e8-72eb34aed9fb@2", "title": "Volumes of Revolution: Cylindrical Shells"}, {"shortId": "jlfVPkAl@2", "id": "8e57d53e-4025-4fcf-af30-0aa16381df10@2", "title": "Arc Length of a Curve and Surface Area"}, {"shortId": "ATg99BkN@2", "id": "01383df4-190d-426f-906e-060c203b744d@2", "title": "Physical Applications"}, {"shortId": "jytPbuhR@2", "id": "8f2b4f6e-e851-4e59-a2c6-9f2bb0c7887b@2", "title": "Moments and Centers of Mass"}, {"shortId": "AQ5Zr1Zu@2", "id": "010e59af-566e-430f-809f-a99ce444bac2@2", "title": "Integrals, Exponential Functions, and Logarithms"}, {"shortId": "Do8idwFX@2", "id": "0e8f2277-0157-429c-b3bf-f74d6487e4b8@2", "title": "Exponential Growth and Decay"}, {"shortId": "pjggLGo8@2", "id": "a638202c-6a3c-4dc8-a598-4aab3650ac84@2", "title": "Calculus of the Hyperbolic Functions"}], "title": "Applications of Integrations"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "Z4WWhBaa@2", "id": "67859684-169a-48a4-9719-5fb7d0c4b2e6@2", "title": "Introduction"}, {"shortId": "CA8UOFwn@2", "id": "080f1438-5c27-4d04-93ef-719f643e2833@2", "title": "Integration by Parts"}, {"shortId": "VEzrDj74@2", "id": "544ceb0e-3ef8-4219-a8e1-c3b03a51c0f3@2", "title": "Trigonometric Integrals"}, {"shortId": "I0uTbDGK@2", "id": "234b936c-318a-4150-95a1-7adb73b02a33@2", "title": "Trigonometric Substitution"}, {"shortId": "1p_n7baf@2", "id": "d69fe7ed-b69f-4b28-873a-7b918383bb6f@2", "title": "Partial Fractions"}, {"shortId": "zQw7xqa4@2", "id": "cd0c3bc6-a6b8-40ab-8cee-1896100a182b@2", "title": "Other Strategies for Integration"}, {"shortId": "SR_y7CV5@2", "id": "491ff2ec-2579-4747-8e0a-d79410082b11@2", "title": "Numerical Integration"}, {"shortId": "lt4GTN2N@2", "id": "96de064c-dd8d-466b-b416-d6939c577e55@2", "title": "Improper Integrals"}], "title": "Techniques of Integration"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "KzA8da4p@2", "id": "2b303c75-ae29-46fc-87c1-60627869475a@2", "title": "Introduction"}, {"shortId": "97_h7KFf@2", "id": "f7bfe1ec-a15f-4ca3-8d11-a4461e713ec7@2", "title": "Basics of Differential Equations"}, {"shortId": "ofH2WYqc@2", "id": "a1f1f659-8a9c-4c87-94b7-2823d4481b76@2", "title": "Direction Fields and Numerical Methods"}, {"shortId": "oyRafWiv@2", "id": "a3245a7d-68af-42dd-8fbd-f41aca409ccf@2", "title": "Separable Equations"}, {"shortId": "eM_wpK_V@2", "id": "78cff0a4-afd5-4614-b4a7-0cb0b73d056f@2", "title": "The Logistic Equation"}, {"shortId": "E6SdVwi0@2", "id": "13a49d57-08b4-4ca7-9ce6-7f1bdd4e72ab@2", "title": "First-order Linear Equations"}], "title": "Introduction to Differential Equations"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "7JGyeadv@2", "id": "ec91b279-a76f-4b7a-a138-dac8e9581ca9@2", "title": "Introduction"}, {"shortId": "6V8AnfOp@2", "id": "e95f009d-f3a9-44c8-a33c-adfec991897f@2", "title": "Sequences"}, {"shortId": "PiA7j9Tt@2", "id": "3e203b8f-d4ed-451c-b3cd-4d23565e2c80@2", "title": "Infinite Series"}, {"shortId": "Gs_IHQs_@2", "id": "1acfc81d-0b3f-4bd6-a97b-907e364f652a@2", "title": "The Divergence and Integral Tests"}, {"shortId": "UTfEC8XG@2", "id": "5137c40b-c5c6-4a17-8069-a12684d832d6@2", "title": "Comparison Tests"}, {"shortId": "5zIH2AKL@2", "id": "e73207d8-028b-4dca-a50d-5a174f6a38b1@2", "title": "Alternating Series"}, {"shortId": "dPANlua7@2", "id": "74f00d96-e6bb-49bc-aa83-26387d4e376d@2", "title": "Ratio and Root Tests"}], "title": "Sequences and Series"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "-jttGdk-@2", "id": "fa3b6d19-d93e-42e0-941e-ea59d67759d7@2", "title": "Introduction"}, {"shortId": "2i2Z-QR3@2", "id": "da2d99f9-0477-4f7a-9dd5-c69bb249c835@2", "title": "Power Series and Functions"}, {"shortId": "8zWkrva0@2", "id": "f335a4ae-f6b4-4793-bac5-49b412b22aeb@2", "title": "Properties of Power Series"}, {"shortId": "CZi7x6Ls@2", "id": "0998bbc7-a2ec-4334-8a64-420d1e3a43bf@2", "title": "Taylor and Maclaurin Series"}, {"shortId": "WhpdPg8V@2", "id": "5a1a5d3e-0f15-46c5-89ff-ff407a5ca0b0@2", "title": "Working with Taylor Series"}], "title": "Power Series"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "72YaCFgv@2", "id": "ef661a08-582f-4d4f-b18e-639507c5ce33@2", "title": "Introduction"}, {"shortId": "yhpfq5F1@2", "id": "ca1a5fab-9175-444a-a4dd-11cdd0e6a570@2", "title": "Parametric Equations"}, {"shortId": "UqdhxcIJ@2", "id": "52a761c5-c209-4e86-9cad-b1cf1f0cb049@2", "title": "Calculus of Parametric Curves"}, {"shortId": "mFb-TD17@2", "id": "9856fe4c-3d7b-4428-9a8c-f8e84f6c89ea@2", "title": "Polar Coordinates"}, {"shortId": "6rtmp2fr@2", "id": "eabb66a7-67eb-4794-b0ac-754f1aedfbfd@2", "title": "Area and Arc Length in Polar Coordinates"}, {"shortId": "RAdKNUjT@2", "id": "44074a35-48d3-4f39-97e6-22413f78bab9@2", "title": "Conic Sections"}], "title": "Parametric Equations and Polar Coordinates"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "l86oFDx3@2", "id": "97cea814-3c77-4499-b551-45164a66bd71@2", "title": "Introduction"}, {"shortId": "rrUfMMXA@2", "id": "aeb51f30-c5c0-452a-889f-a281395e2dec@2", "title": "Vectors in the Plane"}, {"shortId": "FBL1jLjm@2", "id": "1412f58c-b8e6-4517-ac82-71d0bdf7c1ba@2", "title": "Vectors in Three Dimensions"}, {"shortId": "cRD532qo@2", "id": "7110f9df-6aa8-4c5b-adf0-ee8ed66ad26f@2", "title": "The Dot Product"}, {"shortId": "1TskJjp2@2", "id": "d53b2426-3a76-4d95-af4f-6532ad8e4e9a@2", "title": "The Cross Product"}, {"shortId": "YM6I55EW@2", "id": "60ce88e7-9116-48d3-bb30-013c89cddc64@2", "title": "Equations of Lines and Planes in Space"}, {"shortId": "xr_RDPv0@2", "id": "c6bfd10c-fbf4-4ebe-8e50-9b5aed4fcc9b@2", "title": "Quadric Surfaces"}, {"shortId": "KTzGGLDe@2", "id": "293cc618-b0de-4ec9-9029-6efb4eb1b172@2", "title": "Cylindrical and Spherical Coordinates"}], "title": "Vectors in Space"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "-qXLWkju@2", "id": "faa5cb5a-48ee-4cdf-9127-957df9c318c3@2", "title": "Introduction"}, {"shortId": "II6x1ElB@2", "id": "208eb1d4-4941-4536-b804-c33f174d0e71@2", "title": "Vector-Valued Functions and Space Curves"}, {"shortId": "b6_oskIJ@2", "id": "6fafe8b2-4209-4e85-8a0e-9e51b6b3cd8b@2", "title": "Calculus of Vector-Valued Functions"}, {"shortId": "9fEOYsBF@2", "id": "f5f10e62-c045-40fb-b1e4-09d2cfb31da5@2", "title": "Arc Length and Curvature"}, {"shortId": "ZZiwuqwW@2", "id": "6598b0ba-ac16-4b85-91bb-3677087a3e23@2", "title": "Motion in Space"}], "title": "Vector-Valued Functions"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "ZcXh2Ycu@2", "id": "65c5e1d9-872e-4319-831f-1c0fca58586a@2", "title": "Introduction"}, {"shortId": "t-PZBc8c@2", "id": "b7e3d905-cf1c-4d70-8f63-b5101d20b9ce@2", "title": "Functions of Several Variables"}, {"shortId": "2YObsFkq@2", "id": "d9839bb0-592a-4df4-82f9-0affabaad0dc@2", "title": "Limits and Continuity"}, {"shortId": "sf_XP7nX@2", "id": "b1ffd73f-b9d7-41a1-8546-c25c366b2e90@2", "title": "Partial Derivatives"}, {"shortId": "M_GqncFF@2", "id": "33f1aa9d-c145-4422-ae15-918fed2f7444@2", "title": "Tangent Planes and Linear Approximations"}, {"shortId": "8QoqMp7K@2", "id": "f10a2a32-9eca-48cf-9e84-10c18a890484@2", "title": "The Chain Rule"}, {"shortId": "gkQNvJr6@2", "id": "82440dbc-9afa-4f68-ab57-5fb973b6da83@2", "title": "Directional Derivatives and the Gradient"}, {"shortId": "f6__wyM8@2", "id": "7fafffc3-233c-4832-ade9-1ca1f91ec9c4@2", "title": "Maxima/Minima Problems"}, {"shortId": "3Rf0X0cE@2", "id": "dd17f45f-4704-4868-9192-90879033063c@2", "title": "Lagrange Multipliers"}], "title": "Differentiation of Functions of Several Variables"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "5KkalkOX@2", "id": "e4a91a96-4397-48af-a960-c72f16214c51@2", "title": "Introduction"}, {"shortId": "2dptRDuj@2", "id": "d9da6d44-3ba3-4a90-adbc-dec26572e480@2", "title": "Double Integrals over Rectangular Regions"}, {"shortId": "94PKCMov@2", "id": "f783ca08-ca2f-4ebb-a559-d1b30c2f9b8c@2", "title": "Double Integrals over General Regions"}, {"shortId": "goUs76kz@2", "id": "82852cef-a933-495b-9be8-6b3aa0676026@2", "title": "Double Integrals in Polar Coordinates"}, {"shortId": "0UDRza9T@2", "id": "d140d1cd-af53-466a-8e69-402de1b91259@2", "title": "Triple Integrals"}, {"shortId": "69B1kMnK@2", "id": "ebd07590-c9ca-4701-95cf-6fa9131d20db@2", "title": "Triple Integrals in Cylindrical and Spherical Coordinates"}, {"shortId": "Q_0pMyhf@2", "id": "43fd2933-285f-4a11-85d9-8913abc213df@2", "title": "Calculating Centers of Mass and Moments of Inertia"}, {"shortId": "Ulv7xRPz@2", "id": "525bfbc5-13f3-461a-98dc-96c236b2031b@2", "title": "Change of Variables in Multiple Integrals"}], "title": "Multiple Integration"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "QTWIMHdT@2", "id": "41358830-7753-4f50-af9d-ec46020d7b0c@2", "title": "Introduction"}, {"shortId": "TqHmrLMw@2", "id": "4ea1e6ac-b330-4b3a-a84a-b899b4fc0de5@2", "title": "Vector Fields"}, {"shortId": "NLCQpZbY@2", "id": "34b090a5-96d8-48dc-97e5-4aab175adbb5@2", "title": "Line Integrals"}, {"shortId": "R9rn8Pxd@2", "id": "47dae7f0-fc5d-4d6c-a882-d19c748319d9@2", "title": "Conservative Vector Fields"}, {"shortId": "sVtsGXF9@2", "id": "b15b6c19-717d-45d1-877b-d79c5b8518b9@2", "title": "Green\u2019s Theorem"}, {"shortId": "b2aOXTAN@2", "id": "6f668e5d-300d-4e6c-aec3-70b59f71fe69@2", "title": "Divergence and Curl"}, {"shortId": "UF2YhFSp@2", "id": "505d9884-54a9-4157-83ff-87887335091b@2", "title": "Surface Integrals"}, {"shortId": "e1mybYrl@2", "id": "7b59b26d-8ae5-465f-8851-746da2323b56@2", "title": "Stokes\u2019 Theorem"}, {"shortId": "133lvAfg@2", "id": "d77de5bc-07e0-40d3-a789-c2f01549dd9b@2", "title": "The Divergence Theorem"}], "title": "Vector Calculus"}, {"shortId": "subcol", "id": "subcol", "contents": [{"shortId": "M5OvZ-w9@2", "id": "3393af67-ec3d-4cb9-a42c-f51e24639776@2", "title": "Introduction"}, {"shortId": "ZYkHo3JN@2", "id": "658907a3-724d-4f81-9468-fbde7bb4b09e@2", "title": "Second-Order Linear Equations"}, {"shortId": "4ssP0Wyw@2", "id": "e2cb0fd1-6cb0-486c-93d7-2edd081caff6@2", "title": "Nonhomogeneous Linear Equations"}, {"shortId": "Hz6Uuu7i@2", "id": "1f3e94ba-eee2-44b2-881a-5e5f8fe37136@2", "title": "Applications"}, {"shortId": "H1_wgzCB@2", "id": "1f5ff083-3081-490b-b429-61fc1959738c@2", "title": "Series Solutions of Differential Equations"}], "title": "Second-Order Differential Equations"}, {"shortId": "ETQP7eZj@2", "id": "11340fed-e663-401b-a4c8-6956078f569c@2", "title": "Appendix A: Table of Integrals"}, {"shortId": "paWiqjo1@2", "id": "a5a5a2aa-3a35-4c5e-947f-9ae5da92edcb@2", "title": "Appendix B: Table of Derivatives"}, {"shortId": "O-OECtQZ@2", "id": "3be3840a-d419-4680-a09e-8dea36bacbf7@2", "title": "Appendix C: Review of Pre-Calculus"}], "title": "Calculus"}, "doctype": "", "buyLink": null, "submitter": {"surname": "Calculus", "suffix": "", "firstname": "OpenStax", "title": "", "fullname": "OpenStax Calculus", "id": "cnxcalc"}, "collated": false, "parentAuthors": [], "history": [{"changes": "added preface", "version": "3.2", "revised": "2016-02-05T19:10:39Z", "publisher": {"surname": "Calculus", "suffix": "", "firstname": "OpenStax", "title": "", "fullname": "OpenStax Calculus", "id": "cnxcalc"}}, {"changes": "added preface", "version": "3.1", "revised": "2016-02-03T17:05:19Z", "publisher": {"surname": "Calculus", "suffix": "", "firstname": "OpenStax", "title": "", "fullname": "OpenStax Calculus", "id": "cnxcalc"}}, {"changes": "added GA code", "version": "2.1", "revised": "2016-02-01T23:47:03Z", "publisher": {"surname": "Calculus", "suffix": "", "firstname": "OpenStax", "title": "", "fullname": "OpenStax Calculus", "id": "cnxcalc"}}, {"changes": "created", "version": "1.1", "revised": "2016-02-01T22:41:12Z", "publisher": {"surname": "Calculus", "suffix": "", "firstname": "OpenStax", "title": "", "fullname": "OpenStax Calculus", "id": "cnxcalc"}}]} -------------------------------------------------------------------------------- /test/_fixtures/https%3A__api.github.com_search_repositories%3Fq%3Doctokat_GET_3938_body.raw: -------------------------------------------------------------------------------- 1 | {"total_count":12,"incomplete_results":false,"items":[{"id":20044005,"name":"octokat.js","full_name":"philschatz/octokat.js","owner":{"login":"philschatz","id":253202,"avatar_url":"https://avatars0.githubusercontent.com/u/253202?v=3","gravatar_id":"","url":"https://api.github.com/users/philschatz","html_url":"https://github.com/philschatz","followers_url":"https://api.github.com/users/philschatz/followers","following_url":"https://api.github.com/users/philschatz/following{/other_user}","gists_url":"https://api.github.com/users/philschatz/gists{/gist_id}","starred_url":"https://api.github.com/users/philschatz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/philschatz/subscriptions","organizations_url":"https://api.github.com/users/philschatz/orgs","repos_url":"https://api.github.com/users/philschatz/repos","events_url":"https://api.github.com/users/philschatz/events{/privacy}","received_events_url":"https://api.github.com/users/philschatz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/philschatz/octokat.js","description":":octocat: Github API Client using Promises or callbacks. Intended for the browser or NodeJS.","fork":false,"url":"https://api.github.com/repos/philschatz/octokat.js","forks_url":"https://api.github.com/repos/philschatz/octokat.js/forks","keys_url":"https://api.github.com/repos/philschatz/octokat.js/keys{/key_id}","collaborators_url":"https://api.github.com/repos/philschatz/octokat.js/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/philschatz/octokat.js/teams","hooks_url":"https://api.github.com/repos/philschatz/octokat.js/hooks","issue_events_url":"https://api.github.com/repos/philschatz/octokat.js/issues/events{/number}","events_url":"https://api.github.com/repos/philschatz/octokat.js/events","assignees_url":"https://api.github.com/repos/philschatz/octokat.js/assignees{/user}","branches_url":"https://api.github.com/repos/philschatz/octokat.js/branches{/branch}","tags_url":"https://api.github.com/repos/philschatz/octokat.js/tags","blobs_url":"https://api.github.com/repos/philschatz/octokat.js/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/philschatz/octokat.js/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/philschatz/octokat.js/git/refs{/sha}","trees_url":"https://api.github.com/repos/philschatz/octokat.js/git/trees{/sha}","statuses_url":"https://api.github.com/repos/philschatz/octokat.js/statuses/{sha}","languages_url":"https://api.github.com/repos/philschatz/octokat.js/languages","stargazers_url":"https://api.github.com/repos/philschatz/octokat.js/stargazers","contributors_url":"https://api.github.com/repos/philschatz/octokat.js/contributors","subscribers_url":"https://api.github.com/repos/philschatz/octokat.js/subscribers","subscription_url":"https://api.github.com/repos/philschatz/octokat.js/subscription","commits_url":"https://api.github.com/repos/philschatz/octokat.js/commits{/sha}","git_commits_url":"https://api.github.com/repos/philschatz/octokat.js/git/commits{/sha}","comments_url":"https://api.github.com/repos/philschatz/octokat.js/comments{/number}","issue_comment_url":"https://api.github.com/repos/philschatz/octokat.js/issues/comments{/number}","contents_url":"https://api.github.com/repos/philschatz/octokat.js/contents/{+path}","compare_url":"https://api.github.com/repos/philschatz/octokat.js/compare/{base}...{head}","merges_url":"https://api.github.com/repos/philschatz/octokat.js/merges","archive_url":"https://api.github.com/repos/philschatz/octokat.js/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/philschatz/octokat.js/downloads","issues_url":"https://api.github.com/repos/philschatz/octokat.js/issues{/number}","pulls_url":"https://api.github.com/repos/philschatz/octokat.js/pulls{/number}","milestones_url":"https://api.github.com/repos/philschatz/octokat.js/milestones{/number}","notifications_url":"https://api.github.com/repos/philschatz/octokat.js/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/philschatz/octokat.js/labels{/name}","releases_url":"https://api.github.com/repos/philschatz/octokat.js/releases{/id}","deployments_url":"https://api.github.com/repos/philschatz/octokat.js/deployments","created_at":"2014-05-22T01:49:45Z","updated_at":"2017-05-13T08:02:39Z","pushed_at":"2017-05-13T19:39:11Z","git_url":"git://github.com/philschatz/octokat.js.git","ssh_url":"git@github.com:philschatz/octokat.js.git","clone_url":"https://github.com/philschatz/octokat.js.git","svn_url":"https://github.com/philschatz/octokat.js","homepage":"http://philschatz.com/2014/05/25/octokat/","size":916,"stargazers_count":244,"watchers_count":244,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":67,"mirror_url":null,"open_issues_count":27,"forks":67,"open_issues":27,"watchers":244,"default_branch":"master","score":50.64522},{"id":65391641,"name":"octokat","full_name":"melscoop/octokat","owner":{"login":"melscoop","id":10432485,"avatar_url":"https://avatars0.githubusercontent.com/u/10432485?v=3","gravatar_id":"","url":"https://api.github.com/users/melscoop","html_url":"https://github.com/melscoop","followers_url":"https://api.github.com/users/melscoop/followers","following_url":"https://api.github.com/users/melscoop/following{/other_user}","gists_url":"https://api.github.com/users/melscoop/gists{/gist_id}","starred_url":"https://api.github.com/users/melscoop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/melscoop/subscriptions","organizations_url":"https://api.github.com/users/melscoop/orgs","repos_url":"https://api.github.com/users/melscoop/repos","events_url":"https://api.github.com/users/melscoop/events{/privacy}","received_events_url":"https://api.github.com/users/melscoop/received_events","type":"User","site_admin":true},"private":false,"html_url":"https://github.com/melscoop/octokat","description":null,"fork":false,"url":"https://api.github.com/repos/melscoop/octokat","forks_url":"https://api.github.com/repos/melscoop/octokat/forks","keys_url":"https://api.github.com/repos/melscoop/octokat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/melscoop/octokat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/melscoop/octokat/teams","hooks_url":"https://api.github.com/repos/melscoop/octokat/hooks","issue_events_url":"https://api.github.com/repos/melscoop/octokat/issues/events{/number}","events_url":"https://api.github.com/repos/melscoop/octokat/events","assignees_url":"https://api.github.com/repos/melscoop/octokat/assignees{/user}","branches_url":"https://api.github.com/repos/melscoop/octokat/branches{/branch}","tags_url":"https://api.github.com/repos/melscoop/octokat/tags","blobs_url":"https://api.github.com/repos/melscoop/octokat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/melscoop/octokat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/melscoop/octokat/git/refs{/sha}","trees_url":"https://api.github.com/repos/melscoop/octokat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/melscoop/octokat/statuses/{sha}","languages_url":"https://api.github.com/repos/melscoop/octokat/languages","stargazers_url":"https://api.github.com/repos/melscoop/octokat/stargazers","contributors_url":"https://api.github.com/repos/melscoop/octokat/contributors","subscribers_url":"https://api.github.com/repos/melscoop/octokat/subscribers","subscription_url":"https://api.github.com/repos/melscoop/octokat/subscription","commits_url":"https://api.github.com/repos/melscoop/octokat/commits{/sha}","git_commits_url":"https://api.github.com/repos/melscoop/octokat/git/commits{/sha}","comments_url":"https://api.github.com/repos/melscoop/octokat/comments{/number}","issue_comment_url":"https://api.github.com/repos/melscoop/octokat/issues/comments{/number}","contents_url":"https://api.github.com/repos/melscoop/octokat/contents/{+path}","compare_url":"https://api.github.com/repos/melscoop/octokat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/melscoop/octokat/merges","archive_url":"https://api.github.com/repos/melscoop/octokat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/melscoop/octokat/downloads","issues_url":"https://api.github.com/repos/melscoop/octokat/issues{/number}","pulls_url":"https://api.github.com/repos/melscoop/octokat/pulls{/number}","milestones_url":"https://api.github.com/repos/melscoop/octokat/milestones{/number}","notifications_url":"https://api.github.com/repos/melscoop/octokat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/melscoop/octokat/labels{/name}","releases_url":"https://api.github.com/repos/melscoop/octokat/releases{/id}","deployments_url":"https://api.github.com/repos/melscoop/octokat/deployments","created_at":"2016-08-10T14:58:56Z","updated_at":"2016-08-10T14:58:56Z","pushed_at":"2016-08-10T14:58:57Z","git_url":"git://github.com/melscoop/octokat.git","ssh_url":"git@github.com:melscoop/octokat.git","clone_url":"https://github.com/melscoop/octokat.git","svn_url":"https://github.com/melscoop/octokat","homepage":null,"size":0,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_projects":true,"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","score":15.404436},{"id":2421694,"name":"Octokatti","full_name":"uitiu/Octokatti","owner":{"login":"uitiu","id":1064689,"avatar_url":"https://avatars2.githubusercontent.com/u/1064689?v=3","gravatar_id":"","url":"https://api.github.com/users/uitiu","html_url":"https://github.com/uitiu","followers_url":"https://api.github.com/users/uitiu/followers","following_url":"https://api.github.com/users/uitiu/following{/other_user}","gists_url":"https://api.github.com/users/uitiu/gists{/gist_id}","starred_url":"https://api.github.com/users/uitiu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/uitiu/subscriptions","organizations_url":"https://api.github.com/users/uitiu/orgs","repos_url":"https://api.github.com/users/uitiu/repos","events_url":"https://api.github.com/users/uitiu/events{/privacy}","received_events_url":"https://api.github.com/users/uitiu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/uitiu/Octokatti","description":"Rails Girls 20.9.2011 ","fork":false,"url":"https://api.github.com/repos/uitiu/Octokatti","forks_url":"https://api.github.com/repos/uitiu/Octokatti/forks","keys_url":"https://api.github.com/repos/uitiu/Octokatti/keys{/key_id}","collaborators_url":"https://api.github.com/repos/uitiu/Octokatti/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/uitiu/Octokatti/teams","hooks_url":"https://api.github.com/repos/uitiu/Octokatti/hooks","issue_events_url":"https://api.github.com/repos/uitiu/Octokatti/issues/events{/number}","events_url":"https://api.github.com/repos/uitiu/Octokatti/events","assignees_url":"https://api.github.com/repos/uitiu/Octokatti/assignees{/user}","branches_url":"https://api.github.com/repos/uitiu/Octokatti/branches{/branch}","tags_url":"https://api.github.com/repos/uitiu/Octokatti/tags","blobs_url":"https://api.github.com/repos/uitiu/Octokatti/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/uitiu/Octokatti/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/uitiu/Octokatti/git/refs{/sha}","trees_url":"https://api.github.com/repos/uitiu/Octokatti/git/trees{/sha}","statuses_url":"https://api.github.com/repos/uitiu/Octokatti/statuses/{sha}","languages_url":"https://api.github.com/repos/uitiu/Octokatti/languages","stargazers_url":"https://api.github.com/repos/uitiu/Octokatti/stargazers","contributors_url":"https://api.github.com/repos/uitiu/Octokatti/contributors","subscribers_url":"https://api.github.com/repos/uitiu/Octokatti/subscribers","subscription_url":"https://api.github.com/repos/uitiu/Octokatti/subscription","commits_url":"https://api.github.com/repos/uitiu/Octokatti/commits{/sha}","git_commits_url":"https://api.github.com/repos/uitiu/Octokatti/git/commits{/sha}","comments_url":"https://api.github.com/repos/uitiu/Octokatti/comments{/number}","issue_comment_url":"https://api.github.com/repos/uitiu/Octokatti/issues/comments{/number}","contents_url":"https://api.github.com/repos/uitiu/Octokatti/contents/{+path}","compare_url":"https://api.github.com/repos/uitiu/Octokatti/compare/{base}...{head}","merges_url":"https://api.github.com/repos/uitiu/Octokatti/merges","archive_url":"https://api.github.com/repos/uitiu/Octokatti/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/uitiu/Octokatti/downloads","issues_url":"https://api.github.com/repos/uitiu/Octokatti/issues{/number}","pulls_url":"https://api.github.com/repos/uitiu/Octokatti/pulls{/number}","milestones_url":"https://api.github.com/repos/uitiu/Octokatti/milestones{/number}","notifications_url":"https://api.github.com/repos/uitiu/Octokatti/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/uitiu/Octokatti/labels{/name}","releases_url":"https://api.github.com/repos/uitiu/Octokatti/releases{/id}","deployments_url":"https://api.github.com/repos/uitiu/Octokatti/deployments","created_at":"2011-09-20T10:40:50Z","updated_at":"2013-09-29T03:17:08Z","pushed_at":"2011-09-20T14:50:56Z","git_url":"git://github.com/uitiu/Octokatti.git","ssh_url":"git@github.com:uitiu/Octokatti.git","clone_url":"https://github.com/uitiu/Octokatti.git","svn_url":"https://github.com/uitiu/Octokatti","homepage":"","size":315,"stargazers_count":2,"watchers_count":2,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":2,"default_branch":"master","score":10.743997},{"id":24516050,"name":"octokat.js-fixtures","full_name":"philschatz/octokat.js-fixtures","owner":{"login":"philschatz","id":253202,"avatar_url":"https://avatars0.githubusercontent.com/u/253202?v=3","gravatar_id":"","url":"https://api.github.com/users/philschatz","html_url":"https://github.com/philschatz","followers_url":"https://api.github.com/users/philschatz/followers","following_url":"https://api.github.com/users/philschatz/following{/other_user}","gists_url":"https://api.github.com/users/philschatz/gists{/gist_id}","starred_url":"https://api.github.com/users/philschatz/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/philschatz/subscriptions","organizations_url":"https://api.github.com/users/philschatz/orgs","repos_url":"https://api.github.com/users/philschatz/repos","events_url":"https://api.github.com/users/philschatz/events{/privacy}","received_events_url":"https://api.github.com/users/philschatz/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/philschatz/octokat.js-fixtures","description":":vhs: HTTP Fixture files for octokat.js tests","fork":false,"url":"https://api.github.com/repos/philschatz/octokat.js-fixtures","forks_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/forks","keys_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/keys{/key_id}","collaborators_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/teams","hooks_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/hooks","issue_events_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/issues/events{/number}","events_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/events","assignees_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/assignees{/user}","branches_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/branches{/branch}","tags_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/tags","blobs_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/git/refs{/sha}","trees_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/git/trees{/sha}","statuses_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/statuses/{sha}","languages_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/languages","stargazers_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/stargazers","contributors_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/contributors","subscribers_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/subscribers","subscription_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/subscription","commits_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/commits{/sha}","git_commits_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/git/commits{/sha}","comments_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/comments{/number}","issue_comment_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/issues/comments{/number}","contents_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/contents/{+path}","compare_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/compare/{base}...{head}","merges_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/merges","archive_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/downloads","issues_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/issues{/number}","pulls_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/pulls{/number}","milestones_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/milestones{/number}","notifications_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/labels{/name}","releases_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/releases{/id}","deployments_url":"https://api.github.com/repos/philschatz/octokat.js-fixtures/deployments","created_at":"2014-09-26T21:31:18Z","updated_at":"2017-05-13T02:26:51Z","pushed_at":"2017-05-13T19:30:37Z","git_url":"git://github.com/philschatz/octokat.js-fixtures.git","ssh_url":"git@github.com:philschatz/octokat.js-fixtures.git","clone_url":"https://github.com/philschatz/octokat.js-fixtures.git","svn_url":"https://github.com/philschatz/octokat.js-fixtures","homepage":"","size":521,"stargazers_count":1,"watchers_count":1,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":0,"forks":2,"open_issues":0,"watchers":1,"default_branch":"master","score":9.035709},{"id":33008550,"name":"octokatTest","full_name":"ElTester/octokatTest","owner":{"login":"ElTester","id":11686194,"avatar_url":"https://avatars0.githubusercontent.com/u/11686194?v=3","gravatar_id":"","url":"https://api.github.com/users/ElTester","html_url":"https://github.com/ElTester","followers_url":"https://api.github.com/users/ElTester/followers","following_url":"https://api.github.com/users/ElTester/following{/other_user}","gists_url":"https://api.github.com/users/ElTester/gists{/gist_id}","starred_url":"https://api.github.com/users/ElTester/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ElTester/subscriptions","organizations_url":"https://api.github.com/users/ElTester/orgs","repos_url":"https://api.github.com/users/ElTester/repos","events_url":"https://api.github.com/users/ElTester/events{/privacy}","received_events_url":"https://api.github.com/users/ElTester/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ElTester/octokatTest","description":"Repo for testing octokat stuff","fork":false,"url":"https://api.github.com/repos/ElTester/octokatTest","forks_url":"https://api.github.com/repos/ElTester/octokatTest/forks","keys_url":"https://api.github.com/repos/ElTester/octokatTest/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ElTester/octokatTest/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ElTester/octokatTest/teams","hooks_url":"https://api.github.com/repos/ElTester/octokatTest/hooks","issue_events_url":"https://api.github.com/repos/ElTester/octokatTest/issues/events{/number}","events_url":"https://api.github.com/repos/ElTester/octokatTest/events","assignees_url":"https://api.github.com/repos/ElTester/octokatTest/assignees{/user}","branches_url":"https://api.github.com/repos/ElTester/octokatTest/branches{/branch}","tags_url":"https://api.github.com/repos/ElTester/octokatTest/tags","blobs_url":"https://api.github.com/repos/ElTester/octokatTest/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ElTester/octokatTest/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ElTester/octokatTest/git/refs{/sha}","trees_url":"https://api.github.com/repos/ElTester/octokatTest/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ElTester/octokatTest/statuses/{sha}","languages_url":"https://api.github.com/repos/ElTester/octokatTest/languages","stargazers_url":"https://api.github.com/repos/ElTester/octokatTest/stargazers","contributors_url":"https://api.github.com/repos/ElTester/octokatTest/contributors","subscribers_url":"https://api.github.com/repos/ElTester/octokatTest/subscribers","subscription_url":"https://api.github.com/repos/ElTester/octokatTest/subscription","commits_url":"https://api.github.com/repos/ElTester/octokatTest/commits{/sha}","git_commits_url":"https://api.github.com/repos/ElTester/octokatTest/git/commits{/sha}","comments_url":"https://api.github.com/repos/ElTester/octokatTest/comments{/number}","issue_comment_url":"https://api.github.com/repos/ElTester/octokatTest/issues/comments{/number}","contents_url":"https://api.github.com/repos/ElTester/octokatTest/contents/{+path}","compare_url":"https://api.github.com/repos/ElTester/octokatTest/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ElTester/octokatTest/merges","archive_url":"https://api.github.com/repos/ElTester/octokatTest/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ElTester/octokatTest/downloads","issues_url":"https://api.github.com/repos/ElTester/octokatTest/issues{/number}","pulls_url":"https://api.github.com/repos/ElTester/octokatTest/pulls{/number}","milestones_url":"https://api.github.com/repos/ElTester/octokatTest/milestones{/number}","notifications_url":"https://api.github.com/repos/ElTester/octokatTest/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ElTester/octokatTest/labels{/name}","releases_url":"https://api.github.com/repos/ElTester/octokatTest/releases{/id}","deployments_url":"https://api.github.com/repos/ElTester/octokatTest/deployments","created_at":"2015-03-27T20:49:32Z","updated_at":"2015-03-30T16:08:38Z","pushed_at":"2015-03-30T16:08:38Z","git_url":"git://github.com/ElTester/octokatTest.git","ssh_url":"git@github.com:ElTester/octokatTest.git","clone_url":"https://github.com/ElTester/octokatTest.git","svn_url":"https://github.com/ElTester/octokatTest","homepage":null,"size":136,"stargazers_count":0,"watchers_count":0,"language":"C","has_issues":true,"has_projects":true,"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","score":7.2352405},{"id":32884779,"name":"deanius-meteor-octokat","full_name":"deanius/deanius-meteor-octokat","owner":{"login":"deanius","id":24406,"avatar_url":"https://avatars2.githubusercontent.com/u/24406?v=3","gravatar_id":"","url":"https://api.github.com/users/deanius","html_url":"https://github.com/deanius","followers_url":"https://api.github.com/users/deanius/followers","following_url":"https://api.github.com/users/deanius/following{/other_user}","gists_url":"https://api.github.com/users/deanius/gists{/gist_id}","starred_url":"https://api.github.com/users/deanius/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/deanius/subscriptions","organizations_url":"https://api.github.com/users/deanius/orgs","repos_url":"https://api.github.com/users/deanius/repos","events_url":"https://api.github.com/users/deanius/events{/privacy}","received_events_url":"https://api.github.com/users/deanius/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/deanius/deanius-meteor-octokat","description":null,"fork":false,"url":"https://api.github.com/repos/deanius/deanius-meteor-octokat","forks_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/forks","keys_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/teams","hooks_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/hooks","issue_events_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/issues/events{/number}","events_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/events","assignees_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/assignees{/user}","branches_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/branches{/branch}","tags_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/tags","blobs_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/git/refs{/sha}","trees_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/statuses/{sha}","languages_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/languages","stargazers_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/stargazers","contributors_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/contributors","subscribers_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/subscribers","subscription_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/subscription","commits_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/commits{/sha}","git_commits_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/git/commits{/sha}","comments_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/comments{/number}","issue_comment_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/issues/comments{/number}","contents_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/contents/{+path}","compare_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/merges","archive_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/downloads","issues_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/issues{/number}","pulls_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/pulls{/number}","milestones_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/milestones{/number}","notifications_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/labels{/name}","releases_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/releases{/id}","deployments_url":"https://api.github.com/repos/deanius/deanius-meteor-octokat/deployments","created_at":"2015-03-25T18:59:54Z","updated_at":"2015-07-22T18:41:15Z","pushed_at":"2015-03-25T19:09:58Z","git_url":"git://github.com/deanius/deanius-meteor-octokat.git","ssh_url":"git@github.com:deanius/deanius-meteor-octokat.git","clone_url":"https://github.com/deanius/deanius-meteor-octokat.git","svn_url":"https://github.com/deanius/deanius-meteor-octokat","homepage":null,"size":100,"stargazers_count":2,"watchers_count":2,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":0,"forks":1,"open_issues":0,"watchers":2,"default_branch":"master","score":7.1576233},{"id":41853017,"name":"github-falcor","full_name":"kristianmandrup/github-falcor","owner":{"login":"kristianmandrup","id":125005,"avatar_url":"https://avatars0.githubusercontent.com/u/125005?v=3","gravatar_id":"","url":"https://api.github.com/users/kristianmandrup","html_url":"https://github.com/kristianmandrup","followers_url":"https://api.github.com/users/kristianmandrup/followers","following_url":"https://api.github.com/users/kristianmandrup/following{/other_user}","gists_url":"https://api.github.com/users/kristianmandrup/gists{/gist_id}","starred_url":"https://api.github.com/users/kristianmandrup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kristianmandrup/subscriptions","organizations_url":"https://api.github.com/users/kristianmandrup/orgs","repos_url":"https://api.github.com/users/kristianmandrup/repos","events_url":"https://api.github.com/users/kristianmandrup/events{/privacy}","received_events_url":"https://api.github.com/users/kristianmandrup/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kristianmandrup/github-falcor","description":"FalcorJS wrapper API for Github using Octokat.js and Koa application Server with Passport","fork":false,"url":"https://api.github.com/repos/kristianmandrup/github-falcor","forks_url":"https://api.github.com/repos/kristianmandrup/github-falcor/forks","keys_url":"https://api.github.com/repos/kristianmandrup/github-falcor/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kristianmandrup/github-falcor/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kristianmandrup/github-falcor/teams","hooks_url":"https://api.github.com/repos/kristianmandrup/github-falcor/hooks","issue_events_url":"https://api.github.com/repos/kristianmandrup/github-falcor/issues/events{/number}","events_url":"https://api.github.com/repos/kristianmandrup/github-falcor/events","assignees_url":"https://api.github.com/repos/kristianmandrup/github-falcor/assignees{/user}","branches_url":"https://api.github.com/repos/kristianmandrup/github-falcor/branches{/branch}","tags_url":"https://api.github.com/repos/kristianmandrup/github-falcor/tags","blobs_url":"https://api.github.com/repos/kristianmandrup/github-falcor/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kristianmandrup/github-falcor/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kristianmandrup/github-falcor/git/refs{/sha}","trees_url":"https://api.github.com/repos/kristianmandrup/github-falcor/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kristianmandrup/github-falcor/statuses/{sha}","languages_url":"https://api.github.com/repos/kristianmandrup/github-falcor/languages","stargazers_url":"https://api.github.com/repos/kristianmandrup/github-falcor/stargazers","contributors_url":"https://api.github.com/repos/kristianmandrup/github-falcor/contributors","subscribers_url":"https://api.github.com/repos/kristianmandrup/github-falcor/subscribers","subscription_url":"https://api.github.com/repos/kristianmandrup/github-falcor/subscription","commits_url":"https://api.github.com/repos/kristianmandrup/github-falcor/commits{/sha}","git_commits_url":"https://api.github.com/repos/kristianmandrup/github-falcor/git/commits{/sha}","comments_url":"https://api.github.com/repos/kristianmandrup/github-falcor/comments{/number}","issue_comment_url":"https://api.github.com/repos/kristianmandrup/github-falcor/issues/comments{/number}","contents_url":"https://api.github.com/repos/kristianmandrup/github-falcor/contents/{+path}","compare_url":"https://api.github.com/repos/kristianmandrup/github-falcor/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kristianmandrup/github-falcor/merges","archive_url":"https://api.github.com/repos/kristianmandrup/github-falcor/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kristianmandrup/github-falcor/downloads","issues_url":"https://api.github.com/repos/kristianmandrup/github-falcor/issues{/number}","pulls_url":"https://api.github.com/repos/kristianmandrup/github-falcor/pulls{/number}","milestones_url":"https://api.github.com/repos/kristianmandrup/github-falcor/milestones{/number}","notifications_url":"https://api.github.com/repos/kristianmandrup/github-falcor/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kristianmandrup/github-falcor/labels{/name}","releases_url":"https://api.github.com/repos/kristianmandrup/github-falcor/releases{/id}","deployments_url":"https://api.github.com/repos/kristianmandrup/github-falcor/deployments","created_at":"2015-09-03T09:59:53Z","updated_at":"2015-10-20T13:28:52Z","pushed_at":"2017-04-01T09:04:21Z","git_url":"git://github.com/kristianmandrup/github-falcor.git","ssh_url":"git@github.com:kristianmandrup/github-falcor.git","clone_url":"https://github.com/kristianmandrup/github-falcor.git","svn_url":"https://github.com/kristianmandrup/github-falcor","homepage":null,"size":19,"stargazers_count":3,"watchers_count":3,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2,"mirror_url":null,"open_issues_count":0,"forks":2,"open_issues":0,"watchers":3,"default_branch":"master","score":6.994025},{"id":41233996,"name":"build-octokat","full_name":"sanemat/build-octokat","owner":{"login":"sanemat","id":75448,"avatar_url":"https://avatars0.githubusercontent.com/u/75448?v=3","gravatar_id":"","url":"https://api.github.com/users/sanemat","html_url":"https://github.com/sanemat","followers_url":"https://api.github.com/users/sanemat/followers","following_url":"https://api.github.com/users/sanemat/following{/other_user}","gists_url":"https://api.github.com/users/sanemat/gists{/gist_id}","starred_url":"https://api.github.com/users/sanemat/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sanemat/subscriptions","organizations_url":"https://api.github.com/users/sanemat/orgs","repos_url":"https://api.github.com/users/sanemat/repos","events_url":"https://api.github.com/users/sanemat/events{/privacy}","received_events_url":"https://api.github.com/users/sanemat/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sanemat/build-octokat","description":null,"fork":false,"url":"https://api.github.com/repos/sanemat/build-octokat","forks_url":"https://api.github.com/repos/sanemat/build-octokat/forks","keys_url":"https://api.github.com/repos/sanemat/build-octokat/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sanemat/build-octokat/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sanemat/build-octokat/teams","hooks_url":"https://api.github.com/repos/sanemat/build-octokat/hooks","issue_events_url":"https://api.github.com/repos/sanemat/build-octokat/issues/events{/number}","events_url":"https://api.github.com/repos/sanemat/build-octokat/events","assignees_url":"https://api.github.com/repos/sanemat/build-octokat/assignees{/user}","branches_url":"https://api.github.com/repos/sanemat/build-octokat/branches{/branch}","tags_url":"https://api.github.com/repos/sanemat/build-octokat/tags","blobs_url":"https://api.github.com/repos/sanemat/build-octokat/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sanemat/build-octokat/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sanemat/build-octokat/git/refs{/sha}","trees_url":"https://api.github.com/repos/sanemat/build-octokat/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sanemat/build-octokat/statuses/{sha}","languages_url":"https://api.github.com/repos/sanemat/build-octokat/languages","stargazers_url":"https://api.github.com/repos/sanemat/build-octokat/stargazers","contributors_url":"https://api.github.com/repos/sanemat/build-octokat/contributors","subscribers_url":"https://api.github.com/repos/sanemat/build-octokat/subscribers","subscription_url":"https://api.github.com/repos/sanemat/build-octokat/subscription","commits_url":"https://api.github.com/repos/sanemat/build-octokat/commits{/sha}","git_commits_url":"https://api.github.com/repos/sanemat/build-octokat/git/commits{/sha}","comments_url":"https://api.github.com/repos/sanemat/build-octokat/comments{/number}","issue_comment_url":"https://api.github.com/repos/sanemat/build-octokat/issues/comments{/number}","contents_url":"https://api.github.com/repos/sanemat/build-octokat/contents/{+path}","compare_url":"https://api.github.com/repos/sanemat/build-octokat/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sanemat/build-octokat/merges","archive_url":"https://api.github.com/repos/sanemat/build-octokat/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sanemat/build-octokat/downloads","issues_url":"https://api.github.com/repos/sanemat/build-octokat/issues{/number}","pulls_url":"https://api.github.com/repos/sanemat/build-octokat/pulls{/number}","milestones_url":"https://api.github.com/repos/sanemat/build-octokat/milestones{/number}","notifications_url":"https://api.github.com/repos/sanemat/build-octokat/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sanemat/build-octokat/labels{/name}","releases_url":"https://api.github.com/repos/sanemat/build-octokat/releases{/id}","deployments_url":"https://api.github.com/repos/sanemat/build-octokat/deployments","created_at":"2015-08-23T03:23:12Z","updated_at":"2015-08-23T03:23:31Z","pushed_at":"2015-08-23T03:23:31Z","git_url":"git://github.com/sanemat/build-octokat.git","ssh_url":"git@github.com:sanemat/build-octokat.git","clone_url":"https://github.com/sanemat/build-octokat.git","svn_url":"https://github.com/sanemat/build-octokat","homepage":null,"size":180,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_projects":true,"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","score":6.6707945},{"id":91059817,"name":"octokit-org-test-repo","full_name":"octokit-test-org/octokit-org-test-repo","owner":{"login":"octokit-test-org","id":6076387,"avatar_url":"https://avatars1.githubusercontent.com/u/6076387?v=3","gravatar_id":"","url":"https://api.github.com/users/octokit-test-org","html_url":"https://github.com/octokit-test-org","followers_url":"https://api.github.com/users/octokit-test-org/followers","following_url":"https://api.github.com/users/octokit-test-org/following{/other_user}","gists_url":"https://api.github.com/users/octokit-test-org/gists{/gist_id}","starred_url":"https://api.github.com/users/octokit-test-org/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/octokit-test-org/subscriptions","organizations_url":"https://api.github.com/users/octokit-test-org/orgs","repos_url":"https://api.github.com/users/octokit-test-org/repos","events_url":"https://api.github.com/users/octokit-test-org/events{/privacy}","received_events_url":"https://api.github.com/users/octokit-test-org/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/octokit-test-org/octokit-org-test-repo","description":"test repo for octokat.js","fork":false,"url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo","forks_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/forks","keys_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/teams","hooks_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/hooks","issue_events_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/issues/events{/number}","events_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/events","assignees_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/assignees{/user}","branches_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/branches{/branch}","tags_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/tags","blobs_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/git/refs{/sha}","trees_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/statuses/{sha}","languages_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/languages","stargazers_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/stargazers","contributors_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/contributors","subscribers_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/subscribers","subscription_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/subscription","commits_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/commits{/sha}","git_commits_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/git/commits{/sha}","comments_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/comments{/number}","issue_comment_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/issues/comments{/number}","contents_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/contents/{+path}","compare_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/merges","archive_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/downloads","issues_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/issues{/number}","pulls_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/pulls{/number}","milestones_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/milestones{/number}","notifications_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/labels{/name}","releases_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/releases{/id}","deployments_url":"https://api.github.com/repos/octokit-test-org/octokit-org-test-repo/deployments","created_at":"2017-05-12T06:41:12Z","updated_at":"2017-05-14T17:00:51Z","pushed_at":"2017-05-14T17:00:17Z","git_url":"git://github.com/octokit-test-org/octokit-org-test-repo.git","ssh_url":"git@github.com:octokit-test-org/octokit-org-test-repo.git","clone_url":"https://github.com/octokit-test-org/octokit-org-test-repo.git","svn_url":"https://github.com/octokit-test-org/octokit-org-test-repo","homepage":"https://github.com/philschatz/octokat.js","size":7,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":32,"forks":0,"open_issues":32,"watchers":0,"default_branch":"master","score":5.410159},{"id":43439350,"name":"verde-alloggio","full_name":"petrosh/verde-alloggio","owner":{"login":"petrosh","id":4997583,"avatar_url":"https://avatars0.githubusercontent.com/u/4997583?v=3","gravatar_id":"","url":"https://api.github.com/users/petrosh","html_url":"https://github.com/petrosh","followers_url":"https://api.github.com/users/petrosh/followers","following_url":"https://api.github.com/users/petrosh/following{/other_user}","gists_url":"https://api.github.com/users/petrosh/gists{/gist_id}","starred_url":"https://api.github.com/users/petrosh/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/petrosh/subscriptions","organizations_url":"https://api.github.com/users/petrosh/orgs","repos_url":"https://api.github.com/users/petrosh/repos","events_url":"https://api.github.com/users/petrosh/events{/privacy}","received_events_url":"https://api.github.com/users/petrosh/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/petrosh/verde-alloggio","description":"Read from php, Write with octokat","fork":false,"url":"https://api.github.com/repos/petrosh/verde-alloggio","forks_url":"https://api.github.com/repos/petrosh/verde-alloggio/forks","keys_url":"https://api.github.com/repos/petrosh/verde-alloggio/keys{/key_id}","collaborators_url":"https://api.github.com/repos/petrosh/verde-alloggio/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/petrosh/verde-alloggio/teams","hooks_url":"https://api.github.com/repos/petrosh/verde-alloggio/hooks","issue_events_url":"https://api.github.com/repos/petrosh/verde-alloggio/issues/events{/number}","events_url":"https://api.github.com/repos/petrosh/verde-alloggio/events","assignees_url":"https://api.github.com/repos/petrosh/verde-alloggio/assignees{/user}","branches_url":"https://api.github.com/repos/petrosh/verde-alloggio/branches{/branch}","tags_url":"https://api.github.com/repos/petrosh/verde-alloggio/tags","blobs_url":"https://api.github.com/repos/petrosh/verde-alloggio/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/petrosh/verde-alloggio/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/petrosh/verde-alloggio/git/refs{/sha}","trees_url":"https://api.github.com/repos/petrosh/verde-alloggio/git/trees{/sha}","statuses_url":"https://api.github.com/repos/petrosh/verde-alloggio/statuses/{sha}","languages_url":"https://api.github.com/repos/petrosh/verde-alloggio/languages","stargazers_url":"https://api.github.com/repos/petrosh/verde-alloggio/stargazers","contributors_url":"https://api.github.com/repos/petrosh/verde-alloggio/contributors","subscribers_url":"https://api.github.com/repos/petrosh/verde-alloggio/subscribers","subscription_url":"https://api.github.com/repos/petrosh/verde-alloggio/subscription","commits_url":"https://api.github.com/repos/petrosh/verde-alloggio/commits{/sha}","git_commits_url":"https://api.github.com/repos/petrosh/verde-alloggio/git/commits{/sha}","comments_url":"https://api.github.com/repos/petrosh/verde-alloggio/comments{/number}","issue_comment_url":"https://api.github.com/repos/petrosh/verde-alloggio/issues/comments{/number}","contents_url":"https://api.github.com/repos/petrosh/verde-alloggio/contents/{+path}","compare_url":"https://api.github.com/repos/petrosh/verde-alloggio/compare/{base}...{head}","merges_url":"https://api.github.com/repos/petrosh/verde-alloggio/merges","archive_url":"https://api.github.com/repos/petrosh/verde-alloggio/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/petrosh/verde-alloggio/downloads","issues_url":"https://api.github.com/repos/petrosh/verde-alloggio/issues{/number}","pulls_url":"https://api.github.com/repos/petrosh/verde-alloggio/pulls{/number}","milestones_url":"https://api.github.com/repos/petrosh/verde-alloggio/milestones{/number}","notifications_url":"https://api.github.com/repos/petrosh/verde-alloggio/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/petrosh/verde-alloggio/labels{/name}","releases_url":"https://api.github.com/repos/petrosh/verde-alloggio/releases{/id}","deployments_url":"https://api.github.com/repos/petrosh/verde-alloggio/deployments","created_at":"2015-09-30T14:57:15Z","updated_at":"2015-09-30T20:34:47Z","pushed_at":"2015-09-30T21:26:21Z","git_url":"git://github.com/petrosh/verde-alloggio.git","ssh_url":"git@github.com:petrosh/verde-alloggio.git","clone_url":"https://github.com/petrosh/verde-alloggio.git","svn_url":"https://github.com/petrosh/verde-alloggio","homepage":"","size":172,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":true,"has_projects":true,"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","score":5.188261},{"id":74389550,"name":"strong-github-api","full_name":"strongloop/strong-github-api","owner":{"login":"strongloop","id":3020012,"avatar_url":"https://avatars2.githubusercontent.com/u/3020012?v=3","gravatar_id":"","url":"https://api.github.com/users/strongloop","html_url":"https://github.com/strongloop","followers_url":"https://api.github.com/users/strongloop/followers","following_url":"https://api.github.com/users/strongloop/following{/other_user}","gists_url":"https://api.github.com/users/strongloop/gists{/gist_id}","starred_url":"https://api.github.com/users/strongloop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/strongloop/subscriptions","organizations_url":"https://api.github.com/users/strongloop/orgs","repos_url":"https://api.github.com/users/strongloop/repos","events_url":"https://api.github.com/users/strongloop/events{/privacy}","received_events_url":"https://api.github.com/users/strongloop/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/strongloop/strong-github-api","description":"An Octokat-based API for querying GitHub","fork":false,"url":"https://api.github.com/repos/strongloop/strong-github-api","forks_url":"https://api.github.com/repos/strongloop/strong-github-api/forks","keys_url":"https://api.github.com/repos/strongloop/strong-github-api/keys{/key_id}","collaborators_url":"https://api.github.com/repos/strongloop/strong-github-api/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/strongloop/strong-github-api/teams","hooks_url":"https://api.github.com/repos/strongloop/strong-github-api/hooks","issue_events_url":"https://api.github.com/repos/strongloop/strong-github-api/issues/events{/number}","events_url":"https://api.github.com/repos/strongloop/strong-github-api/events","assignees_url":"https://api.github.com/repos/strongloop/strong-github-api/assignees{/user}","branches_url":"https://api.github.com/repos/strongloop/strong-github-api/branches{/branch}","tags_url":"https://api.github.com/repos/strongloop/strong-github-api/tags","blobs_url":"https://api.github.com/repos/strongloop/strong-github-api/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/strongloop/strong-github-api/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/strongloop/strong-github-api/git/refs{/sha}","trees_url":"https://api.github.com/repos/strongloop/strong-github-api/git/trees{/sha}","statuses_url":"https://api.github.com/repos/strongloop/strong-github-api/statuses/{sha}","languages_url":"https://api.github.com/repos/strongloop/strong-github-api/languages","stargazers_url":"https://api.github.com/repos/strongloop/strong-github-api/stargazers","contributors_url":"https://api.github.com/repos/strongloop/strong-github-api/contributors","subscribers_url":"https://api.github.com/repos/strongloop/strong-github-api/subscribers","subscription_url":"https://api.github.com/repos/strongloop/strong-github-api/subscription","commits_url":"https://api.github.com/repos/strongloop/strong-github-api/commits{/sha}","git_commits_url":"https://api.github.com/repos/strongloop/strong-github-api/git/commits{/sha}","comments_url":"https://api.github.com/repos/strongloop/strong-github-api/comments{/number}","issue_comment_url":"https://api.github.com/repos/strongloop/strong-github-api/issues/comments{/number}","contents_url":"https://api.github.com/repos/strongloop/strong-github-api/contents/{+path}","compare_url":"https://api.github.com/repos/strongloop/strong-github-api/compare/{base}...{head}","merges_url":"https://api.github.com/repos/strongloop/strong-github-api/merges","archive_url":"https://api.github.com/repos/strongloop/strong-github-api/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/strongloop/strong-github-api/downloads","issues_url":"https://api.github.com/repos/strongloop/strong-github-api/issues{/number}","pulls_url":"https://api.github.com/repos/strongloop/strong-github-api/pulls{/number}","milestones_url":"https://api.github.com/repos/strongloop/strong-github-api/milestones{/number}","notifications_url":"https://api.github.com/repos/strongloop/strong-github-api/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/strongloop/strong-github-api/labels{/name}","releases_url":"https://api.github.com/repos/strongloop/strong-github-api/releases{/id}","deployments_url":"https://api.github.com/repos/strongloop/strong-github-api/deployments","created_at":"2016-11-21T17:43:40Z","updated_at":"2016-11-21T17:59:16Z","pushed_at":"2017-04-05T15:17:59Z","git_url":"git://github.com/strongloop/strong-github-api.git","ssh_url":"git@github.com:strongloop/strong-github-api.git","clone_url":"https://github.com/strongloop/strong-github-api.git","svn_url":"https://github.com/strongloop/strong-github-api","homepage":null,"size":20,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"master","score":4.733418},{"id":39620397,"name":"octo-man","full_name":"kristianmandrup/octo-man","owner":{"login":"kristianmandrup","id":125005,"avatar_url":"https://avatars0.githubusercontent.com/u/125005?v=3","gravatar_id":"","url":"https://api.github.com/users/kristianmandrup","html_url":"https://github.com/kristianmandrup","followers_url":"https://api.github.com/users/kristianmandrup/followers","following_url":"https://api.github.com/users/kristianmandrup/following{/other_user}","gists_url":"https://api.github.com/users/kristianmandrup/gists{/gist_id}","starred_url":"https://api.github.com/users/kristianmandrup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kristianmandrup/subscriptions","organizations_url":"https://api.github.com/users/kristianmandrup/orgs","repos_url":"https://api.github.com/users/kristianmandrup/repos","events_url":"https://api.github.com/users/kristianmandrup/events{/privacy}","received_events_url":"https://api.github.com/users/kristianmandrup/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kristianmandrup/octo-man","description":"OctoKat.js connector to Github API via Node on ES6/ES7","fork":false,"url":"https://api.github.com/repos/kristianmandrup/octo-man","forks_url":"https://api.github.com/repos/kristianmandrup/octo-man/forks","keys_url":"https://api.github.com/repos/kristianmandrup/octo-man/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kristianmandrup/octo-man/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kristianmandrup/octo-man/teams","hooks_url":"https://api.github.com/repos/kristianmandrup/octo-man/hooks","issue_events_url":"https://api.github.com/repos/kristianmandrup/octo-man/issues/events{/number}","events_url":"https://api.github.com/repos/kristianmandrup/octo-man/events","assignees_url":"https://api.github.com/repos/kristianmandrup/octo-man/assignees{/user}","branches_url":"https://api.github.com/repos/kristianmandrup/octo-man/branches{/branch}","tags_url":"https://api.github.com/repos/kristianmandrup/octo-man/tags","blobs_url":"https://api.github.com/repos/kristianmandrup/octo-man/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kristianmandrup/octo-man/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kristianmandrup/octo-man/git/refs{/sha}","trees_url":"https://api.github.com/repos/kristianmandrup/octo-man/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kristianmandrup/octo-man/statuses/{sha}","languages_url":"https://api.github.com/repos/kristianmandrup/octo-man/languages","stargazers_url":"https://api.github.com/repos/kristianmandrup/octo-man/stargazers","contributors_url":"https://api.github.com/repos/kristianmandrup/octo-man/contributors","subscribers_url":"https://api.github.com/repos/kristianmandrup/octo-man/subscribers","subscription_url":"https://api.github.com/repos/kristianmandrup/octo-man/subscription","commits_url":"https://api.github.com/repos/kristianmandrup/octo-man/commits{/sha}","git_commits_url":"https://api.github.com/repos/kristianmandrup/octo-man/git/commits{/sha}","comments_url":"https://api.github.com/repos/kristianmandrup/octo-man/comments{/number}","issue_comment_url":"https://api.github.com/repos/kristianmandrup/octo-man/issues/comments{/number}","contents_url":"https://api.github.com/repos/kristianmandrup/octo-man/contents/{+path}","compare_url":"https://api.github.com/repos/kristianmandrup/octo-man/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kristianmandrup/octo-man/merges","archive_url":"https://api.github.com/repos/kristianmandrup/octo-man/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kristianmandrup/octo-man/downloads","issues_url":"https://api.github.com/repos/kristianmandrup/octo-man/issues{/number}","pulls_url":"https://api.github.com/repos/kristianmandrup/octo-man/pulls{/number}","milestones_url":"https://api.github.com/repos/kristianmandrup/octo-man/milestones{/number}","notifications_url":"https://api.github.com/repos/kristianmandrup/octo-man/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kristianmandrup/octo-man/labels{/name}","releases_url":"https://api.github.com/repos/kristianmandrup/octo-man/releases{/id}","deployments_url":"https://api.github.com/repos/kristianmandrup/octo-man/deployments","created_at":"2015-07-24T08:23:02Z","updated_at":"2015-07-24T08:28:20Z","pushed_at":"2017-04-01T09:11:52Z","git_url":"git://github.com/kristianmandrup/octo-man.git","ssh_url":"git@github.com:kristianmandrup/octo-man.git","clone_url":"https://github.com/kristianmandrup/octo-man.git","svn_url":"https://github.com/kristianmandrup/octo-man","homepage":null,"size":8,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_projects":true,"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","score":3.2226543}]} --------------------------------------------------------------------------------