1
0
mirror of https://github.com/JuanCanham/HackMyResume.git synced 2024-11-22 00:10:15 +00:00

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: case HMSTATUS.createError:
msg = printf(M2C(this.msgs.createError.msg), ex.inner.path); msg = printf(M2C(this.msgs.createError.msg), ex.inner.path);
etype = 'error'; etype = 'error';
break;
case HMSTATUS.validateError:
msg = printf(M2C(this.msgs.validateError.msg), ex.inner.toString());
etype = 'error';
} }
return { return {
msg: msg, msg: msg,

4
dist/cli/msg.yml vendored
View File

@ -44,7 +44,7 @@ events:
- "INVALID" - "INVALID"
- "BROKEN" - "BROKEN"
- "MISSING" - "MISSING"
- "UNKNOWN" - "ERROR"
beforePeek: beforePeek:
msg: msg:
- Peeking at **%s** in **%s** - Peeking at **%s** in **%s**
@ -107,3 +107,5 @@ errors:
msg: Failed to create **'%s'**. msg: Failed to create **'%s'**.
exiting: exiting:
msg: Exiting with status code **%s**. 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': case 'missing':
style = 'red'; style = 'red';
adj = msgs[4]; 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); L(M2C(msgs[0], 'white') + chalk[style].bold(adj), evt.file, evt.schema);
if (evt.violations) { if (evt.violations) {
_.each(evt.violations, function(err, idx) { _.each(evt.violations, function(err, idx) {

View File

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

View File

@ -94,20 +94,7 @@ Implementation of the 'validate' verb for HackMyResume.
}; };
try { try {
obj = safeLoadJSON(t); obj = safeLoadJSON(t);
if (obj.ex) { 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.json.basics) { if (obj.json.basics) {
ret.schema = 'jars'; ret.schema = 'jars';
} else { } else {
@ -123,11 +110,26 @@ Implementation of the 'validate' verb for HackMyResume.
if (!ret.isValid) { if (!ret.isValid) {
ret.violations = validate.errors; 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) { } 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); this.stat(HMEVENT.afterValidate, ret);
return ret; return ret;
}; };

View File

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

View File

@ -44,7 +44,7 @@ events:
- "INVALID" - "INVALID"
- "BROKEN" - "BROKEN"
- "MISSING" - "MISSING"
- "UNKNOWN" - "ERROR"
beforePeek: beforePeek:
msg: msg:
- Peeking at **%s** in **%s** - Peeking at **%s** in **%s**
@ -107,3 +107,5 @@ errors:
msg: Failed to create **'%s'**. msg: Failed to create **'%s'**.
exiting: exiting:
msg: Exiting with status code **%s**. 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 'invalid' then style = 'yellow'; adj = msgs[2]
when 'broken' then style = 'red'; adj = msgs[3] when 'broken' then style = 'red'; adj = msgs[3]
when 'missing' then style = 'red'; adj = msgs[4] 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) L(M2C( msgs[0], 'white' ) + chalk[style].bold(adj), evt.file, evt.schema)
if evt.violations if evt.violations

View File

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

View File

@ -21,6 +21,8 @@ safeLoadJSON = require '../utils/safe-json-loader'
###* An invokable resume validation command. ### ###* An invokable resume validation command. ###
module.exports = class ValidateVerb extends Verb module.exports = class ValidateVerb extends Verb
constructor: -> super 'validate', _validate constructor: -> super 'validate', _validate
@ -37,8 +39,6 @@ _validate = (sources, unused, opts) ->
fresh: require 'fresca' fresh: require 'fresca'
jars: require '../core/resume.json' 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) -> results = _.map sources, (t) ->
r = _validateOne.call @, t, validator, schemas, opts r = _validateOne.call @, t, validator, schemas, opts
@err r.error.fluenterror, r.error if r.error @err r.error.fluenterror, r.error if r.error
@ -69,31 +69,34 @@ _validateOne = (t, validator, schemas, opts) ->
try try
# Read and parse the resume JSON # Read and parse the resume JSON. Won't throw.
obj = safeLoadJSON t 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' if obj.ex.operation == 'parse'
errCode = HMSTATUS.parseError errCode = HMSTATUS.parseError
ret.status = 'broken' ret.status = 'broken'
else else
errCode = HMSTATUS.readError errCode = HMSTATUS.readError
ret.status = 'missing' ret.status = 'missing'
ret.error = fluenterror: errCode, inner: obj.ex.inner, quiet: errCode == HMSTATUS.readError ret.error =
fluenterror: errCode,
else inner: obj.ex.inner,
# Set up a FRESH or JSON Resume validator quiet: errCode == HMSTATUS.readError
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
catch 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 @stat HMEVENT.afterValidate, ret
ret ret