From 1c3d92a17c85fa11dc6fdcb1e37c1e33b34d51d0 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 3 Oct 2019 07:56:43 +0100 Subject: [PATCH 1/4] feat: add methods for listing config profiles New method: ```javascript Promise> ipfs.config.profiles.list() ``` BREAKING CHANGE: ```javascript Promise<{oldCfg, newCfg}> ipfs.config.profile(name, opts) // is now Promise<{old, new}> ipfs.config.profiles.apply(name, opts) ``` Possibly contentious; Adds `callbackify` as a dependency, see https://github.com/ipfs/js-ipfs/issues/2506 for discussion. --- package.json | 3 ++- src/config/index.js | 11 ++++----- src/config/{profile.js => profiles/apply.js} | 2 +- src/config/profiles/list.js | 26 ++++++++++++++++++++ test/interface.spec.js | 4 +++ 5 files changed, 38 insertions(+), 8 deletions(-) rename src/config/{profile.js => profiles/apply.js} (91%) create mode 100644 src/config/profiles/list.js diff --git a/package.json b/package.json index 3ded46610..245a63fc4 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "bl": "^3.0.0", "bs58": "^4.0.1", "buffer": "^5.4.2", + "callbackify": "^1.1.0", "cids": "~0.7.1", "concat-stream": "github:hugomrdias/concat-stream#feat/smaller", "debug": "^4.1.0", @@ -109,7 +110,7 @@ "cross-env": "^6.0.0", "dirty-chai": "^2.0.1", "go-ipfs-dep": "^0.4.22", - "interface-ipfs-core": "^0.115.0", + "interface-ipfs-core": "ipfs/interface-js-ipfs-core#add-listing-config-profiles", "ipfsd-ctl": "^0.47.1", "nock": "^11.3.2", "stream-equal": "^1.1.1" diff --git a/src/config/index.js b/src/config/index.js index d690d8099..731df5bcb 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -1,14 +1,13 @@ 'use strict' -const moduleConfig = require('../utils/module-config') - -module.exports = (arg) => { - const send = moduleConfig(arg) - +module.exports = (send, config) => { return { get: require('./get')(send), set: require('./set')(send), replace: require('./replace')(send), - profile: require('./profile')(send) + profiles: { + apply: require('./profiles/apply')(send), + list: require('./profiles/list')(config) + } } } diff --git a/src/config/profile.js b/src/config/profiles/apply.js similarity index 91% rename from src/config/profile.js rename to src/config/profiles/apply.js index 809adb5d4..b922bbe08 100644 --- a/src/config/profile.js +++ b/src/config/profiles/apply.js @@ -27,7 +27,7 @@ module.exports = (send) => { if (err) { return callback(err) } - callback(null, { oldCfg: response.OldCfg, newCfg: response.NewCfg }) + callback(null, { old: response.OldCfg, new: response.NewCfg }) }) }) } diff --git a/src/config/profiles/list.js b/src/config/profiles/list.js new file mode 100644 index 000000000..a77fc8af6 --- /dev/null +++ b/src/config/profiles/list.js @@ -0,0 +1,26 @@ +'use strict' + +const configure = require('../../lib/configure') +const callbackify = require('callbackify') +const toCamel = require('../../lib/object-to-camel') + +module.exports = configure(({ ky }) => { + return callbackify.variadic(async (options) => { + options = options || {} + + const searchParams = new URLSearchParams(options.searchParams) + searchParams.set('stream-channels', true) + + const res = await ky.get('config/profile/list', { + timeout: options.timeout, + signal: options.signal, + headers: options.headers, + searchParams + }) + + const parsed = await res.json() + + return parsed + .map(profile => toCamel(profile)) + }) +}) diff --git a/test/interface.spec.js b/test/interface.spec.js index e3c8ffb19..b6f00342e 100644 --- a/test/interface.spec.js +++ b/test/interface.spec.js @@ -48,6 +48,10 @@ describe('interface-ipfs-core tests', () => { { name: 'replace', reason: 'FIXME Waiting for fix on go-ipfs https://github.com/ipfs/js-ipfs-http-client/pull/307#discussion_r69281789 and https://github.com/ipfs/go-ipfs/issues/2927' + }, + { + name: 'should list config profiles', + reason: 'TODO: Not implemented in go-ipfs' } ] }) From 93765c155275d2218c43d6d11082579e8782c3d4 Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 3 Oct 2019 12:13:30 +0100 Subject: [PATCH 2/4] fix: pull in preconfigured chai from interface tests --- package.json | 3 --- test/commands.spec.js | 7 +------ test/constructor.spec.js | 6 +----- test/custom-headers.spec.js | 6 +----- test/dag.spec.js | 7 +------ test/diag.spec.js | 6 +----- test/endpoint-config.spec.js | 6 +----- test/exports.spec.js | 5 +---- test/files-mfs.spec.js | 7 +------ test/get.spec.js | 7 +------ test/key.spec.js | 6 +----- test/lib.configure.spec.js | 6 +----- test/lib.error-handler.spec.js | 5 +---- test/lib.stream-to-iterable.spec.js | 5 +---- test/log.spec.js | 6 +----- test/node/swarm.js | 8 +------- test/ping.spec.js | 7 +------ test/repo.spec.js | 6 +----- test/request-api.spec.js | 5 +---- test/stats.spec.js | 6 +----- test/sub-modules.spec.js | 10 ++++------ 21 files changed, 23 insertions(+), 107 deletions(-) diff --git a/package.json b/package.json index 245a63fc4..ab282dfee 100644 --- a/package.json +++ b/package.json @@ -105,10 +105,7 @@ "devDependencies": { "aegir": "^20.3.1", "browser-process-platform": "~0.1.1", - "chai": "^4.2.0", - "chai-as-promised": "^7.1.1", "cross-env": "^6.0.0", - "dirty-chai": "^2.0.1", "go-ipfs-dep": "^0.4.22", "interface-ipfs-core": "ipfs/interface-js-ipfs-core#add-listing-config-profiles", "ipfsd-ctl": "^0.47.1", diff --git a/test/commands.spec.js b/test/commands.spec.js index 66072c5f9..2f7b1f5e3 100644 --- a/test/commands.spec.js +++ b/test/commands.spec.js @@ -1,13 +1,8 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const ipfsClient = require('../src') - const f = require('./utils/factory') describe('.commands', function () { diff --git a/test/constructor.spec.js b/test/constructor.spec.js index cc6a250c2..e4a7eb1aa 100644 --- a/test/constructor.spec.js +++ b/test/constructor.spec.js @@ -2,11 +2,7 @@ 'use strict' const multiaddr = require('multiaddr') -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const f = require('./utils/factory') const ipfsClient = require('../src/index.js') diff --git a/test/custom-headers.spec.js b/test/custom-headers.spec.js index 8d05897a6..0780c23b9 100644 --- a/test/custom-headers.spec.js +++ b/test/custom-headers.spec.js @@ -2,11 +2,7 @@ 'use strict' const isNode = require('detect-node') -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/dag.spec.js b/test/dag.spec.js index 37433836f..cd58002ad 100644 --- a/test/dag.spec.js +++ b/test/dag.spec.js @@ -3,12 +3,7 @@ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const chaiAsPromised = require('chai-as-promised') -const expect = chai.expect -chai.use(dirtyChai) -chai.use(chaiAsPromised) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const { DAGNode } = require('ipld-dag-pb') const CID = require('cids') const ipfsClient = require('../src') diff --git a/test/diag.spec.js b/test/diag.spec.js index 73efbb2de..e42716214 100644 --- a/test/diag.spec.js +++ b/test/diag.spec.js @@ -1,12 +1,8 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const platform = require('browser-process-platform') - const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/endpoint-config.spec.js b/test/endpoint-config.spec.js index 4747df274..c867717b9 100644 --- a/test/endpoint-config.spec.js +++ b/test/endpoint-config.spec.js @@ -2,12 +2,8 @@ /* eslint max-nested-callbacks: ["error", 8] */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const isNode = require('detect-node') - const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/exports.spec.js b/test/exports.spec.js index 44730c5cc..f97707e13 100644 --- a/test/exports.spec.js +++ b/test/exports.spec.js @@ -9,10 +9,7 @@ const multicodec = require('multicodec') const multihash = require('multihashes') const PeerId = require('peer-id') const PeerInfo = require('peer-info') -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const IpfsHttpClient = require('../') diff --git a/test/files-mfs.spec.js b/test/files-mfs.spec.js index d1c2e0900..203fd6eb5 100644 --- a/test/files-mfs.spec.js +++ b/test/files-mfs.spec.js @@ -2,12 +2,7 @@ /* eslint max-nested-callbacks: ["error", 8] */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const chaiAsPromised = require('chai-as-promised') -const expect = chai.expect -chai.use(dirtyChai) -chai.use(chaiAsPromised) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const loadFixture = require('aegir/fixtures') const mh = require('multihashes') const CID = require('cids') diff --git a/test/get.spec.js b/test/get.spec.js index 05a29ffab..304875bc7 100644 --- a/test/get.spec.js +++ b/test/get.spec.js @@ -3,12 +3,7 @@ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const chaiAsPromised = require('chai-as-promised') -const expect = chai.expect -chai.use(dirtyChai) -chai.use(chaiAsPromised) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const loadFixture = require('aegir/fixtures') const ipfsClient = require('../src') diff --git a/test/key.spec.js b/test/key.spec.js index b332b91ba..2e4e15714 100644 --- a/test/key.spec.js +++ b/test/key.spec.js @@ -2,11 +2,7 @@ /* eslint max-nested-callbacks: ["error", 8] */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/lib.configure.spec.js b/test/lib.configure.spec.js index f58ca4de7..8cb56be5f 100644 --- a/test/lib.configure.spec.js +++ b/test/lib.configure.spec.js @@ -1,13 +1,9 @@ /* eslint-env mocha, browser */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const Multiaddr = require('multiaddr') const { isBrowser, isWebWorker } = require('ipfs-utils/src/env') - const configure = require('../src/lib/configure') describe('lib/configure', () => { diff --git a/test/lib.error-handler.spec.js b/test/lib.error-handler.spec.js index d1a17d147..bdc0fc8a3 100644 --- a/test/lib.error-handler.spec.js +++ b/test/lib.error-handler.spec.js @@ -1,11 +1,8 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') +const { expect } = require('interface-ipfs-core/src/utils/mocha') const { HTTPError } = require('ky-universal') -const expect = chai.expect -chai.use(dirtyChai) const throwsAsync = require('./utils/throws-async') const errorHandler = require('../src/lib/error-handler') diff --git a/test/lib.stream-to-iterable.spec.js b/test/lib.stream-to-iterable.spec.js index 6c14cac94..3ad326480 100644 --- a/test/lib.stream-to-iterable.spec.js +++ b/test/lib.stream-to-iterable.spec.js @@ -1,10 +1,7 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const toIterable = require('../src/lib/stream-to-iterable') describe('lib/stream-to-iterable', () => { diff --git a/test/log.spec.js b/test/log.spec.js index 73ff556e2..a9dbc0274 100644 --- a/test/log.spec.js +++ b/test/log.spec.js @@ -2,11 +2,7 @@ /* eslint max-nested-callbacks: ["error", 8] */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/node/swarm.js b/test/node/swarm.js index 3ec634aea..27d377904 100644 --- a/test/node/swarm.js +++ b/test/node/swarm.js @@ -1,14 +1,8 @@ /* eslint-env mocha */ 'use strict' +const { expect } = require('interface-ipfs-core/src/utils/mocha') const nock = require('nock') -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const chaiAsPromised = require('chai-as-promised') -const expect = chai.expect -chai.use(dirtyChai) -chai.use(chaiAsPromised) - const ipfsClient = require('../../src') describe('.swarm.peers', function () { diff --git a/test/ping.spec.js b/test/ping.spec.js index da141702c..46c58c890 100644 --- a/test/ping.spec.js +++ b/test/ping.spec.js @@ -1,12 +1,7 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const chaiAsPromised = require('chai-as-promised') -const expect = chai.expect -chai.use(dirtyChai) -chai.use(chaiAsPromised) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const pull = require('pull-stream/pull') const collect = require('pull-stream/sinks/collect') diff --git a/test/repo.spec.js b/test/repo.spec.js index c6306f5af..84b5a42c3 100644 --- a/test/repo.spec.js +++ b/test/repo.spec.js @@ -1,11 +1,7 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/request-api.spec.js b/test/request-api.spec.js index a9b2fcf2e..1b0858786 100644 --- a/test/request-api.spec.js +++ b/test/request-api.spec.js @@ -1,10 +1,7 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) +const { expect } = require('interface-ipfs-core/src/utils/mocha') const isNode = require('detect-node') const ipfsClient = require('../src/index.js') const ndjson = require('ndjson') diff --git a/test/stats.spec.js b/test/stats.spec.js index 66b76b270..0b7084d0a 100644 --- a/test/stats.spec.js +++ b/test/stats.spec.js @@ -1,11 +1,7 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const ipfsClient = require('../src') const f = require('./utils/factory') diff --git a/test/sub-modules.spec.js b/test/sub-modules.spec.js index b066b6278..fbecfe637 100644 --- a/test/sub-modules.spec.js +++ b/test/sub-modules.spec.js @@ -1,11 +1,7 @@ /* eslint-env mocha */ 'use strict' -const chai = require('chai') -const dirtyChai = require('dirty-chai') -const expect = chai.expect -chai.use(dirtyChai) - +const { expect } = require('interface-ipfs-core/src/utils/mocha') const defaultConfig = require('../src/utils/default-config.js') const config = defaultConfig() config.host = 'test' @@ -42,7 +38,9 @@ describe('submodules', () => { expect(cfg.get).to.be.a('function') expect(cfg.set).to.be.a('function') expect(cfg.replace).to.be.a('function') - expect(cfg.profile).to.be.a('function') + expect(cfg).to.have.a.property('profiles') + expect(cfg.profiles.list).to.be.a('function') + expect(cfg.profiles.apply).to.be.a('function') }) it('dht', () => { From 024a1221a09afcc4ddcfe5c75335ea2f907a66ef Mon Sep 17 00:00:00 2001 From: achingbrain Date: Thu, 3 Oct 2019 12:46:18 +0100 Subject: [PATCH 3/4] chore: specify commit of dep --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ab282dfee..bcfac457f 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "browser-process-platform": "~0.1.1", "cross-env": "^6.0.0", "go-ipfs-dep": "^0.4.22", - "interface-ipfs-core": "ipfs/interface-js-ipfs-core#add-listing-config-profiles", + "interface-ipfs-core": "ipfs/interface-js-ipfs-core#30118c715d95582eaf65fdf8cb0ee240c504cb1e", "ipfsd-ctl": "^0.47.1", "nock": "^11.3.2", "stream-equal": "^1.1.1" From e11190b9e60de9c4922d3e99f6673886dd28ac8d Mon Sep 17 00:00:00 2001 From: achingbrain Date: Fri, 4 Oct 2019 14:50:45 +0100 Subject: [PATCH 4/4] chore: address pr comments --- package.json | 2 +- src/config/index.js | 2 +- src/config/profiles/apply.js | 54 +++++++++++++----------------------- src/config/profiles/list.js | 8 ++---- 4 files changed, 24 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index bcfac457f..cd0673cad 100644 --- a/package.json +++ b/package.json @@ -107,7 +107,7 @@ "browser-process-platform": "~0.1.1", "cross-env": "^6.0.0", "go-ipfs-dep": "^0.4.22", - "interface-ipfs-core": "ipfs/interface-js-ipfs-core#30118c715d95582eaf65fdf8cb0ee240c504cb1e", + "interface-ipfs-core": "^0.117.0", "ipfsd-ctl": "^0.47.1", "nock": "^11.3.2", "stream-equal": "^1.1.1" diff --git a/src/config/index.js b/src/config/index.js index 731df5bcb..e88c195b5 100644 --- a/src/config/index.js +++ b/src/config/index.js @@ -6,7 +6,7 @@ module.exports = (send, config) => { set: require('./set')(send), replace: require('./replace')(send), profiles: { - apply: require('./profiles/apply')(send), + apply: require('./profiles/apply')(config), list: require('./profiles/list')(config) } } diff --git a/src/config/profiles/apply.js b/src/config/profiles/apply.js index b922bbe08..e4b05560b 100644 --- a/src/config/profiles/apply.js +++ b/src/config/profiles/apply.js @@ -1,41 +1,27 @@ 'use strict' -const promisify = require('promisify-es6') +const callbackify = require('callbackify') +const configure = require('../../lib/configure') -const toObject = function (res, callback) { - if (Buffer.isBuffer(res)) { - callback(null, JSON.parse(res.toString())) - } else { - callback(null, res) - } -} +module.exports = configure(({ ky }) => { + return callbackify.variadic(async (profile, options) => { + options = options || {} -module.exports = (send) => { - return promisify((profile, opts, callback) => { - if (typeof opts === 'function') { - callback = opts - opts = {} - } - - opts = normalizeOpts(opts) - - send.andTransform({ - path: 'config/profile/apply', - args: profile, - qs: opts - }, toObject, (err, response) => { - if (err) { - return callback(err) + const res = await ky.post('config/profile/apply', { + timeout: options.timeout, + signal: options.signal, + headers: options.headers, + searchParams: { + arg: profile, + // can only pass strings or numbers as values https://github.com/sindresorhus/ky/issues/182 + 'dry-run': options.dryRun ? 'true' : 'false' } - callback(null, { old: response.OldCfg, new: response.NewCfg }) }) - }) -} -function normalizeOpts (opts) { - opts = opts || {} - if (typeof opts.dryRun !== 'undefined') { - opts['dry-run'] = opts.dryRun - } - return opts -} + const parsed = await res.json() + + return { + original: parsed.OldCfg, updated: parsed.NewCfg + } + }) +}) diff --git a/src/config/profiles/list.js b/src/config/profiles/list.js index a77fc8af6..dbfa579cf 100644 --- a/src/config/profiles/list.js +++ b/src/config/profiles/list.js @@ -1,21 +1,17 @@ 'use strict' -const configure = require('../../lib/configure') const callbackify = require('callbackify') +const configure = require('../../lib/configure') const toCamel = require('../../lib/object-to-camel') module.exports = configure(({ ky }) => { return callbackify.variadic(async (options) => { options = options || {} - const searchParams = new URLSearchParams(options.searchParams) - searchParams.set('stream-channels', true) - const res = await ky.get('config/profile/list', { timeout: options.timeout, signal: options.signal, - headers: options.headers, - searchParams + headers: options.headers }) const parsed = await res.json()