mirror of
				https://github.com/JuanCanham/HackMyResume.git
				synced 2025-10-31 13:17:26 +00:00 
			
		
		
		
	feat: convert: support multiple JRS versions
This commit is contained in:
		
							
								
								
									
										4
									
								
								dist/cli/error.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/cli/error.js
									
									
									
									
										vendored
									
									
								
							| @@ -266,6 +266,10 @@ Error-handling routines for HackMyResume. | ||||
|       case HMSTATUS.themeHelperLoad: | ||||
|         msg = printf(M2C(this.msgs.themeHelperLoad.msg), ex.glob); | ||||
|         etype = 'error'; | ||||
|         break; | ||||
|       case HMSTATUS.invalidSchemaVersion: | ||||
|         msg = printf(M2C(this.msgs.invalidSchemaVersion.msg), ex.data); | ||||
|         etype = 'error'; | ||||
|     } | ||||
|     return { | ||||
|       msg: msg, | ||||
|   | ||||
							
								
								
									
										2
									
								
								dist/cli/main.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/cli/main.js
									
									
									
									
										vendored
									
									
								
							| @@ -74,7 +74,7 @@ Definition of the `main` function. | ||||
|     program.command('validate')["arguments"]('<sources...>').description('Validate a resume in FRESH or JSON RESUME format.').action(function(sources) { | ||||
|       execute.call(this, sources, [], this.opts(), logMsg); | ||||
|     }); | ||||
|     program.command('convert').description('Convert a resume to/from FRESH or JSON RESUME format.').action(function() { | ||||
|     program.command('convert').description('Convert a resume to/from FRESH or JSON RESUME format.').option('-f --format <fmt>', 'FRESH or JRS format and optional version', void 0).action(function() { | ||||
|       var x; | ||||
|       x = splitSrcDest.call(this); | ||||
|       execute.call(this, x.src, x.dst, this.opts(), logMsg); | ||||
|   | ||||
							
								
								
									
										2
									
								
								dist/cli/msg.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								dist/cli/msg.yml
									
									
									
									
										vendored
									
									
								
							| @@ -137,3 +137,5 @@ errors: | ||||
|       An error occurred while attempting to load the '%s' theme helper. Is the | ||||
|       theme correctly installed? | ||||
|     dummy: dontcare | ||||
|   invalidSchemaVersion: | ||||
|     msg: "'%s' is not recognized as a valid schema version." | ||||
|   | ||||
							
								
								
									
										23
									
								
								dist/core/fresh-resume.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										23
									
								
								dist/core/fresh-resume.js
									
									
									
									
										vendored
									
									
								
							| @@ -109,14 +109,27 @@ Definition of the FRESHResume class. | ||||
|     Save the sheet to disk in a specific format, either FRESH or JSON Resume. | ||||
|      */ | ||||
|  | ||||
|     FreshResume.prototype.saveAs = function(filename, format) { | ||||
|       var newRep; | ||||
|       if (format !== 'JRS') { | ||||
|     FreshResume.prototype.saveAs = function(filename, format, version) { | ||||
|       var freshVersionReg, newRep, parts, safeFormat, safeVersion; | ||||
|       safeFormat = (format || 'FRESH').trim(); | ||||
|       safeVersion = version || "0"; | ||||
|       freshVersionReg = require('../utils/fresh-version-regex'); | ||||
|       if (!freshVersionReg().test(safeFormat)) { | ||||
|         throw { | ||||
|           badVer: safeFormat | ||||
|         }; | ||||
|       } | ||||
|       parts = safeFormat.split('@'); | ||||
|       if (parts[0] === 'FRESH') { | ||||
|         this.imp.file = filename || this.imp.file; | ||||
|         FS.writeFileSync(this.imp.file, this.stringify(), 'utf8'); | ||||
|       } else { | ||||
|         newRep = CONVERTER.toJRS(this); | ||||
|       } else if (parts[0] === 'JRS') { | ||||
|         newRep = CONVERTER.toJRS(this, null, parts.length > 1 ? parts[1] : "1.0.0"); | ||||
|         FS.writeFileSync(filename, JRSResume.stringify(newRep), 'utf8'); | ||||
|       } else { | ||||
|         throw { | ||||
|           badVer: safeFormat | ||||
|         }; | ||||
|       } | ||||
|       return this; | ||||
|     }; | ||||
|   | ||||
							
								
								
									
										3
									
								
								dist/core/status-codes.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								dist/core/status-codes.js
									
									
									
									
										vendored
									
									
								
							| @@ -37,7 +37,8 @@ Status codes for HackMyResume. | ||||
|     invalidOptionsFile: 27, | ||||
|     optionsFileNotFound: 28, | ||||
|     unknownSchema: 29, | ||||
|     themeHelperLoad: 30 | ||||
|     themeHelperLoad: 30, | ||||
|     invalidSchemaVersion: 31 | ||||
|   }; | ||||
|  | ||||
| }).call(this); | ||||
|   | ||||
							
								
								
									
										37
									
								
								dist/verbs/convert.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								dist/verbs/convert.js
									
									
									
									
										vendored
									
									
								
							| @@ -39,7 +39,7 @@ Implementation of the 'convert' verb for HackMyResume. | ||||
|    */ | ||||
|  | ||||
|   _convert = function(srcs, dst, opts) { | ||||
|     var results; | ||||
|     var fmtUp, freshVerRegex, matches, results, targetSchema, targetVer; | ||||
|     if (!srcs || !srcs.length) { | ||||
|       this.err(HMSTATUS.resumeNotFound, { | ||||
|         quit: true | ||||
| @@ -65,13 +65,27 @@ Implementation of the 'convert' verb for HackMyResume. | ||||
|         quit: true | ||||
|       }); | ||||
|     } | ||||
|     targetVer = null; | ||||
|     if (opts.format) { | ||||
|       fmtUp = opts.format.trim().toUpperCase(); | ||||
|       freshVerRegex = require('../utils/fresh-version-regex'); | ||||
|       matches = fmtUp.match(freshVerRegex()); | ||||
|       if (!matches) { | ||||
|         this.err(HMSTATUS.invalidSchemaVersion, { | ||||
|           data: opts.format.trim(), | ||||
|           quit: true | ||||
|         }); | ||||
|       } | ||||
|       targetSchema = matches[1]; | ||||
|       targetVer = matches[2] || '1'; | ||||
|     } | ||||
|     if (this.hasError()) { | ||||
|       this.reject(this.errorCode); | ||||
|       return null; | ||||
|     } | ||||
|     results = _.map(srcs, function(src, idx) { | ||||
|       var r; | ||||
|       r = _convertOne.call(this, src, dst, idx); | ||||
|       r = _convertOne.call(this, src, dst, idx, targetSchema, targetVer); | ||||
|       if (r.fluenterror) { | ||||
|         r.quit = opts.assert; | ||||
|         this.err(r.fluenterror, r); | ||||
| @@ -89,8 +103,8 @@ Implementation of the 'convert' verb for HackMyResume. | ||||
|  | ||||
|   /** Private workhorse method. Convert a single resume. */ | ||||
|  | ||||
|   _convertOne = function(src, dst, idx) { | ||||
|     var rez, rinfo, srcFmt, targetFormat; | ||||
|   _convertOne = function(src, dst, idx, targetSchema, targetVer) { | ||||
|     var err, rez, rinfo, srcFmt, targetFormat; | ||||
|     rinfo = ResumeFactory.loadOne(src, { | ||||
|       format: null, | ||||
|       objectify: true, | ||||
| @@ -118,14 +132,25 @@ Implementation of the 'convert' verb for HackMyResume. | ||||
|       rinfo.fluenterror = HMSTATUS.unknownSchema; | ||||
|       return rinfo; | ||||
|     } | ||||
|     targetFormat = srcFmt === 'JRS' ? 'FRESH' : 'JRS'; | ||||
|     targetFormat = targetSchema || (srcFmt === 'JRS' ? 'FRESH' : 'JRS'); | ||||
|     this.stat(HMEVENT.beforeConvert, { | ||||
|       srcFile: rinfo.file, | ||||
|       srcFmt: srcFmt, | ||||
|       dstFile: dst[idx], | ||||
|       dstFmt: targetFormat | ||||
|     }); | ||||
|     rez.saveAs(dst[idx], targetFormat); | ||||
|     try { | ||||
|       rez.saveAs(dst[idx], targetFormat, targetVer); | ||||
|     } catch (_error) { | ||||
|       err = _error; | ||||
|       if (err.badVer) { | ||||
|         return { | ||||
|           fluenterror: HMSTATUS.invalidSchemaVersion, | ||||
|           quit: true, | ||||
|           data: err.badVer | ||||
|         }; | ||||
|       } | ||||
|     } | ||||
|     return rez; | ||||
|   }; | ||||
|  | ||||
|   | ||||
| @@ -257,6 +257,9 @@ assembleError = ( ex ) -> | ||||
|       msg = printf M2C( @msgs.themeHelperLoad.msg ), ex.glob | ||||
|       etype = 'error' | ||||
|  | ||||
|     when HMSTATUS.invalidSchemaVersion | ||||
|       msg = printf M2C( @msgs.invalidSchemaVersion.msg ), ex.data | ||||
|       etype = 'error' | ||||
|  | ||||
|   msg: msg              # The error message to display | ||||
|   withStack: withStack  # Whether to include the stack | ||||
|   | ||||
| @@ -84,6 +84,7 @@ main = module.exports = ( rawArgs, exitCallback ) -> | ||||
|   program | ||||
|     .command('convert') | ||||
|     .description('Convert a resume to/from FRESH or JSON RESUME format.') | ||||
|     .option('-f --format <fmt>', 'FRESH or JRS format and optional version', undefined) | ||||
|     .action(-> | ||||
|       x = splitSrcDest.call( this ); | ||||
|       execute.call( this, x.src, x.dst, this.opts(), logMsg) | ||||
|   | ||||
| @@ -137,3 +137,5 @@ errors: | ||||
|       An error occurred while attempting to load the '%s' theme helper. Is the | ||||
|       theme correctly installed? | ||||
|     dummy: dontcare | ||||
|   invalidSchemaVersion: | ||||
|     msg: "'%s' is not recognized as a valid schema version." | ||||
|   | ||||
| @@ -94,13 +94,26 @@ class FreshResume# extends AbstractResume | ||||
|   ###* | ||||
|   Save the sheet to disk in a specific format, either FRESH or JSON Resume. | ||||
|   ### | ||||
|   saveAs: ( filename, format ) -> | ||||
|     if format != 'JRS' | ||||
|   saveAs: ( filename, format, version ) -> | ||||
|  | ||||
|     # If format isn't specified, default to FRESH | ||||
|     safeFormat = (format || 'FRESH').trim() | ||||
|     safeVersion = version || "0" | ||||
|  | ||||
|     # Validate against the FRESH version regex | ||||
|     # freshVersionReg = require '../utils/fresh-version-regex' | ||||
|     # if (not freshVersionReg().test( safeFormat )) | ||||
|     #   throw badVer: safeFormat | ||||
|  | ||||
|     parts = safeFormat.split '@' | ||||
|     if parts[0] == 'FRESH' | ||||
|       @imp.file = filename || @imp.file | ||||
|       FS.writeFileSync @imp.file, @stringify(), 'utf8' | ||||
|     else | ||||
|       newRep = CONVERTER.toJRS this | ||||
|     else if parts[0] == 'JRS' | ||||
|       newRep = CONVERTER.toJRS @, null, if parts.length > 1 then parts[1] else "1" | ||||
|       FS.writeFileSync filename, JRSResume.stringify( newRep ), 'utf8' | ||||
|     else | ||||
|       throw badVer: safeFormat | ||||
|     @ | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -37,3 +37,4 @@ module.exports = | ||||
|   optionsFileNotFound: 28 | ||||
|   unknownSchema: 29 | ||||
|   themeHelperLoad: 30 | ||||
|   invalidSchemaVersion: 31 | ||||
|   | ||||
| @@ -46,6 +46,20 @@ _convert = ( srcs, dst, opts ) -> | ||||
|   if srcs && dst && srcs.length && dst.length && srcs.length != dst.length | ||||
|     @err HMSTATUS.inputOutputParity, { quit: true } | ||||
|  | ||||
|   # Validate the destination format (if specified) | ||||
|   targetVer = null | ||||
|   if opts.format | ||||
|     fmtUp = opts.format.trim().toUpperCase() | ||||
|     freshVerRegex = require '../utils/fresh-version-regex' | ||||
|     matches = fmtUp.match freshVerRegex() | ||||
|     # null | ||||
|     # [ 'JRS@1.0', 'JRS', '1.0', index: 0, input: 'FRESH' ] | ||||
|     # [ 'FRESH', 'FRESH', undefined, index: 0, input: 'FRESH' ] | ||||
|     if not matches | ||||
|       @err HMSTATUS.invalidSchemaVersion, data: opts.format.trim(), quit: true | ||||
|     targetSchema = matches[1] | ||||
|     targetVer = matches[2] || '1' | ||||
|  | ||||
|   # If any errors have occurred this early, we're done. | ||||
|   if @hasError() | ||||
|     @reject @errorCode | ||||
| @@ -55,7 +69,7 @@ _convert = ( srcs, dst, opts ) -> | ||||
|   results = _.map srcs, ( src, idx ) -> | ||||
|  | ||||
|     # Convert each resume in turn | ||||
|     r = _convertOne.call @, src, dst, idx | ||||
|     r = _convertOne.call @, src, dst, idx, targetSchema, targetVer | ||||
|  | ||||
|     # Handle conversion errors | ||||
|     if r.fluenterror | ||||
| @@ -74,12 +88,12 @@ _convert = ( srcs, dst, opts ) -> | ||||
|  | ||||
|  | ||||
| ###* Private workhorse method. Convert a single resume. ### | ||||
| _convertOne = (src, dst, idx) -> | ||||
| _convertOne = (src, dst, idx, targetSchema, targetVer) -> | ||||
|  | ||||
|   # Load the resume | ||||
|   rinfo = ResumeFactory.loadOne src, | ||||
|     format: null | ||||
|     objectify: true, | ||||
|     objectify: true | ||||
|     inner: | ||||
|       privatize: false | ||||
|  | ||||
| @@ -94,6 +108,8 @@ _convertOne = (src, dst, idx) -> | ||||
|     #@err rinfo.fluenterror, rinfo | ||||
|     return rinfo | ||||
|  | ||||
|   # Determine the resume's SOURCE format | ||||
|   # TODO: replace with detector component | ||||
|   rez = rinfo.rez | ||||
|   srcFmt = '' | ||||
|   if rez.meta && rez.meta.format #&& rez.meta.format.substr(0, 5).toUpperCase() == 'FRESH' | ||||
| @@ -104,8 +120,10 @@ _convertOne = (src, dst, idx) -> | ||||
|     rinfo.fluenterror = HMSTATUS.unknownSchema | ||||
|     return rinfo | ||||
|  | ||||
|   targetFormat = if srcFmt == 'JRS' then 'FRESH' else 'JRS' | ||||
|   # Determine the TARGET format for the conversion | ||||
|   targetFormat = targetSchema or (if srcFmt == 'JRS' then 'FRESH' else 'JRS') | ||||
|  | ||||
|   # Fire the beforeConvert event | ||||
|   this.stat HMEVENT.beforeConvert, | ||||
|     srcFile: rinfo.file | ||||
|     srcFmt: srcFmt | ||||
| @@ -113,5 +131,9 @@ _convertOne = (src, dst, idx) -> | ||||
|     dstFmt: targetFormat | ||||
|  | ||||
|   # Save it to the destination format | ||||
|   rez.saveAs dst[idx], targetFormat | ||||
|   try | ||||
|     rez.saveAs dst[idx], targetFormat, targetVer | ||||
|   catch err | ||||
|     if err.badVer | ||||
|       return fluenterror: HMSTATUS.invalidSchemaVersion, quit: true, data: err.badVer | ||||
|   rez | ||||
|   | ||||
		Reference in New Issue
	
	Block a user