From 90765bf90bf53064a62b3e7616f0f2ed98c5d816 Mon Sep 17 00:00:00 2001 From: hacksalot Date: Sun, 31 Jan 2016 08:37:12 -0500 Subject: [PATCH] Refactor verb invocations to base. --- dist/verbs/analyze.js | 9 +-------- dist/verbs/build.js | 39 +++++++++++++++---------------------- dist/verbs/convert.js | 9 +-------- dist/verbs/create.js | 11 +---------- dist/verbs/peek.js | 9 +-------- dist/verbs/validate.js | 11 +---------- dist/verbs/verb.js | 18 +++++++++++++++-- src/verbs/analyze.coffee | 7 +------ src/verbs/build.coffee | 41 +++++++++++++++++++-------------------- src/verbs/convert.coffee | 7 +------ src/verbs/create.coffee | 7 +------ src/verbs/peek.coffee | 7 +------ src/verbs/validate.coffee | 8 +------- src/verbs/verb.coffee | 27 ++++++++++++++++++-------- 14 files changed, 81 insertions(+), 129 deletions(-) diff --git a/dist/verbs/analyze.js b/dist/verbs/analyze.js index b2adbc6..6ddf11c 100644 --- a/dist/verbs/analyze.js +++ b/dist/verbs/analyze.js @@ -26,14 +26,7 @@ Implementation of the 'analyze' verb for HackMyResume. AnalyzeVerb = module.exports = Verb.extend({ init: function() { - return this._super('analyze'); - }, - invoke: function() { - this.stat(HMEVENT.begin, { - cmd: 'analyze' - }); - analyze.apply(this, arguments); - return this.stat(HMEVENT.end); + return this._super('analyze', analyze); } }); diff --git a/dist/verbs/build.js b/dist/verbs/build.js index cc05da4..d756d6c 100644 --- a/dist/verbs/build.js +++ b/dist/verbs/build.js @@ -74,18 +74,7 @@ Implementation of the 'build' verb for HackMyResume. /** Create a new build verb. */ init: function() { - return this._super('build'); - }, - - /** Invoke the Build command. */ - invoke: function() { - var ret; - this.stat(HMEVENT.begin, { - cmd: 'build' - }); - ret = build.apply(this, arguments); - this.stat(HMEVENT.end); - return ret; + return this._super('build', build); } }); @@ -95,16 +84,16 @@ Implementation of the 'build' verb for HackMyResume. theme file, generate 0..N resumes in the desired formats. @param src Path to the source JSON resume file: "rez/resume.json". @param dst An array of paths to the target resume file(s). - @param theme Friendly name of the resume theme. Defaults to "modern". - @param logger Optional logging override. + @param opts Generation options. */ build = function(src, dst, opts) { - var ex, inv, isFRESH, mixed, newEx, orgFormat, rez, sheetObjects, sheets, tFolder, targets, theme, toFormat; + var ex, inv, isFRESH, mixed, newEx, orgFormat, problemSheets, rez, sheetObjects, sheets, tFolder, targets, theme, toFormat; if (!src || !src.length) { this.err(HMSTATUS.resumeNotFound, { quit: true }); + return null; } prep(src, dst, opts); sheetObjects = ResumeFactory.load(src, { @@ -115,9 +104,12 @@ Implementation of the 'build' verb for HackMyResume. sort: _opts.sort } }, this); - if (!sheetObjects || _.some(sheetObjects, function(so) { + problemSheets = _.filter(sheetObjects, function(so) { return so.fluenterror; - })) { + }); + if (problemSheets && problemSheets.length) { + problemSheets[0].quit = true; + this.err(problemSheets[0].fluenterror, problemSheets[0]); return null; } sheets = sheetObjects.map(function(r) { @@ -130,12 +122,14 @@ Implementation of the 'build' verb for HackMyResume. try { tFolder = verifyTheme.call(this, _opts.theme); theme = _opts.themeObj = loadTheme(tFolder); + addFreebieFormats(theme); } catch (_error) { ex = _error; newEx = { fluenterror: HMSTATUS.themeLoad, inner: ex, - attempted: _opts.theme + attempted: _opts.theme, + quit: true }; this.err(HMSTATUS.themeLoad, newEx); return null; @@ -147,8 +141,10 @@ Implementation of the 'build' verb for HackMyResume. if (inv && inv.length) { this.err(HMSTATUS.invalidFormat, { data: inv, - theme: theme + theme: theme, + quit: true }); + return null; } rez = null; if (sheets.length > 1) { @@ -186,7 +182,6 @@ Implementation of the 'build' verb for HackMyResume. fmt: toFormat }); } - addFreebieFormats(theme); this.stat(HMEVENT.applyTheme, { r: rez, theme: theme @@ -284,9 +279,7 @@ Implementation of the 'build' verb for HackMyResume. }; - /** - Ensure that user-specified outputs/targets are valid. - */ + /** Ensure that user-specified outputs/targets are valid. */ verifyOutputs = function(targets, theme) { this.stat(HMEVENT.verifyOutputs, { diff --git a/dist/verbs/convert.js b/dist/verbs/convert.js index 025910c..c4fc978 100644 --- a/dist/verbs/convert.js +++ b/dist/verbs/convert.js @@ -22,14 +22,7 @@ Implementation of the 'convert' verb for HackMyResume. ConvertVerb = module.exports = Verb.extend({ init: function() { - return this._super('convert'); - }, - invoke: function() { - this.stat(HMEVENT.begin, { - cmd: 'convert' - }); - convert.apply(this, arguments); - return this.stat(HMEVENT.end); + return this._super('convert', convert); } }); diff --git a/dist/verbs/create.js b/dist/verbs/create.js index c1679be..c74abaf 100644 --- a/dist/verbs/create.js +++ b/dist/verbs/create.js @@ -24,16 +24,7 @@ Implementation of the 'create' verb for HackMyResume. CreateVerb = module.exports = Verb.extend({ init: function() { - return this._super('new'); - }, - invoke: function() { - this.stat(HMEVENT.begin, { - cmd: 'create' - }); - create.apply(this, arguments); - this.stat(HMEVENT.begin, { - cmd: 'convert' - }); + return this._super('new', create); } }); diff --git a/dist/verbs/peek.js b/dist/verbs/peek.js index d21eabd..0538221 100644 --- a/dist/verbs/peek.js +++ b/dist/verbs/peek.js @@ -22,14 +22,7 @@ Implementation of the 'peek' verb for HackMyResume. PeekVerb = module.exports = Verb.extend({ init: function() { - return this._super('peek'); - }, - invoke: function() { - this.stat(HMEVENT.begin, { - cmd: 'peek' - }); - peek.apply(this, arguments); - return this.stat(HMEVENT.end); + return this._super('peek', peek); } }); diff --git a/dist/verbs/validate.js b/dist/verbs/validate.js index 89ffde0..d771a28 100644 --- a/dist/verbs/validate.js +++ b/dist/verbs/validate.js @@ -31,16 +31,7 @@ Implementation of the 'validate' verb for HackMyResume. ValidateVerb = module.exports = Verb.extend({ init: function() { - return this._super('validate'); - }, - invoke: function() { - var ret; - this.stat(HMEVENT.begin, { - cmd: 'validate' - }); - ret = validate.apply(this, arguments); - this.stat(HMEVENT.end); - return ret; + return this._super('validate', validate); } }); diff --git a/dist/verbs/verb.js b/dist/verbs/verb.js index 33d8d21..873e17a 100644 --- a/dist/verbs/verb.js +++ b/dist/verbs/verb.js @@ -6,12 +6,14 @@ Definition of the Verb class. */ (function() { - var Class, EVENTS, Verb; + var Class, EVENTS, HMEVENT, Verb; Class = require('../utils/class'); EVENTS = require('events'); + HMEVENT = require('../core/event-codes'); + /** An instantiation of a HackMyResume command. @@ -21,9 +23,21 @@ Definition of the Verb class. Verb = module.exports = Class.extend({ /** Constructor. Automatically called at creation. */ - init: function(moniker) { + init: function(moniker, workhorse) { this.moniker = moniker; this.emitter = new EVENTS.EventEmitter(); + this.workhorse = workhorse; + }, + + /** Invoke the command. */ + invoke: function() { + var ret; + this.stat(HMEVENT.begin, { + cmd: this.moniker + }); + ret = this.workhorse.apply(this, arguments); + this.stat(HMEVENT.end); + return ret; }, /** Forward subscriptions to the event emitter. */ diff --git a/src/verbs/analyze.coffee b/src/verbs/analyze.coffee index 6a74360..2ab8602 100644 --- a/src/verbs/analyze.coffee +++ b/src/verbs/analyze.coffee @@ -19,12 +19,7 @@ chalk = require('chalk') AnalyzeVerb = module.exports = Verb.extend - init: -> @._super 'analyze' - - invoke: -> - @.stat HMEVENT.begin, { cmd: 'analyze' } - analyze.apply @, arguments - @.stat HMEVENT.end + init: -> @_super 'analyze', analyze diff --git a/src/verbs/build.coffee b/src/verbs/build.coffee index 1b5847f..87eb80e 100644 --- a/src/verbs/build.coffee +++ b/src/verbs/build.coffee @@ -42,14 +42,7 @@ loadTheme = null BuildVerb = module.exports = Verb.extend ###* Create a new build verb. ### - init: () -> @._super 'build' - - ###* Invoke the Build command. ### - invoke: -> - @stat HMEVENT.begin, { cmd: 'build' } - ret = build.apply @, arguments - @stat HMEVENT.end - return ret + init: () -> @_super 'build', build @@ -58,13 +51,13 @@ Given a source resume in FRESH or JRS format, a destination resume path, and a theme file, generate 0..N resumes in the desired formats. @param src Path to the source JSON resume file: "rez/resume.json". @param dst An array of paths to the target resume file(s). -@param theme Friendly name of the resume theme. Defaults to "modern". -@param logger Optional logging override. +@param opts Generation options. ### build = ( src, dst, opts ) -> if !src || !src.length - @err HMSTATUS.resumeNotFound, { quit: true } + @err HMSTATUS.resumeNotFound, quit: true + return null prep src, dst, opts @@ -74,10 +67,14 @@ build = ( src, dst, opts ) -> }, @); # Explicit check for any resume loading errors... - if !sheetObjects || _.some( sheetObjects, (so) -> return so.fluenterror ) + problemSheets = _.filter( sheetObjects, (so) -> return so.fluenterror ) + if( problemSheets && problemSheets.length ) + problemSheets[0].quit = true + @err problemSheets[0].fluenterror, problemSheets[0] return null - sheets = sheetObjects.map((r) -> return r.json ) + # Get the collection of raw JSON sheets + sheets = sheetObjects.map (r) -> r.json # Load the theme... theme = null @@ -85,12 +82,14 @@ build = ( src, dst, opts ) -> try tFolder = verifyTheme.call @, _opts.theme theme = _opts.themeObj = loadTheme tFolder + addFreebieFormats theme catch ex newEx = fluenterror: HMSTATUS.themeLoad inner: ex attempted: _opts.theme - this.err HMSTATUS.themeLoad, newEx + quit: true + @err HMSTATUS.themeLoad, newEx return null @stat HMEVENT.afterTheme, { theme: theme } @@ -98,7 +97,8 @@ build = ( src, dst, opts ) -> # Check for invalid outputs... inv = verifyOutputs.call @, dst, theme if inv && inv.length - @err HMSTATUS.invalidFormat, { data: inv, theme: theme } + @err HMSTATUS.invalidFormat, data: inv, theme: theme, quit: true + return null ## Merge input resumes, yielding a single source resume. rez = null @@ -107,7 +107,7 @@ build = ( src, dst, opts ) -> mixed = _.any sheets, (s) -> return if isFRESH then s.basics else !s.basics @stat HMEVENT.beforeMerge, { f: _.clone(sheetObjects), mixed: mixed } if mixed - this.err HMSTATUS.mixedMerge + @err HMSTATUS.mixedMerge rez = _.reduceRight sheets, ( a, b, idx ) -> extend( true, b, a ) @@ -125,7 +125,6 @@ build = ( src, dst, opts ) -> @stat HMEVENT.afterInlineConvert, { file: sheetObjects[0].file, fmt: toFormat } # Add freebie formats to the theme - addFreebieFormats theme @stat HMEVENT.applyTheme, { r: rez, theme: theme } # Load the resume into a FRESHResume or JRSResume object @@ -235,11 +234,9 @@ single = ( targInfo, theme, finished ) -> -###* -Ensure that user-specified outputs/targets are valid. -### +###* Ensure that user-specified outputs/targets are valid. ### verifyOutputs = ( targets, theme ) -> - @.stat HMEVENT.verifyOutputs, { targets: targets, theme: theme } + @stat HMEVENT.verifyOutputs, { targets: targets, theme: theme } _.reject targets.map( ( t ) -> pathInfo = parsePath t { @@ -247,6 +244,8 @@ verifyOutputs = ( targets, theme ) -> }), (t) -> t.format == 'all' || theme.hasFormat( t.format ) + + ###* Reinforce the chosen theme with "freebie" formats provided by HackMyResume. A "freebie" format is an output format such as JSON, YML, or PNG that can be diff --git a/src/verbs/convert.coffee b/src/verbs/convert.coffee index 3aa0e4f..e76ccfb 100644 --- a/src/verbs/convert.coffee +++ b/src/verbs/convert.coffee @@ -17,12 +17,7 @@ HMEVENT = require('../core/event-codes'); ConvertVerb = module.exports = Verb.extend - init: -> @._super 'convert' - - invoke: -> - @.stat HMEVENT.begin, { cmd: 'convert' } - convert.apply @, arguments - @.stat HMEVENT.end + init: -> @_super 'convert', convert diff --git a/src/verbs/create.coffee b/src/verbs/create.coffee index 52c6277..2a42f91 100644 --- a/src/verbs/create.coffee +++ b/src/verbs/create.coffee @@ -17,13 +17,8 @@ HMEVENT = require('../core/event-codes') CreateVerb = module.exports = Verb.extend - init: -> @._super('new') + init: -> @_super 'new', create - invoke: -> - @.stat HMEVENT.begin, { cmd: 'create' } - create.apply @, arguments - @.stat HMEVENT.begin, { cmd: 'convert' } - return ###* diff --git a/src/verbs/peek.coffee b/src/verbs/peek.coffee index 989c38c..57565ce 100644 --- a/src/verbs/peek.coffee +++ b/src/verbs/peek.coffee @@ -17,12 +17,7 @@ HMEVENT = require('../core/event-codes') PeekVerb = module.exports = Verb.extend - init: -> @._super('peek') - - invoke: -> - @.stat HMEVENT.begin, { cmd: 'peek' } - peek.apply @, arguments - @.stat HMEVENT.end + init: -> @_super 'peek', peek diff --git a/src/verbs/validate.coffee b/src/verbs/validate.coffee index 68d6654..7119666 100644 --- a/src/verbs/validate.coffee +++ b/src/verbs/validate.coffee @@ -21,13 +21,7 @@ safeLoadJSON = require '../utils/safe-json-loader' ###* An invokable resume validation command. ### ValidateVerb = module.exports = Verb.extend - init: -> @_super 'validate' - - invoke: -> - @stat HMEVENT.begin, { cmd: 'validate' } - ret = validate.apply @, arguments - @stat HMEVENT.end - return ret + init: -> @_super 'validate', validate diff --git a/src/verbs/verb.coffee b/src/verbs/verb.coffee index b58ed17..d9425c9 100644 --- a/src/verbs/verb.coffee +++ b/src/verbs/verb.coffee @@ -6,10 +6,10 @@ Definition of the Verb class. - # Use J. Resig's nifty class implementation Class = require '../utils/class' EVENTS = require 'events' +HMEVENT = require '../core/event-codes' @@ -22,24 +22,34 @@ Verb = module.exports = Class.extend ###* Constructor. Automatically called at creation. ### - init: ( moniker ) -> - @.moniker = moniker - @.emitter = new EVENTS.EventEmitter() + init: ( moniker, workhorse ) -> + @moniker = moniker + @emitter = new EVENTS.EventEmitter() + @workhorse = workhorse return + ###* Invoke the command. ### + invoke: -> + @stat HMEVENT.begin, cmd: @moniker + ret = @workhorse.apply @, arguments + @stat HMEVENT.end + ret + + + ###* Forward subscriptions to the event emitter. ### on: -> - this.emitter.on.apply @.emitter, arguments + @emitter.on.apply @emitter, arguments ###* Fire an arbitrary event, scoped to "hmr:". ### fire: (evtName, payload) -> payload = payload || { } - payload.cmd = this.moniker - this.emitter.emit 'hmr:' + evtName, payload + payload.cmd = @moniker + @emitter.emit 'hmr:' + evtName, payload true @@ -60,10 +70,11 @@ Verb = module.exports = Class.extend stat: ( subEvent, payload ) -> payload = payload || { } payload.sub = subEvent - this.fire 'status', payload + @fire 'status', payload true + ###* Associate error info with the invocation. ### setError: ( code, obj ) -> @errorCode = code