1
0
mirror of https://github.com/node-red/node-red.git synced 2023-10-10 13:36:53 +02:00

add parts support for CSV node (#1496)

* add parts support for CSV node

* make CSV node to preserve incoming parts property
This commit is contained in:
Hiroyasu Nishiyama 2017-12-06 00:39:51 +09:00 committed by Dave Conway-Jones
parent 422fbcb0b7
commit 6d2fd2e641
2 changed files with 62 additions and 12 deletions

View File

@ -174,12 +174,7 @@ module.exports = function(RED) {
o[node.template[j]] = k[j]; o[node.template[j]] = k[j];
} }
if (JSON.stringify(o) !== "{}") { // don't send empty objects if (JSON.stringify(o) !== "{}") { // don't send empty objects
if (node.multi === "one") { a.push(o); // add to the array
var newMessage = RED.util.cloneMessage(msg);
newMessage.payload = o;
node.send(newMessage); // either send
}
else { a.push(o); } // or add to the array
} }
j = 0; j = 0;
k = [""]; k = [""];
@ -200,17 +195,28 @@ module.exports = function(RED) {
o[node.template[j]] = k[j]; o[node.template[j]] = k[j];
} }
if (JSON.stringify(o) !== "{}") { // don't send empty objects if (JSON.stringify(o) !== "{}") { // don't send empty objects
if (node.multi === "one") { a.push(o); // add to the aray
var newMessage = RED.util.cloneMessage(msg);
newMessage.payload = o;
node.send(newMessage); // either send
}
else { a.push(o); } // or add to the aray
} }
if (node.multi !== "one") { if (node.multi !== "one") {
msg.payload = a; msg.payload = a;
node.send(msg); // finally send the array node.send(msg); // finally send the array
} }
else {
var has_parts = msg.hasOwnProperty("parts");
var len = a.length;
for(var i = 0; i < len; i++) {
var newMessage = RED.util.cloneMessage(msg);
newMessage.payload = a[i];
if(!has_parts) {
newMessage.parts = {
id: msg._msgid,
index: i,
count: len
};
}
node.send(newMessage);
}
}
} }
catch(e) { node.error(e,msg); } catch(e) { node.error(e,msg); }
} }

View File

