From 0f57bab5e1c6c141945323962c2594b483d6c82b Mon Sep 17 00:00:00 2001 From: David Worms Date: Tue, 9 Mar 2021 15:55:09 +0100 Subject: [PATCH] feat(core): new bastard metadata --- packages/core/lib/actions/log/cli.js | 41 +++++-------------- packages/core/lib/actions/log/csv.js | 26 +----------- packages/core/lib/actions/log/fs.js | 2 - packages/core/lib/actions/log/md.js | 26 +----------- packages/core/lib/actions/log/stream.js | 37 ++++++----------- packages/core/lib/plugins/assertions.js | 20 ++++----- .../core/lib/plugins/assertions_exists.js | 10 ++--- .../core/lib/plugins/conditions_execute.js | 20 ++++----- .../core/lib/plugins/conditions_exists.js | 20 ++++----- packages/core/lib/plugins/tools_events.js | 21 +++++++--- packages/core/src/actions/log/cli.coffee.md | 38 +++++------------ packages/core/src/actions/log/csv.coffee.md | 26 +----------- packages/core/src/actions/log/fs.coffee.md | 2 - packages/core/src/actions/log/md.coffee.md | 26 +----------- .../core/src/actions/log/stream.coffee.md | 33 +++++---------- packages/core/src/plugins/assertions.coffee | 14 ++++--- .../core/src/plugins/assertions_exists.coffee | 7 ++-- .../src/plugins/conditions_execute.coffee | 14 ++++--- .../core/src/plugins/conditions_exists.coffee | 14 ++++--- packages/core/src/plugins/history.coffee | 3 ++ packages/core/src/plugins/tools_events.coffee | 16 +++++--- packages/core/test/actions/log/md.coffee | 19 ++++++++- packages/core/test/plugins/history.coffee | 28 ++++++++----- .../test/plugins/metadata/position.coffee | 10 +++++ 24 files changed, 179 insertions(+), 294 deletions(-) diff --git a/packages/core/lib/actions/log/cli.js b/packages/core/lib/actions/log/cli.js index 6f88c3d7a..fd7b5a523 100644 --- a/packages/core/lib/actions/log/cli.js +++ b/packages/core/lib/actions/log/cli.js @@ -114,7 +114,6 @@ handler = function({ if ((base2 = config.separator).time == null) { base2.time = config.pad.time == null ? ' ' : ' '; } - // config.host ?= if ssh then ssh.config.host else 'localhost' if (config.colors == null) { config.colors = process.stdout.isTTY; } @@ -127,7 +126,7 @@ handler = function({ } // Events ids = {}; - format_line = function({host, header, $status, time}) { + format_line = function({host, header, status, time}) { if (config.pad.host) { host = pad(host, config.pad.host); } @@ -137,13 +136,13 @@ handler = function({ if (config.pad.time) { time = pad(time, config.pad.time); } - return [host, config.separator.host, header, config.separator.header, $status, config.time ? config.separator.time : '', time].join(''); + return [host, config.separator.host, header, config.separator.header, status, config.time ? config.separator.time : '', time].join(''); }; return this.call({ $: stream }, config, { serializer: { - 'nikita:action:start': function(action) { + 'nikita:action:start': function({action}) { var headers; if (!config.enabled) { return; @@ -155,14 +154,13 @@ handler = function({ ids[action.metadata.index] = action; return null; }, - // 'diff': null 'nikita:resolved': function({action}) { var color, line, ref, ref1; color = config.colors ? config.colors.status_true : false; line = format_line({ host: config.host || ((ref = action.ssh) != null ? (ref1 = ref.config) != null ? ref1.host : void 0 : void 0) || 'localhost', header: '', - $status: '♥', + status: '♥', time: '' }); if (color) { @@ -175,8 +173,8 @@ handler = function({ color = config.colors ? config.colors.status_error : false; line = format_line({ host: config.host || ((ref = action.ssh) != null ? (ref1 = ref.config) != null ? ref1.host : void 0 : void 0) || 'localhost', - header: '', // error.message - $status: '✘', + header: '', + status: '✘', time: '' }); if (color) { @@ -184,18 +182,8 @@ handler = function({ } return line + '\n'; }, - // 'header': (log) -> - // return unless config.enabled - // return if config.depth_max and config.depth_max < log.metadata.headers.length - // ids[log.index] = log - // null - // 'lifecycle': (log) -> - // return unless ids[log.index] - // ids[log.index].disabled = true if log.message in ['conditions_failed', 'disabled_true'] - // null - 'nikita:action:end': function(action, error, output) { - var $status, color, headers, line, ref, ref1; - // console.log ':events:on:', 'nikita:action:end' + 'nikita:action:end': function({action, error, output}) { + var color, headers, line, ref, ref1, status; if (!action.metadata.header) { return; } @@ -205,21 +193,19 @@ handler = function({ // TODO: I don't like this, the `end` event should receive raw output // with error not placed inside output by the history plugin error = error || action.metadata.relax && output.error; - $status = error ? '✘' : (output != null ? output.$status : void 0) && !action.metadata.shy ? '✔' : '-'; + status = error ? '✘' : (output != null ? output.$status : void 0) && !action.metadata.shy ? '✔' : '-'; color = false; if (config.colors) { - color = error ? config.colors.status_error : output.$status ? config.colors.status_true : config.colors.status_false; + color = error ? config.colors.status_error : (output != null ? output.$status : void 0) ? config.colors.status_true : config.colors.status_false; } if (action.metadata.disabled) { - // action = ids[action.index] return null; } - // delete ids[action.index] headers = get_headers(action); line = format_line({ host: config.host || ((ref = action.ssh) != null ? (ref1 = ref.config) != null ? ref1.host : void 0 : void 0) || 'localhost', header: headers.join(config.divider), - $status: $status, + status: status, time: config.time ? utils.string.print_time(action.metadata.time_end - action.metadata.time_start) : '' }); if (color) { @@ -231,11 +217,6 @@ handler = function({ }); }; -// 'stdin': null -// 'stderr': null -// 'stdout': null -// 'text': null - // ## Exports module.exports = { ssh: false, diff --git a/packages/core/lib/actions/log/csv.js b/packages/core/lib/actions/log/csv.js index 1d769da6e..d14c0c43d 100644 --- a/packages/core/lib/actions/log/csv.js +++ b/packages/core/lib/actions/log/csv.js @@ -24,12 +24,11 @@ var handler, log_fs; handler = async function({config}) { // Obtains config from "log_csv" namespace - // stdouting = 0 return (await this.call({ $: log_fs }, config, { serializer: { - 'nikita:action:start': function(action) { + 'nikita:action:start': function({action}) { var header, headers, walk; if (!action.metadata.header) { return; @@ -47,30 +46,9 @@ handler = async function({config}) { return results; }; headers = walk(action); - header = headers.reverse().join(' : '); //action.config.divider + header = headers.reverse().join(' : '); return `header,,${JSON.stringify(header)}\n`; }, - // 'diff': (log) -> - // "#{log.type},#{log.level},#{JSON.stringify log.message},\n" - // 'end': -> - // "lifecycle,INFO,Finished with success,\n" - // 'error': (err) -> - // content = [] - // content.push "lifecycle,ERROR,Finished with error,\n" - // print = (err) -> - // content.push "lifecycle,ERROR,#{err.stack or err.message},\n" - // unless err.errors - // then print err - // else if err.errors then for error in err.errors then print error - // content.join() - // 'header': (log) -> - // "#{log.type},,,#{log.header}\n" - // 'stdin': (log) -> - // "#{log.type},#{log.level},#{JSON.stringify log.message}\n" - // 'stderr': (log) -> - // "#{log.type},#{log.level},#{JSON.stringify log.message}\n" - // 'stdout': (log) -> - // "#{log.type},#{log.level},#{JSON.stringify log.message}\n" 'text': function(log) { return `${log.type},${log.level},${JSON.stringify(log.message)}\n`; } diff --git a/packages/core/lib/actions/log/fs.js b/packages/core/lib/actions/log/fs.js index c2eb8e974..58eadfd95 100644 --- a/packages/core/lib/actions/log/fs.js +++ b/packages/core/lib/actions/log/fs.js @@ -68,8 +68,6 @@ handler = async function({config}) { if (config.archive === true) { config.archive = `${now.getFullYear()}`.slice(-2) + `0${now.getFullYear()}`.slice(-2) + `0${now.getDate()}`.slice(-2); } - // dateformat = "#{now.getFullYear()}-#{('0'+now.getMonth()).slice -2}-#{('0'+now.getDate()).slice -2}" - // dateformat += " #{('0'+now.getHours()).slice -2}-#{('0'+now.getMinutes()).slice -2}-#{('0'+now.getSeconds()).slice -2}" logdir = path.resolve(config.basedir, config.archive); } try { diff --git a/packages/core/lib/actions/log/md.js b/packages/core/lib/actions/log/md.js index 19767543e..b4c6349d1 100644 --- a/packages/core/lib/actions/log/md.js +++ b/packages/core/lib/actions/log/md.js @@ -38,7 +38,7 @@ handler = async function({config}) { $: log_fs }, config, { serializer: { - 'nikita:action:start': function(action) { + 'nikita:action:start': function({action}) { var content, header, headers, last_event_type, walk; content = []; if (action.metadata.module) { @@ -64,34 +64,12 @@ handler = async function({config}) { return results; }; headers = walk(action); - // Async operation break the event order, causing header to be writen - // after other sync event such as text - // headers = await act.tools.walk ({config}) -> - // config.header header = headers.reverse().join(config.divider); content.push('\n'); content.push('#'.repeat(headers.length)); content.push(` ${header}\n`); return content.join(''); }, - // 'diff': (log) -> - // "\n```diff\n#{log.message}```\n\n" unless log.message - // 'end': -> - // '\nFINISHED WITH SUCCESS\n' - // 'error': (err) -> - // content = [] - // content.push '\nFINISHED WITH ERROR\n' - // print = (err) -> - // content.push err.stack or err.message + '\n' - // unless err.errors - // print err - // else if err.errors - // content.push err.message + '\n' - // for error in err.errors then content.push error - // content.join '' - // 'header': (log, act) -> - // header = log.metadata.headers.join(action.config.divider) - // "\n#{'#'.repeat log.metadata.headers.length} #{header}\n\n" 'stdin': function(log) { var out; out = []; @@ -100,7 +78,6 @@ handler = async function({config}) { } else { out.push(`\n\`\`\`stdin\n${log.message}\n\`\`\`\n`); } - // stdining = log.message isnt null return out.join(''); }, 'stderr': function(log) { @@ -109,7 +86,6 @@ handler = async function({config}) { 'stdout_stream': function(log) { var out; state.last_event_type = 'stdout_stream'; - // return if log.message is null and stdouting is 0 if (log.message === null) { state.stdout_count = 0; } else if (state.stdout_count === void 0) { diff --git a/packages/core/lib/actions/log/stream.js b/packages/core/lib/actions/log/stream.js index d0cb43a63..fda63089a 100644 --- a/packages/core/lib/actions/log/stream.js +++ b/packages/core/lib/actions/log/stream.js @@ -36,6 +36,7 @@ information.`, // ## Handler handler = function({ config, + metadata: {position, uuid}, tools: {events} }) { var close; @@ -52,26 +53,20 @@ handler = function({ } // Events close = function() { - return setTimeout(function() { - if (config.end) { - return config.stream.close(); - } - }, 100); + if (config.end) { + return config.stream.close(); + } }; - events.on('nikita:action:start', async function(act) { + events.on('nikita:action:start', async function() { var data; if (!config.serializer['nikita:action:start']) { return; } - data = (await config.serializer['nikita:action:start'](act)); + data = (await config.serializer['nikita:action:start'].apply(null, arguments)); if (data != null) { return config.stream.write(data); } }); - // events.on 'lifecycle', (log) -> - // return unless config.serializer.lifecycle - // data = config.serializer.lifecycle log - // config.stream.write data if data? events.on('text', function(log) { var data; if (!config.serializer.text) { @@ -82,10 +77,6 @@ handler = function({ return config.stream.write(data); } }); - // events.on 'header', (log) -> - // return unless config.serializer.header - // data = config.serializer.header log - // config.stream.write data if data? events.on('stdin', function(log) { var data; if (!config.serializer.stdin) { @@ -96,10 +87,6 @@ handler = function({ return config.stream.write(data); } }); - // events.on 'diff', (log) -> - // return unless config.serializer.diff - // data = config.serializer.diff log - // config.stream.write data if data? events.on('nikita:action:end', function() { var data; if (!config.serializer['nikita:action:end']) { @@ -120,12 +107,10 @@ handler = function({ return config.stream.write(data); } }); - // events.on 'stderr', (log) -> - // return unless config.serializer.stderr - // data = config.serializer.stderr log - // config.stream.write data if data? - events.on('nikita:resolved', function() { + events.on('nikita:resolved', function({action}) { var data; + // console.log 'nikita:resolved', position, uuid, action.metadata.position, !!action.parent + // return unless position.slice(0, -1).join('.') is action.metadata.position.join('.') if (config.serializer['nikita:resolved']) { data = config.serializer['nikita:resolved'].apply(null, arguments); if (data != null) { @@ -134,8 +119,10 @@ handler = function({ } return close(); }); - events.on('nikita:rejected', function(err) { + events.on('nikita:rejected', function({action}) { var data; + // console.log 'nikita:rejected', position, uuid, action.metadata, !!action.parent + // return unless position.slice(0, -1).join('.') is action.metadata.position.join('.') if (config.serializer['nikita:rejected']) { data = config.serializer['nikita:rejected'].apply(null, arguments); if (data != null) { diff --git a/packages/core/lib/plugins/assertions.js b/packages/core/lib/plugins/assertions.js index 4f9e45714..a0f5f6bc5 100644 --- a/packages/core/lib/plugins/assertions.js +++ b/packages/core/lib/plugins/assertions.js @@ -63,12 +63,10 @@ handlers = { assertion = ref[i]; if (typeof assertion === 'function') { run = (await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $assertion: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $assertion: true $depth: action.metadata.depth, $raw_output: true, $raw_input: true, @@ -99,12 +97,10 @@ handlers = { assertion = ref[i]; if (typeof assertion === 'function') { run = (await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $assertion: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $assertion: true $depth: action.metadata.depth, $raw_output: true, $raw_input: true, diff --git a/packages/core/lib/plugins/assertions_exists.js b/packages/core/lib/plugins/assertions_exists.js index 29bf9a1fb..7effdd3db 100644 --- a/packages/core/lib/plugins/assertions_exists.js +++ b/packages/core/lib/plugins/assertions_exists.js @@ -72,12 +72,10 @@ handlers = { for (i = 0, len = ref.length; i < len; i++) { assertion = ref[i]; run = (await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $assertion: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $assertion: true $depth: action.metadata.depth, $raw_output: true, $raw_input: true, diff --git a/packages/core/lib/plugins/conditions_execute.js b/packages/core/lib/plugins/conditions_execute.js index 788977b09..07eef753b 100644 --- a/packages/core/lib/plugins/conditions_execute.js +++ b/packages/core/lib/plugins/conditions_execute.js @@ -41,12 +41,10 @@ handlers = { condition = ref[i]; try { ({$status} = (await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $condition: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $condition: true $depth: action.metadata.depth, $namespace: ['execute'], $parent: action @@ -73,12 +71,10 @@ handlers = { condition = ref[i]; try { ({$status} = (await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $condition: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $condition: true $depth: action.metadata.depth, $namespace: ['execute'], $parent: action diff --git a/packages/core/lib/plugins/conditions_exists.js b/packages/core/lib/plugins/conditions_exists.js index e9abdfae9..68198c35c 100644 --- a/packages/core/lib/plugins/conditions_exists.js +++ b/packages/core/lib/plugins/conditions_exists.js @@ -41,12 +41,10 @@ handlers = { condition = ref[i]; try { await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $condition: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $condition: true $depth: action.metadata.depth, $parent: action }, async function() { @@ -73,12 +71,10 @@ handlers = { condition = ref[i]; try { await session({ - $hooks: { - on_result: function({action}) { - return delete action.parent; - } - }, - $condition: true, + // $hooks: + // on_result: ({action}) -> delete action.parent + $bastard: true, + // $condition: true $depth: action.metadata.depth, $parent: action }, async function() { diff --git a/packages/core/lib/plugins/tools_events.js b/packages/core/lib/plugins/tools_events.js index 9db7cea61..f7d9b73ff 100644 --- a/packages/core/lib/plugins/tools_events.js +++ b/packages/core/lib/plugins/tools_events.js @@ -19,21 +19,30 @@ module.exports = { }; }, 'nikita:action': function(action) { - return action.tools.events.emit('nikita:action:start', action); + return action.tools.events.emit('nikita:action:start', { + action: action + }); }, 'nikita:result': { after: '@nikitajs/core/lib/metadata/status', handler: function({action, error, output}, handler) { return async function({action}) { - var err; try { output = (await handler.apply(null, arguments)); - action.tools.events.emit('nikita:action:end', action, null, output); + action.tools.events.emit('nikita:action:end', { + action: action, + error: void 0, + output: output + }); return output; } catch (error1) { - err = error1; - action.tools.events.emit('nikita:action:end', action, err, output); - throw err; + error = error1; + action.tools.events.emit('nikita:action:end', { + action: action, + error: error, + output: void 0 + }); + throw error; } }; } diff --git a/packages/core/src/actions/log/cli.coffee.md b/packages/core/src/actions/log/cli.coffee.md index c1daed9d6..037ee34c2 100644 --- a/packages/core/src/actions/log/cli.coffee.md +++ b/packages/core/src/actions/log/cli.coffee.md @@ -78,7 +78,6 @@ nikita config.separator.host ?= unless config.pad.host? then ' ' else ' ' config.separator.header ?= unless config.pad.header? then ' ' else ' ' config.separator.time ?= unless config.pad.time? then ' ' else ' ' - # config.host ?= if ssh then ssh.config.host else 'localhost' config.colors ?= process.stdout.isTTY config.colors = { status_true: colors.green @@ -87,24 +86,23 @@ nikita } if config.colors is true # Events ids = {} - format_line = ({host, header, $status, time}) -> + format_line = ({host, header, status, time}) -> host = pad host, config.pad.host if config.pad.host header = pad header, config.pad.header if config.pad.header time = pad time, config.pad.time if config.pad.time [ host, config.separator.host header, config.separator.header - $status, if config.time then config.separator.time else '' + status, if config.time then config.separator.time else '' time ].join '' @call $: stream, config, serializer: - 'nikita:action:start': (action) -> + 'nikita:action:start': ({action}) -> return unless config.enabled headers = get_headers action return if config.depth_max and config.depth_max < headers.length ids[action.metadata.index] = action null - # 'diff': null 'nikita:resolved': ({action}) -> color = if config.colors then config.colors.status_true @@ -112,7 +110,7 @@ nikita line = format_line host: config.host or action.ssh?.config?.host or 'localhost' header: '' - $status: '♥' + status: '♥' time: '' line = color line if color return line+'\n' @@ -122,48 +120,32 @@ nikita else false line = format_line host: config.host or action.ssh?.config?.host or 'localhost' - header: '' # error.message - $status: '✘' + header: '' + status: '✘' time: '' line = color line if color return line+'\n' - # 'header': (log) -> - # return unless config.enabled - # return if config.depth_max and config.depth_max < log.metadata.headers.length - # ids[log.index] = log - # null - # 'lifecycle': (log) -> - # return unless ids[log.index] - # ids[log.index].disabled = true if log.message in ['conditions_failed', 'disabled_true'] - # null - 'nikita:action:end': (action, error, output) -> - # console.log ':events:on:', 'nikita:action:end' + 'nikita:action:end': ({action, error, output}) -> return unless action.metadata.header return if config.depth_max and config.depth_max < action.metadata.depth # TODO: I don't like this, the `end` event should receive raw output # with error not placed inside output by the history plugin error = error or action.metadata.relax and output.error - $status = if error then '✘' else if output?.$status and not action.metadata.shy then '✔' else '-' + status = if error then '✘' else if output?.$status and not action.metadata.shy then '✔' else '-' color = false if config.colors color = if error then config.colors.status_error - else if output.$status then config.colors.status_true + else if output?.$status then config.colors.status_true else config.colors.status_false - # action = ids[action.index] return null if action.metadata.disabled - # delete ids[action.index] headers = get_headers action line = format_line host: config.host or action.ssh?.config?.host or 'localhost' header: headers.join config.divider - $status: $status + status: status time: if config.time then utils.string.print_time action.metadata.time_end - action.metadata.time_start else '' line = color line if color return line+'\n' - # 'stdin': null - # 'stderr': null - # 'stdout': null - # 'text': null ## Exports diff --git a/packages/core/src/actions/log/csv.coffee.md b/packages/core/src/actions/log/csv.coffee.md index 8741ae640..fafa59116 100644 --- a/packages/core/src/actions/log/csv.coffee.md +++ b/packages/core/src/actions/log/csv.coffee.md @@ -23,9 +23,8 @@ Global config can be alternatively set with the "log_csv" property. handler = ({config}) -> # Obtains config from "log_csv" namespace - # stdouting = 0 await @call $: log_fs, config, serializer: - 'nikita:action:start': (action) -> + 'nikita:action:start': ({action}) -> return unless action.metadata.header walk = (parent) -> precious = parent.metadata.header @@ -34,29 +33,8 @@ Global config can be alternatively set with the "log_csv" property. results.push ...(walk parent.parent) if parent.parent results headers = walk action - header = headers.reverse().join ' : ' #action.config.divider + header = headers.reverse().join ' : ' "header,,#{JSON.stringify header}\n" - # 'diff': (log) -> - # "#{log.type},#{log.level},#{JSON.stringify log.message},\n" - # 'end': -> - # "lifecycle,INFO,Finished with success,\n" - # 'error': (err) -> - # content = [] - # content.push "lifecycle,ERROR,Finished with error,\n" - # print = (err) -> - # content.push "lifecycle,ERROR,#{err.stack or err.message},\n" - # unless err.errors - # then print err - # else if err.errors then for error in err.errors then print error - # content.join() - # 'header': (log) -> - # "#{log.type},,,#{log.header}\n" - # 'stdin': (log) -> - # "#{log.type},#{log.level},#{JSON.stringify log.message}\n" - # 'stderr': (log) -> - # "#{log.type},#{log.level},#{JSON.stringify log.message}\n" - # 'stdout': (log) -> - # "#{log.type},#{log.level},#{JSON.stringify log.message}\n" 'text': (log) -> "#{log.type},#{log.level},#{JSON.stringify log.message}\n" diff --git a/packages/core/src/actions/log/fs.coffee.md b/packages/core/src/actions/log/fs.coffee.md index 5c45cdda9..bd2557609 100644 --- a/packages/core/src/actions/log/fs.coffee.md +++ b/packages/core/src/actions/log/fs.coffee.md @@ -68,8 +68,6 @@ and "{config.basedir}/latest". latestdir = path.resolve config.basedir, 'latest' now = new Date() config.archive = "#{now.getFullYear()}".slice(-2) + "0#{now.getFullYear()}".slice(-2) + "0#{now.getDate()}".slice(-2) if config.archive is true - # dateformat = "#{now.getFullYear()}-#{('0'+now.getMonth()).slice -2}-#{('0'+now.getDate()).slice -2}" - # dateformat += " #{('0'+now.getHours()).slice -2}-#{('0'+now.getMinutes()).slice -2}-#{('0'+now.getSeconds()).slice -2}" logdir = path.resolve config.basedir, config.archive try await @fs.base.mkdir logdir diff --git a/packages/core/src/actions/log/md.coffee.md b/packages/core/src/actions/log/md.coffee.md index 3c051cdcf..8af5fcce8 100644 --- a/packages/core/src/actions/log/md.coffee.md +++ b/packages/core/src/actions/log/md.coffee.md @@ -29,7 +29,7 @@ Write log to the host filesystem in Markdown. handler = ({config}) -> state = last_event_type: undefined await @call $: log_fs, config, serializer: - 'nikita:action:start': (action) -> + 'nikita:action:start': ({action}) -> content = [] content.push "\nEntering #{action.metadata.module} (#{(action.metadata.position.map (index) -> index + 1).join '.'})\n" if action.metadata.module return content.join '' unless action.metadata.header @@ -42,45 +42,21 @@ Write log to the host filesystem in Markdown. results.push ...(walk parent.parent) if parent.parent results headers = walk action - # Async operation break the event order, causing header to be writen - # after other sync event such as text - # headers = await act.tools.walk ({config}) -> - # config.header header = headers.reverse().join config.divider content.push '\n' content.push '#'.repeat headers.length content.push " #{header}\n" content.join '' - # 'diff': (log) -> - # "\n```diff\n#{log.message}```\n\n" unless log.message - # 'end': -> - # '\nFINISHED WITH SUCCESS\n' - # 'error': (err) -> - # content = [] - # content.push '\nFINISHED WITH ERROR\n' - # print = (err) -> - # content.push err.stack or err.message + '\n' - # unless err.errors - # print err - # else if err.errors - # content.push err.message + '\n' - # for error in err.errors then content.push error - # content.join '' - # 'header': (log, act) -> - # header = log.metadata.headers.join(action.config.divider) - # "\n#{'#'.repeat log.metadata.headers.length} #{header}\n\n" 'stdin': (log) -> out = [] if log.message.indexOf('\n') is -1 then out.push "\nRunning Command: `#{log.message}`\n" else out.push "\n```stdin\n#{log.message}\n```\n" - # stdining = log.message isnt null out.join '' 'stderr': (log) -> "\n```stderr\n#{log.message}```\n" 'stdout_stream': (log) -> state.last_event_type = 'stdout_stream' - # return if log.message is null and stdouting is 0 if log.message is null state.stdout_count = 0 else if state.stdout_count is undefined diff --git a/packages/core/src/actions/log/stream.coffee.md b/packages/core/src/actions/log/stream.coffee.md index 8d07c69a6..013a94f01 100644 --- a/packages/core/src/actions/log/stream.coffee.md +++ b/packages/core/src/actions/log/stream.coffee.md @@ -32,40 +32,27 @@ Write log to custom destinations in a user provided format. ## Handler - handler = ({config, tools: {events}}) -> + handler = ({config, metadata: {position, uuid}, tools: {events}}) -> # Validate config throw Error 'Missing option: "stream"' unless config.stream throw Error 'Missing option: "serializer"' unless config.serializer # Normalize config.end ?= true # Events - close = -> setTimeout -> + close = -> config.stream.close() if config.end - , 100 - events.on 'nikita:action:start', (act) -> + events.on 'nikita:action:start', -> return unless config.serializer['nikita:action:start'] - data = await config.serializer['nikita:action:start'] act + data = await config.serializer['nikita:action:start'].apply null, arguments config.stream.write data if data? - # events.on 'lifecycle', (log) -> - # return unless config.serializer.lifecycle - # data = config.serializer.lifecycle log - # config.stream.write data if data? events.on 'text', (log) -> return unless config.serializer.text data = config.serializer.text log config.stream.write data if data? - # events.on 'header', (log) -> - # return unless config.serializer.header - # data = config.serializer.header log - # config.stream.write data if data? events.on 'stdin', (log) -> return unless config.serializer.stdin data = config.serializer.stdin log config.stream.write data if data? - # events.on 'diff', (log) -> - # return unless config.serializer.diff - # data = config.serializer.diff log - # config.stream.write data if data? events.on 'nikita:action:end', -> return unless config.serializer['nikita:action:end'] data = config.serializer['nikita:action:end'].apply null, arguments @@ -74,16 +61,16 @@ Write log to custom destinations in a user provided format. return unless config.serializer.stdout_stream data = config.serializer.stdout_stream log config.stream.write data if data? - # events.on 'stderr', (log) -> - # return unless config.serializer.stderr - # data = config.serializer.stderr log - # config.stream.write data if data? - events.on 'nikita:resolved', -> + events.on 'nikita:resolved', ({action}) -> + # console.log 'nikita:resolved', position, uuid, action.metadata.position, !!action.parent + # return unless position.slice(0, -1).join('.') is action.metadata.position.join('.') if config.serializer['nikita:resolved'] data = config.serializer['nikita:resolved'].apply null, arguments config.stream.write data if data? close() - events.on 'nikita:rejected', (err) -> + events.on 'nikita:rejected', ({action}) -> + # console.log 'nikita:rejected', position, uuid, action.metadata, !!action.parent + # return unless position.slice(0, -1).join('.') is action.metadata.position.join('.') if config.serializer['nikita:rejected'] data = config.serializer['nikita:rejected'].apply null, arguments config.stream.write data if data? diff --git a/packages/core/src/plugins/assertions.coffee b/packages/core/src/plugins/assertions.coffee index 12968165f..7dfcdb259 100644 --- a/packages/core/src/plugins/assertions.coffee +++ b/packages/core/src/plugins/assertions.coffee @@ -41,9 +41,10 @@ handlers = for assertion in action.assertions.assert if typeof assertion is 'function' run = await session - $hooks: - on_result: ({action}) -> delete action.parent - $assertion: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $assertion: true $depth: action.metadata.depth $raw_output: true $raw_input: true @@ -63,9 +64,10 @@ handlers = for assertion in action.assertions.unassert if typeof assertion is 'function' run = await session - $hooks: - on_result: ({action}) -> delete action.parent - $assertion: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $assertion: true $depth: action.metadata.depth $raw_output: true $raw_input: true diff --git a/packages/core/src/plugins/assertions_exists.coffee b/packages/core/src/plugins/assertions_exists.coffee index 82afd8563..e9629b69f 100644 --- a/packages/core/src/plugins/assertions_exists.coffee +++ b/packages/core/src/plugins/assertions_exists.coffee @@ -48,9 +48,10 @@ handlers = # console.log action for assertion in action.assertions.assert_exists run = await session - $hooks: - on_result: ({action}) -> delete action.parent - $assertion: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $assertion: true $depth: action.metadata.depth $raw_output: true $raw_input: true diff --git a/packages/core/src/plugins/conditions_execute.coffee b/packages/core/src/plugins/conditions_execute.coffee index 57704a32e..51e931fe5 100644 --- a/packages/core/src/plugins/conditions_execute.coffee +++ b/packages/core/src/plugins/conditions_execute.coffee @@ -25,9 +25,10 @@ handlers = for condition in action.conditions.if_execute try {$status} = await session - $hooks: - on_result: ({action}) -> delete action.parent - $condition: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $condition: true $depth: action.metadata.depth $namespace: ['execute'] $parent: action @@ -44,9 +45,10 @@ handlers = for condition in action.conditions.unless_execute try {$status} = await session - $hooks: - on_result: ({action}) -> delete action.parent - $condition: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $condition: true $depth: action.metadata.depth $namespace: ['execute'] $parent: action diff --git a/packages/core/src/plugins/conditions_exists.coffee b/packages/core/src/plugins/conditions_exists.coffee index 1bdf41234..18c80335d 100644 --- a/packages/core/src/plugins/conditions_exists.coffee +++ b/packages/core/src/plugins/conditions_exists.coffee @@ -24,9 +24,10 @@ handlers = for condition in action.conditions.if_exists try await session - $hooks: - on_result: ({action}) -> delete action.parent - $condition: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $condition: true $depth: action.metadata.depth $parent: action , -> @@ -41,9 +42,10 @@ handlers = for condition in action.conditions.unless_exists try await session - $hooks: - on_result: ({action}) -> delete action.parent - $condition: true + # $hooks: + # on_result: ({action}) -> delete action.parent + $bastard: true + # $condition: true $depth: action.metadata.depth $parent: action , -> diff --git a/packages/core/src/plugins/history.coffee b/packages/core/src/plugins/history.coffee index 9e52c766e..b512771b0 100644 --- a/packages/core/src/plugins/history.coffee +++ b/packages/core/src/plugins/history.coffee @@ -13,6 +13,9 @@ module.exports = action 'nikita:result': ({action, error, output}) -> return unless action.parent + # A bastard is not recognized by their parent as children + # examples include conditions and assertions + return if action.metadata.bastard action.parent.children.push children: action.children metadata: action.metadata diff --git a/packages/core/src/plugins/tools_events.coffee b/packages/core/src/plugins/tools_events.coffee index f6df8e2a7..6b694dc97 100644 --- a/packages/core/src/plugins/tools_events.coffee +++ b/packages/core/src/plugins/tools_events.coffee @@ -15,18 +15,24 @@ module.exports = else action.tools.events = new EventEmitter() action 'nikita:action': (action) -> - action.tools.events.emit 'nikita:action:start', action + action.tools.events.emit 'nikita:action:start', action: action 'nikita:result': after: '@nikitajs/core/src/metadata/status' handler: ({action, error, output}, handler) -> ({action}) -> try output = await handler.apply null, arguments - action.tools.events.emit 'nikita:action:end', action, null, output + action.tools.events.emit 'nikita:action:end', + action: action + error: undefined + output: output output - catch err - action.tools.events.emit 'nikita:action:end', action, err, output - throw err + catch error + action.tools.events.emit 'nikita:action:end', + action: action + error: error + output: undefined + throw error 'nikita:resolved': ({action}) -> action.tools.events.emit 'nikita:resolved', ...arguments 'nikita:rejected': ({action}) -> diff --git a/packages/core/test/actions/log/md.coffee b/packages/core/test/actions/log/md.coffee index 1cddbab77..a6a38f9b1 100644 --- a/packages/core/test/actions/log/md.coffee +++ b/packages/core/test/actions/log/md.coffee @@ -7,13 +7,28 @@ return unless tags.posix describe 'actions.log.md', -> + they 'compatible with pseudo-child sessions', ({ssh}) -> + # if_exists, if_execute... + nikita + $ssh: ssh + $tmpdir: true + , ({metadata: {tmpdir}}) -> + await @log.md basedir: tmpdir + await @call + $unless_exists: "#{tmpdir}/toto" + , -> + console.log 'ok' + await @fs.assert + target: "#{tmpdir}/localhost.log" + content: /^Entering.*$/mg + they 'write entering message', ({ssh}) -> nikita $ssh: ssh $tmpdir: true , ({metadata: {tmpdir}}) -> - @log.md basedir: tmpdir - @fs.assert + await @log.md basedir: tmpdir + await @fs.assert target: "#{tmpdir}/localhost.log" content: /^Entering.*$/mg diff --git a/packages/core/test/plugins/history.coffee b/packages/core/test/plugins/history.coffee index caaf59ced..c1c9ffd3a 100644 --- a/packages/core/test/plugins/history.coffee +++ b/packages/core/test/plugins/history.coffee @@ -8,14 +8,14 @@ describe 'plugins.history', -> describe 'children', -> it 'get previous action', -> - nikita.call ({context}) -> + nikita.call -> @call -> 'mayday' @call ({parent}) -> parent.children[0].output .should.be.resolvedWith 'mayday' it 'get previous action children', -> - nikita.call ({context}) -> + nikita.call -> @call -> @call -> 'mayday' @call ({parent}) -> parent.children[0].children[0].output @@ -28,31 +28,39 @@ describe 'plugins.history', -> siblings.should.eql [] it 'get previous action', -> - nikita.call ({context}) -> + nikita.call -> @call -> 'mayday' - @call ({parent, siblings}) -> + @call ({siblings}) -> siblings.slice(-1)[0].output .should.be.resolvedWith 'mayday' it 'get previous slibling children', -> - nikita.call ({context}) -> + nikita.call -> @call -> @call -> 'mayday' - @call ({parent, siblings}) -> + @call ({siblings}) -> siblings.slice(-1)[0].children[0].output .should.be.resolvedWith 'mayday' describe 'sibling', -> it 'get previous action', -> - nikita.call ({context}) -> + nikita.call -> @call -> 'mayday' - @call ({parent, sibling}) -> + @call ({sibling}) -> sibling.output .should.be.resolvedWith 'mayday' it 'get previous slibling children', -> - nikita.call ({context}) -> + nikita.call -> @call -> @call -> 'mayday' - @call ({parent, sibling}) -> + @call ({sibling}) -> sibling.children[0].output .should.be.resolvedWith 'mayday' + + describe 'bastard', -> + + it 'child not attached to parent', -> + nikita.call -> + @call $bastard: true, (->) + @call ({parent}) -> + parent.children.length.should.eql 0 diff --git a/packages/core/test/plugins/metadata/position.coffee b/packages/core/test/plugins/metadata/position.coffee index 21884ba0d..989b4960c 100644 --- a/packages/core/test/plugins/metadata/position.coffee +++ b/packages/core/test/plugins/metadata/position.coffee @@ -25,3 +25,13 @@ describe 'plugins.metadata.position', -> metadata.position.should.eql [0, 1, 0] @call ({metadata}) -> metadata.position.should.eql [0, 1, 1] + + it 'honors `metadata.bastard`', -> + nikita + .call -> true + .call ({metadata}) -> + metadata.position.should.eql [0, 1] + @call $bastard: true, ({metadata}) -> + metadata.position.should.eql [0, 1, 0] + @call ({metadata}) -> + metadata.position.should.eql [0, 1, 0]