Skip to content

Commit

Permalink
chore: rename Gender to Sex and use enum instead of string values
Browse files Browse the repository at this point in the history
  • Loading branch information
hankucz committed Jul 18, 2022
1 parent f1cdab6 commit 5f97b34
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 46 deletions.
3 changes: 1 addition & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,7 @@ export type {
NumberColorFormat,
StringColorFormat,
} from './modules/color';
export { Gender } from './modules/name';
export type { GenderType } from './modules/name';
export type { Sex } from './modules/name';
export type { ChemicalElement, Unit } from './modules/science';
export { Faker };

Expand Down
77 changes: 41 additions & 36 deletions src/modules/name/index.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
import type { Faker } from '../..';

export enum Gender {
female = 'female',
male = 'male',
export enum Sex {
Female = 'female',
Male = 'male',
}

export type GenderType = 'female' | 'male';
type SexValue = `${Sex}`;

/**
* Select a definition based on given gender.
* Select a definition based on given sex.
*
* @param faker Faker instance.
* @param gender Gender.
* @param sex Sex.
* @param param2 Definitions.
* @param param2.generic Non-gender definitions.
* @param param2.generic Non-sex definitions.
* @param param2.female Female definitions.
* @param param2.male Male definitions.
* @returns Definition based on given gender.
* @returns Definition based on given sex.
*/
function selectDefinition(
faker: Faker,
gender: GenderType | undefined,
sex: Sex | SexValue | undefined,
// TODO @Shinigami92 2022-03-21: Remove fallback empty object when `strict: true`
{
generic,
Expand All @@ -29,13 +29,16 @@ function selectDefinition(
}: { generic?: string[]; female?: string[]; male?: string[] } = {}
) {
let values: string[] | undefined;
switch (gender) {
case 'female':

switch (sex) {
case Sex.Female:
values = female;
break;
case 'male':

case Sex.Male:
values = male;
break;

default:
values = generic;
break;
Expand Down Expand Up @@ -69,19 +72,19 @@ export class Name {
/**
* Returns a random first name.
*
* @param gender The optional gender to use.
* @param sex The optional sex to use.
* Can be either `'female'` or `'male'`.
*
* @example
* faker.name.firstName() // 'Antwan'
* faker.name.firstName("female") // 'Victoria'
* faker.name.firstName("male") // 'Tom'
*/
firstName(gender?: GenderType): string {
firstName(sex?: Sex | SexValue): string {
const { first_name, female_first_name, male_first_name } =
this.faker.definitions.name;

return selectDefinition(this.faker, gender, {
return selectDefinition(this.faker, sex, {
generic: first_name,
female: female_first_name,
male: male_first_name,
Expand All @@ -91,19 +94,19 @@ export class Name {
/**
* Returns a random last name.
*
* @param gender The optional gender to use.
* @param sex The optional sex to use.
* Can be either `'female'` or `'male'`.
*
* @example
* faker.name.lastName() // 'Hauck'
* faker.name.lastName("female") // 'Grady'
* faker.name.lastName("male") // 'Barton'
*/
lastName(gender?: GenderType): string {
lastName(sex?: Sex | SexValue): string {
const { last_name, female_last_name, male_last_name } =
this.faker.definitions.name;

return selectDefinition(this.faker, gender, {
return selectDefinition(this.faker, sex, {
generic: last_name,
female: female_last_name,
male: male_last_name,
Expand All @@ -113,19 +116,19 @@ export class Name {
/**
* Returns a random middle name.
*
* @param gender The optional gender to use.
* @param sex The optional sex to use.
* Can be either `'female'` or `'male'`.
*
* @example
* faker.name.middleName() // 'Доброславівна'
* faker.name.middleName("female") // 'Анастасівна'
* faker.name.middleName("male") // 'Вікторович'
*/
middleName(gender?: GenderType): string {
middleName(sex?: Sex | SexValue): string {
const { middle_name, female_middle_name, male_middle_name } =
this.faker.definitions.name;

return selectDefinition(this.faker, gender, {
return selectDefinition(this.faker, sex, {
generic: middle_name,
female: female_middle_name,
male: male_middle_name,
Expand All @@ -137,8 +140,7 @@ export class Name {
*
* @param firstName The optional first name to use. If not specified a random one will be chosen.
* @param lastName The optional last name to use. If not specified a random one will be chosen.
* @param gender The optional gender to use.
* Can be either `'female'` or `'male'`.
* @param sex The optional sex to use. Can be either `'female'` or `'male'`.
*
* @example
* faker.name.findName() // 'Allen Brown'
Expand All @@ -147,17 +149,22 @@ export class Name {
* faker.name.findName(undefined, 'Beer') // 'Mr. Alfonso Beer'
* faker.name.findName(undefined, undefined, 'male') // 'Fernando Schaefer'
*/
findName(firstName?: string, lastName?: string, gender?: GenderType): string {
const normalizedGender: GenderType =
gender ?? this.faker.helpers.arrayElement(['female', 'male']);
findName(
firstName?: string,
lastName?: string,
sex?: Sex | SexValue
): string {
const normalizedSex: Sex | SexValue =
sex ?? this.faker.helpers.arrayElement([Sex.Female, Sex.Male]);

firstName = firstName || this.firstName(normalizedGender);
lastName = lastName || this.lastName(normalizedGender);
firstName = firstName || this.firstName(normalizedSex);
lastName = lastName || this.lastName(normalizedSex);

const nameParts: string[] = [];
const prefix = this.faker.helpers.maybe(() => this.prefix(gender), {
const prefix = this.faker.helpers.maybe(() => this.prefix(sex), {
probability: 0.125,
});

if (prefix) {
nameParts.push(prefix);
}
Expand All @@ -168,13 +175,12 @@ export class Name {
const suffix = this.faker.helpers.maybe(() => this.suffix(), {
probability: 0.125,
});

if (suffix) {
nameParts.push(suffix);
}

const fullName = nameParts.join(' ');

return fullName;
return nameParts.join(' ');
}

/**
Expand All @@ -199,18 +205,17 @@ export class Name {
/**
* Returns a random name prefix.
*
* @param gender The optional gender to use.
* Can be either `'female'` or `'male'`.
* @param sex The optional sex to use. Can be either `'female'` or `'male'`.
*
* @example
* faker.name.prefix() // 'Miss'
* faker.name.prefix('female') // 'Ms.'
* faker.name.prefix('male') // 'Mr.'
*/
prefix(gender?: GenderType): string {
prefix(sex?: Sex | SexValue): string {
const { prefix, female_prefix, male_prefix } = this.faker.definitions.name;

return selectDefinition(this.faker, gender, {
return selectDefinition(this.faker, sex, {
generic: prefix,
female: female_prefix,
male: male_prefix,
Expand Down
16 changes: 8 additions & 8 deletions test/name.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,15 +55,15 @@ describe('name', () => {
expect(first_name.length).toBeGreaterThan(0);
});

it('should return a gender-specific first name', () => {
it('should return a sex-specific first name', () => {
let name = faker.name.firstName('female');
expect(faker.definitions.name.female_first_name).toContain(name);

name = faker.name.firstName('male');
expect(faker.definitions.name.male_first_name).toContain(name);
});

it('should return a gender-specific first name when no gender-specific first name was defined', () => {
it('should return a sex-specific first name when no sex-specific first name was defined', () => {
faker.locale = 'az';
faker.localeFallback = 'az';

Expand All @@ -88,7 +88,7 @@ describe('name', () => {
expect(last_name.length).toBeGreaterThan(0);
});

it('should return a gender-specific last name', () => {
it('should return a sex-specific last name', () => {
faker.locale = 'az';

let name = faker.name.lastName('female');
Expand Down Expand Up @@ -125,7 +125,7 @@ describe('name', () => {
expect(faker.definitions.name.male_middle_name).toContain(name);
});

it('should return a gender-specific middle name', () => {
it('should return a sex-specific middle name', () => {
faker.locale = 'uk';

let name = faker.name.middleName('female');
Expand All @@ -149,7 +149,7 @@ describe('name', () => {
expect(fullName).toContain(' ');
});

it('should return a female gender-specific name with firstName and lastName', () => {
it('should return a female sex-specific name with firstName and lastName', () => {
faker.locale = 'mk';

const female_specific = [
Expand All @@ -167,7 +167,7 @@ describe('name', () => {
}
});

it('should return a male gender-specific name with firstName and lastName', () => {
it('should return a male sex-specific name with firstName and lastName', () => {
faker.locale = 'mk';

const male_specific = [
Expand All @@ -185,7 +185,7 @@ describe('name', () => {
}
});

it('should return a female gender-specific name with given firstName and lastName', () => {
it('should return a female sex-specific name with given firstName and lastName', () => {
faker.locale = 'mk';

const male_specific = [
Expand All @@ -207,7 +207,7 @@ describe('name', () => {
}
});

it('should return a male gender-specific name with given firstName and lastName', () => {
it('should return a male sex-specific name with given firstName and lastName', () => {
faker.locale = 'mk';

const male_specific = [
Expand Down

0 comments on commit 5f97b34

Please sign in to comment.