mirror of
https://github.com/JuanCanham/HackMyResume.git
synced 2024-11-05 09:56:22 +00:00
Fixup VALIDATE command.
Introduce MISSING and UNKNOWN states alongside BROKEN, VALID, and INVALID and fix regressions introduced in previous refactorings.
This commit is contained in:
parent
964350d3c7
commit
7a60cd0bab
2
dist/cli/msg.yml
vendored
2
dist/cli/msg.yml
vendored
@ -43,6 +43,8 @@ events:
|
|||||||
- "VALID!"
|
- "VALID!"
|
||||||
- "INVALID"
|
- "INVALID"
|
||||||
- "BROKEN"
|
- "BROKEN"
|
||||||
|
- "MISSING"
|
||||||
|
- "UNKNOWN"
|
||||||
beforePeek:
|
beforePeek:
|
||||||
msg:
|
msg:
|
||||||
- Peeking at **%s** in **%s**
|
- Peeking at **%s** in **%s**
|
||||||
|
26
dist/cli/out.js
vendored
26
dist/cli/out.js
vendored
@ -57,7 +57,7 @@ Output routines for HackMyResume.
|
|||||||
};
|
};
|
||||||
|
|
||||||
OutputHandler.prototype["do"] = function(evt) {
|
OutputHandler.prototype["do"] = function(evt) {
|
||||||
var L, WRAP, info, msg, numFormats, output, rawTpl, sty, style, suffix, template, that, themeName, tot;
|
var L, WRAP, adj, info, msg, msgs, numFormats, output, rawTpl, sty, style, suffix, template, that, themeName, tot;
|
||||||
that = this;
|
that = this;
|
||||||
L = function() {
|
L = function() {
|
||||||
return that.log.apply(that, arguments);
|
return that.log.apply(that, arguments);
|
||||||
@ -132,8 +132,28 @@ Output routines for HackMyResume.
|
|||||||
case HME.afterInlineConvert:
|
case HME.afterInlineConvert:
|
||||||
return L(M2C(this.msgs.afterInlineConvert.msg, 'gray', 'white.dim'), evt.file, evt.fmt);
|
return L(M2C(this.msgs.afterInlineConvert.msg, 'gray', 'white.dim'), evt.file, evt.fmt);
|
||||||
case HME.afterValidate:
|
case HME.afterValidate:
|
||||||
style = evt.isValid ? 'green' : 'yellow';
|
style = 'red';
|
||||||
L(M2C(this.msgs.afterValidate.msg[0], 'white') + chalk[style].bold(evt.isValid ? this.msgs.afterValidate.msg[1] : this.msgs.afterValidate.msg[2]), evt.file, evt.fmt);
|
adj = '';
|
||||||
|
msgs = this.msgs.afterValidate.msg;
|
||||||
|
switch (evt.status) {
|
||||||
|
case 'valid':
|
||||||
|
style = 'green';
|
||||||
|
adj = msgs[1];
|
||||||
|
break;
|
||||||
|
case 'invalid':
|
||||||
|
style = 'yellow';
|
||||||
|
adj = msgs[2];
|
||||||
|
break;
|
||||||
|
case 'broken':
|
||||||
|
style = 'red';
|
||||||
|
adj = msgs[3];
|
||||||
|
break;
|
||||||
|
case 'missing':
|
||||||
|
style = 'red';
|
||||||
|
adj = msgs[4];
|
||||||
|
}
|
||||||
|
evt.fmt = evt.fmt.toUpperCase();
|
||||||
|
L(M2C(msgs[0], 'white') + chalk[style].bold(adj), evt.file, evt.fmt);
|
||||||
if (evt.errors) {
|
if (evt.errors) {
|
||||||
_.each(evt.errors, function(err, idx) {
|
_.each(evt.errors, function(err, idx) {
|
||||||
L(chalk.yellow.bold('--> ') + chalk.yellow(err.field.replace('data.', 'resume.').toUpperCase() + ' ' + err.message));
|
L(chalk.yellow.bold('--> ') + chalk.yellow(err.field.replace('data.', 'resume.').toUpperCase() + ' ' + err.message));
|
||||||
|
52
dist/verbs/validate.js
vendored
52
dist/verbs/validate.js
vendored
@ -63,9 +63,8 @@ Implementation of the 'validate' verb for HackMyResume.
|
|||||||
if (this.hasError() && opts.assert) {
|
if (this.hasError() && opts.assert) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
r = _validateOne.call(this, t, validator, schemas);
|
r = _validateOne.call(this, t, validator, schemas, opts);
|
||||||
if (r.fluenterror) {
|
if (r.fluenterror) {
|
||||||
r.quit = opts.assert;
|
|
||||||
this.err(r.fluenterror, r);
|
this.err(r.fluenterror, r);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
@ -78,33 +77,42 @@ Implementation of the 'validate' verb for HackMyResume.
|
|||||||
return results;
|
return results;
|
||||||
};
|
};
|
||||||
|
|
||||||
_validateOne = function(t, validator, schemas) {
|
_validateOne = function(t, validator, schemas, opts) {
|
||||||
var errCode, errors, fmt, json, obj, ret, validate;
|
var errCode, errors, fmt, obj, ret, validate;
|
||||||
ret = {
|
ret = {
|
||||||
file: t,
|
file: t,
|
||||||
isValid: false
|
isValid: false,
|
||||||
|
status: 'unknown'
|
||||||
};
|
};
|
||||||
obj = safeLoadJSON(t);
|
fmt = '------';
|
||||||
if (obj.ex) {
|
|
||||||
errCode = obj.ex.operation === 'parse' ? HMSTATUS.parseError : HMSTATUS.readError;
|
|
||||||
if (errCode === HMSTATUS.readError) {
|
|
||||||
obj.ex.quiet = true;
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
fluenterror: errCode,
|
|
||||||
inner: obj.ex
|
|
||||||
};
|
|
||||||
}
|
|
||||||
json = obj.json;
|
|
||||||
fmt = json.basics ? 'jars' : 'fresh';
|
|
||||||
errors = [];
|
|
||||||
try {
|
try {
|
||||||
|
obj = safeLoadJSON(t);
|
||||||
|
if (obj.ex) {
|
||||||
|
if (obj.ex.operation === 'parse') {
|
||||||
|
errCode = HMSTATUS.parseError;
|
||||||
|
ret.status = 'broken';
|
||||||
|
} else {
|
||||||
|
errCode = HMSTATUS.readError;
|
||||||
|
ret.status = 'missing';
|
||||||
|
}
|
||||||
|
throw {
|
||||||
|
fluenterror: errCode,
|
||||||
|
inner: obj.ex.inner
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (obj.json.basics) {
|
||||||
|
fmt = 'jars';
|
||||||
|
} else {
|
||||||
|
fmt = 'fresh';
|
||||||
|
}
|
||||||
|
errors = [];
|
||||||
validate = validator(schemas[fmt], {
|
validate = validator(schemas[fmt], {
|
||||||
formats: {
|
formats: {
|
||||||
date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/
|
date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
ret.isValid = validate(json);
|
ret.isValid = validate(obj.json);
|
||||||
|
ret.status = ret.isValid ? 'valid' : 'invalid';
|
||||||
if (!ret.isValid) {
|
if (!ret.isValid) {
|
||||||
errors = validate.errors;
|
errors = validate.errors;
|
||||||
}
|
}
|
||||||
@ -113,8 +121,8 @@ Implementation of the 'validate' verb for HackMyResume.
|
|||||||
}
|
}
|
||||||
this.stat(HMEVENT.afterValidate, {
|
this.stat(HMEVENT.afterValidate, {
|
||||||
file: t,
|
file: t,
|
||||||
isValid: ret.isValid,
|
status: ret.status,
|
||||||
fmt: fmt != null ? fmt.replace('jars', 'JSON Resume') : void 0,
|
fmt: fmt.replace('jars', 'JSON Resume'),
|
||||||
errors: errors
|
errors: errors
|
||||||
});
|
});
|
||||||
if (opts.assert && !ret.isValid) {
|
if (opts.assert && !ret.isValid) {
|
||||||
|
@ -43,6 +43,8 @@ events:
|
|||||||
- "VALID!"
|
- "VALID!"
|
||||||
- "INVALID"
|
- "INVALID"
|
||||||
- "BROKEN"
|
- "BROKEN"
|
||||||
|
- "MISSING"
|
||||||
|
- "UNKNOWN"
|
||||||
beforePeek:
|
beforePeek:
|
||||||
msg:
|
msg:
|
||||||
- Peeking at **%s** in **%s**
|
- Peeking at **%s** in **%s**
|
||||||
|
@ -140,21 +140,25 @@ module.exports = class OutputHandler
|
|||||||
evt.file, evt.fmt );
|
evt.file, evt.fmt );
|
||||||
|
|
||||||
when HME.afterValidate
|
when HME.afterValidate
|
||||||
style = if evt.isValid then 'green' else 'yellow'
|
style = 'red'
|
||||||
L(
|
adj = ''
|
||||||
M2C( this.msgs.afterValidate.msg[0], 'white' ) +
|
msgs = @msgs.afterValidate.msg;
|
||||||
chalk[style].bold(
|
switch evt.status
|
||||||
if evt.isValid
|
when 'valid' then style = 'green'; adj = msgs[1]
|
||||||
then this.msgs.afterValidate.msg[1]
|
when 'invalid' then style = 'yellow'; adj = msgs[2]
|
||||||
else this.msgs.afterValidate.msg[2] ),
|
when 'broken' then style = 'red'; adj = msgs[3]
|
||||||
evt.file, evt.fmt
|
when 'missing' then style = 'red'; adj = msgs[4]
|
||||||
);
|
evt.fmt = evt.fmt.toUpperCase()
|
||||||
|
L(M2C( msgs[0], 'white' ) + chalk[style].bold(adj), evt.file, evt.fmt)
|
||||||
|
|
||||||
if evt.errors
|
if evt.errors
|
||||||
_.each evt.errors, (err,idx) ->
|
_.each evt.errors, (err,idx) ->
|
||||||
L( chalk.yellow.bold('--> ') + chalk.yellow(err.field.replace('data.','resume.').toUpperCase() + ' ' + err.message))
|
L( chalk.yellow.bold('--> ') +
|
||||||
|
chalk.yellow(err.field.replace('data.','resume.').toUpperCase() +
|
||||||
|
' ' + err.message))
|
||||||
return
|
return
|
||||||
, @
|
, @
|
||||||
return
|
return
|
||||||
|
|
||||||
when HME.afterPeek
|
when HME.afterPeek
|
||||||
sty = if evt.error then 'red' else ( if evt.target != undefined then 'green' else 'yellow' )
|
sty = if evt.error then 'red' else ( if evt.target != undefined then 'green' else 'yellow' )
|
||||||
|
@ -29,7 +29,7 @@ module.exports = class ValidateVerb extends Verb
|
|||||||
_validate = (sources, unused, opts) ->
|
_validate = (sources, unused, opts) ->
|
||||||
|
|
||||||
if !sources || !sources.length
|
if !sources || !sources.length
|
||||||
@err HMSTATUS.resumeNotFoundAlt, { quit: true }
|
@err HMSTATUS.resumeNotFoundAlt, quit: true
|
||||||
return null
|
return null
|
||||||
|
|
||||||
validator = require 'is-my-json-valid'
|
validator = require 'is-my-json-valid'
|
||||||
@ -41,10 +41,8 @@ _validate = (sources, unused, opts) ->
|
|||||||
# each resume valid, invalid, or broken.
|
# each resume valid, invalid, or broken.
|
||||||
results = _.map sources, (t) ->
|
results = _.map sources, (t) ->
|
||||||
return { } if @hasError() and opts.assert
|
return { } if @hasError() and opts.assert
|
||||||
r = _validateOne.call @, t, validator, schemas
|
r = _validateOne.call @, t, validator, schemas, opts
|
||||||
if r.fluenterror
|
@err r.fluenterror, r if r.fluenterror
|
||||||
r.quit = opts.assert
|
|
||||||
@err r.fluenterror, r
|
|
||||||
r
|
r
|
||||||
, @
|
, @
|
||||||
|
|
||||||
@ -55,30 +53,32 @@ _validate = (sources, unused, opts) ->
|
|||||||
results
|
results
|
||||||
|
|
||||||
|
|
||||||
_validateOne = (t, validator, schemas) ->
|
_validateOne = (t, validator, schemas, opts) ->
|
||||||
|
|
||||||
ret = file: t, isValid: false
|
ret = file: t, isValid: false, status: 'unknown'
|
||||||
|
fmt = '------'
|
||||||
# Load the input file JSON 1st
|
|
||||||
obj = safeLoadJSON t
|
|
||||||
if obj.ex
|
|
||||||
# safeLoadJSON can only return a READ error or a PARSE error
|
|
||||||
errCode = if obj.ex.operation == 'parse' then HMSTATUS.parseError else HMSTATUS.readError
|
|
||||||
if errCode == HMSTATUS.readError
|
|
||||||
obj.ex.quiet = true
|
|
||||||
return fluenterror: errCode, inner: obj.ex
|
|
||||||
|
|
||||||
# Successfully read the resume. Now parse it as JSON.
|
|
||||||
json = obj.json
|
|
||||||
fmt = if json.basics then 'jars' else 'fresh'
|
|
||||||
errors = []
|
|
||||||
|
|
||||||
try
|
try
|
||||||
validate = validator schemas[ fmt ], { # Note [1]
|
|
||||||
formats: { date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/ }
|
|
||||||
};
|
|
||||||
ret.isValid = validate json
|
|
||||||
|
|
||||||
|
# Load the input file JSON 1st
|
||||||
|
obj = safeLoadJSON t
|
||||||
|
if obj.ex # safeLoadJSON can only return a READ error or a PARSE error
|
||||||
|
if obj.ex.operation == 'parse'
|
||||||
|
errCode = HMSTATUS.parseError
|
||||||
|
ret.status = 'broken'
|
||||||
|
else
|
||||||
|
errCode = HMSTATUS.readError
|
||||||
|
ret.status = 'missing'
|
||||||
|
throw fluenterror: errCode, inner: obj.ex.inner
|
||||||
|
|
||||||
|
# Successfully read the resume. Now parse it as JSON.
|
||||||
|
if obj.json.basics then fmt = 'jars' else fmt = 'fresh'
|
||||||
|
errors = []
|
||||||
|
validate = validator schemas[ fmt ], # Note [1]
|
||||||
|
formats: { date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/ }
|
||||||
|
|
||||||
|
ret.isValid = validate obj.json
|
||||||
|
ret.status = if ret.isValid then 'valid' else 'invalid'
|
||||||
if !ret.isValid
|
if !ret.isValid
|
||||||
errors = validate.errors
|
errors = validate.errors
|
||||||
catch
|
catch
|
||||||
@ -86,8 +86,8 @@ _validateOne = (t, validator, schemas) ->
|
|||||||
|
|
||||||
@stat HMEVENT.afterValidate,
|
@stat HMEVENT.afterValidate,
|
||||||
file: t
|
file: t
|
||||||
isValid: ret.isValid
|
status: ret.status
|
||||||
fmt: fmt?.replace 'jars', 'JSON Resume'
|
fmt: fmt.replace 'jars', 'JSON Resume'
|
||||||
errors: errors
|
errors: errors
|
||||||
|
|
||||||
if opts.assert and !ret.isValid
|
if opts.assert and !ret.isValid
|
||||||
|
Loading…
Reference in New Issue
Block a user