diff options
| author | Matt Mayer <[email protected]> | 2023-02-21 15:43:28 +0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-02-21 08:43:28 +0000 |
| commit | 0f98518f0906a9660dcdb8993b6cb983c5e4c92f (patch) | |
| tree | b5a3fe8c0c270e7b07050a9712d66df8a0774f3d /src | |
| parent | a05c3e5fed805c5086a22841a81da0d86ab89386 (diff) | |
| download | faker-0f98518f0906a9660dcdb8993b6cb983c5e4c92f.tar.xz faker-0f98518f0906a9660dcdb8993b6cb983c5e4c92f.zip | |
fix(person): avoid repeated last name via new last_name_patterns (#1819)
Diffstat (limited to 'src')
25 files changed, 142 insertions, 60 deletions
diff --git a/src/definitions/person.ts b/src/definitions/person.ts index b6096e81..7b54860c 100644 --- a/src/definitions/person.ts +++ b/src/definitions/person.ts @@ -30,6 +30,13 @@ export type PersonDefinitions = LocaleEntry<{ */ name: Array<{ value: string; weight: number }>; + /** + * A weighted list of patterns used to generate last names. + */ + last_name_patterns?: Array<{ value: string; weight: number }>; + male_last_name_patterns?: Array<{ value: string; weight: number }>; + female_last_name_patterns?: Array<{ value: string; weight: number }>; + bio_patterns?: string[]; title: PersonTitleDefinitions; diff --git a/src/locales/en_GB/index.ts b/src/locales/en_GB/index.ts index d800b976..11ae9ac6 100644 --- a/src/locales/en_GB/index.ts +++ b/src/locales/en_GB/index.ts @@ -6,6 +6,7 @@ import type { LocaleDefinition } from '../..'; import cell_phone from './cell_phone'; import internet from './internet'; import location from './location'; +import person from './person'; import phone_number from './phone_number'; const en_GB: LocaleDefinition = { @@ -13,6 +14,7 @@ const en_GB: LocaleDefinition = { cell_phone, internet, location, + person, phone_number, }; diff --git a/src/locales/en_GB/person/index.ts b/src/locales/en_GB/person/index.ts new file mode 100644 index 00000000..e76a78a7 --- /dev/null +++ b/src/locales/en_GB/person/index.ts @@ -0,0 +1,14 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { PersonDefinitions } from '../../..'; +import last_name_patterns from './last_name_patterns'; +import name_ from './name'; + +const person: PersonDefinitions = { + last_name_patterns, + name: name_, +}; + +export default person; diff --git a/src/locales/en_GB/person/last_name_patterns.ts b/src/locales/en_GB/person/last_name_patterns.ts new file mode 100644 index 00000000..c5b25524 --- /dev/null +++ b/src/locales/en_GB/person/last_name_patterns.ts @@ -0,0 +1,4 @@ +export default [ + { value: '{{person.last_name}}', weight: 9 }, + { value: '{{person.last_name}}-{{person.last_name}}', weight: 1 }, +]; diff --git a/src/locales/en_GB/person/name.ts b/src/locales/en_GB/person/name.ts new file mode 100644 index 00000000..4bc2ba83 --- /dev/null +++ b/src/locales/en_GB/person/name.ts @@ -0,0 +1,7 @@ +export default [ + { value: '{{person.firstName}} {{person.lastName}}', weight: 7 }, + { + value: '{{person.prefix}} {{person.firstName}} {{person.lastName}}', + weight: 1, + }, +]; diff --git a/src/locales/en_GH/person/index.ts b/src/locales/en_GH/person/index.ts index b0887ae5..89be81cc 100644 --- a/src/locales/en_GH/person/index.ts +++ b/src/locales/en_GH/person/index.ts @@ -6,6 +6,7 @@ import type { PersonDefinitions } from '../../..'; import female_first_name from './female_first_name'; import first_name from './first_name'; import last_name from './last_name'; +import last_name_patterns from './last_name_patterns'; import male_first_name from './male_first_name'; import name_ from './name'; @@ -13,6 +14,7 @@ const person: PersonDefinitions = { female_first_name, first_name, last_name, + last_name_patterns, male_first_name, name: name_, }; diff --git a/src/locales/en_GH/person/last_name_patterns.ts b/src/locales/en_GH/person/last_name_patterns.ts new file mode 100644 index 00000000..3778cee9 --- /dev/null +++ b/src/locales/en_GH/person/last_name_patterns.ts @@ -0,0 +1,4 @@ +export default [ + { value: '{{person.last_name}}', weight: 1 }, + { value: '{{person.last_name}}-{{person.last_name}}', weight: 1 }, +]; diff --git a/src/locales/en_GH/person/name.ts b/src/locales/en_GH/person/name.ts index b0892e31..3ed8a80c 100644 --- a/src/locales/en_GH/person/name.ts +++ b/src/locales/en_GH/person/name.ts @@ -1,7 +1,3 @@ export default [ { value: '{{person.firstName}} {{person.lastName}}', weight: 1 }, - { - value: '{{person.firstName}} {{person.lastName}}-{{person.lastName}}', - weight: 1, - }, ]; diff --git a/src/locales/es/person/index.ts b/src/locales/es/person/index.ts index 45178928..96cc5d1e 100644 --- a/src/locales/es/person/index.ts +++ b/src/locales/es/person/index.ts @@ -7,6 +7,7 @@ import female_first_name from './female_first_name'; import female_prefix from './female_prefix'; import first_name from './first_name'; import last_name from './last_name'; +import last_name_patterns from './last_name_patterns'; import male_first_name from './male_first_name'; import male_prefix from './male_prefix'; import name_ from './name'; @@ -19,6 +20,7 @@ const person: PersonDefinitions = { female_prefix, first_name, last_name, + last_name_patterns, male_first_name, male_prefix, name: name_, diff --git a/src/locales/es/person/last_name_patterns.ts b/src/locales/es/person/last_name_patterns.ts new file mode 100644 index 00000000..4ba8e35f --- /dev/null +++ b/src/locales/es/person/last_name_patterns.ts @@ -0,0 +1,6 @@ +export default [ + { + value: '{{person.last_name}} {{person.last_name}}', + weight: 1, + }, +]; diff --git a/src/locales/es/person/name.ts b/src/locales/es/person/name.ts index 68a1d1f7..5b10b8d7 100644 --- a/src/locales/es/person/name.ts +++ b/src/locales/es/person/name.ts @@ -1,11 +1,10 @@ export default [ { - value: - '{{person.prefix}} {{person.firstName}} {{person.lastName}} {{person.lastName}}', + value: '{{person.prefix}} {{person.firstName}} {{person.lastName}}', weight: 1, }, { - value: '{{person.firstName}} {{person.lastName}} {{person.lastName}}', + value: '{{person.firstName}} {{person.lastName}}', weight: 9, }, ]; diff --git a/src/locales/es_MX/person/index.ts b/src/locales/es_MX/person/index.ts index 45178928..96cc5d1e 100644 --- a/src/locales/es_MX/person/index.ts +++ b/src/locales/es_MX/person/index.ts @@ -7,6 +7,7 @@ import female_first_name from './female_first_name'; import female_prefix from './female_prefix'; import first_name from './first_name'; import last_name from './last_name'; +import last_name_patterns from './last_name_patterns'; import male_first_name from './male_first_name'; import male_prefix from './male_prefix'; import name_ from './name'; @@ -19,6 +20,7 @@ const person: PersonDefinitions = { female_prefix, first_name, last_name, + last_name_patterns, male_first_name, male_prefix, name: name_, diff --git a/src/locales/es_MX/person/last_name_patterns.ts b/src/locales/es_MX/person/last_name_patterns.ts new file mode 100644 index 00000000..a67c682b --- /dev/null +++ b/src/locales/es_MX/person/last_name_patterns.ts @@ -0,0 +1,10 @@ +export default [ + { + value: '{{person.last_name}} {{person.last_name}}', + weight: 5, + }, + { + value: '{{person.last_name}} de {{person.last_name}}', + weight: 1, + }, +]; diff --git a/src/locales/es_MX/person/name.ts b/src/locales/es_MX/person/name.ts index 7253fc0f..011fdfe6 100644 --- a/src/locales/es_MX/person/name.ts +++ b/src/locales/es_MX/person/name.ts @@ -1,20 +1,14 @@ export default [ { - value: - '{{person.prefix}} {{person.firstName}} {{person.lastName}} {{person.lastName}}', + value: '{{person.prefix}} {{person.firstName}} {{person.lastName}}', weight: 1, }, { - value: '{{person.firstName}} {{person.lastName}} de {{person.lastName}}', - weight: 3, + value: '{{person.firstName}} {{person.lastName}}', + weight: 8, }, { - value: - '{{person.suffix}} {{person.firstName}} {{person.lastName}} {{person.lastName}}', + value: '{{person.firstName}} {{person.lastName}} {{person.suffix}}', weight: 1, }, - { - value: '{{person.firstName}} {{person.lastName}} {{person.lastName}}', - weight: 5, - }, ]; diff --git a/src/locales/lv/person/female_last_name_patterns.ts b/src/locales/lv/person/female_last_name_patterns.ts new file mode 100644 index 00000000..b1840442 --- /dev/null +++ b/src/locales/lv/person/female_last_name_patterns.ts @@ -0,0 +1,7 @@ +export default [ + { value: '{{person.female_last_name}}', weight: 8 }, + { + value: '{{person.female_last_name}}-{{person.female_last_name}}', + weight: 2, + }, +]; diff --git a/src/locales/lv/person/index.ts b/src/locales/lv/person/index.ts index 42de5bcb..ac331974 100644 --- a/src/locales/lv/person/index.ts +++ b/src/locales/lv/person/index.ts @@ -5,10 +5,12 @@ import type { PersonDefinitions } from '../../..'; import female_first_name from './female_first_name'; import female_last_name from './female_last_name'; +import female_last_name_patterns from './female_last_name_patterns'; import female_prefix from './female_prefix'; import first_name from './first_name'; import male_first_name from './male_first_name'; import male_last_name from './male_last_name'; +import male_last_name_patterns from './male_last_name_patterns'; import male_prefix from './male_prefix'; import name_ from './name'; import prefix from './prefix'; @@ -18,10 +20,12 @@ import title from './title'; const person: PersonDefinitions = { female_first_name, female_last_name, + female_last_name_patterns, female_prefix, first_name, male_first_name, male_last_name, + male_last_name_patterns, male_prefix, name: name_, prefix, diff --git a/src/locales/lv/person/male_last_name_patterns.ts b/src/locales/lv/person/male_last_name_patterns.ts new file mode 100644 index 00000000..104a5aa1 --- /dev/null +++ b/src/locales/lv/person/male_last_name_patterns.ts @@ -0,0 +1,4 @@ +export default [ + { value: '{{person.male_last_name}}', weight: 8 }, + { value: '{{person.male_last_name}}-{{person.male_last_name}}', weight: 2 }, +]; diff --git a/src/locales/lv/person/name.ts b/src/locales/lv/person/name.ts index 492a7e6f..845ffaf9 100644 --- a/src/locales/lv/person/name.ts +++ b/src/locales/lv/person/name.ts @@ -8,13 +8,4 @@ export default [ weight: 1, }, { value: '{{person.firstName}} {{person.lastName}}', weight: 7 }, - { value: '{{person.lastName}} {{person.firstName}}', weight: 2 }, - { - value: '{{person.firstName}} {{person.firstName}} {{person.lastName}}', - weight: 2, - }, - { - value: '{{person.firstName}} {{person.lastName}}-{{person.lastName}}', - weight: 2, - }, ]; diff --git a/src/locales/nb_NO/person/index.ts b/src/locales/nb_NO/person/index.ts index eb000343..c54bfc4e 100644 --- a/src/locales/nb_NO/person/index.ts +++ b/src/locales/nb_NO/person/index.ts @@ -7,6 +7,7 @@ import female_first_name from './female_first_name'; import female_prefix from './female_prefix'; import first_name from './first_name'; import last_name from './last_name'; +import last_name_patterns from './last_name_patterns'; import male_first_name from './male_first_name'; import male_prefix from './male_prefix'; import name_ from './name'; @@ -18,6 +19,7 @@ const person: PersonDefinitions = { female_prefix, first_name, last_name, + last_name_patterns, male_first_name, male_prefix, name: name_, diff --git a/src/locales/nb_NO/person/last_name_patterns.ts b/src/locales/nb_NO/person/last_name_patterns.ts new file mode 100644 index 00000000..8a31eeae --- /dev/null +++ b/src/locales/nb_NO/person/last_name_patterns.ts @@ -0,0 +1,4 @@ +export default [ + { value: '{{person.last_name}}', weight: 8 }, + { value: '{{person.last_name}} {{person.last_name}}', weight: 2 }, +]; diff --git a/src/locales/nb_NO/person/name.ts b/src/locales/nb_NO/person/name.ts index 3cfec1ea..5f37f6ee 100644 --- a/src/locales/nb_NO/person/name.ts +++ b/src/locales/nb_NO/person/name.ts @@ -7,13 +7,5 @@ export default [ value: '{{person.firstName}} {{person.lastName}} {{person.suffix}}', weight: 1, }, - { - value: '{{person.firstName}} {{person.firstName}} {{person.lastName}}', - weight: 1, - }, - { - value: '{{person.firstName}} {{person.lastName}} {{person.lastName}}', - weight: 1, - }, - { value: '{{person.firstName}} {{person.lastName}}', weight: 8 }, + { value: '{{person.firstName}} {{person.lastName}}', weight: 9 }, ]; diff --git a/src/locales/sv/person/index.ts b/src/locales/sv/person/index.ts index 8dd6f4d6..b12b544e 100644 --- a/src/locales/sv/person/index.ts +++ b/src/locales/sv/person/index.ts @@ -7,6 +7,7 @@ import female_first_name from './female_first_name'; import female_prefix from './female_prefix'; import first_name from './first_name'; import last_name from './last_name'; +import last_name_patterns from './last_name_patterns'; import male_first_name from './male_first_name'; import male_prefix from './male_prefix'; import name_ from './name'; @@ -18,6 +19,7 @@ const person: PersonDefinitions = { female_prefix, first_name, last_name, + last_name_patterns, male_first_name, male_prefix, name: name_, diff --git a/src/locales/sv/person/last_name_patterns.ts b/src/locales/sv/person/last_name_patterns.ts new file mode 100644 index 00000000..8a31eeae --- /dev/null +++ b/src/locales/sv/person/last_name_patterns.ts @@ -0,0 +1,4 @@ +export default [ + { value: '{{person.last_name}}', weight: 8 }, + { value: '{{person.last_name}} {{person.last_name}}', weight: 2 }, +]; diff --git a/src/locales/sv/person/name.ts b/src/locales/sv/person/name.ts index 37334af6..5f37f6ee 100644 --- a/src/locales/sv/person/name.ts +++ b/src/locales/sv/person/name.ts @@ -7,9 +7,5 @@ export default [ value: '{{person.firstName}} {{person.lastName}} {{person.suffix}}', weight: 1, }, - { value: '{{person.firstName}} {{person.lastName}}', weight: 8 }, - { - value: '{{person.firstName}} {{person.lastName}} {{person.lastName}}', - weight: 1, - }, + { value: '{{person.firstName}} {{person.lastName}}', weight: 9 }, ]; diff --git a/src/modules/person/index.ts b/src/modules/person/index.ts index ccbb8e14..5618110b 100644 --- a/src/modules/person/index.ts +++ b/src/modules/person/index.ts @@ -11,6 +11,7 @@ export type SexType = `${Sex}`; * Select a definition based on given sex. * * @param faker Faker instance. + * @param elementSelectorFn The method used to select the actual element. * @param sex Sex. * @param param2 Definitions. * @param param2.generic Non-sex definitions. @@ -18,17 +19,14 @@ export type SexType = `${Sex}`; * @param param2.male Male definitions. * @returns Definition based on given sex. */ -function selectDefinition( +function selectDefinition<T>( faker: Faker, + elementSelectorFn: (values: T[]) => string, sex: SexType | undefined, // TODO @Shinigami92 2022-03-21: Remove fallback empty object when `strict: true` - { - generic, - female, - male, - }: { generic?: string[]; female?: string[]; male?: string[] } = {} -) { - let values: string[] | undefined; + { generic, female, male }: { generic?: T[]; female?: T[]; male?: T[] } = {} +): string { + let values: T[] | undefined; switch (sex) { case Sex.Female: @@ -52,7 +50,7 @@ function selectDefinition( } } - return faker.helpers.arrayElement(values); + return elementSelectorFn(values); } /** @@ -89,7 +87,7 @@ export class PersonModule { const { first_name, female_first_name, male_first_name } = this.faker.definitions.person; - return selectDefinition(this.faker, sex, { + return selectDefinition(this.faker, this.faker.helpers.arrayElement, sex, { generic: first_name, female: female_first_name, male: male_first_name, @@ -110,14 +108,43 @@ export class PersonModule { * @since 8.0.0 */ lastName(sex?: SexType): string { - const { last_name, female_last_name, male_last_name } = - this.faker.definitions.person; - - return selectDefinition(this.faker, sex, { - generic: last_name, - female: female_last_name, - male: male_last_name, - }); + const { + last_name, + female_last_name, + male_last_name, + last_name_patterns, + male_last_name_patterns, + female_last_name_patterns, + } = this.faker.definitions.person; + + if ( + last_name_patterns != null || + male_last_name_patterns != null || + female_last_name_patterns != null + ) { + const pattern = selectDefinition( + this.faker, + this.faker.helpers.weightedArrayElement, + sex, + { + generic: last_name_patterns, + female: female_last_name_patterns, + male: male_last_name_patterns, + } + ); + return this.faker.helpers.fake(pattern); + } else { + return selectDefinition( + this.faker, + this.faker.helpers.arrayElement, + sex, + { + generic: last_name, + female: female_last_name, + male: male_last_name, + } + ); + } } /** @@ -137,7 +164,7 @@ export class PersonModule { const { middle_name, female_middle_name, male_middle_name } = this.faker.definitions.person; - return selectDefinition(this.faker, sex, { + return selectDefinition(this.faker, this.faker.helpers.arrayElement, sex, { generic: middle_name, female: female_middle_name, male: male_middle_name, @@ -278,7 +305,7 @@ export class PersonModule { const { prefix, female_prefix, male_prefix } = this.faker.definitions.person; - return selectDefinition(this.faker, sex, { + return selectDefinition(this.faker, this.faker.helpers.arrayElement, sex, { generic: prefix, female: female_prefix, male: male_prefix, |
