From d6c681a63752f65832c251421760ee07da79ac05 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Thu, 27 Sep 2018 11:46:26 +0400 Subject: [PATCH 01/22] Added test --- sample.csv | 1 + src/commands/import.js | 20 ++++++++++++++++++++ test/commands/import.test.js | 24 ++++++++++++++++++++++++ 3 files changed, 45 insertions(+) create mode 100644 sample.csv create mode 100644 src/commands/import.js create mode 100644 test/commands/import.test.js diff --git a/sample.csv b/sample.csv new file mode 100644 index 0000000..c09b8b4 --- /dev/null +++ b/sample.csv @@ -0,0 +1 @@ +0011t00000529zYAAQ;https://images.pexels.com/photos/17840/pexels-photo.jpg;;{"key":"value"} \ No newline at end of file diff --git a/src/commands/import.js b/src/commands/import.js new file mode 100644 index 0000000..2707ca3 --- /dev/null +++ b/src/commands/import.js @@ -0,0 +1,20 @@ +const {Command, flags} = require('@oclif/command') + +class ImportCommand extends Command { + async run() { + const {flags} = this.parse(ImportCommand) + const name = flags.name || 'world' + this.log(`hello ${name} from /home/dipshika/sharinpix-cli/src/commands/import.js`) + } +} + +ImportCommand.description = `Describe the command here +... +Extra documentation goes here +` + +ImportCommand.flags = { + name: flags.string({char: 'n', description: 'name to print'}), +} + +module.exports = ImportCommand diff --git a/test/commands/import.test.js b/test/commands/import.test.js new file mode 100644 index 0000000..1ea25c6 --- /dev/null +++ b/test/commands/import.test.js @@ -0,0 +1,24 @@ +const {expect, test} = require('@oclif/test') + +describe('import', () => { + test + .stdout() + .command(['import']) + .it('runs hello', ctx => { + expect(ctx.stdout).to.contain('test must fail') + }) + + test + .stdout() + .command(['import', '--name', 'jeff']) + .it('runs hello --name jeff', ctx => { + expect(ctx.stdout).to.contain('hello jeff') + }) + + test + .stdout() + .command(['import', '--file', '/sample.csv']) + .it('reads csv file', ctx => { + expect(ctx.stdout).to.contain('http') + }) +}) From 06ff9897767bef9405c7077682cfb6d9a41836a5 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Thu, 27 Sep 2018 17:46:02 +0400 Subject: [PATCH 02/22] Import command --- src/commands/import.js | 40 ++++++++++++++++++++++++++++-------- test/commands/import.test.js | 16 +-------------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/src/commands/import.js b/src/commands/import.js index 2707ca3..8c968c9 100644 --- a/src/commands/import.js +++ b/src/commands/import.js @@ -1,20 +1,42 @@ -const {Command, flags} = require('@oclif/command') +const fs = require('fs') +const { Command, flags } = require('@oclif/command') +var _ = require('lodash') +var csv = require('fast-csv') class ImportCommand extends Command { async run() { - const {flags} = this.parse(ImportCommand) - const name = flags.name || 'world' - this.log(`hello ${name} from /home/dipshika/sharinpix-cli/src/commands/import.js`) + const { flags } = this.parse(ImportCommand) + const file = flags.file + + // csv + // .fromPath(file, {headers: false}) + // .on('data', data => { + // this.log(data) + // }) + // .on('end', () => { + + // }) + + var readStream = fs.createReadStream(file) + + csv + .fromStream(readStream, {delimiter : ';'}) + .on('data', (data) => { + var album_id, url, tags, metadatas + [album_id, url, tags, metadatas] = _.values(data) + + console.log(album_id.length) + }) + .on('end', () => { + + }) } } -ImportCommand.description = `Describe the command here -... -Extra documentation goes here -` +ImportCommand.description = `SharinPix-Import Command...` ImportCommand.flags = { - name: flags.string({char: 'n', description: 'name to print'}), + file: flags.string({ char: 'f', description: `file to read` }), } module.exports = ImportCommand diff --git a/test/commands/import.test.js b/test/commands/import.test.js index 1ea25c6..31e56c7 100644 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -3,21 +3,7 @@ const {expect, test} = require('@oclif/test') describe('import', () => { test .stdout() - .command(['import']) - .it('runs hello', ctx => { - expect(ctx.stdout).to.contain('test must fail') - }) - - test - .stdout() - .command(['import', '--name', 'jeff']) - .it('runs hello --name jeff', ctx => { - expect(ctx.stdout).to.contain('hello jeff') - }) - - test - .stdout() - .command(['import', '--file', '/sample.csv']) + .command(['import','--file','sample.csv']) .it('reads csv file', ctx => { expect(ctx.stdout).to.contain('http') }) From c45341981afa1354de2d7794761586b8e03065f5 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Fri, 28 Sep 2018 16:25:16 +0400 Subject: [PATCH 03/22] check csv syntax --- src/commands/import.js | 73 ++++++++++++++++++++++-------------- test/commands/import.test.js | 16 +++++++- 2 files changed, 59 insertions(+), 30 deletions(-) mode change 100644 => 100755 src/commands/import.js mode change 100644 => 100755 test/commands/import.test.js diff --git a/src/commands/import.js b/src/commands/import.js old mode 100644 new mode 100755 index 8c968c9..db1263f --- a/src/commands/import.js +++ b/src/commands/import.js @@ -1,35 +1,52 @@ -const fs = require('fs') -const { Command, flags } = require('@oclif/command') -var _ = require('lodash') -var csv = require('fast-csv') +const { Command, flags } = require('@oclif/command'), + csv = require('fast-csv'), + fs = require('fs'), + _ = require('lodash') class ImportCommand extends Command { async run() { - const { flags } = this.parse(ImportCommand) - const file = flags.file + return new Promise((resolve,reject)=>{ + const { flags } = this.parse(ImportCommand) + const file = flags.file + + var readStream = fs.createReadStream(file), + album_id, url, tags, metadatas, json, errorFlag + + csv + .fromStream(readStream, {delimiter : ';'}) + .on('data', (data) => { + + [album_id, url, tags, metadatas] = _.values(data) + + if (album_id.length != 18){ + console.error(new Error(`Album Id in ${file} should contain 18 characters!`)) + //reject(Error(`Album Id in ${file} should contain 18 characters!`)) + } + + if (!metadatas || metadatas == ''){ + metadatas ='{}' + } + + try{ + json = JSON.parse(metadatas) + } + catch(err){ + } + }) + .on('end', () => { + this.log(`Album Id: ${album_id}`) + this.log(`Album Id length: ${album_id.length}`) + this.log(`Url: ${url}`) + this.log(`Tags: ${tags}`) + this.log(`Metadatas: ${metadatas}`) + this.log(json) + resolve() + }) + .on('error', (err) => { + console.log(err) + }) + }); - // csv - // .fromPath(file, {headers: false}) - // .on('data', data => { - // this.log(data) - // }) - // .on('end', () => { - - // }) - - var readStream = fs.createReadStream(file) - - csv - .fromStream(readStream, {delimiter : ';'}) - .on('data', (data) => { - var album_id, url, tags, metadatas - [album_id, url, tags, metadatas] = _.values(data) - - console.log(album_id.length) - }) - .on('end', () => { - - }) } } diff --git a/test/commands/import.test.js b/test/commands/import.test.js old mode 100644 new mode 100755 index 31e56c7..9845895 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -1,10 +1,22 @@ -const {expect, test} = require('@oclif/test') +const {expect, test} = require('@oclif/test'), + fs = require('fs'), + csv = require('fast-csv'), + _ = require('lodash'), + assert = require("assert") describe('import', () => { test .stdout() .command(['import','--file','sample.csv']) .it('reads csv file', ctx => { - expect(ctx.stdout).to.contain('http') + assert.notEqual(-1, ctx.stdout.indexOf('Album Id length: 18')); + expect(ctx.stdout).to.contain('Metadatas: {}') + }) + + test + .stderr() + .command(['import','--file','sample_bad.csv']) + .it('AlbumId not 18 characters', ctx => { + expect(ctx.stderr).to.contain('Album Id in sample_bad.csv should contain 18 characters!') }) }) From 3e6fa8f874795029c349eba3a8d4db9e7ad93536 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 2 Oct 2018 15:01:18 +0400 Subject: [PATCH 04/22] sharinpix-import --- sample.csv | 5 ++- src/commands/hello.js | 20 ------------ src/commands/import.js | 61 ++---------------------------------- src/index.js | 1 + test/commands/hello.test.js | 17 ---------- test/commands/import.test.js | 18 ++--------- 6 files changed, 10 insertions(+), 112 deletions(-) mode change 100644 => 100755 sample.csv delete mode 100644 src/commands/hello.js mode change 100644 => 100755 src/index.js delete mode 100644 test/commands/hello.test.js diff --git a/sample.csv b/sample.csv old mode 100644 new mode 100755 index c09b8b4..b73c909 --- a/sample.csv +++ b/sample.csv @@ -1 +1,4 @@ -0011t00000529zYAAQ;https://images.pexels.com/photos/17840/pexels-photo.jpg;;{"key":"value"} \ No newline at end of file +000000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} +100000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} +200000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} +300000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} \ No newline at end of file diff --git a/src/commands/hello.js b/src/commands/hello.js deleted file mode 100644 index 257718f..0000000 --- a/src/commands/hello.js +++ /dev/null @@ -1,20 +0,0 @@ -const {Command, flags} = require('@oclif/command') - -class HelloCommand extends Command { - async run() { - const {flags} = this.parse(HelloCommand) - const name = flags.name || 'world' - this.log(`hello ${name} from ./src/commands/hello.js`) - } -} - -HelloCommand.description = `Describe the command here -... -Extra documentation goes here -` - -HelloCommand.flags = { - name: flags.string({char: 'n', description: 'name to print'}), -} - -module.exports = HelloCommand diff --git a/src/commands/import.js b/src/commands/import.js index db1263f..3fe7d68 100755 --- a/src/commands/import.js +++ b/src/commands/import.js @@ -1,59 +1,2 @@ -const { Command, flags } = require('@oclif/command'), - csv = require('fast-csv'), - fs = require('fs'), - _ = require('lodash') - -class ImportCommand extends Command { - async run() { - return new Promise((resolve,reject)=>{ - const { flags } = this.parse(ImportCommand) - const file = flags.file - - var readStream = fs.createReadStream(file), - album_id, url, tags, metadatas, json, errorFlag - - csv - .fromStream(readStream, {delimiter : ';'}) - .on('data', (data) => { - - [album_id, url, tags, metadatas] = _.values(data) - - if (album_id.length != 18){ - console.error(new Error(`Album Id in ${file} should contain 18 characters!`)) - //reject(Error(`Album Id in ${file} should contain 18 characters!`)) - } - - if (!metadatas || metadatas == ''){ - metadatas ='{}' - } - - try{ - json = JSON.parse(metadatas) - } - catch(err){ - } - }) - .on('end', () => { - this.log(`Album Id: ${album_id}`) - this.log(`Album Id length: ${album_id.length}`) - this.log(`Url: ${url}`) - this.log(`Tags: ${tags}`) - this.log(`Metadatas: ${metadatas}`) - this.log(json) - resolve() - }) - .on('error', (err) => { - console.log(err) - }) - }); - - } -} - -ImportCommand.description = `SharinPix-Import Command...` - -ImportCommand.flags = { - file: flags.string({ char: 'f', description: `file to read` }), -} - -module.exports = ImportCommand +require('coffeescript/register'); +module.exports = require('./import.coffee') \ No newline at end of file diff --git a/src/index.js b/src/index.js old mode 100644 new mode 100755 index 176eca6..278e36b --- a/src/index.js +++ b/src/index.js @@ -1 +1,2 @@ +require('coffeescript/register'); module.exports = require('@oclif/command') diff --git a/test/commands/hello.test.js b/test/commands/hello.test.js deleted file mode 100644 index 4b13497..0000000 --- a/test/commands/hello.test.js +++ /dev/null @@ -1,17 +0,0 @@ -const {expect, test} = require('@oclif/test') - -describe('hello', () => { - test - .stdout() - .command(['hello']) - .it('runs hello', ctx => { - expect(ctx.stdout).to.contain('hello world') - }) - - test - .stdout() - .command(['hello', '--name', 'jeff']) - .it('runs hello --name jeff', ctx => { - expect(ctx.stdout).to.contain('hello jeff') - }) -}) diff --git a/test/commands/import.test.js b/test/commands/import.test.js index 9845895..3eba1f2 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -1,22 +1,10 @@ -const {expect, test} = require('@oclif/test'), - fs = require('fs'), - csv = require('fast-csv'), - _ = require('lodash'), - assert = require("assert") +const {expect, test} = require('@oclif/test') describe('import', () => { test .stdout() .command(['import','--file','sample.csv']) - .it('reads csv file', ctx => { - assert.notEqual(-1, ctx.stdout.indexOf('Album Id length: 18')); - expect(ctx.stdout).to.contain('Metadatas: {}') - }) - - test - .stderr() - .command(['import','--file','sample_bad.csv']) - .it('AlbumId not 18 characters', ctx => { - expect(ctx.stderr).to.contain('Album Id in sample_bad.csv should contain 18 characters!') + .it('sends csv file successfully', ctx => { + expect(ctx.stdout).to.contain('sample.csv imported') }) }) From bda70b6989bd3d18ed4a54d8a3e2731de5822578 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 2 Oct 2018 17:24:04 +0400 Subject: [PATCH 05/22] import.coffee --- src/commands/import.coffee | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/commands/import.coffee diff --git a/src/commands/import.coffee b/src/commands/import.coffee new file mode 100644 index 0000000..0ad5391 --- /dev/null +++ b/src/commands/import.coffee @@ -0,0 +1,31 @@ +{Command, flags} = require('@oclif/command') +SpImport = require('sharinpix-import') +# Sharinpix = require('sharinpix'); + +class ImportCommand extends Command + run: -> + {flags} = @parse(ImportCommand) + file = flags.file + + new Promise((resolve, reject) -> + resolve SpImport(file) + ).then (result)=> + @log("#{file} imported") + + # Sharinpix.get_instance().post("/imports", { + # import_type: 'url' + # album_id: 'dipshika' + # url: 'https://google.com' + # tags: [] + # metadatas: {import_id: 'dipshika'} + # }).then (results)=> + # this.log("blabla") + +ImportCommand.description = "Import images" + +ImportCommand.flags = file: flags.string( + char: 'f' + description: 'Path of file to import' + required: true) + +module.exports = ImportCommand \ No newline at end of file From c9781ccc1302a5d6cb6c25a5e58cac87bb84a5a4 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 2 Oct 2018 17:32:58 +0400 Subject: [PATCH 06/22] package.json --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) mode change 100644 => 100755 package.json diff --git a/package.json b/package.json old mode 100644 new mode 100755 index 94b8055..49d47bc --- a/package.json +++ b/package.json @@ -10,7 +10,11 @@ "dependencies": { "@oclif/command": "^1.5.1", "@oclif/config": "^1.7.6", - "@oclif/plugin-help": "^2.1.2" + "@oclif/plugin-help": "^2.1.2", + "coffeescript": "^2.3.2", + "fast-csv": "^2.4.1", + "sharinpix-import": "^1.0.3", + "sharinpix-js": "0.0.9" }, "devDependencies": { "@oclif/dev-cli": "^1.18.1", From 9befb6c2a08bc81723d482640cb9e4afbcef4e3c Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Fri, 5 Oct 2018 15:34:51 +0400 Subject: [PATCH 07/22] read csv and import with test class --- package.json | 5 +++- src/commands/import.coffee | 49 +++++++++++++++++++++++------------- src/commands/import.js | 2 +- test/commands/import.test.js | 18 +++++++++++-- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 49d47bc..f5c9860 100755 --- a/package.json +++ b/package.json @@ -22,7 +22,10 @@ "chai": "^4.2.0", "globby": "^8.0.1", "mocha": "^5.2.0", - "nyc": "^13.0.1" + "nock": "^10.0.0", + "nyc": "^13.0.1", + "proxyquire": "^2.1.0", + "sinon": "^6.3.4" }, "engines": { "node": ">=8.0.0" diff --git a/src/commands/import.coffee b/src/commands/import.coffee index 0ad5391..ce4191e 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -1,31 +1,44 @@ {Command, flags} = require('@oclif/command') SpImport = require('sharinpix-import') -# Sharinpix = require('sharinpix'); +Sharinpix = require('sharinpix-js') +async = require('async') +csv = require('fast-csv') +fs = require('fs') class ImportCommand extends Command run: -> {flags} = @parse(ImportCommand) file = flags.file - new Promise((resolve, reject) -> - resolve SpImport(file) - ).then (result)=> - @log("#{file} imported") + q = async.queue((task, callback)-> + console.log 'task' + line = "#{task.album_id},#{task.url},#{task.tags},#{task.metadatas}" + Sharinpix.get_instance().post("/imports", { + import_type: 'url' + album_id: "#{task.album_id}" + url: "#{task.url}" + metadatas: "#{task.metadatas}" + }).then((result)-> + console.log(line) + callback() + , (err)-> + console.error(line) + callback() + ) + , 10) - # Sharinpix.get_instance().post("/imports", { - # import_type: 'url' - # album_id: 'dipshika' - # url: 'https://google.com' - # tags: [] - # metadatas: {import_id: 'dipshika'} - # }).then (results)=> - # this.log("blabla") + csv + .fromStream(fs.createReadStream(file), delimiter: ';') + .on "data", (data)-> + console.log 'read' + q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) ImportCommand.description = "Import images" -ImportCommand.flags = file: flags.string( - char: 'f' - description: 'Path of file to import' - required: true) +ImportCommand.flags = + file: flags.string( + char: 'f' + description: 'Path of file to import' + required: true) -module.exports = ImportCommand \ No newline at end of file +module.exports = ImportCommand diff --git a/src/commands/import.js b/src/commands/import.js index 3fe7d68..41b253b 100755 --- a/src/commands/import.js +++ b/src/commands/import.js @@ -1,2 +1,2 @@ -require('coffeescript/register'); +require('coffeescript/register') module.exports = require('./import.coffee') \ No newline at end of file diff --git a/test/commands/import.test.js b/test/commands/import.test.js index 3eba1f2..d832db0 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -1,10 +1,24 @@ -const {expect, test} = require('@oclif/test') +const {expect, test} = require('@oclif/test'), + sinon = require('sinon'), + sharinpix = require('sharinpix-js') describe('import', () => { + var fakepost; + beforeEach(() => { + fakepost = sinon.fake() + var stub = sinon.stub(sharinpix, 'get_instance') + stub.returns({post: fakepost}) + }) + test .stdout() .command(['import','--file','sample.csv']) .it('sends csv file successfully', ctx => { - expect(ctx.stdout).to.contain('sample.csv imported') + // expect(fakepost.getCall(0).args).to.equals([]) + expect(fakepost.getCall(0).args[0]).to.equals('/imports') + expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') + expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') + // expect(fakepost.getCall(0).args[1].tags).to.equals([]) + //expect(fakepost.getCall(0).args[1].metadatas.import_id).to.equals('{"key":"value"}') }) }) From 83315b4ff1501782e8c1bb48ff89a69d1d0f638a Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Fri, 5 Oct 2018 18:11:28 +0400 Subject: [PATCH 08/22] promise --- src/commands/import.coffee | 19 +++++++++++++------ test/commands/import.test.js | 4 ++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/commands/import.coffee b/src/commands/import.coffee index ce4191e..b64b382 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -1,5 +1,4 @@ {Command, flags} = require('@oclif/command') -SpImport = require('sharinpix-import') Sharinpix = require('sharinpix-js') async = require('async') csv = require('fast-csv') @@ -27,11 +26,19 @@ class ImportCommand extends Command ) , 10) - csv - .fromStream(fs.createReadStream(file), delimiter: ';') - .on "data", (data)-> - console.log 'read' - q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) + await new Promise (resolve, reject)-> + console.log(1) + csv + .fromStream(fs.createReadStream(file), delimiter: ';') + .on "data", (data)-> + console.log 'read' + q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) + .on "end", -> + resolve() + + await new Promise (resolve, reject)-> + q.drain ()-> + resolve() ImportCommand.description = "Import images" diff --git a/test/commands/import.test.js b/test/commands/import.test.js index d832db0..8de64cb 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -13,12 +13,12 @@ describe('import', () => { test .stdout() .command(['import','--file','sample.csv']) - .it('sends csv file successfully', ctx => { + .it('sends csv file successfully', () => { // expect(fakepost.getCall(0).args).to.equals([]) expect(fakepost.getCall(0).args[0]).to.equals('/imports') expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') // expect(fakepost.getCall(0).args[1].tags).to.equals([]) - //expect(fakepost.getCall(0).args[1].metadatas.import_id).to.equals('{"key":"value"}') + // expect(fakepost.getCall(0).args[1].metadatas.import_id).to.equals('{"key":"value"}') }) }) From 7ca5c0f8772cba09dd79c7b53863f2902efa066e Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Mon, 8 Oct 2018 18:04:36 +0400 Subject: [PATCH 09/22] Debug class and test --- src/commands/import.coffee | 34 +++++++++++++++++++--------------- test/commands/import.test.js | 17 ++++++++++++----- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/commands/import.coffee b/src/commands/import.coffee index b64b382..44d6400 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -4,20 +4,23 @@ async = require('async') csv = require('fast-csv') fs = require('fs') +wstream = fs.createWriteStream('myOutput.txt') + class ImportCommand extends Command - run: -> + run: => {flags} = @parse(ImportCommand) file = flags.file - q = async.queue((task, callback)-> - console.log 'task' + q = async.queue((task, callback)=> line = "#{task.album_id},#{task.url},#{task.tags},#{task.metadatas}" Sharinpix.get_instance().post("/imports", { import_type: 'url' album_id: "#{task.album_id}" url: "#{task.url}" + tags: "#{task.tags}" metadatas: "#{task.metadatas}" - }).then((result)-> + }) + .then((result)-> console.log(line) callback() , (err)-> @@ -27,18 +30,19 @@ class ImportCommand extends Command , 10) await new Promise (resolve, reject)-> - console.log(1) - csv - .fromStream(fs.createReadStream(file), delimiter: ';') - .on "data", (data)-> - console.log 'read' - q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) - .on "end", -> - resolve() + try + csv + .fromStream(fs.createReadStream(file), delimiter: ';') + .on "data", (data)-> + q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) + .on "end", -> + resolve() + catch e + @log e + console.log e - await new Promise (resolve, reject)-> - q.drain ()-> - resolve() + q.drain => + resolve() ImportCommand.description = "Import images" diff --git a/test/commands/import.test.js b/test/commands/import.test.js index 8de64cb..1ec2f60 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -5,20 +5,27 @@ const {expect, test} = require('@oclif/test'), describe('import', () => { var fakepost; beforeEach(() => { - fakepost = sinon.fake() + instance = sharinpix.get_instance() + fakepost = sinon.fake.returns(new Promise((resolve, reject) => { + return('apple pie') + })) + + returnValue = { + post: fakepost + } + var stub = sinon.stub(sharinpix, 'get_instance') - stub.returns({post: fakepost}) + stub.returns(returnValue) }) test .stdout() .command(['import','--file','sample.csv']) .it('sends csv file successfully', () => { - // expect(fakepost.getCall(0).args).to.equals([]) expect(fakepost.getCall(0).args[0]).to.equals('/imports') expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') - // expect(fakepost.getCall(0).args[1].tags).to.equals([]) - // expect(fakepost.getCall(0).args[1].metadatas.import_id).to.equals('{"key":"value"}') + expect(fakepost.getCall(0).args[1].tags).to.equals('foo,bar,dim') + expect(fakepost.getCall(0).args[1].metadatas).to.equals('{"key":"value"}') }) }) From 58c6e5d0abe841901ec78cabc12725e9d06ceb05 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 9 Oct 2018 09:33:29 +0400 Subject: [PATCH 10/22] Remove unnecessary lines --- src/commands/import.coffee | 18 ++++++------------ test/commands/import.test.js | 10 +++------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/src/commands/import.coffee b/src/commands/import.coffee index 44d6400..0dc2321 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -4,8 +4,6 @@ async = require('async') csv = require('fast-csv') fs = require('fs') -wstream = fs.createWriteStream('myOutput.txt') - class ImportCommand extends Command run: => {flags} = @parse(ImportCommand) @@ -30,16 +28,12 @@ class ImportCommand extends Command , 10) await new Promise (resolve, reject)-> - try - csv - .fromStream(fs.createReadStream(file), delimiter: ';') - .on "data", (data)-> - q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) - .on "end", -> - resolve() - catch e - @log e - console.log e + csv + .fromStream(fs.createReadStream(file), delimiter: ';') + .on "data", (data)-> + q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) + .on "end", -> + resolve() q.drain => resolve() diff --git a/test/commands/import.test.js b/test/commands/import.test.js index 1ec2f60..6938dc3 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -4,18 +4,14 @@ const {expect, test} = require('@oclif/test'), describe('import', () => { var fakepost; + beforeEach(() => { - instance = sharinpix.get_instance() fakepost = sinon.fake.returns(new Promise((resolve, reject) => { - return('apple pie') + return('fake response') })) - returnValue = { - post: fakepost - } - var stub = sinon.stub(sharinpix, 'get_instance') - stub.returns(returnValue) + stub.returns({post: fakepost}) }) test From 5d6913146e1062ec215c360547164ba75344ce9a Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 9 Oct 2018 09:40:37 +0400 Subject: [PATCH 11/22] Update package.json --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index f5c9860..4d000bd 100755 --- a/package.json +++ b/package.json @@ -13,7 +13,6 @@ "@oclif/plugin-help": "^2.1.2", "coffeescript": "^2.3.2", "fast-csv": "^2.4.1", - "sharinpix-import": "^1.0.3", "sharinpix-js": "0.0.9" }, "devDependencies": { @@ -22,9 +21,7 @@ "chai": "^4.2.0", "globby": "^8.0.1", "mocha": "^5.2.0", - "nock": "^10.0.0", "nyc": "^13.0.1", - "proxyquire": "^2.1.0", "sinon": "^6.3.4" }, "engines": { From 28d573f22575f8034feec00fd59253a369071984 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 9 Oct 2018 09:46:37 +0400 Subject: [PATCH 12/22] travis --- .travis.yml | 3 ++- src/commands/import.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) mode change 100644 => 100755 .travis.yml diff --git a/.travis.yml b/.travis.yml old mode 100644 new mode 100755 index 859b15c..48f0838 --- a/.travis.yml +++ b/.travis.yml @@ -9,4 +9,5 @@ notifications: before_script: - npm install script: - - npm test \ No newline at end of file + - npm test + \ No newline at end of file diff --git a/src/commands/import.js b/src/commands/import.js index 41b253b..7ba00d7 100755 --- a/src/commands/import.js +++ b/src/commands/import.js @@ -1,2 +1,2 @@ require('coffeescript/register') -module.exports = require('./import.coffee') \ No newline at end of file +module.exports = require('./import.coffee') From b94fbe6bcb799717f0563d5a1207ae5295a9c098 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 9 Oct 2018 09:54:14 +0400 Subject: [PATCH 13/22] travis --- .travis.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 48f0838..f65fdca 100755 --- a/.travis.yml +++ b/.travis.yml @@ -1,13 +1,7 @@ -sudo: required cache: directories: - node_modules -notifications: - email: - on_success: never - on_failure: always before_script: - npm install script: - npm test - \ No newline at end of file From bd867f624843a0499e4662fea1fbe11a9e235370 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 9 Oct 2018 11:09:01 +0400 Subject: [PATCH 14/22] sample test --- sample.csv => importsample.csv | 0 src/commands/import.coffee | 3 --- test/commands/import.test.js | 2 +- 3 files changed, 1 insertion(+), 4 deletions(-) rename sample.csv => importsample.csv (100%) diff --git a/sample.csv b/importsample.csv similarity index 100% rename from sample.csv rename to importsample.csv diff --git a/src/commands/import.coffee b/src/commands/import.coffee index 0dc2321..c97a285 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -35,9 +35,6 @@ class ImportCommand extends Command .on "end", -> resolve() - q.drain => - resolve() - ImportCommand.description = "Import images" ImportCommand.flags = diff --git a/test/commands/import.test.js b/test/commands/import.test.js index 6938dc3..ec5b865 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -16,7 +16,7 @@ describe('import', () => { test .stdout() - .command(['import','--file','sample.csv']) + .command(['import','--file','importsample.csv']) .it('sends csv file successfully', () => { expect(fakepost.getCall(0).args[0]).to.equals('/imports') expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') From 93b7816b38f83c03cd59a44d7ff68c91ce44e02f Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Tue, 9 Oct 2018 12:31:39 +0400 Subject: [PATCH 15/22] test in coffee --- test/commands/import.test.coffee | 23 +++++++++++++++++++++++ test/commands/import.test.js | 29 ++--------------------------- 2 files changed, 25 insertions(+), 27 deletions(-) create mode 100644 test/commands/import.test.coffee diff --git a/test/commands/import.test.coffee b/test/commands/import.test.coffee new file mode 100644 index 0000000..3a60990 --- /dev/null +++ b/test/commands/import.test.coffee @@ -0,0 +1,23 @@ +{expect, test} = require '@oclif/test' +sinon = require 'sinon' +sharinpix = require 'sharinpix-js' + +describe 'import', -> + fakepost = sinon.fake + + beforeEach ()-> + fakepost = fakepost.returns new Promise (resolve, reject) -> + return 'fake response' + + stub = sinon.stub sharinpix, 'get_instance' + stub.returns {post: fakepost} + + test + .stdout() + .command ['import','--file','importsample.csv'] + .it 'sends csv file successfully', -> + expect(fakepost.getCall(0).args[0]).to.equals('/imports') + expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') + expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') + expect(fakepost.getCall(0).args[1].tags).to.equals('foo,bar,dim') + expect(fakepost.getCall(0).args[1].metadatas).to.equals('{"key":"value"}') diff --git a/test/commands/import.test.js b/test/commands/import.test.js index ec5b865..e153513 100755 --- a/test/commands/import.test.js +++ b/test/commands/import.test.js @@ -1,27 +1,2 @@ -const {expect, test} = require('@oclif/test'), - sinon = require('sinon'), - sharinpix = require('sharinpix-js') - -describe('import', () => { - var fakepost; - - beforeEach(() => { - fakepost = sinon.fake.returns(new Promise((resolve, reject) => { - return('fake response') - })) - - var stub = sinon.stub(sharinpix, 'get_instance') - stub.returns({post: fakepost}) - }) - - test - .stdout() - .command(['import','--file','importsample.csv']) - .it('sends csv file successfully', () => { - expect(fakepost.getCall(0).args[0]).to.equals('/imports') - expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') - expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') - expect(fakepost.getCall(0).args[1].tags).to.equals('foo,bar,dim') - expect(fakepost.getCall(0).args[1].metadatas).to.equals('{"key":"value"}') - }) -}) +require('coffeescript/register') +module.exports = require('./import.test.coffee') \ No newline at end of file From 90ff48be4f0a4ebce1ec6597c370fe8f3ca6a893 Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Wed, 10 Oct 2018 11:24:23 +0400 Subject: [PATCH 16/22] new queue --- src/commands/import.coffee | 32 +++++++++---------- src/commands/queue.coffee | 53 ++++++++++++++++++++++++++++++++ test/commands/import.test.coffee | 8 ++--- 3 files changed, 72 insertions(+), 21 deletions(-) create mode 100644 src/commands/queue.coffee diff --git a/src/commands/import.coffee b/src/commands/import.coffee index c97a285..4ebbc1d 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -3,29 +3,24 @@ Sharinpix = require('sharinpix-js') async = require('async') csv = require('fast-csv') fs = require('fs') +Queue = require('./queue') class ImportCommand extends Command run: => {flags} = @parse(ImportCommand) file = flags.file - q = async.queue((task, callback)=> - line = "#{task.album_id},#{task.url},#{task.tags},#{task.metadatas}" - Sharinpix.get_instance().post("/imports", { - import_type: 'url' - album_id: "#{task.album_id}" - url: "#{task.url}" - tags: "#{task.tags}" - metadatas: "#{task.metadatas}" - }) - .then((result)-> - console.log(line) - callback() - , (err)-> - console.error(line) - callback() - ) - , 10) + q = new Queue({ + concurency: 5, + callback: (task)-> + await Sharinpix.get_instance().post("/imports", { + import_type: 'url' + album_id: "#{task.album_id}" + url: "#{task.url}" + tags: "#{task.tags}" + metadatas: "#{task.metadatas}" + }) + }) await new Promise (resolve, reject)-> csv @@ -33,8 +28,11 @@ class ImportCommand extends Command .on "data", (data)-> q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) .on "end", -> + console.log('read csv') resolve() + await q.end() + ImportCommand.description = "Import images" ImportCommand.flags = diff --git a/src/commands/queue.coffee b/src/commands/queue.coffee new file mode 100644 index 0000000..86a5785 --- /dev/null +++ b/src/commands/queue.coffee @@ -0,0 +1,53 @@ +class Queue + constructor: (@config)-> + @tasks = [] + @concurency = 0 + @_end = false + @end_callback = null + @end_promise = new Promise (resolve, reject)=> + @end_callback = resolve + push: (task)-> + console.log('push', task) + @tasks.push(task) + @run() + run: -> + if @concurency == 0 && @tasks.length == 0 && @_end + @end_callback() + + if @concurency <= @config.concurency + task = @tasks.pop() + if task? + @run_task(task) + @run() + end: -> + @_end = true + @run() + @end_promise + run_task: (task)-> + @concurency += 1 + console.log('run', task) + @config.callback(task).then => + console.log('done', task) + @concurency -= 1 + @run() + +module.exports = Queue + +# (-> +# q = new Queue({ +# concurency: 5, +# callback: -> +# await new Promise (resolve, reject)-> +# setTimeout(resolve, 1000) +# }); + +# q.push('a') +# q.push('b') +# q.push('c') +# q.push('d') +# q.push('e') +# q.push('f') +# console.log('before end') +# await q.end() +# console.log('END !') +# )() \ No newline at end of file diff --git a/test/commands/import.test.coffee b/test/commands/import.test.coffee index 3a60990..9703c95 100644 --- a/test/commands/import.test.coffee +++ b/test/commands/import.test.coffee @@ -3,12 +3,12 @@ sinon = require 'sinon' sharinpix = require 'sharinpix-js' describe 'import', -> - fakepost = sinon.fake + fakepost = null beforeEach ()-> - fakepost = fakepost.returns new Promise (resolve, reject) -> - return 'fake response' - + fakepost = sinon.fake.returns(new Promise((resolve, reject)-> + resolve() + )) stub = sinon.stub sharinpix, 'get_instance' stub.returns {post: fakepost} From 56793dd05da7cb8d1ab599f293dd3a5bb641e750 Mon Sep 17 00:00:00 2001 From: Luc Boissaye Date: Wed, 10 Oct 2018 09:19:23 -0400 Subject: [PATCH 17/22] Update import.test.coffee --- test/commands/import.test.coffee | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/commands/import.test.coffee b/test/commands/import.test.coffee index 9703c95..246ab4b 100644 --- a/test/commands/import.test.coffee +++ b/test/commands/import.test.coffee @@ -6,7 +6,7 @@ describe 'import', -> fakepost = null beforeEach ()-> - fakepost = sinon.fake.returns(new Promise((resolve, reject)-> + fakepost = sinon.fake.returns(new Promise((resolve, reject)-> resolve() )) stub = sinon.stub sharinpix, 'get_instance' @@ -19,5 +19,13 @@ describe 'import', -> expect(fakepost.getCall(0).args[0]).to.equals('/imports') expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') - expect(fakepost.getCall(0).args[1].tags).to.equals('foo,bar,dim') + expect(fakepost.getCall(0).args[1].tags).to.equals(['sport', 'action', 'fun']) expect(fakepost.getCall(0).args[1].metadatas).to.equals('{"key":"value"}') + + expect(fakepost.getCall(1).args[0]).to.equals('/imports') + expect(fakepost.getCall(1).args[1].album_id).to.equals('000000000000000001') + expect(fakepost.getCall(1).args[1].url).to.equals('http://lorempixel.com/400/200/portrait/') + expect(fakepost.getCall(1).args[1].tags).to.equals(['portrait', 'face', 'amazing']) + expect(fakepost.getCall(1).args[1].metadatas).to.equals('{"key":"value"}') + + expect(fakepost.callCount).to.equals(4) From 66f597d02db3e9ed5e2d09deec6859efab0d7000 Mon Sep 17 00:00:00 2001 From: Luc Boissaye Date: Wed, 10 Oct 2018 09:22:03 -0400 Subject: [PATCH 18/22] Update import.test.coffee --- test/commands/import.test.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/commands/import.test.coffee b/test/commands/import.test.coffee index 246ab4b..6655fdb 100644 --- a/test/commands/import.test.coffee +++ b/test/commands/import.test.coffee @@ -20,12 +20,12 @@ describe 'import', -> expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') expect(fakepost.getCall(0).args[1].tags).to.equals(['sport', 'action', 'fun']) - expect(fakepost.getCall(0).args[1].metadatas).to.equals('{"key":"value"}') + expect(fakepost.getCall(0).args[1].metadatas).to.equals({"key":"value"}) expect(fakepost.getCall(1).args[0]).to.equals('/imports') expect(fakepost.getCall(1).args[1].album_id).to.equals('000000000000000001') expect(fakepost.getCall(1).args[1].url).to.equals('http://lorempixel.com/400/200/portrait/') expect(fakepost.getCall(1).args[1].tags).to.equals(['portrait', 'face', 'amazing']) - expect(fakepost.getCall(1).args[1].metadatas).to.equals('{"key":"value"}') + expect(fakepost.getCall(1).args[1].metadatas).to.equals({"key":"value"}) expect(fakepost.callCount).to.equals(4) From 95cd2852d8d2a7f3071510a7fb187df6317216fc Mon Sep 17 00:00:00 2001 From: DJoyekurun Date: Thu, 11 Oct 2018 14:49:22 +0400 Subject: [PATCH 19/22] parsed tags/metadatas + success/error files --- importsample.csv | 8 ++++---- src/commands/import.coffee | 22 ++++++++++++++-------- test/commands/import.test.coffee | 31 ++++++++++++++++++++++--------- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/importsample.csv b/importsample.csv index b73c909..1aba77b 100755 --- a/importsample.csv +++ b/importsample.csv @@ -1,4 +1,4 @@ -000000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} -100000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} -200000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} -300000000000000000;http://lorempixel.com/400/200/sports/;foo,bar,dim;{"key":"value"} \ No newline at end of file +000000000000000000;http://lorempixel.com/400/200/sports/;sport,action,fun;{"key":"value"} +100000000000000000;http://lorempixel.com/400/200/portrait/;portrait,face,amazing;{"key":"value"} +200000000000000000;http://lorempixel.com/400/200/forest/;forest,tree,green;{"key":"value"} +300000000000000000;http://lorempixel.com/400/200/school/;student,teacher,school;{"key":"value"} diff --git a/src/commands/import.coffee b/src/commands/import.coffee index 4ebbc1d..bc02395 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -3,32 +3,38 @@ Sharinpix = require('sharinpix-js') async = require('async') csv = require('fast-csv') fs = require('fs') -Queue = require('./queue') +queue = require('./queue') class ImportCommand extends Command run: => {flags} = @parse(ImportCommand) file = flags.file - q = new Queue({ + successcsv = fs.createWriteStream('Success.csv') + errorcsv = fs.createWriteStream('Error.csv') + + q = new queue concurency: 5, callback: (task)-> + line = "#{task.album_id}, #{task.url}, #{task.tags}, #{task.metadatas}" + await Sharinpix.get_instance().post("/imports", { import_type: 'url' album_id: "#{task.album_id}" url: "#{task.url}" - tags: "#{task.tags}" - metadatas: "#{task.metadatas}" - }) - }) + tags: task.tags + metadatas: task.metadatas + }).then (result)-> + successcsv.write(line + '\n') + , (err)-> + errorcsv.write(line + '\n') await new Promise (resolve, reject)-> csv .fromStream(fs.createReadStream(file), delimiter: ';') .on "data", (data)-> - q.push(album_id: data[0], url: data[1], tags: data[2], metadatas: data[3]) + q.push(album_id: data[0], url: data[1], tags: data[2].split(','), metadatas: JSON.parse(data[3])) .on "end", -> - console.log('read csv') resolve() await q.end() diff --git a/test/commands/import.test.coffee b/test/commands/import.test.coffee index 6655fdb..cff71f3 100644 --- a/test/commands/import.test.coffee +++ b/test/commands/import.test.coffee @@ -1,14 +1,15 @@ {expect, test} = require '@oclif/test' sinon = require 'sinon' sharinpix = require 'sharinpix-js' +fs = require 'fs' describe 'import', -> fakepost = null - beforeEach ()-> - fakepost = sinon.fake.returns(new Promise((resolve, reject)-> + before -> + fakepost = sinon.fake.returns new Promise (resolve, reject)-> resolve() - )) + stub = sinon.stub sharinpix, 'get_instance' stub.returns {post: fakepost} @@ -17,15 +18,27 @@ describe 'import', -> .command ['import','--file','importsample.csv'] .it 'sends csv file successfully', -> expect(fakepost.getCall(0).args[0]).to.equals('/imports') + expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') - expect(fakepost.getCall(0).args[1].tags).to.equals(['sport', 'action', 'fun']) - expect(fakepost.getCall(0).args[1].metadatas).to.equals({"key":"value"}) + expect(fakepost.getCall(0).args[1].tags).to.deep.equal(["sport", "action", "fun"]) + expect(fakepost.getCall(0).args[1].metadatas).to.deep.equal({"key":"value"}) - expect(fakepost.getCall(1).args[0]).to.equals('/imports') - expect(fakepost.getCall(1).args[1].album_id).to.equals('000000000000000001') + expect(fakepost.getCall(1).args[1].album_id).to.equals('100000000000000000') expect(fakepost.getCall(1).args[1].url).to.equals('http://lorempixel.com/400/200/portrait/') - expect(fakepost.getCall(1).args[1].tags).to.equals(['portrait', 'face', 'amazing']) - expect(fakepost.getCall(1).args[1].metadatas).to.equals({"key":"value"}) + expect(fakepost.getCall(1).args[1].tags).to.deep.equal(["portrait", "face", "amazing"]) + expect(fakepost.getCall(1).args[1].metadatas).to.deep.equal({"key":"value"}) + + expect(fakepost.getCall(2).args[1].album_id).to.equals('200000000000000000') + expect(fakepost.getCall(2).args[1].url).to.equals('http://lorempixel.com/400/200/forest/') + expect(fakepost.getCall(2).args[1].tags).to.deep.equal(["forest", "tree", "green"]) + expect(fakepost.getCall(2).args[1].metadatas).to.deep.equal({"key":"value"}) + + expect(fakepost.getCall(3).args[1].album_id).to.equals('300000000000000000') + expect(fakepost.getCall(3).args[1].url).to.equals('http://lorempixel.com/400/200/school/') + expect(fakepost.getCall(3).args[1].tags).to.deep.equal(["student", "teacher", "school"]) + expect(fakepost.getCall(3).args[1].metadatas).to.deep.equal({"key":"value"}) expect(fakepost.callCount).to.equals(4) + + expect(fs.existsSync('Success.csv')).to.be.true From af116e6b5738e1e3d1cab729ae08cddaa973326a Mon Sep 17 00:00:00 2001 From: Luc Boissaye Date: Fri, 14 Dec 2018 17:04:51 -0400 Subject: [PATCH 20/22] Dirty WIP Luc --- importsample.csv | 9 +- package-lock.json | 431 +++++++++++++++++++++++++++++-- package.json | 3 +- src/commands/import.coffee | 65 +++-- src/commands/queue.coffee | 8 +- test/commands/import.test.coffee | 19 +- 6 files changed, 473 insertions(+), 62 deletions(-) diff --git a/importsample.csv b/importsample.csv index 1aba77b..d528dac 100755 --- a/importsample.csv +++ b/importsample.csv @@ -1,4 +1,5 @@ -000000000000000000;http://lorempixel.com/400/200/sports/;sport,action,fun;{"key":"value"} -100000000000000000;http://lorempixel.com/400/200/portrait/;portrait,face,amazing;{"key":"value"} -200000000000000000;http://lorempixel.com/400/200/forest/;forest,tree,green;{"key":"value"} -300000000000000000;http://lorempixel.com/400/200/school/;student,teacher,school;{"key":"value"} +album_id;url;tags;metadatas.key +000000000000000000;http://lorempixel.com/400/200/sports/;sport,action,fun;value1 +100000000000000000;http://lorempixel.com/400/200/portrait/;portrait,face,amazing;value2 +200000000000000000;http://lorempixel.com/400/200/forest/;forest,tree,green;value3 +300000000000000000;http://lorempixel.com/400/200/school/;student,teacher,school;value4 diff --git a/package-lock.json b/package-lock.json index 31b5c59..a685023 100644 --- a/package-lock.json +++ b/package-lock.json @@ -236,6 +236,30 @@ "fancy-test": "^1.4.1" } }, + "@sinonjs/commons": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", + "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", + "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", + "dev": true, + "requires": { + "@sinonjs/samsam": "^2 || ^3" + } + }, + "@sinonjs/samsam": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.3.tgz", + "integrity": "sha512-8zNeBkSKhU9a5cRNbpCKau2WWPfan+Q2zDlcXvXyhn9EsMqgYs4qzo0XHNVlXC6ABQL8fT6nV+zzo5RTHJzyXw==", + "dev": true + }, "@types/chai": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.5.tgz", @@ -300,6 +324,15 @@ "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=", "dev": true }, + "arguments-extended": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/arguments-extended/-/arguments-extended-0.0.3.tgz", + "integrity": "sha1-YQfkkX0OtvCk3WYyD8Fa/HLvSUY=", + "requires": { + "extended": "~0.0.3", + "is-extended": "~0.0.8" + } + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -318,6 +351,16 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-extended": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/array-extended/-/array-extended-0.0.11.tgz", + "integrity": "sha1-1xRK50jek8pybxIQCdv/FibRZL0=", + "requires": { + "arguments-extended": "~0.0.3", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -357,6 +400,14 @@ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", "dev": true }, + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "requires": { + "lodash": "^4.17.10" + } + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -434,6 +485,11 @@ "safe-buffer": "^5.1.1" } }, + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==" + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -631,6 +687,11 @@ "supports-hyperlinks": "^1.0.1" } }, + "coffeescript": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.3.2.tgz", + "integrity": "sha512-YObiFDoukx7qPBi/K0kUKyntEZDfBQiqs/DbrR1xzASKOBjGT7auD85/DiPeRr9k++lRj7l3uA9TNMLfyfcD/Q==" + }, "collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -654,6 +715,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "combined-stream": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "2.15.1", "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", @@ -663,8 +732,7 @@ "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, "concat-map": { "version": "0.0.1", @@ -678,6 +746,11 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, + "cookiejar": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -687,8 +760,7 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cross-spawn": { "version": "6.0.5", @@ -703,6 +775,36 @@ "which": "^1.2.9" } }, + "csvtojson": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/csvtojson/-/csvtojson-2.0.8.tgz", + "integrity": "sha512-DC6YFtsJiA7t/Yz+KjzT6GXuKtU/5gRbbl7HJqvDVVir+dxdw2/1EgwfgJdnsvUT7lOnON5DvGftKuYWX1nMOQ==", + "requires": { + "bluebird": "^3.5.1", + "lodash": "^4.17.3", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "date-extended": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/date-extended/-/date-extended-0.0.6.tgz", + "integrity": "sha1-I4AtV90b94GIE/4MMuhRqG2iZ8k=", + "requires": { + "array-extended": "~0.0.3", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, "debug": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz", @@ -711,6 +813,11 @@ "ms": "^2.1.1" } }, + "declare.js": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/declare.js/-/declare.js-0.0.8.tgz", + "integrity": "sha1-BHit/5VkwAT1Hfc9i8E0AZ0o3N4=" + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -767,6 +874,11 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, "detect-indent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", @@ -889,6 +1001,11 @@ } } }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", @@ -910,6 +1027,22 @@ } } }, + "extended": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/extended/-/extended-0.0.6.tgz", + "integrity": "sha1-f7i/e52uOXWG5IVwrP1kLHjlBmk=", + "requires": { + "extender": "~0.0.5" + } + }, + "extender": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/extender/-/extender-0.0.10.tgz", + "integrity": "sha1-WJwHSCvmGhRgttgfnCSqZ+jzJM0=", + "requires": { + "declare.js": "~0.0.4" + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -998,6 +1131,17 @@ "stdout-stderr": "^0.1.9" } }, + "fast-csv": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-2.4.1.tgz", + "integrity": "sha1-vX3SaDkfcpNntZRFuN0K0CaIGyY=", + "requires": { + "extended": "0.0.6", + "is-extended": "0.0.10", + "object-extended": "0.0.7", + "string-extended": "0.0.8" + } + }, "fast-glob": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", @@ -1050,6 +1194,28 @@ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", "dev": true }, + "form-data": { + "version": "1.0.0-rc4", + "resolved": "http://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz", + "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", + "requires": { + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "formidable": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -1281,8 +1447,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "invariant": { "version": "2.2.4", @@ -1379,6 +1544,14 @@ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", "dev": true }, + "is-extended": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/is-extended/-/is-extended-0.0.10.tgz", + "integrity": "sha1-JE4UDfdbscmjEG9BL/GC+1NKbWI=", + "requires": { + "extended": "~0.0.3" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1446,6 +1619,11 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -1461,8 +1639,7 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", @@ -1515,6 +1692,11 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -1523,6 +1705,17 @@ "graceful-fs": "^4.1.6" } }, + "jsrsasign": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/jsrsasign/-/jsrsasign-5.0.12.tgz", + "integrity": "sha1-1i6jZlGKUv87AP+BOcCC8JA8rFA=" + }, + "just-extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz", + "integrity": "sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ==", + "dev": true + }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", @@ -1554,14 +1747,19 @@ "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, "lodash._reinterpolate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.template": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", @@ -1579,6 +1777,12 @@ "lodash._reinterpolate": "~3.0.0" } }, + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + }, "loose-envify": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", @@ -1618,6 +1822,11 @@ "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==", "dev": true }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -1639,6 +1848,24 @@ "to-regex": "^3.0.2" } }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" + }, + "mime-types": { + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "requires": { + "mime-db": "~1.37.0" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1773,12 +2000,43 @@ "to-regex": "^3.0.1" } }, + "ndjson": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/ndjson/-/ndjson-1.5.0.tgz", + "integrity": "sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg=", + "requires": { + "json-stringify-safe": "^5.0.1", + "minimist": "^1.2.0", + "split2": "^2.1.0", + "through2": "^2.0.3" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "nise": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.7.tgz", + "integrity": "sha512-5cxvo/pEAEHBX5s0zl+zd96BvHHuua/zttIHeQuTWSDjGrWsEHamty8xbZNfocC+fx7NMrle7XHvvxtFxobIZQ==", + "dev": true, + "requires": { + "@sinonjs/formatio": "^3.1.0", + "just-extend": "^3.0.0", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -2962,6 +3220,16 @@ } } }, + "object-extended": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/object-extended/-/object-extended-0.0.7.tgz", + "integrity": "sha1-hP0j9WsVWCrrPoiwXLVdJDLWijM=", + "requires": { + "array-extended": "~0.0.4", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3075,6 +3343,23 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", @@ -3114,8 +3399,12 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise-polyfill": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", + "integrity": "sha1-36lpQ+qcEh/KTem1hoyznTRy4Fc=" }, "pump": { "version": "1.0.3", @@ -3170,11 +3459,15 @@ } } }, + "qs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", + "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" + }, "readable-stream": { "version": "2.3.6", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3194,6 +3487,11 @@ "esprima": "~4.0.0" } }, + "reduce-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/reduce-component/-/reduce-component-1.0.1.tgz", + "integrity": "sha1-4Mk1QsV0UhvqE98PlIjtgqt3xdo=" + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -3231,8 +3529,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -3271,6 +3568,19 @@ } } }, + "sharinpix-js": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/sharinpix-js/-/sharinpix-js-0.0.9.tgz", + "integrity": "sha512-3xCw1LhSadZhKM0SBUf75HcPrWyHT0ZxRCoFiKW/NQQHjcY1ixvy1Y2W9catcnf/vkoD9QmUcowEs4BqvvWSpA==", + "requires": { + "async": "^2.5.0", + "coffeescript": "^2.3.1", + "fast-csv": "^2.4.1", + "jsrsasign": "5.0.12", + "promise-polyfill": "^6.1.0", + "superagent": "2.0.0" + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -3292,6 +3602,23 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "sinon": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-6.3.5.tgz", + "integrity": "sha512-xgoZ2gKjyVRcF08RrIQc+srnSyY1JDJtxu3Nsz07j1ffjgXoY6uPLf/qja6nDBZgzYYEovVkFryw2+KiZz11xQ==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "@sinonjs/formatio": "^3.0.0", + "@sinonjs/samsam": "^2.1.2", + "diff": "^3.5.0", + "lodash.get": "^4.4.2", + "lolex": "^2.7.5", + "nise": "^1.4.5", + "supports-color": "^5.5.0", + "type-detect": "^4.0.8" + } + }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", @@ -3495,6 +3822,14 @@ "extend-shallow": "^3.0.0" } }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -3537,6 +3872,17 @@ } } }, + "string-extended": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/string-extended/-/string-extended-0.0.8.tgz", + "integrity": "sha1-dBlX3/SHsCcqee7FpE8jnubxfM0=", + "requires": { + "array-extended": "~0.0.5", + "date-extended": "~0.0.3", + "extended": "~0.0.3", + "is-extended": "~0.0.3" + } + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -3550,7 +3896,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -3575,6 +3920,39 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, + "superagent": { + "version": "2.0.0", + "resolved": "http://registry.npmjs.org/superagent/-/superagent-2.0.0.tgz", + "integrity": "sha1-SZgg8Lbk3TUKIc1Wa1yBVx5MdYQ=", + "requires": { + "component-emitter": "^1.2.0", + "cookiejar": "^2.0.6", + "debug": "^2.2.0", + "extend": "^3.0.0", + "form-data": "1.0.0-rc4", + "formidable": "^1.0.17", + "methods": "^1.1.1", + "mime": "^1.3.4", + "qs": "^6.1.0", + "readable-stream": "^2.0.5", + "reduce-component": "^1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3628,6 +4006,21 @@ "xtend": "^4.0.0" } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -3812,8 +4205,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "validate-npm-package-license": { "version": "3.0.4", @@ -3886,8 +4278,7 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" } } } diff --git a/package.json b/package.json index 4d000bd..137c909 100755 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "@oclif/config": "^1.7.6", "@oclif/plugin-help": "^2.1.2", "coffeescript": "^2.3.2", - "fast-csv": "^2.4.1", + "csvtojson": "^2.0.8", + "ndjson": "^1.5.0", "sharinpix-js": "0.0.9" }, "devDependencies": { diff --git a/src/commands/import.coffee b/src/commands/import.coffee index bc02395..e14723b 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -1,41 +1,56 @@ {Command, flags} = require('@oclif/command') Sharinpix = require('sharinpix-js') async = require('async') -csv = require('fast-csv') +csv = require('csvtojson') fs = require('fs') queue = require('./queue') +ndjson = require('ndjson') class ImportCommand extends Command run: => {flags} = @parse(ImportCommand) - file = flags.file + # If file is a csv we convert it to ndjson + import_id = (new Date()).getTime() + if /^.*\.csv$/.test(flags.file) + console.log 'Converting file' + ndjsonFilename = "#{flags.file}.ndjson" + ndjsonFile = fs.openSync(ndjsonFilename, 'w') + await new Promise (resolve, reject)-> + csv(delimiter: ';') + .fromFile(flags.file) + .subscribe((obj)-> + fs.writeSync(ndjsonFile, JSON.stringify(obj)+"\n") + , reject + , resolve) + flags.file = ndjsonFilename + console.log 'Converted !' - successcsv = fs.createWriteStream('Success.csv') - errorcsv = fs.createWriteStream('Error.csv') + errors = fs.openSync("#{flags.file}-errors.ndjson", 'w') + success = fs.openSync("#{flags.file}-success.ndjson", 'w') q = new queue - concurency: 5, - callback: (task)-> - line = "#{task.album_id}, #{task.url}, #{task.tags}, #{task.metadatas}" - - await Sharinpix.get_instance().post("/imports", { - import_type: 'url' - album_id: "#{task.album_id}" - url: "#{task.url}" - tags: task.tags - metadatas: task.metadatas - }).then (result)-> - successcsv.write(line + '\n') + concurency: 20, + callback: (input)-> + obj = JSON.parse(JSON.stringify(input)) + obj.import_type ||= 'url' + obj.metadatas ||= {} + obj.metadatas.import_id ||= import_id + if typeof obj.tags == 'string' + obj.tags = obj.tags.split(',') + console.log '>', obj + await Sharinpix.get_instance().post( + '/imports', + obj + ).then (result)-> + fs.writeSync(success,JSON.stringify(input)+"\n") , (err)-> - errorcsv.write(line + '\n') - - await new Promise (resolve, reject)-> - csv - .fromStream(fs.createReadStream(file), delimiter: ';') - .on "data", (data)-> - q.push(album_id: data[0], url: data[1], tags: data[2].split(','), metadatas: JSON.parse(data[3])) - .on "end", -> - resolve() + fs.writeSync(errors, JSON.stringify(input)+"\n") + + fs.createReadStream(flags.file) + .pipe(ndjson.parse()) + .on('data', (data)-> + q.push(data) + ) await q.end() diff --git a/src/commands/queue.coffee b/src/commands/queue.coffee index 86a5785..8279b50 100644 --- a/src/commands/queue.coffee +++ b/src/commands/queue.coffee @@ -7,7 +7,7 @@ class Queue @end_promise = new Promise (resolve, reject)=> @end_callback = resolve push: (task)-> - console.log('push', task) + # console.log('push', task) @tasks.push(task) @run() run: -> @@ -25,9 +25,9 @@ class Queue @end_promise run_task: (task)-> @concurency += 1 - console.log('run', task) + # console.log('run', task) @config.callback(task).then => - console.log('done', task) + # console.log('done', task) @concurency -= 1 @run() @@ -50,4 +50,4 @@ module.exports = Queue # console.log('before end') # await q.end() # console.log('END !') -# )() \ No newline at end of file +# )() diff --git a/test/commands/import.test.coffee b/test/commands/import.test.coffee index cff71f3..e430aaf 100644 --- a/test/commands/import.test.coffee +++ b/test/commands/import.test.coffee @@ -9,7 +9,10 @@ describe 'import', -> before -> fakepost = sinon.fake.returns new Promise (resolve, reject)-> resolve() - + fs.unlinkSync('importsample.csv.ndjson') + fs.unlinkSync('importsample.csv.ndjson-success.ndjson') + fs.unlinkSync('importsample.csv.ndjson-errors.ndjson') + stub = sinon.stub sharinpix, 'get_instance' stub.returns {post: fakepost} @@ -22,23 +25,23 @@ describe 'import', -> expect(fakepost.getCall(0).args[1].album_id).to.equals('000000000000000000') expect(fakepost.getCall(0).args[1].url).to.equals('http://lorempixel.com/400/200/sports/') expect(fakepost.getCall(0).args[1].tags).to.deep.equal(["sport", "action", "fun"]) - expect(fakepost.getCall(0).args[1].metadatas).to.deep.equal({"key":"value"}) - + expect(fakepost.getCall(0).args[1].metadatas).to.deep.equal({"key":"value1"}) + expect(fakepost.getCall(1).args[1].album_id).to.equals('100000000000000000') expect(fakepost.getCall(1).args[1].url).to.equals('http://lorempixel.com/400/200/portrait/') expect(fakepost.getCall(1).args[1].tags).to.deep.equal(["portrait", "face", "amazing"]) - expect(fakepost.getCall(1).args[1].metadatas).to.deep.equal({"key":"value"}) + expect(fakepost.getCall(1).args[1].metadatas).to.deep.equal({"key":"value2"}) expect(fakepost.getCall(2).args[1].album_id).to.equals('200000000000000000') expect(fakepost.getCall(2).args[1].url).to.equals('http://lorempixel.com/400/200/forest/') expect(fakepost.getCall(2).args[1].tags).to.deep.equal(["forest", "tree", "green"]) - expect(fakepost.getCall(2).args[1].metadatas).to.deep.equal({"key":"value"}) + expect(fakepost.getCall(2).args[1].metadatas).to.deep.equal({"key":"value3"}) expect(fakepost.getCall(3).args[1].album_id).to.equals('300000000000000000') expect(fakepost.getCall(3).args[1].url).to.equals('http://lorempixel.com/400/200/school/') expect(fakepost.getCall(3).args[1].tags).to.deep.equal(["student", "teacher", "school"]) - expect(fakepost.getCall(3).args[1].metadatas).to.deep.equal({"key":"value"}) - + expect(fakepost.getCall(3).args[1].metadatas).to.deep.equal({"key":"value4"}) + expect(fakepost.callCount).to.equals(4) - expect(fs.existsSync('Success.csv')).to.be.true + expect(fs.existsSync('importsample.csv.ndjson')).to.be.true From 54ddd18c1b49d9e4cc55477df71c2f54374b6d6e Mon Sep 17 00:00:00 2001 From: kevanmoothien Date: Tue, 18 Jun 2019 11:17:28 +0400 Subject: [PATCH 21/22] concurrency added --- src/commands/import.coffee | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/commands/import.coffee b/src/commands/import.coffee index e14723b..e024291 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -29,7 +29,7 @@ class ImportCommand extends Command success = fs.openSync("#{flags.file}-success.ndjson", 'w') q = new queue - concurency: 20, + concurency: flags.concurency, callback: (input)-> obj = JSON.parse(JSON.stringify(input)) obj.import_type ||= 'url' @@ -61,5 +61,10 @@ ImportCommand.flags = char: 'f' description: 'Path of file to import' required: true) + concurency: flags.string( + char: 'c' + description: 'Set concurrency value. Default to 10' + required: false + default: 10) module.exports = ImportCommand From f0d060d9f7aea26a73d8f0112333570c6637291b Mon Sep 17 00:00:00 2001 From: kevanmoothien Date: Wed, 19 Jun 2019 13:58:23 +0400 Subject: [PATCH 22/22] add console count5 --- src/commands/import.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/commands/import.coffee b/src/commands/import.coffee index e024291..38cf0b5 100644 --- a/src/commands/import.coffee +++ b/src/commands/import.coffee @@ -28,6 +28,7 @@ class ImportCommand extends Command errors = fs.openSync("#{flags.file}-errors.ndjson", 'w') success = fs.openSync("#{flags.file}-success.ndjson", 'w') + count = 0 q = new queue concurency: flags.concurency, callback: (input)-> @@ -37,7 +38,9 @@ class ImportCommand extends Command obj.metadatas.import_id ||= import_id if typeof obj.tags == 'string' obj.tags = obj.tags.split(',') + count = count + 1 console.log '>', obj + console.log ">>> count: #{count}" await Sharinpix.get_instance().post( '/imports', obj