Improve VALIDATE error handling.

This commit is contained in:
hacksalot 2016-02-13 00:11:52 -05:00
parent c889664c31
commit dbef9f0a35
10 changed files with 62 additions and 38 deletions

4
dist/cli/error.js vendored
View File

@ -230,6 +230,10 @@ Error-handling routines for HackMyResume.
case HMSTATUS.createError:
msg = printf(M2C(this.msgs.createError.msg), ex.inner.path);
etype = 'error';
break;
case HMSTATUS.validateError:
msg = printf(M2C(this.msgs.validateError.msg), ex.inner.toString());
etype = 'error';
}
return {
msg: msg,

4
dist/cli/msg.yml vendored
View File

@ -44,7 +44,7 @@ events:
- "INVALID"
- "BROKEN"
- "MISSING"
- "UNKNOWN"
- "ERROR"
beforePeek:
msg:
- Peeking at **%s** in **%s**
@ -107,3 +107,5 @@ errors:
msg: Failed to create **'%s'**.
exiting:
msg: Exiting with status code **%s**.
validateError:
msg: "An error occurred during validation:\n%s"

6
dist/cli/out.js vendored
View File

@ -151,8 +151,12 @@ Output routines for HackMyResume.
case 'missing':
style = 'red';
adj = msgs[4];
break;
case 'unknown':
style = 'red';
adj = msgs[5];
}
evt.schema = evt.schema.toUpperCase();
evt.schema = evt.schema.replace('jars', 'JSON Resume').toUpperCase();
L(M2C(msgs[0], 'white') + chalk[style].bold(adj), evt.file, evt.schema);
if (evt.violations) {
_.each(evt.violations, function(err, idx) {

View File

@ -32,7 +32,8 @@ Status codes for HackMyResume.
themeLoad: 22,
invalidParamCount: 23,
missingParam: 24,
createError: 25
createError: 25,
validateError: 26
};
}).call(this);

View File

@ -94,20 +94,7 @@ Implementation of the 'validate' verb for HackMyResume.
};
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';
}
ret.error = {
fluenterror: errCode,
inner: obj.ex.inner,
quiet: errCode === HMSTATUS.readError
};
} else {
if (!obj.ex) {
if (obj.json.basics) {
ret.schema = 'jars';
} else {
@ -123,11 +110,26 @@ Implementation of the 'validate' verb for HackMyResume.
if (!ret.isValid) {
ret.violations = validate.errors;
}
} else {
if (obj.ex.operation === 'parse') {
errCode = HMSTATUS.parseError;
ret.status = 'broken';
} else {
errCode = HMSTATUS.readError;
ret.status = 'missing';
}
ret.error = {
fluenterror: errCode,
inner: obj.ex.inner,
quiet: errCode === HMSTATUS.readError
};
}
} catch (_error) {
ret.error = _error;
ret.error = {
fluenterror: HMSTATUS.validateError,
inner: _error
};
}
ret.schema = ret.schema.replace('jars', 'JSON Resume');
this.stat(HMEVENT.afterValidate, ret);
return ret;
};

View File

@ -222,6 +222,10 @@ assembleError = ( ex ) ->
msg = printf M2C( this.msgs.createError.msg ), ex.inner.path
etype = 'error'
when HMSTATUS.validateError
msg = printf M2C( @msgs.validateError.msg ), ex.inner.toString()
etype = 'error'
msg: msg # The error message to display
withStack: withStack # Whether to include the stack
quit: quit

View File

@ -44,7 +44,7 @@ events:
- "INVALID"
- "BROKEN"
- "MISSING"
- "UNKNOWN"
- "ERROR"
beforePeek:
msg:
- Peeking at **%s** in **%s**
@ -107,3 +107,5 @@ errors:
msg: Failed to create **'%s'**.
exiting:
msg: Exiting with status code **%s**.
validateError:
msg: "An error occurred during validation:\n%s"

View File

@ -148,7 +148,8 @@ module.exports = class OutputHandler
when 'invalid' then style = 'yellow'; adj = msgs[2]
when 'broken' then style = 'red'; adj = msgs[3]
when 'missing' then style = 'red'; adj = msgs[4]
evt.schema = evt.schema.toUpperCase()
when 'unknown' then style = 'red'; adj = msgs[5]
evt.schema = evt.schema.replace('jars','JSON Resume').toUpperCase()
L(M2C( msgs[0], 'white' ) + chalk[style].bold(adj), evt.file, evt.schema)
if evt.violations

View File

@ -32,3 +32,4 @@ module.exports =
invalidParamCount: 23
missingParam: 24
createError: 25
validateError: 26

View File

@ -21,6 +21,8 @@ safeLoadJSON = require '../utils/safe-json-loader'
###* An invokable resume validation command. ###
module.exports = class ValidateVerb extends Verb
constructor: -> super 'validate', _validate
@ -37,8 +39,6 @@ _validate = (sources, unused, opts) ->
fresh: require 'fresca'
jars: require '../core/resume.json'
# Validate input resumes. Return a { file: <f>, isValid: <v>} object for
# each resume valid, invalid, or broken.
results = _.map sources, (t) ->
r = _validateOne.call @, t, validator, schemas, opts
@err r.error.fluenterror, r.error if r.error
@ -69,31 +69,34 @@ _validateOne = (t, validator, schemas, opts) ->
try
# Read and parse the resume JSON
# Read and parse the resume JSON. Won't throw.
obj = safeLoadJSON t
if obj.ex
# If success, validate the resume against the schema
if !obj.ex
if obj.json.basics then ret.schema = 'jars' else ret.schema = 'fresh'
validate = validator schemas[ ret.schema ], # 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'
ret.violations = validate.errors if !ret.isValid
# If failure, package JSON read/parse errors
else
if obj.ex.operation == 'parse'
errCode = HMSTATUS.parseError
ret.status = 'broken'
else
errCode = HMSTATUS.readError
ret.status = 'missing'
ret.error = fluenterror: errCode, inner: obj.ex.inner, quiet: errCode == HMSTATUS.readError
else
# Set up a FRESH or JSON Resume validator
if obj.json.basics then ret.schema = 'jars' else ret.schema = 'fresh'
validate = validator schemas[ ret.schema ], # Note [1]
formats: { date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/ }
# Validate the resume against the schema
ret.isValid = validate obj.json
ret.status = if ret.isValid then 'valid' else 'invalid'
ret.violations = validate.errors if !ret.isValid
ret.error =
fluenterror: errCode,
inner: obj.ex.inner,
quiet: errCode == HMSTATUS.readError
catch
ret.error = _error
# Package any unexpected exceptions
ret.error = fluenterror: HMSTATUS.validateError, inner: _error
ret.schema = ret.schema.replace 'jars', 'JSON Resume'
@stat HMEVENT.afterValidate, ret
ret