├── .eslintignore ├── .gitignore ├── .travis.yml ├── index.js ├── test ├── .eslintrc ├── test_app.js ├── test_team.js ├── test_locale_en_ca.js ├── _utils.js ├── test_name.js ├── test_code.js ├── test_hacker.js ├── test_locale_en.js ├── test_company.js ├── test_base.js ├── test_finance.js ├── test_avatar.js ├── test_locale_es.js ├── test_locale_pl.js ├── test_business.js ├── test_city.js ├── test_street.js ├── test_locale.js ├── test_bitcoin.js ├── test_commerce.js ├── test_date.js ├── test_lorem.js ├── test_number.js ├── test_locale_en_us.js └── test_internet.js ├── support ├── update_browser_data.js └── utils.js ├── examples └── base.js ├── .ndocrc ├── lib ├── charlatan │ ├── app.js │ ├── team.js │ ├── avatar.js │ ├── business.js │ ├── name.js │ ├── finance.js │ ├── phone_number.js │ ├── company.js │ ├── date.js │ ├── commerce.js │ ├── hacker.js │ ├── code.js │ ├── number.js │ ├── helpers.js │ ├── bitcoin.js │ ├── address.js │ ├── lorem.js │ └── internet.js ├── locales │ ├── de-CH.yml │ ├── en-BORK.yml │ ├── en-CA.yml │ ├── en-GB.yml │ ├── ja.yml │ ├── zh-CN.yml │ ├── en-NEP.yml │ ├── ko.yml │ ├── en-au-ocker.yml │ ├── zh-TW.yml │ ├── en-AU.yml │ ├── vi.yml │ ├── nb-NO.yml │ ├── fa.yml │ ├── sv.yml │ ├── en-US.yml │ ├── pt-BR.yml │ ├── en-IND.yml │ ├── it.yml │ └── ru.yml ├── locales_browser.js ├── locales.js └── charlatan.js ├── package.json ├── LICENSE ├── CHANGELOG.md ├── README.md ├── Makefile └── .eslintrc.yml /.eslintignore: -------------------------------------------------------------------------------- 1 | doc 2 | coverage -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | doc 3 | coverage 4 | *.log 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '4' 4 | - '6' 5 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = require('./lib/charlatan'); 4 | -------------------------------------------------------------------------------- /test/.eslintrc: -------------------------------------------------------------------------------- 1 | globals: 2 | describe: false 3 | it: false 4 | before: false 5 | beforeEach: false 6 | after: false 7 | afterEach: false 8 | -------------------------------------------------------------------------------- /support/update_browser_data.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | 4 | require('fs').writeFileSync( 5 | require('path').resolve(__dirname, '../lib/locales_browser_data.json'), 6 | JSON.stringify(require('./utils').all_locales()) 7 | ); 8 | -------------------------------------------------------------------------------- /examples/base.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* eslint-disable no-console */ 4 | 5 | var Charlatan = require('../index.js'); 6 | 7 | Charlatan.setLocale('en-us'); 8 | 9 | var user = { 10 | name: Charlatan.Name.name(), 11 | company: Charlatan.Company.name(), 12 | motto: Charlatan.Lorem.sentence() 13 | }; 14 | 15 | console.dir(user); 16 | -------------------------------------------------------------------------------- /.ndocrc: -------------------------------------------------------------------------------- 1 | # 2 | # Common nodeca config 3 | ################################################################################ 4 | 5 | --index "./README.md" 6 | --package "./package.json" 7 | --gh-ribbon "{package.homepage}" 8 | --output "doc" 9 | --render "html" 10 | --broken-links "throw" 11 | 12 | 13 | # 14 | # Paths with sources 15 | ################################################################################ 16 | 17 | lib/ 18 | -------------------------------------------------------------------------------- /test/test_app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').App; 7 | 8 | describe('App', function () { 9 | it('author', function () { 10 | assert(tester.author().match(/(\w+\.? ?){2,3}/)); 11 | }); 12 | 13 | it('version', function () { 14 | assert(tester.version().match(/\d/)); 15 | }); 16 | 17 | it('name', function () { 18 | assert(tester.name().match(/\w/)); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /test/test_team.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Team; 7 | 8 | describe('Team', function () { 9 | it('name', function () { 10 | assert(tester.name().match(/(\w+\.? ?){2}/)); 11 | }); 12 | 13 | it('creature', function () { 14 | assert(tester.creature().match(/\w+/)); 15 | }); 16 | 17 | it('state', function () { 18 | assert(tester.state().match(/\w+/)); 19 | }); 20 | }); 21 | -------------------------------------------------------------------------------- /test/test_locale_en_ca.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('locale: en-CA', function () { 9 | before(function () { 10 | faker.setLocale('en-CA'); 11 | }); 12 | 13 | it('ca_postcode', function () { 14 | var expected = /[A-VX-Y][0-9][A-CEJ-NPR-TV-Z] ?[0-9][A-CEJ-NPR-TV-Z][0-9]/; 15 | 16 | assert(expected.test(faker.Address.postcode())); 17 | }); 18 | 19 | after(function () { 20 | faker.setLocale(null); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/_utils.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict'; 3 | 4 | // 5 | // Print out `Math.random()` seed for tests. 6 | // 7 | // All our tests are random-based, so with this seed, if CI run fails we can 8 | // reproduce results more easily. 9 | // 10 | 11 | var seed = process.env.MT_SEED || Math.floor(Math.random() * Math.pow(2, 32)); 12 | 13 | /* eslint-disable no-console */ 14 | console.log('Using seed:', seed); 15 | 16 | var MersenneTwister = require('mersenne-twister'); 17 | var generator = new MersenneTwister(seed); 18 | 19 | Math.random = function () { 20 | return generator.random(); 21 | }; 22 | 23 | -------------------------------------------------------------------------------- /test/test_name.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Name; 7 | 8 | describe('Name', function () { 9 | it('name', function () { 10 | assert(tester.name().match(/(\w+\.? ?){2,3}/)); 11 | }); 12 | 13 | it('prefix', function () { 14 | assert(tester.prefix().match(/[A-Z][a-z]+\.?/)); 15 | }); 16 | 17 | it('suffix', function () { 18 | assert(tester.suffix().match(/[A-Z][a-z]*\.?/)); 19 | }); 20 | 21 | it('title', function () { 22 | assert(tester.title().match(/ /)); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /support/utils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | 4 | var yaml = require('js-yaml'); 5 | var fs = require('fs'); 6 | var path = require('path'); 7 | 8 | 9 | exports.all_locales = function () { 10 | var locales = {}; 11 | var locales_dir = path.resolve(__dirname, '../lib/locales'); 12 | 13 | fs.readdirSync(locales_dir).forEach(function (file) { 14 | if (/\.yml/.test(file)) { 15 | var data = yaml.safeLoad(fs.readFileSync(path.join(locales_dir, file), 'utf8')); 16 | 17 | Object.keys(data).forEach(function (k) { 18 | locales[k] = data[k]; 19 | }); 20 | } 21 | }); 22 | 23 | return locales; 24 | }; 25 | -------------------------------------------------------------------------------- /test/test_code.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Code; 7 | 8 | describe('Code', function () { 9 | it('default_isbn_regexp', function () { 10 | assert(tester.isbn().match(/^\d{9}-[\d|X]$/)); 11 | }); 12 | 13 | it('default_isbn13_regexp', function () { 14 | assert(tester.isbn(13).match(/^\d{12}-\d$/)); 15 | }); 16 | 17 | it('default_ean_regexp', function () { 18 | assert(tester.ean().match(/^\d{13}$/)); 19 | }); 20 | 21 | it('default_ean8_regexp', function () { 22 | assert(tester.ean(8).match(/^\d{8}$/)); 23 | }); 24 | 25 | it('rut', function () { 26 | assert(tester.rut().match(/^\d{1,8}-(\d|k)$/)); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /lib/charlatan/app.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.App 5 | **/ 6 | 7 | var Charlatan = require('../charlatan'); 8 | 9 | 10 | /** 11 | * Charlatan.App.name() -> String 12 | * 13 | * Generate an application name 14 | **/ 15 | exports.name = function () { 16 | return Charlatan.fetch('app.name'); 17 | }; 18 | 19 | 20 | /** 21 | * Charlatan.App.version() -> String 22 | * 23 | * Generate an application version 24 | **/ 25 | exports.version = function () { 26 | return Charlatan.numerify(Charlatan.parse('app.version')); 27 | }; 28 | 29 | 30 | /** 31 | * Charlatan.App.author() -> String 32 | * 33 | * Generate an application author 34 | **/ 35 | exports.author = function () { 36 | return Charlatan.fetch('app.author'); 37 | }; 38 | -------------------------------------------------------------------------------- /lib/charlatan/team.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Team 5 | **/ 6 | 7 | var Charlatan = require('../charlatan'); 8 | var Helpers = require('./helpers'); 9 | 10 | 11 | /** 12 | * Charlatan.Team.name() -> String 13 | * 14 | * Generate team name. 15 | **/ 16 | exports.name = function () { 17 | return Charlatan.fetch('team.name'); 18 | }; 19 | 20 | 21 | /** 22 | * Charlatan.Team.creature() -> String 23 | * 24 | * Generate team mascot. 25 | **/ 26 | exports.creature = function () { 27 | return Charlatan.fetch('team.creature'); 28 | }; 29 | 30 | 31 | /** 32 | * Charlatan.Team.state() -> String 33 | * 34 | * Generate team state. 35 | **/ 36 | exports.state = function () { 37 | return Helpers.titleize(Charlatan.fetch('faker.address.state')); 38 | }; 39 | -------------------------------------------------------------------------------- /test/test_hacker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Hacker; 7 | 8 | describe('Hacker', function () { 9 | it('noun', function () { 10 | assert(tester.noun().match(/\w+/)); 11 | }); 12 | 13 | it('abbreviation', function () { 14 | assert(tester.abbreviation().match(/\w+/)); 15 | }); 16 | 17 | it('adjective', function () { 18 | assert(tester.adjective().match(/\w+/)); 19 | }); 20 | 21 | it('verb', function () { 22 | assert(tester.verb().match(/\w+/)); 23 | }); 24 | 25 | it('ingverb', function () { 26 | assert(tester.ingverb().match(/\w+/)); 27 | }); 28 | 29 | it('saySomethingSmart', function () { 30 | assert(tester.saySomethingSmart().match(/\w+/)); 31 | }); 32 | }); 33 | -------------------------------------------------------------------------------- /lib/locales/de-CH.yml: -------------------------------------------------------------------------------- 1 | de-CH: 2 | faker: 3 | address: 4 | country_code: [CH, CH, CH, DE, AT, US, LI, US, HK, VN] 5 | postcode: ['1###', '2###', '3###', '4###', '5###', '6###', '7###', '8###', '9###'] 6 | default_country: [Schweiz] 7 | 8 | company: 9 | suffix: [AG, GmbH, und Söhne, und Partner, "& Co.", Gruppe, LLC, Inc.] 10 | name: 11 | - "#{Name.last_name} #{suffix}" 12 | - "#{Name.last_name}-#{Name.last_name}" 13 | - "#{Name.last_name}, #{Name.last_name} und #{Name.last_name}" 14 | 15 | internet: 16 | domain_suffix: [com, net, biz, ch, de, li, at, ch, ch] 17 | 18 | phone_number: 19 | formats: ['0800 ### ###', '0800 ## ## ##', '0## ### ## ##', '0## ### ## ##', '+41 ## ### ## ##', '0900 ### ###', '076 ### ## ##', '+4178 ### ## ##', '0041 79 ### ## ##'] 20 | -------------------------------------------------------------------------------- /test/test_locale_en.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var YAML = require('js-yaml'); 9 | var faker = require('../'); 10 | 11 | describe('locale: en', function () { 12 | it('us_states_only_include_states', function () { 13 | var data = YAML.safeLoad(fs.readFileSync(path.join(__dirname, '/../lib/locales/en.yml'), 'utf8')); 14 | 15 | assert.equal(data.en.faker.address.state.length, 50); 16 | assert.equal(data.en.faker.address.state_abbr.length, 50); 17 | }); 18 | 19 | it('us_zip_codes', function () { 20 | faker.setLocale('en-US'); 21 | 22 | var expected = /\d{5}(\-\d{4})?/; 23 | 24 | assert(expected.test(faker.Address.zipCode())); 25 | 26 | faker.setLocale(null); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /lib/locales/en-BORK.yml: -------------------------------------------------------------------------------- 1 | en-BORK: 2 | faker: 3 | lorem: 4 | words: [Boot, I, Nu, Nur, Tu, Um, a, becoose-a, boot, bork, burn, chuuses, cumplete-a, cun, cunseqooences, curcoomstunces, dee, deeslikes, denuoonceeng, desures, du, eccuoont, ectooel, edfuntege-a, efueeds, egeeen, ell, ere-a, feend, foolt, frum, geefe-a, gesh, greet, heem, heppeeness, hes, hoo, hoomun, idea, ifer, in, incuoonter, injuy, itselff, ixcept, ixemple-a, ixerceese-a, ixpleeen, ixplurer, ixpuoond, ixtremely, knoo, lebureeuoos, lufes, meestekee, mester-booeelder, moost, mun, nu, nut, oobteeen, oocceseeunelly, ooccoor, ooff, oone-a, oor, peeen, peeenffool, physeecel, pleesoore-a, poorsooe-a, poorsooes, preeesing, prucoore-a, prudooces, reeght, reshunelly, resooltunt, sume-a, teecheengs, teke-a, thees, thet, thuse-a, treefiel, troot, tu, tueel, und, undertekes, unnuyeeng, uny, unyune-a, us, veell, veet, ves, vheech, vhu, yuoo, zee, zeere-a] 5 | -------------------------------------------------------------------------------- /test/test_company.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Company; 7 | 8 | describe('Company', function () { 9 | it('name', function () { 10 | assert(tester.name().match(/\w/)); 11 | }); 12 | 13 | it('suffix', function () { 14 | assert(tester.suffix().match(/\w/)); 15 | }); 16 | 17 | it('catch_phrase', function () { 18 | assert(tester.catchPhrase().match(/\w \w/)); 19 | }); 20 | 21 | it('bs', function () { 22 | assert(tester.bs().match(/\w \w/)); 23 | }); 24 | 25 | it('ein', function () { 26 | assert(tester.ein().match(/\d\d-\d\d\d\d\d\d\d/)); 27 | }); 28 | 29 | it('duns_number', function () { 30 | assert(tester.dunsNumber().match(/\d\d-\d\d\d-\d\d\d\d/)); 31 | }); 32 | 33 | it('logo', function () { 34 | assert(tester.logo().match(/http:\/\/pigment.github.io\/fake-logos\/logos\/medium\/color\/\d+\.png/)); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /lib/locales/en-CA.yml: -------------------------------------------------------------------------------- 1 | en-CA: 2 | faker: 3 | address: 4 | postcode: /[A-VX-Y][0-9][A-CEJ-NPR-TV-Z] ?[0-9][A-CEJ-NPR-TV-Z][0-9]/ 5 | state: [Alberta, British Columbia, Manitoba, New Brunswick, Newfoundland and Labrador, Nova Scotia, Northwest Territories, Nunavut, Ontario, Prince Edward Island, Quebec, Saskatchewan, Yukon] 6 | state_abbr: ["AB", "BC", "MB", "NB", "NL", "NS", "NU", "NT", "ON", "PE", "QC", "SK", "YK"] 7 | default_country: [Canada] 8 | 9 | internet: 10 | free_email: [gmail.com, yahoo.ca, hotmail.com] 11 | domain_suffix: [ca, com, biz, info, name, net, org] 12 | 13 | phone_number: 14 | formats: ['###-###-####', '(###)###-####', '###.###.####', '1-###-###-####', '###-###-#### x###', '(###)###-#### x###', '1-###-###-#### x###', '###.###.#### x###', '###-###-#### x####', '(###)###-#### x####', '1-###-###-#### x####', '###.###.#### x####', '###-###-#### x#####', '(###)###-#### x#####', '1-###-###-#### x#####', '###.###.#### x#####'] 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "charlatan", 3 | "description": "Fake identities generator for node.js (names, addresses, phones, IPs and others). Supports multiple languages.", 4 | "version": "1.1.0", 5 | "keywords": [ 6 | "charlatan", 7 | "faker", 8 | "fake", 9 | "dummy", 10 | "identity", 11 | "test" 12 | ], 13 | "author": "Eugene Shkuropat ", 14 | "homepage": "https://github.com/nodeca/charlatan", 15 | "repository": "nodeca/charlatan", 16 | "license": "MIT", 17 | "browser": { 18 | "./lib/locales.js": "./lib/locales_browser.js", 19 | "./lib/charlatan/bitcoin.js": false 20 | }, 21 | "files": [ 22 | "index.js", 23 | "lib/" 24 | ], 25 | "dependencies": { 26 | "js-yaml": "^3.2.7" 27 | }, 28 | "devDependencies": { 29 | "eslint": "3.5.0", 30 | "istanbul": "^0.4.5", 31 | "mersenne-twister": "1", 32 | "mocha": "^3.0.2", 33 | "ndoc": "^5.0.0" 34 | }, 35 | "scripts": { 36 | "test": "make test" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /test/test_base.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('Base', function () { 9 | it('numerify', function () { 10 | for (var i = 0; i < 100; i++) { 11 | assert(faker.numerify('###').match(/[1-9]\d{2}/)); 12 | } 13 | }); 14 | 15 | it('letterify', function () { 16 | assert(faker.letterify('???').match(/[A-Z]{3}/)); 17 | }); 18 | 19 | it('regexify', function () { 20 | /* eslint-disable max-len */ 21 | var dict = { 22 | 'uk post code': /^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/, 23 | 'us phone': /^(1-?)[2-8][0-1][0-9]-\d{3}-\d{4}$/ 24 | }; 25 | 26 | Object.keys(dict).forEach(function (label) { 27 | var result; 28 | 29 | for (var i = 0; i < 10; i++) { 30 | result = faker.regexify(dict[label]); 31 | assert(dict[label].test(result), result + 'is not a match for ' + label); 32 | } 33 | }); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /lib/charlatan/avatar.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Avatar 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | 10 | var SUPPORTED_FORMATS = [ 'png', 'jpg', 'bmp' ]; 11 | 12 | /** 13 | * Charlatan.Avatar.image(slug=null, size='300x300', format='png') -> String 14 | * - slug(String): slug:) 15 | * - size(String): avatar size 16 | * - format(String): image format ('png', 'jpg' or 'bmp') 17 | * 18 | * Generate link to robohash avatar 19 | **/ 20 | exports.image = function (slug, size, format) { 21 | if (!slug) { 22 | slug = Charlatan.Lorem.words().join(''); 23 | } 24 | if (!size) { 25 | size = '300x300'; 26 | } 27 | if (!format) { 28 | format = 'png'; 29 | } 30 | 31 | if (!size.match(/^[0-9]+x[0-9]+$/)) { 32 | throw new Error('Size should be specified in format 300x300'); 33 | } 34 | if (SUPPORTED_FORMATS.indexOf(format) === -1) { 35 | throw new Error('Supported formats are ' + SUPPORTED_FORMATS.join(', ')); 36 | } 37 | 38 | return 'http://robohash.org/' + slug + '.' + format + '?size=' + size; 39 | }; 40 | -------------------------------------------------------------------------------- /lib/charlatan/business.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Business 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | 10 | 11 | /** 12 | * Charlatan.Business.creditCardNumber() -> String 13 | * 14 | * Generate placeholder credit card number (out of range of the real 15 | * credit card numbers). 16 | * 17 | * If you want to generate real-looking credit card numbers, 18 | * use [[Charlatan.Finance.creditCard]] method. 19 | **/ 20 | exports.creditCardNumber = function () { 21 | return Charlatan.fetch('business.credit_card_numbers'); 22 | }; 23 | 24 | 25 | /** 26 | * Charlatan.Business.creditCardExpiryDate() -> Date 27 | * 28 | * Generate credit card expire date 29 | **/ 30 | exports.creditCardExpiryDate = function () { 31 | return new Date(Charlatan.fetch('business.credit_card_expiry_dates')); 32 | }; 33 | 34 | 35 | /** 36 | * Charlatan.Business.creditCardType() -> Date 37 | * 38 | * Generate credit card type (visa, mastercard, etc.) 39 | **/ 40 | exports.creditCardType = function () { 41 | return Charlatan.fetch('business.credit_card_types'); 42 | }; 43 | -------------------------------------------------------------------------------- /test/test_finance.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('finance', function () { 9 | var valid_ones = [ 10 | '3019-872113-1171', 11 | '3051-346334-7720', 12 | '5019-8865-5667-8258', 13 | '506520872154623929', 14 | '5213-8618-8032-6704', 15 | '5420-2970-4793-7043', 16 | '6011-6282-1135-7355-7809', 17 | '6461-6239-1512-8072-8338', 18 | '6709999639407938958', 19 | '6767-2952-1470-2154-617' 20 | ]; 21 | 22 | before(function () { 23 | var obj = {}; 24 | 25 | valid_ones.forEach(function (x) { 26 | obj[x] = x.replace(/\d$/, 'L'); 27 | }); 28 | 29 | faker.addLocale('credit_cards', { 30 | credit_card: obj 31 | }); 32 | 33 | faker.setLocale('credit_cards'); 34 | }); 35 | 36 | it('credit_card should compute last digit', function () { 37 | valid_ones.forEach(function (x) { 38 | assert.equal(faker.Finance.creditCard(x), x); 39 | }); 40 | }); 41 | 42 | after(function () { 43 | faker.setLocale('en'); 44 | }); 45 | }); 46 | -------------------------------------------------------------------------------- /lib/locales_browser.js: -------------------------------------------------------------------------------- 1 | // Browser implementation of { locales, addLocale } 2 | // 3 | 'use strict'; 4 | 5 | var locales = require('./locales_browser_data.json'); 6 | 7 | function addLocale(name, data) { 8 | // if data not set, then check available 9 | if (typeof data === 'undefined') { 10 | if (Object.keys(locales).indexOf(name) === -1) { 11 | throw new Error('Locale not found:' + name); 12 | } 13 | 14 | // Do nothing because all locales already loaded 15 | return true; 16 | } 17 | 18 | // data in file 19 | if (typeof data === 'string') { 20 | throw new Error('Charlatan: loading from file not supported in browser'); 21 | } 22 | 23 | locales[name] = data; 24 | 25 | // compatibility layer for ruby Faker: we DON'T use intermediate 26 | // level `faker`, but wish to have universal localizations. 27 | // So, if `faker` section exists then its children moved 1 level up. 28 | if (data.faker) { 29 | Object.keys(data.faker).forEach(function (k) { 30 | locales[name][k] = data.faker[k]; 31 | }); 32 | } 33 | 34 | return true; 35 | } 36 | 37 | exports.locales = locales; 38 | exports.addLocale = addLocale; 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | (The MIT License) 2 | 3 | Copyright (c) 2012-2015 Eugene Shkuropat 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /test/test_avatar.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Avatar; 7 | 8 | describe('Avatar', function () { 9 | it('avatar', function () { 10 | assert(tester.image().match(/http:\/\/robohash\.org\/(.+)\.png/)[1]); 11 | }); 12 | 13 | it('avatar_with_param', function () { 14 | assert(tester.image('faker').match(/http:\/\/robohash\.org\/(.+)\.png/)[1]); 15 | }); 16 | 17 | it('avatar_with_correct_size', function () { 18 | assert.equal(tester.image('faker', '150x320').match(/http:\/\/robohash\.org\/faker\.png\?size=(.+)/)[1], '150x320'); 19 | }); 20 | 21 | it('avatar_with_incorrect_size', function () { 22 | assert.throws(function () { 23 | tester.image(null, '150x320z'); 24 | }, /Size should be specified in format/); 25 | }); 26 | 27 | it('avatar_with_supported_format', function () { 28 | assert(tester.image('faker', '300x300', 'jpg').match(/http:\/\/robohash\.org\/faker\.jpg/)); 29 | }); 30 | 31 | it('avatar_with_incorrect_format', function () { 32 | assert.throws(function () { 33 | tester.image(null, '300x300', 'wrong_format'); 34 | }, /Supported formats are/); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /test/test_locale_es.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var YAML = require('js-yaml'); 9 | var faker = require('../'); 10 | var locales = {}; 11 | 12 | [ 'en', 'es' ].forEach(function (x) { 13 | var data = YAML.safeLoad(fs.readFileSync(path.join(__dirname, '/../lib/locales/', x + '.yml'), 'utf8')); 14 | 15 | locales[x] = data[x].faker; 16 | }); 17 | 18 | describe('locale: es', function () { 19 | beforeEach(function () { 20 | faker.setLocale('es'); 21 | }); 22 | 23 | it('configured_locale_translation', function () { 24 | assert.equal(faker.translate('faker.address.city_prefix')[0], locales.es.address.city_prefix[0]); 25 | }); 26 | 27 | it('locale_override_when_calling_translate', function () { 28 | assert.equal(faker.translate('faker.lorem.words', { locale: 'en' })[0], locales.en.lorem.words[0]); 29 | }); 30 | 31 | it('translation_fallback', function () { 32 | assert.equal(locales.es.company.bs, null); 33 | assert.deepEqual(faker.translate('faker.company.bs'), locales.en.company.bs); 34 | }); 35 | 36 | after(function () { 37 | faker.setLocale(null); 38 | }); 39 | }); 40 | -------------------------------------------------------------------------------- /test/test_locale_pl.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('locale: pl', function () { 9 | var phone_prefixes = ('12 13 14 15 16 17 18 22 23 24 25 29 32 33 34 41 42' + 10 | ' 43 44 46 48 52 54 55 56 58 59 61 62 63 65 67 68 71 74 75 76 77 81 82' + 11 | ' 83 84 85 86 87 89 91 94 95').split(' ').sort(); 12 | 13 | var cell_prefixes = '50 51 53 57 60 66 69 72 73 78 79 88'.split(' ').sort(); 14 | 15 | before(function () { 16 | faker.setLocale('pl'); 17 | }); 18 | 19 | it('pl_phone_number', function () { 20 | var prefixes = {}; 21 | 22 | for (var i = 0; i < 1000; i++) { 23 | prefixes[faker.PhoneNumber.phoneNumber().slice(0, 2)] = 1; 24 | } 25 | 26 | assert.deepEqual(phone_prefixes, Object.keys(prefixes).sort()); 27 | }); 28 | 29 | it('pl_cell_phone', function () { 30 | var prefixes = {}; 31 | 32 | for (var i = 0; i < 1000; i++) { 33 | prefixes[faker.PhoneNumber.cellPhone().slice(0, 2)] = 1; 34 | } 35 | 36 | assert.deepEqual(cell_prefixes, Object.keys(prefixes).sort()); 37 | }); 38 | 39 | after(function () { 40 | faker.setLocale(null); 41 | }); 42 | }); 43 | -------------------------------------------------------------------------------- /test/test_business.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var Charlatan = require('../'); 7 | var tester = require('../').Business; 8 | 9 | describe('Business', function () { 10 | var credit_card_number_list = Charlatan.translate('business.credit_card_numbers'); 11 | var credit_card_number_expiry_dates = Charlatan.translate('business.credit_card_expiry_dates'); 12 | var credit_card_types = Charlatan.translate('business.credit_card_types'); 13 | 14 | it('credit_card_number', function () { 15 | var number1 = tester.creditCardNumber(); 16 | var number2 = tester.creditCardNumber(); 17 | 18 | assert(credit_card_number_list.indexOf(number1) !== -1); 19 | assert(credit_card_number_list.indexOf(number2) !== -1); 20 | }); 21 | 22 | it('credit_card_expiry_date', function () { 23 | var date1 = Date.parse(tester.creditCardExpiryDate()); 24 | var date2 = Date.parse(tester.creditCardExpiryDate()); 25 | 26 | assert(credit_card_number_expiry_dates.map(Date.parse).indexOf(date1) !== -1); 27 | assert(credit_card_number_expiry_dates.map(Date.parse).indexOf(date2) !== -1); 28 | }); 29 | 30 | it('credit_card_type', function () { 31 | var type1 = tester.creditCardType(); 32 | var type2 = tester.creditCardType(); 33 | 34 | assert(credit_card_types.indexOf(type1) !== -1); 35 | assert(credit_card_types.indexOf(type2) !== -1); 36 | }); 37 | }); 38 | -------------------------------------------------------------------------------- /test/test_city.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('city', function () { 9 | before(function () { 10 | faker.addLocale('xx', { 11 | name: { 12 | first_name: [ 'alice' ], 13 | last_name: [ 'smith' ] 14 | }, 15 | address: { 16 | city_prefix: [ 'west' ], 17 | city_suffix: [ 'burg' ] 18 | } 19 | }); 20 | 21 | faker.addLocale('xy', { 22 | address: { 23 | city_prefix: [ 'big' ], 24 | city_root: [ 'rock' ], 25 | city_root_suffix: [ 'ing' ], 26 | city_suffix: [ 'town' ], 27 | city: [ '#{city_prefix} #{city_root}#{city_root_suffix} #{city_suffix}' ] 28 | } 29 | }); 30 | }); 31 | 32 | it('default_city_formats', function () { 33 | faker.setLocale('xx'); 34 | 35 | for (var i = 0; i < 1000; i++) { 36 | var cities = [ 'west alice', 'west smith', 'west aliceburg', 'west smithburg', 'aliceburg', 'smithburg' ]; 37 | var city = faker.Address.city(); 38 | 39 | assert(cities.indexOf(city) !== -1); 40 | } 41 | }); 42 | 43 | it('city_formats_are_flexible', function () { 44 | faker.setLocale('xy'); 45 | 46 | var cities = [ 'big rocking town' ]; 47 | var city = faker.Address.city(); 48 | 49 | assert(cities.indexOf(city) !== -1); 50 | }); 51 | 52 | after(function () { 53 | faker.setLocale(null); 54 | }); 55 | }); 56 | -------------------------------------------------------------------------------- /lib/charlatan/name.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Name 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | 10 | /** 11 | * Charlatan.Name.name() -> String 12 | * 13 | * Generate full name. 14 | **/ 15 | exports.name = function () { 16 | return Charlatan.parse('name.name'); 17 | }; 18 | 19 | 20 | /** 21 | * Charlatan.Name.firstName() -> String 22 | * 23 | * Generate first name. Example: 'Marjorie' 24 | **/ 25 | exports.firstName = function () { 26 | return Charlatan.fetch('name.first_name'); 27 | }; 28 | 29 | 30 | /** 31 | * Charlatan.Name.lastName() -> String 32 | * 33 | * Generate last name. Example: 'Lemke' 34 | **/ 35 | exports.lastName = function () { 36 | return Charlatan.fetch('name.last_name'); 37 | }; 38 | 39 | 40 | /** 41 | * Charlatan.Name.prefix() -> String 42 | * 43 | * Generate name prefix. Example: 'Dr.' 44 | **/ 45 | exports.prefix = function () { 46 | return Charlatan.fetch('name.prefix'); 47 | }; 48 | 49 | 50 | /** 51 | * Charlatan.Name.suffix() -> String 52 | * 53 | * Generate name suffix. Example: 'PhD' 54 | **/ 55 | exports.suffix = function () { 56 | return Charlatan.fetch('name.suffix'); 57 | }; 58 | 59 | 60 | /** 61 | * Charlatan.Name.title() -> String 62 | * 63 | * Generate a buzzword-laden job title 64 | * Wordlist from http://www.bullshitjob.com/title/ 65 | **/ 66 | exports.title = function () { 67 | return Charlatan.fetch('name.title.descriptor') + ' ' + 68 | Charlatan.fetch('name.title.level') + ' ' + 69 | Charlatan.fetch('name.title.job'); 70 | }; 71 | -------------------------------------------------------------------------------- /lib/locales/en-GB.yml: -------------------------------------------------------------------------------- 1 | en-GB: 2 | faker: 3 | address: 4 | postcode: /[A-PR-UWYZ][A-HK-Y]?[0-9][ABEHMNPRVWXY0-9]? [0-9][ABD-HJLN-UW-Z]{2}/ 5 | county: [Avon, Bedfordshire, Berkshire, Borders, Buckinghamshire, Cambridgeshire, Central, Cheshire, Cleveland, Clwyd, Cornwall, County Antrim, County Armagh, County Down, County Fermanagh, County Londonderry, County Tyrone, Cumbria, Derbyshire, Devon, Dorset, Dumfries and Galloway, Durham, Dyfed, East Sussex, Essex, Fife, Gloucestershire, Grampian, Greater Manchester, Gwent, Gwynedd County, Hampshire, Herefordshire, Hertfordshire, Highlands and Islands, Humberside, Isle of Wight, Kent, Lancashire, Leicestershire, Lincolnshire, Lothian, Merseyside, Mid Glamorgan, Norfolk, North Yorkshire, Northamptonshire, Northumberland, Nottinghamshire, Oxfordshire, Powys, Rutland, Shropshire, Somerset, South Glamorgan, South Yorkshire, Staffordshire, Strathclyde, Suffolk, Surrey, Tayside, Tyne and Wear, Warwickshire, West Glamorgan, West Midlands, West Sussex, West Yorkshire, Wiltshire, Worcestershire] 6 | uk_country: [England, Scotland, Wales, Northern Ireland] 7 | default_country: [England, Scotland, Wales, Northern Ireland] 8 | internet: 9 | domain_suffix: [co.uk, com, biz, info, name] 10 | phone_number: 11 | formats: ['01#### #####', '01### ######', '01#1 ### ####', '011# ### ####', '02# #### ####', '03## ### ####', '055 #### ####', '056 #### ####', '0800 ### ####', '08## ### ####', '09## ### ####', '016977 ####', '01### #####', '0500 ######', '0800 ######'] 12 | cell_phone: 13 | formats: ['074## ######', '075## ######', '076## ######', '077## ######', '078## ######', '079## ######'] 14 | -------------------------------------------------------------------------------- /test/test_street.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('street', function () { 9 | before(function () { 10 | faker.addLocale('shire', { 11 | address: { 12 | street_name: [ '#{street_prefix} #{street_root} #{street_suffix}' ], 13 | street_prefix: [ 'Wide' ], 14 | street_root: [ 'Cheerful' ], 15 | street_suffix: [ 'Path' ], 16 | secondary_address: [ '(Green Door)' ], 17 | street_address: [ '#{street_name} #{building_number}' ], 18 | building_number: [ '#' ], 19 | time_zone: [ 'Pacific/Pago_Pago' ] 20 | } 21 | }); 22 | }); 23 | 24 | beforeEach(function () { 25 | faker.setLocale('shire'); 26 | }); 27 | 28 | it('street_name_supports_flexible_formats', function () { 29 | assert.equal('Wide Cheerful Path', faker.Address.streetName()); 30 | }); 31 | 32 | it('street_address_supports_flexible_formats', function () { 33 | assert(/Wide Cheerful Path \d/.exec(faker.Address.streetAddress())); 34 | }); 35 | 36 | it('street_address_optionally_provides_secondary_address', function () { 37 | assert(/Wide Cheerful Path \d \(Green Door\)/.exec(faker.Address.streetAddress(true))); 38 | }); 39 | 40 | it('street_address_with_locale_fallback', function () { 41 | faker.setLocale('en-GB'); 42 | assert(/^\d+ [\w']+ \w+/.exec(faker.Address.streetAddress())); 43 | }); 44 | 45 | it('timezone_support', function () { 46 | assert.equal('Pacific/Pago_Pago', faker.Address.timeZone()); 47 | }); 48 | 49 | after(function () { 50 | faker.setLocale(null); 51 | }); 52 | }); 53 | -------------------------------------------------------------------------------- /lib/charlatan/finance.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Finance 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | var Helpers = require('./helpers'); 10 | 11 | 12 | var CREDIT_CARD_TYPES = [ 'visa', 'mastercard', 'discover', 'american_express', 13 | 'diners_club', 'jcb', 'switch', 'solo', 'dankort', 'maestro', 14 | 'forbrugsforeningen', 'laser' ]; 15 | 16 | 17 | /** 18 | * Charlatan.Finance.creditCard([types]) -> String 19 | * - types(Array): generate card for one of these vendors ('visa', 'mastercard', etc.) 20 | * 21 | * Generate a card number with prefix belonging to one of the existing 22 | * payment processors. 23 | **/ 24 | exports.creditCard = function (types) { 25 | if (!types) { 26 | types = CREDIT_CARD_TYPES; 27 | } 28 | 29 | if (!Array.isArray(types)) { 30 | types = [ types ]; 31 | } 32 | 33 | var type = Helpers.sample(types); 34 | var template = Charlatan.numerify(Charlatan.fetch('credit_card.' + type)); 35 | 36 | // calculate the luhn checksum digit 37 | var multiplier = 1; 38 | var luhn_sum = template 39 | .replace(/[^0-9]/g, '') 40 | .split('') 41 | .reduceRight(function (sum, digit) { 42 | multiplier = (multiplier === 2 ? 1 : 2); 43 | return sum + Number( 44 | String(digit * multiplier).split('').reduce( 45 | function (a, b) { return Number(a) + Number(b); } 46 | ) 47 | ); 48 | }, 0); 49 | 50 | // the sum plus whatever the last digit is must be a multiple of 10. So, the 51 | // last digit must be 10 - the last digit of the sum. 52 | var luhn_digit = (10 - (luhn_sum % 10)) % 10; 53 | 54 | return template.replace(/L/g, luhn_digit); 55 | }; 56 | -------------------------------------------------------------------------------- /lib/locales/ja.yml: -------------------------------------------------------------------------------- 1 | ja: 2 | faker: 3 | address: 4 | postcode: ["###-####"] 5 | state: ["北海道", "青森県", "岩手県", "宮城県", "秋田県", "山形県", "福島県", "茨城県", "栃木県", "群馬県", "埼玉県", "千葉県", "東京都", "神奈川県", "新潟県", "富山県", "石川県", "福井県", "山梨県", "長野県", "岐阜県", "静岡県", "愛知県", "三重県", "滋賀県", "京都府", "大阪府", "兵庫県", "奈良県", "和歌山県", "鳥取県", "島根県", "岡山県", "広島県", "山口県", "徳島県", "香川県", "愛媛県", "高知県", "福岡県", "佐賀県", "長崎県", "熊本県", "大分県", "宮崎県", "鹿児島県", "沖縄県"] 6 | state_abbr: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", "47"] 7 | city_prefix: ["北", "東", "西", "南", "新", "湖", "港"] 8 | city_suffix: ["市", "区", "町", "村"] 9 | city: 10 | - "#{city_prefix}#{Name.first_name}#{city_suffix}" 11 | - "#{Name.first_name}#{city_suffix}" 12 | - "#{city_prefix}#{Name.last_name}#{city_suffix}" 13 | - "#{Name.last_name}#{city_suffix}" 14 | street_name: 15 | - "#{Name.first_name}#{street_suffix}" 16 | - "#{Name.last_name}#{street_suffix}" 17 | phone_number: 18 | formats: ['0####-#-####', '0###-##-####', '0##-###-####', '0#-####-####'] 19 | cell_phone: 20 | formats: ['090-####-####', '080-####-####', '070-####-####'] 21 | name: 22 | last_name: ["佐藤", "鈴木", "高橋", "田中", "渡辺", "伊藤", "山本", "中村", "小林", "加藤", "吉田", "山田", "佐々木", "山口", "斎藤", "松本", "井上", "木村", "林", "清水"] 23 | first_name: ["大翔", "蓮", "颯太", "樹", "大和", "陽翔", "陸斗", "太一", "海翔", "蒼空", "翼", "陽菜", "結愛", "結衣", "杏", "莉子", "美羽", "結菜", "心愛", "愛菜", "美咲"] 24 | name: 25 | - "#{last_name} #{first_name}" 26 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 1.1.0 / 2016-09-17 2 | ------------------ 3 | 4 | - Support browserify. 5 | - Deps bump & CS cleanup. 6 | 7 | 8 | 1.0.0 / 2015-04-15 9 | ------------------ 10 | 11 | - Major rewrite: sync with upstream, Faker 1.4.3. 12 | - Tests. 13 | 14 | 15 | 0.1.9 / 2014-01-08 16 | ------------------ 17 | 18 | - Maintenance release (js-yaml dependency update). 19 | 20 | 21 | 0.1.8 / 2013-11-01 22 | ------------------ 23 | 24 | - Fixed letterify() function (added missing Y in alphabet array), by @kutrumbo. 25 | 26 | 27 | 0.1.7 / 2013-10-17 28 | ------------------ 29 | 30 | - Added street_suffix suitable for UK, by @mightymephisto 31 | 32 | 33 | 0.1.6 / 2013-10-01 34 | ------------------ 35 | 36 | - Improved en-gb postcode format, by @mightymephisto 37 | 38 | 39 | 0.1.5 / 2013-08-07 40 | ------------------ 41 | 42 | - Fixed locales fallback 43 | - Updated jshint options 44 | 45 | 46 | 0.1.4 / 2013-02-26 47 | ------------------ 48 | 49 | - Fixed internet.userName & related things (@guzart, @shkuropat) 50 | 51 | 52 | 0.1.3 / 2013-02-20 53 | ------------------ 54 | 55 | - Added spanish locale, by @elcapo 56 | 57 | 58 | 0.1.2 / 2013-02-15 59 | ------------------ 60 | 61 | - Repository moved to new location (nodeca), updated links in doc 62 | - Added more languages from original Faker, migrated to original format 63 | - Updated to new fast yaml parser & removed json cache 64 | - fixed linting for new requirements 65 | 66 | 67 | 0.1.1 / 2010-09-11 68 | ------------------ 69 | 70 | - Improve statup time 71 | - Support json as locale format 72 | - Fixed minor bugs in lorem helper (thanks to @hastebrot) 73 | 74 | 75 | 0.1.0 / 2012-09-03 76 | ------------------ 77 | 78 | - Add locale support 79 | - Total refactoring 80 | 81 | 82 | 0.0.1 / 2012-08-02 83 | ------------------ 84 | 85 | - Alpha release. 86 | -------------------------------------------------------------------------------- /lib/charlatan/phone_number.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.PhoneNumber 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | 10 | 11 | /** 12 | * Charlatan.PhoneNumber.phoneNumber() -> String 13 | * 14 | * Generate phone number. 15 | **/ 16 | exports.phoneNumber = function () { 17 | return Charlatan.numerify(Charlatan.parse('phone_number.formats')); 18 | }; 19 | 20 | 21 | /** 22 | * Charlatan.PhoneNumber.cellPhone() -> String 23 | * 24 | * Generate cell phone number. 25 | **/ 26 | exports.cellPhone = function () { 27 | return Charlatan.numerify(Charlatan.parse('cell_phone.formats')); 28 | }; 29 | 30 | 31 | /** 32 | * Charlatan.PhoneNumber.areaCode() -> String 33 | * 34 | * Generate an area code (US only). 35 | **/ 36 | exports.areaCode = function () { 37 | return Charlatan.fetch('phone_number.area_code'); 38 | }; 39 | 40 | 41 | /** 42 | * Charlatan.PhoneNumber.exchangeCode() -> String 43 | * 44 | * Return an exchange code (US only). 45 | **/ 46 | exports.exchangeCode = function () { 47 | return Charlatan.fetch('phone_number.exchange_code'); 48 | }; 49 | 50 | 51 | /** 52 | * Charlatan.PhoneNumber.subscriberNumber(length=4) -> String 53 | * - length(Integer): extension length 54 | * 55 | * Return a number extension (US only). 56 | * 57 | * Can be used for both extensions and last four digits of phone number. 58 | * Since extensions can be of variable length, this method takes a length parameter 59 | **/ 60 | exports.subscriberNumber = function (length) { 61 | if (typeof length !== 'number') { 62 | length = 4; 63 | } 64 | 65 | return Math.random().toFixed(length).slice(2); 66 | }; 67 | 68 | 69 | /** alias of: Charlatan.PhoneNumber.subscriberNumber 70 | * Charlatan.PhoneNumber.extension() -> String 71 | **/ 72 | exports.extension = exports.subscriberNumber; 73 | -------------------------------------------------------------------------------- /test/test_locale.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | var YAML = require('js-yaml'); 9 | var faker = require('../'); 10 | var locales = {}; 11 | 12 | [ 'en', 'en-BORK' ].forEach(function (x) { 13 | var data = YAML.safeLoad(fs.readFileSync(path.join(__dirname, '/../lib/locales/', x + '.yml'), 'utf8')); 14 | 15 | locales[x] = data[x].faker; 16 | }); 17 | 18 | describe('locale', function () { 19 | beforeEach(function () { 20 | faker.setLocale('en-BORK'); 21 | }); 22 | 23 | it('browser data should be actual', function () { 24 | assert.deepEqual( 25 | /* eslint-disable global-require */ 26 | require('../support/utils').all_locales(), 27 | require('../lib/locales_browser_data.json') 28 | ); 29 | }); 30 | 31 | it('configured_locale_translation', function () { 32 | assert.equal(faker.translate('faker.lorem.words')[0], locales['en-BORK'].lorem.words[0]); 33 | }); 34 | 35 | it('locale_override_when_calling_translate', function () { 36 | assert.equal(faker.translate('faker.lorem.words', { locale: 'en' })[0], locales.en.lorem.words[0]); 37 | }); 38 | 39 | it('translation_fallback', function () { 40 | assert.equal(locales['en-BORK'].name, null); 41 | assert.deepEqual(faker.translate('faker.name.first_name')[0], locales.en.name.first_name[0]); 42 | }); 43 | 44 | it('regex', function () { 45 | faker.setLocale('en-GB'); 46 | 47 | var re = /[A-PR-UWYZ][A-HK-Y]?[0-9][ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}/; 48 | var result = faker.Address.postcode(); 49 | 50 | assert(result.match(re), result + ' didn\'t match ' + re); 51 | }); 52 | 53 | it('available_locales', function () { 54 | assert.notEqual(faker.getAllLocales().indexOf('en-GB'), -1); 55 | }); 56 | 57 | after(function () { 58 | faker.setLocale(null); 59 | }); 60 | }); 61 | -------------------------------------------------------------------------------- /lib/locales/zh-CN.yml: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | zh-CN: 3 | faker: 4 | address: 5 | city_prefix: [长, 上, 南, 西, 北, 诸, 宁, 珠, 武, 衡, 成, 福, 厦, 贵, 吉, 海, 太, 济, 安, 吉, 包] 6 | city_suffix: [沙市, 京市, 宁市, 安市, 乡县, 海市, 码市, 汉市, 阳市, 都市, 州市, 门市, 阳市, 口市, 原市, 南市, 徽市, 林市, 头市] 7 | building_number: ['#####', '####', '###', '##', '#'] 8 | street_suffix: [巷, 街, 路, 桥, 侬, 旁, 中心, 栋] 9 | postcode: ['######'] 10 | state: [北京市, 上海市, 天津市, 重庆市, 黑龙江省, 吉林省, 辽宁省, 内蒙古, 河北省, 新疆, 甘肃省, 青海省, 陕西省, 宁夏, 河南省, 山东省, 山西省, 安徽省, 湖北省, 湖南省, 江苏省, 四川省, 贵州省, 云南省, 广西省, 西藏, 浙江省, 江西省, 广东省, 福建省, 海南省, 香港, 澳门] 11 | state_abbr: [京, 沪, 津, 渝, 黑, 吉, 辽, 蒙, 冀, 新, 甘, 青, 陕, 宁, 豫, 鲁, 晋, 皖, 鄂, 湘, 苏, 川, 黔, 滇, 桂, 藏, 浙, 赣, 粤, 闽, 琼, 港, 澳] 12 | city: 13 | - "#{city_prefix}#{city_suffix}" 14 | street_name: 15 | - "#{Name.last_name}#{street_suffix}" 16 | street_address: 17 | - "#{street_name}#{building_number}号" 18 | default_country: [中国] 19 | 20 | 21 | name: 22 | last_name: [王, 李, 张, 刘, 陈, 杨, 黄, 吴, 赵, 周, 徐, 孙, 马, 朱, 胡, 林, 郭, 何, 高, 罗, 郑, 梁, 谢, 宋, 唐, 许, 邓, 冯, 韩, 曹, 曾, 彭, 萧, 蔡, 潘, 田, 董, 袁, 于, 余, 叶, 蒋, 杜, 苏, 魏, 程, 吕, 丁, 沈, 任, 姚, 卢, 傅, 钟, 姜, 崔, 谭, 廖, 范, 汪, 陆, 金, 石, 戴, 贾, 韦, 夏, 邱, 方, 侯, 邹, 熊, 孟, 秦, 白, 江, 阎, 薛, 尹, 段, 雷, 黎, 史, 龙, 陶, 贺, 顾, 毛, 郝, 龚, 邵, 万, 钱, 严, 赖, 覃, 洪, 武, 莫, 孔] 23 | first_name: [绍齐, 博文, 梓晨, 胤祥, 瑞霖, 明哲, 天翊, 凯瑞, 健雄, 耀杰, 潇然, 子涵, 越彬, 钰轩, 智辉, 致远, 俊驰, 雨泽, 烨磊, 晟睿, 文昊, 修洁, 黎昕, 远航, 旭尧, 鸿涛, 伟祺, 荣轩, 越泽, 浩宇, 瑾瑜, 皓轩, 擎苍, 擎宇, 志泽, 子轩, 睿渊, 弘文, 哲瀚, 雨泽, 楷瑞, 建辉, 晋鹏, 天磊, 绍辉, 泽洋, 鑫磊, 鹏煊, 昊强, 伟宸, 博超, 君浩, 子骞, 鹏涛, 炎彬, 鹤轩, 越彬, 风华, 靖琪, 明辉, 伟诚, 明轩, 健柏, 修杰, 志泽, 弘文, 峻熙, 嘉懿, 煜城, 懿轩, 烨伟, 苑博, 伟泽, 熠彤, 鸿煊, 博涛, 烨霖, 烨华, 煜祺, 智宸, 正豪, 昊然, 明杰, 立诚, 立轩, 立辉, 峻熙, 弘文, 熠彤, 鸿煊, 烨霖, 哲瀚, 鑫鹏, 昊天, 思聪, 展鹏, 笑愚, 志强, 炫明, 雪松, 思源, 智渊, 思淼, 晓啸, 天宇, 浩然, 文轩, 鹭洋, 振家, 乐驹, 晓博, 文博, 昊焱, 立果, 金鑫, 锦程, 嘉熙, 鹏飞, 子默, 思远, 浩轩, 语堂, 聪健, 明, 文, 果, 思, 鹏, 驰, 涛, 琪, 浩, 航, 彬] 24 | name: 25 | - "#{last_name}#{first_name}" 26 | phone_number: 27 | formats: ['###-########', '####-########', '###########'] 28 | -------------------------------------------------------------------------------- /test/test_bitcoin.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Bitcoin; 7 | 8 | describe('Bitcoin', function () { 9 | it('integer division', function () { 10 | function addTest(divident, quotient, remainder) { 11 | var buf = new Buffer(divident); 12 | 13 | assert.equal(tester._divide(buf, 58), remainder); 14 | assert.deepEqual(buf, new Buffer(quotient)); 15 | } 16 | 17 | addTest([ 0, 0 ], [ 0, 0 ], 0); 18 | addTest([ 0, 57 ], [ 0, 0 ], 57); 19 | addTest([ 0, 58 ], [ 0, 1 ], 0); 20 | addTest([ 0, 123 ], [ 0, 2 ], 7); 21 | addTest([ 1, 234 ], [ 0, 8 ], 26); 22 | addTest([ 123, 45 ], [ 2, 31 ], 39); 23 | addTest([ 34, 24, 245, 3, 45, 20, 185, 94, 24, 59 ], [ 0, 150, 127, 207, 128, 198, 250, 94, 79, 221 ], 41); 24 | addTest([ 0, 0, 0, 0, 255, 255 ], [ 0, 0, 0, 0, 4, 105 ], 53); 25 | }); 26 | 27 | it('base58 - leading zeroes', function () { 28 | var buf = new Buffer('000000001234567890abcdef', 'hex'); 29 | 30 | assert.equal(tester._base58(buf), '111143c9JGZmRvE'); 31 | }); 32 | 33 | it('base58 - real example', function () { 34 | var buf = new Buffer('003c176e659bea0f29a3e9bf7880c112b1b31b4dc826268187', 'hex'); 35 | 36 | assert.equal(tester._base58(buf), '16UjcYNBG9GTK4uq2f7yYEbuifqCzoLMGS'); 37 | }); 38 | 39 | it('checksum', function () { 40 | assert.equal(tester._addressFor('main', new Array(41).join('0')), '1111111111111111111114oLvT2'); 41 | assert.equal(tester._addressFor('main', new Array(41).join('f')), '1QLbz7JHiBTspS962RLKV8GndWFwi5j6Qr'); 42 | assert.equal(tester._addressFor('testnet', new Array(41).join('0')), 'mfWxJ45yp2SFn7UciZyNpvDKrzbhyfKrY8'); 43 | }); 44 | 45 | it('address', function () { 46 | assert(tester.address().match(/^[13][1-9A-Za-z][^OIl]{20,40}/)); 47 | }); 48 | 49 | it('testnet_address', function () { 50 | assert(/^[mn][1-9A-Za-z]{32,34}$/.test(tester.testnetAddress())); 51 | assert(!/[OIl]/.test(tester.testnetAddress())); 52 | }); 53 | }); 54 | -------------------------------------------------------------------------------- /lib/charlatan/company.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Company 5 | **/ 6 | 7 | var Helpers = require('./helpers'); 8 | var Charlatan = require('../charlatan'); 9 | 10 | 11 | /** 12 | * Charlatan.Company.name() -> String 13 | * 14 | * Generate company name 15 | * 16 | **/ 17 | exports.name = function () { 18 | return Charlatan.parse('company.name'); 19 | }; 20 | 21 | 22 | /** 23 | * Charlatan.Company.suffix() -> String 24 | * 25 | * Return random suffix, for example "Inc" 26 | * 27 | **/ 28 | exports.suffix = function () { 29 | return Charlatan.fetch('company.suffix'); 30 | }; 31 | 32 | 33 | /** 34 | * Charlatan.Company.catchPhrase() -> String 35 | * 36 | * Generate a buzzword-laden catch phrase. 37 | **/ 38 | exports.catchPhrase = function () { 39 | return Charlatan.translate('company.buzzwords').map(function (list) { 40 | return Helpers.sample(list); 41 | }).join(' '); 42 | }; 43 | 44 | 45 | /** 46 | * Charlatan.Company.bs() -> String 47 | * 48 | * When a straight answer won't do, BS to the rescue! 49 | **/ 50 | exports.bs = function () { 51 | return Charlatan.translate('company.bs').map(function (list) { 52 | return Helpers.sample(list); 53 | }).join(' '); 54 | }; 55 | 56 | 57 | /** 58 | * Charlatan.Company.ein() -> String 59 | * 60 | * Generate ein 61 | **/ 62 | exports.ein = function () { 63 | return Math.random().toFixed(2).slice(2) + '-' + 64 | Math.random().toFixed(7).slice(2); 65 | }; 66 | 67 | 68 | /** 69 | * Charlatan.Company.dunsNumber() -> String 70 | * 71 | * Generate duns 72 | **/ 73 | exports.dunsNumber = function () { 74 | return Math.random().toFixed(2).slice(2) + '-' + 75 | Math.random().toFixed(3).slice(2) + '-' + 76 | Math.random().toFixed(4).slice(2); 77 | }; 78 | 79 | 80 | /** 81 | * Charlatan.Company.logo () -> String 82 | * 83 | * Get a random company logo url in PNG format. 84 | **/ 85 | exports.logo = function () { 86 | var rand_num = Charlatan.Helpers.rand(13) + 1; 87 | 88 | return 'http://pigment.github.io/fake-logos/logos/medium/color/' + rand_num + '.png'; 89 | }; 90 | -------------------------------------------------------------------------------- /lib/locales.js: -------------------------------------------------------------------------------- 1 | // Exposts { locales, addLocale } to replace implementation 2 | // for browsers 3 | 'use strict'; 4 | 5 | var yaml = require('js-yaml'); 6 | var fs = require('fs'); 7 | var path = require('path'); 8 | 9 | // locale files {<>: <>} 10 | var available_locales = {}; 11 | 12 | // already loaded locales {<>: <>} 13 | var locales = {}; 14 | 15 | /** 16 | * Charlatan.addLocale(name, data) -> void 17 | * - name (string): locale name, for example `en-US` 18 | * - data (object|string): locale hash or yaml file 19 | * 20 | * Load locale to Charlatan. Charlatan preload some 21 | * [locales](https://github.com/nodeca/charlatan/tree/master/lib) 22 | **/ 23 | function addLocale(name, data) { 24 | // if data not set, then check available 25 | if (typeof data === 'undefined') { 26 | if (!available_locales[name]) { 27 | throw new Error('Locale not found:' + name); 28 | } 29 | 30 | data = available_locales[name]; 31 | 32 | // load base language, if exists 33 | var lang = name.split('-')[0]; 34 | 35 | if (name !== lang && available_locales[lang]) { 36 | addLocale(lang); 37 | } 38 | } 39 | 40 | // data in file 41 | if (typeof data === 'string') { 42 | if (!fs.existsSync(data)) { 43 | throw new Error('Config ' + data + ' not found'); 44 | } 45 | data = yaml.safeLoad(fs.readFileSync(data, 'utf8'))[name]; 46 | 47 | } 48 | locales[name] = data; 49 | 50 | // compatibility layer for ruby Faker: we DON'T use intermediate 51 | // level `faker`, but wish to have universal localizations. 52 | // So, if `faker` section exists then its children moved 1 level up. 53 | if (data.faker) { 54 | Object.keys(data.faker).forEach(function (k) { 55 | locales[name][k] = data.faker[k]; 56 | }); 57 | } 58 | 59 | return true; 60 | } 61 | 62 | exports.locales = locales; 63 | exports.addLocale = addLocale; 64 | 65 | 66 | // fetch locales and init base locale 67 | var locales_dir = path.resolve(__dirname, 'locales'); 68 | 69 | fs.readdirSync(locales_dir).forEach(function (file) { 70 | if (/\.yml/.test(file)) { 71 | available_locales[file.replace('.yml', '')] = path.join(locales_dir, file); 72 | } 73 | }); 74 | -------------------------------------------------------------------------------- /lib/charlatan/date.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Date 5 | **/ 6 | 7 | var Helpers = require('./helpers'); 8 | 9 | 10 | /** 11 | * Charlatan.Date.between(from, to) -> Date 12 | * - from(Number | String | Date): start of the interval 13 | * - to(Number | String | Date): end of the interval 14 | * 15 | * Generate a random date in the given interval. 16 | **/ 17 | exports.between = function (from, to) { 18 | from = typeof from === 'number' ? from : Date.parse(from); 19 | to = typeof to === 'number' ? to : Date.parse(to); 20 | 21 | return new Date(Helpers.rand(Math.max(from, to) + 1, Math.min(from, to))); 22 | }; 23 | 24 | 25 | /** 26 | * Charlatan.Date.forward(days=365) -> Date 27 | * - days(Number): maximum amount of days after this one 28 | * 29 | * Generate a random date after current one. 30 | **/ 31 | exports.forward = function (days) { 32 | if (typeof days !== 'number') { 33 | days = 365; 34 | } 35 | 36 | var from = Date.now() + 24 * 60 * 60 * 1000; 37 | var to = Date.now() + 24 * 60 * 60 * 1000 * days; 38 | 39 | return exports.between(from, to); 40 | }; 41 | 42 | 43 | /** 44 | * Charlatan.Date.backward(days=365) -> Date 45 | * - days(Number): maximum amount of days before this one 46 | * 47 | * Generate a random date before current one. 48 | **/ 49 | exports.backward = function (days) { 50 | if (typeof days !== 'number') { 51 | days = 365; 52 | } 53 | 54 | var from = Date.now() - 24 * 60 * 60 * 1000; 55 | var to = Date.now() - 24 * 60 * 60 * 1000 * days; 56 | 57 | return exports.between(from, to); 58 | }; 59 | 60 | 61 | /** 62 | * Charlatan.Date.birthday(min_age=18, max_age=65) -> Date 63 | * - min_age(Number): min age 64 | * - max_age(Number): max age 65 | * 66 | * Generate a random birthday for people of given age. 67 | **/ 68 | exports.birthday = function (min_age, max_age) { 69 | if (typeof min_age !== 'number') { 70 | min_age = 18; 71 | } 72 | 73 | if (typeof max_age !== 'number') { 74 | max_age = 65; 75 | } 76 | 77 | var t = new Date(); 78 | var from = new Date(t.getFullYear() - min_age, t.getMonth(), t.getDay()); 79 | var to = new Date(t.getFullYear() - max_age, t.getMonth(), t.getDay()); 80 | 81 | return exports.between(from, to); 82 | }; 83 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Charlatan 2 | ========= 3 | 4 | [![Build Status](https://img.shields.io/travis/nodeca/charlatan/master.svg?style=flat)](https://travis-ci.org/nodeca/charlatan) 5 | [![NPM version](https://img.shields.io/npm/v/charlatan.svg?style=flat)](https://www.npmjs.org/package/charlatan) 6 | 7 | 8 | > Fake identities generator for node.js (names, addresses, phones, IPs and others). 9 | 10 | This is node.js port of ruby's [Faker](https://github.com/stympy/faker) library 11 | (v1.4.3 now), that generates fake identities for names, addresses, phone numbers, 12 | emails and others. 13 | 14 | `browserify` is supported with some differences: 15 | 16 | - All existing languages are bundled at once. 17 | - Bitcoin module dropped. 18 | 19 | [API Documentation](http://nodeca.github.com/charlatan). 20 | 21 | 22 | Installation 23 | ------------ 24 | 25 | ```bash 26 | $ npm install charlatan 27 | ``` 28 | 29 | 30 | Usage 31 | ----- 32 | 33 | ```js 34 | var Charlatan = require('charlatan'); 35 | 36 | var name = Charlatan.Name.name(); // Joshua Lemke MD 37 | var email = Charlatan.Internet.email(); // glover_ii@voluptas.name 38 | var company = Charlatan.Company.name(); // Wilkinson LLC 39 | ``` 40 | 41 | 42 | Locales 43 | ------- 44 | 45 | Different countries have different data formats. Charlatan support locales as 46 | solution of this problem. 47 | 48 | Currently available locales are [here](https://github.com/nodeca/charlatan/tree/master/lib/locales), 49 | `en` is [default](https://github.com/nodeca/charlatan/blob/master/lib/locales/en.yml). 50 | 51 | ```js 52 | var Charlatan = require('charlatan'); 53 | Charlatan.setLocale('en-US'); 54 | Charlatan.Name.name(); 55 | ``` 56 | 57 | Also you can use your own locale in yaml, json or plain hash. 58 | 59 | ```js 60 | var Charlatan = require('charlatan'); 61 | Charlatan.addLocale(myLocaleName, myLocaleFile); 62 | Charlatan.setLocale(myLocaleName); 63 | Charlatan.Name.name(); 64 | ``` 65 | 66 | __Note__: If phrase not found in current locale, charlatan tries to then 67 | fallback into to base language, and then to `en`. For example `ru-RU -> ru -> en`. 68 | 69 | 70 | Credits 71 | ------- 72 | 73 | Author [Eugene Shkuropat](https://github.com/shkuropat) 74 | 75 | [MIT](https://raw.github.com/nodeca/charlatan/master/LICENSE) license. 76 | -------------------------------------------------------------------------------- /test/test_commerce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | var tester = require('../').Commerce; 8 | 9 | describe('Commerce', function () { 10 | it('color', function () { 11 | assert(tester.color().match(/[a-z]+\.?/)); 12 | }); 13 | 14 | it('department', function () { 15 | assert(tester.department().match(/[A-Z][a-z]+\.?/)); 16 | }); 17 | 18 | it('single_department_should_not_contain_separators', function () { 19 | assert(/^[A-Za-z]+$/.test(tester.department(1))); 20 | }); 21 | 22 | it('department_should_have_ampersand_as_default_separator', function () { 23 | assert(/ & /.test(tester.department(2, true))); 24 | }); 25 | 26 | it('department_should_accept_localized_separator', function () { 27 | faker.addLocale('xy', { 28 | separator: ' + ', 29 | commerce: { 30 | department: [ 'Books', 'Movies' ] 31 | } 32 | }); 33 | 34 | faker.setLocale('xy'); 35 | assert(/ \+ /.exec(tester.department(2, true))); 36 | faker.setLocale(null); 37 | }); 38 | 39 | it('department_should_have_exact_number_of_categories_when_fixed_amount', function () { 40 | assert(/^([A-Za-z]+, ){8}[A-Za-z]+ & [A-Za-z]+$/.exec(tester.department(10, true))); 41 | }); 42 | 43 | it('department_should_never_exceed_the_max_number_of_categories_when_random_amount', function () { 44 | for (var i = 0; i < 100; i++) { 45 | assert(/^([A-Za-z]+(, | & )){0,5}[A-Za-z]+$/.exec(tester.department(6))); 46 | } 47 | }); 48 | 49 | it('department_should_have_no_duplicate_categories', function () { 50 | function uniq(arr) { 51 | var h = {}; 52 | 53 | arr.forEach(function (i) { 54 | h[i] = 1; 55 | }); 56 | return Object.keys(h); 57 | } 58 | 59 | var department = tester.department(10, true); 60 | var departments = department.split(/[,& ]+/); 61 | 62 | assert.deepEqual(departments.sort(), uniq(departments).sort()); 63 | }); 64 | 65 | it('product_name', function () { 66 | assert(tester.productName().match(/[A-Z][a-z]+\.?/)); 67 | }); 68 | 69 | it('price', function () { 70 | var p = tester.price(); 71 | 72 | assert(0 <= p && p < 100); 73 | }); 74 | 75 | it('price_is_float', function () { 76 | assert.equal(typeof tester.price(), 'number'); 77 | }); 78 | }); 79 | -------------------------------------------------------------------------------- /test/test_date.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Date; 7 | 8 | describe('Date', function () { 9 | it('between', function () { 10 | var from = Date.parse('2012-01-01'); 11 | var to = Date.parse('2013-01-01'); 12 | 13 | for (var i = 0; i < 100; i++) { 14 | var random_date = tester.between(from, to); 15 | 16 | assert(random_date >= from); 17 | assert(random_date <= to); 18 | } 19 | }); 20 | 21 | it('forward', function () { 22 | var today = Date.now(); 23 | 24 | for (var i = 0; i < 100; i++) { 25 | var random_date = tester.forward(5); 26 | 27 | assert(random_date > today); 28 | } 29 | }); 30 | 31 | it('backward', function () { 32 | var today = Date.now(); 33 | 34 | for (var i = 0; i < 100; i++) { 35 | var random_date = tester.backward(5); 36 | 37 | assert(random_date < today); 38 | } 39 | }); 40 | 41 | it('return_type', function () { 42 | var random_forward = tester.forward(5); 43 | var random_backward = tester.backward(5); 44 | var random_between = tester.between(Date.now(), Date.now() + 50000); 45 | 46 | [ random_forward, random_backward, random_between ].forEach(function (result) { 47 | assert.equal(Object.prototype.toString.call(result), '[object Date]'); 48 | }); 49 | }); 50 | 51 | it('birthday', function () { 52 | var min = 40; 53 | var max = 90; 54 | 55 | for (var i = 0; i < 100; i++) { 56 | var t = new Date(); 57 | var date_min = new Date(t.getFullYear() - min, t.getMonth(), t.getDay()); 58 | var date_max = new Date(t.getFullYear() - max, t.getMonth(), t.getDay()); 59 | var birthday = tester.birthday(min, max); 60 | 61 | assert(birthday > date_max); 62 | assert(birthday < date_min); 63 | } 64 | }); 65 | 66 | it('default_birthday', function () { 67 | var min = 10; 68 | var max = 65; 69 | 70 | for (var i = 0; i < 100; i++) { 71 | var t = new Date(); 72 | var date_min = new Date(t.getFullYear() - min, t.getMonth(), t.getDay()); 73 | var date_max = new Date(t.getFullYear() - max, t.getMonth(), t.getDay()); 74 | var birthday = tester.birthday(); 75 | 76 | assert(birthday > date_max); 77 | assert(birthday < date_min); 78 | } 79 | }); 80 | }); 81 | -------------------------------------------------------------------------------- /lib/charlatan/commerce.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Commerce 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | var Helpers = require('./helpers'); 10 | 11 | 12 | function get_categories(num) { 13 | var categories = [], tries = 0; 14 | 15 | while (categories.length < num) { 16 | var category = Charlatan.fetch('commerce.department'); 17 | 18 | if (categories.indexOf(category) === -1) { 19 | categories.push(category); 20 | } 21 | 22 | if (tries++ > 100) { 23 | // original ruby stuff could infinitely loop here 24 | break; 25 | } 26 | } 27 | return categories; 28 | } 29 | 30 | function merge_categories(categories) { 31 | var separator = Charlatan.fetch('separator'); 32 | var comma_separated = categories.slice(1).join(', '); 33 | 34 | return [ comma_separated, categories[0] ].join(separator); 35 | } 36 | 37 | /** 38 | * Charlatan.Commerce.color() -> String 39 | * 40 | * Generate color name 41 | **/ 42 | exports.color = function () { 43 | return Charlatan.fetch('commerce.color'); 44 | }; 45 | 46 | 47 | /** 48 | * Charlatan.Commerce.department(max=3, fixed_amount=false) -> String 49 | * - max(Number): number of categories 50 | * - fixed_amount(Boolean): always return max amount of them 51 | * 52 | * Generate department name 53 | **/ 54 | exports.department = function (max, fixed_amount) { 55 | if (typeof max !== 'number') { 56 | max = 3; 57 | } 58 | 59 | var num; 60 | 61 | if (fixed_amount) { 62 | num = max; 63 | } else { 64 | num = Helpers.rand(max + 1, 1); 65 | } 66 | 67 | var categories = get_categories(num); 68 | 69 | if (num > 1) { 70 | return merge_categories(categories); 71 | } 72 | return categories[0]; 73 | }; 74 | 75 | 76 | /** 77 | * Charlatan.Commerce.productName() -> String 78 | * 79 | * Generate product name 80 | **/ 81 | exports.productName = function () { 82 | return Charlatan.fetch('commerce.product_name.adjective') + ' ' + 83 | Charlatan.fetch('commerce.product_name.material') + ' ' + 84 | Charlatan.fetch('commerce.product_name.product'); 85 | }; 86 | 87 | 88 | 89 | /** 90 | * Charlatan.Commerce.price() -> Float 91 | * 92 | * Generate price 93 | **/ 94 | exports.price = function () { 95 | return Charlatan.Helpers.rand(100, 0) + 96 | Math.floor(Charlatan.Helpers.rand(100, 0)) / 100.0; 97 | }; 98 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | NPM_PACKAGE := $(shell node -e 'process.stdout.write(require("./package.json").name)') 2 | NPM_VERSION := $(shell node -e 'process.stdout.write(require("./package.json").version)') 3 | 4 | TMP_PATH := /tmp/${NPM_PACKAGE}-$(shell date +%s) 5 | 6 | REMOTE_NAME ?= origin 7 | REMOTE_REPO ?= $(shell git config --get remote.${REMOTE_NAME}.url) 8 | 9 | CURR_HEAD := $(firstword $(shell git show-ref --hash HEAD | cut --bytes=-6) master) 10 | GITHUB_PROJ := nodeca/${NPM_PACKAGE} 11 | SRC_URL_FMT := https://github.com/${GITHUB_PROJ}/blob/${CURR_HEAD}/{file}\#L{line} 12 | 13 | help: 14 | echo "make help - Print this help" 15 | echo "make lint - Lint sources with JSHint" 16 | echo "make test - Lint sources and run all tests" 17 | echo "make doc - Build API docs" 18 | echo "make gh-pages - Build and push API docs into gh-pages branch" 19 | echo "make publish - Set new version tag and publish npm package" 20 | echo "make todo - Find and list all TODOs" 21 | 22 | lint: 23 | ./node_modules/.bin/eslint . 24 | 25 | 26 | test: lint 27 | ./node_modules/.bin/mocha 28 | 29 | 30 | update_browser_data: 31 | node ./support/update_browser_data.js 32 | 33 | coverage: 34 | rm -rf coverage 35 | ./node_modules/.bin/istanbul cover node_modules/.bin/_mocha 36 | 37 | 38 | doc: 39 | rm -rf ./doc 40 | ./node_modules/.bin/ndoc --link-format "{package.homepage}/blob/${CURR_HEAD}/{file}#L{line}" 41 | 42 | 43 | gh-pages: 44 | @if test -z ${REMOTE_REPO} ; then \ 45 | echo 'Remote repo URL not found' >&2 ; \ 46 | exit 128 ; \ 47 | fi 48 | $(MAKE) doc && \ 49 | cp -r ./doc ${TMP_PATH} && \ 50 | touch ${TMP_PATH}/.nojekyll 51 | cd ${TMP_PATH} && \ 52 | git init && \ 53 | git add . && \ 54 | git commit -q -m 'Recreated docs' 55 | cd ${TMP_PATH} && \ 56 | git remote add remote ${REMOTE_REPO} && \ 57 | git push --force remote +master:gh-pages 58 | rm -rf ${TMP_PATH} 59 | 60 | 61 | publish: 62 | @if test 0 -ne `git status --porcelain | wc -l` ; then \ 63 | echo "Unclean working tree. Commit or stash changes first." >&2 ; \ 64 | exit 128 ; \ 65 | fi 66 | @if test 0 -ne `git tag -l ${NPM_VERSION} | wc -l` ; then \ 67 | echo "Tag ${NPM_VERSION} exists. Update package.json" >&2 ; \ 68 | exit 128 ; \ 69 | fi 70 | git tag ${NPM_VERSION} && git push origin ${NPM_VERSION} 71 | npm publish https://github.com/${GITHUB_PROJ}/tarball/${NPM_VERSION} 72 | 73 | 74 | todo: 75 | grep 'TODO' -n -r ./lib 2>/dev/null || test true 76 | 77 | 78 | .PHONY: publish lint test doc gh-pages todo 79 | .SILENT: help lint test doc todo 80 | -------------------------------------------------------------------------------- /lib/locales/en-NEP.yml: -------------------------------------------------------------------------------- 1 | # Country => Nepal 2 | # This file is formatted for Nepal. 3 | 4 | nep: 5 | faker: 6 | name: 7 | first_name: [ 8 | "Aarav", "Ajita", "Amit", "Amita", "Amrit", "Arijit", "Ashmi", "Asmita", "Bibek", "Bijay", "Bikash", "Bina", "Bishal", 9 | "Bishnu", "Buddha", "Deepika", "Dipendra", "Gagan", "Ganesh", "Khem", "Krishna", "Laxmi", "Manisha", "Nabin", "Nikita", 10 | "Niraj", "Nischal", "Padam", "Pooja", "Prabin", "Prakash", "Prashant", "Prem", "Purna", "Rajendra", "Rajina", "Raju", 11 | "Rakesh", "Ranjan", "Ratna", "Sagar", "Sandeep", "Sanjay", "Santosh", "Sarita", "Shilpa", "Shirisha", "Shristi", 12 | "Siddhartha", "Subash", "Sumeet", "Sunita", "Suraj", "Susan", "Sushant" 13 | ] 14 | last_name: [ 15 | "Adhikari", "Aryal", "Baral", "Basnet", "Bastola", "Basynat", "Bhandari", "Bhattarai", "Chettri", "Devkota", "Dhakal", 16 | "Dongol", "Ghale", "Gurung", "Gyawali", "Hamal", "Jung", "KC", "Kafle", "Karki", "Khadka", "Koirala", "Lama", "Limbu", 17 | "Magar", "Maharjan", "Niroula", "Pandey", "Pradhan", "Rana", "Raut", "Sai", "Shai", "Shakya", "Sherpa", "Shrestha", 18 | "Subedi", "Tamang", "Thapa" 19 | ] 20 | address: 21 | postcode: [0000] 22 | state: [ 23 | "Baglung", "Banke", "Bara", "Bardiya", "Bhaktapur", "Bhojupu", "Chitwan", "Dailekh", "Dang", "Dhading", "Dhankuta", "Dhanusa", "Dolakha", 24 | "Dolpha", "Gorkha", "Gulmi", "Humla", "Ilam", "Jajarkot", "Jhapa", "Jumla", "Kabhrepalanchok", "Kalikot", "Kapilvastu", "Kaski", "Kathmandu", 25 | "Lalitpur", "Lamjung", "Manang", "Mohottari", "Morang", "Mugu", "Mustang", "Myagdi", "Nawalparasi", "Nuwakot", "Palpa", "Parbat", "Parsa", 26 | "Ramechhap", "Rauswa", "Rautahat", "Rolpa", "Rupandehi", "Sankhuwasabha", "Sarlahi", "Sindhuli", "Sindhupalchok", "Sunsari", "Surket", 27 | "Syangja", "Tanahu", "Terhathum" 28 | ] 29 | city: ["Bhaktapur", "Biratnagar", "Birendranagar", "Birgunj", "Butwal", "Damak", "Dharan", "Gaur", "Gorkha", "Hetauda", "Itahari", "Janakpur", "Kathmandu", "Lahan", "Nepalgunj", "Pokhara"] 30 | default_country: ["Nepal"] 31 | internet: 32 | free_email: ['worldlink.com.np', 'gmail.com', 'yahoo.com', 'hotmail.com'] 33 | domain_suffix: ['np', 'com', 'info', 'net', 'org'] 34 | company: 35 | suffix: ['Pvt Ltd', 'Group', 'Ltd', 'Limited'] 36 | phone_number: 37 | formats: ['##-#######', '+977-#-#######', '+977########'] 38 | 39 | 40 | -------------------------------------------------------------------------------- /test/test_lorem.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var Charlatan = require('../'); 7 | var tester = require('../').Lorem; 8 | 9 | describe('Lorem', function () { 10 | var standard_wordlist = Charlatan.translate('lorem.words'); 11 | var complete_wordlist = standard_wordlist.concat(Charlatan.translate('faker.lorem.supplemental')); 12 | 13 | it('character', function () { 14 | assert.equal(tester.character().length, 1); 15 | }); 16 | 17 | it('character_type', function () { 18 | assert.equal(typeof tester.character(), 'string'); 19 | }); 20 | 21 | it('characters', function () { 22 | assert.equal(tester.characters().length, 255); 23 | }); 24 | 25 | it('characters_with_args', function () { 26 | for (var i = 0; i < 100; i++) { 27 | assert.equal(tester.characters(500).length, 500); 28 | } 29 | }); 30 | 31 | // Words delivered by a standard request should be on the standard wordlist. 32 | it('standard_words', function () { 33 | var words = tester.words(1000); 34 | 35 | words.forEach(function (w) { 36 | assert(standard_wordlist.indexOf(w) !== -1); 37 | }); 38 | }); 39 | 40 | // Words requested from the supplemental list should all be in that list. 41 | it('supplemental_words', function () { 42 | var words = tester.words(1000, true); 43 | 44 | words.forEach(function (w) { 45 | assert(complete_wordlist.indexOf(w) !== -1); 46 | }); 47 | }); 48 | 49 | // Lorem.word generates random word from standard wordlist 50 | it('word', function () { 51 | for (var i = 0; i < 1000; i++) { 52 | assert(standard_wordlist.indexOf(tester.word()) !== -1); 53 | } 54 | }); 55 | 56 | it('exact_count_param', function () { 57 | assert.equal(tester.characters(2).length, 2); 58 | assert.equal(tester.words(2).length, 2); 59 | assert.equal(tester.sentences(2).length, 2); 60 | assert.equal(tester.paragraphs(2).length, 2); 61 | }); 62 | 63 | it('array_count_param', function () { 64 | var cs = tester.characters([ 1, 4 ]); 65 | var ws = tester.words([ 1, 4 ]); 66 | var ss = tester.sentences([ 1, 4 ]); 67 | var ps = tester.paragraphs([ 1, 4 ]); 68 | 69 | assert(cs.length === 1 || cs.length === 4); 70 | assert(ws.length === 1 || ws.length === 4); 71 | assert(ss.length === 1 || ss.length === 4); 72 | assert(ps.length === 1 || ps.length === 4); 73 | }); 74 | 75 | it('words_with_large_count_params', function () { 76 | var exact = tester.words(500); 77 | var array = tester.words([ 250, 500 ]); 78 | 79 | assert.equal(exact.length, 500); 80 | assert(array.length === 250 || array.length === 500); 81 | }); 82 | }); 83 | -------------------------------------------------------------------------------- /lib/locales/ko.yml: -------------------------------------------------------------------------------- 1 | ko: 2 | faker: 3 | address: 4 | postcode: ["###-###"] 5 | state: ["강원", "경기", "경남", "경북", "광주", "대구", "대전", "부산", "서울", "울산", "인천", "전남", "전북", "제주", "충남", "충북", "세종"] 6 | state_abbr: ["강원", "경기", "경남", "경북", "광주", "대구", "대전", "부산", "서울", "울산", "인천", "전남", "전북", "제주", "충남", "충북", "세종"] 7 | city_suffix: ["구", "시", "군"] 8 | city_name: ["강릉", "양양", "인제", "광주", "구리", "부천", "밀양", "통영", "창원", "거창", "고성", "양산", "김천", "구미", "영주", "광산", "남", "북", "고창", "군산", "남원", "동작", "마포", "송파", "용산", "부평", "강화", "수성"] 9 | city: 10 | - "#{city_name}#{city_suffix}" 11 | street_root: ["상계", "화곡", "신정", "목", "잠실", "면목", "주안", "안양", "중", "정왕", "구로", "신월", "연산", "부평", "창", "만수", "중계", "검단", "시흥", "상도", "방배", "장유", "상", "광명", "신길", "행신", "대명", "동탄"] 12 | street_suffix: ["읍", "면", "동"] 13 | street_name: 14 | - "#{street_root}#{street_suffix}" 15 | 16 | phone_number: 17 | formats: ['0#-#####-####', '0##-###-####', '0##-####-####'] 18 | 19 | company: 20 | suffix: ["연구소", "게임즈", "그룹", "전자", "물산", "코리아"] 21 | prefix: ["주식회사", "한국"] 22 | name: 23 | - "#{prefix} #{Name.first_name}" 24 | - "#{Name.first_name} #{suffix}" 25 | 26 | internet: 27 | free_email: [gmail.com, yahoo.co.kr, hanmail.net, naver.com] 28 | domain_suffix: [co.kr, com, biz, info, ne.kr, net, or.kr, org] 29 | 30 | lorem: 31 | words: ["국가는", "법률이", "정하는", "바에", "의하여", "재외국민을", "보호할", "의무를", "진다.", "모든", "국민은", "신체의", "자유를", "가진다.", "국가는", "전통문화의", "계승·발전과", "민족문화의", "창달에", "노력하여야", "한다.", "통신·방송의", "시설기준과", "신문의", "기능을", "보장하기", "위하여", "필요한", "사항은", "법률로", "정한다.", "헌법에", "의하여", "체결·공포된", "조약과", "일반적으로", "승인된", "국제법규는", "국내법과", "같은", "효력을", "가진다.", "다만,", "현행범인인", "경우와", "장기", "3년", "이상의", "형에", "해당하는", "죄를", "범하고", "도피", "또는", "증거인멸의", "염려가", "있을", "때에는", "사후에", "영장을", "청구할", "수", "있다.", "저작자·발명가·과학기술자와", "예술가의", "권리는", "법률로써", "보호한다.", "형사피고인은", "유죄의", "판결이", "확정될", "때까지는", "무죄로", "추정된다.", "모든", "국민은", "행위시의", "법률에", "의하여", "범죄를", "구성하지", "아니하는", "행위로", "소추되지", "아니하며,", "동일한", "범죄에", "대하여", "거듭", "처벌받지", "아니한다.", "국가는", "평생교육을", "진흥하여야", "한다.", "모든", "국민은", "사생활의", "비밀과", "자유를", "침해받지", "아니한다.", "의무교육은", "무상으로", "한다.", "저작자·발명가·과학기술자와", "예술가의", "권리는", "법률로써", "보호한다.", "국가는", "모성의", "보호를", "위하여", "노력하여야", "한다.", "헌법에", "의하여", "체결·공포된", "조약과", "일반적으로", "승인된", "국제법규는", "국내법과", "같은", "효력을", "가진다."] 32 | 33 | name: 34 | last_name: ["김", "이", "박", "최", "정", "강", "조", "윤", "장", "임", "오", "한", "신", "서", "권", "황", "안", "송", "류", "홍"] 35 | first_name: ["서연", "민서", "서현", "지우", "서윤", "지민", "수빈", "하은", "예은", "윤서", "민준", "지후", "지훈", "준서", "현우", "예준", "건우", "현준", "민재", "우진", "은주"] 36 | name: 37 | - "#{last_name} #{first_name}" 38 | -------------------------------------------------------------------------------- /lib/locales/en-au-ocker.yml: -------------------------------------------------------------------------------- 1 | # Australian Slang, and ocker names for a bit of fun, as well as 2 | # Aussie specific terms and references 3 | # Took the lead of previous contributors of en-au as a baseline 4 | # regular names are top 50 names from 2013 5 | 6 | en-au-ocker: 7 | faker: 8 | name: 9 | first_name: [Charlotte, Ava, Chloe, Emily, Olivia, Zoe, Lily, Sophie, Amelia, Sofia, Ella, Isabella, Ruby, Sienna, Mia+3, Grace, Emma, Ivy, Layla, Abigail, Isla, Hannah, Zara, Lucy, Evie, Annabelle, Madison, Alice, Georgia, Maya, Madeline, Audrey, Scarlett, Isabelle, Chelsea, Mila, Holly, Indiana, Poppy, Harper, Sarah, Alyssa, Jasmine, Imogen, Hayley, Pheobe, Eva, Evelyn, Mackenzie, Ayla, Oliver, Jack, Jackson, William, Ethan, Charlie, Lucas, Cooper, Lachlan, Noah, Liam, Alexander, Max, Isaac, Thomas, Xavier, Oscar, Benjamin, Aiden, Mason, Samuel, James, Levi, Riley, Harrison, Ryan, Henry, Jacob, Joshua, Leo, Zach, Harry, Hunter, Flynn, Archie, Tyler, Elijah, Hayden, Jayden, Blake, Archer, Ashton, Sebastian, Zachery, Lincoln, Mitchell, Luca, Nathan, Kai, Connor, Tom, Nigel, Matt, Sean] 10 | last_name: [Smith, Jones, Williams, Brown, Wilson, Taylor, Morton, White, Martin, Anderson, Thompson, Nguyen, Thomas, Walker, Harris, Lee, Ryan, Robinson, Kelly, King, Rausch, Ridge, Connolly, LeQuesne] 11 | ocker_first_name: [Bazza, Bluey, Davo, Johno, Shano, Shazza] 12 | company: 13 | suffix: [Pty Ltd, and Sons, Corp, Group, Brothers, Partners] 14 | internet: 15 | domain_suffix: [com.au, com, net.au, net, org.au, org] 16 | address: 17 | street_root: [Ramsay Street, Bonnie Doon, Cavill Avenue, Queen Street] 18 | street_name: 19 | - "#{street_root}" 20 | city_prefix: [Bondi, Burleigh Heads, Carlton, Fitzroy, Fremantle, Glenelg, Manly, Noosa, Stones Corner, St Kilda, Surry Hills, Yarra Valley] 21 | city: 22 | - "#{city_prefix}" 23 | state_abbr: [NSW, QLD, NT, SA, WA, TAS, ACT, VIC] 24 | region: [South East Queensland, Wide Bay Burnett, Margaret River, Port Pirie, Gippsland, Elizabeth, Barossa] 25 | state: [New South Wales, Queensland, Northern Territory, South Australia, Western Australia, Tasmania, Australian Capital Territory, Victoria] 26 | postcode: ['0###', '2###', '3###', '4###', '5###', '6###', '7###'] 27 | building_number: ['####', '###', '##'] 28 | street_suffix: [Avenue, Boulevard, Circle, Circuit, Court, Crescent, Crest, Drive, Estate Dr, Grove, Hill, Island, Junction, Knoll, Lane, Loop, Mall, Manor, Meadow, Mews, Parade, Parkway, Pass, Place, Plaza, Ridge, Road, Run, Square, Station St, Street, Summit, Terrace, Track, Trail, View Rd, Way] 29 | default_country: [Australia] 30 | phone_number: 31 | formats: ['0# #### ####', '+61 # #### ####', '04## ### ###', '+61 4## ### ###'] #iOS AUS phone formats -------------------------------------------------------------------------------- /lib/charlatan/hacker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Hacker 5 | **/ 6 | 7 | var Helpers = require('./helpers'); 8 | var Charlatan = require('../charlatan'); 9 | 10 | 11 | /** 12 | * Charlatan.Hacker.abbreviation() -> String 13 | * 14 | * Generate an abbreviation 15 | **/ 16 | var abbreviation = exports.abbreviation = function () { 17 | return Charlatan.fetch('hacker.abbreviation'); 18 | }; 19 | 20 | 21 | /** 22 | * Charlatan.Hacker.adjective() -> String 23 | * 24 | * Generate "hacker" adjective 25 | **/ 26 | var adjective = exports.adjective = function () { 27 | return Charlatan.fetch('hacker.adjective'); 28 | }; 29 | 30 | 31 | /** 32 | * Charlatan.Hacker.noun() -> String 33 | * 34 | * Generate "hacker" noun 35 | **/ 36 | var noun = exports.noun = function () { 37 | return Charlatan.fetch('hacker.noun'); 38 | }; 39 | 40 | 41 | /** 42 | * Charlatan.Hacker.verb() -> String 43 | * 44 | * Generate "hacker" verb 45 | **/ 46 | var verb = exports.verb = function () { 47 | return Charlatan.fetch('hacker.verb'); 48 | }; 49 | 50 | 51 | /** 52 | * Charlatan.Hacker.ingverb() -> String 53 | * 54 | * Generate "hacker" ingverb 55 | **/ 56 | var ingverb = exports.ingverb = function () { 57 | return Charlatan.fetch('hacker.ingverb'); 58 | }; 59 | 60 | 61 | function phrases() { 62 | /* eslint-disable max-len, no-implicit-coercion */ 63 | return [ 64 | 'If we ' + verb() + ' the ' + noun() + ', we can get to the ' + abbreviation() + ' ' + noun() + ' through the ' + adjective() + ' ' + abbreviation() + ' ' + noun() + '!', 65 | 'We need to ' + verb() + ' the ' + adjective() + ' ' + abbreviation() + ' ' + noun() + '!', 66 | 'Try to ' + verb() + ' the ' + abbreviation() + ' ' + noun() + ', maybe it will ' + verb() + ' the ' + adjective() + ' ' + noun() + '!', 67 | 'You can\'t ' + verb() + ' the ' + noun() + ' without ' + ingverb() + ' the ' + adjective() + ' ' + abbreviation() + ' ' + noun() + '!', 68 | 'Use the ' + adjective() + ' ' + abbreviation() + ' ' + noun() + ', then you can ' + verb() + ' the ' + adjective() + ' ' + noun() + '!', 69 | 'The ' + abbreviation() + ' ' + noun() + ' is down, ' + verb() + ' the ' + adjective() + ' ' + noun() + ' so we can ' + verb() + ' the ' + abbreviation() + ' ' + noun() + '!', 70 | '' + ingverb() + ' the ' + noun() + ' won\'t do anything, we need to ' + verb() + ' the ' + adjective() + ' ' + abbreviation() + ' ' + noun() + '!', 71 | 'I\'ll ' + verb() + ' the ' + adjective() + ' ' + abbreviation() + ' ' + noun() + ', that should ' + noun() + ' the ' + abbreviation() + ' ' + noun() + '!' 72 | ]; 73 | } 74 | 75 | 76 | /** 77 | * Charlatan.Hacker.saySomethingSmart() -> String 78 | * 79 | * Generate a smart looking phrase 80 | **/ 81 | exports.saySomethingSmart = function () { 82 | return Helpers.sample(phrases()); 83 | }; 84 | -------------------------------------------------------------------------------- /lib/charlatan/code.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Code 5 | **/ 6 | 7 | var Charlatan = require('../charlatan'); 8 | 9 | 10 | function generate_base10_isbn() { 11 | var values = Charlatan.regexify(/\d{9}/); 12 | var remainder = values.split('').reduce(function (acc, ch, i) { 13 | return acc + Number(ch) * (10 - i); 14 | }, 0); 15 | 16 | remainder = (11 - (remainder % 11)) % 11; 17 | return values + '-' + String(remainder === 10 ? 'X' : remainder); 18 | } 19 | 20 | function generate_base13_isbn() { 21 | var values = Charlatan.regexify(/\d{12}/); 22 | var remainder = values.split('').reduce(function (acc, ch, i) { 23 | return acc + (i % 2 ? 3 : 1) * Number(ch); 24 | }, 0); 25 | 26 | remainder = (10 - (remainder % 10)) % 10; 27 | return values + '-' + String(remainder); 28 | } 29 | 30 | function generate_base8_ean() { 31 | var values = Charlatan.regexify(/\d{7}/); 32 | var remainder = values.split('').reduce(function (acc, ch, i) { 33 | return acc + (i % 2 ? 1 : 3) * Number(ch); 34 | }, 0); 35 | 36 | remainder = (10 - (remainder % 10)) % 10; 37 | return values + String(remainder); 38 | } 39 | 40 | function generate_base13_ean() { 41 | var values = Charlatan.regexify(/\d{12}/); 42 | var remainder = values.split('').reduce(function (acc, ch, i) { 43 | return acc + (i % 2 ? 3 : 1) * Number(ch); 44 | }, 0); 45 | 46 | remainder = (10 - (remainder % 10)) % 10; 47 | return values + String(remainder); 48 | } 49 | 50 | function rut_verificator_digit(rut) { 51 | var verif_digits = '3 2 7 6 5 4 3 2'.split(' '); 52 | 53 | var total = ('00000000' + rut).slice(-8).split('').reduce(function (acc, ch, i) { 54 | return acc + ch * verif_digits[i]; 55 | }, 0); 56 | 57 | return (11 - total % 11).toString().replace(/10/, 'k').replace(/11/, '0'); 58 | } 59 | 60 | 61 | /** 62 | * Charlatan.Code.isbn(base=10) -> String 63 | * - base(Number): isbn code type 64 | * 65 | * Generate ISBN. 66 | * 67 | * By default generates 10 sign isbn code in format 123456789-X 68 | * You can pass 13 to generate new 13 sign code. 69 | **/ 70 | exports.isbn = function (base) { 71 | return Number(base) === 13 ? generate_base13_isbn() : generate_base10_isbn(); 72 | }; 73 | 74 | 75 | /** 76 | * Charlatan.Code.ean(base=13) -> String 77 | * - base(Number): ean code type 78 | * 79 | * Generate EAN. 80 | * 81 | * By default generates 13 sign ean code in format 1234567890123 82 | * You can pass 8 to generate ean8 code 83 | **/ 84 | exports.ean = function (base) { 85 | return Number(base) === 8 ? generate_base8_ean() : generate_base13_ean(); 86 | }; 87 | 88 | 89 | /** 90 | * Charlatan.Code.rut() -> String 91 | * 92 | * Generate RUT. 93 | **/ 94 | exports.rut = function () { 95 | var value = String(Charlatan.Number.number(8)); 96 | 97 | return value + '-' + String(rut_verificator_digit(value)); 98 | }; 99 | -------------------------------------------------------------------------------- /test/test_number.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var tester = require('../').Number; 7 | 8 | describe('Number', function () { 9 | it('number', function () { 10 | assert(tester.number(10).match(/[0-9]{10}/)); 11 | 12 | for (var digits = 1; digits < 10; digits++) { 13 | assert(tester.number(digits).match(new RegExp('^[0-9]{' + digits + '}$'))); 14 | } 15 | 16 | assert.equal(tester.number(10).length, 10); 17 | assert.equal(tester.number(1).length, 1); 18 | assert.equal(tester.number(0), ''); 19 | }); 20 | 21 | it('decimal', function () { 22 | assert(tester.decimal(2).match(/[0-9]{2}\.[0-9]{2}/)); 23 | assert(tester.decimal(4, 5).match(/[0-9]{4}\.[0-9]{5}/)); 24 | }); 25 | 26 | it('digit', function () { 27 | assert(tester.digit().match(/[0-9]{1}/)); 28 | 29 | var digits = {}; 30 | 31 | for (var i = 0; i < 1000; i++) { 32 | digits[tester.digit()] = 1; 33 | } 34 | assert.deepEqual(Object.keys(digits).sort().join(''), '0123456789'); 35 | }); 36 | 37 | it('between', function () { 38 | for (var i = 0; i < 100; i++) { 39 | var random_number = tester.between(-50, 50); 40 | 41 | assert(random_number >= -50, 'Expected >= -50, but got ' + random_number); 42 | assert(random_number <= 50, 'Expected <= 50, but got ' + random_number); 43 | } 44 | }); 45 | 46 | it('positive', function () { 47 | for (var i = 0; i < 100; i++) { 48 | var random_number = tester.positive(1, 100); 49 | 50 | assert(random_number >= 1, 'Expected >= 1, but got ' + random_number); 51 | assert(random_number <= 100, 'Expected <= 100, but got ' + random_number); 52 | } 53 | }); 54 | 55 | it('negative', function () { 56 | for (var i = 0; i < 100; i++) { 57 | var random_number = tester.negative(-1, -100); 58 | 59 | assert(random_number <= -1, 'Expected <= -1, but got ' + random_number); 60 | assert(random_number >= -100, 'Expected >= -100, but got ' + random_number); 61 | } 62 | }); 63 | 64 | it('force_positive', function () { 65 | var random_number = tester.positive(-1, -100); 66 | 67 | assert(random_number >= 1, 'Expected >= 1, but got ' + random_number); 68 | assert(random_number <= 100, 'Expected <= 100, but got ' + random_number); 69 | }); 70 | 71 | it('force_negative', function () { 72 | var random_number = tester.negative(1, 100); 73 | 74 | assert(random_number <= -1, 'Expected <= -1, but got ' + random_number); 75 | assert(random_number >= -100, 'Expected >= -100, but got ' + random_number); 76 | }); 77 | 78 | it('parameters_order', function () { 79 | var random_number = tester.between(100, 1); 80 | 81 | assert(random_number >= 1, 'Expected >= 1, but got ' + random_number); 82 | assert(random_number <= 100, 'Expected <= 100, but got ' + random_number); 83 | }); 84 | 85 | it('hexadecimal', function () { 86 | assert(tester.hexadecimal(4).match(/[0-9a-f]{4}/)); 87 | assert(tester.hexadecimal(7).match(/[0-9a-f]{7}/)); 88 | }); 89 | }); 90 | -------------------------------------------------------------------------------- /lib/charlatan/number.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Number 5 | **/ 6 | 7 | var Helpers = require('./helpers'); 8 | 9 | 10 | /** 11 | * Charlatan.Number.number(digits) -> String 12 | * - digits(Number): an amount of digits in there 13 | * 14 | * Generate a base 10 number 15 | **/ 16 | exports.number = function (digits) { 17 | var result = ''; 18 | 19 | for (var i = 0; i < digits; i++) { 20 | result += Helpers.rand(10, 0).toString(10); 21 | } 22 | 23 | return result; 24 | }; 25 | 26 | 27 | /** 28 | * Charlatan.Number.decimal(l_digits, r_digits=2) -> String 29 | * - l_digits(Number): an amount of digits in the integer part 30 | * - r_digits(Number): an amount of digits in the fractional part 31 | * 32 | * Generate a decimal number 33 | **/ 34 | exports.decimal = function (l_digits, r_digits) { 35 | if (typeof r_digits !== 'number') { 36 | r_digits = 2; 37 | } 38 | 39 | return exports.number(l_digits) + '.' + exports.number(r_digits); 40 | }; 41 | 42 | 43 | /** 44 | * Charlatan.Number.digit() -> String 45 | * 46 | * Generate a base 10 digit 47 | **/ 48 | exports.digit = function () { 49 | return String(Helpers.rand(10, 0)); 50 | }; 51 | 52 | 53 | /** 54 | * Charlatan.Number.hexadecimal(digits) -> String 55 | * - digits(Number): an amount of digits in there 56 | * 57 | * Generate a base 16 number 58 | **/ 59 | exports.hexadecimal = function (digits) { 60 | var result = ''; 61 | 62 | for (var i = 0; i < digits; i++) { 63 | result += Helpers.rand(16, 0).toString(16); 64 | } 65 | 66 | return result; 67 | }; 68 | 69 | 70 | /** 71 | * Charlatan.Number.between(from=1, to=5000) -> Number 72 | * - from(Number): range start 73 | * - to(Number): range end 74 | * 75 | * Generate a number between `from` and `to` 76 | **/ 77 | exports.between = function (from, to) { 78 | if (typeof from !== 'number') { 79 | from = 1; 80 | } 81 | 82 | if (typeof to !== 'number') { 83 | to = 5000; 84 | } 85 | 86 | return Helpers.rand(Math.max(from, to) + 1, Math.min(from, to)); 87 | }; 88 | 89 | 90 | /** 91 | * Charlatan.Number.positive(from=1, to=5000) -> Number 92 | * - from(Number): range start 93 | * - to(Number): range end 94 | * 95 | * Generate a positive number between `from` and `to` 96 | **/ 97 | exports.positive = function (from, to) { 98 | if (typeof from !== 'number') { 99 | from = 1; 100 | } 101 | 102 | if (typeof to !== 'number') { 103 | to = 5000; 104 | } 105 | 106 | return Math.abs(exports.between(from, to)); 107 | }; 108 | 109 | 110 | /** 111 | * Charlatan.Number.negative(from=-5000, to=-1) -> Number 112 | * - from(Number): range start 113 | * - to(Number): range end 114 | * 115 | * Generate a negative number between `from` and `to` 116 | **/ 117 | exports.negative = function (from, to) { 118 | if (typeof from !== 'number') { 119 | from = -5000; 120 | } 121 | 122 | if (typeof to !== 'number') { 123 | to = -1; 124 | } 125 | 126 | return -Math.abs(exports.between(from, to)); 127 | }; 128 | -------------------------------------------------------------------------------- /test/test_locale_en_us.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | require('./_utils'); 4 | 5 | var assert = require('assert'); 6 | var faker = require('../'); 7 | 8 | describe('locale: en-US', function () { 9 | afterEach(function () { 10 | faker.setLocale(null); 11 | }); 12 | 13 | it('us_phone_methods_return_nil_for_nil_locale', function () { 14 | assert.equal(faker.PhoneNumber.area_code, null); 15 | assert.equal(faker.PhoneNumber.exchange_code, null); 16 | }); 17 | 18 | it('subscriber_number_method', function () { 19 | assert.equal(typeof faker.PhoneNumber.subscriberNumber(), 'string'); 20 | assert.equal(faker.PhoneNumber.subscriberNumber().length, 4); 21 | assert.equal(faker.PhoneNumber.subscriberNumber(10).length, 10); 22 | assert.equal(faker.PhoneNumber.extension, faker.PhoneNumber.subscriberNumber); 23 | }); 24 | 25 | it('us_phone_methods_with_en_us_locale', function () { 26 | faker.setLocale('en-US'); 27 | 28 | assert.equal(typeof faker.PhoneNumber.areaCode(), 'string'); 29 | assert(!Number.isNaN(Number(faker.PhoneNumber.areaCode()))); 30 | assert.equal(faker.PhoneNumber.areaCode().length, 3); 31 | 32 | assert.equal(typeof faker.PhoneNumber.exchangeCode(), 'string'); 33 | assert(!Number.isNaN(Number(faker.PhoneNumber.exchangeCode()))); 34 | assert.equal(faker.PhoneNumber.exchangeCode().length, 3); 35 | }); 36 | 37 | it('validity_of_phone_method_output', function () { 38 | faker.setLocale('en-US'); 39 | 40 | /* eslint-disable max-len */ 41 | // got the following regex from http://stackoverflow.com/a/123666/1210055 as an expression of the NANP standard. 42 | var us_number_validation_regex = /^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/; 43 | 44 | assert(us_number_validation_regex.test(faker.PhoneNumber.phoneNumber())); 45 | }); 46 | 47 | it('us_invalid_state_raises_exception', function () { 48 | faker.setLocale('en-US'); 49 | 50 | assert.throws(function () { 51 | faker.Address.zipCode('NA'); 52 | }, /Invalid path/); 53 | }); 54 | 55 | it('us_zip_codes_match_state', function () { 56 | faker.setLocale('en-US'); 57 | 58 | var state_abbr = 'AZ'; 59 | var expected = /^850\d\d$/; 60 | 61 | assert(expected.test(faker.Address.zipCode(state_abbr))); 62 | 63 | // disjointed ranges for these states 64 | // http://www.fincen.gov/forms/files/us_state_territory_zip_codes.pdf 65 | state_abbr = 'AR'; 66 | expected = /^717\d\d$/; 67 | assert(expected.test(faker.Address.zipCode(state_abbr))); 68 | state_abbr = 'GA'; 69 | expected = /^301\d\d$/; 70 | assert(expected.test(faker.Address.zipCode(state_abbr))); 71 | state_abbr = 'MA'; 72 | expected = /^026\d\d$/; 73 | assert(expected.test(faker.Address.zipCode(state_abbr))); 74 | state_abbr = 'NY'; 75 | expected = /^122\d\d$/; 76 | assert(expected.test(faker.Address.zipCode(state_abbr))); 77 | state_abbr = 'TX'; 78 | expected = /^798\d\d$/; 79 | assert(expected.test(faker.Address.zipCode(state_abbr))); 80 | state_abbr = 'VA'; 81 | expected = /^222\d\d$/; 82 | assert(expected.test(faker.Address.zipCode(state_abbr))); 83 | }); 84 | }); 85 | -------------------------------------------------------------------------------- /lib/charlatan/helpers.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Helpers 5 | **/ 6 | 7 | var titleizeSmallWords = [ 'a', 'an', 'and', 'as', 'at', 'but', 'by', 8 | 'en', 'for', 'if', 'in', 'of', 'on', 'or', 'the', 'to', 'v', 9 | 'v.', 'via', 'vs', 'vs.' ]; 10 | 11 | /** 12 | * Charlatan.Helpers.rand(max, min = 0) -> Integer 13 | * - max (number): max value in range (exclusive) 14 | * - min (number): min value in range (inclusive) 15 | * 16 | * Returns a single random number in range `[min, max)`, 17 | * including `min` but excluding `max`. 18 | **/ 19 | exports.rand = function (max, min) { 20 | if (!min) { 21 | min = 0; 22 | } 23 | return Math.floor(Math.random() * (max - min)) + min; 24 | }; 25 | 26 | 27 | /** 28 | * Charlatan.Helpers.sample(source) -> Mixin 29 | * - source(array): source array 30 | * 31 | * Returns random element from source array 32 | **/ 33 | exports.sample = function (source) { 34 | return source[exports.rand(source.length)]; 35 | }; 36 | 37 | 38 | /** 39 | * Charlatan.Helpers.shuffle(source) -> Array 40 | * - source(array): source array 41 | * 42 | * Takes an array and returns it randomized 43 | **/ 44 | exports.shuffle = function (source) { 45 | var result = source.slice(), 46 | i, p, tmp; 47 | 48 | for (i = 0; i < source.length; i++) { 49 | p = parseInt(Math.random() * source.length, 10); 50 | tmp = result[i]; 51 | result[i] = result[p]; 52 | result[p] = tmp; 53 | } 54 | return result; 55 | }; 56 | 57 | 58 | /** 59 | * Charlatan.Helpers.capitalize(str) -> String 60 | * - str(string): source string 61 | * 62 | * Capitalize first letter 63 | **/ 64 | var capitalize = exports.capitalize = function (str) { 65 | return str.charAt(0).toUpperCase() + str.slice(1); 66 | }; 67 | 68 | 69 | /** 70 | * Charlatan.Helpers.titleize() -> String 71 | * - title(string): source string 72 | * 73 | * Capitalizes most words to create a nicer looking title string. 74 | * The list of "small words" which are not capped comes from 75 | * the New York Times Manual of Style, plus 'vs' and 'v'. 76 | **/ 77 | exports.titleize = function (title) { 78 | var i; 79 | var words = title.toLowerCase().split(' '); 80 | 81 | // first word is always capitalised 82 | words[0] = capitalize(words[0]); 83 | 84 | for (i = 1; i < words.length; i++) { 85 | if (titleizeSmallWords.indexOf(words[i]) === -1) { 86 | words[i] = capitalize(words[i]); 87 | } 88 | } 89 | return words.join(' '); 90 | }; 91 | 92 | 93 | /** 94 | * Charlatan.Helpers.range(from, to) -> String | Number 95 | * - from(String | Number): starting character 96 | * - to(String | Number): ending character 97 | * 98 | * Return all numbers or characters from `from` to `to`. 99 | * 100 | * If input values are strings, this method returns strings, 101 | * if they are numbers, it will return a number array. 102 | * 103 | * For example, `range("A", "D")` will return `["A", "B", "C", "D"]`. 104 | **/ 105 | exports.range = function (from, to) { 106 | var i, stringify = false, result = []; 107 | 108 | if (typeof from === 'string' && typeof to === 'string') { 109 | stringify = true; 110 | from = from.charCodeAt(0); 111 | to = to.charCodeAt(0); 112 | } 113 | 114 | for (i = from; i <= to; i++) { 115 | result.push(i); 116 | } 117 | 118 | return stringify ? 119 | result.map(function (x) { return String.fromCharCode(x); }) : 120 | result; 121 | }; 122 | -------------------------------------------------------------------------------- /lib/charlatan/bitcoin.js: -------------------------------------------------------------------------------- 1 | 2 | 'use strict'; 3 | 4 | /** 5 | * class Charlatan.Bitcoin 6 | **/ 7 | 8 | var crypto = require('crypto'); 9 | 10 | 11 | var PROTOCOL_VERSIONS = { 12 | main: 0, 13 | testnet: 111 14 | }; 15 | 16 | 17 | /** internal 18 | * divide(buf, n) -> Number 19 | * - buf(Buffer): divident 20 | * - n(Number): divisor 21 | * 22 | * Performs integer division of buf by n (modifying buf in-place) 23 | * and returns a reminder. 24 | * 25 | * `n` must be one digit (i.e. lower than 256) 26 | **/ 27 | function divide(buf, n) { 28 | /* eslint-disable no-bitwise */ 29 | var i = 0, l, t, rem; 30 | 31 | t = buf[i]; 32 | rem = t % n; 33 | buf[i] = Math.floor(t / n); 34 | 35 | for (i = 1, l = buf.length; i < l; i++) { 36 | t = rem * 256 + buf[i]; 37 | rem = t % n; 38 | buf[i] = Math.floor(t / n); 39 | } 40 | 41 | return rem; 42 | } 43 | 44 | 45 | /** internal 46 | * buffer_empty(buf) -> Boolean 47 | * - buf(Buffer): buffer to check 48 | * 49 | * Returns true iff all elements of a buffer are zero. 50 | **/ 51 | function buffer_empty(buf) { 52 | for (var i = buf.length - 1; i > 0; i--) { 53 | if (buf[i]) { return false; } 54 | } 55 | 56 | return true; 57 | } 58 | 59 | 60 | /** internal 61 | * base58(buf) -> String 62 | * - buf(Buffer): buffer to encode 63 | * 64 | * Encodes buffer to base58 format 65 | **/ 66 | function base58(buf) { 67 | var alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'; 68 | var base = alphabet.length; 69 | var result = []; 70 | var divident = new Buffer(buf.length); 71 | 72 | buf.copy(divident); 73 | 74 | while (!buffer_empty(divident)) { 75 | result.unshift(alphabet[divide(divident, base)]); 76 | } 77 | 78 | for (var i = 0; i < buf.length && !buf[i]; i++) { 79 | result.unshift(alphabet[0]); 80 | } 81 | 82 | return result.join(''); 83 | } 84 | 85 | 86 | /** internal 87 | * addressFor(network[, rnd]) -> String 88 | * - network(String): network we're getting address for 89 | * - rnd(Buffer): hash of a private key (generated randomly if not supplied) 90 | * 91 | * Generate bitcoin address for a given network 92 | **/ 93 | function addressFor(network, rnd) { 94 | var version = PROTOCOL_VERSIONS[network]; 95 | 96 | // ver payload checksum 97 | var packed = new Buffer('00' + rnd + '00112233', 'hex'); 98 | 99 | packed[0] = version; 100 | 101 | var hash = crypto.createHash('sha256').update(packed.slice(0, packed.length - 4)).digest(); 102 | 103 | hash = crypto.createHash('sha256').update(hash).digest(); 104 | 105 | packed[packed.length - 4] = hash[0]; 106 | packed[packed.length - 3] = hash[1]; 107 | packed[packed.length - 2] = hash[2]; 108 | packed[packed.length - 1] = hash[3]; 109 | 110 | return base58(packed); 111 | } 112 | 113 | 114 | /** 115 | * Charlatan.Bitcoin.address() -> String 116 | * 117 | * Generate a valid bitcoin address 118 | **/ 119 | exports.address = function () { 120 | return addressFor('main', crypto.randomBytes(20).toString('hex')); 121 | }; 122 | 123 | 124 | /** 125 | * Charlatan.Bitcoin.testnetAddress() -> String 126 | * 127 | * Generate a valid bitcoin address for testnet block chain 128 | **/ 129 | exports.testnetAddress = function () { 130 | return addressFor('testnet', crypto.randomBytes(20).toString('hex')); 131 | }; 132 | 133 | 134 | // exported for tests 135 | exports._divide = divide; 136 | exports._base58 = base58; 137 | exports._addressFor = addressFor; 138 | -------------------------------------------------------------------------------- /test/test_internet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /* eslint-disable no-loop-func */ 4 | 5 | require('./_utils'); 6 | 7 | var assert = require('assert'); 8 | var tester = require('../').Internet; 9 | 10 | describe('Internet', function () { 11 | it('email', function () { 12 | assert(tester.email().match(/.+@.+\.\w+/)); 13 | }); 14 | 15 | it('free_email', function () { 16 | assert(tester.freeEmail().match(/.+@(gmail|hotmail|yahoo)\.com/)); 17 | }); 18 | 19 | it('safe_email', function () { 20 | assert(tester.safeEmail().match(/.+@example.(com|net|org)/)); 21 | }); 22 | 23 | it('user_name', function () { 24 | assert(tester.userName().match(/[a-z]+((_|\.)[a-z]+)?/)); 25 | }); 26 | 27 | it('user_name_with_string_arg', function () { 28 | assert(tester.userName('bo peep').match(/(bo(_|\.)peep|peep(_|\.)bo)/)); 29 | }); 30 | 31 | it('user_name_with_integer_arg', function () { 32 | for (var i = 0; i < 32; i++) { 33 | assert(tester.userName(i).length >= i); 34 | } 35 | }); 36 | 37 | it('password', function () { 38 | assert(tester.password().match(/\w{3}/)); 39 | }); 40 | 41 | it('password_with_integer_arg', function () { 42 | for (var i = 0; i < 32; i++) { 43 | assert(tester.password(i).length >= i); 44 | } 45 | }); 46 | 47 | it('password_max_with_integer_arg', function () { 48 | for (var i = 0; i < 32; i++) { 49 | var j = i + 4; 50 | 51 | assert(tester.password(i, j).length <= j); 52 | } 53 | }); 54 | 55 | it('domain_name', function () { 56 | assert(tester.domainName().match(/\w+\.\w+/)); 57 | }); 58 | 59 | it('domain_word', function () { 60 | assert(tester.domainWord().match(/^\w+$/)); 61 | }); 62 | 63 | it('domain_suffix', function () { 64 | assert(tester.domainSuffix().match(/^\w+(\.\w+)?/)); 65 | }); 66 | 67 | it('ip_v4_address', function () { 68 | /* eslint-disable new-cap */ 69 | assert.equal(4, tester.IPv4().split('.').length); 70 | 71 | var max = 0; 72 | 73 | for (var i = 0; i < 1000; i++) { 74 | tester.IPv4().split('.').forEach(function (h) { 75 | max = Math.max(parseInt(h, 10), max); 76 | }); 77 | } 78 | 79 | assert(max <= 255); 80 | }); 81 | 82 | it('mac_address', function () { 83 | assert.equal(6, tester.macAddress().split(':').length); 84 | assert.equal(6, tester.macAddress('').split(':').length); 85 | 86 | var max = 0; 87 | 88 | for (var i = 0; i < 1000; i++) { 89 | tester.macAddress().split(':').forEach(function (h) { 90 | max = Math.max(parseInt(h, 16), max); 91 | }); 92 | } 93 | 94 | assert(max <= 255); 95 | 96 | assert.equal(0, tester.macAddress('fa:fa:fa').indexOf('fa:fa:fa')); 97 | assert.equal(0, tester.macAddress('01:02').indexOf('01:02')); 98 | }); 99 | 100 | it('ip_v6_address', function () { 101 | assert.equal(8, tester.IPv6().split(':').length); 102 | 103 | var max = 0; 104 | 105 | for (var i = 0; i < 1000; i++) { 106 | tester.IPv6().split(':').forEach(function (h) { 107 | max = Math.max(parseInt(h, 16), max); 108 | }); 109 | } 110 | 111 | assert(max <= 65535); 112 | }); 113 | 114 | it('slug', function () { 115 | assert(tester.slug().match(/^[a-z]+(_|\.|\-)[a-z]+$/)); 116 | }); 117 | 118 | it('slug_with_content_arg', function () { 119 | assert(tester.slug('Foo bAr baZ').match(/^foo(_|\.|\-)bar(_|\.|\-)baz$/)); 120 | }); 121 | 122 | it('slug_with_glue_arg', function () { 123 | assert(tester.slug(null, '+').match(/^[a-z]+\+[a-z]+$/)); 124 | }); 125 | 126 | it('url', function () { 127 | assert(tester.url('domain.com', '/username').match(/^http:\/\/domain\.com\/username$/)); 128 | }); 129 | 130 | it('device_token', function () { 131 | assert.equal(64, tester.deviceToken().length); 132 | }); 133 | }); 134 | -------------------------------------------------------------------------------- /lib/locales/zh-TW.yml: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | zh-TW: 3 | faker: 4 | address: 5 | city_prefix: [新, 竹, 竹, 新, 關, 峨, 寶, 北, 橫, 芎, 湖, 新, 尖, 五, 苗, 苗, 通, 苑, 竹, 頭, 後, 卓, 西, 頭, 公, 銅, 三, 造, 三, 南, 大, 獅, 泰, 彰, 彰, 員, 和, 鹿, 溪, 二, 田, 北, 花, 芬, 大, 永, 伸, 線, 福, 秀, 埔, 埔, 大, 芳, 竹, 社, 二, 田, 埤, 溪, 南, 南, 埔, 草, 竹, 集, 名, 鹿, 中, 魚, 國, 水, 信, 仁, 雲, 斗, 斗, 虎, 西, 土, 北, 莿, 林, 古, 大, 崙, 二, 麥, 臺, 東, 褒, 四, 口, 水, 元, 嘉, 太, 朴, 布, 大, 民, 溪, 新, 六, 東, 義, 鹿, 水, 中, 竹, 梅, 番, 大, 阿, 屏, 屏, 潮, 東, 恆, 萬, 長, 麟, 九, 里, 鹽, 高, 萬, 內, 竹, 新, 枋, 新, 崁, 林, 南, 佳, 琉, 車, 滿, 枋, 霧, 瑪, 泰, 來, 春, 獅, 牡, 三, 宜, 宜, 羅, 蘇, 頭, 礁, 壯, 員, 冬, 五, 三, 大, 南, 花, 花, 鳳, 玉, 新, 吉, 壽, 秀, 光, 豐, 瑞, 萬, 富, 卓, 臺, 臺, 成, 關, 長, 海, 池, 東, 鹿, 延, 卑, 金, 大, 達, 綠, 蘭, 太, 澎, 馬, 湖, 白, 西, 望, 七, 金, 金, 金, 金, 金, 烈, 烏, 連, 南, 北, 莒, 東] 6 | city_suffix: [竹縣, 北市, 東鎮, 埔鎮, 西鎮, 眉鄉, 山鄉, 埔鄉, 山鄉, 林鄉, 口鄉, 豐鄉, 石鄉, 峰鄉, 栗縣, 栗市, 霄鎮, 裡鎮, 南鎮, 份鎮, 龍鎮, 蘭鎮, 湖鄉, 屋鄉, 館鄉, 鑼鄉, 義鄉, 橋鄉, 灣鄉, 庄鄉, 湖鄉, 潭鄉, 安鄉, 化縣, 化市, 林鎮, 美鎮, 港鎮, 湖鎮, 林鎮, 中鎮, 斗鎮, 壇鄉, 園鄉, 村鄉, 靖鄉, 港鄉, 西鄉, 興鄉, 水鄉, 心鄉, 鹽鄉, 城鄉, 苑鄉, 塘鄉, 頭鄉, 水鄉, 尾鄉, 頭鄉, 州鄉, 投縣, 投市, 里鎮, 屯鎮, 山鎮, 集鎮, 間鄉, 谷鄉, 寮鄉, 池鄉, 姓鄉, 里鄉, 義鄉, 愛鄉, 林縣, 六市, 南鎮, 尾鎮, 螺鎮, 庫鎮, 港鎮, 桐鄉, 內鄉, 坑鄉, 埤鄉, 背鄉, 崙鄉, 寮鄉, 西鄉, 勢鄉, 忠鄉, 湖鄉, 湖鄉, 林鄉, 長鄉, 義縣, 保市, 子市, 袋鎮, 林鎮, 雄鄉, 口鄉, 港鄉, 腳鄉, 石鄉, 竹鄉, 草鄉, 上鄉, 埔鄉, 崎鄉, 山鄉, 路鄉, 埔鄉, 里山鄉, 東縣, 東市, 州鎮, 港鎮, 春鎮, 丹鄉, 治鄉, 洛鄉, 如鄉, 港鄉, 埔鄉, 樹鄉, 巒鄉, 埔鄉, 田鄉, 埤鄉, 寮鄉, 園鄉, 頂鄉, 邊鄉, 州鄉, 冬鄉, 球鄉, 城鄉, 州鄉, 山鄉, 台鄉, 家鄉, 武鄉, 義鄉, 日鄉, 子鄉, 丹鄉, 地門鄉, 蘭縣, 蘭市, 東鎮, 澳鎮, 城鎮, 溪鄉, 圍鄉, 山鄉, 山鄉, 結鄉, 星鄉, 同鄉, 澳鄉, 蓮縣, 蓮市, 林鎮, 里鎮, 城鄉, 安鄉, 豐鄉, 林鄉, 復鄉, 濱鄉, 穗鄉, 榮鄉, 里鄉, 溪鄉, 東縣, 東市, 功鎮, 山鎮, 濱鄉, 端鄉, 上鄉, 河鄉, 野鄉, 平鄉, 南鄉, 峰鄉, 武鄉, 仁鄉, 島鄉, 嶼鄉, 麻里鄉, 湖縣, 公市, 西鄉, 沙鄉, 嶼鄉, 安鄉, 美鄉, 門縣, 城鎮, 湖鎮, 沙鎮, 寧鄉, 嶼鄉, 坵鄉, 江縣, 竿鄉, 竿鄉, 光鄉, 引鄉] 7 | building_number: ['###', '##', '#'] 8 | street_suffix: [大道, 路, 街, 巷, 弄, 衖] 9 | postcode: ['#####'] 10 | state: [臺北市, 新北市, 桃園市, 臺中市, 臺南市, 高雄市, 基隆市, 新竹市, 嘉義市, 新竹縣, 竹北市, 苗栗縣, 苗栗市, 彰化縣, 彰化市, 南投縣, 南投市, 雲林縣, 斗六市, 嘉義縣, 太保市, 屏東縣, 屏東市, 宜蘭縣, 宜蘭市, 臺東縣, 臺東市, 澎湖縣, 金門縣, 連江縣] 11 | state_abbr: [北, 桃, 竹, 苗, 中, 彰, 雲, 嘉, 南, 高, 屏, 東, 花, 宜, 基] 12 | city: 13 | - "#{city_prefix}#{city_suffix}" 14 | street_name: 15 | - "#{Name.last_name}#{street_suffix}" 16 | street_address: 17 | - "#{street_name} #{building_number} 號" 18 | default_country: [台灣] 19 | 20 | 21 | name: 22 | last_name: [趙, 錢, 孫, 李, 周, 吳, 鄭, 王, 馮, 陳, 褚, 衛, 蔣, 沈, 韓, 楊, 朱, 秦, 尤, 許, 何, 呂, 施, 張, 孔, 曹, 嚴, 華, 金, 魏, 陶, 薑, 戚, 謝, 鄒, 喻, 柏, 水, 竇, 章, 雲, 蘇, 潘, 葛, 奚, 範, 彭, 郎, 魯, 韋, 昌, 馬, 苗, 鳳, 花, 方, 俞, 任, 袁, 柳, 酆, 鮑, 史, 唐, 費, 廉, 岑, 薛, 雷, 賀, 倪, 湯, 滕, 殷, 羅, 畢, 郝, 鄔, 安, 常, 樂, 於, 時, 傅, 皮, 卞, 齊, 康, 伍, 餘, 元, 蔔, 顧, 孟, 平, 黃, 和, 穆, 蕭, 尹, 姚, 邵, 湛, 汪, 祁, 毛, 禹, 狄, 米, 貝, 明, 臧, 計, 伏, 成, 戴, 談, 宋, 茅, 龐, 熊, 紀, 舒, 屈, 項, 祝, 董, 梁, 杜, 阮, 藍, 閔, 席, 季, 麻, 強, 賈, 路, 婁, 危, 江, 童, 顏, 郭, 梅, 盛, 林, 刁, 鍾, 徐, 邱, 駱, 高, 夏, 蔡, 田, 樊, 胡, 淩, 霍, 虞, 萬, 支, 柯, 昝, 管, 盧, 莫, 柯, 房, 裘, 繆, 幹, 解, 應, 宗, 丁, 宣, 賁, 鄧, 鬱, 單, 杭, 洪, 包, 諸, 左, 石, 崔, 吉, 鈕, 龔, 程, 嵇, 邢, 滑, 裴, 陸, 榮, 翁, 荀, 羊, 于, 惠, 甄, 曲, 家, 封, 芮, 羿, 儲, 靳, 汲, 邴, 糜, 松, 井, 段, 富, 巫, 烏, 焦, 巴, 弓, 牧, 隗, 山, 穀, 車, 侯, 宓, 蓬, 全, 郗, 班, 仰, 秋, 仲, 伊, 宮, 甯, 仇, 欒, 暴, 甘, 鈄, 曆, 戎, 祖, 武, 符, 劉, 景, 詹, 束, 龍, 葉, 幸, 司, 韶, 郜, 黎, 薊, 溥, 印, 宿, 白, 懷, 蒲, 邰, 從, 鄂, 索, 鹹, 籍, 賴, 卓, 藺, 屠, 蒙, 池, 喬, 陽, 鬱, 胥, 能, 蒼, 雙, 聞, 莘, 党, 翟, 譚, 貢, 勞, 逄, 姬, 申, 扶, 堵, 冉, 宰, 酈, 雍, 卻, 璩, 桑, 桂, 濮, 牛, 壽, 通, 邊, 扈, 燕, 冀, 浦, 尚, 農, 溫, 別, 莊, 晏, 柴, 瞿, 閻, 充, 慕, 連, 茹, 習, 宦, 艾, 魚, 容, 向, 古, 易, 慎, 戈, 廖, 庾, 終, 暨, 居, 衡, 步, 都, 耿, 滿, 弘, 匡, 國, 文, 寇, 廣, 祿, 闕, 東, 歐, 殳, 沃, 利, 蔚, 越, 夔, 隆, 師, 鞏, 厙, 聶, 晁, 勾, 敖, 融, 冷, 訾, 辛, 闞, 那, 簡, 饒, 空, 曾, 毋, 沙, 乜, 養, 鞠, 須, 豐, 巢, 關, 蒯, 相, 查, 後, 荊, 紅, 遊, 竺, 權, 逮, 盍, 益, 桓, 公, 萬俟, 司馬, 上官, 歐陽, 夏侯, 諸葛, 聞人, 東方, 赫連, 皇甫, 尉遲, 公羊, 澹台, 公冶, 宗政, 濮陽, 淳于, 單於, 太叔, 申屠, 公孫, 仲孫, 軒轅, 令狐, 徐離, 宇文, 長孫, 慕容, 司徒, 司空] 23 | first_name: [怡君, 欣怡, 雅雯, 心怡, 志豪, 雅婷, 雅惠, 家豪, 雅玲, 靜怡, 志偉, 俊宏, 建宏, 佩君, 怡婷, 淑芬, 靜宜, 俊傑, 怡如, 家銘, 佳玲, 慧君, 怡伶, 雅芳, 宗翰, 志宏, 淑娟, 信宏, 志強, 淑婷, 佩珊, 佳慧, 佳蓉, 佳穎, 淑惠, 智偉, 欣儀, 嘉玲, 雅慧, 惠雯, 玉婷, 惠如, 惠君, 宜芳, 惠婷, 淑華, 志明, 雅芬, 家榮, 俊賢, 俊豪, 慧玲, 嘉宏, 佩芬, 佳樺, 雅琪, 淑萍, 淑君, 婉婷, 佳琪, 韻如, 詩婷, 建良, 芳儀, 宜君, 佩蓉, 志銘, 雅鈴, 建文, 佩玲, 鈺婷, 雅萍, 立偉, 文傑, 慧如, 淑慧, 佳宏, 志遠, 靜儀, 惠玲, 淑玲, 美君, 怡慧, 千慧, 馨儀, 嘉慧, 家瑋, 美慧, 美玲, 建志, 宗憲, 筱婷, 靜雯, 雅君, 彥廷, 怡靜, 玉玲, 郁婷, 俊男] 24 | name: 25 | - "#{last_name}#{first_name}" 26 | phone_number: 27 | formats: ['###-########', '####-########', '###########'] 28 | -------------------------------------------------------------------------------- /lib/charlatan/address.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Address 5 | **/ 6 | 7 | 8 | var Charlatan = require('../charlatan'); 9 | 10 | 11 | /** 12 | * Charlatan.Address.zipCode([stateAbbr]) -> String 13 | * - state_abbr(String): use postcode ranges only for specified US state 14 | * 15 | * Generate zip code. 16 | **/ 17 | /** alias of: Charlatan.Address.zipCode 18 | * Charlatan.Address.postcode() -> String 19 | **/ 20 | /** alias of: Charlatan.Address.zipCode 21 | * Charlatan.Address.zip() -> String 22 | **/ 23 | exports.postcode = exports.zip = exports.zipCode = function (state_abbr) { 24 | if (!state_abbr) { 25 | return Charlatan.bothify(Charlatan.fetch('address.postcode')); 26 | } 27 | 28 | return Charlatan.bothify(Charlatan.fetch('address.postcode_by_state.' + state_abbr)); 29 | }; 30 | 31 | 32 | /** 33 | * Charlatan.Address.city() -> String 34 | * 35 | * Generate city name. For example 'Port Marianashire' 36 | **/ 37 | exports.city = function () { 38 | return Charlatan.parse('address.city'); 39 | }; 40 | 41 | 42 | /** 43 | * Charlatan.Address.streetName() -> String 44 | * 45 | * Generate street name. For example 'Schuster borough' 46 | **/ 47 | exports.streetName = function () { 48 | return Charlatan.parse('address.street_name'); 49 | }; 50 | 51 | 52 | /** 53 | * Charlatan.Address.streetAddress(include_secondary = false) -> String 54 | * - include_secondary(Boolean): add apartment/suite part 55 | * 56 | * Generate street address. For example 'Schuster borough' 57 | **/ 58 | exports.streetAddress = function (include_secondary) { 59 | return Charlatan.numerify(Charlatan.parse('address.street_address') + 60 | (include_secondary ? ' ' + exports.secondaryAddress() : '')); 61 | }; 62 | 63 | 64 | /** 65 | * Charlatan.Address.secondaryAddress() -> String 66 | * 67 | * Generate secodary address part Apt/Suite. 68 | **/ 69 | exports.secondaryAddress = function () { 70 | return Charlatan.numerify(Charlatan.fetch('address.secondary_address')); 71 | }; 72 | 73 | 74 | /** 75 | * Charlatan.Address.buildingNumber() -> String 76 | * 77 | * Generate building number. 78 | **/ 79 | exports.buildingNumber = function () { 80 | return Charlatan.bothify(Charlatan.fetch('address.building_number')); 81 | }; 82 | 83 | 84 | /** 85 | * Charlatan.Address.timeZone() -> String 86 | * 87 | * Return random timeZone. 88 | **/ 89 | exports.timeZone = function () { 90 | return Charlatan.fetch('address.time_zone'); 91 | }; 92 | 93 | 94 | /** 95 | * Charlatan.Address.streetSuffix() -> String 96 | * 97 | * Return random street suffix. 98 | **/ 99 | exports.streetSuffix = function () { 100 | return Charlatan.fetch('address.street_suffix'); 101 | }; 102 | 103 | 104 | /** 105 | * Charlatan.Address.citySuffix() -> String 106 | * 107 | * Return random city suffix. 108 | **/ 109 | exports.citySuffix = function () { 110 | return Charlatan.fetch('address.city_suffix'); 111 | }; 112 | 113 | 114 | /** 115 | * Charlatan.Address.cityPrefix() -> String 116 | * 117 | * Return random city prefix. 118 | **/ 119 | exports.cityPrefix = function () { 120 | return Charlatan.fetch('address.city_prefix'); 121 | }; 122 | 123 | 124 | /** 125 | * Charlatan.Address.stateAbbr() -> String 126 | * 127 | * Return random state abbreviation. 128 | **/ 129 | exports.stateAbbr = function () { 130 | return Charlatan.fetch('address.state_abbr'); 131 | }; 132 | 133 | 134 | /** 135 | * Charlatan.Address.state() -> String 136 | * 137 | * Return random state name. 138 | **/ 139 | exports.state = function () { 140 | return Charlatan.fetch('address.state'); 141 | }; 142 | 143 | 144 | 145 | /** 146 | * Charlatan.Address.country() -> String 147 | * 148 | * Return random country. 149 | **/ 150 | exports.country = function () { 151 | return Charlatan.fetch('address.country'); 152 | }; 153 | 154 | 155 | /** 156 | * Charlatan.Address.countryCode() -> String 157 | * 158 | * Return random country code. 159 | **/ 160 | exports.countryCode = function () { 161 | return Charlatan.fetch('address.country_code'); 162 | }; 163 | 164 | 165 | /** 166 | * Charlatan.Address.latitude() -> string 167 | * 168 | * Generate latitude 169 | **/ 170 | exports.latitude = function () { 171 | return ((Math.random() * 180) - 90).toString(); 172 | }; 173 | 174 | 175 | /** 176 | * Charlatan.Address.longitude() ->string 177 | * 178 | * Generate longitude 179 | **/ 180 | exports.longitude = function () { 181 | return ((Math.random() * 360) - 180).toString(); 182 | }; 183 | -------------------------------------------------------------------------------- /lib/locales/en-AU.yml: -------------------------------------------------------------------------------- 1 | # Australia formatted data types 2 | # Using Top 200 Australian baby names of 2010 3 | # 286 Surnames familiar to Australian population 4 | 5 | en-AU: 6 | faker: 7 | name: 8 | first_name: [William, Jack, Oliver, Joshua, Thomas, Lachlan, Cooper, Noah, Ethan, Lucas, James, Samuel, Jacob, Liam, Alexander, Benjamin, Max, Isaac, Daniel, Riley, Ryan, Charlie, Tyler, Jake, Matthew, Xavier, Harry, Jayden, Nicholas, Harrison, Levi, Luke, Adam, Henry, Aiden, Dylan, Oscar, Michael, Jackson, Logan, Joseph, Blake, Nathan, Connor, Elijah, Nate, Archie, Bailey, Marcus, Cameron, Jordan, Zachary, Caleb, Hunter, Ashton, Toby, Aidan, Hayden, Mason, Hamish, Edward, Angus, Eli, Sebastian, Christian, Patrick, Andrew, Anthony, Luca, Kai, Beau, Alex, George, Callum, Finn, Zac, Mitchell, Jett, Jesse, Gabriel, Leo, Declan, Charles, Jasper, Jonathan, Aaron, Hugo, David, Christopher, Chase, Owen, Justin, Ali, Darcy, Lincoln, Cody, Phoenix, Sam, John, Joel, Isabella, Ruby, Chloe, Olivia, Charlotte, Mia, Lily, Emily, Ella, Sienna, Sophie, Amelia, Grace, Ava, Zoe, Emma, Sophia, Matilda, Hannah, Jessica, Lucy, Georgia, Sarah, Abigail, Zara, Eva, Scarlett, Jasmine, Chelsea, Lilly, Ivy, Isla, Evie, Isabelle, Maddison, Layla, Summer, Annabelle, Alexis, Elizabeth, Bella, Holly, Lara, Madison, Alyssa, Maya, Tahlia, Claire, Hayley, Imogen, Jade, Ellie, Sofia, Addison, Molly, Phoebe, Alice, Savannah, Gabriella, Kayla, Mikayla, Abbey, Eliza, Willow, Alexandra, Poppy, Samantha, Stella, Amy, Amelie, Anna, Piper, Gemma, Isabel, Victoria, Stephanie, Caitlin, Heidi, Paige, Rose, Amber, Audrey, Claudia, Taylor, Madeline, Angelina, Natalie, Charli, Lauren, Ashley, Violet, Mackenzie, Abby, Skye, Lillian, Alana, Lola, Leah, Eve, Kiara] 9 | last_name: [Smith, Jones, Williams, Brown, Wilson, Taylor, Johnson, White, Martin, Anderson, Thompson, Nguyen, Thomas, Walker, Harris, Lee, Ryan, Robinson, Kelly, King, Davis, Wright, Evans, Roberts, Green, Hall, Wood, Jackson, Clarke, Patel, Khan, Lewis, James, Phillips, Mason, Mitchell, Rose, Davies, Rodriguez, Cox, Alexander, Garden, Campbell, Johnston, Moore, Smyth, O'neill, Doherty, Stewart, Quinn, Murphy, Graham, Mclaughlin, Hamilton, Murray, Hughes, Robertson, Thomson, Scott, Macdonald, Reid, Clark, Ross, Young, Watson, Paterson, Morrison, Morgan, Griffiths, Edwards, Rees, Jenkins, Owen, Price, Moss, Richards, Abbott, Adams, Armstrong, Bahringer, Bailey, Barrows, Bartell, Bartoletti, Barton, Bauch, Baumbach, Bayer, Beahan, Beatty, Becker, Beier, Berge, Bergstrom, Bode, Bogan, Borer, Bosco, Botsford, Boyer, Boyle, Braun, Bruen, Carroll, Carter, Cartwright, Casper, Cassin, Champlin, Christiansen, Cole, Collier, Collins, Connelly, Conroy, Corkery, Cormier, Corwin, Cronin, Crooks, Cruickshank, Cummings, D'amore, Daniel, Dare, Daugherty, Dickens, Dickinson, Dietrich, Donnelly, Dooley, Douglas, Doyle, Durgan, Ebert, Emard, Emmerich, Erdman, Ernser, Fadel, Fahey, Farrell, Fay, Feeney, Feil, Ferry, Fisher, Flatley, Gibson, Gleason, Glover, Goldner, Goodwin, Grady, Grant, Greenfelder, Greenholt, Grimes, Gutmann, Hackett, Hahn, Haley, Hammes, Hand, Hane, Hansen, Harber, Hartmann, Harvey, Hayes, Heaney, Heathcote, Heller, Hermann, Hermiston, Hessel, Hettinger, Hickle, Hill, Hills, Hoppe, Howe, Howell, Hudson, Huel, Hyatt, Jacobi, Jacobs, Jacobson, Jerde, Johns, Keeling, Kemmer, Kessler, Kiehn, Kirlin, Klein, Koch, Koelpin, Kohler, Koss, Kovacek, Kreiger, Kris, Kuhlman, Kuhn, Kulas, Kunde, Kutch, Lakin, Lang, Langworth, Larkin, Larson, Leannon, Leffler, Little, Lockman, Lowe, Lynch, Mann, Marks, Marvin, Mayer, Mccullough, Mcdermott, Mckenzie, Miller, Mills, Monahan, Morissette, Mueller, Muller, Nader, Nicolas, Nolan, O'connell, O'conner, O'hara, O'keefe, Olson, O'reilly, Parisian, Parker, Quigley, Reilly, Reynolds, Rice, Ritchie, Rohan, Rolfson, Rowe, Russel, Rutherford, Sanford, Sauer, Schmidt, Schmitt, Schneider, Schroeder, Schultz, Shields, Smitham, Spencer, Stanton, Stark, Stokes, Swift, Tillman, Towne, Tremblay, Tromp, Turcotte, Turner, Walsh, Walter, Ward, Waters, Weber, Welch, West, Wilderman, Wilkinson, Williamson, Windler, Wolf] 10 | company: 11 | suffix: [Pty Ltd, and Sons, Corp, Group, Brothers, Partners] 12 | internet: 13 | domain_suffix: [com.au, com, net.au, net, org.au, org] 14 | address: 15 | state_abbr: [NSW, QLD, NT, SA, WA, TAS, ACT, VIC] 16 | state: [New South Wales, Queensland, Northern Territory, South Australia, Western Australia, Tasmania, Australian Capital Territory, Victoria] 17 | postcode: ['0###', '2###', '3###', '4###', '5###', '6###', '7###'] 18 | building_number: ['####', '###', '##'] 19 | street_suffix: [Avenue, Boulevard, Circle, Circuit, Court, Crescent, Crest, Drive, Estate Dr, Grove, Hill, Island, Junction, Knoll, Lane, Loop, Mall, Manor, Meadow, Mews, Parade, Parkway, Pass, Place, Plaza, Ridge, Road, Run, Square, Station St, Street, Summit, Terrace, Track, Trail, View Rd, Way] 20 | default_country: [Australia] 21 | phone_number: 22 | formats: ['0# #### ####', '+61 # #### ####', '04## ### ###', '+61 4## ### ###'] #iOS AUS phone formats 23 | -------------------------------------------------------------------------------- /.eslintrc.yml: -------------------------------------------------------------------------------- 1 | env: 2 | node: true 3 | browser: false 4 | es6: false 5 | 6 | rules: 7 | accessor-pairs: 2 8 | array-bracket-spacing: [ 2, "always", { "singleValue": true, "objectsInArrays": true, "arraysInArrays": true } ] 9 | block-scoped-var: 2 10 | block-spacing: 2 11 | brace-style: [ 2, '1tbs', { allowSingleLine: true } ] 12 | # Postponed 13 | callback-return: 2 14 | comma-dangle: 2 15 | comma-spacing: 2 16 | comma-style: 2 17 | computed-property-spacing: [ 2, never ] 18 | consistent-this: [ 2, self ] 19 | consistent-return: 2 20 | # ? change to multi 21 | curly: [ 2, 'multi-line' ] 22 | dot-notation: 2 23 | eol-last: 2 24 | eqeqeq: 2 25 | func-style: [ 2, declaration ] 26 | # Postponed 27 | global-require: 2 28 | guard-for-in: 2 29 | handle-callback-err: 2 30 | 31 | indent: [ 2, 2, { VariableDeclarator: { var: 2, let: 2, const: 3 }, SwitchCase: 1 } ] 32 | 33 | # key-spacing: [ 2, { "align": "value" } ] 34 | keyword-spacing: 2 35 | linebreak-style: 2 36 | max-depth: [ 1, 6 ] 37 | max-nested-callbacks: [ 1, 4 ] 38 | # string can exceed 80 chars, but should not overflow github website :) 39 | max-len: [ 2, 120, 1000 ] 40 | new-cap: 2 41 | new-parens: 2 42 | # Postponed 43 | newline-after-var: 2 44 | no-alert: 2 45 | no-array-constructor: 2 46 | no-bitwise: 2 47 | no-caller: 2 48 | no-case-declarations: 2 49 | no-catch-shadow: 2 50 | no-cond-assign: 2 51 | no-console: 1 52 | no-constant-condition: 2 53 | no-control-regex: 2 54 | no-debugger: 2 55 | no-delete-var: 2 56 | no-div-regex: 2 57 | no-dupe-args: 2 58 | no-dupe-keys: 2 59 | no-duplicate-case: 2 60 | no-else-return: 2 61 | # Tend to drop 62 | # no-empty: 1 63 | no-empty-character-class: 2 64 | no-empty-pattern: 2 65 | no-eq-null: 2 66 | no-eval: 2 67 | no-ex-assign: 2 68 | no-extend-native: 2 69 | no-extra-bind: 2 70 | no-extra-boolean-cast: 2 71 | no-extra-semi: 2 72 | no-fallthrough: 2 73 | no-floating-decimal: 2 74 | no-func-assign: 2 75 | # Postponed 76 | no-implicit-coercion: [2, { "boolean": true, "number": true, "string": true } ] 77 | no-implied-eval: 2 78 | no-inner-declarations: 2 79 | no-invalid-regexp: 2 80 | no-irregular-whitespace: 2 81 | no-iterator: 2 82 | no-label-var: 2 83 | no-labels: 2 84 | no-lone-blocks: 2 85 | no-lonely-if: 2 86 | no-loop-func: 2 87 | no-mixed-requires: 2 88 | no-mixed-spaces-and-tabs: 2 89 | # Postponed 90 | no-native-reassign: 2 91 | no-negated-in-lhs: 2 92 | # Postponed 93 | no-nested-ternary: 2 94 | no-new: 2 95 | no-new-func: 2 96 | no-new-object: 2 97 | no-new-require: 2 98 | no-new-wrappers: 2 99 | no-obj-calls: 2 100 | no-octal: 2 101 | no-octal-escape: 2 102 | no-path-concat: 2 103 | no-proto: 2 104 | no-redeclare: 2 105 | # Postponed 106 | no-regex-spaces: 2 107 | no-return-assign: 2 108 | no-self-compare: 2 109 | no-sequences: 2 110 | no-shadow: 2 111 | no-shadow-restricted-names: 2 112 | no-sparse-arrays: 2 113 | no-trailing-spaces: 2 114 | no-undef: 2 115 | no-undef-init: 2 116 | no-undefined: 2 117 | no-unexpected-multiline: 2 118 | no-unreachable: 2 119 | no-unused-expressions: 2 120 | no-unused-vars: 2 121 | no-use-before-define: 2 122 | #no-void: 2 123 | no-with: 2 124 | object-curly-spacing: [ 2, always, { "objectsInObjects": true, "arraysInObjects": true } ] 125 | operator-assignment: 1 126 | # Postponed 127 | operator-linebreak: [ 2, after ] 128 | semi: 2 129 | semi-spacing: 2 130 | space-before-function-paren: [ 2, { "anonymous": "always", "named": "never" } ] 131 | space-in-parens: [ 2, never ] 132 | space-infix-ops: 2 133 | space-unary-ops: 2 134 | # Postponed 135 | spaced-comment: [ 1, always, { exceptions: [ '/', '=' ] } ] 136 | strict: [ 2, global ] 137 | quotes: [ 2, single, avoid-escape ] 138 | quote-props: [ 1, 'as-needed', { "keywords": true } ] 139 | radix: 2 140 | use-isnan: 2 141 | valid-typeof: 2 142 | yoda: [ 2, never, { "exceptRange": true } ] 143 | -------------------------------------------------------------------------------- /lib/locales/vi.yml: -------------------------------------------------------------------------------- 1 | # encoding: UTF-8 2 | vi: 3 | faker: 4 | address: 5 | city_root: ["Bắc Giang", "Bắc Kạn", "Bắc Ninh", "Cao Bằng", "Điện Biên", "Hà Giang", "Hà Nam", "Hà Tây", 6 | "Hải Dương", "TP Hải Phòng", "Hòa Bình", "Hưng Yên", "Lai Châu", "Lào Cai", "Lạng Sơn", "Nam Định", 7 | "Ninh Bình", "Phú Thọ", "Quảng Ninh", "Sơn La", "Thái Bình", "Thái Nguyên", "Tuyên Quang", "Vĩnh Phúc", 8 | "Yên Bái", "TP Đà Nẵng", "Bình Định", "Đắk Lắk", "Đắk Nông", "Gia Lai", "Hà Tĩnh", "Khánh Hòa", "Kon Tum", 9 | "Nghệ An", "Phú Yên", "Quảng Bình", "Quảng Nam", "Quảng Ngãi", "Quảng Trị", "Thanh Hóa", "Thừa Thiên Huế", 10 | "TP TP. Hồ Chí Minh", "An Giang", "Bà Rịa Vũng Tàu", "Bạc Liêu", "Bến Tre", "Bình Dương", "Bình Phước", 11 | "Bình Thuận", "Cà Mau", "TP Cần Thơ", "Đồng Nai", "Đồng Tháp", "Hậu Giang", "Kiên Giang", "Lâm Đồng", 12 | "Long An", "Ninh Thuận", "Sóc Trăng", "Tây Ninh", "Tiền Giang", "Trà Vinh", "Vĩnh Long"] 13 | city: 14 | - "#{city_root}" 15 | postcode: /[A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}/ 16 | county: ["Avon", "Bedfordshire", "Berkshire", "Borders", "Buckinghamshire", "Cambridgeshire", "Central", 17 | "Cheshire", "Cleveland", "Clwyd", "Cornwall", "County Antrim", "County Armagh", "County Down", 18 | "County Fermanagh", "County Londonderry", "County Tyrone", "Cumbria", "Derbyshire", "Devon", 19 | "Dorset", "Dumfries and Galloway", "Durham", "Dyfed", "East Sussex", "Essex", "Fife", "Gloucestershire", 20 | "Grampian", "Greater Manchester", "Gwent", "Gwynedd County", "Hampshire", "Herefordshire", "Hertfordshire", 21 | "Highlands and Islands", "Humberside", "Isle of Wight", "Kent", "Lancashire", "Leicestershire", "Lincolnshire", 22 | "Lothian", "Merseyside", "Mid Glamorgan", "Norfolk", "North Yorkshire", "Northamptonshire", "Northumberland", 23 | "Nottinghamshire", "Oxfordshire", "Powys", "Rutland", "Shropshire", "Somerset", "South Glamorgan", "South Yorkshire", 24 | "Staffordshire", "Strathclyde", "Suffolk", "Surrey", "Tayside", "Tyne and Wear", "Việt Nam", "Warwickshire", 25 | "West Glamorgan", "West Midlands", "West Sussex", "West Yorkshire", "Wiltshire", "Worcestershire"] 26 | default_country: ["Việt Nam"] 27 | internet: 28 | domain_suffix: [com, net, info, vn, com.vn] 29 | phone_number: 30 | formats: ['01#### #####', '01### ######', '01#1 ### ####', '011# ### ####', '02# #### ####', '03## ### ####', '055 #### ####', '056 #### ####', '0800 ### ####', '08## ### ####', '09## ### ####', '016977 ####', '01### #####', '0500 ######', '0800 ######'] 31 | cell_phone: 32 | formats: ['074## ######', '075## ######', '076## ######', '077## ######', '078## ######', '079## ######'] 33 | name: 34 | first_name: ["Phạm", "Nguyễn", "Trần", "Lê", "Lý", "Hoàng", "Phan", "Vũ", "Tăng", 35 | "Đặng", "Bùi", "Đỗ", "Hồ", "Ngô", "Dương", "Đào", "Đoàn", "Vương", 36 | "Trịnh", "Đinh", "Lâm", "Phùng", "Mai", "Tô", "Trương", "Hà"] 37 | last_name: ["Nam", "Trung", "Thanh", "Thị", "Văn", "Dương", "Tăng", "Quốc", "Như", 38 | "Phạm", "Nguyễn", "Trần", "Lê", "Lý", "Hoàng", "Phan", "Vũ", "Tăng", 39 | "Đặng", "Bùi", "Đỗ", "Hồ", "Ngô", "Dương", "Đào", "Đoàn", "Vương", 40 | "Trịnh", "Đinh", "Lâm", "Phùng", "Mai", "Tô", "Trương", "Hà", 41 | "Vinh", "Nhung", "Hòa", "Tiến", "Tâm", "Bửu", "Loan", "Hiền", "Hải", 42 | "Vân", "Kha", "Minh", "Nhân", "Triệu", "Tuân", "Hữu", "Đức", "Phú", "Khoa", 43 | "Thắgn", "Sơn", "Dung", "Tú", "Trinh", "Thảo", "Sa", "Kim", "Long", "Thi", 44 | "Cường", "Ngọc", "Sinh", "Khang", "Phong", "Thắm", "Thu", "Thủy", "Nhàn"] 45 | name: 46 | - "#{first_name} #{last_name}" 47 | - "#{first_name} #{last_name} #{last_name}" 48 | - "#{first_name} #{last_name} #{last_name} #{last_name}" 49 | company: 50 | prefix: ["Công ty", "Cty TNHH", "Cty", "Cửa hàng", "Trung tâm", "Chi nhánh"] 51 | name: 52 | - "#{prefix} #{Name.last_name}" 53 | lorem: 54 | words: ["đã", "đang", "ừ", "ờ", "á", "không", "biết", "gì", "hết", "đâu", "nha", 55 | "thế", "thì", "là", "đánh", "đá", "đập", "phá", "viết", "vẽ", "tô", "thuê", 56 | "mướn", "mượn", "mua", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", 57 | "chín", "mười", "thôi", "việc", "nghỉ", "làm", "nhà", "cửa", "xe", "đạp", "ác", 58 | "độc", "khoảng", "khoan", "thuyền", "tàu", "bè", "lầu", "xanh", "đỏ", "tím", "vàng", 59 | "kim", "chỉ", "khâu", "may", "vá", "em", "anh", "yêu", "thương", "thích", "con", "cái", 60 | "bàn", "ghế", "tủ", "quần", "áo", "nón", "dép", "giày", "lỗi", "được", "ghét", "giết", 61 | "chết", "hết", "tôi", "bạn", "tui", "trời", "trăng", "mây", "gió", "máy", "hàng", "hóa", 62 | "leo", "núi", "bơi", "biển", "chìm", "xuồng", "nước", "ngọt", "ruộng", "đồng", "quê", "hương"] 63 | 64 | -------------------------------------------------------------------------------- /lib/locales/nb-NO.yml: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | nb-NO: 3 | faker: 4 | address: 5 | city_root: ["Fet", "Gjes", "Høy", "Inn", "Fager", "Lille", "Lo", "Mal", "Nord", "Nær", "Sand", "Sme", "Stav", "Stor", "Tand", "Ut", "Vest"] 6 | city_suffix: ["berg", "borg", "by", "bø", "dal", "eid", "fjell", "fjord", "foss", "grunn", "hamn", "havn", "helle", "mark", "nes", "odden", "sand", "sjøen", "stad", "strand", "strøm", "sund", "vik", "vær", "våg", "ø", "øy", "ås"] 7 | street_prefix: ["Øvre", "Nedre", "Søndre", "Gamle", "Østre", "Vestre"] 8 | street_root: ["Eike", "Bjørke", "Gran", "Vass", "Furu", "Litj", "Lille", "Høy", "Fosse", "Elve", "Ku", "Konvall", "Soldugg", "Hestemyr", "Granitt", "Hegge", "Rogne", "Fiol", "Sol", "Ting", "Malm", "Klokker", "Preste", "Dam", "Geiterygg", "Bekke", "Berg", "Kirke", "Kors", "Bru", "Blåveis", "Torg", "Sjø"] 9 | street_suffix: ["alléen", "bakken", "berget", "bråten", "eggen", "engen", "ekra", "faret", "flata", "gata", "gjerdet", "grenda", "gropa", "hagen", "haugen", "havna", "holtet", "høgda", "jordet", "kollen", "kroken", "lia", "lunden", "lyngen", "løkka", "marka", "moen", "myra", "plassen", "ringen", "roa", "røa", "skogen", "skrenten", "spranget", "stien", "stranda", "stubben", "stykket", "svingen", "tjernet", "toppen", "tunet", "vollen", "vika", "åsen"] 10 | common_street_suffix: ["sgate", "svei", "s Gate", "s Vei", "gata", "veien"] 11 | building_number: ["#", "##"] 12 | secondary_address: ['Leil. ###', 'Oppgang A', 'Oppgang B'] 13 | postcode: ["####", "####", "####", "0###"] 14 | state: [""] 15 | city: 16 | - "#{city_root}#{city_suffix}" 17 | street_name: 18 | - "#{street_root}#{street_suffix}" 19 | - "#{street_prefix} #{street_root}#{street_suffix}" 20 | - "#{Name.first_name}#{common_street_suffix}" 21 | - "#{Name.last_name}#{common_street_suffix}" 22 | street_address: 23 | - "#{street_name} #{building_number}" 24 | default_country: [Norge] 25 | 26 | company: 27 | suffix: ["Gruppen", "AS", "ASA", "BA", "RFH", "og Sønner"] 28 | name: 29 | - "#{Name.last_name} #{suffix}" 30 | - "#{Name.last_name}-#{Name.last_name}" 31 | - "#{Name.last_name}, #{Name.last_name} og #{Name.last_name}" 32 | 33 | internet: 34 | domain_suffix: ["no", "com", "net", "org"] 35 | 36 | name: 37 | first_name: ["Emma", "Sara", "Thea", "Ida", "Julie", "Nora", "Emilie", "Ingrid", "Hanna", "Maria", "Sofie", "Anna", "Malin", "Amalie", "Vilde", "Frida", "Andrea", "Tuva", "Victoria", "Mia", "Karoline", "Mathilde", "Martine", "Linnea", "Marte", "Hedda", "Marie", "Helene", "Silje", "Leah", "Maja", "Elise", "Oda", "Kristine", "Aurora", "Kaja", "Camilla", "Mari", "Maren", "Mina", "Selma", "Jenny", "Celine", "Eline", "Sunniva", "Natalie", "Tiril", "Synne", "Sandra", "Madeleine", "Markus", "Mathias", "Kristian", "Jonas", "Andreas", "Alexander", "Martin", "Sander", "Daniel", "Magnus", "Henrik", "Tobias", "Kristoffer", "Emil", "Adrian", "Sebastian", "Marius", "Elias", "Fredrik", "Thomas", "Sondre", "Benjamin", "Jakob", "Oliver", "Lucas", "Oskar", "Nikolai", "Filip", "Mats", "William", "Erik", "Simen", "Ole", "Eirik", "Isak", "Kasper", "Noah", "Lars", "Joakim", "Johannes", "Håkon", "Sindre", "Jørgen", "Herman", "Anders", "Jonathan", "Even", "Theodor", "Mikkel", "Aksel"] # duplication, unfortunately 38 | feminine_name: ["Emma", "Sara", "Thea", "Ida", "Julie", "Nora", "Emilie", "Ingrid", "Hanna", "Maria", "Sofie", "Anna", "Malin", "Amalie", "Vilde", "Frida", "Andrea", "Tuva", "Victoria", "Mia", "Karoline", "Mathilde", "Martine", "Linnea", "Marte", "Hedda", "Marie", "Helene", "Silje", "Leah", "Maja", "Elise", "Oda", "Kristine", "Aurora", "Kaja", "Camilla", "Mari", "Maren", "Mina", "Selma", "Jenny", "Celine", "Eline", "Sunniva", "Natalie", "Tiril", "Synne", "Sandra", "Madeleine"] 39 | masculine_name: ["Markus", "Mathias", "Kristian", "Jonas", "Andreas", "Alexander", "Martin", "Sander", "Daniel", "Magnus", "Henrik", "Tobias", "Kristoffer", "Emil", "Adrian", "Sebastian", "Marius", "Elias", "Fredrik", "Thomas", "Sondre", "Benjamin", "Jakob", "Oliver", "Lucas", "Oskar", "Nikolai", "Filip", "Mats", "William", "Erik", "Simen", "Ole", "Eirik", "Isak", "Kasper", "Noah", "Lars", "Joakim", "Johannes", "Håkon", "Sindre", "Jørgen", "Herman", "Anders", "Jonathan", "Even", "Theodor", "Mikkel", "Aksel"] 40 | last_name: ["Johansen", "Hansen", "Andersen", "Kristiansen", "Larsen", "Olsen", "Solberg", "Andresen", "Pedersen", "Nilsen", "Berg", "Halvorsen", "Karlsen", "Svendsen", "Jensen", "Haugen", "Martinsen", "Eriksen", "Sørensen", "Johnsen", "Myhrer", "Johannessen", "Nielsen", "Hagen", "Pettersen", "Bakke", "Skuterud", "Løken", "Gundersen", "Strand", "Jørgensen", "Kvarme", "Røed", "Sæther", "Stensrud", "Moe", "Kristoffersen", "Jakobsen", "Holm", "Aas", "Lie", "Moen", "Andreassen", "Vedvik", "Nguyen", "Jacobsen", "Torgersen", "Ruud", "Krogh", "Christiansen", "Bjerke", "Aalerud", "Borge", "Sørlie", "Berge", "Østli", "Ødegård", "Torp", "Henriksen", "Haukelidsæter", "Fjeld", "Danielsen", "Aasen", "Fredriksen", "Dahl", "Berntsen", "Arnesen", "Wold", "Thoresen", "Solheim", "Skoglund", "Bakken", "Amundsen", "Solli", "Smogeli", "Kristensen", "Glosli", "Fossum", "Evensen", "Eide", "Carlsen", "Østby", "Vegge", "Tangen", "Smedsrud", "Olstad", "Lunde", "Kleven", "Huseby", "Bjørnstad", "Ryan", "Rasmussen", "Nygård", "Nordskaug", "Nordby", "Mathisen", "Hopland", "Gran", "Finstad", "Edvardsen"] 41 | prefix: [Dr., Prof.] 42 | suffix: [Jr., Sr., I, II, III, IV, V] 43 | name: 44 | - "#{prefix} #{first_name} #{last_name}" 45 | - "#{first_name} #{last_name} #{suffix}" 46 | - "#{feminine_name} #{feminine_name} #{last_name}" 47 | - "#{masculine_name} #{masculine_name} #{last_name}" 48 | - "#{first_name} #{last_name} #{last_name}" 49 | - "#{first_name} #{last_name}" 50 | 51 | phone_number: 52 | formats: ["########", "## ## ## ##", "### ## ###", "+47 ## ## ## ##"] 53 | -------------------------------------------------------------------------------- /lib/charlatan/lorem.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Lorem 5 | **/ 6 | 7 | var Helpers = require('./helpers'); 8 | var Charlatan = require('../charlatan'); 9 | 10 | 11 | function isNotSet(variable) { 12 | return typeof variable === 'undefined' || variable === null; 13 | } 14 | 15 | 16 | /** internal 17 | * resolve(value) -> String 18 | * - value(String | Array): stuff 19 | * 20 | * If an array is passed, a random value will be selected. 21 | * All other values are simply returned. 22 | * 23 | * Note: ruby supports ranges here, we don't 24 | **/ 25 | function resolve(value) { 26 | if (Array.isArray(value)) { 27 | return Helpers.sample(value); 28 | } 29 | 30 | return value; 31 | } 32 | 33 | /** 34 | * Charlatan.Lorem.word () -> String 35 | * 36 | * Generate random word 37 | **/ 38 | exports.word = function () { 39 | return Helpers.sample(Charlatan.translate('lorem.words')); 40 | }; 41 | 42 | /** 43 | * Charlatan.Lorem.words(wordCount = 3, supplemental = false) -> Array 44 | * - wordCount(Number): number of words in output 45 | * - supplemental(Boolean): use additional words 46 | * 47 | * Generate an array of random words 48 | **/ 49 | exports.words = function (wordCount, supplemental) { 50 | 51 | if (isNotSet(wordCount)) { 52 | wordCount = 3; 53 | } 54 | 55 | var words = Charlatan.translate('lorem.words'); 56 | 57 | if (supplemental) { 58 | words = words.concat(Charlatan.translate('lorem.supplemental')); 59 | } 60 | 61 | var result = []; 62 | 63 | for (var i = 0, l = resolve(wordCount); i < l; i++) { 64 | result.push(Helpers.sample(words)); 65 | } 66 | return result; 67 | }; 68 | 69 | 70 | /** 71 | * Charlatan.Lorem.character() -> String 72 | * 73 | * Generate a character 74 | **/ 75 | exports.character = function () { 76 | return exports.characters(1); 77 | }; 78 | 79 | 80 | /** 81 | * Charlatan.Lorem.characters(charCount=255) -> String 82 | * - charCount(Integer): number of characters in result 83 | * 84 | * Generate lorem characters 85 | **/ 86 | exports.characters = function (charCount) { 87 | if (typeof charCount === 'undefined' || charCount === null) { charCount = 255; } 88 | 89 | var result = ''; 90 | 91 | for (var i = 0, l = resolve(charCount); i < l; i++) { 92 | result += Helpers.rand(36).toString(36); 93 | } 94 | 95 | return result; 96 | }; 97 | 98 | /** 99 | * Charlatan.Lorem.sentence(wordCount=4, supplemental=false, randomWordsToAdd=6) -> String 100 | * - wordCount(Integer): number of words in sentence. If null, then it's random greater than 3 101 | * - supplemental(Boolean): use additional words 102 | * - randomWordsToAdd(Integer): additional count of random words 103 | * 104 | * Generate lorem sentence 105 | **/ 106 | exports.sentence = function (wordCount, supplemental, randomWordsToAdd) { 107 | var sentence; 108 | 109 | if (isNotSet(wordCount)) { 110 | wordCount = 4; 111 | } 112 | 113 | if (isNotSet(randomWordsToAdd)) { 114 | randomWordsToAdd = 6; 115 | } 116 | 117 | sentence = exports.words(wordCount + Helpers.rand(randomWordsToAdd), supplemental).join(' ') + '.'; 118 | 119 | return Helpers.capitalize(sentence); 120 | }; 121 | 122 | 123 | /** 124 | * Charlatan.Lorem.sentences(sentenceCount=3, supplemental=false) -> Array 125 | * - sentenceCount(Number): number of sentences in output 126 | * - supplemental(Boolean): use additional words 127 | * 128 | * Generate array of lorem sentences 129 | **/ 130 | exports.sentences = function (sentenceCount, supplemental) { 131 | var sentences = []; 132 | 133 | if (isNotSet(sentenceCount)) { 134 | sentenceCount = 3; 135 | } else { 136 | sentenceCount = resolve(sentenceCount); 137 | } 138 | 139 | for (; sentenceCount > 0; sentenceCount--) { 140 | sentences.push(exports.sentence(null, supplemental)); 141 | } 142 | 143 | return sentences; 144 | }; 145 | 146 | 147 | /** 148 | * Charlatan.Lorem.paragraph(sentenceCount=3, supplemental=false, randomWordsToAdd=3) -> String 149 | * - sentenceCount(Number): number of sentences in a paragraph 150 | * - supplemental(Boolean): use additional words 151 | * - randomWordsToAdd(Integer): additional count of random words 152 | * 153 | * Generate lorem paragraph 154 | **/ 155 | exports.paragraph = function (sentenceCount, supplemental, randomSentencesToAdd) { 156 | if (isNotSet(sentenceCount)) { 157 | sentenceCount = 3; 158 | } else { 159 | sentenceCount = resolve(sentenceCount); 160 | } 161 | 162 | if (isNotSet(randomSentencesToAdd)) { 163 | randomSentencesToAdd = 3; 164 | } 165 | 166 | return exports.sentences(sentenceCount + Helpers.rand(randomSentencesToAdd), supplemental).join(' '); 167 | }; 168 | 169 | 170 | /** 171 | * Charlatan.Lorem.paragraphs(paragraphCount=3, sentenceCount=false) -> Array 172 | * - paragraphCount(Integer): number of paragraphs in the output 173 | * - supplemental(Boolean): use additional words 174 | * 175 | * Generate an array of lorem paragraphs 176 | **/ 177 | exports.paragraphs = function (paragraphCount, supplemental) { 178 | var paragraphs = []; 179 | 180 | if (isNotSet(paragraphCount)) { 181 | paragraphCount = 3; 182 | } else { 183 | paragraphCount = resolve(paragraphCount); 184 | } 185 | 186 | for (; paragraphCount > 0; paragraphCount--) { 187 | paragraphs.push(exports.paragraph(null, supplemental)); 188 | } 189 | 190 | return paragraphs; 191 | }; 192 | 193 | 194 | /** 195 | * Charlatan.Lorem.text(paragraphCount, sentenceCount, glue) -> String 196 | * - paragraphCount(integer): number of paragraphs in the output 197 | * - supplemental (boolean): use additional words 198 | * - glue (string): glue between paragraphs, `\n \r\t` by default 199 | * 200 | * Generate text 201 | **/ 202 | exports.text = function (paragraphCount, supplemental, glue) { 203 | if (isNotSet(glue)) { 204 | glue = '\n \r\t'; 205 | } 206 | 207 | return exports.paragraphs(paragraphCount, supplemental).join(glue); 208 | }; 209 | -------------------------------------------------------------------------------- /lib/locales/fa.yml: -------------------------------------------------------------------------------- 1 | fa: 2 | faker: 3 | name: 4 | first_name: [آبان دخت, آبتین, آتوسا, آفر, آفره دخت, آذرنوش‌, آذین, آراه, آرزو, آرش, آرتین, آرتام, آرتمن, آرشام, آرمان, آرمین, آرمیتا, آریا فر, آریا, آریا مهر, آرین, آزاده, آزرم, آزرمدخت, آزیتا, آناهیتا, آونگ, آهو, آیدا, اتسز, اختر, ارد, ارد شیر, اردوان, ارژن, ارژنگ, ارسلان, ارغوان, ارمغان, ارنواز, اروانه, استر, اسفندیار, اشکان, اشکبوس, افسانه, افسون, افشین, امید, انوش (‌ آنوشا ), انوشروان, اورنگ, اوژن, اوستا, اهورا, ایاز, ایران, ایراندخت, ایرج, ایزدیار, بابک, باپوک, باربد, بارمان, بامداد, بامشاد, بانو, بختیار, برانوش, بردیا, برزو, برزویه, برزین, برمک, بزرگمهر, بنفشه, بوژان, بویان, بهار, بهارک, بهاره, بهتاش, بهداد, بهرام, بهدیس, بهرخ, بهرنگ, بهروز, بهزاد, بهشاد, بهمن, بهناز, بهنام, بهنود, بهنوش, بیتا, بیژن, پارسا, پاکان, پاکتن, پاکدخت, پانته آ, پدرام, پرتو, پرشنگ, پرتو, پرستو, پرویز, پردیس, پرهام, پژمان, پژوا, پرنیا, پشنگ, پروانه, پروین, پری, پریچهر, پریدخت, پریسا, پرناز, پریوش, پریا, پوپک, پوران, پوراندخت, پوریا, پولاد, پویا, پونه, پیام, پیروز, پیمان, تابان, تاباندخت, تاجی, تارا, تاویار, ترانه, تناز, توران, توراندخت, تورج, تورتک, توفان, توژال, تیر داد, تینا, تینو, جابان, جامین, جاوید, جریره, جمشید, جوان, جویا, جهان, جهانبخت, جهانبخش, جهاندار, جهانگیر, جهان بانو, جهاندخت, جهان ناز, جیران, چابک, چالاک, چاوش, چترا, چوبین, چهرزاد, خاوردخت, خداداد, خدایار, خرم, خرمدخت, خسرو, خشایار, خورشید, دادمهر, دارا, داراب, داریا, داریوش, دانوش, داور‌, دایان, دریا, دل آرا, دل آویز, دلارام, دل انگیز, دلبر, دلبند, دلربا, دلشاد, دلکش, دلناز, دلنواز, دورشاسب, دنیا, دیااکو, دیانوش, دیبا, دیبا دخت, رابو, رابین, رادبانو, رادمان, رازبان, راژانه, راسا, رامتین, رامش, رامشگر, رامونا, رامیار, رامیلا, رامین, راویار, رژینا, رخپاک, رخسار, رخشانه, رخشنده, رزمیار, رستم, رکسانا, روبینا, رودابه, روزبه, روشنک, روناک, رهام, رهی, ریبار, راسپینا, زادبخت, زاد به, زاد چهر, زاد فر, زال, زادماسب, زاوا, زردشت, زرنگار, زری, زرین, زرینه, زمانه, زونا, زیبا, زیبار, زیما, زینو, ژاله, ژالان, ژیار, ژینا, ژیوار, سارا, سارک, سارنگ, ساره, ساسان, ساغر, سام, سامان, سانا, ساناز, سانیار, ساویز, ساهی, ساینا, سایه, سپنتا, سپند, سپهر, سپهرداد, سپیدار, سپید بانو, سپیده, ستاره, ستی, سرافراز, سرور, سروش, سرور, سوبا, سوبار, سنبله, سودابه, سوری, سورن, سورنا, سوزان, سوزه, سوسن, سومار, سولان, سولماز, سوگند, سهراب, سهره, سهند, سیامک, سیاوش, سیبوبه ‌, سیما, سیمدخت, سینا, سیمین, سیمین دخت, شاپرک, شادی, شادمهر, شاران, شاهپور, شاهدخت, شاهرخ, شاهین, شاهیندخت, شایسته, شباهنگ, شب بو, شبدیز, شبنم, شراره, شرمین, شروین, شکوفه, شکفته, شمشاد, شمین, شوان, شمیلا, شورانگیز, شوری, شهاب, شهبار, شهباز, شهبال, شهپر, شهداد, شهرآرا, شهرام, شهربانو, شهرزاد, شهرناز, شهرنوش, شهره, شهریار, شهرزاد, شهلا, شهنواز, شهین, شیبا, شیدا, شیده, شیردل, شیرزاد, شیرنگ, شیرو, شیرین دخت, شیما, شینا, شیرین, شیوا, طوس, طوطی, طهماسب, طهمورث, غوغا, غنچه, فتانه, فدا, فراز, فرامرز, فرانک, فراهان, فربد, فربغ, فرجاد, فرخ, فرخ پی, فرخ داد, فرخ رو, فرخ زاد, فرخ لقا, فرخ مهر, فرداد, فردیس, فرین, فرزاد, فرزام, فرزان, فرزانه, فرزین, فرشاد, فرشته, فرشید, فرمان, فرناز, فرنگیس, فرنود, فرنوش, فرنیا, فروتن, فرود, فروز, فروزان, فروزش, فروزنده, فروغ, فرهاد, فرهنگ, فرهود, فربار, فریبا, فرید, فریدخت, فریدون, فریمان, فریناز, فرینوش, فریوش, فیروز, فیروزه, قابوس, قباد, قدسی, کابان, کابوک, کارا, کارو, کاراکو, کامبخت, کامبخش, کامبیز, کامجو, کامدین, کامران, کامراوا, کامک, کامنوش, کامیار, کانیار, کاووس, کاوه, کتایون, کرشمه, کسری, کلاله, کمبوجیه, کوشا, کهبد, کهرام, کهزاد, کیارش, کیان, کیانا, کیانچهر, کیاندخت, کیانوش, کیاوش, کیخسرو, کیقباد, کیکاووس, کیوان, کیوان دخت, کیومرث, کیهان, کیاندخت, کیهانه, گرد آفرید, گردان, گرشا, گرشاسب, گرشین, گرگین, گزل, گشتاسب, گشسب, گشسب بانو, گل, گل آذین, گل آرا‌, گلاره, گل افروز, گلاله, گل اندام, گلاویز, گلباد, گلبار, گلبام, گلبان, گلبانو, گلبرگ, گلبو, گلبهار, گلبیز, گلپاره, گلپر, گلپری, گلپوش, گل پونه, گلچین, گلدخت, گلدیس, گلربا, گلرخ, گلرنگ, گلرو, گلشن, گلریز, گلزاد, گلزار, گلسا, گلشید, گلنار, گلناز, گلنسا, گلنواز, گلنوش, گلی, گودرز, گوماتو, گهر چهر, گوهر ناز, گیتی, گیسو, گیلدا, گیو, لادن, لاله, لاله رخ, لاله دخت, لبخند, لقاء, لومانا, لهراسب, مارال, ماری, مازیار, ماکان, مامک, مانا, ماندانا, مانوش, مانی, مانیا, ماهان, ماهاندخت, ماه برزین, ماه جهان, ماهچهر, ماهدخت, ماهور, ماهرخ, ماهزاد, مردآویز, مرداس, مرزبان, مرمر, مزدک, مژده, مژگان, مستان, مستانه, مشکاندخت, مشکناز, مشکین دخت, منیژه, منوچهر, مهبانو, مهبد, مه داد, مهتاب, مهدیس, مه جبین, مه دخت, مهر آذر, مهر آرا, مهر آسا, مهر آفاق, مهر افرین, مهرآب, مهرداد, مهر افزون, مهرام, مهران, مهراندخت, مهراندیش, مهرانفر, مهرانگیز, مهرداد, مهر دخت, مهرزاده ‌, مهرناز, مهرنوش, مهرنکار, مهرنیا, مهروز, مهری, مهریار, مهسا, مهستی, مه سیما, مهشاد, مهشید, مهنام, مهناز, مهنوش, مهوش, مهیار, مهین, مهین دخت, میترا, میخک, مینا, مینا دخت, مینو, مینودخت, مینو فر, نادر, ناز آفرین, نازبانو, نازپرور, نازچهر, نازفر, نازلی, نازی, نازیدخت, نامور, ناهید, ندا, نرسی, نرگس, نرمک, نرمین, نریمان, نسترن, نسرین, نسرین دخت, نسرین نوش, نکیسا, نگار, نگاره, نگارین, نگین, نوا, نوش, نوش آذر, نوش آور, نوشا, نوش آفرین, نوشدخت, نوشروان, نوشفر, نوشناز, نوشین, نوید, نوین, نوین دخت, نیش ا, نیک بین, نیک پی, نیک چهر, نیک خواه, نیکداد, نیکدخت, نیکدل, نیکزاد, نیلوفر, نیما, وامق, ورجاوند, وریا, وشمگیر, وهرز, وهسودان, ویدا, ویس, ویشتاسب, ویگن, هژیر, هخامنش, هربد( هیربد ), هرمز, همایون, هما, همادخت, همدم, همراز, همراه, هنگامه, هوتن, هور, هورتاش, هورچهر, هورداد, هوردخت, هورزاد, هورمند, هوروش, هوشنگ, هوشیار, هومان, هومن, هونام, هویدا, هیتاسب, هیرمند, هیما, هیوا, یادگار, یاسمن ( یاسمین ), یاشار, یاور, یزدان, یگانه, یوشیتا] 5 | last_name: [عارف, عاشوری, عالی, عبادی, عبدالکریمی, عبدالملکی, عراقی, عزیزی, عصار, عقیلی, علم, علم‌الهدی, علی عسگری, علی‌آبادی, علیا, علی‌پور, علی‌زمانی, عنایت, غضنفری, غنی, فارسی, فاطمی, فانی, فتاحی, فرامرزی, فرج, فرشیدورد, فرمانفرمائیان, فروتن, فرهنگ, فریاد, فنایی, فنی‌زاده, فولادوند, فهمیده, قاضی, قانعی, قانونی, قمیشی, قنبری, قهرمان, قهرمانی, قهرمانیان, قهستانی, کاشی, کاکاوند, کامکار, کاملی, کاویانی, کدیور, کردبچه, کرمانی, کریمی, کلباسی, کمالی, کوشکی, کهنمویی, کیان, کیانی (نام خانوادگی), کیمیایی, گل محمدی, گلپایگانی, گنجی, لاجوردی, لاچینی, لاهوتی, لنکرانی, لوکس, مجاهد, مجتبایی, مجتبوی, مجتهد شبستری, مجتهدی, مجرد, محجوب, محجوبی, محدثی, محمدرضایی, محمدی, مددی, مرادخانی, مرتضوی, مستوفی, مشا, مصاحب, مصباح, مصباح‌زاده, مطهری, مظفر, معارف, معروف, معین, مفتاح, مفتح, مقدم, ملایری, ملک, ملکیان, منوچهری, موحد, موسوی, موسویان, مهاجرانی, مهدی‌پور, میرباقری, میردامادی, میرزاده, میرسپاسی, میزبانی, ناظری, نامور, نجفی, ندوشن, نراقی, نعمت‌زاده, نقدی, نقیب‌زاده, نواب, نوبخت, نوبختی, نهاوندی, نیشابوری, نیلوفری, واثقی, واعظ, واعظ‌زاده, واعظی, وکیلی, هاشمی, هاشمی رفسنجانی, هاشمیان, هامون, هدایت, هراتی, هروی, همایون, همت, همدانی, هوشیار, هومن, یاحقی, یادگار, یثربی, یلدا] 6 | prefix: [آقای, خانم, دکتر] 7 | -------------------------------------------------------------------------------- /lib/locales/sv.yml: -------------------------------------------------------------------------------- 1 | 2 | sv: 3 | faker: 4 | address: 5 | city_prefix: [Söder, Norr, Väst, Öster, Aling, Ar, Av, Bo, Br, Bå, Ek, En, Esk, Fal, Gäv, Göte, Ha, Helsing, Karl, Krist, Kram, Kung, Kö, Lyck, Ny] 6 | city_suffix: [stad, land, sås, ås, holm, tuna, sta, berg, löv, borg, mora, hamn, fors, köping, by, hult, torp, fred, vik] 7 | country: [Ryssland, Kanada, Kina, USA, Brasilien, Australien, Indien, Argentina, Kazakstan, Algeriet, DR Kongo, Danmark, Färöarna, Grönland, Saudiarabien, Mexiko, Indonesien, Sudan, Libyen, Iran, Mongoliet, Peru, Tchad, Niger, Angola, Mali, Sydafrika, Colombia, Etiopien, Bolivia, Mauretanien, Egypten, Tanzania, Nigeria, Venezuela, Namibia, Pakistan, Moçambique, Turkiet, Chile, Zambia, Marocko, Västsahara, Burma, Afghanistan, Somalia, Centralafrikanska republiken, Sydsudan, Ukraina, Botswana, Madagaskar, Kenya, Frankrike, Franska Guyana, Jemen, Thailand, Spanien, Turkmenistan, Kamerun, Papua Nya Guinea, Sverige, Uzbekistan, Irak, Paraguay, Zimbabwe, Japan, Tyskland, Kongo, Finland, Malaysia, Vietnam, Norge, Svalbard, Jan Mayen, Elfenbenskusten, Polen, Italien, Filippinerna, Ecuador, Burkina Faso, Nya Zeeland, Gabon, Guinea, Storbritannien, Ghana, Rumänien, Laos, Uganda, Guyana, Oman, Vitryssland, Kirgizistan, Senegal, Syrien, Kambodja, Uruguay, Tunisien, Surinam, Nepal, Bangladesh, Tadzjikistan, Grekland, Nicaragua, Eritrea, Nordkorea, Malawi, Benin, Honduras, Liberia, Bulgarien, Kuba, Guatemala, Island, Sydkorea, Ungern, Portugal, Jordanien, Serbien, Azerbajdzjan, Österrike, Förenade Arabemiraten, Tjeckien, Panama, Sierra Leone, Irland, Georgien, Sri Lanka, Litauen, Lettland, Togo, Kroatien, Bosnien och Hercegovina, Costa Rica, Slovakien, Dominikanska republiken, Bhutan, Estland, Danmark, Färöarna, Grönland, Nederländerna, Schweiz, Guinea-Bissau, Taiwan, Moldavien, Belgien, Lesotho, Armenien, Albanien, Salomonöarna, Ekvatorialguinea, Burundi, Haiti, Rwanda, Makedonien, Djibouti, Belize, Israel, El Salvador, Slovenien, Fiji, Kuwait, Swaziland, Timor-Leste, Montenegro, Bahamas, Vanuatu, Qatar, Gambia, Jamaica, Kosovo, Libanon, Cypern, Brunei, Trinidad och Tobago, Kap Verde, Samoa, Luxemburg, Komorerna, Mauritius, São Tomé och Príncipe, Kiribati, Dominica, Tonga, Mikronesiens federerade stater, Singapore, Bahrain, Saint Lucia, Andorra, Palau, Seychellerna, Antigua och Barbuda, Barbados, Saint Vincent och Grenadinerna, Grenada, Malta, Maldiverna, Saint Kitts och Nevis, Marshallöarna, Liechtenstein, San Marino, Tuvalu, Nauru, Monaco, Vatikanstaten] 8 | 9 | common_street_suffix: ["s Väg", "s Gata"] 10 | street_prefix: [Västra, Östra, Norra, Södra, Övre, Undre] 11 | street_root: [Björk, Järnvägs, Ring, Skol, Skogs, Ny, Gran, Idrotts, Stor, Kyrk, Industri, Park, Strand, Skol, Trädgård, Ängs, Kyrko, Villa, Ek, Kvarn, Stations, Back, Furu, Gen, Fabriks, Åker, Bäck, Asp] 12 | street_suffix: [vägen, gatan, gränden, gärdet, allén] 13 | state: [Blekinge, Dalarna, Gotland, Gävleborg, Göteborg, Halland, Jämtland, Jönköping, Kalmar, Kronoberg, Norrbotten, Skaraborg, Skåne, Stockholm, Södermanland, Uppsala, Värmland, Västerbotten, Västernorrland, Västmanland, Älvsborg, Örebro, Östergötland] 14 | 15 | city: 16 | - "#{city_prefix}#{city_suffix}" 17 | street_name: 18 | - "#{street_root}#{street_suffix}" 19 | - "#{street_prefix} #{street_root}#{street_suffix}" 20 | - "#{Name.first_name}#{common_street_suffix}" 21 | - "#{Name.last_name}#{common_street_suffix}" 22 | postcode: ['#####'] 23 | building_number: ['###', '##', '#'] 24 | secondary_address: ['Lgh. ###', 'Hus ###'] 25 | street_address: 26 | - "#{street_name} #{building_number}" 27 | default_country: [Sverige] 28 | 29 | company: 30 | suffix: ["Gruppen", "AB", "HB", "Group", "Investment", "Kommanditbolag", "Aktiebolag"] 31 | name: 32 | - "#{Name.last_name} #{suffix}" 33 | - "#{Name.last_name}-#{Name.last_name}" 34 | - "#{Name.last_name}, #{Name.last_name} #{suffix}" 35 | 36 | internet: 37 | domain_suffix: [se, nu, info, com, org] 38 | 39 | name: 40 | first_name_women: [Maria, Anna, Margareta, Elisabeth, Eva, Birgitta, Kristina, Karin, Elisabet, Marie] 41 | first_name_men: [Erik, Lars, Karl, Anders, Per, Johan, Nils, Lennart, Emil, Hans ] 42 | last_name: [Johansson, Andersson, Karlsson, Nilsson, Eriksson, Larsson, Olsson, Persson, Svensson, Gustafsson] 43 | prefix: [Dr., Prof., PhD.] 44 | 45 | title: 46 | descriptor: [Lead, Senior, Direct, Corporate, Dynamic, Future, Product, National, Regional, District, Central, Global, Customer, Investor, Dynamic, International, Legacy, Forward, Internal, Human, Chief, Principal] 47 | level: [Solutions, Program, Brand, Security, Research, Marketing, Directives, Implementation, Integration, Functionality, Response, Paradigm, Tactics, Identity, Markets, Group, Division, Applications, Optimization, Operations, Infrastructure, Intranet, Communications, Web, Branding, Quality, Assurance, Mobility, Accounts, Data, Creative, Configuration, Accountability, Interactions, Factors, Usability, Metrics] 48 | job: [Supervisor, Associate, Executive, Liason, Officer, Manager, Engineer, Specialist, Director, Coordinator, Administrator, Architect, Analyst, Designer, Planner, Orchestrator, Technician, Developer, Producer, Consultant, Assistant, Facilitator, Agent, Representative, Strategist] 49 | name: 50 | - "#{first_name_women} #{last_name}" 51 | - "#{first_name_men} #{last_name}" 52 | - "#{first_name_women} #{last_name}" 53 | - "#{first_name_men} #{last_name}" 54 | - "#{first_name_women} #{last_name}" 55 | - "#{first_name_men} #{last_name}" 56 | - "#{prefix} #{first_name_men} #{last_name}" 57 | - "#{prefix} #{first_name_women} #{last_name}" 58 | 59 | phone_number: 60 | formats: ['####-#####', '####-######'] 61 | cell_phone: 62 | common_cell_prefix: [070, 076, 073] 63 | formats: ['#{common_cell_prefix}-###-####'] 64 | 65 | commerce: 66 | color: [vit, silver, grå, svart, röd, grön, blå, gul, lila, indigo, guld, brun, rosa, purpur, korall] 67 | department: ["Böcker", "Filmer", "Musik", "Spel", "Elektronik", "Datorer", "Hem", "Trädgård", "Verktyg", "Livsmedel", "Hälsa", "Skönhet", "Leksaker", "Klädsel", "Skor", "Smycken", "Sport"] 68 | product_name: 69 | adjective: [Liten, Ergonomisk, Robust, Intelligent, Söt, Otrolig, Fatastisk, Praktisk, Slimmad, Grym] 70 | material: [Stål, Metall, Trä, Betong, Plast, Bomul, Grnit, Gummi, Latex] 71 | product: [Stol, Bil, Dator, Handskar, Pants, Shirt, Table, Shoes, Hat] 72 | 73 | team: 74 | suffix: [IF, FF, BK, HK, AIF, SK, FC, SK, BoIS, FK, BIS, FIF, IK] 75 | name: 76 | - "#{Address.city} #{suffix}" 77 | -------------------------------------------------------------------------------- /lib/charlatan/internet.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan.Internet 5 | **/ 6 | 7 | 8 | var Helpers = require('./helpers'); 9 | var Charlatan = require('../charlatan'); 10 | 11 | 12 | function fix_umlauts(string) { 13 | return string.replace(/[äöüß]/ig, function (str) { 14 | switch (str.toLowerCase()) { 15 | case 'ä': return 'ae'; 16 | case 'ö': return 'oe'; 17 | case 'ü': return 'ue'; 18 | case 'ß': return 'ss'; 19 | } 20 | return str; 21 | }); 22 | } 23 | 24 | 25 | /** 26 | * Charlatan.Internet.email([name]) -> String 27 | * - name (string) : user name, optional 28 | * 29 | * Generate email :-) 30 | **/ 31 | exports.email = function (name) { 32 | return exports.userName(name) + '@' + exports.domainName(); 33 | }; 34 | 35 | 36 | /** 37 | * Charlatan.Internet.freeEmail([name]) -> String 38 | * - name (string) : user name, optional 39 | * 40 | * Generate email in public domain such as gmail and hotmail 41 | **/ 42 | exports.freeEmail = function (name) { 43 | return exports.userName(name) + '@' + Charlatan.fetch('internet.free_email'); 44 | }; 45 | 46 | 47 | /** 48 | * Charlatan.Internet.safeEmail([name]) -> String 49 | * - name (string) : user name, optional 50 | * 51 | * Generate email in example.[org|com|net] 52 | **/ 53 | exports.safeEmail = function (name) { 54 | var domain = 'example.' + Helpers.sample([ 'org', 'com', 'net' ]); 55 | 56 | return exports.userName(name) + '@' + domain; 57 | }; 58 | 59 | 60 | /** 61 | * Charlatan.Internet.userName([name]) -> String 62 | * - name (string) : user name, optional 63 | * 64 | * Generate nickname. 65 | **/ 66 | exports.userName = function (specifier, separators) { 67 | var result; 68 | 69 | if (!separators) { separators = [ '.', '_' ]; } 70 | 71 | if (typeof specifier === 'string') { 72 | return Helpers.shuffle(specifier.match(/\w+/g)) 73 | .join(Helpers.sample(separators)) 74 | .toLowerCase(); 75 | } 76 | 77 | if (typeof specifier === 'number') { 78 | var tries = 0; // Don't try forever in case we get something like 1_000_000. 79 | 80 | do { 81 | result = exports.userName(null, separators); 82 | tries++; 83 | } while (result.length < specifier && tries < 7); 84 | 85 | while (result.length < specifier) { 86 | result += result; 87 | } 88 | 89 | return result; 90 | } 91 | 92 | return fix_umlauts(Helpers.sample([ 93 | function () { 94 | return Charlatan.Name.firstName().replace(/\W/g, '').toLowerCase(); 95 | }, 96 | function () { 97 | return [ Charlatan.Name.firstName(), Charlatan.Name.lastName() ] 98 | .join(Helpers.sample(separators)) 99 | .replace(/\W/g, '') 100 | .toLowerCase(); 101 | } 102 | ])()); 103 | }; 104 | 105 | /** 106 | * Charlatan.Internet.password(minLength=8, maxLength=16) -> String 107 | * - minLength (integer) : min number of characters in generated password 108 | * - maxLength (integer) : max number of characters in generated password 109 | * 110 | * Generate an alphanumeric password 111 | **/ 112 | exports.password = function (minLength, maxLength) { 113 | if (typeof minLength !== 'number') { minLength = 8; } 114 | if (typeof maxLength !== 'number') { maxLength = 16; } 115 | 116 | maxLength = Math.max(minLength + 1, maxLength); 117 | 118 | return Charlatan.Lorem.characters(Helpers.rand(maxLength + 1, minLength)); 119 | }; 120 | 121 | /** 122 | * Charlatan.Internet.domainName() -> String 123 | * 124 | * Generate domain name. 125 | **/ 126 | exports.domainName = function () { 127 | return fix_umlauts(exports.domainWord()) + '.' + exports.domainSuffix(); 128 | }; 129 | 130 | 131 | /** 132 | * Charlatan.Internet.domainWord() -> String 133 | * 134 | * Generate domain component 135 | **/ 136 | exports.domainWord = function () { 137 | return Charlatan.Company.name() 138 | .split(' ')[0] 139 | .replace(/\W/g, '') 140 | .toLowerCase(); 141 | }; 142 | 143 | 144 | /** 145 | * Charlatan.Internet.domainSuffix() -> String 146 | * 147 | * Return TLD, e.g. "com" 148 | **/ 149 | exports.domainSuffix = function () { 150 | // lorem can return word with apostrophe 151 | return Charlatan.fetch('internet.domain_suffix'); 152 | }; 153 | 154 | 155 | /** 156 | * Charlatan.Internet.IPv4() -> String 157 | * 158 | * Generate an IPv4 address 159 | **/ 160 | exports.IPv4 = function () { 161 | var i, result = []; 162 | 163 | for (i = 0; i < 4; i++) { 164 | result[i] = Helpers.rand(255, 1); // 1..254 165 | } 166 | 167 | return result.join('.'); 168 | }; 169 | 170 | 171 | /** 172 | * Charlatan.Internet.macAddress(prefix='') -> String 173 | * - prefix(String) : prefix 174 | * 175 | * Generate a mac address 176 | **/ 177 | exports.macAddress = function (prefix) { 178 | if (!prefix) { prefix = ''; } 179 | 180 | var digits = []; 181 | 182 | if (prefix) { 183 | digits = prefix.split(':').map(function (d) { 184 | return parseInt(d, 16) || 0; 185 | }); 186 | } 187 | 188 | for (var i = 6 - digits.length; i > 0; i--) { 189 | digits.push(Helpers.rand(256)); 190 | } 191 | 192 | return digits.map(function (d) { 193 | return ('00' + d.toString(16)).slice(-2); 194 | }).join(':'); 195 | }; 196 | 197 | 198 | /** 199 | * Charlatan.Internet.IPv6() -> String 200 | * 201 | * Generate an IPv6 address 202 | **/ 203 | exports.IPv6 = function () { 204 | var group, result = [], i, j; 205 | 206 | for (i = 0; i < 8; i++) { 207 | group = ''; 208 | for (j = 0; j < 4; j++) { 209 | group += Helpers.rand(16).toString(16); 210 | } 211 | result.push(group); 212 | } 213 | 214 | return result.join(':'); 215 | }; 216 | 217 | 218 | /** 219 | * Charlatan.Internet.IPv6([domain, path]) -> String 220 | * - domain(String): domain name 221 | * - path(String): path name 222 | * 223 | * Generate an url address 224 | **/ 225 | exports.url = function (host, path) { 226 | if (!host) { 227 | host = exports.domainName(); 228 | } 229 | 230 | if (!path) { 231 | path = '/' + exports.userName(); 232 | } 233 | 234 | return 'http://' + host + path; 235 | }; 236 | 237 | 238 | /** 239 | * Charlatan.Internet.IPv6([words, glue]) -> String 240 | * - words(String): words array (by default it fetches lorem.words) 241 | * - glue(String): character that separates words 242 | * 243 | * Build slug out of a words array 244 | **/ 245 | exports.slug = function (words, glue) { 246 | if (!glue) { 247 | glue = Helpers.sample('-_.'.split('')); 248 | } 249 | 250 | if (!words) { 251 | words = Charlatan.Lorem.words(2); 252 | } 253 | 254 | if (Array.isArray(words)) { 255 | words = words.join(' '); 256 | } 257 | 258 | return words 259 | .replace(/ /g, glue) 260 | .toLowerCase(); 261 | }; 262 | 263 | 264 | /** 265 | * Charlatan.Internet.deviceToken() -> String 266 | * 267 | * Generate an APN token 268 | **/ 269 | exports.deviceToken = function () { 270 | var i, result = ''; 271 | 272 | for (i = 0; i < 64; i++) { 273 | result += Helpers.rand(16).toString(16); 274 | } 275 | 276 | return result; 277 | }; 278 | -------------------------------------------------------------------------------- /lib/locales/en-US.yml: -------------------------------------------------------------------------------- 1 | en-US: 2 | faker: 3 | internet: 4 | domain_suffix: [com, us, biz, info, name, net, org] 5 | address: 6 | default_country: [United States, United States of America, USA] 7 | postcode_by_state: 8 | AL: '350##' 9 | AK: '995##' 10 | AS: '967##' 11 | AZ: '850##' 12 | AR: '717##' 13 | CA: '900##' 14 | CO: '800##' 15 | CT: '061##' 16 | DC: '204##' 17 | DE: '198##' 18 | FL: '322##' 19 | GA: '301##' 20 | HI: '967##' 21 | ID: '832##' 22 | IL: '600##' 23 | IN: '463##' 24 | IA: '510##' 25 | KS: '666##' 26 | KY: '404##' 27 | LA: '701##' 28 | ME: '042##' 29 | MD: '210##' 30 | MA: '026##' 31 | MI: '480##' 32 | MN: '555##' 33 | MS: '387##' 34 | MO: '650##' 35 | MT: '590##' 36 | NE: '688##' 37 | NV: '898##' 38 | NH: '036##' 39 | NJ: '076##' 40 | NM: '880##' 41 | NY: '122##' 42 | NC: '288##' 43 | ND: '586##' 44 | OH: '444##' 45 | OK: '730##' 46 | OR: '979##' 47 | PA: '186##' 48 | RI: '029##' 49 | SC: '299##' 50 | SD: '577##' 51 | TN: '383##' 52 | TX: '798##' 53 | UT: '847##' 54 | VT: '050##' 55 | VA: '222##' 56 | WA: '990##' 57 | WV: '247##' 58 | WI: '549##' 59 | WY: '831##' 60 | phone_number: 61 | area_code: ["201", "202", "203", "205", "206", "207", "208", "209", "210", "212", "213", "214", "215", "216", "217", "218", "219", "224", "225", "227", "228", "229", "231", "234", "239", "240", "248", "251", "252", "253", "254", "256", "260", "262", "267", "269", "270", "276", "281", "283", "301", "302", "303", "304", "305", "307", "308", "309", "310", "312", "313", "314", "315", "316", "317", "318", "319", "320", "321", "323", "330", "331", "334", "336", "337", "339", "347", "351", "352", "360", "361", "386", "401", "402", "404", "405", "406", "407", "408", "409", "410", "412", "413", "414", "415", "417", "419", "423", "424", "425", "434", "435", "440", "443", "445", "464", "469", "470", "475", "478", "479", "480", "484", "501", "502", "503", "504", "505", "507", "508", "509", "510", "512", "513", "515", "516", "517", "518", "520", "530", "540", "541", "551", "557", "559", "561", "562", "563", "564", "567", "570", "571", "573", "574", "580", "585", "586", "601", "602", "603", "605", "606", "607", "608", "609", "610", "612", "614", "615", "616", "617", "618", "619", "620", "623", "626", "630", "631", "636", "641", "646", "650", "651", "660", "661", "662", "667", "678", "682", "701", "702", "703", "704", "706", "707", "708", "712", "713", "714", "715", "716", "717", "718", "719", "720", "724", "727", "731", "732", "734", "737", "740", "754", "757", "760", "763", "765", "770", "772", "773", "774", "775", "781", "785", "786", "801", "802", "803", "804", "805", "806", "808", "810", "812", "813", "814", "815", "816", "817", "818", "828", "830", "831", "832", "835", "843", "845", "847", "848", "850", "856", "857", "858", "859", "860", "862", "863", "864", "865", "870", "872", "878", "901", "903", "904", "906", "907", "908", "909", "910", "912", "913", "914", "915", "916", "917", "918", "919", "920", "925", "928", "931", "936", "937", "940", "941", "947", "949", "952", "954", "956", "959", "970", "971", "972", "973", "975", "978", "979", "980", "984", "985", "989"] 62 | exchange_code: ["201", "202", "203", "205", "206", "207", "208", "209", "210", "212", "213", "214", "215", "216", "217", "218", "219", "224", "225", "227", "228", "229", "231", "234", "239", "240", "248", "251", "252", "253", "254", "256", "260", "262", "267", "269", "270", "276", "281", "283", "301", "302", "303", "304", "305", "307", "308", "309", "310", "312", "313", "314", "315", "316", "317", "318", "319", "320", "321", "323", "330", "331", "334", "336", "337", "339", "347", "351", "352", "360", "361", "386", "401", "402", "404", "405", "406", "407", "408", "409", "410", "412", "413", "414", "415", "417", "419", "423", "424", "425", "434", "435", "440", "443", "445", "464", "469", "470", "475", "478", "479", "480", "484", "501", "502", "503", "504", "505", "507", "508", "509", "510", "512", "513", "515", "516", "517", "518", "520", "530", "540", "541", "551", "557", "559", "561", "562", "563", "564", "567", "570", "571", "573", "574", "580", "585", "586", "601", "602", "603", "605", "606", "607", "608", "609", "610", "612", "614", "615", "616", "617", "618", "619", "620", "623", "626", "630", "631", "636", "641", "646", "650", "651", "660", "661", "662", "667", "678", "682", "701", "702", "703", "704", "706", "707", "708", "712", "713", "714", "715", "716", "717", "718", "719", "720", "724", "727", "731", "732", "734", "737", "740", "754", "757", "760", "763", "765", "770", "772", "773", "774", "775", "781", "785", "786", "801", "802", "803", "804", "805", "806", "808", "810", "812", "813", "814", "815", "816", "817", "818", "828", "830", "831", "832", "835", "843", "845", "847", "848", "850", "856", "857", "858", "859", "860", "862", "863", "864", "865", "870", "872", "878", "901", "903", "904", "906", "907", "908", "909", "910", "912", "913", "914", "915", "916", "917", "918", "919", "920", "925", "928", "931", "936", "937", "940", "941", "947", "949", "952", "954", "956", "959", "970", "971", "972", "973", "975", "978", "979", "980", "984", "985", "989"] 63 | formats: 64 | - "#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number}" 65 | - "(#{PhoneNumber.area_code}) #{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number}" 66 | - "1-#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number}" 67 | - "#{PhoneNumber.area_code}.#{PhoneNumber.exchange_code}.#{PhoneNumber.subscriber_number}" 68 | - "#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number}" 69 | - "(#{PhoneNumber.area_code}) #{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number}" 70 | - "1-#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number}" 71 | - "#{PhoneNumber.area_code}.#{PhoneNumber.exchange_code}.#{PhoneNumber.subscriber_number}" 72 | - "#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 73 | - "(#{PhoneNumber.area_code}) #{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 74 | - "1-#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 75 | - "#{PhoneNumber.area_code}.#{PhoneNumber.exchange_code}.#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 76 | - "#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 77 | - "(#{PhoneNumber.area_code}) #{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 78 | - "1-#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 79 | - "#{PhoneNumber.area_code}.#{PhoneNumber.exchange_code}.#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 80 | - "#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 81 | - "(#{PhoneNumber.area_code}) #{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 82 | - "1-#{PhoneNumber.area_code}-#{PhoneNumber.exchange_code}-#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 83 | - "#{PhoneNumber.area_code}.#{PhoneNumber.exchange_code}.#{PhoneNumber.subscriber_number} x#{PhoneNumber.extension}" 84 | -------------------------------------------------------------------------------- /lib/locales/pt-BR.yml: -------------------------------------------------------------------------------- 1 | pt-BR: 2 | faker: 3 | address: 4 | city_prefix: [Nova, Velha, Grande, Vila, Município de] 5 | city_suffix: [do Descoberto, de Nossa Senhora, do Norte, do Sul] 6 | country: [ "Afeganistão", "Albânia", "Algéria", "Samoa", "Andorra", "Angola", "Anguilla", "Antigua and Barbada", "Argentina", "Armênia", "Aruba", "Austrália", 7 | "Áustria", "Alzerbajão", "Bahamas", "Barém", "Bangladesh", "Barbado", "Belgrado", "Bélgica", "Belize", "Benin", "Bermuda", "Bhutan", "Bolívia", 8 | "Bôsnia", "Botuasuna", "Bouvetoia", "Brasil", "Arquipélago de Chagos", "Ilhas Virgens", "Brunei", "Bulgária", "Burkina Faso", "Burundi", "Cambójia", 9 | "Camarões", "Canadá", "Cabo Verde", "Ilhas Caiman", "República da África Central", "Chad", "Chile", "China", "Ilhas Natal", "Ilhas Cocos", "Colômbia", 10 | "Comoros", "Congo", "Ilhas Cook", "Costa Rica", "Costa do Marfim", "Croácia", "Cuba", "Cyprus", "República Tcheca", "Dinamarca", "Djibouti", "Dominica", 11 | "República Dominicana", "Equador", "Egito", "El Salvador", "Guiné Equatorial", "Eritrea", "Estônia", "Etiópia", "Ilhas Faroe", "Malvinas", "Fiji", 12 | "Finlândia", "França", "Guiné Francesa", "Polinésia Francesa", "Gabão", "Gâmbia", "Georgia", "Alemanha", "Gana", "Gibraltar", "Grécia", "Groelândia", 13 | "Granada", "Guadalupe", "Guano", "Guatemala", "Guernsey", "Guiné", "Guiné-Bissau", "Guiana", "Haiti", "Heard Island and McDonald Islands", "Vaticano", 14 | "Honduras", "Hong Kong", "Hungria", "Iceland", "Índia", "Indonésia", "Irã", "Iraque", "Irlanda", "Ilha de Man", "Israel", "Itália", "Jamaica", "Japão", 15 | "Jersey", "Jordânia", "Cazaquistão", "Quênia", "Kiribati", "Coreia do Norte", "Coreia do Sul", "Kuwait", "Kyrgyz Republic", "República Democrática de Lao People", 16 | "Latvia", "Líbano", "Lesotho", "Libéria", "Libyan Arab Jamahiriya", "Liechtenstein", "Lituânia", "Luxemburgo", "Macao", "Macedônia", "Madagascar", "Malawi", 17 | "Malásia", "Maldives", "Mali", "Malta", "Ilhas Marshall", "Martinica", "Mauritânia", "Mauritius", "Mayotte", "México", "Micronésia", "Moldova", "Mônaco", 18 | "Mongólia", "Montenegro", "Montserrat", "Marrocos", "Moçambique", "Myanmar", "Namibia", "Nauru", "Nepal", "Antilhas Holandesas", "Holanda", "Nova Caledonia", 19 | "Nova Zelândia", "Nicarágua", "Nigéria", "Niue", "Ilha Norfolk", "Northern Mariana Islands", "Noruega", "Oman", "Paquistão", "Palau", "Território da Palestina", 20 | "Panamá", "Nova Guiné Papua", "Paraguai", "Peru", "Filipinas", "Polônia", "Portugal", "Puerto Rico", "Qatar", "Romênia", "Rússia", "Ruanda", "São Bartolomeu", 21 | "Santa Helena", "Santa Lúcia", "Saint Martin", "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tomé e Príncipe", 22 | "Arábia Saudita", "Senegal", "Sérvia", "Seychelles", "Serra Leoa", "Singapura", "Eslováquia", "Eslovênia", "Ilhas Salomão", "Somália", 23 | "África do Sul", "South Georgia and the South Sandwich Islands", "Spanha", "Sri Lanka", "Sudão", "Suriname", "Svalbard & Jan Mayen Islands", "Swaziland", 24 | "Suécia", "Suíça", "Síria", "Taiwan", "Tajiquistão", "Tanzânia", "Tailândia", "Timor-Leste", "Togo", "Tokelau", "Tonga", "Trinidá e Tobago", "Tunísia", 25 | "Turquia", "Turcomenistão", "Turks and Caicos Islands", "Tuvalu", "Uganda", "Ucrânia", "Emirados Árabes Unidos", "Reino Unido", "Estados Unidos da América", 26 | "Estados Unidos das Ilhas Virgens", "Uruguai", "Uzbequistão", "Vanuatu", "Venezuela", "Vietnã", "Wallis and Futuna", "Sahara", "Yemen", "Zâmbia", "Zimbábue"] 27 | building_number: ["#####", "####", "###"] 28 | street_suffix: ["Rua", "Avenida", "Travessa", "Ponte", "Alameda", "Marginal", "Viela", "Rodovia"] 29 | secondary_address: ["Apto. ###", "Sobrado ##", "Casa #", "Lote ##", "Quadra ##"] 30 | # Though these are US-specific, they are here (in the default locale) for backwards compatibility 31 | postcode: ["#####", "#####-###"] 32 | state: ["Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Distrito Federal", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"] 33 | state_abbr: [AC, AL, AP, AM, BA, CE, DF, ES, GO, MA, MT, MS, PA, PB, PR, PE, PI, RJ, RN, RS, RO, RR, SC, SP] 34 | default_country: [Brasil] 35 | 36 | company: 37 | suffix: ["S.A.", "LTDA", "e Associados", "Comércio"] 38 | name: 39 | - "#{Name.last_name} #{suffix}" 40 | - "#{Name.last_name}-#{Name.last_name}" 41 | - "#{Name.last_name}, #{Name.last_name} e #{Name.last_name}" 42 | 43 | internet: 44 | free_email: [gmail.com, yahoo.com, hotmail.com, live.com, bol.com.br] 45 | domain_suffix: [br, com, biz, info, name, net, org] 46 | 47 | lorem: 48 | words: [alias, consequatur, aut, perferendis, sit, voluptatem, accusantium, doloremque, aperiam, eaque, ipsa, quae, ab, illo, inventore, veritatis, et, quasi, architecto, beatae, vitae, dicta, sunt, explicabo, aspernatur, aut, odit, aut, fugit, sed, quia, consequuntur, magni, dolores, eos, qui, ratione, voluptatem, sequi, nesciunt, neque, dolorem, ipsum, quia, dolor, sit, amet, consectetur, adipisci, velit, sed, quia, non, numquam, eius, modi, tempora, incidunt, ut, labore, et, dolore, magnam, aliquam, quaerat, voluptatem, ut, enim, ad, minima, veniam, quis, nostrum, exercitationem, ullam, corporis, nemo, enim, ipsam, voluptatem, quia, voluptas, sit, suscipit, laboriosam, nisi, ut, aliquid, ex, ea, commodi, consequatur, quis, autem, vel, eum, iure, reprehenderit, qui, in, ea, voluptate, velit, esse, quam, nihil, molestiae, et, iusto, odio, dignissimos, ducimus, qui, blanditiis, praesentium, laudantium, totam, rem, voluptatum, deleniti, atque, corrupti, quos, dolores, et, quas, molestias, excepturi, sint, occaecati, cupiditate, non, provident, sed, ut, perspiciatis, unde, omnis, iste, natus, error, similique, sunt, in, culpa, qui, officia, deserunt, mollitia, animi, id, est, laborum, et, dolorum, fuga, et, harum, quidem, rerum, facilis, est, et, expedita, distinctio, nam, libero, tempore, cum, soluta, nobis, est, eligendi, optio, cumque, nihil, impedit, quo, porro, quisquam, est, qui, minus, id, quod, maxime, placeat, facere, possimus, omnis, voluptas, assumenda, est, omnis, dolor, repellendus, temporibus, autem, quibusdam, et, aut, consequatur, vel, illum, qui, dolorem, eum, fugiat, quo, voluptas, nulla, pariatur, at, vero, eos, et, accusamus, officiis, debitis, aut, rerum, necessitatibus, saepe, eveniet, ut, et, voluptates, repudiandae, sint, et, molestiae, non, recusandae, itaque, earum, rerum, hic, tenetur, a, sapiente, delectus, ut, aut, reiciendis, voluptatibus, maiores, doloribus, asperiores, repellat] 49 | 50 | name: 51 | first_name: ["Alessandro", "Alessandra", "Alexandre", "Aline", "Antônio", "Breno", "Bruna", "Carlos", "Carla", "Célia", "Cecília", "César", "Danilo", "Dalila", "Deneval", "Eduardo", "Eduarda", "Esther", "Elísio", "Fábio", "Fabrício", "Fabrícia", "Félix", "Felícia", "Feliciano", "Frederico", "Fabiano", "Gustavo", "Guilherme", "Gúbio", "Heitor", "Hélio", "Hugo", "Isabel", "Isabela", "Ígor", "João", "Joana", "Júlio César", "Júlio", "Júlia", "Janaína", "Karla", "Kléber", "Lucas", "Lorena", "Lorraine", "Larissa", "Ladislau", "Marcos", "Meire", "Marcelo", "Marcela", "Margarida", "Mércia", "Márcia", "Marli", "Morgana", "Maria", "Norberto", "Natália", "Nataniel", "Núbia", "Ofélia", "Paulo", "Paula", "Pablo", "Pedro", "Raul", "Rafael", "Rafaela", "Ricardo", "Roberto", "Roberta", "Sílvia", "Sílvia", "Silas", "Suélen", "Sara", "Salvador", "Sirineu", "Talita", "Tertuliano", "Vicente", "Víctor", "Vitória", "Yango", "Yago", "Yuri", "Washington", "Warley"] 52 | last_name: ["Silva", "Souza", "Carvalho", "Santos", "Reis", "Xavier", "Franco", "Braga", "Macedo", "Batista", "Barros", "Moraes", "Costa", "Pereira", "Carvalho", "Melo", "Saraiva", "Nogueira", "Oliveira", "Martins", "Moreira", "Albuquerque"] 53 | prefix: ["Sr.", "Sra.", "Srta.", "Dr."] 54 | suffix: ["Jr.", "Neto", "Filho"] 55 | 56 | phone_number: 57 | formats: ["(##) ####-####", "+55 (##) ####-####", "(##) #####-####"] 58 | -------------------------------------------------------------------------------- /lib/locales/en-IND.yml: -------------------------------------------------------------------------------- 1 | # India formatted data types 2 | # first_names and last_names courtesy http://www.indianhindunames.com 3 | 4 | en-IND: 5 | faker: 6 | name: 7 | first_name: [Aadrika, Aanandinii, Aaratrika, Aarya, Arya, Aashritha, Aatmaja, Atmaja, Abhaya, Adwitiya, Agrata, Ahilya, Ahalya, Aishani, Akshainie, Akshata, Akshita, Akula, Ambar, Amodini, Amrita, Amritambu, Anala, Anamika, Ananda, Anandamayi, Ananta, Anila, Anjali, Anjushri, Anjushree, Annapurna, Anshula, Anuja, Anusuya, Anasuya, Anasooya, Anwesha, Apsara, Aruna, Asha, Aasa, Aasha, Aslesha, Atreyi, Atreyee, Avani, Abani, Avantika, Ayushmati, Baidehi, Vaidehi, Bala, Baala, Balamani, Basanti, Vasanti, Bela, Bhadra, Bhagirathi, Bhagwanti, Bhagwati, Bhamini, Bhanumati, Bhaanumati, Bhargavi, Bhavani, Bhilangana, Bilwa, Bilva, Buddhana, Chakrika, Chanda, Chandi, Chandni, Chandini, Chandani, Chandra, Chandira, Chandrabhaga, Chandrakala, Chandrakin, Chandramani, Chandrani, Chandraprabha, Chandraswaroopa, Chandravati, Chapala, Charumati, Charvi, Chatura, Chitrali, Chitramala, Chitrangada, Daksha, Dakshayani, Damayanti, Darshwana, Deepali, Dipali, Deeptimoyee, Deeptimayee, Devangana, Devani, Devasree, Devi, Daevi, Devika, Daevika, Dhaanyalakshmi, Dhanalakshmi, Dhana, Dhanadeepa, Dhara, Dharani, Dharitri, Dhatri, Diksha, Deeksha, Divya, Draupadi, Dulari, Durga, Durgeshwari, Ekaparnika, Elakshi, Enakshi, Esha, Eshana, Eshita, Gautami, Gayatri, Geeta, Geetanjali, Gitanjali, Gemine, Gemini, Girja, Girija, Gita, Hamsini, Harinakshi, Harita, Heema, Himadri, Himani, Hiranya, Indira, Jaimini, Jaya, Jyoti, Jyotsana, Kali, Kalinda, Kalpana, Kalyani, Kama, Kamala, Kamla, Kanchan, Kanishka, Kanti, Kashyapi, Kumari, Kumuda, Lakshmi, Laxmi, Lalita, Lavanya, Leela, Lila, Leela, Madhuri, Malti, Malati, Mandakini, Mandaakin, Mangala, Mangalya, Mani, Manisha, Manjusha, Meena, Mina, Meenakshi, Minakshi, Menka, Menaka, Mohana, Mohini, Nalini, Nikita, Ojaswini, Omana, Oormila, Urmila, Opalina, Opaline, Padma, Parvati, Poornima, Purnima, Pramila, Prasanna, Preity, Prema, Priya, Priyala, Pushti, Radha, Rageswari, Rageshwari, Rajinder, Ramaa, Rati, Rita, Rohana, Rukhmani, Rukmin, Rupinder, Sanya, Sarada, Sharda, Sarala, Sarla, Saraswati, Sarisha, Saroja, Shakti, Shakuntala, Shanti, Sharmila, Shashi, Shashikala, Sheela, Shivakari, Shobhana, Shresth, Shresthi, Shreya, Shreyashi, Shridevi, Shrishti, Shubha, Shubhaprada, Siddhi, Sitara, Sloka, Smita, Smriti, Soma, Subhashini, Subhasini, Sucheta, Sudeva, Sujata, Sukanya, Suma, Suma, Sumitra, Sunita, Suryakantam, Sushma, Swara, Swarnalata, Sweta, Shwet, Tanirika, Tanushree, Tanushri, Tanushri, Tanya, Tara, Trisha, Uma, Usha, Vaijayanti, Vaijayanthi, Baijayanti, Vaishvi, Vaishnavi, Vaishno, Varalakshmi, Vasudha, Vasundhara, Veda, Vedanshi, Vidya, Vimala, Vrinda, Vrund, Aadi, Aadidev, Aadinath, Aaditya, Aagam, Aagney, Aamod, Aanandaswarup, Anand Swarup, Aanjaneya, Anjaneya, Aaryan, Aryan, Aatmaj, Aatreya, Aayushmaan, Aayushman, Abhaidev, Abhaya, Abhirath, Abhisyanta, Acaryatanaya, Achalesvara, Acharyanandana, Acharyasuta, Achintya, Achyut, Adheesh, Adhiraj, Adhrit, Adikavi, Adinath, Aditeya, Aditya, Adityanandan, Adityanandana, Adripathi, Advaya, Agasti, Agastya, Agneya, Aagneya, Agnimitra, Agniprava, Agnivesh, Agrata, Ajit, Ajeet, Akroor, Akshaj, Akshat, Akshayakeerti, Alok, Aalok, Amaranaath, Amarnath, Amaresh, Ambar, Ameyatma, Amish, Amogh, Amrit, Anaadi, Anagh, Anal, Anand, Aanand, Anang, Anil, Anilaabh, Anilabh, Anish, Ankal, Anunay, Anurag, Anuraag, Archan, Arindam, Arjun, Arnesh, Arun, Ashlesh, Ashok, Atmanand, Atmananda, Avadhesh, Baalaaditya, Baladitya, Baalagopaal, Balgopal, Balagopal, Bahula, Bakula, Bala, Balaaditya, Balachandra, Balagovind, Bandhu, Bandhul, Bankim, Bankimchandra, Bhadrak, Bhadraksh, Bhadran, Bhagavaan, Bhagvan, Bharadwaj, Bhardwaj, Bharat, Bhargava, Bhasvan, Bhaasvan, Bhaswar, Bhaaswar, Bhaumik, Bhaves, Bheeshma, Bhisham, Bhishma, Bhima, Bhoj, Bhramar, Bhudev, Bhudeva, Bhupati, Bhoopati, Bhoopat, Bhupen, Bhushan, Bhooshan, Bhushit, Bhooshit, Bhuvanesh, Bhuvaneshwar, Bilva, Bodhan, Brahma, Brahmabrata, Brahmanandam, Brahmaanand, Brahmdev, Brajendra, Brajesh, Brijesh, Birjesh, Budhil, Chakor, Chakradhar, Chakravartee, Chakravarti, Chanakya, Chaanakya, Chandak, Chandan, Chandra, Chandraayan, Chandrabhan, Chandradev, Chandraketu, Chandramauli, Chandramohan, Chandran, Chandranath, Chapal, Charak, Charuchandra, Chaaruchandra, Charuvrat, Chatur, Chaturaanan, Chaturbhuj, Chetan, Chaten, Chaitan, Chetanaanand, Chidaakaash, Chidaatma, Chidambar, Chidambaram, Chidananda, Chinmayanand, Chinmayananda, Chiranjeev, Chiranjeeve, Chitraksh, Daiwik, Daksha, Damodara, Dandak, Dandapaani, Darshan, Datta, Dayaamay, Dayamayee, Dayaananda, Dayaanidhi, Kin, Deenabandhu, Deepan, Deepankar, Dipankar, Deependra, Dipendra, Deepesh, Dipesh, Deeptanshu, Deeptendu, Diptendu, Deeptiman, Deeptimoy, Deeptimay, Dev, Deb, Devadatt, Devagya, Devajyoti, Devak, Devdan, Deven, Devesh, Deveshwar, Devi, Devvrat, Dhananjay, Dhanapati, Dhanpati, Dhanesh, Dhanu, Dhanvin, Dharmaketu, Dhruv, Dhyanesh, Dhyaneshwar, Digambar, Digambara, Dinakar, Dinkar, Dinesh, Divaakar, Divakar, Deevakar, Divjot, Dron, Drona, Dwaipayan, Dwaipayana, Eekalabya, Ekalavya, Ekaksh, Ekaaksh, Ekaling, Ekdant, Ekadant, Gajaadhar, Gajadhar, Gajbaahu, Gajabahu, Ganak, Ganaka, Ganapati, Gandharv, Gandharva, Ganesh, Gangesh, Garud, Garuda, Gati, Gatik, Gaurang, Gauraang, Gauranga, Gouranga, Gautam, Gautama, Goutam, Ghanaanand, Ghanshyam, Ghanashyam, Giri, Girik, Girika, Girindra, Giriraaj, Giriraj, Girish, Gopal, Gopaal, Gopi, Gopee, Gorakhnath, Gorakhanatha, Goswamee, Goswami, Gotum, Gautam, Govinda, Gobinda, Gudakesha, Gudakesa, Gurdev, Guru, Hari, Harinarayan, Harit, Himadri, Hiranmay, Hiranmaya, Hiranya, Inder, Indra, Indra, Jagadish, Jagadisha, Jagathi, Jagdeep, Jagdish, Jagmeet, Jahnu, Jai, Javas, Jay, Jitendra, Jitender, Jyotis, Kailash, Kama, Kamalesh, Kamlesh, Kanak, Kanaka, Kannan, Kannen, Karan, Karthik, Kartik, Karunanidhi, Kashyap, Kiran, Kirti, Keerti, Krishna, Krishnadas, Krishnadasa, Kumar, Lai, Lakshman, Laxman, Lakshmidhar, Lakshminath, Lal, Laal, Mahendra, Mohinder, Mahesh, Maheswar, Mani, Manik, Manikya, Manoj, Marut, Mayoor, Meghnad, Meghnath, Mohan, Mukesh, Mukul, Nagabhushanam, Nanda, Narayan, Narendra, Narinder, Naveen, Navin, Nawal, Naval, Nimit, Niranjan, Nirbhay, Niro, Param, Paramartha, Pran, Pranay, Prasad, Prathamesh, Prayag, Prem, Puneet, Purushottam, Rahul, Raj, Rajan, Rajendra, Rajinder, Rajiv, Rakesh, Ramesh, Rameshwar, Ranjit, Ranjeet, Ravi, Ritesh, Rohan, Rohit, Rudra, Sachin, Sameer, Samir, Sanjay, Sanka, Sarvin, Satish, Satyen, Shankar, Shantanu, Shashi, Sher, Shiv, Siddarth, Siddhran, Som, Somu, Somnath, Subhash, Subodh, Suman, Suresh, Surya, Suryakant, Suryakanta, Sushil, Susheel, Swami, Swapnil, Tapan, Tara, Tarun, Tej, Tejas, Trilochan, Trilochana, Trilok, Trilokesh, Triloki, Triloki Nath, Trilokanath, Tushar, Udai, Udit, Ujjawal, Ujjwal, Umang, Upendra, Uttam, Vasudev, Vasudeva, Vedang, Vedanga, Vidhya, Vidur, Vidhur, Vijay, Vimal, Vinay, Vishnu, Bishnu, Vishwamitra, Vyas, Yogendra, Yoginder, Yogesh] 8 | last_name: [Abbott, Achari, Acharya, Adiga, Agarwal, Ahluwalia, Ahuja, Arora, Asan, Bandopadhyay, Banerjee, Bharadwaj, Bhat, Butt, Bhattacharya, Bhattathiri, Chaturvedi, Chattopadhyay, Chopra, Desai, Deshpande, Devar, Dhawan, Dubashi, Dutta, Dwivedi, Embranthiri, Ganaka, Gandhi, Gill, Gowda, Guha, Guneta, Gupta, Iyer, Iyengar, Jain, Jha, Johar, Joshi, Kakkar, Kaniyar, Kapoor, Kaul, Kaur, Khan, Khanna, Khatri, Kocchar, Mahajan, Malik, Marar, Menon, Mehra,Mehrotra, Mishra, Mukhopadhyay, Nayar, Naik, Nair, Nambeesan, Namboothiri, Nehru, Pandey, Panicker, Patel, Patil, Pilla, Pillai, Pothuvaal, Prajapat, Rana, Reddy, Saini, Sethi, Shah, Sharma, Shukla, Singh, Sinha, Somayaji, Tagore, Talwar, Tandon, Trivedi, Varrier, Varma, Varman, Verma] 9 | address: 10 | postcode: ['?#? #?#'] 11 | state: [Andra Pradesh, Arunachal Pradesh, Assam, Bihar, Chhattisgarh, Goa, Gujarat, Haryana, Himachal Pradesh, Jammu and Kashmir, Jharkhand, Karnataka, Kerala, Madya Pradesh, Maharashtra, Manipur, Meghalaya, Mizoram, Nagaland, Orissa, Punjab, Rajasthan, Sikkim, Tamil Nadu, Tripura, Uttaranchal, Uttar Pradesh, West Bengal, Andaman and Nicobar Islands, Chandigarh, Dadar and Nagar Haveli, Daman and Diu, Delhi, Lakshadweep, Pondicherry] 12 | state_abbr: [AP, AR, AS, BR, CG, DL, GA, GJ, HR, HP, JK, JS, KA, KL, MP, MH, MN, ML, MZ, NL, OR, PB, RJ, SK, TN, TR, UK, UP, WB, AN, CH, DN, DD, LD, PY] 13 | default_country: [India, Indian Republic, Bharat, Hindustan] 14 | internet: 15 | free_email: [gmail.com, yahoo.co.in, hotmail.com] 16 | domain_suffix: [in, com, biz, info, name, net, org, co.in] 17 | company: 18 | suffix: [Pvt Ltd, Limited, Ltd, and Sons, Corp, Group, Brothers] 19 | phone_number: 20 | formats: ['+91###-###-####', '+91##########', '+91-###-#######'] 21 | -------------------------------------------------------------------------------- /lib/charlatan.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * class Charlatan 5 | * 6 | **/ 7 | 8 | exports.Address = require('./charlatan/address'); 9 | exports.App = require('./charlatan/app'); 10 | exports.Avatar = require('./charlatan/avatar'); 11 | exports.Bitcoin = require('./charlatan/bitcoin'); 12 | exports.Business = require('./charlatan/business'); 13 | exports.Code = require('./charlatan/code'); 14 | exports.Commerce = require('./charlatan/commerce'); 15 | exports.Company = require('./charlatan/company'); 16 | exports.Date = require('./charlatan/date'); 17 | exports.Finance = require('./charlatan/finance'); 18 | exports.Hacker = require('./charlatan/hacker'); 19 | exports.Internet = require('./charlatan/internet'); 20 | exports.Lorem = require('./charlatan/lorem'); 21 | exports.Name = require('./charlatan/name'); 22 | exports.Number = require('./charlatan/number'); 23 | exports.PhoneNumber = require('./charlatan/phone_number'); 24 | exports.Team = require('./charlatan/team'); 25 | var Helpers = exports.Helpers = require('./charlatan/helpers'); 26 | 27 | // already loaded locales {<>: <>} 28 | var locales = require('./locales').locales; 29 | var addLocale = exports.addLocale = require('./locales').addLocale; 30 | 31 | 32 | var current_locale; 33 | var base_locale = 'en'; 34 | 35 | var Numbers = Helpers.range('0', '9'); 36 | var ULetters = Helpers.range('A', 'Z'); 37 | var Letters = ULetters.concat(Helpers.range('a', 'z')); 38 | 39 | 40 | // getValue(data, path) -> mixed 41 | // - data (object): locale 42 | // - path (array): path to property 43 | // 44 | // get value from locale hash 45 | function getValue(data, path) { 46 | if (typeof data !== 'object' || data === null) { 47 | return void 0; 48 | } else if (path.length === 1) { 49 | return data[path[0]]; 50 | } 51 | return getValue(data[path[0]], path.slice(1)); 52 | } 53 | 54 | 55 | // snake2camelcase(str) -> string 56 | // - str (string): source string 57 | // 58 | // locale files use snake notation `xxx_yyy_zzz` 59 | // but real methods use camelcase `xxxYyyZzz` 60 | function snake2camelcase(str) { 61 | return str.replace(/(\_[a-z])/g, function ($1) { 62 | return $1.toUpperCase().replace('_', ''); 63 | }); 64 | } 65 | 66 | 67 | /** 68 | * Charlatan.setLocale([name]) -> void 69 | * - name (String): locale name, for example `en-US` 70 | * 71 | * Set current locale. If name is not defined, revert back to default locale. 72 | **/ 73 | exports.setLocale = function (name) { 74 | if (!name) { 75 | name = base_locale; 76 | } 77 | if (!locales[name]) { 78 | addLocale(name); 79 | } 80 | current_locale = name; 81 | return true; 82 | }; 83 | 84 | 85 | /** 86 | * Charlatan.getLocale() -> String 87 | * 88 | * Get current locale 89 | **/ 90 | exports.getLocale = function () { 91 | return current_locale; 92 | }; 93 | 94 | 95 | /** 96 | * Charlatan.getAllLocales() -> [String] 97 | * 98 | * Get the list of all available locales 99 | **/ 100 | exports.getAllLocales = function () { 101 | return Object.keys(locales); 102 | }; 103 | 104 | 105 | /** 106 | * Charlatan.translate(key) -> mixed 107 | * - key (string): key in locale, for example `address.city_prefix` 108 | * 109 | * Returns a phrase from the locale. 110 | * 111 | * Fallbacks to base language (and then to `en`) 112 | * if it was not found: `ru-RU -> ru -> en` 113 | **/ 114 | exports.translate = function (key, options) { 115 | if (!options) { options = {}; } 116 | 117 | var locale = options.locale || current_locale; 118 | var lang = locale.split('-')[0]; 119 | var path = key.split('.'); 120 | var result = getValue(locales[locale], path); 121 | 122 | // fallback to root lang (`pt-BR` -> `pt`, but it can be missed) 123 | if (typeof result === 'undefined' && lang !== locale) { 124 | if (locales[lang]) { 125 | result = getValue(locales[lang], path); 126 | } 127 | } 128 | 129 | // fallback to base lang (en) 130 | if (typeof result === 'undefined') { 131 | result = getValue(locales[base_locale], path); 132 | } 133 | 134 | // oops 135 | if (typeof result === 'undefined') { 136 | throw new Error('Invalid path: ' + key); 137 | } 138 | 139 | return result; 140 | }; 141 | 142 | 143 | /** 144 | * Charlatan.fetch(key) -> mixed 145 | * - key (string): key in locale, for example `address.city_prefix` 146 | * 147 | * Helper for the common approach of grabbing a translation 148 | * with an array of values and selecting one of them. 149 | **/ 150 | var fetch = exports.fetch = function (key) { 151 | var fetched = exports.translate(key); 152 | 153 | if (Array.isArray(fetched)) { 154 | fetched = Helpers.sample(fetched); 155 | } 156 | 157 | if (fetched.match(/^\//) && fetched.match(/\/$/)) { 158 | fetched = exports.regexify(fetched); 159 | } 160 | 161 | return fetched; 162 | }; 163 | 164 | 165 | /** 166 | * Charlatan.parse(key) -> string 167 | * - key (string): key in locale, for example `address.city_prefix` 168 | * 169 | * Load formatted strings from the locale, "parsing" them 170 | * into method calls that can be used to generate a 171 | * formatted translation: e.g., "#{first_name} #{last_name}". 172 | **/ 173 | exports.parse = function (key) { 174 | var re = /#\{([A-Za-z]+(?:\.))?([^\}]+)\}/g; 175 | 176 | return fetch(key).replace(re, function (match, kls, method) { 177 | var text = ''; 178 | 179 | // If the token had a class Prefix (e.g., Name.first_name) 180 | // take it, otherwise use base namespace part 181 | if (!kls) { 182 | kls = exports.Helpers.capitalize(key.split('.')[0]); 183 | } else { 184 | kls = kls.slice(0, -1); 185 | } 186 | // If the class has the method, call it, otherwise 187 | // fetch the translation 188 | if (exports[kls] && 189 | typeof exports[kls][snake2camelcase(method)] === 'function') { 190 | 191 | text += exports[kls][snake2camelcase(method)].call(exports[kls]); 192 | } else { 193 | text += exports.fetch(kls.toLowerCase() + '.' + method); 194 | } 195 | 196 | return text; 197 | }); 198 | }; 199 | 200 | 201 | /** 202 | * Charlatan.numerify(source) -> string 203 | * - source (string): source string 204 | * 205 | * Find `#` symbol and replace it with random number 206 | **/ 207 | exports.numerify = function (source) { 208 | // make sure numerify results don’t start with a zero 209 | return source 210 | .replace(/\#/, function () { 211 | return Math.floor(Helpers.rand(10, 1)); 212 | }) 213 | .replace(/\#/g, function () { 214 | return Math.floor(Helpers.rand(10, 0)); 215 | }); 216 | }; 217 | 218 | 219 | /** 220 | * Charlatan.letterify(source) -> string 221 | * - source (string): source string 222 | * 223 | * Find `?` symbol and replace it with random char from [A..Z] 224 | **/ 225 | exports.letterify = function (source) { 226 | return source.replace(/\?/g, function () { 227 | return Helpers.sample(ULetters); 228 | }); 229 | }; 230 | 231 | 232 | /** 233 | * Charlatan.bothify(source) -> string 234 | * - source (string): source string 235 | * 236 | * Perform both `letterify` and `numerify` operations. 237 | **/ 238 | exports.bothify = function (source) { 239 | return exports.letterify(exports.numerify(source)); 240 | }; 241 | 242 | 243 | /** 244 | * Charlatan.regexify(re) -> String 245 | * - re(RegExp | String): regexp to sample from 246 | * 247 | * Given a regular expression, attempt to generate a string 248 | * that would match it. This is a rather simple implementation, 249 | * so don't be shocked if it blows up on you in a spectacular fashion. 250 | * 251 | * It does not handle ., *, unbounded ranges such as {1,}, 252 | * extensions such as (?=), character classes, some abbreviations 253 | * for character classes, and nested parentheses. 254 | * 255 | * I told you it was simple. :) It's also probably dog-slow, 256 | * so you shouldn't use it. 257 | * 258 | * It will take a regex like this: 259 | * 260 | * /^[A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}$/ 261 | * 262 | * and generate a string like this: 263 | * 264 | * "U3V 3TP" 265 | **/ 266 | exports.regexify = function (re) { 267 | // Handle either a Regexp or a String that looks like a Regexp 268 | if (Object.prototype.toString.call(re) === '[object RegExp]') { 269 | re = re.source; 270 | } 271 | 272 | // "baz", 2, 3 -> "bazbaz" or "bazbazbaz" 273 | function repeatRange(_unused, what, from, to) { 274 | return new Array(Helpers.rand(Number(to) + 1, Number(from)) + 1).join(what); 275 | } 276 | 277 | return re 278 | // Ditch the anchors 279 | .replace(/^\/?\^?/, '').replace(/\$?\/?$/, '') 280 | 281 | // All {2} become {2,2} and ? become {0,1} 282 | .replace(/\{(\d+)\}/g, '{$1,$1}').replace(/\?/g, '{0,1}') 283 | 284 | // [12]{1,2} becomes [12] or [12][12] 285 | .replace(/(\[[^\]]+\])\{(\d+),(\d+)\}/g, repeatRange) 286 | 287 | // (12|34){1,2} becomes (12|34) or (12|34)(12|34) 288 | .replace(/(\([^\)]+\))\{(\d+),(\d+)\}/g, repeatRange) 289 | 290 | // A{1,2} becomes A or AA or \d{3} becomes \d\d\d 291 | .replace(/(\\?.)\{(\d+),(\d+)\}/g, repeatRange) 292 | 293 | // (this|that) becomes 'this' or 'that' 294 | .replace(/\((.*?)\)/g, function (match) { 295 | return Helpers.sample(match.replace(/[\(\)]/g, '').split('|')); 296 | }) 297 | 298 | // All A-Z inside of [] become C (or X, or whatever) 299 | .replace(/\[([^\]]+)\]/g, function (match) { 300 | return match.replace(/(\w\-\w)/g, function (range) { 301 | range = range.split('-'); 302 | 303 | return Helpers.sample(Helpers.range(range[0], range[1])); 304 | }); 305 | }) 306 | 307 | // All [ABC] become B (or A or C) 308 | .replace(/\[([^\]]+)\]/g, function (m, str) { 309 | return Helpers.sample(str.split('')); 310 | }) 311 | 312 | .replace(/\\d/g, function () { 313 | return Helpers.sample(Numbers); 314 | }) 315 | 316 | .replace(/\\w/g, function () { 317 | return Helpers.sample(Letters); 318 | }); 319 | }; 320 | 321 | 322 | // Init Charlatan 323 | exports.setLocale(base_locale); 324 | -------------------------------------------------------------------------------- /lib/locales/it.yml: -------------------------------------------------------------------------------- 1 | it: 2 | faker: 3 | address: 4 | city_prefix: [San, Borgo, Sesto, Quarto, Settimo] 5 | city_suffix: [a mare, lido, ligure, del friuli, salentino, calabro, veneto, nell'emilia, umbro, laziale, terme, sardo] 6 | country: [Afghanistan, Albania, Algeria, American Samoa, Andorra, Angola, Anguilla, Antartide (territori a sud del 60° parallelo), Antigua e Barbuda, Argentina, Armenia, Aruba, Australia, Austria, Azerbaijan, Bahamas, Bahrain, Bangladesh, Barbados, Bielorussia, Belgio, Belize, Benin, Bermuda, Bhutan, Bolivia, Bosnia e Herzegovina, Botswana, Bouvet Island (Bouvetoya), Brasile, Territorio dell'arcipelago indiano, Isole Vergini Britanniche, Brunei Darussalam, Bulgaria, Burkina Faso, Burundi, Cambogia, Cameroon, Canada, Capo Verde, Isole Cayman, Repubblica Centrale Africana, Chad, Cile, Cina, Isola di Pasqua, Isola di Cocos (Keeling), Colombia, Comoros, Congo, Isole Cook, Costa Rica, Costa d'Avorio, Croazia, Cuba, Cipro, Repubblica Ceca, Danimarca, Gibuti, Repubblica Dominicana, Equador, Egitto, El Salvador, Guinea Equatoriale, Eritrea, Estonia, Etiopia, Isole Faroe, Isole Falkland (Malvinas), Fiji, Finlandia, Francia, Guyana Francese, Polinesia Francese, Territori Francesi del sud, Gabon, Gambia, Georgia, Germania, Ghana, Gibilterra, Grecia, Groenlandia, Grenada, Guadalupa, Guam, Guatemala, Guernsey, Guinea, Guinea-Bissau, Guyana, Haiti, Heard Island and McDonald Islands, Città del Vaticano, Honduras, Hong Kong, Ungheria, Islanda, India, Indonesia, Iran, Iraq, Irlanda, Isola di Man, Israele, Italia, Giamaica, Giappone, Jersey, Giordania, Kazakhstan, Kenya, Kiribati, Korea, Kuwait, Republicca Kirgiza, Repubblica del Laos, Latvia, Libano, Lesotho, Liberia, Libyan Arab Jamahiriya, Liechtenstein, Lituania, Lussemburgo, Macao, Macedonia, Madagascar, Malawi, Malesia, Maldive, Mali, Malta, Isole Marshall, Martinica, Mauritania, Mauritius, Mayotte, Messico, Micronesia, Moldova, Principato di Monaco, Mongolia, Montenegro, Montserrat, Marocco, Mozambico, Myanmar, Namibia, Nauru, Nepal, Antille Olandesi, Olanda, Nuova Caledonia, Nuova Zelanda, Nicaragua, Niger, Nigeria, Niue, Isole Norfolk, Northern Mariana Islands, Norvegia, Oman, Pakistan, Palau, Palestina, Panama, Papua Nuova Guinea, Paraguay, Peru, Filippine, Pitcairn Islands, Polonia, Portogallo, Porto Rico, Qatar, Reunion, Romania, Russia, Rwanda, San Bartolomeo, Sant'Elena, Saint Kitts and Nevis, Saint Lucia, Saint Martin, Saint Pierre and Miquelon, Saint Vincent and the Grenadines, Samoa, San Marino, Sao Tome and Principe, Arabia Saudita, Senegal, Serbia, Seychelles, Sierra Leone, Singapore, Slovenia, Isole Solomon, Somalia, Sud Africa, Georgia del sud e South Sandwich Islands, Spagna, Sri Lanka, Sudan, Suriname, Svalbard & Jan Mayen Islands, Swaziland, Svezia, Svizzera, Siria, Taiwan, Tajikistan, Tanzania, Tailandia, Timor-Leste, Togo, Tokelau, Tonga, Trinidad e Tobago, Tunisia, Turchia, Turkmenistan, Isole di Turks and Caicos, Tuvalu, Uganda, Ucraina, Emirati Arabi Uniti, Regno Unito, Stati Uniti d'America, United States Minor Outlying Islands, Isole Vergini Statunitensi, Uruguay, Uzbekistan, Vanuatu, Venezuela, Vietnam, Wallis and Futuna, Western Sahara, Yemen, Zambia, Zimbabwe] 7 | building_number: ['###', '##', '#'] 8 | street_suffix: [Piazza, Strada, Via, Borgo, Contrada, Rotonda, Incrocio] 9 | secondary_address: ['Appartamento ##', 'Piano #'] 10 | postcode: ['#####'] 11 | state: [Agrigento, Alessandria, Ancona, Aosta, Arezzo, Ascoli Piceno, Asti, Avellino, Bari, Barletta-Andria-Trani, Belluno, Benevento, Bergamo, Biella, Bologna, Bolzano, Brescia, Brindisi, Cagliari, Caltanissetta, Campobasso, Carbonia-Iglesias, Caserta, Catania, Catanzaro, Chieti, Como, Cosenza, Cremona, Crotone, Cuneo, Enna, Fermo, Ferrara, Firenze, Foggia, Forlì-Cesena, Frosinone, Genova, Gorizia, Grosseto, Imperia, Isernia, La Spezia, L'Aquila, Latina, Lecce, Lecco, Livorno, Lodi, Lucca, Macerata, Mantova, Massa-Carrara, Matera, Messina, Milano, Modena, Monza e della Brianza, Napoli, Novara, Nuoro, Olbia-Tempio, Oristano, Padova, Palermo, Parma, Pavia, Perugia, Pesaro e Urbino, Pescara, Piacenza, Pisa, Pistoia, Pordenone, Potenza, Prato, Ragusa, Ravenna, Reggio Calabria, Reggio Emilia, Rieti, Rimini, Roma, Rovigo, Salerno, Medio Campidano, Sassari, Savona, Siena, Siracusa, Sondrio, Taranto, Teramo, Terni, Torino, Ogliastra, Trapani, Trento, Treviso, Trieste, Udine, Varese, Venezia, Verbano-Cusio-Ossola, Vercelli, Verona, Vibo Valentia, Vicenza, Viterbo] 12 | state_abbr: [AG, AL, AN, AO, AR, AP, AT, AV, BA, BT, BL, BN, BG, BI, BO, BZ, BS, BR, CA, CL, CB, CI, CE, CT, CZ, CH, CO, CS, CR, KR, CN, EN, FM, FE, FI, FG, FC, FR, GE, GO, GR, IM, IS, SP, AQ, LT, LE, LC, LI, LO, LU, MC, MN, MS, MT, ME, MI, MO, MB, NA, NO, NU, OT, OR, PD, PA, PR, PV, PG, PU, PE, PC, PI, PT, PN, PZ, PO, RG, RA, RC, RE, RI, RN, RM, RO, SA, VS, SS, SV, SI, SR, SO, TA, TE, TR, TO, OG, TP, TN, TV, TS, UD, VA, VE, VB, VC, VR, VV, VI, VT] 13 | city: 14 | - "#{city_prefix} #{Name.first_name} #{city_suffix}" 15 | - "#{city_prefix} #{Name.first_name}" 16 | - "#{Name.first_name} #{city_suffix}" 17 | - "#{Name.last_name} #{city_suffix}" 18 | street_name: 19 | - "#{street_suffix} #{Name.first_name}" 20 | - "#{street_suffix} #{Name.last_name}" 21 | street_address: 22 | - "#{street_name} #{building_number}" 23 | - "#{street_name} #{building_number}, #{secondary_address}" 24 | default_country: [Italia] 25 | 26 | company: 27 | suffix: [SPA, e figli, Group, s.r.l.] 28 | buzzwords: 29 | - ["Abilità", "Access", "Adattatore", "Algoritmo", "Alleanza", "Analizzatore", "Applicazione", "Approccio", "Architettura", "Archivio", "Intelligenza artificiale", "Array", "Attitudine", "Benchmark", "Capacità", "Sfida", "Circuito", "Collaborazione", "Complessità", "Concetto", "Conglomerato", "Contingenza", "Core", "Database", "Data-warehouse", "Definizione", "Emulazione", "Codifica", "Criptazione", "Firmware", "Flessibilità", "Previsione", "Frame", "framework", "Funzione", "Funzionalità", "Interfaccia grafica", "Hardware", "Help-desk", "Gerarchia", "Hub", "Implementazione", "Infrastruttura", "Iniziativa", "Installazione", "Set di istruzioni", "Interfaccia", "Soluzione internet", "Intranet", "Conoscenza base", "Matrici", "Matrice", "Metodologia", "Middleware", "Migrazione", "Modello", "Moderazione", "Monitoraggio", "Moratoria", "Rete", "Architettura aperta", "Sistema aperto", "Orchestrazione", "Paradigma", "Parallelismo", "Policy", "Portale", "Struttura di prezzo", "Prodotto", "Produttività", "Progetto", "Proiezione", "Protocollo", "Servizio clienti", "Software", "Soluzione", "Standardizzazione", "Strategia", "Struttura", "Successo", "Sovrastruttura", "Supporto", "Sinergia", "Task-force", "Finestra temporale", "Strumenti", "Utilizzazione", "Sito web", "Forza lavoro"] 30 | - ["adattiva", "avanzata", "migliorata", "assimilata", "automatizzata", "bilanciata", "centralizzata", "compatibile", "configurabile", "cross-platform", "decentralizzata", "digitalizzata", "distribuita", "piccola", "ergonomica", "esclusiva", "espansa", "estesa", "configurabile", "fondamentale", "orizzontale", "implementata", "innovativa", "integrata", "intuitiva", "inversa", "gestita", "obbligatoria", "monitorata", "multi-canale", "multi-laterale", "open-source", "operativa", "ottimizzata", "organica", "persistente", "polarizzata", "proattiva", "programmabile", "progressiva", "reattiva", "riallineata", "ricontestualizzata", "ridotta", "robusta", "sicura", "condivisibile", "stand-alone", "switchabile", "sincronizzata", "sinergica", "totale", "universale", "user-friendly", "versatile", "virtuale", "visionaria"] 31 | - ["24 ore", "24/7", "terza generazione", "quarta generazione", "quinta generazione", "sesta generazione", "asimmetrica", "asincrona", "background", "bi-direzionale", "biforcata", "bottom-line", "coerente", "coesiva", "composita", "sensibile al contesto", "basta sul contesto", "basata sul contenuto", "dedicata", "didattica", "direzionale", "discreta", "dinamica", "eco-centrica", "esecutiva", "esplicita", "full-range", "globale", "euristica", "alto livello", "olistica", "omogenea", "ibrida", "impattante", "incrementale", "intangibile", "interattiva", "intermediaria", "locale", "logistica", "massimizzata", "metodica", "mission-critical", "mobile", "modulare", "motivazionale", "multimedia", "multi-tasking", "nazionale", "neutrale", "nextgeneration", "non-volatile", "object-oriented", "ottima", "ottimizzante", "radicale", "real-time", "reciproca", "regionale", "responsiva", "scalabile", "secondaria", "stabile", "statica", "sistematica", "sistemica", "tangibile", "terziaria", "uniforme", "valore aggiunto"] 32 | bs: 33 | - ["partnerships", "comunità", "ROI", "soluzioni", "e-services", "nicchie", "tecnologie", "contenuti", "supply-chains", "convergenze", "relazioni", "architetture", "interfacce", "mercati", "e-commerce", "sistemi", "modelli", "schemi", "reti", "applicazioni", "metriche", "e-business", "funzionalità", "esperienze", "webservices", "metodologie"] 34 | - ["implementate", "utilizzo", "integrate", "ottimali", "evolutive", "abilitate", "reinventate", "aggregate", "migliorate", "incentivate", "monetizzate", "sinergizzate", "strategiche", "deploy", "marchi", "accrescitive", "target", "sintetizzate", "spedizioni", "massimizzate", "innovazione", "guida", "estensioni", "generate", "exploit", "transizionali", "matrici", "ricontestualizzate"] 35 | - ["valore aggiunto", "verticalizzate", "proattive", "forti", "rivoluzionari", "scalabili", "innovativi", "intuitivi", "strategici", "e-business", "mission-critical", "24/7", "globali", "B2B", "B2C", "granulari", "virtuali", "virali", "dinamiche", "magnetiche", "web", "interattive", "sexy", "back-end", "real-time", "efficienti", "front-end", "distributivi", "estensibili", "mondiali", "open-source", "cross-platform", "sinergiche", "out-of-the-box", "enterprise", "integrate", "di impatto", "wireless", "trasparenti", "next-generation", "cutting-edge", "visionari", "plug-and-play", "collaborative", "olistiche", "ricche"] 36 | name: 37 | - "#{Name.last_name} #{suffix}" 38 | - "#{Name.last_name}-#{Name.last_name} #{suffix}" 39 | - "#{Name.last_name}, #{Name.last_name} e #{Name.last_name} #{suffix}" 40 | 41 | internet: 42 | free_email: [gmail.com, yahoo.com, hotmail.com, email.it, libero.it, yahoo.it] 43 | domain_suffix: [com, com, com, net, org, it, it, it] 44 | 45 | name: 46 | first_name: [Aaron, Akira, Alberto, Alessandro, Alighieri, Amedeo, Amos, Anselmo, Antonino, Arcibaldo, Armando, Artes, Audenico, Ausonio, Bacchisio, Battista, Bernardo, Boris, Caio, Carlo, Cecco, Cirino, Cleros, Costantino, Damiano, Danny, Davide, Demian, Dimitri, Domingo, Dylan, Edilio, Egidio, Elio, Emanuel, Enrico, Ercole, Ermes, Ethan, Eusebio, Evangelista, Fabiano, Ferdinando, Fiorentino, Flavio, Fulvio, Gabriele, Gastone, Germano, Giacinto, Gianantonio, Gianleonardo, Gianmarco, Gianriccardo, Gioacchino, Giordano, Giuliano, Graziano, Guido, Harry, Iacopo, Ilario, Ione, Italo, Jack, Jari, Joey, Joseph, Kai, Kociss, Laerte, Lauro, Leonardo, Liborio, Lorenzo, Ludovico, Maggiore, Manuele, Mariano, Marvin, Matteo, Mauro, Michael, Mirco, Modesto, Muzio, Nabil, Nathan, Nick, Noah, Odino, Olo, Oreste, Osea, Pablo, Patrizio, Piererminio, Pierfrancesco, Piersilvio, Priamo, Quarto, Quirino, Radames, Raniero, Renato, Rocco, Romeo, Rosalino, Rudy, Sabatino, Samuel, Santo, Sebastian, Serse, Silvano, Sirio, Tancredi, Terzo, Timoteo, Tolomeo, Trevis, Ubaldo, Ulrico, Valdo, Neri, Vinicio, Walter, Xavier, Yago, Zaccaria, Abramo, Adriano, Alan, Albino, Alessio, Alighiero, Amerigo, Anastasio, Antimo, Antonio, Arduino, Aroldo, Arturo, Augusto, Avide, Baldassarre, Bettino, Bortolo, Caligola, Carmelo, Celeste, Ciro, Costanzo, Dante, Danthon, Davis, Demis, Dindo, Domiziano, Edipo, Egisto, Eliziario, Emidio, Enzo, Eriberto, Erminio, Ettore, Eustachio, Fabio, Fernando, Fiorenzo, Folco, Furio, Gaetano, Gavino, Gerlando, Giacobbe, Giancarlo, Gianmaria, Giobbe, Giorgio, Giulio, Gregorio, Hector, Ian, Ippolito, Ivano, Jacopo, Jarno, Joannes, Joshua, Karim, Kris, Lamberto, Lazzaro, Leone, Lino, Loris, Luigi, Manfredi, Marco, Marino, Marzio, Mattia, Max, Michele, Mirko, Moreno, Nadir, Nazzareno, Nestore, Nico, Noel, Odone, Omar, Orfeo, Osvaldo, Pacifico, Pericle, Pietro, Primo, Quasimodo, Radio, Raoul, Renzo, Rodolfo, Romolo, Rosolino, Rufo, Sabino, Sandro, Sasha, Secondo, Sesto, Silverio, Siro, Tazio, Teseo, Timothy, Tommaso, Tristano, Umberto, Ariel, Artemide, Assia, Azue, Benedetta, Bibiana, Brigitta, Carmela, Cassiopea, Cesidia, Cira, Clea, Cleopatra, Clodovea, Concetta, Cosetta, Cristyn, Damiana, Danuta, Deborah, Demi, Diamante, Diana, Donatella, Doriana, Edvige, Elda, Elga, Elsa, Emilia, Enrica, Erminia, Eufemia, Evita, Fatima, Felicia, Filomena, Flaviana, Fortunata, Gelsomina, Genziana, Giacinta, Gilda, Giovanna, Giulietta, Grazia, Guendalina, Helga, Ileana, Ingrid, Irene, Isabel, Isira, Ivonne, Jelena, Jole, Claudia, Kayla, Kristel, Laura, Lucia, Lia, Lidia, Lisa, Loredana, Loretta, Luce, Lucrezia, Luna, Maika, Marcella, Maria, Mariagiulia, Marianita, Mariapia, Marieva, Marina, Maristella, Maruska, Matilde, Mecren, Mercedes, Mietta, Miriana, Miriam, Monia, Morgana, Naomi, Nayade, Nicoletta, Ninfa, Noemi, Nunzia, Olimpia, Oretta, Ortensia, Penelope, Piccarda, Prisca, Rebecca, Rita, Rosalba, Rosaria, Rosita, Ruth, Samira, Sarita, Selvaggia, Shaira, Sibilla, Soriana, Thea, Tosca, Ursula, Vania, Vera, Vienna, Violante, Vitalba, Zelida] 47 | last_name: [Amato, Barbieri, Barone, Basile, Battaglia, Bellini, Benedetti, Bernardi, Bianc, Bianchi, Bruno, Caputo, Carbon, Caruso, Cattaneo, Colombo, Cont, Conte, Coppola, Costa, Costantin, D'amico, D'angelo, Damico, De Angelis, De luca, De rosa, De Santis, Donati, Esposito, Fabbri, Farin, Ferrara, Ferrari, Ferraro, Ferretti, Ferri, Fior, Fontana, Galli, Gallo, Gatti, Gentile, Giordano, Giuliani, Grassi, Grasso, Greco, Guerra, Leone, Lombardi, Lombardo, Longo, Mancini, Marchetti, Marian, Marini, Marino, Martinelli, Martini, Martino, Mazza, Messina, Milani, Montanari, Monti, Morelli, Moretti, Negri, Neri, Orlando, Pagano, Palmieri, Palumbo, Parisi, Pellegrini, Pellegrino, Piras, Ricci, Rinaldi, Riva, Rizzi, Rizzo, Romano, Ross, Rossetti, Ruggiero, Russo, Sala, Sanna, Santoro, Sartori, Serr, Silvestri, Sorrentino, Testa, Valentini, Villa, Vitale, Vitali] 48 | prefix: [Sig., Dott., Dr., Ing.] 49 | suffix: [] 50 | name: 51 | - "#{prefix} #{first_name} #{last_name}" 52 | - "#{first_name} #{last_name}" 53 | - "#{first_name} #{last_name}" 54 | - "#{first_name} #{last_name}" 55 | - "#{first_name} #{last_name}" 56 | - "#{first_name} #{last_name}" 57 | 58 | phone_number: 59 | formats: ['+## ### ## ## ####', '+## ## #######', '+## ## ########', '+## ### #######', '+## ### ########', '+## #### #######', '+## #### ########', '0## ### ####', '+39 0## ### ###', '3## ### ###', '+39 3## ### ###'] -------------------------------------------------------------------------------- /lib/locales/ru.yml: -------------------------------------------------------------------------------- 1 | ru: 2 | faker: 3 | separator: " и " 4 | address: 5 | country: [Австралия, Австрия, Азербайджан, Албания, Алжир, Американское Самоа (не признана), Ангилья, Ангола, Андорра, Антарктика (не признана), Антигуа и Барбуда, Антильские Острова (не признана), Аомынь (не признана), Аргентина, Армения, Афганистан, Багамские Острова, Бангладеш, Барбадос, Бахрейн, Беларусь, Белиз, Бельгия, Бенин, Болгария, Боливия, Босния и Герцеговина, Ботсвана, Бразилия, Бруней, Буркина-Фасо, Бурунди, Бутан, Вануату, Ватикан, Великобритания, Венгрия, Венесуэла, Восточный Тимор, Вьетнам, Габон, Гаити, Гайана, Гамбия, Гана, Гваделупа (не признана), Гватемала, Гвиана (не признана), Гвинея, Гвинея-Бисау, Германия, Гондурас, Гренада, Греция, Грузия, Дания, Джибути, Доминика, Доминиканская Республика, Египет, Замбия, Зимбабве, Израиль, Индия, Индонезия, Иордания, Ирак, Иран, Ирландия, Исландия, Испания, Италия, Йемен, Кабо-Верде, Казахстан, Камбоджа, Камерун, Канада, Катар, Кения, Кипр, Кирибати, Китай, Колумбия, Коморские Острова, Конго, Демократическая Республика, Корея (Северная), Корея (Южная), Косово, Коста-Рика, Кот-д'Ивуар, Куба, Кувейт, Кука острова, Кыргызстан, Лаос, Латвия, Лесото, Либерия, Ливан, Ливия, Литва, Лихтенштейн, Люксембург, Маврикий, Мавритания, Мадагаскар, Македония, Малави, Малайзия, Мали, Мальдивы, Мальта, Маршалловы Острова, Мексика, Микронезия, Мозамбик, Молдова, Монако, Монголия, Марокко, Мьянма, Намибия, Науру, Непал, Нигер, Нигерия, Нидерланды, Никарагуа, Новая Зеландия, Норвегия, Объединенные Арабские Эмираты, Оман, Пакистан, Палау, Панама, Папуа — Новая Гвинея, Парагвай, Перу, Польша, Португалия, Республика Конго, Россия, Руанда, Румыния, Сальвадор, Самоа, Сан-Марино, Сан-Томе и Принсипи, Саудовская Аравия, Свазиленд, Сейшельские острова, Сенегал, Сент-Винсент и Гренадины, Сент-Киттс и Невис, Сент-Люсия, Сербия, Сингапур, Сирия, Словакия, Словения, Соединенные Штаты Америки, Соломоновы Острова, Сомали, Судан, Суринам, Сьерра-Леоне, Таджикистан, Таиланд, Тайвань (не признана), Тамил-Илам (не признана), Танзания, Тёркс и Кайкос (не признана), Того, Токелау (не признана), Тонга, Тринидад и Тобаго, Тувалу, Тунис, Турецкая Республика Северного Кипра (не признана), Туркменистан, Турция, Уганда, Узбекистан, Украина, Уругвай, Фарерские Острова (не признана), Фиджи, Филиппины, Финляндия, Франция, Французская Полинезия (не признана), Хорватия, Центральноафриканская Республика, Чад, Черногория, Чехия, Чили, Швейцария, Швеция, Шри-Ланка, Эквадор, Экваториальная Гвинея, Эритрея, Эстония, Эфиопия, Южно-Африканская Республика, Ямайка, Япония] 6 | building_number: ['###'] 7 | street_suffix: ['ул.', 'улица', 'проспект', 'пр.', 'площадь', 'пл.'] 8 | secondary_address: ['кв. ###'] 9 | postcode: ['######'] 10 | state: [Республика Адыгея, Республика Башкортостан, Республика Бурятия, Республика Алтай Республика Дагестан, Республика Ингушетия, Кабардино-Балкарская Республика, Республика Калмыкия, Республика Карачаево-Черкессия, Республика Карелия, Республика Коми, Республика Марий Эл, Республика Мордовия, Республика Саха (Якутия), Республика Северная Осетия-Алания, Республика Татарстан, Республика Тыва, Удмуртская Республика, Республика Хакасия, Чувашская Республика, Алтайский край, Краснодарский край, Красноярский край, Приморский край, Ставропольский край, Хабаровский край, Амурская область, Архангельская область, Астраханская область, Белгородская область, Брянская область, Владимирская область, Волгоградская область, Вологодская область, Воронежская область, Ивановская область, Иркутская область, Калиниградская область, Калужская область, Камчатская область, Кемеровская область, Кировская область, Костромская область, Курганская область, Курская область, Ленинградская область, Липецкая область, Магаданская область, Московская область, Мурманская область, Нижегородская область, Новгородская область, Новосибирская область, Омская область, Оренбургская область, Орловская область, Пензенская область, Пермская область, Псковская область, Ростовская область, Рязанская область, Самарская область, Саратовская область, Сахалинская область, Свердловская область, Смоленская область, Тамбовская область, Тверская область, Томская область, Тульская область, Тюменская область, Ульяновская область, Челябинская область, Читинская область, Ярославская область, Еврейская автономная область, Агинский Бурятский авт. округ, Коми-Пермяцкий автономный округ, Корякский автономный округ, Ненецкий автономный округ, Таймырский (Долгано-Ненецкий) автономный округ, Усть-Ордынский Бурятский автономный округ, Ханты-Мансийский автономный округ, Чукотский автономный округ, Эвенкийский автономный округ, Ямало-Ненецкий автономный округ, Чеченская Республика] 11 | street_title: [Советская, Молодежная, Центральная, Школьная, Новая, Садовая, Лесная, Набережная, Ленина, Мира, Октябрьская, Зеленая, Комсомольская, Заречная, Первомайская, Гагарина, Полевая, Луговая, Пионерская, Кирова, Юбилейная, Северная, Пролетарская, Степная, Пушкина, Калинина, Южная, Колхозная, Рабочая, Солнечная, Железнодорожная, Восточная, Заводская, Чапаева, Нагорная, Строителей, Береговая, Победы, Горького, Кооперативная, Красноармейская, Совхозная, Речная, Школьный , Спортивная, Озерная, Строительная, Парковая, Чкалова, Мичурина, речень улиц, Подгорная, Дружбы, Почтовая, Партизанская, Вокзальная, Лермонтова, Свободы, Дорожная, Дачная, Маяковского, Западная, Фрунзе, Дзержинского, Московская, Свердлова, Некрасова, Гоголя, Красная, Трудовая, Шоссейная, Чехова, Коммунистическая, Труда, Комарова, Матросова, Островского, Сосновая, Клубная, Куйбышева, Крупской, Березовая, Карла Маркса, 8 Марта, Больничная, Садовый , Интернациональная, Суворова, Цветочная, Трактовая, Ломоносова, Горная, Космонавтов, Энергетиков, Шевченко, Весенняя, Механизаторов, Коммунальная, Лесной , 40 лет Победы, Майская] 12 | city_name: [Москва, Владимир, Санкт-Петербург, Новосибирск, Екатеринбург, Нижний Новгород, Самара, Казань, Омск, Челябинск, Ростов-на-Дону, Уфа, Волгоград, Пермь, Красноярск, Воронеж, Саратов, Краснодар, Тольятти, Ижевск, Барнаул, Ульяновск, Тюмень, Иркутск, Владивосток, Ярославль, Хабаровск, Махачкала, Оренбург, Новокузнецк, Томск, Кемерово, Рязань, Астрахань, Пенза, Липецк, Тула, Киров, Чебоксары, Курск, Брянск, Магнитогорск, Иваново, Тверь, Ставрополь, Белгород, Сочи] 13 | city: 14 | - "#{Address.city_name}" 15 | street_name: 16 | - "#{street_suffix} #{Address.street_title}" 17 | - "#{Address.street_title} #{street_suffix}" 18 | street_address: 19 | - "#{street_name}, #{building_number}" 20 | default_country: [Россия] 21 | 22 | internet: 23 | free_email: [yandex.ru, ya.ru, mail.ru, gmail.com, yahoo.com, hotmail.com] 24 | domain_suffix: [com, ru, info, рф, net, org] 25 | 26 | name: 27 | male_first_name: [Александр, Алексей, Альберт, Анатолий, Андрей, Антон, Аркадий, Арсений, Артём, Борис, Вадим, Валентин, Валерий, Василий, Виктор, Виталий, Владимир, Владислав, Вячеслав, Геннадий, Георгий, Герман, Григорий, Даниил, Денис, Дмитрий, Евгений, Егор, Иван, Игнатий, Игорь, Илья, Константин, Лаврентий, Леонид, Лука, Макар, Максим, Матвей, Михаил, Никита, Николай, Олег, Роман, Семён, Сергей, Станислав, Степан, Фёдор, Эдуард, Юрий, Ярослав] 28 | male_middle_name: [Александрович, Алексеевич, Альбертович, Анатольевич, Андреевич, Антонович, Аркадьевич, Арсеньевич, Артёмович, Борисович, Вадимович, Валентинович, Валерьевич, Васильевич, Викторович, Витальевич, Владимирович, Владиславович, Вячеславович, Геннадьевич, Георгиевич, Германович, Григорьевич, Даниилович, Денисович, Дмитриевич, Евгеньевич, Егорович, Иванович, Игнатьевич, Игоревич, Ильич, Константинович, Лаврентьевич, Леонидович, Лукич, Макарович, Максимович, Матвеевич, Михайлович, Никитич, Николаевич, Олегович, Романович, Семёнович, Сергеевич, Станиславович, Степанович, Фёдорович, Эдуардович, Юрьевич, Ярославович] 29 | male_last_name: [Смирнов, Иванов, Кузнецов, Попов, Соколов, Лебедев, Козлов, Новиков, Морозов, Петров, Волков, Соловьев, Васильев, Зайцев, Павлов, Семенов, Голубев, Виноградов, Богданов, Воробьев, Федоров, Михайлов, Беляев, Тарасов, Белов, Комаров, Орлов, Киселев, Макаров, Андреев, Ковалев, Ильин, Гусев, Титов, Кузьмин, Кудрявцев, Баранов, Куликов, Алексеев, Степанов, Яковлев, Сорокин, Сергеев, Романов, Захаров, Борисов, Королев, Герасимов, Пономарев, Григорьев, Лазарев, Медведев, Ершов, Никитин, Соболев, Рябов, Поляков, Цветков, Данилов, Жуков, Фролов, Журавлев, Николаев, Крылов, Максимов, Сидоров, Осипов, Белоусов, Федотов, Дорофеев, Егоров, Матвеев, Бобров, Дмитриев, Калинин, Анисимов, Петухов, Антонов, Тимофеев, Никифоров, Веселов, Филиппов, Марков, Большаков, Суханов, Миронов, Ширяев, Александров, Коновалов, Шестаков, Казаков, Ефимов, Денисов, Громов, Фомин, Давыдов, Мельников, Щербаков, Блинов, Колесников, Карпов, Афанасьев, Власов, Маслов, Исаков, Тихонов, Аксенов, Гаврилов, Родионов, Котов, Горбунов, Кудряшов, Быков, Зуев, Третьяков, Савельев, Панов, Рыбаков, Суворов, Абрамов, Воронов, Мухин, Архипов, Трофимов, Мартынов, Емельянов, Горшков, Чернов, Овчинников, Селезнев, Панфилов, Копылов, Михеев, Галкин, Назаров, Лобанов, Лукин, Беляков, Потапов, Некрасов, Хохлов, Жданов, Наумов, Шилов, Воронцов, Ермаков, Дроздов, Игнатьев, Савин, Логинов, Сафонов, Капустин, Кириллов, Моисеев, Елисеев, Кошелев, Костин, Горбачев, Орехов, Ефремов, Исаев, Евдокимов, Калашников, Кабанов, Носков, Юдин, Кулагин, Лапин, Прохоров, Нестеров, Харитонов, Агафонов, Муравьев, Ларионов, Федосеев, Зимин, Пахомов, Шубин, Игнатов, Филатов, Крюков, Рогов, Кулаков, Терентьев, Молчанов, Владимиров, Артемьев, Гурьев, Зиновьев, Гришин, Кононов, Дементьев, Ситников, Симонов, Мишин, Фадеев, Комиссаров, Мамонтов, Носов, Гуляев, Шаров, Устинов, Вишняков, Евсеев, Лаврентьев, Брагин, Константинов, Корнилов, Авдеев, Зыков, Бирюков, Шарапов, Никонов, Щукин, Дьячков, Одинцов, Сазонов, Якушев, Красильников, Гордеев, Самойлов, Князев, Беспалов, Уваров, Шашков, Бобылев, Доронин, Белозеров, Рожков, Самсонов, Мясников, Лихачев, Буров, Сысоев, Фомичев, Русаков, Стрелков, Гущин, Тетерин, Колобов, Субботин, Фокин, Блохин, Селиверстов, Пестов, Кондратьев, Силин, Меркушев, Лыткин, Туров] 30 | female_first_name: [Анна, Алёна, Алевтина, Александра, Алина, Алла, Анастасия, Ангелина, Анжела, Анжелика, Антонида, Антонина, Анфиса, Арина, Валентина, Валерия, Варвара, Василиса, Вера, Вероника, Виктория, Галина, Дарья, Евгения, Екатерина, Елена, Елизавета, Жанна, Зинаида, Зоя, Ирина, Кира, Клавдия, Ксения, Лариса, Лидия, Любовь, Людмила, Маргарита, Марина, Мария, Надежда, Наталья, Нина, Оксана, Ольга, Раиса, Регина, Римма, Светлана, София, Таисия, Тамара, Татьяна, Ульяна, Юлия] 31 | female_middle_name: [Александровна, Алексеевна, Альбертовна, Анатольевна, Андреевна, Антоновна, Аркадьевна, Арсеньевна, Артёмовна, Борисовна, Вадимовна, Валентиновна, Валерьевна, Васильевна, Викторовна, Витальевна, Владимировна, Владиславовна, Вячеславовна, Геннадьевна, Георгиевна, Германовна, Григорьевна, Данииловна, Денисовна, Дмитриевна, Евгеньевна, Егоровна, Ивановна, Игнатьевна, Игоревна, Ильинична, Константиновна, Лаврентьевна, Леонидовна, Макаровна, Максимовна, Матвеевна, Михайловна, Никитична, Николаевна, Олеговна, Романовна, Семёновна, Сергеевна, Станиславовна, Степановна, Фёдоровна, Эдуардовна, Юрьевна, Ярославовна] 32 | female_last_name: [Смирнова, Иванова, Кузнецова, Попова, Соколова, Лебедева, Козлова, Новикова, Морозова, Петрова, Волкова, Соловьева, Васильева, Зайцева, Павлова, Семенова, Голубева, Виноградова, Богданова, Воробьева, Федорова, Михайлова, Беляева, Тарасова, Белова, Комарова, Орлова, Киселева, Макарова, Андреева, Ковалева, Ильина, Гусева, Титова, Кузьмина, Кудрявцева, Баранова, Куликова, Алексеева, Степанова, Яковлева, Сорокина, Сергеева, Романова, Захарова, Борисова, Королева, Герасимова, Пономарева, Григорьева, Лазарева, Медведева, Ершова, Никитина, Соболева, Рябова, Полякова, Цветкова, Данилова, Жукова, Фролова, Журавлева, Николаева, Крылова, Максимова, Сидорова, Осипова, Белоусова, Федотова, Дорофеева, Егорова, Матвеева, Боброва, Дмитриева, Калинина, Анисимова, Петухова, Антонова, Тимофеева, Никифорова, Веселова, Филиппова, Маркова, Большакова, Суханова, Миронова, Ширяева, Александрова, Коновалова, Шестакова, Казакова, Ефимова, Денисова, Громова, Фомина, Давыдова, Мельникова, Щербакова, Блинова, Колесникова, Карпова, Афанасьева, Власова, Маслова, Исакова, Тихонова, Аксенова, Гаврилова, Родионова, Котова, Горбунова, Кудряшова, Быкова, Зуева, Третьякова, Савельева, Панова, Рыбакова, Суворова, Абрамова, Воронова, Мухина, Архипова, Трофимова, Мартынова, Емельянова, Горшкова, Чернова, Овчинникова, Селезнева, Панфилова, Копылова, Михеева, Галкина, Назарова, Лобанова, Лукина, Белякова, Потапова, Некрасова, Хохлова, Жданова, Наумова, Шилова, Воронцова, Ермакова, Дроздова, Игнатьева, Савина, Логинова, Сафонова, Капустина, Кириллова, Моисеева, Елисеева, Кошелева, Костина, Горбачева, Орехова, Ефремова, Исаева, Евдокимова, Калашникова, Кабанова, Носкова, Юдина, Кулагина, Лапина, Прохорова, Нестерова, Харитонова, Агафонова, Муравьева, Ларионова, Федосеева, Зимина, Пахомова, Шубина, Игнатова, Филатова, Крюкова, Рогова, Кулакова, Терентьева, Молчанова, Владимирова, Артемьева, Гурьева, Зиновьева, Гришина, Кононова, Дементьева, Ситникова, Симонова, Мишина, Фадеева, Комиссарова, Мамонтова, Носова, Гуляева, Шарова, Устинова, Вишнякова, Евсеева, Лаврентьева, Брагина, Константинова, Корнилова, Авдеева, Зыкова, Бирюкова, Шарапова, Никонова, Щукина, Дьячкова, Одинцова, Сазонова, Якушева, Красильникова, Гордеева, Самойлова, Князева, Беспалова, Уварова, Шашкова, Бобылева, Доронина, Белозерова, Рожкова, Самсонова, Мясникова, Лихачева, Бурова, Сысоева, Фомичева, Русакова, Стрелкова, Гущина, Тетерина, Колобова, Субботина, Фокина, Блохина, Селиверстова, Пестова, Кондратьева, Силина, Меркушева, Лыткина, Турова] 33 | name: 34 | - "#{male_first_name} #{male_last_name}" 35 | - "#{male_last_name} #{male_first_name}" 36 | - "#{male_first_name} #{male_middle_name} #{male_last_name}" 37 | - "#{male_last_name} #{male_first_name} #{male_middle_name}" 38 | - "#{female_first_name} #{female_last_name}" 39 | - "#{female_last_name} #{female_first_name}" 40 | - "#{female_first_name} #{female_middle_name} #{female_last_name}" 41 | - "#{female_last_name} #{female_first_name} #{female_middle_name}" 42 | 43 | phone_number: 44 | formats: ['(9##)###-##-##'] 45 | 46 | commerce: 47 | color: [красный, зеленый, синий, желтый, багровый, мятный, зеленовато-голубой, белый, черный, оранжевый, розовый, серый, красно-коричневый, фиолетовый, бирюзовый, желто-коричневый, небесно голубой, оранжево-розовый, темно-фиолетовый, орхидный, оливковый, пурпурный, лимонный, кремовый, сине-фиолетовый, золотой, красно-пурпурный, голубой, лазурный, лиловый, серебряный] 48 | department: ["Книги", "Фильмы", "музыка", "игры", "Электроника", "компьютеры", "Дом", "садинструмент", "Бакалея", "здоровье", "красота", "Игрушки", "детское", "для малышей", "Одежда", "обувь", "украшения", "Спорт", "туризм", "Автомобильное", "промышленное"] 49 | product_name: 50 | adjective: [Маленький, Эргономичный, Грубый, Интеллектуальный, Великолепный, Невероятный, Фантастический, Практчиный, Лоснящийся, Потрясающий] 51 | material: [Стальной, Деревянный, Бетонный, Пластиковый, Хлопковый, Гранитный, Резиновый] 52 | product: [Стул, Автомобиль, Компьютер, Берет, Кулон, Стол, Свитер, Ремень, Ботинок] 53 | 54 | company: 55 | prefix: [ИП, ООО, ЗАО, ОАО, НКО, ТСЖ, ОП] 56 | suffix: [Снаб, Торг, Пром, Трейд, Сбыт] 57 | name: 58 | - "#{prefix} #{Name.female_first_name}" 59 | - "#{prefix} #{Name.male_first_name}" 60 | - "#{prefix} #{Name.male_last_name}" 61 | - "#{prefix} #{suffix}#{suffix}" 62 | - "#{prefix} #{suffix}#{suffix}#{suffix}" 63 | - "#{prefix} #{Address.city_name}#{suffix}" 64 | - "#{prefix} #{Address.city_name}#{suffix}#{suffix}" 65 | - "#{prefix} #{Address.city_name}#{suffix}#{suffix}#{suffix}" 66 | --------------------------------------------------------------------------------