aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorChristian <[email protected]>2021-03-18 15:34:36 +0100
committerChristian <[email protected]>2021-03-18 15:40:57 +0100
commite18d14dcaf17161a76fd59fc89b20eae9c17e98e (patch)
tree96e629b235850e8f29e2d0f7d2c261493de67001 /lib
parent81f27065297c3e29eb552911b9a5dc8755600efb (diff)
downloadfaker-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.js97
-rw-r--r--lib/system.js132
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);
};
/**