ffaker 2.20.0 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +163 -17
- data/Gemfile +15 -0
- data/README.md +19 -7
- data/REFERENCE.md +1479 -1395
- data/Rakefile +16 -47
- data/bin/console +9 -0
- data/ffaker.gemspec +9 -23
- data/lib/ffaker/address.rb +5 -5
- data/lib/ffaker/address_br.rb +14 -2
- data/lib/ffaker/address_fr.rb +3 -5
- data/lib/ffaker/address_it.rb +1 -5
- data/lib/ffaker/address_ua.rb +1 -1
- data/lib/ffaker/animal_br.rb +12 -0
- data/lib/ffaker/avatar.rb +11 -3
- data/lib/ffaker/bank.rb +13 -1
- data/lib/ffaker/bank_us.rb +37 -0
- data/lib/ffaker/book.rb +15 -7
- data/lib/ffaker/boolean.rb +4 -0
- data/lib/ffaker/cheesy_lingo.rb +2 -2
- data/lib/ffaker/code.rb +1 -1
- data/lib/ffaker/company.rb +5 -8
- data/lib/ffaker/company_fr.rb +2 -2
- data/lib/ffaker/crypto.rb +14 -0
- data/lib/ffaker/data/address_br/complement +3 -0
- data/lib/ffaker/data/address_br/neighborhood_prefixes +3 -0
- data/lib/ffaker/data/address_de/state +1 -0
- data/lib/ffaker/data/animal_br/common_names +423 -0
- data/lib/ffaker/data/jo_jo/first_names +356 -0
- data/lib/ffaker/data/jo_jo/full_names +225 -0
- data/lib/ffaker/data/jo_jo/last_names +153 -0
- data/lib/ffaker/data/jo_jo/stands +149 -0
- data/lib/ffaker/data/job_tw/job_nouns +201 -0
- data/lib/ffaker/data/lorem_tw/words +789 -0
- data/lib/ffaker/date.rb +40 -0
- data/lib/ffaker/filesystem.rb +12 -2
- data/lib/ffaker/geolocation.rb +2 -2
- data/lib/ffaker/guid.rb +7 -1
- data/lib/ffaker/html_ipsum.rb +7 -1
- data/lib/ffaker/identification_br.rb +3 -12
- data/lib/ffaker/identification_ec.rb +39 -0
- data/lib/ffaker/identification_es_cl.rb +2 -2
- data/lib/ffaker/identification_es_co.rb +1 -1
- data/lib/ffaker/identification_fi.rb +73 -0
- data/lib/ffaker/identification_kr.rb +11 -4
- data/lib/ffaker/identification_mx.rb +1 -1
- data/lib/ffaker/identification_pl.rb +6 -6
- data/lib/ffaker/identification_tw.rb +4 -3
- data/lib/ffaker/image.rb +28 -4
- data/lib/ffaker/jo_jo.rb +24 -0
- data/lib/ffaker/job_tw.rb +12 -0
- data/lib/ffaker/lorem_ja.rb +1 -1
- data/lib/ffaker/lorem_ru.rb +1 -1
- data/lib/ffaker/lorem_tw.rb +40 -0
- data/lib/ffaker/movie.rb +1 -1
- data/lib/ffaker/name_fr.rb +4 -3
- data/lib/ffaker/name_pl.rb +3 -3
- data/lib/ffaker/number.rb +6 -2
- data/lib/ffaker/phone_number_de.rb +3 -3
- data/lib/ffaker/skill.rb +1 -1
- data/lib/ffaker/ssn.rb +4 -2
- data/lib/ffaker/ssn_se.rb +2 -2
- data/lib/ffaker/string.rb +7 -7
- data/lib/ffaker/time.rb +4 -4
- data/lib/ffaker/tweet.rb +1 -1
- data/lib/ffaker/utils/module_utils.rb +10 -20
- data/lib/ffaker/utils/unique_utils.rb +34 -21
- data/lib/ffaker/uuid.rb +175 -0
- data/lib/ffaker/vehicle.rb +63 -1
- data/lib/{version.rb → ffaker/version.rb} +1 -1
- data/lib/ffaker.rb +64 -190
- data/scripts/reference.rb +21 -21
- data/test/helper.rb +7 -9
- data/test/test_address_br.rb +15 -2
- data/test/test_address_da.rb +3 -3
- data/test/test_address_fi.rb +2 -2
- data/test/test_address_se.rb +2 -2
- data/test/test_address_ua.rb +1 -1
- data/test/test_animal_br.rb +17 -0
- data/test/test_array_utils.rb +1 -1
- data/test/test_avatar.rb +30 -7
- data/test/test_bank.rb +15 -1
- data/test/test_bank_us.rb +37 -0
- data/test/test_book.rb +29 -0
- data/test/test_boolean.rb +32 -1
- data/test/test_cheesy_lingo.rb +1 -1
- data/test/test_color.rb +3 -3
- data/test/test_crypto.rb +15 -0
- data/test/test_date.rb +47 -0
- data/test/test_filesystem.rb +30 -4
- data/test/test_freedom_ipsum.rb +1 -1
- data/test/test_gender_it.rb +1 -1
- data/test/test_gender_ja.rb +1 -1
- data/test/test_gender_jp.rb +1 -1
- data/test/test_gender_pl.rb +1 -1
- data/test/test_guid.rb +1 -1
- data/test/test_healthcare_ru.rb +1 -1
- data/test/test_hipster_ipsum.rb +1 -1
- data/test/test_html_ipsum.rb +6 -0
- data/test/test_identification.rb +12 -2
- data/test/test_identification_ec.rb +33 -0
- data/test/test_identification_es_mx.rb +3 -1
- data/test/test_identification_fi.rb +39 -0
- data/test/test_identification_it.rb +12 -1
- data/test/test_identification_kr.rb +3 -3
- data/test/test_image.rb +51 -5
- data/test/test_internet.rb +3 -1
- data/test/test_internet_se.rb +5 -2
- data/test/test_jo_jo.rb +29 -0
- data/test/test_job_tw.rb +21 -0
- data/test/test_lorem_br.rb +3 -3
- data/test/test_lorem_cn.rb +3 -3
- data/test/test_lorem_fr.rb +3 -3
- data/test/test_lorem_ie.rb +2 -2
- data/test/test_lorem_kr.rb +3 -3
- data/test/test_lorem_pl.rb +2 -2
- data/test/test_lorem_ru.rb +3 -3
- data/test/test_lorem_tw.rb +54 -0
- data/test/test_lorem_ua.rb +3 -3
- data/test/test_module_utils.rb +42 -0
- data/test/test_music.rb +4 -4
- data/test/test_name_da.rb +1 -1
- data/test/test_name_ph.rb +1 -1
- data/test/test_name_ru.rb +2 -2
- data/test/test_name_ua.rb +2 -2
- data/test/test_number.rb +14 -2
- data/test/test_phone_number_nl.rb +1 -1
- data/test/test_phone_number_se.rb +1 -1
- data/test/test_phone_number_sg.rb +8 -8
- data/test/test_ssn_se.rb +1 -1
- data/test/test_unique_utils.rb +29 -5
- data/test/test_units.rb +6 -6
- data/test/test_units_english.rb +15 -15
- data/test/test_units_metric.rb +15 -15
- data/test/test_uuid.rb +73 -0
- data/test/test_vehicle.rb +27 -1
- metadata +41 -245
data/lib/ffaker.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require_relative 'ffaker/version'
|
4
|
+
require 'pathname'
|
5
|
+
|
3
6
|
module FFaker
|
4
7
|
require_relative 'ffaker/utils/array_utils'
|
5
8
|
require_relative 'ffaker/utils/module_utils'
|
@@ -13,208 +16,79 @@ module FFaker
|
|
13
16
|
HEX = %w[0 1 2 3 4 5 6 7 8 9 A B C D E F].freeze
|
14
17
|
|
15
18
|
def self.hexify(*masks)
|
16
|
-
fetch_sample(masks.flatten).gsub(
|
19
|
+
fetch_sample(masks.flatten).gsub('#') { fetch_sample(HEX) }
|
17
20
|
end
|
18
21
|
|
19
22
|
def self.numerify(*masks)
|
20
|
-
fetch_sample(masks.flatten).gsub(
|
23
|
+
fetch_sample(masks.flatten).gsub('#') { rand(0..9).to_s }
|
21
24
|
end
|
22
25
|
|
23
26
|
def self.letterify(*masks)
|
24
|
-
fetch_sample(masks.flatten).gsub(
|
27
|
+
fetch_sample(masks.flatten).gsub('?') { fetch_sample(LETTERS) }
|
25
28
|
end
|
26
29
|
|
27
30
|
def self.bothify(masks)
|
28
31
|
letterify(numerify(masks))
|
29
32
|
end
|
30
33
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
autoload :FoodPL, 'ffaker/food_pl'
|
90
|
-
autoload :FreedomIpsum, 'ffaker/freedom_ipsum'
|
91
|
-
autoload :Game, 'ffaker/game'
|
92
|
-
autoload :Gender, 'ffaker/gender'
|
93
|
-
autoload :GenderBR, 'ffaker/gender_br'
|
94
|
-
autoload :GenderCN, 'ffaker/gender_cn'
|
95
|
-
autoload :GenderID, 'ffaker/gender_id'
|
96
|
-
autoload :GenderIT, 'ffaker/gender_it'
|
97
|
-
autoload :GenderJA, 'ffaker/gender_ja'
|
98
|
-
autoload :GenderJP, 'ffaker/gender_jp'
|
99
|
-
autoload :GenderKR, 'ffaker/gender_kr'
|
100
|
-
autoload :GenderPL, 'ffaker/gender_pl'
|
101
|
-
autoload :GenderRU, 'ffaker/gender_ru'
|
102
|
-
autoload :Geolocation, 'ffaker/geolocation'
|
103
|
-
autoload :Guid, 'ffaker/guid'
|
104
|
-
autoload :HealthcareIpsum, 'ffaker/healthcare_ipsum'
|
105
|
-
autoload :HealthcareRU, 'ffaker/healthcare_ru'
|
106
|
-
autoload :HipsterIpsum, 'ffaker/hipster_ipsum'
|
107
|
-
autoload :HTMLIpsum, 'ffaker/html_ipsum'
|
108
|
-
autoload :Identification, 'ffaker/identification'
|
109
|
-
autoload :IdentificationBR, 'ffaker/identification_br'
|
110
|
-
autoload :IdentificationES, 'ffaker/identification_es'
|
111
|
-
autoload :IdentificationESCL, 'ffaker/identification_es_cl'
|
112
|
-
autoload :IdentificationESCO, 'ffaker/identification_es_co'
|
113
|
-
autoload :IdentificationIN, 'ffaker/identification_in'
|
114
|
-
autoload :IdentificationIT, 'ffaker/identification_it'
|
115
|
-
autoload :IdentificationKr, 'ffaker/identification_kr'
|
116
|
-
autoload :IdentificationMX, 'ffaker/identification_mx'
|
117
|
-
autoload :IdentificationPL, 'ffaker/identification_pl'
|
118
|
-
autoload :IdentificationTW, 'ffaker/identification_tw'
|
119
|
-
autoload :Image, 'ffaker/image'
|
120
|
-
autoload :Internet, 'ffaker/internet'
|
121
|
-
autoload :InternetSE, 'ffaker/internet_se'
|
122
|
-
autoload :Job, 'ffaker/job'
|
123
|
-
autoload :JobBR, 'ffaker/job_br'
|
124
|
-
autoload :JobCN, 'ffaker/job_cn'
|
125
|
-
autoload :JobFR, 'ffaker/job_fr'
|
126
|
-
autoload :JobIT, 'ffaker/job_it'
|
127
|
-
autoload :JobJA, 'ffaker/job_ja'
|
128
|
-
autoload :JobKR, 'ffaker/job_kr'
|
129
|
-
autoload :JobVN, 'ffaker/job_vn'
|
130
|
-
autoload :Locale, 'ffaker/locale'
|
131
|
-
autoload :Lorem, 'ffaker/lorem'
|
132
|
-
autoload :LoremAR, 'ffaker/lorem_ar'
|
133
|
-
autoload :LoremBR, 'ffaker/lorem_br'
|
134
|
-
autoload :LoremCN, 'ffaker/lorem_cn'
|
135
|
-
autoload :LoremFR, 'ffaker/lorem_fr'
|
136
|
-
autoload :LoremIE, 'ffaker/lorem_ie'
|
137
|
-
autoload :LoremIT, 'ffaker/lorem_it'
|
138
|
-
autoload :LoremJA, 'ffaker/lorem_ja'
|
139
|
-
autoload :LoremKR, 'ffaker/lorem_kr'
|
140
|
-
autoload :LoremPL, 'ffaker/lorem_pl'
|
141
|
-
autoload :LoremRU, 'ffaker/lorem_ru'
|
142
|
-
autoload :LoremUA, 'ffaker/lorem_ua'
|
143
|
-
autoload :Movie, 'ffaker/movie'
|
144
|
-
autoload :Music, 'ffaker/music'
|
145
|
-
autoload :Name, 'ffaker/name'
|
146
|
-
autoload :NameAR, 'ffaker/name_ar'
|
147
|
-
autoload :NameBR, 'ffaker/name_br'
|
148
|
-
autoload :NameCN, 'ffaker/name_cn'
|
149
|
-
autoload :NameCS, 'ffaker/name_cs'
|
150
|
-
autoload :NameDA, 'ffaker/name_da'
|
151
|
-
autoload :NameDE, 'ffaker/name_de'
|
152
|
-
autoload :NameES, 'ffaker/name_es'
|
153
|
-
autoload :NameFR, 'ffaker/name_fr'
|
154
|
-
autoload :NameGA, 'ffaker/name_ga'
|
155
|
-
autoload :NameGR, 'ffaker/name_gr'
|
156
|
-
autoload :NameID, 'ffaker/name_id'
|
157
|
-
autoload :NameIN, 'ffaker/name_in'
|
158
|
-
autoload :NameIT, 'ffaker/name_it'
|
159
|
-
autoload :NameJA, 'ffaker/name_ja'
|
160
|
-
autoload :NameKH, 'ffaker/name_kh'
|
161
|
-
autoload :NameKR, 'ffaker/name_kr'
|
162
|
-
autoload :NameMX, 'ffaker/name_mx'
|
163
|
-
autoload :NameNB, 'ffaker/name_nb'
|
164
|
-
autoload :NameNL, 'ffaker/name_nl'
|
165
|
-
autoload :NamePH, 'ffaker/name_ph'
|
166
|
-
autoload :NamePL, 'ffaker/name_pl'
|
167
|
-
autoload :NameRU, 'ffaker/name_ru'
|
168
|
-
autoload :NameSE, 'ffaker/name_se'
|
169
|
-
autoload :NameSN, 'ffaker/name_sn'
|
170
|
-
autoload :NameTH, 'ffaker/name_th'
|
171
|
-
autoload :NameTW, 'ffaker/name_tw'
|
172
|
-
autoload :NameTHEN, 'ffaker/name_th_en'
|
173
|
-
autoload :NameUA, 'ffaker/name_ua'
|
174
|
-
autoload :NameVN, 'ffaker/name_vn'
|
175
|
-
autoload :NatoAlphabet, 'ffaker/nato_alphabet'
|
176
|
-
autoload :Number, 'ffaker/number'
|
177
|
-
autoload :PhoneNumber, 'ffaker/phone_number'
|
178
|
-
autoload :PhoneNumberAU, 'ffaker/phone_number_au'
|
179
|
-
autoload :PhoneNumberBR, 'ffaker/phone_number_br'
|
180
|
-
autoload :PhoneNumberCH, 'ffaker/phone_number_ch'
|
181
|
-
autoload :PhoneNumberCU, 'ffaker/phone_number_cu'
|
182
|
-
autoload :PhoneNumberDA, 'ffaker/phone_number_da'
|
183
|
-
autoload :PhoneNumberDE, 'ffaker/phone_number_de'
|
184
|
-
autoload :PhoneNumberFR, 'ffaker/phone_number_fr'
|
185
|
-
autoload :PhoneNumberID, 'ffaker/phone_number_id'
|
186
|
-
autoload :PhoneNumberIT, 'ffaker/phone_number_it'
|
187
|
-
autoload :PhoneNumberJA, 'ffaker/phone_number_ja'
|
188
|
-
autoload :PhoneNumberKR, 'ffaker/phone_number_kr'
|
189
|
-
autoload :PhoneNumberMX, 'ffaker/phone_number_mx'
|
190
|
-
autoload :PhoneNumberNL, 'ffaker/phone_number_nl'
|
191
|
-
autoload :PhoneNumberPL, 'ffaker/phone_number_pl'
|
192
|
-
autoload :PhoneNumberSE, 'ffaker/phone_number_se'
|
193
|
-
autoload :PhoneNumberSG, 'ffaker/phone_number_sg'
|
194
|
-
autoload :PhoneNumberSN, 'ffaker/phone_number_sn'
|
195
|
-
autoload :PhoneNumberTW, 'ffaker/phone_number_tw'
|
196
|
-
autoload :PhoneNumberUA, 'ffaker/phone_number_ua'
|
197
|
-
autoload :PhoneNumberRU, 'ffaker/phone_number_ru'
|
198
|
-
autoload :Product, 'ffaker/product'
|
199
|
-
autoload :SemVer, 'ffaker/sem_ver'
|
200
|
-
autoload :Skill, 'ffaker/skill'
|
201
|
-
autoload :Sport, 'ffaker/sport'
|
202
|
-
autoload :SportPL, 'ffaker/sport_pl'
|
203
|
-
autoload :SportUS, 'ffaker/sport_us'
|
204
|
-
autoload :SportRU, 'ffaker/sport_ru'
|
205
|
-
autoload :SSN, 'ffaker/ssn'
|
206
|
-
autoload :SSNMX, 'ffaker/ssn_mx'
|
207
|
-
autoload :SSNSE, 'ffaker/ssn_se'
|
208
|
-
autoload :String, 'ffaker/string'
|
209
|
-
autoload :Time, 'ffaker/time'
|
210
|
-
autoload :Tweet, 'ffaker/tweet'
|
211
|
-
autoload :Unit, 'ffaker/unit'
|
212
|
-
autoload :UnitEnglish, 'ffaker/unit_english'
|
213
|
-
autoload :UnitMetric, 'ffaker/unit_metric'
|
214
|
-
autoload :VERSION, 'version'
|
215
|
-
autoload :Vehicle, 'ffaker/vehicle'
|
216
|
-
autoload :Venue, 'ffaker/venue'
|
217
|
-
autoload :Youtube, 'ffaker/youtube'
|
34
|
+
autoload_acronyms = {
|
35
|
+
'ar' => 'AR',
|
36
|
+
'au' => 'AU',
|
37
|
+
'aws' => 'AWS',
|
38
|
+
'br' => 'BR',
|
39
|
+
'ca' => 'CA',
|
40
|
+
'ch' => 'CH',
|
41
|
+
'cl' => 'CL',
|
42
|
+
'cn' => 'CN',
|
43
|
+
'co' => 'CO',
|
44
|
+
'cs' => 'CS',
|
45
|
+
'cu' => 'CU',
|
46
|
+
'da' => 'DA',
|
47
|
+
'de' => 'DE',
|
48
|
+
'ec' => 'EC',
|
49
|
+
'en' => 'EN',
|
50
|
+
'es' => 'ES',
|
51
|
+
'fi' => 'FI',
|
52
|
+
'fr' => 'FR',
|
53
|
+
'ga' => 'GA',
|
54
|
+
'gr' => 'GR',
|
55
|
+
'html' => 'HTML',
|
56
|
+
'id' => 'ID',
|
57
|
+
'ie' => 'IE',
|
58
|
+
'in' => 'IN',
|
59
|
+
'it' => 'IT',
|
60
|
+
'ja' => 'JA',
|
61
|
+
'jp' => 'JP',
|
62
|
+
'kh' => 'KH',
|
63
|
+
'kr' => 'KR',
|
64
|
+
'mx' => 'MX',
|
65
|
+
'nb' => 'NB',
|
66
|
+
'nl' => 'NL',
|
67
|
+
'ph' => 'PH',
|
68
|
+
'pl' => 'PL',
|
69
|
+
'ru' => 'RU',
|
70
|
+
'se' => 'SE',
|
71
|
+
'sg' => 'SG',
|
72
|
+
'sn' => 'SN',
|
73
|
+
'ssn' => 'SSN',
|
74
|
+
'th' => 'TH',
|
75
|
+
'tw' => 'TW',
|
76
|
+
'ua' => 'UA',
|
77
|
+
'uk' => 'UK',
|
78
|
+
'us' => 'US',
|
79
|
+
'uuid' => 'UUID',
|
80
|
+
'vn' => 'VN'
|
81
|
+
}
|
82
|
+
|
83
|
+
directory = "#{__dir__}/ffaker"
|
84
|
+
Dir["#{directory}/*.rb"].each do |file_name|
|
85
|
+
relative_file_path = Pathname.new(file_name).relative_path_from(directory).to_s.chomp('.rb')
|
86
|
+
## Don't consider files in sub-directories
|
87
|
+
constant_name = relative_file_path.split('_').map do |part|
|
88
|
+
autoload_acronyms.fetch(part) { part.capitalize }
|
89
|
+
end.join
|
90
|
+
autoload constant_name, file_name
|
91
|
+
end
|
218
92
|
|
219
93
|
# Random Number Generator (RNG) used with ModuleUtils#fetch, #shuffle, #rand
|
220
94
|
# in order to provide deterministic repeatability.
|
data/scripts/reference.rb
CHANGED
@@ -1,30 +1,32 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative '../lib/ffaker'
|
4
|
+
require 'set'
|
5
|
+
|
6
|
+
# always use the same seed for consistency
|
7
|
+
FFaker::Random.seed = 1337
|
4
8
|
|
5
9
|
ICONS = {
|
6
10
|
error: '‼️',
|
7
11
|
warning: '❗'
|
8
12
|
}.freeze
|
9
13
|
|
14
|
+
UTILS_MODULES = %i[ArrayUtils ModuleUtils RandomUtils Random Version].freeze
|
15
|
+
UTILS_METHODS = %i[k underscore fetch_sample rand shuffle unique luhn_check].freeze
|
16
|
+
|
10
17
|
# Get a list of sections
|
11
18
|
def faker_modules
|
12
|
-
FFaker
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
next if mod == FFaker::Random
|
19
|
-
|
20
|
-
mod
|
21
|
-
end.compact
|
19
|
+
FFaker
|
20
|
+
.constants
|
21
|
+
.reject { |const| UTILS_MODULES.include?(const) }
|
22
|
+
.select { |const| FFaker.const_get(const).instance_of?(Module) }
|
23
|
+
.sort
|
24
|
+
.map { |const| FFaker.const_get(const) }
|
22
25
|
end
|
23
26
|
|
24
27
|
# Returns faker methods for a given module
|
25
28
|
def faker_methods(mod)
|
26
|
-
methods = mod.methods - Module.methods -
|
27
|
-
%i[k underscore fetch_sample rand shuffle unique luhn_check]
|
29
|
+
methods = mod.methods - Module.methods - UTILS_METHODS
|
28
30
|
|
29
31
|
# For Company.name (et al), don't discard :name if it was reimplemented
|
30
32
|
methods << :name if mod.send(:name) != mod.to_s
|
@@ -34,12 +36,14 @@ end
|
|
34
36
|
# Catch deprecation warnings.
|
35
37
|
# This `#warn` overrides Kernel#warn
|
36
38
|
def warn(msg)
|
37
|
-
|
39
|
+
return unless Kernel.instance_variable_get(:@ffaker_warnings)
|
40
|
+
|
41
|
+
Kernel.instance_variable_set(:@ffaker_warnings, Kernel.instance_variable_get(:@ffaker_warnings) << msg)
|
38
42
|
end
|
39
43
|
|
40
44
|
def catch_warnings
|
41
|
-
|
42
|
-
[yield,
|
45
|
+
Kernel.instance_variable_set(:@ffaker_warnings, [])
|
46
|
+
[yield, Kernel.instance_variable_get(:@ffaker_warnings)]
|
43
47
|
end
|
44
48
|
|
45
49
|
def escape(str)
|
@@ -66,13 +70,9 @@ sections = faker_modules.map do |mod|
|
|
66
70
|
else
|
67
71
|
begin
|
68
72
|
examples, warnings = catch_warnings do
|
69
|
-
Array.new(3) { mod.send meth }
|
73
|
+
Array.new(3) { mod.unique.send meth }
|
70
74
|
end
|
71
|
-
right =
|
72
|
-
"#{ICONS[:warning]} *#{warnings.first}*"
|
73
|
-
else
|
74
|
-
(escape examples.join(', ')).to_s
|
75
|
-
end
|
75
|
+
right = warnings.any? ? "#{ICONS[:warning]} *#{warnings.first}*" : (escape examples.join(', ')).to_s
|
76
76
|
rescue StandardError => e
|
77
77
|
right = "#{ICONS[:error]} #{e.class}: #{e.message}"
|
78
78
|
end
|
data/test/helper.rb
CHANGED
@@ -13,16 +13,14 @@ module DeterministicHelper
|
|
13
13
|
# Accepts a block. Executes the block multiple times after resetting
|
14
14
|
# the internal Random Number Generator state and compared the results of
|
15
15
|
# each execution to make sure they are the same.
|
16
|
-
def assert_deterministic(options = {})
|
17
|
-
raise ArgumentError, 'Must pass a block' unless
|
16
|
+
def assert_deterministic(options = {}, &block)
|
17
|
+
raise ArgumentError, 'Must pass a block' unless block
|
18
18
|
|
19
19
|
options = { message: 'Results are not repeatable' }.merge(options)
|
20
20
|
|
21
21
|
returns = Array.new(2) do
|
22
22
|
FFaker::Random.reset!
|
23
|
-
Array.new(5)
|
24
|
-
yield
|
25
|
-
end
|
23
|
+
Array.new(5, &block)
|
26
24
|
end
|
27
25
|
|
28
26
|
assert(returns.uniq.length == 1, options[:message])
|
@@ -37,7 +35,7 @@ module DeterministicHelper
|
|
37
35
|
end
|
38
36
|
operator_name += '_or_equal_to' if operator[1] == '='
|
39
37
|
|
40
|
-
define_method "assert_#{operator_name}" do |got, expected|
|
38
|
+
define_method :"assert_#{operator_name}" do |got, expected|
|
41
39
|
assert(
|
42
40
|
got.public_send(operator, expected),
|
43
41
|
"Expected #{operator} \"#{expected}\", but got #{got}"
|
@@ -58,8 +56,8 @@ module DeterministicHelper
|
|
58
56
|
end
|
59
57
|
|
60
58
|
%w[less_than_or_equal_to between].each do |method_name|
|
61
|
-
define_method "assert_random_#{method_name}" do |*args, &block|
|
62
|
-
assert_random(block) { send "assert_#{method_name}", block.call, *args }
|
59
|
+
define_method :"assert_random_#{method_name}" do |*args, &block|
|
60
|
+
assert_random(block) { send :"assert_#{method_name}", block.call, *args }
|
63
61
|
end
|
64
62
|
end
|
65
63
|
|
@@ -78,7 +76,7 @@ module DeterministicHelper
|
|
78
76
|
# }
|
79
77
|
def assert_methods_are_deterministic(klass, *methods)
|
80
78
|
Array(methods).each do |meth|
|
81
|
-
define_method "test_#{meth}_is_deterministic" do
|
79
|
+
define_method :"test_#{meth}_is_deterministic" do
|
82
80
|
assert_deterministic(message: "Results from `#{klass}.#{meth}` are not repeatable") do
|
83
81
|
klass.send(meth)
|
84
82
|
end
|
data/test/test_address_br.rb
CHANGED
@@ -7,7 +7,7 @@ class TestAddressBR < Test::Unit::TestCase
|
|
7
7
|
|
8
8
|
assert_methods_are_deterministic(
|
9
9
|
FFaker::AddressBR,
|
10
|
-
:zip_code, :state, :state_abbr, :city, :street_prefix, :street, :full_address
|
10
|
+
:zip_code, :state, :state_abbr, :city, :street_prefix, :street, :complement, :neighborhood, :full_address
|
11
11
|
)
|
12
12
|
|
13
13
|
def test_zip_code
|
@@ -32,6 +32,19 @@ class TestAddressBR < Test::Unit::TestCase
|
|
32
32
|
|
33
33
|
def test_street
|
34
34
|
prefixes = FFaker::AddressBR::STREET_PREFIX
|
35
|
-
assert_match(
|
35
|
+
assert_match(/\A(#{prefixes.join('|')})(?: [\p{Alpha}-]+)+\z/, FFaker::AddressBR.street)
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_complement
|
39
|
+
assert_match(/\A(?:Apartamento \d{3}|Casa Térrea|Fundos)\z/, FFaker::AddressBR.complement)
|
40
|
+
end
|
41
|
+
|
42
|
+
def test_neighborhood
|
43
|
+
neighborhood_prefix = FFaker::AddressBR.neighborhood.split(' ').first
|
44
|
+
assert FFaker::AddressBR::NEIGHBORHOOD_PREFIXES.include?(neighborhood_prefix)
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_full_address
|
48
|
+
assert_match(/\A[\p{Alpha}\d, -]+\z/, FFaker::AddressBR.full_address)
|
36
49
|
end
|
37
50
|
end
|
data/test/test_address_da.rb
CHANGED
@@ -20,11 +20,11 @@ class TestAddressDA < Test::Unit::TestCase
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_state
|
23
|
-
assert_match(/\A[-ÆØÅæøåa-z
|
23
|
+
assert_match(/\A[-ÆØÅæøåa-z]+\z/i, FFaker::AddressDA.state)
|
24
24
|
end
|
25
25
|
|
26
26
|
def test_kommune
|
27
|
-
assert_match(/\A[-ÆØÅæøåa-z
|
27
|
+
assert_match(/\A[-ÆØÅæøåa-z]+\z/i, FFaker::AddressDA.kommune)
|
28
28
|
end
|
29
29
|
|
30
30
|
def test_region
|
@@ -32,7 +32,7 @@ class TestAddressDA < Test::Unit::TestCase
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def test_city
|
35
|
-
assert_match(/\A[- ÆØÅæøåla-z
|
35
|
+
assert_match(/\A[- ÆØÅæøåla-z]+\z/i, FFaker::AddressDA.city)
|
36
36
|
end
|
37
37
|
|
38
38
|
def test_street_name
|
data/test/test_address_fi.rb
CHANGED
@@ -5,8 +5,8 @@ require_relative 'helper'
|
|
5
5
|
class TestAddressFI < Test::Unit::TestCase
|
6
6
|
include DeterministicHelper
|
7
7
|
|
8
|
-
ALPHA = /\A\p{Alpha}
|
9
|
-
DIGIT = /\d{1}
|
8
|
+
ALPHA = /\A\p{Alpha}+/
|
9
|
+
DIGIT = /\d{1}/
|
10
10
|
|
11
11
|
assert_methods_are_deterministic(
|
12
12
|
FFaker::AddressFI,
|
data/test/test_address_se.rb
CHANGED
@@ -5,8 +5,8 @@ require_relative 'helper'
|
|
5
5
|
class TestAddressSE < Test::Unit::TestCase
|
6
6
|
include DeterministicHelper
|
7
7
|
|
8
|
-
ALPHA = /\A\p{Alpha}
|
9
|
-
DIGIT = /\d{1}
|
8
|
+
ALPHA = /\A\p{Alpha}+/
|
9
|
+
DIGIT = /\d{1}/
|
10
10
|
|
11
11
|
assert_methods_are_deterministic(
|
12
12
|
FFaker::AddressSE,
|
data/test/test_address_ua.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'helper'
|
4
|
+
|
5
|
+
class TestAnimalsBR < Test::Unit::TestCase
|
6
|
+
include DeterministicHelper
|
7
|
+
|
8
|
+
assert_methods_are_deterministic(FFaker::AnimalBR, :common_name)
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@tester = FFaker::AnimalBR
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_name
|
15
|
+
assert_include @tester::COMMON_NAMES, @tester.common_name
|
16
|
+
end
|
17
|
+
end
|
data/test/test_array_utils.rb
CHANGED
@@ -89,7 +89,7 @@ class TestArrayUtils < Test::Unit::TestCase
|
|
89
89
|
|
90
90
|
private
|
91
91
|
|
92
|
-
#
|
92
|
+
# Suppress the deprecation warning that some methods output, so we get less
|
93
93
|
# noise in our test run.
|
94
94
|
def supress_warn_output
|
95
95
|
original_verbosity = $VERBOSE
|
data/test/test_avatar.rb
CHANGED
@@ -18,40 +18,63 @@ class TestAvatar < Test::Unit::TestCase
|
|
18
18
|
@tester.image)
|
19
19
|
end
|
20
20
|
|
21
|
+
def test_image_output_with_keyword_arguments
|
22
|
+
output = capture_output do
|
23
|
+
@tester.image(format: 'jpg')
|
24
|
+
end
|
25
|
+
|
26
|
+
assert_equal ['', ''], output
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_image_with_slug_as_positional_argument
|
30
|
+
assert_equal("#{ROBOHASH}/foobar.png?size=300x300", @tester.image('foobar'))
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_image_output_with_positional_arguments
|
34
|
+
output = capture_output do
|
35
|
+
@tester.image('foobar')
|
36
|
+
end
|
37
|
+
|
38
|
+
assert_equal(
|
39
|
+
['', "Positional arguments for Avatar#image are deprecated. Please use keyword arguments.\n"],
|
40
|
+
output
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
21
44
|
def test_avatar_with_param
|
22
|
-
assert_equal("#{ROBOHASH}/faker.png?size=300x300", @tester.image('faker'))
|
45
|
+
assert_equal("#{ROBOHASH}/faker.png?size=300x300", @tester.image(slug: 'faker'))
|
23
46
|
end
|
24
47
|
|
25
48
|
def test_avatar_with_correct_size
|
26
49
|
assert_equal("#{ROBOHASH}/faker.png?size=150x320",
|
27
|
-
@tester.image('faker', '150x320'))
|
50
|
+
@tester.image(slug: 'faker', size: '150x320'))
|
28
51
|
end
|
29
52
|
|
30
53
|
def test_avatar_with_incorrect_size
|
31
54
|
assert_raise ArgumentError do
|
32
|
-
@tester.image(
|
55
|
+
@tester.image(size: '150x320z')
|
33
56
|
end
|
34
57
|
end
|
35
58
|
|
36
59
|
def test_avatar_with_supported_format
|
37
60
|
assert_equal("#{ROBOHASH}/faker.jpg?size=300x300",
|
38
|
-
@tester.image('faker', '300x300', 'jpg'))
|
61
|
+
@tester.image(slug: 'faker', size: '300x300', format: 'jpg'))
|
39
62
|
end
|
40
63
|
|
41
64
|
def test_avatar_with_incorrect_format
|
42
65
|
assert_raise ArgumentError do
|
43
|
-
@tester.image(
|
66
|
+
@tester.image(size: '300x300', format: 'wrong_format')
|
44
67
|
end
|
45
68
|
end
|
46
69
|
|
47
70
|
def test_avatar_with_correct_background
|
48
71
|
assert_equal("#{ROBOHASH}/faker.png?size=300x300&bgset=bg1",
|
49
|
-
@tester.image('faker', '300x300', 'png', '1'))
|
72
|
+
@tester.image(slug: 'faker', size: '300x300', format: 'png', bgset: '1'))
|
50
73
|
end
|
51
74
|
|
52
75
|
def test_avatar_with_incorrect_background
|
53
76
|
assert_raise ArgumentError do
|
54
|
-
@tester.image('faker', '300x300', 'png', 'not_a_number')
|
77
|
+
@tester.image(slug: 'faker', size: '300x300', format: 'png', bgset: 'not_a_number')
|
55
78
|
end
|
56
79
|
end
|
57
80
|
end
|
data/test/test_bank.rb
CHANGED
@@ -7,7 +7,7 @@ class TestBank < Test::Unit::TestCase
|
|
7
7
|
|
8
8
|
assert_methods_are_deterministic(
|
9
9
|
FFaker::Bank,
|
10
|
-
:iban, :card_number, :card_expiry_date, :card_type
|
10
|
+
:iban, :card_number, :card_expiry_date, :card_type, :loan_interest_rate, :loan_term, :loan_amount
|
11
11
|
)
|
12
12
|
|
13
13
|
def setup
|
@@ -50,4 +50,18 @@ class TestBank < Test::Unit::TestCase
|
|
50
50
|
def test_card_type
|
51
51
|
assert_include @tester::CARD_TYPES, @tester.card_type
|
52
52
|
end
|
53
|
+
|
54
|
+
def test_loan_interest_rate
|
55
|
+
rate = FFaker::Bank.loan_interest_rate
|
56
|
+
assert(rate.to_f.between?(1.5, 15.0), "Rate #{rate} is out of bounds")
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_loan_term
|
60
|
+
assert_includes([12, 24, 36, 48, 60, 72, 84], FFaker::Bank.loan_term)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_loan_amount
|
64
|
+
amount = FFaker::Bank.loan_amount
|
65
|
+
assert(amount.between?(1_000, 100_000), "Amount #{amount} is out of bounds")
|
66
|
+
end
|
53
67
|
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'helper'
|
4
|
+
|
5
|
+
class TestBankUS < Test::Unit::TestCase
|
6
|
+
include DeterministicHelper
|
7
|
+
|
8
|
+
assert_methods_are_deterministic(
|
9
|
+
FFaker::BankUS,
|
10
|
+
:account_number, :routing_number
|
11
|
+
)
|
12
|
+
|
13
|
+
def setup
|
14
|
+
@tester = FFaker::BankUS
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_account_number
|
18
|
+
assert_instance_of String, @tester.account_number
|
19
|
+
assert_match(/\A\d{8}\z/, @tester.account_number(min_digits: 8, max_digits: 8))
|
20
|
+
assert_match(/\A\d{12}\z/, @tester.account_number(min_digits: 12, max_digits: 12))
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_routing_number
|
24
|
+
routing_number = @tester.routing_number
|
25
|
+
assert_match(/\A\d{9}\z/, routing_number)
|
26
|
+
|
27
|
+
assert_true(@tester::ROUTING_NUMBER_PREFIXES.include?(routing_number[0..1]))
|
28
|
+
|
29
|
+
checksum = (
|
30
|
+
(7 * (routing_number[0].to_i + routing_number[3].to_i + routing_number[6].to_i)) +
|
31
|
+
(3 * (routing_number[1].to_i + routing_number[4].to_i + routing_number[7].to_i)) +
|
32
|
+
(9 * (routing_number[2].to_i + routing_number[5].to_i + routing_number[8].to_i))
|
33
|
+
)
|
34
|
+
|
35
|
+
assert_equal(0, checksum % 10, 'The routing number\'s checksum is not a multiple of ten')
|
36
|
+
end
|
37
|
+
end
|