;
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}]}
--------------------------------------------------------------------------------