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.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +163 -17
  3. data/Gemfile +15 -0
  4. data/README.md +19 -7
  5. data/REFERENCE.md +1479 -1395
  6. data/Rakefile +16 -47
  7. data/bin/console +9 -0
  8. data/ffaker.gemspec +9 -23
  9. data/lib/ffaker/address.rb +5 -5
  10. data/lib/ffaker/address_br.rb +14 -2
  11. data/lib/ffaker/address_fr.rb +3 -5
  12. data/lib/ffaker/address_it.rb +1 -5
  13. data/lib/ffaker/address_ua.rb +1 -1
  14. data/lib/ffaker/animal_br.rb +12 -0
  15. data/lib/ffaker/avatar.rb +11 -3
  16. data/lib/ffaker/bank.rb +13 -1
  17. data/lib/ffaker/bank_us.rb +37 -0
  18. data/lib/ffaker/book.rb +15 -7
  19. data/lib/ffaker/boolean.rb +4 -0
  20. data/lib/ffaker/cheesy_lingo.rb +2 -2
  21. data/lib/ffaker/code.rb +1 -1
  22. data/lib/ffaker/company.rb +5 -8
  23. data/lib/ffaker/company_fr.rb +2 -2
  24. data/lib/ffaker/crypto.rb +14 -0
  25. data/lib/ffaker/data/address_br/complement +3 -0
  26. data/lib/ffaker/data/address_br/neighborhood_prefixes +3 -0
  27. data/lib/ffaker/data/address_de/state +1 -0
  28. data/lib/ffaker/data/animal_br/common_names +423 -0
  29. data/lib/ffaker/data/jo_jo/first_names +356 -0
  30. data/lib/ffaker/data/jo_jo/full_names +225 -0
  31. data/lib/ffaker/data/jo_jo/last_names +153 -0
  32. data/lib/ffaker/data/jo_jo/stands +149 -0
  33. data/lib/ffaker/data/job_tw/job_nouns +201 -0
  34. data/lib/ffaker/data/lorem_tw/words +789 -0
  35. data/lib/ffaker/date.rb +40 -0
  36. data/lib/ffaker/filesystem.rb +12 -2
  37. data/lib/ffaker/geolocation.rb +2 -2
  38. data/lib/ffaker/guid.rb +7 -1
  39. data/lib/ffaker/html_ipsum.rb +7 -1
  40. data/lib/ffaker/identification_br.rb +3 -12
  41. data/lib/ffaker/identification_ec.rb +39 -0
  42. data/lib/ffaker/identification_es_cl.rb +2 -2
  43. data/lib/ffaker/identification_es_co.rb +1 -1
  44. data/lib/ffaker/identification_fi.rb +73 -0
  45. data/lib/ffaker/identification_kr.rb +11 -4
  46. data/lib/ffaker/identification_mx.rb +1 -1
  47. data/lib/ffaker/identification_pl.rb +6 -6
  48. data/lib/ffaker/identification_tw.rb +4 -3
  49. data/lib/ffaker/image.rb +28 -4
  50. data/lib/ffaker/jo_jo.rb +24 -0
  51. data/lib/ffaker/job_tw.rb +12 -0
  52. data/lib/ffaker/lorem_ja.rb +1 -1
  53. data/lib/ffaker/lorem_ru.rb +1 -1
  54. data/lib/ffaker/lorem_tw.rb +40 -0
  55. data/lib/ffaker/movie.rb +1 -1
  56. data/lib/ffaker/name_fr.rb +4 -3
  57. data/lib/ffaker/name_pl.rb +3 -3
  58. data/lib/ffaker/number.rb +6 -2
  59. data/lib/ffaker/phone_number_de.rb +3 -3
  60. data/lib/ffaker/skill.rb +1 -1
  61. data/lib/ffaker/ssn.rb +4 -2
  62. data/lib/ffaker/ssn_se.rb +2 -2
  63. data/lib/ffaker/string.rb +7 -7
  64. data/lib/ffaker/time.rb +4 -4
  65. data/lib/ffaker/tweet.rb +1 -1
  66. data/lib/ffaker/utils/module_utils.rb +10 -20
  67. data/lib/ffaker/utils/unique_utils.rb +34 -21
  68. data/lib/ffaker/uuid.rb +175 -0
  69. data/lib/ffaker/vehicle.rb +63 -1
  70. data/lib/{version.rb → ffaker/version.rb} +1 -1
  71. data/lib/ffaker.rb +64 -190
  72. data/scripts/reference.rb +21 -21
  73. data/test/helper.rb +7 -9
  74. data/test/test_address_br.rb +15 -2
  75. data/test/test_address_da.rb +3 -3
  76. data/test/test_address_fi.rb +2 -2
  77. data/test/test_address_se.rb +2 -2
  78. data/test/test_address_ua.rb +1 -1
  79. data/test/test_animal_br.rb +17 -0
  80. data/test/test_array_utils.rb +1 -1
  81. data/test/test_avatar.rb +30 -7
  82. data/test/test_bank.rb +15 -1
  83. data/test/test_bank_us.rb +37 -0
  84. data/test/test_book.rb +29 -0
  85. data/test/test_boolean.rb +32 -1
  86. data/test/test_cheesy_lingo.rb +1 -1
  87. data/test/test_color.rb +3 -3
  88. data/test/test_crypto.rb +15 -0
  89. data/test/test_date.rb +47 -0
  90. data/test/test_filesystem.rb +30 -4
  91. data/test/test_freedom_ipsum.rb +1 -1
  92. data/test/test_gender_it.rb +1 -1
  93. data/test/test_gender_ja.rb +1 -1
  94. data/test/test_gender_jp.rb +1 -1
  95. data/test/test_gender_pl.rb +1 -1
  96. data/test/test_guid.rb +1 -1
  97. data/test/test_healthcare_ru.rb +1 -1
  98. data/test/test_hipster_ipsum.rb +1 -1
  99. data/test/test_html_ipsum.rb +6 -0
  100. data/test/test_identification.rb +12 -2
  101. data/test/test_identification_ec.rb +33 -0
  102. data/test/test_identification_es_mx.rb +3 -1
  103. data/test/test_identification_fi.rb +39 -0
  104. data/test/test_identification_it.rb +12 -1
  105. data/test/test_identification_kr.rb +3 -3
  106. data/test/test_image.rb +51 -5
  107. data/test/test_internet.rb +3 -1
  108. data/test/test_internet_se.rb +5 -2
  109. data/test/test_jo_jo.rb +29 -0
  110. data/test/test_job_tw.rb +21 -0
  111. data/test/test_lorem_br.rb +3 -3
  112. data/test/test_lorem_cn.rb +3 -3
  113. data/test/test_lorem_fr.rb +3 -3
  114. data/test/test_lorem_ie.rb +2 -2
  115. data/test/test_lorem_kr.rb +3 -3
  116. data/test/test_lorem_pl.rb +2 -2
  117. data/test/test_lorem_ru.rb +3 -3
  118. data/test/test_lorem_tw.rb +54 -0
  119. data/test/test_lorem_ua.rb +3 -3
  120. data/test/test_module_utils.rb +42 -0
  121. data/test/test_music.rb +4 -4
  122. data/test/test_name_da.rb +1 -1
  123. data/test/test_name_ph.rb +1 -1
  124. data/test/test_name_ru.rb +2 -2
  125. data/test/test_name_ua.rb +2 -2
  126. data/test/test_number.rb +14 -2
  127. data/test/test_phone_number_nl.rb +1 -1
  128. data/test/test_phone_number_se.rb +1 -1
  129. data/test/test_phone_number_sg.rb +8 -8
  130. data/test/test_ssn_se.rb +1 -1
  131. data/test/test_unique_utils.rb +29 -5
  132. data/test/test_units.rb +6 -6
  133. data/test/test_units_english.rb +15 -15
  134. data/test/test_units_metric.rb +15 -15
  135. data/test/test_uuid.rb +73 -0
  136. data/test/test_vehicle.rb +27 -1
  137. 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(/#/) { fetch_sample(HEX) }
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(/#/) { rand(0..9).to_s }
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(/\?/) { fetch_sample(LETTERS) }
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
- autoload :Address, 'ffaker/address'
32
- autoload :AddressAU, 'ffaker/address_au'
33
- autoload :AddressBR, 'ffaker/address_br'
34
- autoload :AddressCA, 'ffaker/address_ca'
35
- autoload :AddressCH, 'ffaker/address_ch'
36
- autoload :AddressCHDE, 'ffaker/address_ch_de'
37
- autoload :AddressCHFR, 'ffaker/address_ch_fr'
38
- autoload :AddressCHIT, 'ffaker/address_ch_it'
39
- autoload :AddressDA, 'ffaker/address_da'
40
- autoload :AddressDE, 'ffaker/address_de'
41
- autoload :AddressFI, 'ffaker/address_fi'
42
- autoload :AddressFR, 'ffaker/address_fr'
43
- autoload :AddressGR, 'ffaker/address_gr'
44
- autoload :AddressID, 'ffaker/address_id'
45
- autoload :AddressIN, 'ffaker/address_in'
46
- autoload :AddressIT, 'ffaker/address_it'
47
- autoload :AddressJA, 'ffaker/address_ja'
48
- autoload :AddressKR, 'ffaker/address_kr'
49
- autoload :AddressMX, 'ffaker/address_mx'
50
- autoload :AddressNL, 'ffaker/address_nl'
51
- autoload :AddressPL, 'ffaker/address_pl'
52
- autoload :AddressRU, 'ffaker/address_ru'
53
- autoload :AddressSE, 'ffaker/address_se'
54
- autoload :AddressSN, 'ffaker/address_sn'
55
- autoload :AddressUA, 'ffaker/address_ua'
56
- autoload :AddressUK, 'ffaker/address_uk'
57
- autoload :AddressUS, 'ffaker/address_us'
58
- autoload :Airline, 'ffaker/airline'
59
- autoload :Animal, 'ffaker/animal'
60
- autoload :AnimalCN, 'ffaker/animal_cn'
61
- autoload :AnimalES, 'ffaker/animal_es'
62
- autoload :AnimalPL, 'ffaker/animal_pl'
63
- autoload :AnimalUS, 'ffaker/animal_us'
64
- autoload :Avatar, 'ffaker/avatar'
65
- autoload :AWS, 'ffaker/aws'
66
- autoload :BaconIpsum, 'ffaker/bacon_ipsum'
67
- autoload :Bank, 'ffaker/bank'
68
- autoload :Book, 'ffaker/book'
69
- autoload :Boolean, 'ffaker/boolean'
70
- autoload :CheesyLingo, 'ffaker/cheesy_lingo'
71
- autoload :Code, 'ffaker/code'
72
- autoload :Color, 'ffaker/color'
73
- autoload :ColorPL, 'ffaker/color_pl'
74
- autoload :ColorUA, 'ffaker/color_ua'
75
- autoload :Company, 'ffaker/company'
76
- autoload :CompanyCN, 'ffaker/company_cn'
77
- autoload :CompanyFR, 'ffaker/company_fr'
78
- autoload :CompanyIT, 'ffaker/company_it'
79
- autoload :CompanyJA, 'ffaker/company_ja'
80
- autoload :CompanySE, 'ffaker/company_se'
81
- autoload :Conference, 'ffaker/conference'
82
- autoload :CoursesFR, 'ffaker/courses_fr'
83
- autoload :Currency, 'ffaker/currency'
84
- autoload :DizzleIpsum, 'ffaker/dizzle_ipsum'
85
- autoload :Education, 'ffaker/education'
86
- autoload :EducationCN, 'ffaker/education_cn'
87
- autoload :Filesystem, 'ffaker/filesystem'
88
- autoload :Food, 'ffaker/food'
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.constants.sort.map do |const|
13
- mod = FFaker.const_get(const)
14
- next unless mod.is_a?(Module)
15
- next if mod == FFaker::ArrayUtils
16
- next if mod == FFaker::ModuleUtils
17
- next if mod == FFaker::RandomUtils
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
- $warnings << msg if $warnings
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
- $warnings = []
42
- [yield, $warnings]
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 = if warnings.any?
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 block_given?
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) do
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
@@ -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(/(#{prefixes.join('|')})( \p{Alpha}+){1,2}/, FFaker::AddressBR.street)
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
@@ -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-]+\z/i, FFaker::AddressDA.state)
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-]+\z/i, FFaker::AddressDA.kommune)
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-]+\z/i, FFaker::AddressDA.city)
35
+ assert_match(/\A[- ÆØÅæøåla-z]+\z/i, FFaker::AddressDA.city)
36
36
  end