@ -46,6 +46,23 @@ describe('CSV node', function() {
}); });
describe('csv to json', function() { describe('csv to json', function() {
var parts_id = undefined;
afterEach(function() {
parts_id = undefined;
});
function check_parts(msg, index, count) {
msg.should.have.property('parts');
if(parts_id === undefined) {
parts_id = msg.parts.id;
}
else {
msg.parts.should.have.property('id', parts_id);
}
msg.parts.should.have.property('index', index);
msg.parts.should.have.property('count', count);
}
it('should convert a simple csv string to a javascript object', function(done) { it('should convert a simple csv string to a javascript object', function(done) {
var flow = [ { id:"n1", type:"csv", temp:"a,b,c,d", wires:[["n2"]] }, var flow = [ { id:"n1", type:"csv", temp:"a,b,c,d", wires:[["n2"]] },
@ -55,6 +72,7 @@ describe('CSV node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 }); msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = "1,2,3,4"+String.fromCharCode(10); var testString = "1,2,3,4"+String.fromCharCode(10);
@ -70,6 +88,7 @@ describe('CSV node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 }); msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = "1,2,3,4"+String.fromCharCode(10); var testString = "1,2,3,4"+String.fromCharCode(10);
@ -85,6 +104,7 @@ describe('CSV node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('payload', { col1: 1, col2: 2, col3: 3, col4: 4 }); msg.should.have.property('payload', { col1: 1, col2: 2, col3: 3, col4: 4 });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = "1,2,3,4"+String.fromCharCode(10); var testString = "1,2,3,4"+String.fromCharCode(10);
@ -100,6 +120,7 @@ describe('CSV node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('payload', { a: 1, d: 4 }); msg.should.have.property('payload', { a: 1, d: 4 });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = "1,2,3,4"+String.fromCharCode(10); var testString = "1,2,3,4"+String.fromCharCode(10);
@ -117,6 +138,7 @@ describe('CSV node', function() {
n2.on("input", function(msg) { n2.on("input", function(msg) {
//console.log(msg); //console.log(msg);
msg.should.have.property('payload', { a: 1, b: -2, c: '+3', d: 4, e: -5, f: 'ab"cd', g: 'with,a,comma' }); msg.should.have.property('payload', { a: 1, b: -2, c: '+3', d: 4, e: -5, f: 'ab"cd', g: 'with,a,comma' });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = '"1","-2","+3","04","-05","ab""cd","with,a,comma"'+String.fromCharCode(10); var testString = '"1","-2","+3","04","-05","ab""cd","with,a,comma"'+String.fromCharCode(10);
@ -134,6 +156,7 @@ describe('CSV node', function() {
//console.log(msg); //console.log(msg);
msg.should.have.property('payload', { a: "with,an", b: "odd,number", c: "ofquotes" }); msg.should.have.property('payload', { a: "with,an", b: "odd,number", c: "ofquotes" });
//msg.should.have.property('payload', { a: 1, b: -2, c: '+3', d: 4, e: -5, f: 'ab"cd', g: 'with,a,comma' }); //msg.should.have.property('payload', { a: 1, b: -2, c: '+3', d: 4, e: -5, f: 'ab"cd', g: 'with,a,comma' });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = '"with,a"n,odd","num"ber","of"qu"ot"es"'+String.fromCharCode(10); var testString = '"with,a"n,odd","num"ber","of"qu"ot"es"'+String.fromCharCode(10);
@ -152,10 +175,12 @@ describe('CSV node', function() {
//console.log(msg); //console.log(msg);
if (c === 0) { if (c === 0) {
msg.should.have.property('payload', { w: 1, x: 2, y: 3, z: 4 }); msg.should.have.property('payload', { w: 1, x: 2, y: 3, z: 4 });
check_parts(msg, 0, 2);
c += 1; c += 1;
} }
else { else {
msg.should.have.property('payload', { w: 5, x: 6, y: 7, z: 8 }); msg.should.have.property('payload', { w: 5, x: 6, y: 7, z: 8 });
check_parts(msg, 1, 2);
done(); done();
} }
}); });
@ -172,6 +197,7 @@ describe('CSV node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('payload', [ { a: 1, b: 2, c: 3, d: 4 },{ a: 5, b: -6, c: 7, d: '+8' },{ a: 9, b: 0, c: 'a', d: 'b' },{ a: 'c', b: 'd', c: 'e', d: 'f' } ]); msg.should.have.property('payload', [ { a: 1, b: 2, c: 3, d: 4 },{ a: 5, b: -6, c: 7, d: '+8' },{ a: 9, b: 0, c: 'a', d: 'b' },{ a: 'c', b: 'd', c: 'e', d: 'f' } ]);
msg.should.not.have.property('parts');
done(); done();
}); });
var testString = "1,2,3,4\n5,-6,07,+8\n9,0,a,b\nc,d,e,f"; var testString = "1,2,3,4\n5,-6,07,+8\n9,0,a,b\nc,d,e,f";
@ -187,12 +213,30 @@ describe('CSV node', function() {
var n2 = helper.getNode("n2"); var n2 = helper.getNode("n2");
n2.on("input", function(msg) { n2.on("input", function(msg) {
msg.should.have.property('payload', { a: "a", b: "127.0.0.1", c: 56.7, d: -32.8, e: "+76.22C" }); msg.should.have.property('payload', { a: "a", b: "127.0.0.1", c: 56.7, d: -32.8, e: "+76.22C" });
check_parts(msg, 0, 1);
done(); done();
}); });
var testString = "a,127.0.0.1,56.7,-32.8,+76.22C"; var testString = "a,127.0.0.1,56.7,-32.8,+76.22C";
n1.emit("input", {payload:testString}); n1.emit("input", {payload:testString});
}); });
}); });
it('should preserve parts property', function(done) {
var flow = [ { id:"n1", type:"csv", temp:"a,b,c,d", wires:[["n2"]] },
{id:"n2", type:"helper"} ];
helper.load(csvNode, flow, function() {
var n1 = helper.getNode("n1");
var n2 = helper.getNode("n2");
n2.on("input", function(msg) {
msg.should.have.property('payload', { a: 1, b: 2, c: 3, d: 4 });
check_parts(msg, 3, 4);
done();
});
var testString = "1,2,3,4"+String.fromCharCode(10);
n1.emit("input", {payload:testString, parts: {id:"X", index:3, count:4} });
});
});
}); });
describe('json object to csv', function() { describe('json object to csv', function() {