From e15513208584764526e2348ca7796ea665925086 Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Mon, 5 Jul 2021 23:24:06 -0400 Subject: [PATCH] OptionsUtil and tests updates (#1801) * Update OptionsUtil.update to support an optional targetVersion param * Update Anki template updates to have an explicit target version --- ext/js/data/options-util.js | 12 +++++++---- test/test-options-util.js | 43 +++++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/ext/js/data/options-util.js b/ext/js/data/options-util.js index 42175d35..4bd5e7af 100644 --- a/ext/js/data/options-util.js +++ b/ext/js/data/options-util.js @@ -31,7 +31,7 @@ class OptionsUtil { this._optionsSchema = new JsonSchema(schema); } - async update(options) { + async update(options, targetVersion=null) { // Invalid options if (!isObject(options)) { options = {}; @@ -84,7 +84,7 @@ class OptionsUtil { } // Generic updates - options = await this._applyUpdates(options, this._getVersionUpdates()); + options = await this._applyUpdates(options, this._getVersionUpdates(targetVersion)); // Validation options = this._optionsSchema.getValidValueOrDefault(options); @@ -448,8 +448,8 @@ class OptionsUtil { return options; } - _getVersionUpdates() { - return [ + _getVersionUpdates(targetVersion) { + const result = [ {async: false, update: this._updateVersion1.bind(this)}, {async: false, update: this._updateVersion2.bind(this)}, {async: true, update: this._updateVersion3.bind(this)}, @@ -464,6 +464,10 @@ class OptionsUtil { {async: true, update: this._updateVersion12.bind(this)}, {async: true, update: this._updateVersion13.bind(this)} ]; + if (typeof targetVersion === 'number' && targetVersion < result.length) { + result.splice(targetVersion); + } + return result; } _updateVersion1(options) { diff --git a/test/test-options-util.js b/test/test-options-util.js index 7d86743b..986ba040 100644 --- a/test/test-options-util.js +++ b/test/test-options-util.js @@ -658,10 +658,10 @@ async function testFieldTemplatesUpdate(extDir) { {version: 12, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v12.handlebars')}, {version: 13, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v13.handlebars')} ]; - const getUpdateAdditions = (startVersion=0) => { + const getUpdateAdditions = (startVersion, targetVersion) => { let value = ''; for (const {version, changes} of updates) { - if (version < startVersion || changes.length === 0) { continue; } + if (version < startVersion || version > targetVersion || changes.length === 0) { continue; } if (value.length > 0) { value += '\n'; } value += changes; } @@ -671,6 +671,8 @@ async function testFieldTemplatesUpdate(extDir) { const data = [ // Standard format { + oldVersion: 0, + newVersion: 12, old: ` {{#*inline "character"}} {{~definition.character~}} @@ -683,11 +685,13 @@ async function testFieldTemplatesUpdate(extDir) { {{~definition.character~}} {{/inline}} -${getUpdateAdditions()} +<<>> {{~> (lookup . "marker") ~}}`.trimStart() }, // Non-standard marker format { + oldVersion: 0, + newVersion: 12, old: ` {{#*inline "character"}} {{~definition.character~}} @@ -701,19 +705,23 @@ ${getUpdateAdditions()} {{/inline}} {{~> (lookup . "marker2") ~}} -${getUpdateAdditions()}`.trimStart() +<<>>`.trimStart() }, // Empty test { + oldVersion: 0, + newVersion: 12, old: ` {{~> (lookup . "marker") ~}}`.trimStart(), expected: ` -${getUpdateAdditions()} +<<>> {{~> (lookup . "marker") ~}}`.trimStart() }, // Definition tags update { + oldVersion: 0, + newVersion: 12, old: ` {{#*inline "glossary-single"}} {{~#unless brief~}} @@ -779,13 +787,14 @@ ${getUpdateAdditions()} {{~> glossary-single definition brief=brief compactGlossaries=../compactGlossaries data=../.~}} {{/inline}} -${getUpdateAdditions()} +<<>> {{~> (lookup . "marker") ~}} `.trimStart() }, // glossary and glossary-brief update { oldVersion: 7, + newVersion: 12, old: ` {{#*inline "glossary-single"}} {{~#unless brief~}} @@ -876,11 +885,11 @@ ${getUpdateAdditions()} {{~#if only~}}({{#each only}}{{.}}{{#unless @last}}, {{/unless}}{{/each}} only) {{/if~}} {{~/unless~}} {{~#if (op "<=" glossary.length 1)~}} - {{#each glossary}}{{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}{{/each}} + {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{/each}} {{~else if @root.compactGlossaries~}} - {{#each glossary}}{{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}{{#unless @last}} | {{/unless}}{{/each}} + {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{#unless @last}} | {{/unless}}{{/each}} {{~else~}} -
    {{#each glossary}}
  • {{#formatGlossary ../dictionary}}{{{.}}}{{/formatGlossary}}
  • {{/each}}
+
    {{#each glossary}}
  • {{#multiLine}}{{.}}{{/multiLine}}
  • {{/each}}
{{~/if~}} {{~#set "previousDictionary" dictionary~}}{{~/set~}} {{/inline}} @@ -919,12 +928,13 @@ ${getUpdateAdditions()} {{~> glossary brief=true ~}} {{/inline}} -${getUpdateAdditions(7)} +<<>> {{~> (lookup . "marker") ~}}`.trimStart() }, // formatGlossary update { oldVersion: 12, + newVersion: 13, old: ` {{~#if (op "<=" glossary.length 1)~}} {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{/each}} @@ -945,16 +955,17 @@ ${getUpdateAdditions(7)} } ]; - for (const {old, expected, oldVersion} of data) { + const updatesPattern = /<<>>/g; + for (const {old, expected, oldVersion, newVersion} of data) { const options = createOptionsTestData1(); options.profiles[0].options.anki.fieldTemplates = old; - if (typeof oldVersion === 'number') { - options.version = oldVersion; - } + options.version = oldVersion; - const optionsUpdated = clone(await optionsUtil.update(options)); + const expected2 = expected.replace(updatesPattern, getUpdateAdditions(oldVersion, newVersion)); + + const optionsUpdated = clone(await optionsUtil.update(options, newVersion)); const fieldTemplatesActual = optionsUpdated.profiles[0].options.anki.fieldTemplates; - assert.deepStrictEqual(fieldTemplatesActual, expected); + assert.deepStrictEqual(fieldTemplatesActual, expected2); } }