mirror of
https://github.com/JuanCanham/HackMyResume.git
synced 2024-11-22 00:10:15 +00:00
Cleanup and bug fixes.
Remove file-based open methods from resume classes; force clients to use clean string-based or JSON overloads; fix processing glitch in validate(); tweak outputs; adjust tests; update CHANGELOG; etc.
This commit is contained in:
parent
661fb91861
commit
2758038858
60
CHANGELOG.md
60
CHANGELOG.md
@ -1,5 +1,65 @@
|
|||||||
CHANGELOG
|
CHANGELOG
|
||||||
=========
|
=========
|
||||||
|
## v1.7.4
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- [Build instructions](https://github.com/hacksalot/HackMyResume/blob/master/BUILDING.md).
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- More precise date handling.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Issue with incomplete PDF generation (#127).
|
||||||
|
- Issue with building JSON Resume themes (#128).
|
||||||
|
- Issue with generating `.json` output format by itself (#97).
|
||||||
|
|
||||||
|
## v1.7.3
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Issue with generated PDFs being chopped off and displaying a mysterious sequence of numbers of unknown and possibly alien origin (#127).
|
||||||
|
|
||||||
|
- Unsightly border on Modern:PDF.
|
||||||
|
|
||||||
|
- Modern|Positive:PDF formats now correctly reference their PDF-specific CSS files.
|
||||||
|
|
||||||
|
- `Incorrect helper use` warning in Positive:DOC.
|
||||||
|
|
||||||
|
## v1.7.2
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Interim release supporting FluentCV Desktop.
|
||||||
|
|
||||||
|
### Internal
|
||||||
|
|
||||||
|
- Moved [HackMyCore](https://github.com/hacksalot/HackMyCore) dependency to
|
||||||
|
submodule.
|
||||||
|
|
||||||
|
## v1.7.1
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Caffeinate. CoffeeScript now used throughout
|
||||||
|
[HackMyResume](https://github.com/hacksalot/HackMyResume) and
|
||||||
|
[HackMyCore](https://github.com/hacksalot/HackMyCore); generated JavaScript
|
||||||
|
lives in `/dist`.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Issue with generating a single PDF with the `.pdf` extension (#99).
|
||||||
|
|
||||||
|
## v1.7.0
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- [Internal] Relocated HMR processing code to the
|
||||||
|
[HackMyCore](https://github.com/hacksalot/HackMyCore) project. Shouldn't affect
|
||||||
|
normal use.
|
||||||
|
|
||||||
## v1.6.0
|
## v1.6.0
|
||||||
|
|
||||||
### Major Improvements
|
### Major Improvements
|
||||||
|
4
dist/cli/out.js
vendored
4
dist/cli/out.js
vendored
@ -135,8 +135,8 @@ Output routines for HackMyResume.
|
|||||||
style = evt.isValid ? 'green' : 'yellow';
|
style = evt.isValid ? 'green' : 'yellow';
|
||||||
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);
|
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);
|
||||||
if (evt.errors) {
|
if (evt.errors) {
|
||||||
return _.each(evt.errors, function(err, idx) {
|
_.each(evt.errors, function(err, idx) {
|
||||||
return 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));
|
||||||
}, this);
|
}, this);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
13
dist/core/fresh-resume.js
vendored
13
dist/core/fresh-resume.js
vendored
@ -51,17 +51,6 @@ Definition of the FRESHResume class.
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Initialize the FreshResume from file. */
|
|
||||||
|
|
||||||
FreshResume.prototype.open = function(file, opts) {
|
|
||||||
var raw, ret;
|
|
||||||
raw = FS.readFileSync(file, 'utf8');
|
|
||||||
ret = this.parse(raw, opts);
|
|
||||||
this.imp.file = file;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** Initialize the the FreshResume from JSON string data. */
|
/** Initialize the the FreshResume from JSON string data. */
|
||||||
|
|
||||||
FreshResume.prototype.parse = function(stringData, opts) {
|
FreshResume.prototype.parse = function(stringData, opts) {
|
||||||
@ -442,7 +431,7 @@ Definition of the FRESHResume class.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
FreshResume["default"] = function() {
|
FreshResume["default"] = function() {
|
||||||
return new FreshResume().parseJSON(require('fresh-resume-starter'));
|
return new FreshResume().parseJSON(require('fresh-resume-starter').fresh);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
13
dist/core/jrs-resume.js
vendored
13
dist/core/jrs-resume.js
vendored
@ -45,17 +45,6 @@ Definition of the JRSResume class.
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** Initialize the JSResume from file. */
|
|
||||||
|
|
||||||
JRSResume.prototype.open = function(file, opts) {
|
|
||||||
var raw, ret;
|
|
||||||
raw = FS.readFileSync(file, 'utf8');
|
|
||||||
ret = this.parse(raw, opts);
|
|
||||||
this.imp.file = file;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/** Initialize the the JSResume from string. */
|
/** Initialize the the JSResume from string. */
|
||||||
|
|
||||||
JRSResume.prototype.parse = function(stringData, opts) {
|
JRSResume.prototype.parse = function(stringData, opts) {
|
||||||
@ -364,7 +353,7 @@ Definition of the JRSResume class.
|
|||||||
/** Get the default (empty) sheet. */
|
/** Get the default (empty) sheet. */
|
||||||
|
|
||||||
JRSResume["default"] = function() {
|
JRSResume["default"] = function() {
|
||||||
return new JRSResume().open(PATH.join(__dirname, 'empty-jrs.json'), 'Empty');
|
return new JRSResume().parseJSON(require('fresh-resume-starter').jrs);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
2
dist/renderers/handlebars-generator.js
vendored
2
dist/renderers/handlebars-generator.js
vendored
@ -43,7 +43,7 @@ Definition of the HandlebarsGenerator class.
|
|||||||
return template(data);
|
return template(data);
|
||||||
} catch (_error) {
|
} catch (_error) {
|
||||||
throw {
|
throw {
|
||||||
fluenterror: template ? HMSTATUS.invokeTemplate : HMSTATUS.compileTemplate,
|
fluenterror: HMSTATUS[template ? 'invokeTemplate' : 'compileTemplate'],
|
||||||
inner: _error
|
inner: _error
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
2
dist/verbs/validate.js
vendored
2
dist/verbs/validate.js
vendored
@ -96,7 +96,7 @@ Implementation of the 'validate' verb for HackMyResume.
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
json = obj.json;
|
json = obj.json;
|
||||||
fmt = json.basics ? 'jrs' : 'fresh';
|
fmt = json.basics ? 'jars' : 'fresh';
|
||||||
errors = [];
|
errors = [];
|
||||||
try {
|
try {
|
||||||
validate = validator(schemas[fmt], {
|
validate = validator(schemas[fmt], {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "hackmyresume",
|
"name": "hackmyresume",
|
||||||
"version": "1.7.4",
|
"version": "1.7.5",
|
||||||
"description": "Generate polished résumés and CVs in HTML, Markdown, LaTeX, MS Word, PDF, plain text, JSON, XML, YAML, smoke signal, and carrier pigeon.",
|
"description": "Generate polished résumés and CVs in HTML, Markdown, LaTeX, MS Word, PDF, plain text, JSON, XML, YAML, smoke signal, and carrier pigeon.",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -53,7 +53,7 @@
|
|||||||
"copy": "^0.1.3",
|
"copy": "^0.1.3",
|
||||||
"extend": "^3.0.0",
|
"extend": "^3.0.0",
|
||||||
"fresca": "~0.6.0",
|
"fresca": "~0.6.0",
|
||||||
"fresh-jrs-converter": "^0.2.0",
|
"fresh-jrs-converter": "^0.2.1",
|
||||||
"fresh-resume-starter": "^0.2.2",
|
"fresh-resume-starter": "^0.2.2",
|
||||||
"fresh-themes": "^0.14.1-beta",
|
"fresh-themes": "^0.14.1-beta",
|
||||||
"fs-extra": "^0.26.4",
|
"fs-extra": "^0.26.4",
|
||||||
|
@ -149,11 +149,12 @@ module.exports = class OutputHandler
|
|||||||
else this.msgs.afterValidate.msg[2] ),
|
else this.msgs.afterValidate.msg[2] ),
|
||||||
evt.file, evt.fmt
|
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
|
||||||
|
|
||||||
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' )
|
||||||
|
@ -31,15 +31,6 @@ class FreshResume extends AbstractResume
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
###* Initialize the FreshResume from file. ###
|
|
||||||
open: ( file, opts ) ->
|
|
||||||
raw = FS.readFileSync file, 'utf8'
|
|
||||||
ret = this.parse raw, opts
|
|
||||||
@imp.file = file
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
###* Initialize the the FreshResume from JSON string data. ###
|
###* Initialize the the FreshResume from JSON string data. ###
|
||||||
parse: ( stringData, opts ) ->
|
parse: ( stringData, opts ) ->
|
||||||
@imp = @imp ? raw: stringData
|
@imp = @imp ? raw: stringData
|
||||||
@ -351,7 +342,7 @@ class FreshResume extends AbstractResume
|
|||||||
Get the default (starter) sheet.
|
Get the default (starter) sheet.
|
||||||
###
|
###
|
||||||
FreshResume.default = () ->
|
FreshResume.default = () ->
|
||||||
new FreshResume().parseJSON( require 'fresh-resume-starter' )
|
new FreshResume().parseJSON require('fresh-resume-starter').fresh
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -26,15 +26,6 @@ class JRSResume extends AbstractResume
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
###* Initialize the JSResume from file. ###
|
|
||||||
open: ( file, opts ) ->
|
|
||||||
raw = FS.readFileSync file, 'utf8'
|
|
||||||
ret = this.parse raw, opts
|
|
||||||
@imp.file = file
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
###* Initialize the the JSResume from string. ###
|
###* Initialize the the JSResume from string. ###
|
||||||
parse: ( stringData, opts ) ->
|
parse: ( stringData, opts ) ->
|
||||||
@imp = @imp ? raw: stringData
|
@imp = @imp ? raw: stringData
|
||||||
@ -294,7 +285,7 @@ class JRSResume extends AbstractResume
|
|||||||
|
|
||||||
###* Get the default (empty) sheet. ###
|
###* Get the default (empty) sheet. ###
|
||||||
JRSResume.default = () ->
|
JRSResume.default = () ->
|
||||||
new JRSResume().open PATH.join( __dirname, 'empty-jrs.json'), 'Empty'
|
new JRSResume().parseJSON require('fresh-resume-starter').jrs
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,8 @@ HandlebarsGenerator = module.exports =
|
|||||||
return template data
|
return template data
|
||||||
catch
|
catch
|
||||||
throw
|
throw
|
||||||
fluenterror: if template then HMSTATUS.invokeTemplate else HMSTATUS.compileTemplate
|
fluenterror:
|
||||||
|
HMSTATUS[ if template then 'invokeTemplate' else 'compileTemplate' ]
|
||||||
inner: _error
|
inner: _error
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ _validateOne = (t, validator, schemas) ->
|
|||||||
|
|
||||||
# Successfully read the resume. Now parse it as JSON.
|
# Successfully read the resume. Now parse it as JSON.
|
||||||
json = obj.json
|
json = obj.json
|
||||||
fmt = if json.basics then 'jrs' else 'fresh'
|
fmt = if json.basics then 'jars' else 'fresh'
|
||||||
errors = []
|
errors = []
|
||||||
|
|
||||||
try
|
try
|
||||||
@ -78,6 +78,7 @@ _validateOne = (t, validator, schemas) ->
|
|||||||
formats: { date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/ }
|
formats: { date: /^\d{4}(?:-(?:0[0-9]{1}|1[0-2]{1})(?:-[0-9]{2})?)?$/ }
|
||||||
};
|
};
|
||||||
ret.isValid = validate json
|
ret.isValid = validate json
|
||||||
|
|
||||||
if !ret.isValid
|
if !ret.isValid
|
||||||
errors = validate.errors
|
errors = validate.errors
|
||||||
catch
|
catch
|
||||||
|
@ -5,6 +5,7 @@ var chai = require('chai')
|
|||||||
, path = require('path')
|
, path = require('path')
|
||||||
, _ = require('underscore')
|
, _ = require('underscore')
|
||||||
, FRESHResume = require('../../dist/core/fresh-resume')
|
, FRESHResume = require('../../dist/core/fresh-resume')
|
||||||
|
, ResumeFactory = require('../../dist/core/resume-factory')
|
||||||
, validator = require('is-my-json-valid');
|
, validator = require('is-my-json-valid');
|
||||||
|
|
||||||
chai.config.includeStack = false;
|
chai.config.includeStack = false;
|
||||||
@ -17,7 +18,9 @@ function testResume(opts) {
|
|||||||
|
|
||||||
it('should open without throwing an exception', function () {
|
it('should open without throwing an exception', function () {
|
||||||
function tryOpen() {
|
function tryOpen() {
|
||||||
_sheet = new FRESHResume().open( opts.path );
|
var res = ResumeFactory.loadOne( opts.path, { objectify: true } );
|
||||||
|
_sheet = res.rez;
|
||||||
|
//_sheet = new FRESHResume().open( opts.path );
|
||||||
}
|
}
|
||||||
tryOpen.should.not.Throw();
|
tryOpen.should.not.Throw();
|
||||||
});
|
});
|
||||||
@ -39,8 +42,9 @@ function testResume(opts) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should not be modified after saving', function() {
|
it('should not be modified after saving', function() {
|
||||||
var savedSheet = new FRESHResume().open('test/sandbox/' + opts.title + '.json');
|
var savedSheet = ResumeFactory.loadOne( 'test/sandbox/' + opts.title + '.json', { objectify: true } );
|
||||||
_sheet.stringify().should.equal( savedSheet.stringify() );
|
//var savedSheet = new FRESHResume().open('test/sandbox/' + opts.title + '.json');
|
||||||
|
_sheet.stringify().should.equal( savedSheet.rez.stringify() );
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should validate against the FRESH resume schema', function() {
|
it('should validate against the FRESH resume schema', function() {
|
||||||
|
@ -5,6 +5,7 @@ var chai = require('chai')
|
|||||||
, path = require('path')
|
, path = require('path')
|
||||||
, _ = require('underscore')
|
, _ = require('underscore')
|
||||||
, JRSResume = require('../../dist/core/jrs-resume')
|
, JRSResume = require('../../dist/core/jrs-resume')
|
||||||
|
, ResumeFactory = require('../../dist/core/resume-factory')
|
||||||
, validator = require('is-my-json-valid');
|
, validator = require('is-my-json-valid');
|
||||||
|
|
||||||
chai.config.includeStack = false;
|
chai.config.includeStack = false;
|
||||||
@ -20,8 +21,8 @@ function testResume( opts ) {
|
|||||||
it('should open without throwing an exception', function () {
|
it('should open without throwing an exception', function () {
|
||||||
var that = this;
|
var that = this;
|
||||||
function tryOpen() {
|
function tryOpen() {
|
||||||
_sheet = new JRSResume().open(
|
var res = ResumeFactory.loadOne( path.normalize( path.join( __dirname, '/../resumes/jrs-0.0.0/' + opts.title + '.json' ) ), { objectify: true } );
|
||||||
path.normalize( path.join( __dirname, '/../resumes/jrs-0.0.0/' + opts.title + '.json' ) ) )
|
_sheet = res.rez;
|
||||||
}
|
}
|
||||||
tryOpen.should.not.Throw();
|
tryOpen.should.not.Throw();
|
||||||
});
|
});
|
||||||
@ -44,8 +45,8 @@ function testResume( opts ) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should not be modified after saving', function() {
|
it('should not be modified after saving', function() {
|
||||||
var savedSheet = new JRSResume().open( 'test/sandbox/' + opts.title + '.json' );
|
var res = ResumeFactory.loadOne( 'test/sandbox/' + opts.title + '.json', { objectify: true } );
|
||||||
_sheet.stringify().should.equal( savedSheet.stringify() );
|
_sheet.stringify().should.equal( res.rez.stringify() );
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should ' + (opts.isValid ? '' : 'NOT ') + 'validate against the JSON Resume schema', function() {
|
it('should ' + (opts.isValid ? '' : 'NOT ') + 'validate against the JSON Resume schema', function() {
|
||||||
|
Loading…
Reference in New Issue
Block a user