diff options
| author | Kuuuube <61125188+Kuuuube@users.noreply.github.com> | 2024-02-12 01:10:52 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-02-12 06:10:52 +0000 | 
| commit | fd48f18f8aa05a362f3168cbddcc03659e7510db (patch) | |
| tree | 56d0eef7b54c19aae04f3a43bdcdf5a2d4409733 | |
| parent | 92f6652ade62264cbdd600ec44c7581ec8e23b08 (diff) | |
Add and fix tests with options upgrades (#671)24.2.12.0
* Add and fix tests and options applying
* Fix comma
* Add test file to json.json
* Fix direction of conjugation handlebars update
* Add frequency and cloze-body-kana to upgrade
* Use Array.isArray() instead of arbitrary length check
* Add pitch-accent-categories handlebar
* programmatically get upgrade files
* add type
---------
Co-authored-by: Cashew <tungbinem@gmail.com>
| -rw-r--r-- | ext/data/templates/anki-field-templates-upgrade-v24.handlebars | 56 | ||||
| -rw-r--r-- | ext/js/data/options-util.js | 12 | ||||
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | test/data/json.json | 1 | ||||
| -rw-r--r-- | test/data/vitest.options.config.json | 7 | ||||
| -rw-r--r-- | test/options-util.test.js | 122 | ||||
| -rw-r--r-- | types/ext/options-util.d.ts | 5 | 
7 files changed, 181 insertions, 23 deletions
| diff --git a/ext/data/templates/anki-field-templates-upgrade-v24.handlebars b/ext/data/templates/anki-field-templates-upgrade-v24.handlebars index 717cb74b..1459fd49 100644 --- a/ext/data/templates/anki-field-templates-upgrade-v24.handlebars +++ b/ext/data/templates/anki-field-templates-upgrade-v24.handlebars @@ -1,3 +1,7 @@ +{{#*inline "cloze-body-kana"}} +    {{~#if definition.cloze}}{{definition.cloze.bodyKana}}{{/if~}} +{{/inline}} +  {{#*inline "phonetic-transcriptions"}}      {{~#if (op ">" definition.phoneticTranscriptions.length 0)~}}          <ul> @@ -21,6 +25,15 @@  {{<<<<<<<}}  {{#*inline "conjugation"}} +    {{~#if definition.reasons~}} +        {{~#each definition.reasons~}} +            {{~#if (op ">" @index 0)}} « {{/if~}} +            {{.}} +        {{~/each~}} +    {{~/if~}} +{{/inline}} +{{=======}} +{{#*inline "conjugation"}}      {{~#if (op ">" definition.inflectionRuleChainCandidates.length 0)~}}          {{~set "multiple" false~}}          {{~#if (op ">" definition.inflectionRuleChainCandidates.length 1)~}} @@ -40,13 +53,40 @@          {{~#if (get "multiple")~}}</ul>{{/if~}}      {{~/if~}}  {{/inline}} -{{=======}} -{{#*inline "conjugation"}} -    {{~#if definition.reasons~}} -        {{~#each definition.reasons~}} -            {{~#if (op ">" @index 0)}} « {{/if~}} -            {{.}} -        {{~/each~}} +{{>>>>>>>}} + +{{#*inline "frequency-harmonic-rank"}} +    {{~#if (op "===" definition.frequencyHarmonic -1) ~}} +        9999999 +    {{~else ~}} +        {{definition.frequencyHarmonic}}      {{~/if~}}  {{/inline}} -{{>>>>>>>}} + +{{#*inline "frequency-harmonic-occurrence"}} +    {{~#if (op "===" definition.frequencyHarmonic -1) ~}} +        0 +    {{~else ~}} +        {{definition.frequencyHarmonic}} +    {{~/if~}} +{{/inline}} + +{{#*inline "frequency-average-rank"}} +    {{~#if (op "===" definition.frequencyAverage -1) ~}} +        9999999 +    {{~else ~}} +        {{definition.frequencyAverage}} +    {{~/if~}} +{{/inline}} + +{{#*inline "frequency-average-occurrence"}} +    {{~#if (op "===" definition.frequencyAverage -1) ~}} +        0 +    {{~else ~}} +        {{definition.frequencyAverage}} +    {{~/if~}} +{{/inline}} + +{{~#*inline "pitch-accent-categories"~}} +    {{~#each (pitchCategories @root)~}}{{~.~}}{{~#unless @last~}},{{~/unless~}}{{~/each~}} +{{~/inline~}}
\ No newline at end of file diff --git a/ext/js/data/options-util.js b/ext/js/data/options-util.js index 2ecd5527..312c6efc 100644 --- a/ext/js/data/options-util.js +++ b/ext/js/data/options-util.js @@ -1115,8 +1115,10 @@ export class OptionsUtil {       */      _updateVersion23(options) {          for (const {options: profileOptions} of options.profiles) { -            for (const dictionary of profileOptions.dictionaries) { -                dictionary.partsOfSpeechFilter = true; +            if (Array.isArray(profileOptions.dictionaries)) { +                for (const dictionary of profileOptions.dictionaries) { +                    dictionary.partsOfSpeechFilter = true; +                }              }          }      } @@ -1129,8 +1131,10 @@ export class OptionsUtil {          await this._applyAnkiFieldTemplatesPatch(options, '/data/templates/anki-field-templates-upgrade-v24.handlebars');          for (const {options: profileOptions} of options.profiles) { -            for (const dictionary of profileOptions.dictionaries) { -                dictionary.useDeinflections = true; +            if (Array.isArray(profileOptions.dictionaries)) { +                for (const dictionary of profileOptions.dictionaries) { +                    dictionary.useDeinflections = true; +                }              }          }      } diff --git a/package.json b/package.json index ba9e157a..7c733392 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@          "test-ts-test": "npx tsc --noEmit --project test/jsconfig.json",          "test-code": "vitest run",          "test-code-write": "vitest run --config test/data/vitest.write.config.json", +        "test-options-update": "vitest run --config test/data/vitest.options.config.json",          "test-build": "node ./dev/bin/build.js --dryRun --all",          "license-report": "license-report --output=html --only=prod --fields=name --fields=installedVersion --fields=licenseType --fields=link --html.cssFile=dev/data/legal-npm.css > ext/legal-npm.html",          "license-report-markdown": "license-report --output=markdown --only=prod --fields=name --fields=installedVersion --fields=licenseType --fields=link", diff --git a/test/data/json.json b/test/data/json.json index 1f664587..a99f53a3 100644 --- a/test/data/json.json +++ b/test/data/json.json @@ -23,6 +23,7 @@          {"path": "test/data/dictionaries/invalid-dictionary6/index.json", "ignore": true},          {"path": "test/jsconfig.json", "ignore": true},          {"path": "test/data/vitest.write.config.json", "ignore": true}, +        {"path": "test/data/vitest.options.config.json", "ignore": true},          {"path": "benches/jsconfig.json", "ignore": true},          { diff --git a/test/data/vitest.options.config.json b/test/data/vitest.options.config.json new file mode 100644 index 00000000..e2bca721 --- /dev/null +++ b/test/data/vitest.options.config.json @@ -0,0 +1,7 @@ +{ +    "test": { +        "include": [ +            "../**/options-util.test.js" +        ] +    } +} diff --git a/test/options-util.test.js b/test/options-util.test.js index 4a75fa14..8fe0e212 100644 --- a/test/options-util.test.js +++ b/test/options-util.test.js @@ -663,19 +663,25 @@ async function testFieldTemplatesUpdate() {           * @returns {string}           */          const loadDataFile = (fileName) => { -            const content = fs.readFileSync(path.join(dirname, '..', 'ext', fileName), {encoding: 'utf8'}); +            const content = fs.readFileSync(fileName, {encoding: 'utf8'});              return templatePatcher.parsePatch(content).addition;          }; -        const updates = [ -            {version: 2, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v2.handlebars')}, -            {version: 4, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v4.handlebars')}, -            {version: 6, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v6.handlebars')}, -            {version: 8, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v8.handlebars')}, -            {version: 10, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v10.handlebars')}, -            {version: 12, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v12.handlebars')}, -            {version: 13, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v13.handlebars')}, -            {version: 21, changes: loadDataFile('data/templates/anki-field-templates-upgrade-v21.handlebars')} -        ]; + +        /** @type {import('options-util').TemplateFieldUpdate[]} */ +        const updates = []; +        const fileNameRegex = /^anki-field-templates-upgrade-v(\d+)\.handlebars$/; +        const templatesDirPath = path.join(dirname, '..', 'ext', 'data', 'templates'); +        const templatesDir = fs.readdirSync(templatesDirPath, {encoding: 'utf8'}); +        for (const fileName of templatesDir) { +            const match = fileNameRegex.exec(fileName); +            if (match !== null) { +                updates.push({ +                    version: Number.parseInt(match[1]), +                    changes: loadDataFile(path.join(templatesDirPath, match[0])) +                }); +            } +        } +        updates.sort((a, b) => a.version - b.version);          /**           * @param {number} startVersion           * @param {number} targetVersion @@ -1569,6 +1575,100 @@ async function testFieldTemplatesUpdate() {  {{/inline}}  {{~> (lookup . "marker") ~}}`.trimStart() +            }, +            { +                oldVersion: 21, +                newVersion: 24, +                old: ` +{{#*inline "conjugation"}} +    {{~#if definition.reasons~}} +        {{~#each definition.reasons~}} +            {{~#if (op ">" @index 0)}} « {{/if~}} +            {{.}} +        {{~/each~}} +    {{~/if~}} +{{/inline}}`.trimStart(), + +                expected: ` +{{#*inline "conjugation"}} +    {{~#if (op ">" definition.inflectionRuleChainCandidates.length 0)~}} +        {{~set "multiple" false~}} +        {{~#if (op ">" definition.inflectionRuleChainCandidates.length 1)~}} +            {{~set "multiple" true~}} +        {{~/if~}} +        {{~#if (get "multiple")~}}<ul>{{/if~}} +            {{~#each definition.inflectionRuleChainCandidates~}} +                {{~#if (op ">" inflectionRules.length 0)~}} +                    {{~#if (get "multiple")~}}<li>{{/if~}} +                    {{~#each inflectionRules~}} +                        {{~#if (op ">" @index 0)}} « {{/if~}} +                        {{.}} +                    {{~/each~}} +                    {{~#if (get "multiple")~}}</li>{{/if~}} +                {{~/if~}} +            {{~/each~}} +        {{~#if (get "multiple")~}}</ul>{{/if~}} +    {{~/if~}} +{{/inline}} +{{#*inline "cloze-body-kana"}} +    {{~#if definition.cloze}}{{definition.cloze.bodyKana}}{{/if~}} +{{/inline}} + +{{#*inline "phonetic-transcriptions"}} +    {{~#if (op ">" definition.phoneticTranscriptions.length 0)~}} +        <ul> +            {{~#each definition.phoneticTranscriptions~}} +                {{~#each phoneticTranscriptions~}} +                    <li> +                        {{~set "any" false~}} +                        {{~#each tags~}} +                            {{~#if (get "any")}}, {{else}}<i>({{/if~}} +                            {{name}} +                            {{~set "any" true~}} +                        {{~/each~}} +                        {{~#if (get "any")}})</i> {{/if~}} +                        {{ipa~}} +                    </li> +                {{~/each~}} +            {{~/each~}} +        </ul> +    {{~/if~}} +{{/inline}} +{{#*inline "frequency-harmonic-rank"}} +    {{~#if (op "===" definition.frequencyHarmonic -1) ~}} +        9999999 +    {{~else ~}} +        {{definition.frequencyHarmonic}} +    {{~/if~}} +{{/inline}} + +{{#*inline "frequency-harmonic-occurrence"}} +    {{~#if (op "===" definition.frequencyHarmonic -1) ~}} +        0 +    {{~else ~}} +        {{definition.frequencyHarmonic}} +    {{~/if~}} +{{/inline}} + +{{#*inline "frequency-average-rank"}} +    {{~#if (op "===" definition.frequencyAverage -1) ~}} +        9999999 +    {{~else ~}} +        {{definition.frequencyAverage}} +    {{~/if~}} +{{/inline}} + +{{#*inline "frequency-average-occurrence"}} +    {{~#if (op "===" definition.frequencyAverage -1) ~}} +        0 +    {{~else ~}} +        {{definition.frequencyAverage}} +    {{~/if~}} +{{/inline}} + +{{~#*inline "pitch-accent-categories"~}} +    {{~#each (pitchCategories @root)~}}{{~.~}}{{~#unless @last~}},{{~/unless~}}{{~/each~}} +{{~/inline~}}`.trimStart()              }          ]; diff --git a/types/ext/options-util.d.ts b/types/ext/options-util.d.ts index 62cf5ab6..18201e18 100644 --- a/types/ext/options-util.d.ts +++ b/types/ext/options-util.d.ts @@ -24,3 +24,8 @@ export type IntermediateOptions = Core.SafeAny;  export type LegacyUpdateFunction = (options: LegacyOptions) => void;  export type UpdateFunction = (options: IntermediateOptions) => void | Promise<void>; + +export type TemplateFieldUpdate = { +    version: number; +    changes: string; +}; |