37
37
 
38
38
  def test_street_name
@@ -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}+/.freeze
9
- DIGIT = /\d{1}/.freeze
8
+ ALPHA = /\A\p{Alpha}+/
9
+ DIGIT = /\d{1}/
10
10
 
11
11
  assert_methods_are_deterministic(
12
12
  FFaker::AddressFI,
@@ -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}+/.freeze
9
- DIGIT = /\d{1}/.freeze
8
+ ALPHA = /\A\p{Alpha}+/
9
+ DIGIT = /\d{1}/
10
10
 
11
11
  assert_methods_are_deterministic(
12
12
  FFaker::AddressSE,
@@ -41,7 +41,7 @@ class TestAddressUA < Test::Unit::TestCase
41
41
  end
42
42
 
43
43
  def test_street_address_with_secondary
44
- assert_match( \
44
+ assert_match(
45
45
  /\Aвул\.\s[а-яА-ЯіїєґІЇЄҐ’\-\s]+,\s\d{1,3},\sкв\.\s\d{1,3}\z/,
46
46
  @tester.street_address(true)
47
47
  )
@@ -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
@@ -89,7 +89,7 @@ class TestArrayUtils < Test::Unit::TestCase
89
89
 
90
90
  private
91
91
 
92
- # Supress the deprecation warning that some methods output, so we get less
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(nil, '150x320z')
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(nil, '300x300', 'wrong_format')
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