From 7b1838a282f4ac5c50e0ea36122751c3454266aa Mon Sep 17 00:00:00 2001 From: toasted-nutbread Date: Sun, 9 Aug 2020 21:00:37 -0400 Subject: [PATCH] Create dev utility class for some shared functionality (#724) --- dev/build.js | 48 ++----------------- dev/yomichan-util.js | 79 ++++++++++++++++++++++++++++++++ test/dictionary-validate.js | 2 +- test/lint/global-declarations.js | 4 +- test/test-database.js | 11 +++-- test/test-dictionary.js | 4 +- test/test-manifest.js | 4 +- test/yomichan-test.js | 39 ++-------------- 8 files changed, 99 insertions(+), 92 deletions(-) create mode 100644 dev/yomichan-util.js diff --git a/dev/build.js b/dev/build.js index 6b62083e..efa04bd5 100644 --- a/dev/build.js +++ b/dev/build.js @@ -19,28 +19,10 @@ const fs = require('fs'); const path = require('path'); const readline = require('readline'); const childProcess = require('child_process'); -const yomichanTest = require('../test/yomichan-test'); +const util = require('./yomichan-util'); +const {getAllFiles, getDefaultManifestAndVariants, createManifestString} = util; -function getAllFiles(directory, relativeTo) { - const results = []; - const directories = [directory]; - for (const dir of directories) { - const fileNames = fs.readdirSync(dir); - for (const fileName of fileNames) { - const fullFileName = path.join(dir, fileName); - const relativeFileName = path.relative(relativeTo, fullFileName); - const stats = fs.lstatSync(fullFileName); - if (stats.isFile()) { - results.push(relativeFileName); - } else if (stats.isDirectory()) { - directories.push(fullFileName); - } - } - } - return results; -} - async function createZip(directory, outputFileName, sevenZipExes=[], onUpdate=null) { for (const exe of sevenZipExes) { try { @@ -64,7 +46,7 @@ async function createZip(directory, outputFileName, sevenZipExes=[], onUpdate=nu } async function createJSZip(directory, outputFileName, onUpdate) { - const JSZip = yomichanTest.JSZip; + const JSZip = util.JSZip; const files = getAllFiles(directory, directory); const zip = new JSZip(); for (const fileName of files) { @@ -134,24 +116,9 @@ function getObjectProperties(object, path2, count) { return object; } -function loadDefaultManifest() { - const {manifest} = loadDefaultManifestAndVariants(); - return manifest; -} - -function loadDefaultManifestAndVariants() { - const fileName = path.join(__dirname, 'data', 'manifest-variants.json'); - const {manifest, variants} = JSON.parse(fs.readFileSync(fileName)); - return {manifest, variants}; -} - -function createManifestString(manifest) { - return JSON.stringify(manifest, null, 4) + '\n'; -} - async function main() { - const {manifest, variants} = loadDefaultManifestAndVariants(); + const {manifest, variants} = getDefaultManifestAndVariants(); const rootDir = path.join(__dirname, '..'); const extDir = path.join(rootDir, 'ext'); @@ -204,11 +171,4 @@ async function main() { } -module.exports = { - loadDefaultManifest, - loadDefaultManifestAndVariants, - createManifestString -}; - - if (require.main === module) { main(); } diff --git a/dev/yomichan-util.js b/dev/yomichan-util.js new file mode 100644 index 00000000..2d8f31ea --- /dev/null +++ b/dev/yomichan-util.js @@ -0,0 +1,79 @@ +/* + * Copyright (C) 2020 Yomichan Authors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +const fs = require('fs'); +const path = require('path'); + + +let JSZip = null; + + +function getJSZip() { + if (JSZip === null) { + process.noDeprecation = true; // Suppress a warning about JSZip + JSZip = require(path.join(__dirname, '../ext/mixed/lib/jszip.min.js')); + process.noDeprecation = false; + } + return JSZip; +} + + +function getAllFiles(baseDirectory, relativeTo=null, predicate=null) { + const results = []; + const directories = [baseDirectory]; + while (directories.length > 0) { + const directory = directories.shift(); + const fileNames = fs.readdirSync(directory); + for (const fileName of fileNames) { + const fullFileName = path.join(directory, fileName); + const relativeFileName = (relativeTo !== null ? path.relative(relativeTo, fullFileName) : fullFileName); + const stats = fs.lstatSync(fullFileName); + if (stats.isFile()) { + if (typeof predicate !== 'function' || predicate(fullFileName, directory, baseDirectory)) { + results.push(relativeFileName); + } + } else if (stats.isDirectory()) { + directories.push(fullFileName); + } + } + } + return results; +} + +function getDefaultManifest() { + const {manifest} = getDefaultManifestAndVariants(); + return manifest; +} + +function getDefaultManifestAndVariants() { + const fileName = path.join(__dirname, 'data', 'manifest-variants.json'); + const {manifest, variants} = JSON.parse(fs.readFileSync(fileName)); + return {manifest, variants}; +} + +function createManifestString(manifest) { + return JSON.stringify(manifest, null, 4) + '\n'; +} + + +module.exports = { + get JSZip() { return getJSZip(); }, + getAllFiles, + getDefaultManifest, + getDefaultManifestAndVariants, + createManifestString +}; diff --git a/test/dictionary-validate.js b/test/dictionary-validate.js index 716e8df4..d01d74eb 100644 --- a/test/dictionary-validate.js +++ b/test/dictionary-validate.js @@ -17,7 +17,7 @@ const fs = require('fs'); const path = require('path'); -const {JSZip} = require('./yomichan-test'); +const {JSZip} = require('../dev/yomichan-util'); const {VM} = require('./yomichan-vm'); const vm = new VM(); diff --git a/test/lint/global-declarations.js b/test/lint/global-declarations.js index 2fc9a5e2..355cb64a 100644 --- a/test/lint/global-declarations.js +++ b/test/lint/global-declarations.js @@ -19,7 +19,7 @@ const fs = require('fs'); const path = require('path'); const assert = require('assert'); -const {getAllFiles} = require('../yomichan-test'); +const {getAllFiles} = require('../../dev/yomichan-util'); function countOccurences(string, pattern) { @@ -116,7 +116,7 @@ function main() { const directory = path.resolve(__dirname, '..', '..', 'ext'); const pattern = /\.js$/; const ignorePattern = /[\\/]ext[\\/]mixed[\\/]lib[\\/]/; - const fileNames = getAllFiles(directory, (f) => pattern.test(f) && !ignorePattern.test(f)); + const fileNames = getAllFiles(directory, null, (f) => pattern.test(f) && !ignorePattern.test(f)); for (const fileName of fileNames) { if (!validateGlobals(fileName, fix)) { process.exit(-1); diff --git a/test/test-database.js b/test/test-database.js index e8fb07b3..84fa8afb 100644 --- a/test/test-database.js +++ b/test/test-database.js @@ -19,7 +19,8 @@ const fs = require('fs'); const url = require('url'); const path = require('path'); const assert = require('assert'); -const yomichanTest = require('./yomichan-test'); +const {JSZip} = require('../dev/yomichan-util'); +const {createTestDictionaryArchive} = require('./yomichan-test'); const {VM} = require('./yomichan-vm'); require('fake-indexeddb/auto'); @@ -104,7 +105,7 @@ const vm = new VM({ fetch, indexedDB: global.indexedDB, IDBKeyRange: global.IDBKeyRange, - JSZip: yomichanTest.JSZip, + JSZip, addEventListener() { // NOP } @@ -169,7 +170,7 @@ function clearDatabase(timeout) { async function testDatabase1() { // Load dictionary data - const testDictionary = yomichanTest.createTestDictionaryArchive('valid-dictionary1'); + const testDictionary = createTestDictionaryArchive('valid-dictionary1'); const testDictionarySource = await testDictionary.generateAsync({type: 'string'}); const testDictionaryIndex = JSON.parse(await testDictionary.files['index.json'].async('string')); @@ -853,7 +854,7 @@ async function testFindTagForTitle1(database, title) { async function testDatabase2() { // Load dictionary data - const testDictionary = yomichanTest.createTestDictionaryArchive('valid-dictionary1'); + const testDictionary = createTestDictionaryArchive('valid-dictionary1'); const testDictionarySource = await testDictionary.generateAsync({type: 'string'}); const testDictionaryIndex = JSON.parse(await testDictionary.files['index.json'].async('string')); @@ -910,7 +911,7 @@ async function testDatabase3() { await dictionaryDatabase.prepare(); for (const invalidDictionary of invalidDictionaries) { - const testDictionary = yomichanTest.createTestDictionaryArchive(invalidDictionary); + const testDictionary = createTestDictionaryArchive(invalidDictionary); const testDictionarySource = await testDictionary.generateAsync({type: 'string'}); let error = null; diff --git a/test/test-dictionary.js b/test/test-dictionary.js index 27cc90df..2ca0c652 100644 --- a/test/test-dictionary.js +++ b/test/test-dictionary.js @@ -15,7 +15,7 @@ * along with this program. If not, see . */ -const yomichanTest = require('./yomichan-test'); +const {createTestDictionaryArchive} = require('./yomichan-test'); const dictionaryValidate = require('./dictionary-validate'); @@ -33,7 +33,7 @@ async function main() { const schemas = dictionaryValidate.getSchemas(); for (const {name, valid} of dictionaries) { - const archive = yomichanTest.createTestDictionaryArchive(name); + const archive = createTestDictionaryArchive(name); let error = null; try { diff --git a/test/test-manifest.js b/test/test-manifest.js index cb86ce7b..07889105 100644 --- a/test/test-manifest.js +++ b/test/test-manifest.js @@ -18,7 +18,7 @@ const fs = require('fs'); const path = require('path'); const assert = require('assert'); -const {loadDefaultManifest, createManifestString} = require('../dev/build'); +const {getDefaultManifest, createManifestString} = require('../dev/yomichan-util'); function loadManifestString() { @@ -28,7 +28,7 @@ function loadManifestString() { function validateManifest() { const manifest1 = loadManifestString(); - const manifest2 = createManifestString(loadDefaultManifest()); + const manifest2 = createManifestString(getDefaultManifest()); assert.strictEqual(manifest1, manifest2, 'Manifest data does not match.'); } diff --git a/test/yomichan-test.js b/test/yomichan-test.js index b4f5ac7c..af1ea2e3 100644 --- a/test/yomichan-test.js +++ b/test/yomichan-test.js @@ -19,23 +19,12 @@ const fs = require('fs'); const path = require('path'); -let JSZip = null; - - -function getJSZip() { - if (JSZip === null) { - process.noDeprecation = true; // Suppress a warning about JSZip - JSZip = require(path.join(__dirname, '../ext/mixed/lib/jszip.min.js')); - process.noDeprecation = false; - } - return JSZip; -} - function createTestDictionaryArchive(dictionary, dictionaryName) { const dictionaryDirectory = path.join(__dirname, 'data', 'dictionaries', dictionary); const fileNames = fs.readdirSync(dictionaryDirectory); - const archive = new (getJSZip())(); + const {JSZip} = require('../dev/yomichan-util'); + const archive = new JSZip(); for (const fileName of fileNames) { if (/\.json$/.test(fileName)) { @@ -54,29 +43,7 @@ function createTestDictionaryArchive(dictionary, dictionaryName) { return archive; } -function getAllFiles(baseDirectory, predicate=null) { - const results = []; - const directories = [path.resolve(baseDirectory)]; - while (directories.length > 0) { - const directory = directories.shift(); - for (const fileName of fs.readdirSync(directory)) { - const fullFileName = path.resolve(directory, fileName); - const stats = fs.statSync(fullFileName); - if (stats.isFile()) { - if (typeof predicate !== 'function' || predicate(fullFileName, directory, baseDirectory)) { - results.push(fullFileName); - } - } else if (stats.isDirectory()) { - directories.push(fullFileName); - } - } - } - return results; -} - module.exports = { - createTestDictionaryArchive, - getAllFiles, - get JSZip() { return getJSZip(); } + createTestDictionaryArchive };