From 64cdfcbeb7c711253c3f7967d0b21682644e608f Mon Sep 17 00:00:00 2001 From: TaeBbong Date: Tue, 4 Mar 2025 16:00:35 +0900 Subject: [PATCH 1/3] feat: Added Korean phone number support --- lib/src/phone_number.dart | 17 +++++++++++++++++ test/specs/phone_number.dart | 26 ++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/lib/src/phone_number.dart b/lib/src/phone_number.dart index 5871a72..ae3ca2f 100644 --- a/lib/src/phone_number.dart +++ b/lib/src/phone_number.dart @@ -121,6 +121,21 @@ class PhoneNumber { '+81 0###-###-####', '+81 (0###) ###-####', ]; + static const krPhoneNumberPatterns = [ + // Standard 10-digit phone number formats + '010########', + '010-####-####', + '010.####.####', + // Standard 11-digit phone number formats + '01#########', + '01#-###-####', + '01#.###.####', + // Standard 11-digit phone number formats with country code + '+82-10-####-####', + '+82 10 #### ####', + '+82-1#-###-####', + '+82 1# ### ####', + ]; const PhoneNumber(this.random); @@ -131,4 +146,6 @@ class PhoneNumber { String de() => random.fromPattern(dePhoneNumberPatterns); String ja() => random.fromPattern(jaPhoneNumberPatterns); + + String kr() => random.fromPattern(krPhoneNumberPatterns); } diff --git a/test/specs/phone_number.dart b/test/specs/phone_number.dart index f175bba..fa9b819 100644 --- a/test/specs/phone_number.dart +++ b/test/specs/phone_number.dart @@ -181,4 +181,30 @@ void main() { } }); }); + group('kr', () { + test('should be able to generate kr phone number', () { + for (var i = 0; i < 20; i++) { + expect( + faker.phoneNumber.kr(), + anyOf([ + // Standard 10-digit phone number formats + matches(r'010\d{8}'), + matches(r'010-\d{4}-\d{4}'), + matches(r'010\.\d{4}\.\d{4}'), + + // Standard 11-digit phone number formats + matches(r'01\d{9}'), + matches(r'01\d-\d{3}-\d{4}'), + matches(r'01\d\.\d{3}\.\d{4}'), + + // Standard 11-digit phone number formats with country code + matches(r'\+82-10-\d{4}-\d{4}'), + matches(r'\+82 10 \d{4} \d{4}'), + matches(r'\+82-1\d-\d{3}-\d{4}'), + matches(r'\+82 1\d \d{3} \d{4}'), + ]), + ); + } + }); + }); } From d582dfb1bbe0dfd2860c8da7341b5b3f78f847af Mon Sep 17 00:00:00 2001 From: TaeBbong Date: Tue, 4 Mar 2025 20:37:27 +0900 Subject: [PATCH 2/3] feat: Added kr_providers.dart with AnimalsDataProvider --- lib/src/animals.dart | 7 +- .../animals/{ => defaults}/animals_names.dart | 0 lib/src/data/animals/kr/animals_names.dart | 94 +++++++++ lib/src/faker.dart | 16 +- lib/src/providers/base_providers.dart | 179 +++++++++++++++++- lib/src/providers/default_providers.dart | 6 + lib/src/providers/kr_providers.dart | 7 + 7 files changed, 299 insertions(+), 10 deletions(-) rename lib/src/data/animals/{ => defaults}/animals_names.dart (100%) create mode 100644 lib/src/data/animals/kr/animals_names.dart create mode 100644 lib/src/providers/kr_providers.dart diff --git a/lib/src/animals.dart b/lib/src/animals.dart index 3261207..e8cea07 100644 --- a/lib/src/animals.dart +++ b/lib/src/animals.dart @@ -1,10 +1,11 @@ -import 'data/animals/animals_names.dart'; +import 'package:faker/src/providers/base_providers.dart'; import 'random_generator.dart'; class Animal { - const Animal(this.random); + const Animal(this.random, this._provider); final RandomGenerator random; + final AnimalsDataProvider _provider; /// Generates an animal name. /// @@ -12,5 +13,5 @@ class Animal { /// ```dart /// faker.animal.name(); /// ``` - String name() => random.element(animalsNames); + String name() => random.element(_provider.animalsList()); } diff --git a/lib/src/data/animals/animals_names.dart b/lib/src/data/animals/defaults/animals_names.dart similarity index 100% rename from lib/src/data/animals/animals_names.dart rename to lib/src/data/animals/defaults/animals_names.dart diff --git a/lib/src/data/animals/kr/animals_names.dart b/lib/src/data/animals/kr/animals_names.dart new file mode 100644 index 0000000..9db0e87 --- /dev/null +++ b/lib/src/data/animals/kr/animals_names.dart @@ -0,0 +1,94 @@ +const animalNames = [ + '개', + '당나귀', + '표범', + '토끼', + '비둘기', + '돌고래', + '염소', + '뱀장어', + '비글', + '오소리', + '햄스터', + '매', + '재규어', + '도마뱀', + '라마', + '코뿔소', + '웜뱃', + '양', + '나무늘보', + '라쿤', + '스라소니', + '여우원숭이', + '대왕고래', + '소', + '호랑이', + '치타', + '거북', + '알바트로스', + '개구리', + '자칼', + '거위', + '고릴라', + '오랑우탄', + '기린', + '코브라', + '사슴', + '치와와', + '코알라', + '친칠라', + '고슴도치', + '들소', + '미어캣', + '올빼미', + '두더지', + '왕도마뱀', + '노새', + '쥐', + '고양이', + '사자', + '곰', + '육지거북', + '산토끼', + '까마귀', + '고래', + '타조', + '에뮤', + '침팬지', + '영양', + '카멜레온', + '캥거루', + '도도새', + '얼룩말', + '황소', + '생쥐', + '독수리', + '오리', + '엘크', + '비버', + '뱀', + '말', + '흑표', + '코끼리', + '악어', + '암탉', + '물고기', + '여우', + '아르마딜로', + '늑대', + '원숭이', + '박쥐', + '낙타', + '하마', + '이구아나', + '해파리', + '주머니쥐', + '버팔로', + '수달', + '홍학', + '백조', + '멧돼지', + '매머드', + '공작', +]; diff --git a/lib/src/faker.dart b/lib/src/faker.dart index cdbe4e5..9ef0ab1 100644 --- a/lib/src/faker.dart +++ b/lib/src/faker.dart @@ -3,7 +3,9 @@ import 'package:faker/src/geo.dart'; import 'package:faker/src/lorem.dart'; import 'package:faker/src/phone_number.dart'; import 'package:faker/src/providers/default_providers.dart'; +import 'package:faker/src/providers/base_providers.dart'; import 'package:faker/src/providers/fa_providers.dart'; +import 'package:faker/src/providers/kr_providers.dart'; import 'address.dart'; import 'animals.dart'; @@ -18,7 +20,6 @@ import 'internet.dart'; import 'job.dart'; import 'jwt.dart'; import 'person.dart'; -import 'providers/base_providers.dart'; import 'random_generator.dart'; import 'sport.dart'; import 'vehicle.dart'; @@ -68,18 +69,27 @@ class Faker { phoneNumber = PhoneNumber(random), vehicle = Vehicle(random), randomGenerator = random, - animal = Animal(random); + animal = Animal(random, + provider?.animalsDataProvider ?? DefaultAnimalsDataProvider()); factory Faker({int? seed, FakerDataProvider? provider}) => Faker.withGenerator(RandomGenerator(seed: seed), provider: provider); } class FakerDataProvider { + final AnimalsDataProvider? animalsDataProvider; final LoremDataProvider? loremDataProvider; - FakerDataProvider({this.loremDataProvider}); + FakerDataProvider({ + this.animalsDataProvider, + this.loremDataProvider, + }); } class FakerDataProviderFa extends FakerDataProvider { FakerDataProviderFa() : super(loremDataProvider: LoremDataProviderFa()); } + +class FakerDataProviderKr extends FakerDataProvider { + FakerDataProviderKr() : super(animalsDataProvider: AnimalsDataProviderKr()); +} diff --git a/lib/src/providers/base_providers.dart b/lib/src/providers/base_providers.dart index 440237f..8c49bfb 100644 --- a/lib/src/providers/base_providers.dart +++ b/lib/src/providers/base_providers.dart @@ -1,7 +1,178 @@ -abstract class LoremDataProvider { - /// Provides a list of lorem ipsum words that can be used to create fake data - List wordsList(); +// abstract class AddressDataProvider { +// /// Provides a list of cities that can be used to create fake data +// List citiesList(); + +// /// Provides a list of countries that can be used to create fake data +// List countriesList(); + +// /// Provides a list of country codes that can be used to create fake data +// List countryCodesList(); + +// /// Provides a list of streets that can be used to create fake data +// List streetsList(); + +// /// Provides a list of zip codes that can be used to create fake data +// List zipCodesList(); +// } + +abstract class AnimalsDataProvider { + /// Provides a list of animal names that can be used to create fake data + List animalsList(); +} + +// abstract class ColorsDataProvider { +// /// Provides a list of color names that can be used to create fake data +// List colorNamesList(); + +// /// Provides a list of color hex codes that can be used to create fake data +// List colorHexCodesList(); +// } + +// abstract class CompanyDataProvider { +// /// Provides a list of company names that can be used to create fake data +// List companyNamesList(); + +// /// Provides a list of company suffixes that can be used to create fake data +// List companySuffixesList(); +// } + +// abstract class ConferenceDataProvider { +// /// Provides a list of conference names that can be used to create fake data +// List conferenceNamesList(); +// } + +// abstract class CurrencyDataProvider { +// /// Provides a list of currency names that can be used to create fake data +// List currencyNamesList(); + +// /// Provides a list of currency codes that can be used to create fake data +// List currencyCodesList(); +// } + +// abstract class DateDataProvider { +// /// Provides a list of months that can be used to create fake data +// List monthsList(); + +// /// Provides a list of weekdays that can be used to create fake data +// List weekdaysList(); +// } + +// abstract class FoodDataProvider { +// /// Provides a list of cuisines that can be used to create fake data +// List cuisinesList(); + +// /// Provides a list of dishes that can be used to create fake data +// List dishesList(); + +// /// Provides a list of restaurants that can be used to create fake data +// List restaurantsList(); +// } + +// abstract class GeoDataProvider { +// /// Provides a list of continents that can be used to create fake data +// List continentsList(); + +// /// Provides a list of countries that can be used to create fake data +// List countriesList(); + +// /// Provides a list of country codes that can be used to create fake data +// List countryCodesList(); + +// /// Provides a list of cities that can be used to create fake data +// List citiesList(); + +// /// Provides a list of streets that can be used to create fake data +// List streetsList(); - /// Provides a list of lorem ipsum sentences that can be used to create fake data +// /// Provides a list of zip codes that can be used to create fake data +// List zipCodesList(); +// } + +// abstract class GuidDataProvider { +// /// Provides a list of GUIDs that can be used to create fake data +// List guidsList(); +// } + +// abstract class ImageDataProvider { +// /// Provides a list of image URLs that can be used to create fake data +// List imageUrlsList(); +// } + +// abstract class InternetDataProvider { +// /// Provides a list of domains that can be used to create fake data +// List domainsList(); + +// /// Provides a list of email domains that can be used to create fake data +// List emailDomainsList(); + +// /// Provides a list of free email domains that can be used to create fake data +// List freeEmailDomainsList(); + +// /// Provides a list of safe email domains that can be used to create fake data +// List safeEmailDomainsList(); + +// /// Provides a list of URLs that can be used to create fake data +// List urlsList(); +// } + +// abstract class JobDataProvider { +// /// Provides a list of job adjectives that can be used to create fake data +// List jobAdjectivesList(); + +// /// Provides a list of job nouns that can be used to create fake data +// List jobNounsList(); + +// /// Provides a list of job prefixes that can be used to create fake data +// List jobPrefixesList(); +// } + +// abstract class JwtDataProvider { +// /// Provides a list of JWTs that can be used to create fake data +// List jwtList(); +// } + +abstract class LoremDataProvider { + /// Provides a list of sentences that can be used to create fake data List sentencesList(); + + /// Provides a list of words that can be used to create fake data + List wordsList(); } + +// abstract class PersonDataProvider { +// /// Provides a list of first names that can be used to create fake data +// List firstNamesList(); + +// /// Provides a list of last names that can be used to create fake data +// List lastNamesList(); +// } + +// abstract class PhoneNumberDataProvider { +// /// Provides a list of phone number formats that can be used to create fake data +// List phoneNumberFormatsList(); +// } + +// abstract class SportDataProvider { +// /// Provides a list of sport names that can be used to create fake data +// List sportNamesList(); +// } + +// abstract class VehicleDataProvider { +// /// Provides a list of vehicle types that can be used to create fake data +// List vehicleTypesList(); + +// /// Provides a list of vehicle makes that can be used to create fake data +// List vehicleMakesList(); + +// /// Provides a list of vehicle models that can be used to create fake data +// List vehicleModelsList(); + +// /// Provides a list of vehicle styles that can be used to create fake data +// List vehicleStylesList(); + +// /// Provides a list of vehicle transmissions that can be used to create fake data +// List vehicleTransmissionsList(); + +// /// Provides a list of vehicle drive types that can be used to create fake data +// List vehicleDriveTypesList(); +// } diff --git a/lib/src/providers/default_providers.dart b/lib/src/providers/default_providers.dart index d3318d2..f4c97d3 100644 --- a/lib/src/providers/default_providers.dart +++ b/lib/src/providers/default_providers.dart @@ -1,7 +1,13 @@ import 'base_providers.dart'; +import '../data/animals/defaults/animals_names.dart' as animal_list; import '../data/lorem/defaults/sentences.dart' as sentence_list; import '../data/lorem/defaults/words.dart' as word_list; +class DefaultAnimalsDataProvider extends AnimalsDataProvider { + @override + List animalsList() => animal_list.animalsNames; +} + class DefaultLoremDataProvider extends LoremDataProvider { @override List sentencesList() => sentence_list.sentences; diff --git a/lib/src/providers/kr_providers.dart b/lib/src/providers/kr_providers.dart new file mode 100644 index 0000000..578bc5e --- /dev/null +++ b/lib/src/providers/kr_providers.dart @@ -0,0 +1,7 @@ +import 'base_providers.dart'; +import '../data/animals/kr/animals_names.dart' as animals; + +class AnimalsDataProviderKr extends AnimalsDataProvider { + @override + List animalsList() => animals.animalNames; +} From 4dd99b66629eb8021532df82b03b999526d7acaa Mon Sep 17 00:00:00 2001 From: TaeBbong Date: Tue, 4 Mar 2025 20:38:01 +0900 Subject: [PATCH 3/3] feat: test done for animals with kr --- test/specs/animals.dart | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 test/specs/animals.dart diff --git a/test/specs/animals.dart b/test/specs/animals.dart new file mode 100644 index 0000000..e992370 --- /dev/null +++ b/test/specs/animals.dart @@ -0,0 +1,18 @@ +import 'package:faker/faker.dart'; +import 'package:test/test.dart'; + +void main() { + var faker = Faker(); + var fakerKr = Faker(provider: FakerDataProviderKr()); + + group('animals', () { + test('should be able to generate animal name in en-us', () { + expect( + faker.animal.name(), matches(RegExp(r"^([\w\s\&\/\,\.\ö\’\'-])+$"))); + }); + test('should be able to generate animal name in ko-kr', () { + expect(fakerKr.animal.name(), + matches(RegExp(r"^([\w\s\uAC00-\uD7A3\'\-\(\)])+$"))); + }); + }); +}