From 325c6db0ce2173ca34547787b8ecebe5d7c718d5 Mon Sep 17 00:00:00 2001 From: Brian Beck Date: Fri, 9 Dec 2016 18:55:41 -0800 Subject: [PATCH] Add support for more MusicBrainz features, improve test coverage --- .babelrc | 2 +- package.json | 5 +- scripts/print-schema.js | 18 +- src/api.js | 20 +- src/queries/browse.js | 17 +- src/queries/lookup.js | 19 +- src/rate-limit.js | 52 --- src/resolvers.js | 7 +- src/types/alias.js | 4 +- src/types/helpers.js | 25 +- src/types/release.js | 7 +- src/types/scalars.js | 155 ++++--- test/api.js | 22 +- .../05fcd912e8786fff4dca854a7fa44c81.headers | 10 +- .../fixtures/096e5b32efb65749a3f9ccaba145c6d9 | Bin 0 -> 437 bytes .../096e5b32efb65749a3f9ccaba145c6d9.headers | 29 ++ .../fixtures/157ce6484de07a7e2ee93b54e8244e27 | Bin 319 -> 319 bytes .../157ce6484de07a7e2ee93b54e8244e27.headers | 12 +- .../215ca91efacd4b7a1e7800813c8382e0.headers | 8 +- .../fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9 | 1 + .../3a7c3d2d0ac8cb3923c301ccbe320fd9.headers | 27 ++ .../fixtures/3d3398816ac3ccbffdd2c4893406f982 | Bin 0 -> 683 bytes .../3d3398816ac3ccbffdd2c4893406f982.headers | 29 ++ .../fixtures/456168a862ec0ca28127f067e3f166e7 | Bin 287 -> 277 bytes .../456168a862ec0ca28127f067e3f166e7.headers | 12 +- .../fixtures/49a2bac852ad6aca096d15a60f5ad23a | Bin 0 -> 431 bytes .../49a2bac852ad6aca096d15a60f5ad23a.headers | 29 ++ .../fixtures/4b2d503f6b8f97b06e3ec6a3341f6904 | Bin 0 -> 204 bytes .../4b2d503f6b8f97b06e3ec6a3341f6904.headers | 29 ++ .../fixtures/6044ddc15443664659ef91c3c73c0776 | Bin 1392 -> 1422 bytes .../6044ddc15443664659ef91c3c73c0776.headers | 12 +- .../fixtures/69d9c8738fe3ea4883276fd8fc9979ce | Bin 784 -> 800 bytes .../69d9c8738fe3ea4883276fd8fc9979ce.headers | 12 +- .../fixtures/7aa73613ca81c364adb26ad95bebe930 | Bin 0 -> 568 bytes .../7aa73613ca81c364adb26ad95bebe930.headers | 29 ++ .../fixtures/87438b239df73ddc020aee9ec9d84905 | 2 +- .../87438b239df73ddc020aee9ec9d84905.headers | 12 +- .../fixtures/876353ef38c82797eaed49c94c919179 | 1 + .../876353ef38c82797eaed49c94c919179.headers | 27 ++ .../fixtures/914da6a513e527c9351bffbc8879dfc2 | Bin 0 -> 587 bytes .../914da6a513e527c9351bffbc8879dfc2.headers | 29 ++ .../fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e | Bin 408 -> 410 bytes .../9247bb00fc5e2e0dcf1fcd269df8b94e.headers | 12 +- .../fixtures/97ec62634d0a8953ab3ba2ffce984a83 | Bin 1669 -> 1674 bytes .../97ec62634d0a8953ab3ba2ffce984a83.headers | 12 +- .../fixtures/a0ed4659bace0bc088ef218af3ecfc10 | Bin 0 -> 729 bytes .../a0ed4659bace0bc088ef218af3ecfc10.headers | 29 ++ .../fixtures/a81703ff2de3c55fdf82ff4d0a1f5052 | Bin 523 -> 520 bytes .../a81703ff2de3c55fdf82ff4d0a1f5052.headers | 12 +- .../fixtures/b1df6f5637b0de25ce9f54874c8ecffc | Bin 626 -> 633 bytes .../b1df6f5637b0de25ce9f54874c8ecffc.headers | 12 +- .../fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9 | Bin 1868 -> 1886 bytes .../c907a9892b9dacd1c8f6a85cf9b95fb9.headers | 12 +- .../fixtures/d1a0073e6dcac919d8fdf8be12bfcbec | Bin 1309 -> 1311 bytes .../d1a0073e6dcac919d8fdf8be12bfcbec.headers | 12 +- .../fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff | Bin 1231 -> 1217 bytes .../f2a7af3e3a39e31ee0d9d74b5820ebff.headers | 12 +- .../fixtures/f5cc4554214e4421714ea8f4650632b5 | Bin 0 -> 24798 bytes .../f5cc4554214e4421714ea8f4650632b5.headers | 29 ++ .../fixtures/fa82576d5b7a7fc3ae596f5543219b2d | Bin 0 -> 598 bytes .../fa82576d5b7a7fc3ae596f5543219b2d.headers | 29 ++ test/helpers/client.js | 11 + test/helpers/context.js | 7 + test/schema.js | 377 +++++++++++++++--- yarn.lock | 181 +++++---- 65 files changed, 973 insertions(+), 437 deletions(-) create mode 100644 test/fixtures/096e5b32efb65749a3f9ccaba145c6d9 create mode 100644 test/fixtures/096e5b32efb65749a3f9ccaba145c6d9.headers create mode 100644 test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9 create mode 100644 test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9.headers create mode 100644 test/fixtures/3d3398816ac3ccbffdd2c4893406f982 create mode 100644 test/fixtures/3d3398816ac3ccbffdd2c4893406f982.headers create mode 100644 test/fixtures/49a2bac852ad6aca096d15a60f5ad23a create mode 100644 test/fixtures/49a2bac852ad6aca096d15a60f5ad23a.headers create mode 100644 test/fixtures/4b2d503f6b8f97b06e3ec6a3341f6904 create mode 100644 test/fixtures/4b2d503f6b8f97b06e3ec6a3341f6904.headers create mode 100644 test/fixtures/7aa73613ca81c364adb26ad95bebe930 create mode 100644 test/fixtures/7aa73613ca81c364adb26ad95bebe930.headers create mode 100644 test/fixtures/876353ef38c82797eaed49c94c919179 create mode 100644 test/fixtures/876353ef38c82797eaed49c94c919179.headers create mode 100644 test/fixtures/914da6a513e527c9351bffbc8879dfc2 create mode 100644 test/fixtures/914da6a513e527c9351bffbc8879dfc2.headers create mode 100644 test/fixtures/a0ed4659bace0bc088ef218af3ecfc10 create mode 100644 test/fixtures/a0ed4659bace0bc088ef218af3ecfc10.headers create mode 100644 test/fixtures/f5cc4554214e4421714ea8f4650632b5 create mode 100644 test/fixtures/f5cc4554214e4421714ea8f4650632b5.headers create mode 100644 test/fixtures/fa82576d5b7a7fc3ae596f5543219b2d create mode 100644 test/fixtures/fa82576d5b7a7fc3ae596f5543219b2d.headers create mode 100644 test/helpers/client.js create mode 100644 test/helpers/context.js diff --git a/.babelrc b/.babelrc index 3fb471b..550e60a 100644 --- a/.babelrc +++ b/.babelrc @@ -1,7 +1,7 @@ { "presets": ["es2015", "stage-2"], "plugins": ["transform-runtime"], - "ignore": "test/**", + "only": ["scripts/**", "src/**", "test/helpers/**"], "env": { "test": { "plugins": ["istanbul"] diff --git a/package.json b/package.json index 1c91266..d994dd4 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,8 @@ "start:dev": "nodemon --exec babel-node src/index.js", "test": "npm run lint && npm run test:coverage", "test:coverage": "cross-env NODE_ENV=test nyc npm run test:only", - "test:only": "cross-env VCR_MODE=cache ava", - "test:record": "rimraf test/fixtures && npm run test:only -- --serial", + "test:only": "cross-env VCR_MODE=playback ava", + "test:record": "cross-env VCR_MODE=record ava", "test:watch": "npm run test:only -- --watch", "update-schema": "npm run -s print-schema:json > schema.json" }, @@ -64,7 +64,6 @@ "license": "MIT", "dependencies": { "babel-runtime": "^6.18.0", - "chalk": "^1.1.3", "compression": "^1.6.2", "dashify": "^0.2.2", "dataloader": "^1.2.0", diff --git a/scripts/print-schema.js b/scripts/print-schema.js index 53144e7..e98d22c 100644 --- a/scripts/print-schema.js +++ b/scripts/print-schema.js @@ -1,14 +1,12 @@ import { graphql, introspectionQuery, printSchema } from 'graphql' import schema from '../src/schema' -if (require.main === module) { - if (process.argv[2] === '--json') { - graphql(schema, introspectionQuery).then(result => { - console.log(JSON.stringify(result, null, 2)) - }).catch(err => { - console.error(err) - }) - } else { - console.log(printSchema(schema)) - } +if (process.argv[2] === '--json') { + graphql(schema, introspectionQuery).then(result => { + console.log(JSON.stringify(result, null, 2)) + }).catch(err => { + console.error(err) + }) +} else { + console.log(printSchema(schema)) } diff --git a/src/api.js b/src/api.js index b3a2262..52d2bf3 100644 --- a/src/api.js +++ b/src/api.js @@ -1,7 +1,6 @@ import request from 'request' import retry from 'retry' import qs from 'qs' -import chalk from 'chalk' import ExtendableError from 'es6-error' import RateLimit from './rate-limit' import pkg from '../package.json' @@ -164,6 +163,9 @@ export default class MusicBrainz { } getLookupURL (entity, id, params) { + if (id == null) { + return this.getBrowseURL(entity, params) + } return this.getURL(`${entity}/${id}`, params) } @@ -190,19 +192,3 @@ export default class MusicBrainz { return this.get(url) } } - -if (require.main === module) { - const client = new MusicBrainz() - const fn = (id) => { - return client.lookup('artist', id).then(artist => { - console.log(chalk.green(`Done: ${id} ✔ ${artist.name}`)) - }).catch(err => { - console.log(chalk.red(`Error: ${id} ✘ ${err}`)) - }) - } - fn('f1106b17-dcbb-45f6-b938-199ccfab50cc') - fn('a74b1b7f-71a5-4011-9441-d0b5e4122711') - fn('9b5ae4cc-15ae-4f0b-8a4e-8c44e42ba52a') - fn('26f77379-968b-4435-b486-fc9acb4590d3') - fn('8538e728-ca0b-4321-b7e5-cff6565dd4c0') -} diff --git a/src/queries/browse.js b/src/queries/browse.js index 06bb8d5..3110358 100644 --- a/src/queries/browse.js +++ b/src/queries/browse.js @@ -3,7 +3,6 @@ import { forwardConnectionArgs } from 'graphql-relay' import { resolveBrowse } from '../resolvers' import { MBID, - URLString, AreaConnection, ArtistConnection, EventConnection, @@ -12,10 +11,9 @@ import { RecordingConnection, ReleaseConnection, ReleaseGroupConnection, - URLConnection, WorkConnection } from '../types' -import { toWords } from '../types/helpers' +import { toWords, releaseGroupType, releaseStatus } from '../types/helpers' const area = { type: MBID, @@ -115,22 +113,19 @@ entity.`, release, but is not included in the credits for the release itself.` }, recording, - releaseGroup + releaseGroup, + type: releaseGroupType, + status: releaseStatus }), releaseGroups: createBrowseField(ReleaseGroupConnection, { artist, collection, - release + release, + type: releaseGroupType }), works: createBrowseField(WorkConnection, { artist, collection - }), - urls: createBrowseField(URLConnection, { - resource: { - type: URLString, - description: 'The web address for which to browse URL entities.' - } }) } }) diff --git a/src/queries/lookup.js b/src/queries/lookup.js index 07d542b..cf5085e 100644 --- a/src/queries/lookup.js +++ b/src/queries/lookup.js @@ -7,21 +7,23 @@ import { Event, Instrument, Label, + MBID, Place, Recording, Release, ReleaseGroup, Series, URL, + URLString, Work } from '../types' -function createLookupField (entity) { +function createLookupField (entity, args) { const typeName = toWords(entity.name) return { type: entity, description: `Look up a specific ${typeName} by its MBID.`, - args: { mbid }, + args: { mbid, ...args }, resolve: resolveLookup } } @@ -40,7 +42,18 @@ export const LookupQuery = new GraphQLObjectType({ release: createLookupField(Release), releaseGroup: createLookupField(ReleaseGroup), series: createLookupField(Series), - url: createLookupField(URL), + url: createLookupField(URL, { + mbid: { + ...mbid, + // Remove the non-null requirement that is usually on the `mbid` field + // so that URLs can be looked up by `resource`. + type: MBID + }, + resource: { + type: URLString, + description: 'The web address of the URL entity to look up.' + } + }), work: createLookupField(Work) } }) diff --git a/src/rate-limit.js b/src/rate-limit.js index 92c31ac..9f07e41 100644 --- a/src/rate-limit.js +++ b/src/rate-limit.js @@ -17,7 +17,6 @@ export default class RateLimit { this.periodCapacity = this.limit this.timer = null this.pendingFlush = false - this.paused = false this.prevTaskID = null } @@ -27,20 +26,6 @@ export default class RateLimit { return id } - pause () { - clearTimeout(this.timer) - this.paused = true - } - - unpause () { - this.paused = false - this.flush() - } - - clear () { - this.queues.length = 0 - } - enqueue (fn, args, priority = this.defaultPriority) { priority = Math.max(0, priority) return new Promise((resolve, reject) => { @@ -76,9 +61,6 @@ export default class RateLimit { } flush () { - if (this.paused) { - return - } if (this.numPending < this.concurrency && this.periodCapacity > 0) { const task = this.dequeue() if (task) { @@ -118,37 +100,3 @@ export default class RateLimit { } } } - -if (require.main === module) { - const t0 = Date.now() - const logTime = (...args) => { - const t = Date.now() - console.log(`[t=${t - t0}]`, ...args) - } - - const limiter = new RateLimit({ - limit: 3, - period: 3000, - concurrency: 5 - }) - - const fn = (i) => { - return new Promise((resolve) => { - setTimeout(() => { - logTime(`Finished task ${i}`) - resolve(i) - }, 7000) - }) - } - - limiter.enqueue(fn, [1]) - limiter.enqueue(fn, [2]) - limiter.enqueue(fn, [3]) - limiter.enqueue(fn, [4], 2) - limiter.enqueue(fn, [5], 10) - limiter.enqueue(fn, [6]) - limiter.enqueue(fn, [7]) - limiter.enqueue(fn, [8]) - limiter.enqueue(fn, [9]) - limiter.enqueue(fn, [10]) -} diff --git a/src/resolvers.js b/src/resolvers.js index 2c86270..69d72fc 100644 --- a/src/resolvers.js +++ b/src/resolvers.js @@ -63,9 +63,12 @@ export function includeSubqueries (params, info, fragments = info.fragments) { return params } -export function resolveLookup (root, { mbid }, { loaders }, info) { +export function resolveLookup (root, { mbid, ...params }, { loaders }, info) { + if (!mbid && !params.resource) { + throw new Error('Lookups by a field other than MBID must provide: resource') + } const entityType = toDashed(info.fieldName) - let params = includeSubqueries({}, info) + params = includeSubqueries(params, info) params = includeRelationships(params, info) return loaders.lookup.load([entityType, mbid, params]) } diff --git a/src/types/alias.js b/src/types/alias.js index a6abb61..61ade82 100644 --- a/src/types/alias.js +++ b/src/types/alias.js @@ -1,8 +1,8 @@ import { GraphQLObjectType, - GraphQLString, GraphQLBoolean } from 'graphql/type' +import { Locale } from './scalars' import { name, sortName, fieldWithID } from './helpers' export default new GraphQLObjectType({ @@ -17,7 +17,7 @@ entity will be given as a result – even if the actual name wouldn’t be.`, }, sortName, locale: { - type: GraphQLString, + type: Locale, description: `The locale (language and/or country) in which the alias is used.` }, diff --git a/src/types/helpers.js b/src/types/helpers.js index 67d06ae..e242e9f 100644 --- a/src/types/helpers.js +++ b/src/types/helpers.js @@ -202,6 +202,16 @@ export const artistCredit = { resolve: createSubqueryResolver() } +export const releaseGroupType = { + type: new GraphQLList(ReleaseGroupType), + description: 'Filter by one or more release group types.' +} + +export const releaseStatus = { + type: new GraphQLList(ReleaseStatus), + description: 'Filter by one or more release statuses.' +} + export const artists = linkedQuery(ArtistConnection) export const events = linkedQuery(EventConnection) export const labels = linkedQuery(LabelConnection) @@ -209,22 +219,13 @@ export const places = linkedQuery(PlaceConnection) export const recordings = linkedQuery(RecordingConnection) export const releases = linkedQuery(ReleaseConnection, { args: { - type: { - type: new GraphQLList(ReleaseGroupType), - description: 'Filter by one or more release group types.' - }, - status: { - type: new GraphQLList(ReleaseStatus), - description: 'Filter by one or more release statuses.' - } + type: releaseGroupType, + status: releaseStatus } }) export const releaseGroups = linkedQuery(ReleaseGroupConnection, { args: { - type: { - type: new GraphQLList(ReleaseGroupType), - description: 'Filter by one or more release group types.' - } + type: releaseGroupType } }) export const tags = linkedQuery(TagConnection, { diff --git a/src/types/release.js b/src/types/release.js index 011f1db..9e30d5c 100644 --- a/src/types/release.js +++ b/src/types/release.js @@ -1,7 +1,7 @@ import { GraphQLObjectType, GraphQLString, GraphQLList } from 'graphql/type' import Node from './node' import Entity from './entity' -import { DateType } from './scalars' +import { ASIN, DateType } from './scalars' import { ReleaseStatus } from './enums' import ReleaseEvent from './release-event' import { @@ -52,6 +52,11 @@ distribution mechanism.` type: GraphQLString, description: 'The country in which the release was issued.' }, + asin: { + type: ASIN, + description: `The [Amazon Standard Identification Number](https://musicbrainz.org/doc/ASIN) +of the release.` + }, barcode: { type: GraphQLString, description: `The [barcode](https://en.wikipedia.org/wiki/Barcode), if the diff --git a/src/types/scalars.js b/src/types/scalars.js index 0e3b4e2..f77b4a6 100644 --- a/src/types/scalars.js +++ b/src/types/scalars.js @@ -1,7 +1,24 @@ import { Kind } from 'graphql/language' import { GraphQLScalarType } from 'graphql/type' +function createScalar (config) { + return new GraphQLScalarType({ + serialize: value => value, + parseValue: value => value, + parseLiteral (ast) { + if (ast.kind === Kind.STRING) { + return ast.value + } + return null + }, + ...config + }) +} + const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/ +const locale = /^([a-z]{2})(_[A-Z]{2})?(\.[A-Z0-9-]+)?$/ +// Be extremely lenient; just prevent major input errors. +const url = /^\w+:\/\/[\w-]+\.\w+/ function validateMBID (value) { if (typeof value === 'string' && uuid.test(value)) { @@ -17,34 +34,38 @@ function validatePositive (value) { throw new TypeError(`Expected positive value: ${value}`) } -export const DateType = new GraphQLScalarType({ +function validateLocale (value) { + if (typeof value === 'string' && locale.test(value)) { + return value + } + throw new TypeError(`Malformed locale: ${value}`) +} + +function validateURL (value) { + if (typeof value === 'string' && url.test(value)) { + return value + } + throw new TypeError(`Malformed URL: ${value}`) +} + +export const ASIN = createScalar({ + name: 'ASIN', + description: `An [Amazon Standard Identification Number](https://musicbrainz.org/doc/ASIN) +(ASIN) is a 10-character alphanumeric unique identifier assigned by Amazon.com +and its partners for product identification within the Amazon organization.` +}) + +export const DateType = createScalar({ name: 'Date', - description: - 'Year, month (optional), and day (optional) in YYYY-MM-DD format.', - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } + description: 'Year, month (optional), and day (optional) in YYYY-MM-DD format.' }) -export const Degrees = new GraphQLScalarType({ +export const Degrees = createScalar({ name: 'Degrees', - description: 'Decimal degrees, used for latitude and longitude.', - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } + description: 'Decimal degrees, used for latitude and longitude.' }) -export const Duration = new GraphQLScalarType({ +export const Duration = createScalar({ name: 'Duration', description: 'A length of time, in milliseconds.', serialize: validatePositive, @@ -57,91 +78,41 @@ export const Duration = new GraphQLScalarType({ } }) -export const IPI = new GraphQLScalarType({ +export const IPI = createScalar({ name: 'IPI', description: `An [IPI](https://musicbrainz.org/doc/IPI) (interested party information) code is an identifying number assigned by the CISAC database for -musical rights management.`, - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } +musical rights management.` }) -export const ISNI = new GraphQLScalarType({ +export const ISNI = createScalar({ name: 'ISNI', description: `The [International Standard Name Identifier](https://musicbrainz.org/doc/ISNI) (ISNI) is an ISO standard for uniquely identifying the public identities of -contributors to media content.`, - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } +contributors to media content.` }) -export const ISWC = new GraphQLScalarType({ +export const ISWC = createScalar({ name: 'ISWC', description: `The [International Standard Musical Work Code](https://musicbrainz.org/doc/ISWC) (ISWC) is an ISO standard similar to ISBNs for identifying musical works / -compositions.`, - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } +compositions.` }) -export const Locale = new GraphQLScalarType({ +export const Locale = createScalar({ name: 'Locale', description: 'Language code, optionally with country and encoding.', - serialize: value => value, - parseValue: value => value, + serialize: validateLocale, + parseValue: validateLocale, parseLiteral (ast) { if (ast.kind === Kind.STRING) { - return ast.value + return validateLocale(ast.value) } return null } }) -export const Time = new GraphQLScalarType({ - name: 'Time', - description: 'A time of day, in 24-hour hh:mm notation.', - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } -}) - -export const URLString = new GraphQLScalarType({ - name: 'URLString', - description: 'A web address.', - serialize: value => value, - parseValue: value => value, - parseLiteral (ast) { - if (ast.kind === Kind.STRING) { - return ast.value - } - return null - } -}) - -export const MBID = new GraphQLScalarType({ +export const MBID = createScalar({ name: 'MBID', description: `The MBID scalar represents MusicBrainz identifiers, which are 36-character UUIDs.`, @@ -154,3 +125,21 @@ export const MBID = new GraphQLScalarType({ return null } }) + +export const Time = createScalar({ + name: 'Time', + description: 'A time of day, in 24-hour hh:mm notation.' +}) + +export const URLString = createScalar({ + name: 'URLString', + description: 'A web address.', + serialize: validateURL, + parseValue: validateURL, + parseLiteral (ast) { + if (ast.kind === Kind.STRING) { + return validateURL(ast.value) + } + return null + } +}) diff --git a/test/api.js b/test/api.js index ac646cf..4917257 100644 --- a/test/api.js +++ b/test/api.js @@ -1,15 +1,6 @@ -import path from 'path' import test from 'ava' -import sepia from 'sepia' -import MusicBrainz, { MusicBrainzError } from '../src/api' - -sepia.fixtureDir(path.join(__dirname, 'fixtures')) - -let client - -test.before(t => { - client = new MusicBrainz() -}) +import { MusicBrainzError } from '../src/api' +import client from './helpers/client' test('getLookupURL() generates a lookup URL', t => { t.is(client.getLookupURL('artist', 'c8da2e40-bd28-4d4e-813a-bd2f51958ba8', { @@ -37,9 +28,8 @@ test('lookup() sends a lookup query', t => { }) test('rejects the promise when the API returns an error', t => { - t.throws( - client.lookup('artist', '5b11f4ce-a62d-471e-81fc-a69a8278c7da', { - inc: ['foobar'] - }), MusicBrainzError - ) + const req = client.lookup('artist', '5b11f4ce-a62d-471e-81fc-a69a8278c7da', { + inc: ['foobar'] + }) + return t.throws(req, MusicBrainzError) }) diff --git a/test/fixtures/05fcd912e8786fff4dca854a7fa44c81.headers b/test/fixtures/05fcd912e8786fff4dca854a7fa44c81.headers index 666a732..0b5601e 100644 --- a/test/fixtures/05fcd912e8786fff4dca854a7fa44c81.headers +++ b/test/fixtures/05fcd912e8786fff4dca854a7fa44c81.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:00 GMT", + "date": "Fri, 09 Dec 2016 21:53:05 GMT", "content-type": "application/json; charset=UTF-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "303", - "x-ratelimit-reset": "1481236321", + "x-ratelimit-remaining": "365", + "x-ratelimit-reset": "1481320386", "last-modified": "Wed, 09 Nov 2016 23:43:24 GMT", "server": "Jetty(9.3.10.v20160621)", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/recording?query=Burn%20the%20Witch&fmt=json", - "time": 596, + "time": 508, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/096e5b32efb65749a3f9ccaba145c6d9 b/test/fixtures/096e5b32efb65749a3f9ccaba145c6d9 new file mode 100644 index 0000000000000000000000000000000000000000..a681859a3c253d0b89a7ab0ecee0c62f65af5bf1 GIT binary patch literal 437 zcmV;m0ZRTKiwFP!0000019ei(j?*v@ewE7Sj+Df)W9Nu^K_EC(D?o_D#GVAJsZ$)M zfU3SbQcC5 zMt;N`88%~_Hk^n%#0vMl@R&>0RJDe>f~IDaTdtGSQYNJ+Zehjq5IDmlp%XIkms_(w`JRX!I*dN^X^c>Ch-z1{pIn~k;_Cg z;YvVPzS1iC@3%J(fQj(=d<)+o;<*5xV#wroM?NmCjQLMHtP99mvlh6;Q}HO)KVJ51 zjdf(}0kl>Iq^vryrt6@yYS2ch)>$Loy3_s65-YoGEGa&ZV{idyQJx_cBW@aFjgneb zU1NFhYr{F@vU*(7`5F7*!y^gFs^z30jrJhh$^woJL1&EWh@5gGG3E7ld$7!CWi3?= fzM+N}twv@!7U>3Ky&te?wYdKSfs=y{rUC!}EK%EM literal 0 HcmV?d00001 diff --git a/test/fixtures/096e5b32efb65749a3f9ccaba145c6d9.headers b/test/fixtures/096e5b32efb65749a3f9ccaba145c6d9.headers new file mode 100644 index 0000000..88a10b4 --- /dev/null +++ b/test/fixtures/096e5b32efb65749a3f9ccaba145c6d9.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Sat, 10 Dec 2016 02:52:35 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "352", + "x-ratelimit-reset": "1481338356", + "server": "Plack::Handler::Starlet", + "etag": "W/\"6e4fd0ce8e71cdb68d2f23d878327605\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release/d5cdb7fd-c7e9-460a-9549-8a369655cc52?fmt=json", + "time": 486, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/157ce6484de07a7e2ee93b54e8244e27 b/test/fixtures/157ce6484de07a7e2ee93b54e8244e27 index a5e5de01b3d8cc1af49d5bfa1b4bcd3e1340958f..9e1df2d20ecf80f95385ad4252f7c34b6015efc8 100644 GIT binary patch literal 319 zcmV-F0l@wriwFP!0000019ee7Z^IxE{VNf3r~pH-y|qh+4y~$oY1IM45g}o)urowa z{(FynR8^{q<&O8bd+%`|wt!i{k)8;~Hq+eSAQILC>VW zNN$Z*(x7$5grPXN*(_3^#=F; R>W^P|z5&o!x_$=&006s0mU#dG literal 319 zcmV-F0l@wriwFP!0000019efmP6IIz{FTUcjMhHiBiBJgK>RDA_^3d9FnGo5yEVSQE0s#&w- z+-#|ZH48Y{Fth&izPX$_@ST^@jHT R>W^P^z5(5?xU&ZW001`anPvb0 diff --git a/test/fixtures/157ce6484de07a7e2ee93b54e8244e27.headers b/test/fixtures/157ce6484de07a7e2ee93b54e8244e27.headers index 57781b2..b807e4e 100644 --- a/test/fixtures/157ce6484de07a7e2ee93b54e8244e27.headers +++ b/test/fixtures/157ce6484de07a7e2ee93b54e8244e27.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:02 GMT", + "date": "Fri, 09 Dec 2016 21:53:05 GMT", "content-type": "application/json; charset=UTF-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "334", - "x-ratelimit-reset": "1481236323", - "last-modified": "Thu, 08 Dec 2016 22:03:30 GMT", + "x-ratelimit-remaining": "363", + "x-ratelimit-reset": "1481320386", + "last-modified": "Fri, 09 Dec 2016 21:37:57 GMT", "server": "Jetty(9.3.10.v20160621)", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/label?limit=1&query=Apple%20Records&fmt=json", - "time": 1539, + "time": 582, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/215ca91efacd4b7a1e7800813c8382e0.headers b/test/fixtures/215ca91efacd4b7a1e7800813c8382e0.headers index 87bdaa8..1b8baac 100644 --- a/test/fixtures/215ca91efacd4b7a1e7800813c8382e0.headers +++ b/test/fixtures/215ca91efacd4b7a1e7800813c8382e0.headers @@ -1,20 +1,20 @@ { "statusCode": 400, "headers": { - "date": "Fri, 09 Dec 2016 00:06:41 GMT", + "date": "Fri, 09 Dec 2016 21:53:05 GMT", "content-type": "application/json; charset=utf-8", "content-length": "72", "connection": "keep-alive", "keep-alive": "timeout=15", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "575", - "x-ratelimit-reset": "1481242002", + "x-ratelimit-remaining": "429", + "x-ratelimit-reset": "1481320386", "server": "Plack::Handler::Starlet", "etag": "\"d54d2bc5c412c1bb3c02bfc91d13a900\"", "access-control-allow-origin": "*" }, "url": "http://musicbrainz.org:80/ws/2/artist/5b11f4ce-a62d-471e-81fc-a69a8278c7da?inc=foobar&fmt=json", - "time": 613, + "time": 396, "request": { "method": "GET", "headers": { diff --git a/test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9 b/test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9 new file mode 100644 index 0000000..3686119 --- /dev/null +++ b/test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9 @@ -0,0 +1 @@ +{"resource":"http://www.nirvana.com/","id":"4347ffe2-82ec-4059-9520-6a1a3f73a304"} \ No newline at end of file diff --git a/test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9.headers b/test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9.headers new file mode 100644 index 0000000..92a3472 --- /dev/null +++ b/test/fixtures/3a7c3d2d0ac8cb3923c301ccbe320fd9.headers @@ -0,0 +1,27 @@ +{ + "statusCode": 200, + "headers": { + "date": "Sat, 10 Dec 2016 00:43:25 GMT", + "content-type": "application/json; charset=utf-8", + "content-length": "82", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "542", + "x-ratelimit-reset": "1481330606", + "server": "Plack::Handler::Starlet", + "etag": "\"d2b2ef09f302f15cd08587ad1e02d9ef\"", + "access-control-allow-origin": "*" + }, + "url": "http://musicbrainz.org:80/ws/2/url?resource=http%3A%2F%2Fwww.nirvana.com%2F&fmt=json", + "time": 486, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/3d3398816ac3ccbffdd2c4893406f982 b/test/fixtures/3d3398816ac3ccbffdd2c4893406f982 new file mode 100644 index 0000000000000000000000000000000000000000..7af28d6bb2a2150b37ee3da9aa899843fd6e6f1d GIT binary patch literal 683 zcmV;c0#yAUiwFP!000001GSY+Z`&{ohX0D8a|Fn?EX%p=3)^9b04sJGcA#V`HR@QM zEw?Lz{`b*Y+~&h+gBCdiP!x)K^*$uCW-ZnT9dhqnhk?z->}kvTzM&oUw9~QquQj^` zdjrd=S@No6^QN!s8H28B#&s7U^xfu17RQ;=LLo1O0-kD9a-BNCtxFOuK?`jPHe=S` zVauTn^s(2~9kThFxz-QYhqlKVE1|u?1}Ue5y2IhfMqEsHx8dHmH)EtBdE2N*I#+eD zGS#w&Pdv;+Eh%N+AvBC6ZHy6Vp|x=ZM_C}3Dv!B#nc{Jwqyxy65D6U) z6$u=aBJ|-Qf~JfX{vO-t%Yss^r=Ic#`*-P0(VfJzA67OmQU1Y+ScU)q literal 0 HcmV?d00001 diff --git a/test/fixtures/3d3398816ac3ccbffdd2c4893406f982.headers b/test/fixtures/3d3398816ac3ccbffdd2c4893406f982.headers new file mode 100644 index 0000000..211d193 --- /dev/null +++ b/test/fixtures/3d3398816ac3ccbffdd2c4893406f982.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Sat, 10 Dec 2016 02:31:10 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "381", + "x-ratelimit-reset": "1481337071", + "server": "Plack::Handler::Starlet", + "etag": "W/\"76d4b01f2f2f2713907e9d82646b801a\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/release?artist=5b11f4ce-a62d-471e-81fc-a69a8278c7da&type=ep&status=bootleg&fmt=json", + "time": 590, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/456168a862ec0ca28127f067e3f166e7 b/test/fixtures/456168a862ec0ca28127f067e3f166e7 index 6bde522777c10004b4861576818b73f12050f2e2..52102fcbee7bed6d3927255d35d17535cf17d848 100644 GIT binary patch literal 277 zcmV+w0qXuAiwFP!000001C5ZuZiFBZhF_(bvy&*Gvc5nsz4h2M4ai_fTs44)jq%+p z+a;TA_OQocKKQ?%4f=VVqQ5{lt>ah#P3A{=Qh6SoB@Bz2pxe@t40KkFfv#w#G!5<` zfRz=8y?`+Lh?6?garUu#3Q&M?L7lZ5Ru$cx;7?L9j`SA2n~(iJ+=a;n=)S%S7*ej! zS@E(Y?%mJp0(pt<(dE`*doZ~LK6AO}-=Xv*RHZU~qibxqwkWh9Je@cp8Oe27_l(&- zHFit3&B?D{f0F&G_Wt)D*ZM$$SGKkd>e?{mf*X{YH`ubKY^}Ar6*~9orBRGTiP|uU b!W?3<;wp`{u1>YoO2YmNT`>#`9|8aX(`|}9 literal 287 zcmV+)0pR{0iwFP!000001C3G3Zo?oD{FRDxR49Ra3;RBE4Uy>2e?{peh4#4hg(E;(c+Rd(g~1mxoDRDKj)$K*O{Jt~o;2F$6S{ z=}HWg+97lQEX;bty!sSQSN$Kt+Zr%t{#c9#aAwETX({+?nAauazg_M#Thy;T$1}&z zvpqEaAMCQ-@TPe;y7?x^S#5=FKnp{Gab`ej)<8>}sFGl7$<+i=_Yf%+F!$ZrN8G#4KN006d7g~b2> diff --git a/test/fixtures/456168a862ec0ca28127f067e3f166e7.headers b/test/fixtures/456168a862ec0ca28127f067e3f166e7.headers index 50171de..eaef6b6 100644 --- a/test/fixtures/456168a862ec0ca28127f067e3f166e7.headers +++ b/test/fixtures/456168a862ec0ca28127f067e3f166e7.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:31:58 GMT", + "date": "Fri, 09 Dec 2016 21:53:05 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "180", - "x-ratelimit-reset": "1481236319", + "x-ratelimit-remaining": "368", + "x-ratelimit-reset": "1481320386", "server": "Plack::Handler::Starlet", - "etag": "W/\"15092bd7b55df20c4f8fd072b82a0f1f\"", + "etag": "W/\"05d3a423b0b8ea0f99c184f8131c7cac\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/artist/c8da2e40-bd28-4d4e-813a-bd2f51958ba8?fmt=json", - "time": 426, + "time": 419, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/49a2bac852ad6aca096d15a60f5ad23a b/test/fixtures/49a2bac852ad6aca096d15a60f5ad23a new file mode 100644 index 0000000000000000000000000000000000000000..823b1df04c01793b9e7219f71e744a78cb9d3292 GIT binary patch literal 431 zcmV;g0Z{%QiwFP!0000019eitYU3~v{gt3|1|*McNx6kwyRf%CEK3_c&1ZOQzOQfmLyyKr z(}8B~!D1nZgeV7*i{9B}`a9wiPnG7p+D$K9rF|F+!*Zh9_Tkz9J8eXz0qx{H@_uZZ zOh5}dKxd>Wb1akR`NE=N->x%U#o&-JqbBeevY3&jN)e$8ku7@5mV)|zy!Bp7_QX2iDjZ3z#?nqDc^3E+PPf>rh9XOG7)|!3Ntqt!={* z&gaiG|MmE3T2|Y-=Ys@w_wJ$j-40hprdXW@Heg*Ou#7!~Fcc^}F!$bS9=euZ+d;;E z^1Mv-YsM{}_39(7&m5i~empF_wz;>Egb%ED8Df&?k_kaGCGTDNkIoO4U%Z@;)1{uj Zu;2S4GqqxVZKAg7{V#Y$nScEP007!9)Lj4o literal 0 HcmV?d00001 diff --git a/test/fixtures/49a2bac852ad6aca096d15a60f5ad23a.headers b/test/fixtures/49a2bac852ad6aca096d15a60f5ad23a.headers new file mode 100644 index 0000000..e71c57b --- /dev/null +++ b/test/fixtures/49a2bac852ad6aca096d15a60f5ad23a.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Fri, 09 Dec 2016 21:53:05 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "369", + "x-ratelimit-reset": "1481320386", + "server": "Plack::Handler::Starlet", + "etag": "W/\"617be9e745c8ab9b5097353b14655232\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/artist/65314b12-0e08-43fa-ba33-baaa7b874c15?fmt=json", + "time": 416, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/4b2d503f6b8f97b06e3ec6a3341f6904 b/test/fixtures/4b2d503f6b8f97b06e3ec6a3341f6904 new file mode 100644 index 0000000000000000000000000000000000000000..076d79f754224344d5a90336de6da0b14b700923 GIT binary patch literal 204 zcmV;-05ks|iwFP!0000018t7YiUKhZgkNRpa~fvI|6KPG#FKbP(mfIw6ET^Ci0{5x zy?U&V`lx!smRH7h3k8-Za3LmG*041e{|T0|Z<~O~ms~#KB_OwoayABMOqIC7a)RRl z&I0=5#+Zi&lOdV{D|E>!lv9itl_d0<64UC`~3ZS~%tyU!h7)$}3fm14k3`p*|R zwjqDlE}Lfhi1ZL`GvLGY_`&vQ*ROrIY{&kN4E%UW8$&(V8&_W~?O1ooEPXe0{RpkS zL3;diw0*zG{;1olj$W-S-RJetf#g~P2j2x8@^}9vd;c!-ntbQRmW8rh17o5DX+;H2 zhZ2NS3@uZJ(-C(a{oU3hhU_PD6uO%uCp)~BqO5Q0bO!Q2!Si8#&UwQRw6eiHkB?s- z@-&4}209wmZ3vX@E6Bgs$EyA>;EIg}>=Ag|4gJ)2c zlnF*5#(-t?Mo;MX=;tV6*MGKs*iGo6TlOAzFtX#=*KRrDO!^FC@=Xh7m{w<@XWuoA zbzQ&0YHK%qvduEtxPN$9+@G*gx1YM^6G8O39mgppAjSy`?36LSlP4Z|x&tQ06oBMc=qDCGlKCj~^uRYV`CKH>pQ{fKu- zRsHqK=rdwBFUsa!iQO}Co?F1t#C{h48`Aw6cLUxI;?nx-MRsX>XM6j61oNUSZCNL> zq0~j>4p1TkrM&`&yaXFbOiWo6HkK*WGdMmeARFeLaIv&S01>PPRVo3_Mn#7(fqIq= zOjP+|tHl})Oo1q$=<*ZPw{Sj^^4oTGk-tRFzwiEAWWU&DkJxT-oxjNF?HblfTgHqx zpeI-jB2*#-2%>O^K}Ci|f^{Fm129hj=Bd%;uYmAK@q9@pCWK#-`5OaxFScv2PPBzdm5g38AT zj1v_iR)K4`momRMb{K1){nmC=c=NzR;5m(bUb)C<+qz^Oxp6Lf@UcqWi0XDy zLKI#i4?;6G({T#r4P8YAOg>E`8oCrJnqrd>fGTJpu+BKp!ikF0d@7vVYCK(kM_s4u zZ!+Q~qiHaEzob(1wmmD@X)86kWF{HdY+l8Go(#QZ`E4cgtAuDbQFklERL9HXq)@#{ zee4!PgEnNJI!_MhUDwxiP}}5RALRY3%4!N_lJXcG7~=#e?>yZeOa#FSS8^MpV6}IvTQXN{)?Li`|ktP=hZhwnIhwC5rIcwEu=o?~Cr-G*2qTk^A8$g literal 1392 zcmV-$1&{h4iwFP!000001Jzi`Zrnx?{S|_ToTh-@*zDF#N&p+kW;pRFFoIqs!W1cx z965rZe@}7IY$8V*OF>{khauTr%d1yQ_k9{F|F>y^NzbZvS+3H;r)McA#0i&k;M_P6 zEXzRqEC&%dlPr%}pgdiru3lGNbB7z=UErfHT61lS%eCo>y27{k?h@sP21cpUbI*wZ z#kB_>JpOW)1JgDLu0#+<Y$&FvStjIn#g}L-Zk! zPD$L}E5zl|lxasMpZbk<-yIm7} z(TxsGBF^s9%3Sw*&W9Im@~JAi;FI%9Q&er2oZsNetALhIm@=)RC5}R7XavFWm&$|( zDS0lLGseq+Yumc%;N_y9V*b#-Y=WDfW8Hi;jURz|402nq8yEKcvf;9*9=~tkfm>6q zdywuQ9#;2zf~|31Cdp4Q`OQ@BF8L*dU7OItagYOJ=ZL^2BOa>h-fre=NJUVF?LGJ7}PSS zit4s5Z!vsdi|#62WaJa7^>}ZAoy)CVl>Wf|U&7rg`B=ECF)AbAhO@x60EIaMLO2h` zat6^-5rgx{zKCllDbwa;l6J_Yosb_V(>%O;5!k}(y;e#_2GqxZ#U}6b+FM|XM~S7v zNcq~lF52WKH0^v&_dp*A-`HlEjk(D@FmEJ?TrjXE3J6?zWpd*Q)5~hFP16*?pAht= z+}#pkH|Q6}U9FM}(^%7(g#tXdp)k=xpcd^81cY<~Y@j)qh?Pg>S!QCsWx*sc>BXlH zFDx7>)rtZU!14tG^f+%9%WRP+&sLeiCoK&j$|;b8Pbvh^%zN-Gvmtm9NyxT7{c6@t z2vzc9{m((>;G0!4eLl6apdWcQAIFn9v|oHqqW2@u4ombLe?~rtsAyjXl;sA5rUJB! z5eP*?S=63NyT$H9Y1*!E$?sK-oT&T(fHR+GL40+|SV~fiw{VhZ&?cfc!C(QQ!~%Ac zXmg4-z`4|wjOJdSz zE+y%FXb#)^pI0Hd2&OB;rmzAK z5p}*@ya4*N48|w7wZj64-|D77Xib?O3&}U~VW_dk2BUAOxkEF*Z1B){suyoIJ$-is zdPUP5Q|`@!IJT&_4%~wK-$Uf)Id}Xp`hNs&6R=f!Q<$oLqrlC!+!ust4*LHh$fp+P z*Js?`_-17wXp8{vf(Fj1>rb~46z4i;oLJ)Hc0By>cuE~4P8W0g(EfzrluJX);hK>x zj964IAd{Yh@Ho!c+$b=jKfZ9yr3vFHXa7E->2DJ-5}Rwh;T$!}y(y+)plGY%XG+FD z$_P4{QPtCH&i?5#>t~eg>+7SZR+DGKPzi*v9JpZ`tn@iBD+p3vC_0?2i?#+%r34DD y_9NHdUG(bbHKM0w5d*Y0rs|E`22bD^oa6tK+lCD%9_BcjKKu)uT#@HT6#xLXPqHci diff --git a/test/fixtures/6044ddc15443664659ef91c3c73c0776.headers b/test/fixtures/6044ddc15443664659ef91c3c73c0776.headers index 8d177cd..e431efe 100644 --- a/test/fixtures/6044ddc15443664659ef91c3c73c0776.headers +++ b/test/fixtures/6044ddc15443664659ef91c3c73c0776.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:06 GMT", + "date": "Fri, 09 Dec 2016 21:53:18 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "289", - "x-ratelimit-reset": "1481236327", + "x-ratelimit-remaining": "225", + "x-ratelimit-reset": "1481320398", "server": "Plack::Handler::Starlet", - "etag": "W/\"6a12c1ded7c7c8d9315107669601ed70\"", + "etag": "W/\"5626413881801f644e96284425f962ef\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/artist/300c4c73-33ac-4255-9d57-4e32627f5e13?inc=artist-rels&fmt=json", - "time": 556, + "time": 496, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/69d9c8738fe3ea4883276fd8fc9979ce b/test/fixtures/69d9c8738fe3ea4883276fd8fc9979ce index 71a1ef19ae5a17e79c37ee4dd73d816e74aa1b65..32d0ddc0f952ca348077ef5b1ae90d0ff4a37bef 100644 GIT binary patch literal 800 zcmV+*1K<1~iwFP!000001FcotYTQ5!{guVfE0~)v)5io_3N7TJ^reI{7fovL+F|T% z2}}OH8rz%oZoO#(^^-l4M$$P)@*#`Zn4#|4K704=kYVeyckRAuw%PFXh)~mKmRnS= zU>dXu1{4|wnllSrgkVdKvJyPoX1zoL!K9uxUv>(k!vVJ#S2yC%$8zI5eI0^4k_dg z2i)9XKWuKho$a=pFF$astv5ScKkUt1Af3$-G8#B357-KeM0`aoDRLCS)VQgOHg{_pmHu&!enyVxv<8>1L0oeQhwojKE`hRHiO)KjD z1-ut*k_7v<9@WF9hYKb|rIb$Uc}NK&MSM05o(Av^V^5tO?GrGv@X||Wph_f4^z`Pe z1fdBrSt(RTpXtpOL~kAxNQWAvB;D)M2a1=v6p~ry!_?z<6VV)jbKSlj;?wc7sRKg) zXxb#ClQtCx&OxX@KzgCz`Eq6U!*-O^noN!(wMjF!BM$0zbH0+t)N`S;q79R>%1I#J zC<%%O4dVhX6}MVxM=RK!6n*;x+t$<Afu6XRpoHLw4KPi|CE{aDX4GuFhsGM0^< elOX7wgP}hTgtDZ8als;~;`uiXo3``H2mk=wrHsA+ literal 784 zcmV+r1MmDFiwFP!000001I1R`Y8x>S{S~8U59qcRnGD;TKyFt57 zDZ&5V(e65S9J_6xrG8q;(#)B2&PaM>p&9JPHMd(kHhssgSf85PrnBuTr0r&dY1MSA z&v&@GMmx4Rur=%K25I3Z9P{ij($p<>0TVQV=2aO~P~1YTOaO&}zPwW)jYF+!joKR8 z(hOZQu&b|(&p#o#l(p7|-K^R8<9<$&1_CvY=jg6Pu8OEZc{HGu@L;MCDVZ{rRNV0p zbM*TuIE8APh%nq+s_l_Eq}nKoFj{~RAT_Ne?Ch%Bw(azZG>EnxaJObQq0QTxp$8?( z5+wLO-~{{KHGFvgC4*h~_|QCHy6^ior_WHm)W$20P}kOhb~1vkbOENcvT&iY5s}so zeH!6Rj2FrCxIy5O#onOZxJsd3v8;lZ}sY^}%R z*~x1AmSi`(^=s)TtCtdZ4WeX!RfaKb@iN^P)H(ED$tO^fT~On2-26_3W#u#W9hEXU z*++w*$;aSORDjYe6hW4phv)3i6`s=n3sLg%ILwOtX8DEKM^V;C5+9RP*U#vgN{dzG zQd4QdQ9;_$0q81DJ?pDlq35RH{Gv~mT&+>)iADgD0!=-;bX2 zu#XPMGZp-S18-h;sJ*2m7k!cc{FN_e=V5JlzSE^B$$5pMn~g4GaMHS>EJ{~v$9B7$ zskY^gnxXlA+l}eRemK7tDB?%kp5A~N&U%8qPs@Y0j!#z;JtgQ{fTcc$SXHE(j}GZQ OvHJ;r!^s882mk}LyiwFP!000001D#Ymj@vL0y^6sq0Zf1tX@1-V2#{hCV3DnYzzBvSI`olER49LjVTs+R&Zz5pNQ z`)TY1s@sj@iLnw22a0BfD=P9#Qp0pc19+#D^Gv#&jLP|N)+kdLKlkfTNM98-1xtJ{YrI39?{CfL75hA&H>jud3o3U_G7Ne( zC$WjiaD*{wl+=QAOYnG|(%NHRh4R7+2Gj`asR$ldxf3+AE=XZykYLFv1>-*_;^%%m zhPJDd$I4g)+BJX@&;BCZYE5}Y1t&MHeL$9pM`5kgUTG?W5>zT}D1cH_<_dCFXrD0JNpp1LOn?MNMWI z)u2o+CD$1wWj=PWadEwcKGsP$S|MqCVR6)aVssgd#kv}Mgkm|(Yd^dZN#1Iz@2TGQ zKV}bg0y;<4vy;XKfHUS#8g}9Eh(?2LqX)CaDaqK89%2&~M~4(2+@NmJ`p6D?JQ}voA@!aF zqX?uvm@IhHKnFmvOfs4x&uA&3qKp@FKtl_c`ZM?%lLj|R(-nW(WlXf0 zpi(eNMOn18k-oH&R~18$Wm$A5{-5Z^-BjMS#0mE*{&s5(-g)jEITb|%RA8FXs>(as zVUC!Uf?=MVmD0HAUT?5RccF3~@j7Zyp__#HUoNtOF+rYU(yI=s8$bvB>BhlAl?p#A zG~r}2xJ(eIteBxNR-@gcXNF#Z!+BIz2JVjiy#jh8Lo;i=@B3wDz9U$nV=D8oL91{Q=DQ`@SA=1AR2T`0=WE-R=38 zcMJc72CY}X+vtC=;b(q?%{;A#-NzSsYvdmioE{>{5*f_!cAzu;>J_#`&J0_> Z`xU);=b7xwInk4U{s9eJHL!99002Y^9t;2g literal 0 HcmV?d00001 diff --git a/test/fixtures/914da6a513e527c9351bffbc8879dfc2.headers b/test/fixtures/914da6a513e527c9351bffbc8879dfc2.headers new file mode 100644 index 0000000..237dca6 --- /dev/null +++ b/test/fixtures/914da6a513e527c9351bffbc8879dfc2.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Fri, 09 Dec 2016 21:53:11 GMT", + "content-type": "application/json; charset=UTF-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "560", + "x-ratelimit-reset": "1481320392", + "last-modified": "Fri, 09 Dec 2016 21:01:38 GMT", + "server": "Jetty(9.3.10.v20160621)", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/artist?limit=1&query=Leonard%20Cohen&fmt=json", + "time": 419, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e b/test/fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e index 8a3c6f95c78dd302d5e80752f4a19b955303d875..83131c68bf5377bb064ad7a07064858b1912f4df 100644 GIT binary patch literal 410 zcmV;L0cHLliwFP!0000019g(St`jj3hF>L`dM$bHn=L60LLgC5p;OG-<6yk2f+BYD!#l8K>|is;5=oA9*Q!;0Ak4>LdoDPvyK zHXb@^W!Kh&Xs1Dowv&5-rXev-Q$G@^UKwJ^bLq#%o47&Ms>L+ING(M>j1!A{BbK4j zYLR`tDEXYn{a=l-%A$iiK>WkWj~_V9HamufPrDZ)w|lX^OuhRi=t4ffxu-FgzIs1& zqOL_VavMg%V%WQ^flc*zDxz=RX41RQjG@Dci~q}Sa1)MwhwO}$%_v%I_ROV6(JY-L zl-*Rb>D-%wVE+bD3l;Qs(+?w(?JUlHZS<_VYSs$2 zFjLgQFid`3mMvtL7b)O=bH}`F?wn@YGSHAAURF&}K zGkdxAhO{x1QNfAO%SwyOMaYMEcu)QRP>Pk?FM_p+WncYiUB#N+aQO|h1|Scf0ssJL CD#X12 diff --git a/test/fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e.headers b/test/fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e.headers index c1f62d0..6bc67d8 100644 --- a/test/fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e.headers +++ b/test/fixtures/9247bb00fc5e2e0dcf1fcd269df8b94e.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:05 GMT", + "date": "Fri, 09 Dec 2016 21:53:16 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "697", - "x-ratelimit-reset": "1481236327", + "x-ratelimit-remaining": "104", + "x-ratelimit-reset": "1481320396", "server": "Plack::Handler::Starlet", - "etag": "W/\"9020613941ca4d7631fab0e7d51d077f\"", + "etag": "W/\"17516f4a3648cd4259751af5341b0d1b\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/release?label=cf7fc5cf-e011-4ef4-b511-cd0188537910&limit=1&fmt=json", - "time": 390, + "time": 420, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/97ec62634d0a8953ab3ba2ffce984a83 b/test/fixtures/97ec62634d0a8953ab3ba2ffce984a83 index edbc263ec54f6c1324351e210647be8b39e288e8..4c8fb882ebaa0307b4bc66de6744be50208acab6 100644 GIT binary patch literal 1674 zcmV;526g!#iwFP!000001HD+=Zsf)h{S{&!yf528-!FQL4XhJ;7jR%FK@bZ@b$7Lv z*_ok0ayAfz{dX7V%DGCT)kY7JNOm{7PMtn=ijR}7X?r$@8BT5{AJPxd_H%rATm1ry z>E!LCf4E0hXL=Sba%GBUDq&zsiNu1-g?XidlZr>43r&C)VRG|0sk??LVJ#CZH5t3f z&3`68em}W=JIQqivsm9Pps$-btxU7l@BhcV?lD(C*YmsF%;^4jb4L%C+w$Oy24NZJ z(lG@xuxPVmGHQ;%wHKHtUrxUj=lPG-e&>tnbQLT;`32jKhR_STdA-~?U;PLvw2?;f zA&iK3_56>caOF5$_Wp1G9LA2rcwc|U_P%MRn+THBAt{c`dx%U&Sr|BNSg;^X%nl0T zOIQi>n*!4gx1gqGI)&J@tEt43zHjTe=#hPf>0$uvk*4<0-eJ$ybJm+5 z4PN3ptLIHSz)COLq;8pw%|+KN+Jr2%nCpJE&0M#b*1IlE`#)%hfYz@Y58M&nnZ$#) zf?01I)0j9Bp6KN@V#(-A@|MDV{AO!k3DO9SJ-lvD0TL)FTj*9&BQTgQj{GGz*D{F&sG?AtqP+*^*Ru)%~i}U#%lg0&=~M zjHCZ6v~7I{6!{N?LBEMM64@mdQkj6HGKE_*2_Bd+N_)pqs}wJn>E&|OX894{cUZhg zPM*cbCCWQLDPwV9GLsoB(@skkf$SwJPbqbfxeV8A=Df5|M6h8)aJmSdam|D~k*BLj zupTuV(8Rpcu)bX!OPJu%TOJE5QW{bNW4c2$}jDu9#+88n`#*vjp zr&!>&up|W8S|1fPC1;QR3}+GBVN;Px!pk^sBI;y$U;zd%P0a=ilw~GlDbWeyu@qa* zpL*wWl;H0RV%NhA_hSzwC2dt?E|oOAT9eZ-NCzl7sw>W8fPGxI>zu25U*R6FBH5Mr zJ-hP0u#i4;6W13~(isxLL1*|;0~4X^s=Gx^^Xb_XAy=Q9L^PP(jzx=H19zvD?Tpgw z86bpyiu-0eQfM&}Wl{-)Op^#j6po=x3PqNd^SsZS^(yCBv%_Vzy8~t1XZ)TZ9c#?1 z)9jivw+{JVy6){Meog^!wIT1@MNfh%`c?{5@4KZo1Hud*g zornMDnWpP|XmM#)E>wdf91HXxvE7mGr+T(m*v=G08n!J2Nei2i>>oHmzaru06}6Ez zdGIou!sY2gu);lPDX3tOb5y!89mv20w3cNAsijt2bNe*z5z?nE@Xu&=&L!q04&(&z z8#L)pciAW$Wu!YY<73>11-E60`zS>f<#TKWAP6`DfPVSN|Ar zAxozvcZAaiXdgB(VN5x2I@1W~>0ncsQ4?RWI7Oa0TOs4_01PuPXYBrC(>Hf5+z$um zoWt32;sr(VS$P@Y{)*2jFX4Gt$Dt*B>T5yP!ey@&lZou1=EK(lCp1&w6LlrRV%A3t z{}G|3wAG(*lnT14R*x=yE?D<7T1FQLr5LE{YfS}q_-sKgpPGJ0=3ixgjf~uGYBm_d zGe-s)$m@BlX5#sVV>6J(=>G#{=MxI|Q;V)W}g|DwcisYFA5EPnRy_e)~aP Uc<+>?w($1LpCKV=QH2-)0L0TKIRF3v literal 1669 zcmV;02737)iwFP!000001JzjDZsbG|{T0g(@RFAL=Dy?&khpFn5DN&w3RQPkCuV2H zk;k(rit_K2=azBC&P;X}5c?4AwB21@r%qL!@_h*{LV0;#E}OPv3z%bhS^l)BJ50rQ z_2N1;^YWss6RkS1l?GuL=h89-(z9TaWin`vz_k;Y=-pH=VIJ!16?Ap8pnd)RWy6#( zh6xs%gv;{sxALpc%QqM0xW$KyGB&G4*WS@Hdhw#X#zn%GtuLZXQb}=OPWi+XCi-6t zib)?(E2mL|r!C#xEp9dhgIrZvGZoP@r9@=jrcC>lw^H%IQ>G1M;*Sj+i`8s)Q3kxO z7k}&k+WR06ePFM?`T4+)SM@t=Z<}T|1w?6*y3#ct2c39Lf5r*SarzW!EDu|c26GAvGuZBquK+) zF#og%PMsl;3Y8)B6!AFC&Td=86Ld{*~_J6<`y*26ZMyU;#z!&Z@dX9P2@ zvP@&-#0{c0(Fk)wo1-%uZVr&}lY%dy2&cN>uQ zu&e_yuNO_bL4Vao9K1<}cb86ei*f5wZrZ<~P2|}9(6cAdDitVGD$gpL6w?L?S`mOH znRr!&ER!}*p#5>)ysa0X7FW%mP4Q(t>nPe6#p@e<#F~B-W3NqNKhA=GH3%cnj>P2v z?Lmm%Ort+>jpMt%$klPgCL(mU~kI(Ag(+%YW$}cEXrSRS{u9>hS<>fum4l-m5Rbn!MVcKfR0+2FA z<%p3M5|{o|#h{BBUrwdKfogkIFB0rHFL-cE-|j4mkB z@?#!ss(I1mVknu5Pl{igRd+MgHCxN&K%i7KSwzD<^Uy0)8h4l{K$(y^2P-IgQcMYy zInD#Nz4<^@`a>1UQy!k75C4-EdgS#~4?Ppw_h!-$DEM?Lv(|d!Fqx-cxqr;QwQ&-chcupdP}lhC0S?U= ze)(R`dE_o=pawNa?Ga3@E0C62{_DrvFv9Uyt=R#z_@_X{}KGW-4@#FQU|`iwU*L2OdF_5FzFcwiqwDjNMFur zZ?p`oTA+$C%C(S&|P!1%D3anK%)Tj_EBPl9= zp)hkDH{DQNwQJm@`aD593m!84&->v_+)M5A13q^i`*A3XTen?mJHxdSR)}oSF|lAA z(+N9}6;~jcNhZ@w5vNM4RIaGy84vF(@@06=Lhl>Duj;$E^wN9A@6*`O5*P)_$+Iau zAJ0qk$yjTL0>sG2w7N)y`hmiHTwY*?_Arj^#j7@{68F%p z^52;h0=r2HEr{ccJzww5n=|XeE?^(vscVl1Xk+X{W?R0QJ=E>7A-|gWd$#>@WXI-%e(k1v833b+KWXQRWVTGXO)sx)AN5g>(%;5Z@_Q3ff! zEM%;w&IFa0buGZj3PGXPP$3%d1@efJ`qFj*B$fGrWln?!rTK(}`>?r*oQKprQP5iF z-f(G^7GOi*AfvH>G1ee_sIUk=a96SGpb#Pk3d`0w{zdBTj4a5!e;n1oe$~d<#a1OlXm`kua?-q9r?AuX4tIh=}(y7 zC9t>L{8nED2fhUNH9J9;UX)Z+X%eFfG6Fi|fzS~sbf}E-H?T7;%K4|~GuBA=?|SGx zD*H~IHG#OQAbPGq*}5WpxP!tWcbuD0I`w}PNiYhrx)oQi?mYti=L@}hbyqka9*1u= KwOF9P1^@u!r2!8B literal 523 zcmV+m0`&bKiwFP!000001FcoLj@vL0{gr^V2cUR~au*FGe z{~k(N2kR4FC!MI#yurMK+OwWkgag5{@3tH0VjL*5IiH;t1~&h(XPZ8)vEM=7ZHUd; z=at*8*^GrW;M%3-7IW&_QYi1R&uPfudkQH}&A+12nw}^2GKyMkVljSQ`-xSH-MP>!pV`?fO#A$ zc%^_#;JUQEXBeh=QH#c@+JGS=KnfMXaYU%1Bq@WeWc2JX+y6(#A7}46`}Y-_7{6wj zGk3kDcDcHgf~iG}V7#qCDW}02Za}-*NKt9;sJ^4;CE3AnX_XdWi8#n;EMSZt zM4$#M3dCK*ZtGY?G*FGS93Ax~y}s@yd2VFqA5{B@OwWYq1Cmnn*92EzC zPseEr$vTL-5TSGllOh=boe5B83KW_eqr!DFjp{shg+0gp$0Ksi{e=lmJ#tt)8lE%G zqBT^cXdnizKw00E1-OICA$Ob`s-61iT_#7lgt+R22jg|L)OYmQ=4rjtzm)H`<^5b8 NegkFk@MOOR004<}0Hgo_ diff --git a/test/fixtures/a81703ff2de3c55fdf82ff4d0a1f5052.headers b/test/fixtures/a81703ff2de3c55fdf82ff4d0a1f5052.headers index e643e66..ef0a1af 100644 --- a/test/fixtures/a81703ff2de3c55fdf82ff4d0a1f5052.headers +++ b/test/fixtures/a81703ff2de3c55fdf82ff4d0a1f5052.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:01 GMT", + "date": "Fri, 09 Dec 2016 21:53:11 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "147", - "x-ratelimit-reset": "1481236321", + "x-ratelimit-remaining": "559", + "x-ratelimit-reset": "1481320392", "server": "Plack::Handler::Starlet", - "etag": "W/\"2dd0bb83c0e5e4f352ffbf3a1272050d\"", + "etag": "W/\"d4f25526cc965da41321e414529517ef\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/release-group?artist=c8da2e40-bd28-4d4e-813a-bd2f51958ba8&inc=artist-credits&fmt=json", - "time": 439, + "time": 416, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/b1df6f5637b0de25ce9f54874c8ecffc b/test/fixtures/b1df6f5637b0de25ce9f54874c8ecffc index cc077d030492851fdb196d8cd77edda4f6072727..4db3b60aa3fa16b2b3fb7ddda789ca1e288e8fdf 100644 GIT binary patch literal 633 zcmV-<0*3t`iwFP!0000019eo}YTPgo{T1Wq9nj6PmB)~fKq(Z`K9x{(8Epi+c97+k zu;kx6_By+{`pF*6oH=vm$cH+G`l43GHe4AFx?u=PISC!>8W54S)(g|=5b90c+dWeD zU72hy)!kJ5F2#s+vc*1Nh6POOAcJHUI%xt(4D{v+Q5c6xb_$g>R1(r?_bzQGThh=| z9mUevr?I~HU9mB+tmND8Et)W_yTwU$+ZRn zeh9eqxVePutJ@iQo$ETJ-c5P?Kn3HF3w#n^Ce*s=V%xQ#jR>H48=-52hv2c{=34=10kQTrca5h66 z_fO&Pb~pQB-q6tvP9u{|R3JSXkdk{aZ6Lv#_38{m%Dz?6p(dhOa?k$Z@YdmXr4t(a1t82Jj?D45+8F$O)oO-BjDLJ{R zApEtvX|6v|PO*851y;M#AZc7@IZM1oU&eBrIp?AW9}V3^fsDrDEuiocc@UbhSIhtT zfYl}1vZIb~XI-P4ic-GX`9INe=NQPO)ahS4y>2*@>m# TsPP%~`TqGo!JBJ@)&u|m1W+)gNx_r%fHwX!kB{CtK3c6Ef{uCUmxKl;s*26D>$93^*NH5Kb|) zOm!Rs^^QX>urmJIr-GsSnEGuP_9rD5^|wt;f)K_R+t1`2Zqq!O8^wTW5R$f%ZA(cD zU4OfPP zZWw}66yAxJobxD3Vb{BEjaqG>(jZW%o*J)EVwp?lypGhl4ApeSZwICH>7 zjIQMNO8P=3xz93B5BlwIVm18VyDLJ{RyjMy7f%X=gw^*)sE?IDP z9INe=sBuoj3Fe30O}L_*F3g`-#3BE*In-|i?}w=``IV~lhqx;D M7t4`8gw_NA0G1ywDF6Tf diff --git a/test/fixtures/b1df6f5637b0de25ce9f54874c8ecffc.headers b/test/fixtures/b1df6f5637b0de25ce9f54874c8ecffc.headers index 28dae79..870ae58 100644 --- a/test/fixtures/b1df6f5637b0de25ce9f54874c8ecffc.headers +++ b/test/fixtures/b1df6f5637b0de25ce9f54874c8ecffc.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:10 GMT", + "date": "Fri, 09 Dec 2016 21:53:22 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "255", - "x-ratelimit-reset": "1481236331", + "x-ratelimit-remaining": "263", + "x-ratelimit-reset": "1481320402", "server": "Plack::Handler::Starlet", - "etag": "W/\"dbec5286f8302667b6edff5be3352490\"", + "etag": "W/\"6594e99cea0327cd0491b879ebeb6baf\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/artist/49a51491-650e-44b3-8085-2f07ac2986dd?inc=artist-rels&fmt=json", - "time": 672, + "time": 419, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9 b/test/fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9 index c8cd156d6729622c84fc7b50280acca9702892d6..6d2c45fd70241e12941ce2e02dc4eb7479b67cf2 100644 GIT binary patch literal 1886 zcmV-k2ch^MiwFP!000001I1a}ZtJ)e{S`qk^I`(LQ#x-+ik@Ch2gRA0_Mtc!@R|tY zNP#S$HVp#IZ}j*2C9|oEEn8Azd&X@Z0-Gkex%XQ8M!uxFZi-EVY_%<$^aEM-1Do{2 zKVH&OKl=1T`u&4XZoO{Sev_`!!oiRs*ccNmvLW|~Q;(7HL?KTt^Tbh!v4gqyzI47u zaY?yduZMx*Tk%vxL0?vBE5Ck*oj=~fx^)pe+C1qp{qT~;C9pwLZ~ZEMfk`A+7-5bG zhRMd?7iBvr6v8ZhjY@bOm$qlkv=Uqsi7=)LF->!1q*I6*j=jb_BR-yWQ`HUXHU6P2 z8t;-n7v;UH9^uEO@nTaUMx;apOz3>nCTaj0xniRqO>w`~O;N?;#dA#uTaA9~&f6KK zd4BS(#Zu212_i^jgrkUY=1^vsL<-ESLI_52b9C??rd0x%!B4ecw~{(IJ7}X_`q_W= zO+*&PW{y_X1=v-u6IX8^AAOw^WirDA?6@{KfK83l2tE^}fdwciMMJQ`c%4rUxoK8O z6drAI0B=+tW<2^w0}`u{7+pqibko#@*)|^8+Pfn1^W}9s{8g{Fz8`ILeeWC8@6~I) zr;eluXNbu0wk>c`(M`l|&nSu8xwO?_TiZc?2c0WwZ+mkYZGZZwuH#{Q`Qw>;P=)c_ zN}Quy2e20q5ar-ZAR_`wJj*Bnv%FlU+sG{zbemCQq;51#x|%ZOGcdkNz60s?99ND2 zZs)C%cG18ShOy;VF~pd*5HW;6xdVsgo>56v5T3AKONSZ5FF|xZ9%n8&=QN`TmH~eA zWIM$3ep|r)F;sf(lCPE3>lWS_A}mm5fnR4j;4x7?`U<2ae*gkNY%J%4Eq%jxXsE zjrUeM@RDs~A<+fD0>|3IoSnM47KG;nNr54`a>G!DGl6KpN?V#|(zyjM+&N&}FWE^* zUzdGm0r2bk(zQ0fFeNO8%~>~F?Q-KNS#-&JhBFIH=#lzU^-w0Cd|A%>O6Mm#VmQIM zg3`rG0x^_OsJb*U$f>{;aV!(&IM;StuaYPyJ=eb@R9DM!X9lLjDo>s3pQi-M1*E!y zR||n1xTAJ4ePxm(lVt{RtgJS|E2+bg>HlKyV3X26L#?B?>%DizZ^`c0Sx>$MslENR z43bJtAYwp5;R=pzFf}O4oHBXFoz279E)FBT;JE_f?+?EA|NZ$tn_bp_uSl4#=<3Og zWy)HKoaJzKrzmio1%!pgxy`jw!Hi;k062%XpmV_k4!m9PP)x*mAtT!PQ1ZkQqx6=1 z_FoIwGr8@co0#O@*N?hPZ1oi&?(yxc5M-_lSV6h~H4?Eje_*Up|e7n(~yo$5P~qn zHRo?2FHcJnCx?)!l5aXhP6#E+ z6Xb{#;1CAd8lMNm0-*xu274op9OC!d1pU)Kos3vL{FI>NW(WKCJ?u+m;sW=tmTFF^ z_!jALcBnolp?xYKEj?A$I{Bm>WUONoF89zAD|d!7&dJQ@$T|gv6AT(W>?C4DIIEZq z*dIr`!y}}xSN4H7xv8DRE|&~(9th$Fb~7pyD5Dwo&T1X+eh!a+7hhU@9emM@irWjK z(%eSZ>@-e@MAvJ8PbU2|xcpX??$Jf5OTI1cADXs-{+)haB{w@xJL84Ikg{_ZZ`xge zicJOh$}k1S$lT2)qCK=X$yC5`&bcz}->C3!cAnf+Npo^i)kM#p7D5H*q?7`h+2hz zJa}fd6qF6byj$e||r$7E}{xx|uNr{k( Yz6{hrRR|jos^QmP0Es)OXR)w1$wMFneH{@y zA_We|i6R)tZ{+v#C8;K7I5*DSUaubviE0+BPF0<{^lNUKww$-9j&UB^{0*M0p168Z z!2_~-Fwfuo{WZ5?T2}usO)&YJ*Swt9h!H6fh2uV?Bl){K^!~@c<`0v+GEX6YlfN%N zh32`gXZa*AJv?xf7mne8v^ExTOCvIh3sgu$h4sqB5a6sY=jO?l(}iivx`OxM*}QIA zv?urTByYm3JJxGCuNRFA$Th*2ZU1I(M5lDp0efyNjs>#T8w5WSWCC?4Dn(;-(FRkD z=}rnHMT zpigGDNC3XV)7CW8(4zL`IlZvdeB*G3b5dZQU|t@33QrdFsbgkM<>7d!d;nA1W)TLF zTZjzb?w>9{4zI!ANg*l18WEZIUqBsf!UpanE>K}2z!nTf1;G{(0L>~An5LwItqE?4 zm^JR#f0`y~)CEs39CyMgVDNgm_?3zZq;N#=w&kjRb+WetZ98`M5~cIU`PQEU z=GrwvgTIcu=GHhE%ls|Vr;8HogU7RAeDuZwSSEDyFaNAeV zdn4j6)_$pGwV2HgnsO|S&hq6b)4dN>mBRdw_2X!Y^yx8#pBJ1fuaJ`j_>NGFtRWV8 z6}cjwX<>_X_$8TH|ABqJ8%_GjP|Wj(%V=-gc?UeaL3;{e^^Iw7Go8LL_x)@Zv+U3A z9{x~;mzDRd5dwSQ4dYX_(vl;qHMDzJIb%go(!?Di8e~Ar1Tsf!;X%6FwDw^{%fCH_ zCj9R||D6wow(kQq)5@ANhg{&zf zg44oD4x*Tdt=KX$N-8-4_J%Ud6?n#CYM}@B$`+b?SHx9pC2BYq=j&Ku3FSsj%szxq zCCJF``t;eubQ+o`Q)RA(u78zd+r9R_oJs1<2UkZ~C=0HZK0?<-95nwBqlguSCP7f_ z70y48`eGaUJILEWC2k;gwFVFvzgxBX*Si;uZ>$&g|CT*`6 z*vnvWH&9`b2abubr!x z#@ETAqBocb=6nGZs(@BGj3Y>U1GUsfAqcbFaDJSn560E~zk_?szS}4e-(^cxSLA=V zhU6Cy=DX2$Jom=A_-f~zCYOy#;sTwnFF5DuG+qD>Po0~7+VSLAfZV}HY5H%KUC=f< z>A6B7a+pRL{G>G#NV4Erq(O0`)={x9=B9DVRU25mX@hL`>C8hw%xG(2lJBe?M-(MOtQD5JTrLI2B9!CD1}cObRVHrQxSe; zn1Z`y;nltm65!vUKRe;$FFR^|FlDtu$#V%r53@nR`#G5+&5TD{Iv9z#jBNaB?Crpm zZJo6Tx82>R#=78dG-q9k^DcBh)$Ps=;HicC{u`YMQE=>?h2F-5R8t%@I7C@!t|?91 zPfC@%xU=0ydEMTQO*KoMhQ-NqxzQ5$PzMfkvxpK|;VEJq24-!UM2bqRV%k*lv@)BO zF`)UgsS;LO8`GoLcWGJ5l9}E8bMun)yc_NIhfO2F*4pThiv@s314cFw=o6`9fq2jg zcXfMSb++WV|CibsthnZB13FC#Hl2N|9N+ihaO<7Es*Mud5Q#9R3Nb?qWTjV#T8@Lk zT$8Zd+Ww^~+u*Z5mDSYOPlt$Vb)`-=uhciL(|4rw>*(c;e6M?N%(7-beEvU0S0aVv G9{>QD8Kh7E diff --git a/test/fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9.headers b/test/fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9.headers index 301576e..90eb5c9 100644 --- a/test/fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9.headers +++ b/test/fixtures/c907a9892b9dacd1c8f6a85cf9b95fb9.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:06 GMT", + "date": "Fri, 09 Dec 2016 21:53:17 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "570", - "x-ratelimit-reset": "1481236327", + "x-ratelimit-remaining": "607", + "x-ratelimit-reset": "1481320398", "server": "Plack::Handler::Starlet", - "etag": "W/\"00e70096bc0434f732f47e3050094637\"", + "etag": "W/\"86e889bbf99d0bd3b567fa8888299b53\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/artist?release=2ac3cbf2-f0d0-3678-af5f-b62dcb051bc0&inc=artist-rels&fmt=json", - "time": 841, + "time": 1132, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/d1a0073e6dcac919d8fdf8be12bfcbec b/test/fixtures/d1a0073e6dcac919d8fdf8be12bfcbec index cbb7c8ace1dd7a3f4bfbf942ab6c4a4668aad99b..18d614c955987661bcd6543b443d7466a221d7bb 100644 GIT binary patch literal 1311 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 TGeJF#soeete00|#6b}FZ;TU}a diff --git a/test/fixtures/d1a0073e6dcac919d8fdf8be12bfcbec.headers b/test/fixtures/d1a0073e6dcac919d8fdf8be12bfcbec.headers index 4603681..379751d 100644 --- a/test/fixtures/d1a0073e6dcac919d8fdf8be12bfcbec.headers +++ b/test/fixtures/d1a0073e6dcac919d8fdf8be12bfcbec.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:11 GMT", + "date": "Fri, 09 Dec 2016 21:53:22 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "253", - "x-ratelimit-reset": "1481236331", + "x-ratelimit-remaining": "258", + "x-ratelimit-reset": "1481320402", "server": "Plack::Handler::Starlet", - "etag": "W/\"262816d2e746629059388bf96eb1241d\"", + "etag": "W/\"8b0d167a80f1f60f6b0ccdb1254ea172\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/artist/4d5447d7-c61c-4120-ba1b-d7f471d385b9?inc=artist-rels&fmt=json", - "time": 676, + "time": 508, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff b/test/fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff index 3c889469851a20cff86d7eef1972d1b2ac42be33..8eaf2f6d89c537bcb06b6a4ed6bdd51e5fc21b27 100644 GIT binary patch literal 1217 zcmV;y1U~y8iwFP!000001GQIKZ`(!?{wo9@`lJE&;vRl$P#`Uuwkg`Q4~0?eF{==f zNr9qV7>56Qhm@!*w4=0%U*x@pv)}j4v5(~vn}l6?Q~u;vST4%gZkxV)po!P7Xt-&+ z9vXj#H1WOfx_Z+#i{dr5-E!DXhyV5+`ts(nO!da!g?hR5ecd*+|Kj+Yc2j)YEOCV! zTA7`!6HW1~Sk%ZtnczX8tiU;)A)`jDtYWA|`Lrmf?~aG8HkoMJa2#Gb7^GvCaRt!@VwIDZHfaaRh{PpxF@-p)bspDw z5?}m9s3*ieUzr8TdXW)GLWOLTW592TV+1)ofR*OG;i6_SN`)M|r=&hvFNO zXVaXjc4lQ)=@LVym8UA@sN7Kug5`{XuROQP8YZnck?x-H32wX#*cELqf^WVy>Qz7$ zHR0%d9%{0u^uSpFE^?-5Bk)PH2h?{Ezlip{vq!K`f&Fz$%6hm%Qtt2Xv79Tr2dHU7 zao9iM>~f4s%K#?kIC!tX>k3IY!I&J4Mdz=_`BNEiALP$r@!6oxb8`)^1JK7ns3;KB zNpYbR&lGTW>3g}{)?|vNSLjo5-$ue?=ytA?(ighlycAxc@2OS1QV9Fqhf+-+4}laA zvm0t0G6={GpokKA5}L8}QKdKvb$7{&%6454&Prxr=eb-yC64#LsgJpKe~)Y`>N?N> zqhC;r+Fa|XMe;mzRXOUBVt59e`Fb#Z<|LD^skLrisOs|pa9!|!sf^^5;L%$JPAX~) z9d#`ZseC5%LJ1|AqSE>_*Q1{+V^!11&Du8u?7PqqjA}5aGJIZ0l%y&GLY+63N7UX< zZD+l%$2ekSM=C2SW{2<@-KGxK=86$xiVIMhK4UAofD^hhoY6fzJBoPs&N>yq?zy&u zKAMNu{P0J4`*c>*H8NRI5tk7iNJ(u7HJ{W-OX-Y| fEU=VEd(8pZ;g1VW?Wv{*!0pq&5H`jC$qoPj{e)P< literal 1231 zcmV;=1Tgy_iwFP!000001FcudZW~7s{guHSa$*6!O)t8|2;c;95(kNsLtq5GRMP`f zLt;2oAPD;R)GS;i4z<|Uh3cMOUcGv?^j+y&^ySrES*P-$u zD2ARX%Q2OUGSypu9qQ%IclElVeKfaSw;eS88fo~UsXI)?&vmm*>udU0Z`UBX*1#dI z6K>0^f6BLS%8!e3e#iaH9e;kp;tl$4McWtU5}SlAP5g|Y(YbcT!?v9e^O7B8^x^yK^Ax~3jXV&fkdTv(~4>J1!$!f?IR zNhZlWSm_c-O!Qw25`+t=q*bWA+e1~t+gvdNR&fDJa}Ksr8Jy6S;Y_*gS$W{^Ew0-o z7C-v7C9a!Cc=ywbVq8a`yW36wQCjo16GYwNJ< zhQsI(-*)x3J1W{4XOf7Z8Tpw=O%Qyg!I1NLuB=PsriX0(U9ZBfypLIRLNvnCySt@U`tu-h@R;qI&UpMjZ2{G6RL z)Vzw?M?whFG0V7uNWlh*lNxN&4w4axOXgw<@sbe!*wml#X&nqpW@Rwx@=Urt&5tlj z#zPWJK;w81zCekPO=>~){yhVpc#oI%kS zBkj0xIyU>&_631vEHDR5e2K9GTg`5@n&t9xPMduB+p4~){b{-%W3`ewvYFP4V!%vpK8PA)y$6HB9o^F*FdaHOxILKrpC>U{1Cw5M#tSpY6_ zrcfXj2me3eOuP=*7VBID-<CC=+=ss%eH`JLPuf^Th(n6GNw! zr&h~RdqPgCj>JZJ z-hu?8Gz2mwX4h9xWDt-WKoKSKBs60$X{x8*ceG}4%HX~${%RAS&v_N)JawAw8I6In z^4rMj2!EX2<9|A~`!djb=c!EkW%2#VH}zST&8DJe0u3cOG@~NpSRmQ-Vit6*x(c26`+jH8NRIag-4qNJ%w|T1)E7 tq;y6|7Ff!(J+606M@`jL|70W|Yz~htE|nD(v*pM8{{iD(an8vO002yuV{iZf diff --git a/test/fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff.headers b/test/fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff.headers index b1dbbee..1743d81 100644 --- a/test/fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff.headers +++ b/test/fixtures/f2a7af3e3a39e31ee0d9d74b5820ebff.headers @@ -1,26 +1,26 @@ { "statusCode": 200, "headers": { - "date": "Thu, 08 Dec 2016 22:32:06 GMT", + "date": "Fri, 09 Dec 2016 21:53:18 GMT", "content-type": "application/json; charset=utf-8", "transfer-encoding": "chunked", "connection": "keep-alive", "keep-alive": "timeout=15", "vary": "Accept-Encoding", "x-ratelimit-limit": "700", - "x-ratelimit-remaining": "288", - "x-ratelimit-reset": "1481236327", + "x-ratelimit-remaining": "220", + "x-ratelimit-reset": "1481320398", "server": "Plack::Handler::Starlet", - "etag": "W/\"7c937ac3dcff44777fa9d4c32d65b803\"", + "etag": "W/\"5da167e635ba53580f8c82e6958f2ec9\"", "access-control-allow-origin": "*", "content-encoding": "gzip" }, "url": "http://musicbrainz.org:80/ws/2/artist/42a8f507-8412-4611-854f-926571049fa0?inc=artist-rels&fmt=json", - "time": 558, + "time": 488, "request": { "method": "GET", "headers": { - "User-Agent": "graphbrainz/3.1.0 ( https://github.com/exogen/graphbrainz )", + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", "host": "musicbrainz.org", "accept-encoding": "gzip, deflate", "accept": "application/json" diff --git a/test/fixtures/f5cc4554214e4421714ea8f4650632b5 b/test/fixtures/f5cc4554214e4421714ea8f4650632b5 new file mode 100644 index 0000000000000000000000000000000000000000..162829b9544bf873b26dd74a1e889fc7264c8bb4 GIT binary patch literal 24798 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 Jl(ML%0sueLf^7f* literal 0 HcmV?d00001 diff --git a/test/fixtures/f5cc4554214e4421714ea8f4650632b5.headers b/test/fixtures/f5cc4554214e4421714ea8f4650632b5.headers new file mode 100644 index 0000000..516208f --- /dev/null +++ b/test/fixtures/f5cc4554214e4421714ea8f4650632b5.headers @@ -0,0 +1,29 @@ +{ + "statusCode": 200, + "headers": { + "date": "Fri, 09 Dec 2016 22:08:27 GMT", + "content-type": "application/json; charset=utf-8", + "transfer-encoding": "chunked", + "connection": "keep-alive", + "keep-alive": "timeout=15", + "vary": "Accept-Encoding", + "x-ratelimit-limit": "700", + "x-ratelimit-remaining": "287", + "x-ratelimit-reset": "1481321304", + "server": "Plack::Handler::Starlet", + "etag": "W/\"4466cd809101f3b9c834437d95f317ba\"", + "access-control-allow-origin": "*", + "content-encoding": "gzip" + }, + "url": "http://musicbrainz.org:80/ws/2/artist/65314b12-0e08-43fa-ba33-baaa7b874c15?inc=artist-rels%2Brecording-rels%2Brelease-rels&fmt=json", + "time": 3639, + "request": { + "method": "GET", + "headers": { + "User-Agent": "graphbrainz/3.1.1 ( https://github.com/exogen/graphbrainz )", + "host": "musicbrainz.org", + "accept-encoding": "gzip, deflate", + "accept": "application/json" + } + } +} \ No newline at end of file diff --git a/test/fixtures/fa82576d5b7a7fc3ae596f5543219b2d b/test/fixtures/fa82576d5b7a7fc3ae596f5543219b2d new file mode 100644 index 0000000000000000000000000000000000000000..b48f94295345213cc7f5a0caccc4a01320b52dff GIT binary patch literal 598 zcmV-c0;&BUiwFP!000001I3lgZrd;rMSn%m+5_+{(z`x_W@(^7Hboaha+nIWMMIJs z7(xEMR1&vNV&~PO-DokChWDN!udeEzmV^VrMV~k8p`L%ass{?Wi`Z{r+^%V=eVx_o zzFqA~(8hXRo5+Ip$v}frf>eS5YVJU(6pSQ_{r=w-*~6+uW7!>if+~#QbEtbVfw^>y;`VN|Yjlt)x&fhfceX=nI2AXSKZjy9>EGS4#VxFf!fzh7n4|!GY zMfEXXcGW52kL^D>_Q&8o2KCtQGyGo~Q*ZY3B>iA?(k6N^TueD;u=EfmVnXyLMkBQ| zd-UHEZpLkeU91-QlKSbqO^$!9FX?iZSxGfaVJu!*v>+MRfG(BkD%XgZgtaL=A@9w8 zkHnF6z{M+g9~k1~^#7#ku|s|f+J>YivgKz$Wrh^N8r_sfiPc0ZA<4ZNz6*IXjBPlS k6+8UbrT4ubG?b6Jv7Xz9^_ { + t.is(result.errors, undefined) + return handler(t, result.data) + }) +} -let client -let loaders -let context +function testError (t, query, handler) { + return graphql(schema, query, null, context).then(result => { + t.truthy(result.errors) + t.true(result.errors.length > 0) + return handler(t, result.errors) + }) +} -test.before(t => { - client = new MusicBrainz() - loaders = createLoaders(client) - context = { client, loaders } -}) - -test('schema has a node field', t => { - const query = ` +test('schema has a node field', testData, + ` { node(id: "UmVsZWFzZUdyb3VwOmUzN2QyNzQwLTQ1MDMtNGUzZi1hYjZkLWU2MjJhMjVlOTY0ZA==") { __typename @@ -28,21 +28,18 @@ test('schema has a node field', t => { } } } - ` - return graphql(schema, query, null, context).then(result => { - t.deepEqual(result, { - data: { - node: { - __typename: 'ReleaseGroup', - mbid: 'e37d2740-4503-4e3f-ab6d-e622a25e964d' - } + `, (t, data) => { + t.deepEqual(data, { + node: { + __typename: 'ReleaseGroup', + mbid: 'e37d2740-4503-4e3f-ab6d-e622a25e964d' } }) - }) -}) + } +) -test('schema has a lookup query', t => { - const query = ` +test('schema has a lookup query', testData, + ` { lookup { artist (mbid: "c8da2e40-bd28-4d4e-813a-bd2f51958ba8") { @@ -52,24 +49,20 @@ test('schema has a lookup query', t => { } } } - ` - return graphql(schema, query, null, context).then(result => { - t.deepEqual(result, { - data: { - lookup: { - artist: { - mbid: 'c8da2e40-bd28-4d4e-813a-bd2f51958ba8', - name: 'Lures', - type: 'Group' - } + `, (t, data) => { + t.deepEqual(data, { + lookup: { + artist: { + mbid: 'c8da2e40-bd28-4d4e-813a-bd2f51958ba8', + name: 'Lures', + type: 'Group' } } }) }) -}) -test('schema has a search query', t => { - const query = ` +test('schema has a search query', testData, + ` { search { recordings (query: "Burn the Witch") { @@ -84,17 +77,15 @@ test('schema has a search query', t => { } } } - ` - return graphql(schema, query, null, context).then(result => { - const { recordings } = result.data.search + `, (t, data) => { + const { recordings } = data.search t.true(recordings.totalCount > 0) t.true(recordings.edges.length === 25) recordings.edges.forEach(edge => t.true(edge.score > 0)) }) -}) -test('schema has a browse query', t => { - const query = ` +test('schema has a browse query', testData, + ` { browse { releaseGroups (artist: "c8da2e40-bd28-4d4e-813a-bd2f51958ba8") { @@ -115,17 +106,15 @@ test('schema has a browse query', t => { } } } - ` - return graphql(schema, query, null, context).then(result => { - const { releaseGroups } = result.data.browse + `, (t, data) => { + const { releaseGroups } = data.browse t.true(releaseGroups.totalCount > 0) t.true(releaseGroups.edges.length > 0) releaseGroups.edges.forEach(edge => t.truthy(edge.node.title)) }) -}) -test('supports deeply nested queries', t => { - const query = ` +test('supports deeply nested queries', testData, + ` query AppleRecordsMarriages { search { labels(query: "Apple Records", first: 1) { @@ -193,10 +182,284 @@ test('supports deeply nested queries', t => { } } } - ` - return graphql(schema, query, null, context).then(result => { - const { labels } = result.data.search + `, (t, data) => { + const { labels } = data.search t.true(labels.edges.length > 0) t.is(labels.edges[0].node.releases.edges.length, 1) }) -}) + +test('throws an error if given a malformed MBID', testError, + ` + { + lookup { + artist(mbid: "ABC123") { + name + } + } + } + `, (t, errors) => { + const err = errors[0] + t.true(err instanceof TypeError) + t.is(err.message, 'Malformed MBID: ABC123') + }) + +test('Artist beginArea/endArea pulls from begin_area/end_area for lookup queries', testData, + ` + { + lookup { + artist(mbid: "65314b12-0e08-43fa-ba33-baaa7b874c15") { + beginArea { + name + } + endArea { + name + } + } + } + } + `, (t, data) => { + const { artist } = data.lookup + t.is(artist.beginArea.name, 'Westmount') + t.is(artist.endArea.name, 'Los Angeles') + }) + +test('Artist beginArea/endArea pull from begin_area/end_area for browse queries', testData, + ` + { + browse { + artists(area: "3f504d54-c40c-487d-bc16-c1990eac887f") { + edges { + node { + beginArea { + name + } + endArea { + name + } + } + } + } + } + } + `, (t, data) => { + const artists = data.browse.artists.edges.map(edge => edge.node) + t.true(artists.length > 1) + t.true(artists.some(artist => artist.beginArea)) + t.true(artists.some(artist => artist.endArea)) + }) + +test('Artist beginArea/endArea pulls from begin-area/end-area for search queries', testData, + ` + { + search { + artists(query: "Leonard Cohen", first: 1) { + edges { + node { + beginArea { + name + } + endArea { + name + } + } + } + } + } + } + `, (t, data) => { + const artists = data.search.artists.edges.map(edge => edge.node) + t.true(artists.length === 1) + t.is(artists[0].beginArea.name, 'Westmount') + t.is(artists[0].endArea.name, 'Los Angeles') + }) + +test('relationships filter by type', testData, + ` + { + lookup { + artist(mbid: "65314b12-0e08-43fa-ba33-baaa7b874c15") { + relationships { + artists(first: 5) { + edges { + node { + target { + __typename + } + targetType + } + } + } + recordings(first: 5) { + edges { + node { + target { + __typename + } + targetType + } + } + } + releases(first: 5) { + edges { + node { + target { + __typename + } + targetType + } + } + } + } + } + } + } + `, (t, data) => { + const { relationships } = data.lookup.artist + t.is(relationships.artists.edges.length, 5) + relationships.artists.edges.forEach(edge => { + t.is(edge.node.targetType, 'artist') + t.is(edge.node.target.__typename, 'Artist') + }) + t.is(relationships.recordings.edges.length, 5) + relationships.recordings.edges.forEach(edge => { + t.is(edge.node.targetType, 'recording') + t.is(edge.node.target.__typename, 'Recording') + }) + t.is(relationships.releases.edges.length, 5) + relationships.releases.edges.forEach(edge => { + t.is(edge.node.targetType, 'release') + t.is(edge.node.target.__typename, 'Release') + }) + }) + +test('Area maps iso-3166-1-codes to isoCodes', testData, + ` + { + lookup { + area(mbid: "489ce91b-6658-3307-9877-795b68554c98") { + name + isoCodes + } + } + } + `, (t, data) => { + t.deepEqual(data.lookup.area.isoCodes, ['US']) + }) + +test('Alias locales use the Locale scalar', testData, + ` + { + lookup { + artist(mbid: "f99b7d67-4e63-4678-aa66-4c6ac0f7d24a") { + aliases { + name + locale + } + } + } + } + `, (t, data) => { + const { aliases } = data.lookup.artist + t.is(aliases.find(alias => alias.locale === 'en').name, 'PSY') + t.is(aliases.find(alias => alias.locale === 'ko').name, '싸이') + }) + +test('Work ISWCs use the ISWC scalar', testData, + ` + { + lookup { + work(mbid: "ef7d0814-da6a-32f5-a600-ff81cffd1aed") { + title + iswcs + } + } + } + `, (t, data) => { + const { work } = data.lookup + t.is(work.title, 'Song of the French Partisan') + t.deepEqual(work.iswcs, ['T-900.755.682-3']) + }) + +test('URLs may be looked up by resource', testData, + ` + { + lookup { + url(resource: "http://www.nirvana.com/") { + mbid + resource + } + } + } + `, (t, data) => { + const { url } = data.lookup + t.is(url.mbid, '4347ffe2-82ec-4059-9520-6a1a3f73a304') + t.is(url.resource, 'http://www.nirvana.com/') + }) + +test('throws an error if given a malformed URLString', testError, + ` + { + lookup { + url(resource: "http:foo") { + mbid + resource + } + } + } + `, (t, errors) => { + const err = errors[0] + t.true(err instanceof TypeError) + t.is(err.message, 'Malformed URL: http:foo') + }) + +test('Release groups can be browsed by type', testData, + ` + { + browse { + releaseGroups(artist: "5b11f4ce-a62d-471e-81fc-a69a8278c7da", type: EP) { + edges { + node { + primaryType + } + } + } + } + } + `, (t, data) => { + const releaseGroups = data.browse.releaseGroups.edges.map(edge => edge.node) + t.is(releaseGroups.length, 8) + releaseGroups.forEach(releaseGroup => t.is(releaseGroup.primaryType, 'EP')) + }) + +test('Releases can be browsed by type and status', testData, + ` + { + browse { + releases(artist: "5b11f4ce-a62d-471e-81fc-a69a8278c7da", type: EP, status: BOOTLEG) { + edges { + node { + status + } + } + } + } + } + `, (t, data) => { + const releases = data.browse.releases.edges.map(edge => edge.node) + t.is(releases.length, 6) + releases.forEach(release => t.is(release.status, 'BOOTLEG')) + }) + +test('Releases have an ASIN field', testData, + ` + { + lookup { + release(mbid: "d5cdb7fd-c7e9-460a-9549-8a369655cc52") { + asin + } + } + } + `, (t, data) => { + const { release } = data.lookup + t.is(release.asin, 'B01KN6XDS6') + }) diff --git a/yarn.lock b/yarn.lock index 8e3cdd1..0ea4fa0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -32,8 +32,8 @@ ajv-keywords@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.2.0.tgz#676c4f087bfe1e8b12dca6fda2f3c74f417b099c" ajv@^4.7.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.1.tgz#08e1b0a5fddc8b844d28ca7b03510e78812ee3a0" + version "4.9.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.2.tgz#3f7dcda95b0c34bceb2d69945117d146219f1a2c" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" @@ -322,27 +322,27 @@ babel-cli@^6.18.0: optionalDependencies: chokidar "^1.0.0" -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" +babel-code-frame@^6.16.0, babel-code-frame@^6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" dependencies: chalk "^1.1.0" esutils "^2.0.2" js-tokens "^2.0.0" babel-core@^6.17.0, babel-core@^6.18.0: - version "6.18.2" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.20.0.tgz#ab0d7176d9dea434e66badadaf92237865eab1ec" dependencies: - babel-code-frame "^6.16.0" - babel-generator "^6.18.0" + babel-code-frame "^6.20.0" + babel-generator "^6.20.0" babel-helpers "^6.16.0" babel-messages "^6.8.0" babel-register "^6.18.0" - babel-runtime "^6.9.1" + babel-runtime "^6.20.0" babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-traverse "^6.20.0" + babel-types "^6.20.0" babylon "^6.11.0" convert-source-map "^1.1.0" debug "^2.1.1" @@ -364,13 +364,13 @@ babel-eslint@^7.1.1: babylon "^6.13.0" lodash.pickby "^4.6.0" -babel-generator@^6.1.0, babel-generator@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" +babel-generator@^6.1.0, babel-generator@^6.18.0, babel-generator@^6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.20.0.tgz#fee63614e0449390103b3097f3f6a118016c6766" dependencies: babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" + babel-runtime "^6.20.0" + babel-types "^6.20.0" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" @@ -467,14 +467,14 @@ babel-helper-regex@^6.8.0: lodash "^4.2.0" babel-helper-remap-async-to-generator@^6.16.0, babel-helper-remap-async-to-generator@^6.16.2: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.18.0.tgz#336cdf3cab650bb191b02fc16a3708e7be7f9ce5" + version "6.20.3" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.20.3.tgz#9dd3b396f13e35ef63e538098500adc24c63c4e7" dependencies: babel-helper-function-name "^6.18.0" - babel-runtime "^6.0.0" + babel-runtime "^6.20.0" babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-traverse "^6.20.0" + babel-types "^6.20.0" babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: version "6.18.0" @@ -567,8 +567,8 @@ babel-plugin-syntax-object-rest-spread@^6.8.0: resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" babel-plugin-syntax-trailing-function-commas@^6.3.13: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.13.0.tgz#2b84b7d53dd744f94ff1fad7669406274b23f541" + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.20.0.tgz#442835e19179f45b87e92d477d70b9f1f18b5c4f" babel-plugin-transform-async-generator-functions@^6.17.0: version "6.17.0" @@ -619,13 +619,13 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.3.13: babel-runtime "^6.0.0" babel-plugin-transform-es2015-block-scoping@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.18.0.tgz#3bfdcfec318d46df22525cdea88f1978813653af" + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.20.0.tgz#5d8f3e83b1a1ae1064e64a9e5bb83108d8e73be3" dependencies: - babel-runtime "^6.9.0" + babel-runtime "^6.20.0" babel-template "^6.15.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-traverse "^6.20.0" + babel-types "^6.20.0" lodash "^4.2.0" babel-plugin-transform-es2015-classes@^6.18.0: @@ -784,19 +784,17 @@ babel-plugin-transform-exponentiation-operator@^6.3.13: babel-runtime "^6.0.0" babel-plugin-transform-object-rest-spread@^6.16.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.19.0.tgz#f6ac428ee3cb4c6aa00943ed1422ce813603b34c" + version "6.20.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.20.2.tgz#e816c55bba77b14c16365d87e2ae48c8fd18fc2e" dependencies: babel-plugin-syntax-object-rest-spread "^6.8.0" - babel-runtime "^6.0.0" + babel-runtime "^6.20.0" babel-plugin-transform-regenerator@^6.16.0: - version "6.16.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.16.1.tgz#a75de6b048a14154aae14b0122756c5bed392f59" + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.20.0.tgz#a546cd2aa1c9889929d5c427a31303847847ab75" dependencies: - babel-runtime "^6.9.0" - babel-types "^6.16.0" - private "~0.1.5" + regenerator-transform "0.9.8" babel-plugin-transform-runtime@^6.15.0: version "6.15.0" @@ -812,12 +810,12 @@ babel-plugin-transform-strict-mode@^6.18.0: babel-types "^6.18.0" babel-polyfill@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.20.0.tgz#de4a371006139e20990aac0be367d398331204e7" dependencies: - babel-runtime "^6.9.1" + babel-runtime "^6.20.0" core-js "^2.4.0" - regenerator-runtime "^0.9.5" + regenerator-runtime "^0.10.0" babel-preset-es2015-node4@^2.1.0: version "2.1.0" @@ -892,12 +890,12 @@ babel-register@^6.18.0: mkdirp "^0.5.1" source-map-support "^0.4.2" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.20.0, babel-runtime@^6.9.0, babel-runtime@^6.9.1: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" dependencies: core-js "^2.4.0" - regenerator-runtime "^0.9.5" + regenerator-runtime "^0.10.0" babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.7.0, babel-template@^6.8.0: version "6.16.0" @@ -909,25 +907,25 @@ babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-te babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" +babel-traverse@^6.15.0, babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.20.0.tgz#5378d1a743e3d856e6a52289994100bbdfd9872a" dependencies: - babel-code-frame "^6.16.0" + babel-code-frame "^6.20.0" babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" + babel-runtime "^6.20.0" + babel-types "^6.20.0" babylon "^6.11.0" debug "^2.2.0" globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.7.2, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" +babel-types@^6.13.0, babel-types@^6.15.0, babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.20.0, babel-types@^6.7.2, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.20.0.tgz#3869ecb98459533b37df809886b3f7f3b08d2baa" dependencies: - babel-runtime "^6.9.1" + babel-runtime "^6.20.0" esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^1.0.1" @@ -1359,20 +1357,6 @@ cross-env@^3.1.3: dependencies: cross-spawn "^3.0.1" -cross-spawn-async@^2.0.0: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - dependencies: - lru-cache "^4.0.0" - which "^1.2.8" - -cross-spawn@2.0.x: - version "2.0.1" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-2.0.1.tgz#ab6fd893a099759d9b85220e3a64397de946b0f6" - dependencies: - cross-spawn-async "^2.0.0" - spawn-sync "1.0.13" - cross-spawn@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-3.0.1.tgz#1256037ecb9f0c5f79e3d6ef135e30770184b982" @@ -1387,6 +1371,14 @@ cross-spawn@^4, cross-spawn@^4.0.0: lru-cache "^4.0.1" which "^1.2.9" +cross-spawn@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.0.1.tgz#a3bbb302db2297cbea3c04edf36941f4613aa399" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -1955,7 +1947,7 @@ finalhandler@0.5.0: find-cache-dir@^0.1.1: version "0.1.1" - resolved "http://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" dependencies: commondir "^1.0.1" mkdirp "^0.5.1" @@ -2762,8 +2754,8 @@ jsx-ast-utils@^1.3.3: object-assign "^4.1.0" kind-of@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.0.4.tgz#7b8ecf18a4e17f8269d73b501c9f232c96887a74" + version "3.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.1.0.tgz#475d698a5e49ff5e53d14e3e732429dc8bf4cf47" dependencies: is-buffer "^1.0.2" @@ -2956,7 +2948,7 @@ lowercase-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" -lru-cache@^4.0.0, lru-cache@^4.0.1: +lru-cache@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" dependencies: @@ -3570,10 +3562,11 @@ power-assert-util-string-width@^1.1.1: eastasianwidth "^0.1.1" pre-commit@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.1.3.tgz#6d5ed90740472072958c711a15f676aa2c231377" + version "1.2.0" + resolved "https://registry.yarnpkg.com/pre-commit/-/pre-commit-1.2.0.tgz#16a1a218861c778d1a1498719c9763717913d5b8" dependencies: - cross-spawn "2.0.x" + cross-spawn "^5.0.1" + spawn-sync "^1.0.15" which "1.2.x" prelude-ls@~1.1.2: @@ -3602,7 +3595,7 @@ pretty-ms@^2.0.0: parse-ms "^1.0.0" plur "^1.0.0" -private@^0.1.6, private@~0.1.5: +private@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/private/-/private-0.1.6.tgz#55c6a976d0f9bafb9924851350fe47b9b5fbb7c1" @@ -3771,13 +3764,21 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + +regenerator-transform@0.9.8: + version "0.9.8" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.8.tgz#0f88bb2bc03932ddb7b6b7312e68078f01026d6c" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" regex-cache@^0.4.2: version "0.4.3" - resolved "http://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" dependencies: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" @@ -4049,6 +4050,16 @@ setprototypeof@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + shelljs@^0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.5.tgz#2eef7a50a21e1ccf37da00df767ec69e30ad0675" @@ -4121,9 +4132,9 @@ source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" -spawn-sync@1.0.13: - version "1.0.13" - resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.13.tgz#904091b9ad48a0f3afb0e84752154c01e82fd8d8" +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" dependencies: concat-stream "^1.4.7" os-shim "^0.1.2" @@ -4692,7 +4703,7 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@1.2.x, which@^1.2.4, which@^1.2.8, which@^1.2.9: +which@1.2.x, which@^1.2.4, which@^1.2.9: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: