Skip to content

Commit

Permalink
0.9.5 Enhance transform with path and setting source and target
Browse files Browse the repository at this point in the history
  • Loading branch information
peterprib committed Jun 3, 2020
1 parent f3ba730 commit d3d52ef
Show file tree
Hide file tree
Showing 7 changed files with 112 additions and 59 deletions.
2 changes: 2 additions & 0 deletions README.md
Expand Up @@ -175,6 +175,8 @@ Test/example flow in test/generalTest.json

# Version

0.9.5 Enhance transform with path and setting source and target

0.9.4 Outlier allowed to set number of deviations if median and reset or set stats

0.9.1 Add outlier detection
Expand Down
15 changes: 7 additions & 8 deletions append/append.js
@@ -1,6 +1,4 @@
const nodeLabel="append";
const Logger = require("node-red-contrib-logger");
const logger = new Logger(nodeLabel);
const logger = new (require("node-red-contrib-logger"))("append");
logger.sendInfo("Copyright 2020 Jaroslav Peter Prib");

const fs=require('fs'),
Expand All @@ -24,12 +22,13 @@ module.exports = function (RED) {
continue;
}
try{
var filename= require.resolve(file.value);
var filename= require.resolve(file.value);
node.log("loading: "+filename);
node.data+=fs.readFileSync(filename);
} catch(err) {
node.error("require "+file.value+" "+err);
errCnt++;
} catch(ex) {
logger.send("not found require")
node.error("require "+file.value+" "+ex);
errCnt++;
}
}
node.status({fill:errCnt<1?"green":"red",shape:"ring",text:"initially loaded: "+loadCnt+" errors: "+errCnt});
Expand All @@ -39,5 +38,5 @@ module.exports = function (RED) {
node.send(msg);
});
}
RED.nodes.registerType(nodeLabel,appendNode);
RED.nodes.registerType(logger.label,appendNode);
};
2 changes: 1 addition & 1 deletion dataAnalysis/dataAnalysis.html
Expand Up @@ -199,7 +199,7 @@

<script type="text/x-red" data-help-name="Data Analysis">
<p>
Various functions on array of vaules expected in msg.payload or selected location. Output msg.result.
Various functions on array of values expected in msg.payload or selected location. Output msg.result.
</p>
<p>
If realtime metrics it calculates various statistical metrics as it receives key and value in msg.payload property
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
@@ -1,6 +1,6 @@
{
"name": "node-red-contrib-prib-functions",
"version": "0.9.4",
"version": "0.9.5",
"description": "Node-RED added node functions.",
"dependencies": {
"node-red-contrib-logger": "0.0.2"
Expand Down
56 changes: 43 additions & 13 deletions transform/transform.html
Expand Up @@ -8,6 +8,8 @@
name: {value: ""},
actionSource: {value:"csv",required:true},
actionTarget: {value:"JSON",required:true},
sourceProperty:{value:"msg.payload"},
targetProperty:{value:"msg.payload"},
delimiter: {value:",",required:true}
},
inputs: 1,
Expand All @@ -22,11 +24,35 @@
},
oneditprepare: function() {
$("#node-input-actionSource").change(function() {
if($(this).val()=="csv") {
$(".form-row-in-http-delimiter").show();
} else {
$(".form-row-http-in-delimiter").hide();
}
$(".form-row-http-in-delimiter").hide();
let options={};
switch ($(this).val()) {
case 'csv':
$(".form-row-in-http-delimiter").show();
break;
case 'path':
options["Basename"]="basename";
options["Dirname"]="dirname";
options["Extname"]="extname";
options["IsAbsolute"]="isAbsolute";
options["Join"]="join";
options["Normalize"]="normalize";
options["Resolve"]="resolve";
break;
default:
options["Array"]="Array";
options["CSVWithHeader"]="CSV with header";
options["CSV"]="CSV";
options["ISO8385"]="ISO 8583";
options["HTML"]="HTML";
options["JSON"]="JSON";
options["String"]="String";
}
const selectElement = $("#node-input-actionTarget");
selectElement.empty(); // remove old options
$.each(options, function(key,value) {
selectElement.append($("<option></option>").attr("value", key).text(value));
});
}).change();
$("#node-input-actionTarget").change(function() {
if($(this).val()=="csv") {
Expand Down Expand Up @@ -55,7 +81,17 @@
<label for="node-input-name"><i class="fa fa-tag"></i> Name </label>
<input type="text" id="node-input-name" placeholder="Name">
</div>


<div class="form-row form-row-http-in-sourceProperty show">
<label for="node-input-sourceProperty" style="white-space: nowrap"><i class="icon-bookmark"></i> Source Property </label>
<input type="text" id="node-input-sourceProperty" placeholder="msg.payload">
</div>

<div class="form-row form-row-http-in-targetProperty show">
<label for="node-input-targetProperty" style="white-space: nowrap"><i class="icon-bookmark"></i> Target Property </label>
<input type="text" id="node-input-targetProperty" placeholder="msg.payload">
</div>

<div class="form-row">
<label for="node-input-actionSource"><i class="fa fa-list-ul"></i> Source Type </label>
<select id="node-input-actionSource" placeholder="actionSource">
Expand All @@ -65,19 +101,13 @@
<option value="ISO8385">ISO 8583</option>
<option value="JSON">JSON</option>
<option value="String">String</option>
<option value="path">Path</option>
</select>
</div>

<div class="form-row">
<label for="node-input-actionTarget"><i class="fa fa-list-ul"></i> Target Type </label>
<select id="node-input-actionTarget" placeholder="actionTarget">
<option value="Array">Array</option>
<option value="CSVWithHeader">CSV with header</option>
<option value="CSV">CSV</option>
<option value="ISO8385">ISO 8583</option>
<option value="HTML">HTML</option>
<option value="JSON">JSON</option>
<option value="String">String</option>
</select>
</div>

Expand Down
92 changes: 57 additions & 35 deletions transform/transform.js
Expand Up @@ -6,10 +6,13 @@ logger.sendInfo("Copyright 2020 Jaroslav Peter Prib");
let ISO8583,ISO8583message;
const regexLines=/(?!\B"[^"]*)\n(?![^"]*"\B)/g;
const regexCSV=/,(?=(?:(?:[^"]*"){2})*[^"]*$)/;
const path = require('path');
function removeQuotes(d){
return d.length>1 && d.startsWith('"') && d.endsWith('"') ? d.slice(1,-1) : d;
}
const functions={
ArrayToCSV: (data)=>data.map(x=>JSON.stringify(x)).join("\n"),
ArrayToISO8385: (data)=>ISO8583message.packSync(data),
CSVToArray: (data)=>{
let lines = data.split(regexLines);
lines.forEach((value, idx) => {
Expand Down Expand Up @@ -38,7 +41,6 @@ const functions={
});
return r;
},
ArrayToISO8385: (data)=>ISO8583message.packSync(data),
JSONToISO8385: (data)=>{
var d=[];
Object.getOwnPropertyNames(data).forEach((v)=>d.push([ISO8583BitMapName[v].id,data[v]]));
Expand Down Expand Up @@ -71,48 +73,68 @@ const functions={
}
return escape(data);
},
ArrayToCSV: (data)=>data.map(x=>JSON.stringify(x)).join("\n"),
JSONToString: (data)=>JSON.stringify(data),
StringToJSON: (data)=>JSON.parse(data)
StringToJSON: (data)=>JSON.parse(data),
pathToBasename: (data)=>path.basename(data),
pathToDirname: (data)=>path.dirname(data),
pathToExtname: (data)=>path.extname(data),
pathToFormat: (data)=>path.format(data),
pathToIsAbsolute: (data)=>path.isAbsolute(data),
pathToJoin: (...data)=>path.join(...data),
pathToParse: (data)=>path.parse(data),
pathToNormalize: (data)=>path.normalize(data),
pathToResolve: (data)=>path.resolve(data)
};
module.exports = function (RED) {
function transformNode(n) {
RED.nodes.createNode(this,n);
var node=Object.assign(this,n);
if(node.actionSource=="ISO8583" || node.actionTarget=="ISO8583") {
if(!ISO8583) {
try{
ISO8583 = require('iso-8583');
ISO8583message = ISO8583.Message();
node.log("loaded iso-8583");
} catch (e) {
node.error("need to run 'npm install iso-8583'");
this.status({fill:"red",shape:"ring",text:"iso-8583 not installed"});
return;
}
}
}
try {
node.transform=functions[node.actionSource+"To"+node.actionTarget];
if(!node.transform) throw Error("transform routine not found");
} catch (e) {
function transformNode(n) {
RED.nodes.createNode(this,n);
var node=Object.assign(this,n);
try{
node.getData=eval("((msg,node)=>"+(node.sourceProperty||"msg.payload")+")");
node.setData=eval("((msg,node,data)=>"+(node.targetProperty||"msg.payload")+"=data)");
} catch(e) {
node.error(e);
node.status({fill:"red",shape:"ring",text:"Invalid setup "+e.toString()});
return;
}


if(node.actionSource=="ISO8583" || node.actionTarget=="ISO8583") {
if(!ISO8583) {
try{
ISO8583 = require('iso-8583');
ISO8583message = ISO8583.Message();
node.log("loaded iso-8583");
} catch (e) {
node.error("need to run 'npm install iso-8583'");
this.status({fill:"red",shape:"ring",text:"iso-8583 not installed"});
return;
}
}
}
try {
node.transform=functions[node.actionSource+"To"+node.actionTarget];
if(!node.transform) throw Error("transform routine not found");
} catch (e) {
node.error(node.actionSource+" to "+node.actionTarget + " not implemented, "+e);
this.status({fill:"red",shape:"ring",text:node.actionSource+"\nto "+node.actionTarget + " not implemented"});
return;
}
}

this.status({fill:"green",shape:"ring",text:"Ready"});
node.on("input", function(msg) {
try{
msg.payload=node.transform.apply(node,[msg.payload]);
} catch (e) {
node.error(node.actionSource+" to "+node.actionTarget + " " +e);
this.status({fill:"red",shape:"ring",text:"Error(s)"});
return;
}
node.on("input", function(msg) {
try{
// msg.payload=node.transform.apply(node,[node.getData(msg,node)]);
node.setData(msg,node,node.transform.apply(node,[node.getData(msg)]));
} catch (e) {
node.error(node.actionSource+" to "+node.actionTarget + " " +e);
this.status({fill:"red",shape:"ring",text:"Error(s)"});
return;
}
node.send(msg);
});
}
RED.nodes.registerType(nodeLabel,transformNode);
});
}
RED.nodes.registerType(nodeLabel,transformNode);
};

const ISO8583BitMap=[
Expand Down

0 comments on commit d3d52ef

Please sign in to comment.