mirror of
https://github.com/JuanCanham/HackMyResume.git
synced 2024-11-05 09:56:22 +00:00
0f65e4c9f3
Reintroduce HackMyCore, dropping the interim submodule, and reorganize and improve tests.
116 lines
3.1 KiB
CoffeeScript
116 lines
3.1 KiB
CoffeeScript
###*
|
|
Definition of the ResumeFactory class.
|
|
@license MIT. See LICENSE.md for details.
|
|
@module core/resume-factory
|
|
###
|
|
|
|
|
|
|
|
FS = require('fs')
|
|
HACKMYSTATUS = require('./status-codes')
|
|
HME = require('./event-codes')
|
|
ResumeConverter = require('fresh-jrs-converter')
|
|
chalk = require('chalk')
|
|
SyntaxErrorEx = require('../utils/syntax-error-ex')
|
|
_ = require('underscore')
|
|
require('string.prototype.startswith')
|
|
|
|
|
|
|
|
###*
|
|
A simple factory class for FRESH and JSON Resumes.
|
|
@class ResumeFactory
|
|
###
|
|
|
|
ResumeFactory = module.exports =
|
|
|
|
|
|
|
|
###*
|
|
Load one or more resumes from disk.
|
|
|
|
@param {Object} opts An options object with settings for the factory as well
|
|
as passthrough settings for FRESHResume or JRSResume. Structure:
|
|
|
|
{
|
|
format: 'FRESH', // Format to open as. ('FRESH', 'JRS', null)
|
|
objectify: true, // FRESH/JRSResume or raw JSON?
|
|
inner: { // Passthru options for FRESH/JRSResume
|
|
sort: false
|
|
}
|
|
}
|
|
|
|
###
|
|
load: ( sources, opts, emitter ) ->
|
|
sources.map( (src) ->
|
|
@loadOne( src, opts, emitter )
|
|
, @)
|
|
|
|
|
|
###* Load a single resume from disk. ###
|
|
loadOne: ( src, opts, emitter ) ->
|
|
|
|
toFormat = opts.format # Can be null
|
|
objectify = opts.objectify
|
|
|
|
# Get the destination format. Can be 'fresh', 'jrs', or null/undefined.
|
|
toFormat && (toFormat = toFormat.toLowerCase().trim())
|
|
|
|
# Load and parse the resume JSON
|
|
info = _parse src, opts, emitter
|
|
return info if info.fluenterror
|
|
|
|
# Determine the resume format: FRESH or JRS
|
|
json = info.json
|
|
isFRESH = json.meta && json.meta.format && json.meta.format.startsWith('FRESH@');
|
|
orgFormat = if isFRESH then 'fresh' else 'jrs'
|
|
|
|
# Convert between formats if necessary
|
|
if toFormat and ( orgFormat != toFormat )
|
|
json = ResumeConverter[ 'to' + toFormat.toUpperCase() ]( json )
|
|
|
|
# Objectify the resume, that is, convert it from JSON to a FRESHResume
|
|
# or JRSResume object.
|
|
rez = null
|
|
if objectify
|
|
ResumeClass = require('../core/' + (toFormat || orgFormat) + '-resume');
|
|
rez = new ResumeClass().parseJSON( json, opts.inner );
|
|
rez.i().file = src;
|
|
|
|
file: src
|
|
json: info.json
|
|
rez: rez
|
|
|
|
|
|
_parse = ( fileName, opts, eve ) ->
|
|
|
|
rawData = null
|
|
try
|
|
|
|
# Read the file
|
|
eve && eve.stat( HME.beforeRead, { file: fileName });
|
|
rawData = FS.readFileSync( fileName, 'utf8' );
|
|
eve && eve.stat( HME.afterRead, { file: fileName, data: rawData });
|
|
|
|
# Parse the file
|
|
eve && eve.stat HME.beforeParse, { data: rawData }
|
|
ret = { json: JSON.parse( rawData ) }
|
|
orgFormat =
|
|
if ret.json.meta && ret.json.meta.format && ret.json.meta.format.startsWith('FRESH@')
|
|
then 'fresh' else 'jrs'
|
|
|
|
eve && eve.stat HME.afterParse, { file: fileName, data: ret.json, fmt: orgFormat }
|
|
return ret
|
|
catch
|
|
# Can be ENOENT, EACCES, SyntaxError, etc.
|
|
ex =
|
|
fluenterror: if rawData then HACKMYSTATUS.parseError else HACKMYSTATUS.readError
|
|
inner: _error
|
|
raw: rawData
|
|
file: fileName
|
|
shouldExit: false
|
|
opts.quit && (ex.quit = true)
|
|
eve && eve.err ex.fluenterror, ex
|
|
throw ex if opts.throw
|
|
ex
|