diff options
| author | Christian <[email protected]> | 2021-03-18 15:34:36 +0100 |
|---|---|---|
| committer | Christian <[email protected]> | 2021-03-18 15:40:57 +0100 |
| commit | e18d14dcaf17161a76fd59fc89b20eae9c17e98e (patch) | |
| tree | 96e629b235850e8f29e2d0f7d2c261493de67001 /lib | |
| parent | 81f27065297c3e29eb552911b9a5dc8755600efb (diff) | |
| download | faker-e18d14dcaf17161a76fd59fc89b20eae9c17e98e.tar.xz faker-e18d14dcaf17161a76fd59fc89b20eae9c17e98e.zip | |
perf(system): improve commonFileName, commonFileExt, fileType, directoryPath performance
fixes #822
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/index.js | 97 | ||||
| -rw-r--r-- | lib/system.js | 132 |
2 files changed, 118 insertions, 111 deletions
diff --git a/lib/index.js b/lib/index.js index cd1bede3..f76a581e 100644 --- a/lib/index.js +++ b/lib/index.js @@ -38,6 +38,54 @@ function Faker (opts) { self.definitions = {}; + var _definitions = { + "name": ["first_name", "last_name", "prefix", "suffix", "binary_gender", "gender", "title", "male_prefix", "female_prefix", "male_first_name", "female_first_name", "male_middle_name", "female_middle_name", "male_last_name", "female_last_name"], + "address": ["city_name", "city_prefix", "city_suffix", "street_suffix", "county", "country", "country_code", "country_code_alpha_3", "state", "state_abbr", "street_prefix", "postcode", "postcode_by_state", "direction", "direction_abbr", "time_zone"], + "animal": ["dog", "cat", "snake", "bear", "lion", "cetacean", "insect", "crocodilia", "cow", "bird", "fish", "rabbit", "horse", "type"], + "company": ["adjective", "noun", "descriptor", "bs_adjective", "bs_noun", "bs_verb", "suffix"], + "lorem": ["words"], + "hacker": ["abbreviation", "adjective", "noun", "verb", "ingverb", "phrase"], + "phone_number": ["formats"], + "finance": ["account_type", "transaction_type", "currency", "iban", "credit_card"], + "internet": ["avatar_uri", "domain_suffix", "free_email", "example_email", "password"], + "commerce": ["color", "department", "product_name", "price", "categories", "product_description"], + "database": ["collation", "column", "engine", "type"], + "system": ["mimeTypes", "directoryPaths"], + "date": ["month", "weekday"], + "vehicle": ["vehicle", "manufacturer", "model", "type", "fuel", "vin", "color"], + "music": ["genre"], + "title": "", + "separator": "" + }; + + // Create a Getter for all definitions.foo.bar properties + Object.keys(_definitions).forEach(function(d){ + if (typeof self.definitions[d] === "undefined") { + self.definitions[d] = {}; + } + + if (typeof _definitions[d] === "string") { + self.definitions[d] = _definitions[d]; + return; + } + + _definitions[d].forEach(function(p){ + Object.defineProperty(self.definitions[d], p, { + get: function () { + if (typeof self.locales[self.locale][d] === "undefined" || typeof self.locales[self.locale][d][p] === "undefined") { + // certain localization sets contain less data then others. + // in the case of a missing definition, use the default localeFallback to substitute the missing set data + // throw new Error('unknown property ' + d + p) + return self.locales[localeFallback][d][p]; + } else { + // return localized data + return self.locales[self.locale][d][p]; + } + } + }); + }); + }); + var Fake = require('./fake'); self.fake = new Fake(self).fake; @@ -106,55 +154,6 @@ function Faker (opts) { var Datatype = require('./datatype'); self.datatype = new Datatype(self); - - var _definitions = { - "name": ["first_name", "last_name", "prefix", "suffix", "binary_gender", "gender", "title", "male_prefix", "female_prefix", "male_first_name", "female_first_name", "male_middle_name", "female_middle_name", "male_last_name", "female_last_name"], - "address": ["city_name", "city_prefix", "city_suffix", "street_suffix", "county", "country", "country_code", "country_code_alpha_3", "state", "state_abbr", "street_prefix", "postcode", "postcode_by_state", "direction", "direction_abbr", "time_zone"], - "animal": ["dog", "cat", "snake", "bear", "lion", "cetacean", "insect", "crocodilia", "cow", "bird", "fish", "rabbit", "horse", "type"], - "company": ["adjective", "noun", "descriptor", "bs_adjective", "bs_noun", "bs_verb", "suffix"], - "lorem": ["words"], - "hacker": ["abbreviation", "adjective", "noun", "verb", "ingverb", "phrase"], - "phone_number": ["formats"], - "finance": ["account_type", "transaction_type", "currency", "iban", "credit_card"], - "internet": ["avatar_uri", "domain_suffix", "free_email", "example_email", "password"], - "commerce": ["color", "department", "product_name", "price", "categories", "product_description"], - "database": ["collation", "column", "engine", "type"], - "system": ["mimeTypes", "directoryPaths"], - "date": ["month", "weekday"], - "vehicle": ["vehicle", "manufacturer", "model", "type", "fuel", "vin", "color"], - "music": ["genre"], - "title": "", - "separator": "" - }; - - // Create a Getter for all definitions.foo.bar properties - Object.keys(_definitions).forEach(function(d){ - if (typeof self.definitions[d] === "undefined") { - self.definitions[d] = {}; - } - - if (typeof _definitions[d] === "string") { - self.definitions[d] = _definitions[d]; - return; - } - - _definitions[d].forEach(function(p){ - Object.defineProperty(self.definitions[d], p, { - get: function () { - if (typeof self.locales[self.locale][d] === "undefined" || typeof self.locales[self.locale][d][p] === "undefined") { - // certain localization sets contain less data then others. - // in the case of a missing definition, use the default localeFallback to substitute the missing set data - // throw new Error('unknown property ' + d + p) - return self.locales[localeFallback][d][p]; - } else { - // return localized data - return self.locales[self.locale][d][p]; - } - } - }); - }); - }); - }; Faker.prototype.setLocale = function (locale) { diff --git a/lib/system.js b/lib/system.js index f3428271..564d46c0 100644 --- a/lib/system.js +++ b/lib/system.js @@ -1,27 +1,72 @@ // generates fake data for many computer systems properties +var commonFileTypes = [ + "video", + "audio", + "image", + "text", + "application" +]; + +var commonMimeTypes = [ + "application/pdf", + "audio/mpeg", + "audio/wav", + "image/png", + "image/jpeg", + "image/gif", + "video/mp4", + "video/mpeg", + "text/html" +]; + +function setToArray(set) { + // shortcut if Array.from is available + if (Array.from) { return Array.from(set); } + + var array = []; + set.forEach(function (item) { + array.push(item); + }); + return array; +} + /** * * @namespace faker.system */ -function System (faker) { +function System(faker) { + var typeSet = new Set(); + var extensionSet = new Set(); + var mimeTypes = faker.definitions.system.mimeTypes; + + Object.keys(mimeTypes).forEach(function (m) { + var type = m.split("/")[0]; + + typeSet.add(type); + + if (mimeTypes[m].extensions instanceof Array) { + mimeTypes[m].extensions.forEach(function (ext) { + extensionSet.add(ext); + }); + } + }); + + var types = setToArray(typeSet); + var extensions = setToArray(extensionSet); + var mimeTypeKeys = Object.keys(faker.definitions.system.mimeTypes); + /** - * generates a file name with extension or optional type + * generates a file name * * @method faker.system.fileName - * @param {string} ext - * @param {string} type */ - this.fileName = function (ext, type) { - var str = faker.fake("{{random.words}}.{{system.fileExt}}"); - str = str.replace(/ /g, '_'); - str = str.replace(/\,/g, '_'); - str = str.replace(/\-/g, '_'); - str = str.replace(/\\/g, '_'); - str = str.replace(/\//g, '_'); - str = str.toLowerCase(); - return str; + this.fileName = function () { + var str = faker.random.words() + "." + faker.system.fileExt(); + return str + .toLowerCase() + .replace(/\W/g, "_"); }; /** @@ -29,17 +74,12 @@ function System (faker) { * * @method faker.system.commonFileName * @param {string} ext - * @param {string} type */ - this.commonFileName = function (ext, type) { + this.commonFileName = function (ext) { var str = faker.random.words() + "." + (ext || faker.system.commonFileExt()); - str = str.replace(/ /g, '_'); - str = str.replace(/\,/g, '_'); - str = str.replace(/\-/g, '_'); - str = str.replace(/\\/g, '_'); - str = str.replace(/\//g, '_'); - str = str.toLowerCase(); - return str; + return str + .toLowerCase() + .replace(/\W/g, "_"); }; /** @@ -48,7 +88,7 @@ function System (faker) { * @method faker.system.mimeType */ this.mimeType = function () { - return faker.random.arrayElement(Object.keys(faker.definitions.system.mimeTypes)); + return faker.random.arrayElement(mimeTypeKeys); }; /** @@ -57,29 +97,16 @@ function System (faker) { * @method faker.system.commonFileType */ this.commonFileType = function () { - var types = ['video', 'audio', 'image', 'text', 'application']; - return faker.random.arrayElement(types) + return faker.random.arrayElement(commonFileTypes); }; /** - * returns a commonly used file extension based on optional type + * returns a commonly used file extension * * @method faker.system.commonFileExt - * @param {string} type */ - this.commonFileExt = function (type) { - var types = [ - 'application/pdf', - 'audio/mpeg', - 'audio/wav', - 'image/png', - 'image/jpeg', - 'image/gif', - 'video/mp4', - 'video/mpeg', - 'text/html' - ]; - return faker.system.fileExt(faker.random.arrayElement(types)); + this.commonFileExt = function () { + return faker.system.fileExt(faker.random.arrayElement(commonMimeTypes)); }; @@ -89,14 +116,6 @@ function System (faker) { * @method faker.system.fileType */ this.fileType = function () { - var types = []; - var mimes = faker.definitions.system.mimeTypes; - Object.keys(mimes).forEach(function(m){ - var parts = m.split('/'); - if (types.indexOf(parts[0]) === -1) { - types.push(parts[0]); - } - }); return faker.random.arrayElement(types); }; @@ -107,23 +126,12 @@ function System (faker) { * @param {string} mimeType */ this.fileExt = function (mimeType) { - var exts = []; - var mimes = faker.definitions.system.mimeTypes; - - // get specific ext by mime-type - if (typeof mimes[mimeType] === "object") { + if (mimeType) { + var mimes = faker.definitions.system.mimeTypes; return faker.random.arrayElement(mimes[mimeType].extensions); } - // reduce mime-types to those with file-extensions - Object.keys(mimes).forEach(function(m){ - if (mimes[m].extensions instanceof Array) { - mimes[m].extensions.forEach(function(ext){ - exts.push(ext) - }); - } - }); - return faker.random.arrayElement(exts); + return faker.random.arrayElement(extensions); }; /** |
