ffaker 2.21.0 → 2.23.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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +131 -17
  3. data/Gemfile +15 -0
  4. data/README.md +18 -6
  5. data/REFERENCE.md +1012 -969
  6. data/Rakefile +16 -47
  7. data/bin/console +9 -0
  8. data/ffaker.gemspec +9 -23
  9. data/lib/ffaker/address.rb +4 -4
  10. data/lib/ffaker/address_fr.rb +3 -5
  11. data/lib/ffaker/address_it.rb +1 -4
  12. data/lib/ffaker/address_ua.rb +1 -1
  13. data/lib/ffaker/avatar.rb +11 -3
  14. data/lib/ffaker/bank.rb +1 -1
  15. data/lib/ffaker/bank_us.rb +33 -0
  16. data/lib/ffaker/book.rb +15 -7
  17. data/lib/ffaker/cheesy_lingo.rb +2 -2
  18. data/lib/ffaker/code.rb +1 -1
  19. data/lib/ffaker/company.rb +2 -2
  20. data/lib/ffaker/company_fr.rb +2 -2
  21. data/lib/ffaker/crypto.rb +14 -0
  22. data/lib/ffaker/data/address_de/state +1 -0
  23. data/lib/ffaker/data/jo_jo/first_names +356 -0
  24. data/lib/ffaker/data/jo_jo/full_names +225 -0
  25. data/lib/ffaker/data/jo_jo/last_names +153 -0
  26. data/lib/ffaker/data/jo_jo/stands +149 -0
  27. data/lib/ffaker/date.rb +40 -0
  28. data/lib/ffaker/filesystem.rb +12 -2
  29. data/lib/ffaker/geolocation.rb +2 -2
  30. data/lib/ffaker/identification_br.rb +3 -12
  31. data/lib/ffaker/identification_ec.rb +39 -0
  32. data/lib/ffaker/identification_es_cl.rb +2 -2
  33. data/lib/ffaker/identification_es_co.rb +1 -1
  34. data/lib/ffaker/identification_kr.rb +11 -4
  35. data/lib/ffaker/identification_pl.rb +6 -6
  36. data/lib/ffaker/identification_tw.rb +1 -1
  37. data/lib/ffaker/image.rb +28 -4
  38. data/lib/ffaker/jo_jo.rb +24 -0
  39. data/lib/ffaker/lorem_ja.rb +1 -1
  40. data/lib/ffaker/lorem_ru.rb +1 -1
  41. data/lib/ffaker/movie.rb +1 -1
  42. data/lib/ffaker/name_fr.rb +4 -3
  43. data/lib/ffaker/name_pl.rb +1 -1
  44. data/lib/ffaker/number.rb +6 -2
  45. data/lib/ffaker/phone_number_de.rb +3 -3
  46. data/lib/ffaker/skill.rb +1 -1
  47. data/lib/ffaker/ssn.rb +4 -2
  48. data/lib/ffaker/ssn_se.rb +2 -2
  49. data/lib/ffaker/string.rb +1 -1
  50. data/lib/ffaker/time.rb +3 -3
  51. data/lib/ffaker/utils/module_utils.rb +5 -6
  52. data/lib/ffaker/utils/unique_utils.rb +33 -21
  53. data/lib/ffaker/vehicle.rb +2 -2
  54. data/lib/{version.rb → ffaker/version.rb} +1 -1
  55. data/lib/ffaker.rb +63 -191
  56. data/scripts/reference.rb +8 -10
  57. data/test/helper.rb +3 -5
  58. data/test/test_address_da.rb +3 -3
  59. data/test/test_address_fi.rb +2 -2
  60. data/test/test_address_se.rb +2 -2
  61. data/test/test_avatar.rb +30 -7
  62. data/test/test_bank_us.rb +35 -0
  63. data/test/test_book.rb +29 -0
  64. data/test/test_cheesy_lingo.rb +1 -1
  65. data/test/test_color.rb +3 -3
  66. data/test/test_crypto.rb +15 -0
  67. data/test/test_date.rb +47 -0
  68. data/test/test_filesystem.rb +30 -4
  69. data/test/test_freedom_ipsum.rb +1 -1
  70. data/test/test_gender_it.rb +1 -1
  71. data/test/test_gender_ja.rb +1 -1
  72. data/test/test_gender_jp.rb +1 -1
  73. data/test/test_gender_pl.rb +1 -1
  74. data/test/test_healthcare_ru.rb +1 -1
  75. data/test/test_hipster_ipsum.rb +1 -1
  76. data/test/test_html_ipsum.rb +2 -2
  77. data/test/test_identification.rb +12 -2
  78. data/test/test_identification_ec.rb +33 -0
  79. data/test/test_identification_es_mx.rb +3 -1
  80. data/test/test_identification_it.rb +12 -1
  81. data/test/test_identification_kr.rb +3 -3
  82. data/test/test_image.rb +51 -5
  83. data/test/test_internet.rb +3 -1
  84. data/test/test_internet_se.rb +5 -2
  85. data/test/test_jo_jo.rb +29 -0
  86. data/test/test_lorem_br.rb +2 -2
  87. data/test/test_lorem_cn.rb +3 -3
  88. data/test/test_lorem_fr.rb +3 -3
  89. data/test/test_lorem_ie.rb +2 -2
  90. data/test/test_lorem_kr.rb +3 -3
  91. data/test/test_lorem_pl.rb +2 -2
  92. data/test/test_lorem_ru.rb +3 -3
  93. data/test/test_lorem_ua.rb +3 -3
  94. data/test/test_module_utils.rb +33 -0
  95. data/test/test_name_da.rb +1 -1
  96. data/test/test_name_ph.rb +1 -1
  97. data/test/test_name_ru.rb +2 -2
  98. data/test/test_name_ua.rb +2 -2
  99. data/test/test_number.rb +13 -1
  100. data/test/test_phone_number_nl.rb +1 -1
  101. data/test/test_phone_number_se.rb +1 -1
  102. data/test/test_phone_number_sg.rb +8 -8
  103. data/test/test_unique_utils.rb +29 -5
  104. data/test/test_units.rb +6 -6
  105. data/test/test_units_english.rb +15 -15
  106. data/test/test_units_metric.rb +15 -15
  107. data/test/test_vehicle.rb +22 -0
  108. metadata +24 -241
@@ -13,7 +13,7 @@ module FFaker
13
13
  end
14
14
 
15
15
  def const_missing(const_name)
16
- if const_name =~ /[a-z]/ # Not a constant, probably a class/module name.
16
+ if const_name.match?(/[a-z]/) # Not a constant, probably a class/module name.
17
17
  super const_name
18
18
  else
19
19
  mod_name = ancestors.first.to_s.split('::').last
@@ -25,7 +25,7 @@ module FFaker
25
25
  end
26
26
 
27
27
  def underscore(string)
28
- string.gsub(/::/, '/')
28
+ string.gsub('::', '/')
29
29
  .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
30
30
  .gsub(/([a-z\d])([A-Z])/, '\1_\2')
31
31
  .tr('-', '_')
@@ -33,14 +33,14 @@ module FFaker
33
33
  end
34
34
 
35
35
  def unique(max_retries = 10_000)
36
- @unique_generator ||= FFaker::UniqueUtils.new(self, max_retries)
36
+ FFaker::UniqueUtils.add_instance(self, max_retries)
37
37
  end
38
38
 
39
39
  # http://en.wikipedia.org/wiki/Luhn_algorithm
40
40
  def luhn_check(number)
41
41
  multiplications = []
42
42
 
43
- number.split(//).each_with_index do |digit, i|
43
+ number.chars.each_with_index do |digit, i|
44
44
  multiplications << i.even? ? digit.to_i * 2 : digit.to_i
45
45
  end
46
46
 
@@ -51,9 +51,8 @@ module FFaker
51
51
  end
52
52
  end
53
53
 
54
- control_digit = (sum % 10).zero? ? 0 : (sum / 10 + 1) * 10 - sum
54
+ control_digit = (sum % 10).zero? ? 0 : (((sum / 10) + 1) * 10) - sum
55
55
  control_digit.to_s
56
56
  end
57
-
58
57
  end
59
58
  end
@@ -1,44 +1,56 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'set'
3
4
 
4
5
  module FFaker
5
6
  class UniqueUtils
6
- def initialize(generator, max_retries)
7
- @generator = generator
8
- @max_retries = max_retries
9
- @previous_results = Hash.new { |hash, key| hash[key] = Set.new }
10
- end
7
+ RetryLimitExceeded = Class.new(StandardError)
11
8
 
12
- def method_missing(name, *arguments)
13
- @generator.respond_to?(name) ? add_results_to_hash(name, *arguments) : super
14
- end
9
+ class << self
10
+ def add_instance(generator, max_retries)
11
+ instances[generator] ||= FFaker::UniqueUtils.new(generator, max_retries)
12
+ end
15
13
 
16
- def respond_to_missing?(method_name, include_private = false)
17
- super
18
- end
14
+ def instances
15
+ Thread.current[:ffaker_unique_utils] ||= {}
16
+ end
19
17
 
20
- RetryLimitExceeded = Class.new(StandardError)
18
+ def clear
19
+ instances.each_value(&:clear)
20
+ instances.clear
21
+ end
22
+ end
21
23
 
22
- def clear
23
- @previous_results.clear
24
+ def initialize(generator, max_retries)
25
+ @generator = generator
26
+ @max_retries = max_retries
24
27
  end
25
28
 
26
- def self.clear
27
- ObjectSpace.each_object(self, &:clear)
29
+ def clear
30
+ previous_results.clear
28
31
  end
29
32
 
30
33
  private
31
34
 
32
- def add_results_to_hash(name, *arguments)
35
+ def method_missing(name, *args, **kwargs)
33
36
  @max_retries.times do
34
- result = @generator.send(name, *arguments)
37
+ result = @generator.public_send(name, *args, **kwargs)
35
38
 
36
- next if @previous_results[[name, arguments]].include?(result)
39
+ next if previous_results[[name, args, kwargs]].include?(result)
37
40
 
38
- @previous_results[[name, arguments]] << result
41
+ previous_results[[name, args, kwargs]] << result
39
42
  return result
40
43
  end
41
- raise RetryLimitExceeded
44
+
45
+ raise RetryLimitExceeded, "Retry limit exceeded for #{name}"
46
+ end
47
+
48
+ def respond_to_missing?(name, *args)
49
+ @generator.respond_to?(name, *args) || super
50
+ end
51
+
52
+ def previous_results
53
+ @previous_results ||= Hash.new { |hash, key| hash[key] = Set.new }
42
54
  end
43
55
  end
44
56
  end
@@ -7,7 +7,7 @@ module FFaker
7
7
  extend self
8
8
 
9
9
  # https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/World_Manufacturer_Identifier_(WMI)
10
- VALID_WMI_REGIONS = [*'A'..'C', *'J'..'Z', *'1'..'9'].freeze
10
+ VALID_WMI_REGIONS = [*'A'..'C', *'J'..'N', 'P', *'R'..'Z', *'1'..'9'].freeze
11
11
 
12
12
  VALID_YEAR_CHARS = %w[
13
13
  5 6 7 8 9 A B C D E F G H J K L M N P R S T V W X Y 1 2 3 4 5 6 7 8 9
@@ -53,7 +53,7 @@ module FFaker
53
53
 
54
54
  # Calculate the Check Digit
55
55
  weighted_sum = generated_vin.chars.each_with_index.sum do |char, idx|
56
- (TRANSLITERATION_VALUES[char.to_sym] || char).to_i * POSITION_WEIGHTS[idx]
56
+ (TRANSLITERATION_VALUES[char] || char).to_i * POSITION_WEIGHTS[idx]
57
57
  end
58
58
 
59
59
  check_digit = weighted_sum % 11
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FFaker
4
- VERSION = '2.21.0'
4
+ VERSION = '2.23.0'
5
5
  end
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,209 +16,78 @@ 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 :AnimalBR, 'ffaker/animal_br'
61
- autoload :AnimalCN, 'ffaker/animal_cn'
62
- autoload :AnimalES, 'ffaker/animal_es'
63
- autoload :AnimalPL, 'ffaker/animal_pl'
64
- autoload :AnimalUS, 'ffaker/animal_us'
65
- autoload :Avatar, 'ffaker/avatar'
66
- autoload :AWS, 'ffaker/aws'
67
- autoload :BaconIpsum, 'ffaker/bacon_ipsum'
68
- autoload :Bank, 'ffaker/bank'
69
- autoload :Book, 'ffaker/book'
70
- autoload :Boolean, 'ffaker/boolean'
71
- autoload :CheesyLingo, 'ffaker/cheesy_lingo'
72
- autoload :Code, 'ffaker/code'
73
- autoload :Color, 'ffaker/color'
74
- autoload :ColorPL, 'ffaker/color_pl'
75
- autoload :ColorUA, 'ffaker/color_ua'
76
- autoload :Company, 'ffaker/company'
77
- autoload :CompanyCN, 'ffaker/company_cn'
78
- autoload :CompanyFR, 'ffaker/company_fr'
79
- autoload :CompanyIT, 'ffaker/company_it'
80
- autoload :CompanyJA, 'ffaker/company_ja'
81
- autoload :CompanySE, 'ffaker/company_se'
82
- autoload :Conference, 'ffaker/conference'
83
- autoload :CoursesFR, 'ffaker/courses_fr'
84
- autoload :Currency, 'ffaker/currency'
85
- autoload :DizzleIpsum, 'ffaker/dizzle_ipsum'
86
- autoload :Education, 'ffaker/education'
87
- autoload :EducationCN, 'ffaker/education_cn'
88
- autoload :Filesystem, 'ffaker/filesystem'
89
- autoload :Food, 'ffaker/food'
90
- autoload :FoodPL, 'ffaker/food_pl'
91
- autoload :FreedomIpsum, 'ffaker/freedom_ipsum'
92
- autoload :Game, 'ffaker/game'
93
- autoload :Gender, 'ffaker/gender'
94
- autoload :GenderBR, 'ffaker/gender_br'
95
- autoload :GenderCN, 'ffaker/gender_cn'
96
- autoload :GenderID, 'ffaker/gender_id'
97
- autoload :GenderIT, 'ffaker/gender_it'
98
- autoload :GenderJA, 'ffaker/gender_ja'
99
- autoload :GenderJP, 'ffaker/gender_jp'
100
- autoload :GenderKR, 'ffaker/gender_kr'
101
- autoload :GenderPL, 'ffaker/gender_pl'
102
- autoload :GenderRU, 'ffaker/gender_ru'
103
- autoload :Geolocation, 'ffaker/geolocation'
104
- autoload :Guid, 'ffaker/guid'
105
- autoload :HealthcareIpsum, 'ffaker/healthcare_ipsum'
106
- autoload :HealthcareRU, 'ffaker/healthcare_ru'
107
- autoload :HipsterIpsum, 'ffaker/hipster_ipsum'
108
- autoload :HTMLIpsum, 'ffaker/html_ipsum'
109
- autoload :Identification, 'ffaker/identification'
110
- autoload :IdentificationBR, 'ffaker/identification_br'
111
- autoload :IdentificationES, 'ffaker/identification_es'
112
- autoload :IdentificationESCL, 'ffaker/identification_es_cl'
113
- autoload :IdentificationESCO, 'ffaker/identification_es_co'
114
- autoload :IdentificationIN, 'ffaker/identification_in'
115
- autoload :IdentificationIT, 'ffaker/identification_it'
116
- autoload :IdentificationKr, 'ffaker/identification_kr'
117
- autoload :IdentificationMX, 'ffaker/identification_mx'
118
- autoload :IdentificationPL, 'ffaker/identification_pl'
119
- autoload :IdentificationTW, 'ffaker/identification_tw'
120
- autoload :Image, 'ffaker/image'
121
- autoload :Internet, 'ffaker/internet'
122
- autoload :InternetSE, 'ffaker/internet_se'
123
- autoload :Job, 'ffaker/job'
124
- autoload :JobBR, 'ffaker/job_br'
125
- autoload :JobCN, 'ffaker/job_cn'
126
- autoload :JobFR, 'ffaker/job_fr'
127
- autoload :JobIT, 'ffaker/job_it'
128
- autoload :JobJA, 'ffaker/job_ja'
129
- autoload :JobKR, 'ffaker/job_kr'
130
- autoload :JobVN, 'ffaker/job_vn'
131
- autoload :Locale, 'ffaker/locale'
132
- autoload :Lorem, 'ffaker/lorem'
133
- autoload :LoremAR, 'ffaker/lorem_ar'
134
- autoload :LoremBR, 'ffaker/lorem_br'
135
- autoload :LoremCN, 'ffaker/lorem_cn'
136
- autoload :LoremFR, 'ffaker/lorem_fr'
137
- autoload :LoremIE, 'ffaker/lorem_ie'
138
- autoload :LoremIT, 'ffaker/lorem_it'
139
- autoload :LoremJA, 'ffaker/lorem_ja'
140
- autoload :LoremKR, 'ffaker/lorem_kr'
141
- autoload :LoremPL, 'ffaker/lorem_pl'
142
- autoload :LoremRU, 'ffaker/lorem_ru'
143
- autoload :LoremUA, 'ffaker/lorem_ua'
144
- autoload :Movie, 'ffaker/movie'
145
- autoload :Music, 'ffaker/music'
146
- autoload :Name, 'ffaker/name'
147
- autoload :NameAR, 'ffaker/name_ar'
148
- autoload :NameBR, 'ffaker/name_br'
149
- autoload :NameCN, 'ffaker/name_cn'
150
- autoload :NameCS, 'ffaker/name_cs'
151
- autoload :NameDA, 'ffaker/name_da'
152
- autoload :NameDE, 'ffaker/name_de'
153
- autoload :NameES, 'ffaker/name_es'
154
- autoload :NameFR, 'ffaker/name_fr'
155
- autoload :NameGA, 'ffaker/name_ga'
156
- autoload :NameGR, 'ffaker/name_gr'
157
- autoload :NameID, 'ffaker/name_id'
158
- autoload :NameIN, 'ffaker/name_in'
159
- autoload :NameIT, 'ffaker/name_it'
160
- autoload :NameJA, 'ffaker/name_ja'
161
- autoload :NameKH, 'ffaker/name_kh'
162
- autoload :NameKR, 'ffaker/name_kr'
163
- autoload :NameMX, 'ffaker/name_mx'
164
- autoload :NameNB, 'ffaker/name_nb'
165
- autoload :NameNL, 'ffaker/name_nl'
166
- autoload :NamePH, 'ffaker/name_ph'
167
- autoload :NamePL, 'ffaker/name_pl'
168
- autoload :NameRU, 'ffaker/name_ru'
169
- autoload :NameSE, 'ffaker/name_se'
170
- autoload :NameSN, 'ffaker/name_sn'
171
- autoload :NameTH, 'ffaker/name_th'
172
- autoload :NameTW, 'ffaker/name_tw'
173
- autoload :NameTHEN, 'ffaker/name_th_en'
174
- autoload :NameUA, 'ffaker/name_ua'
175
- autoload :NameVN, 'ffaker/name_vn'
176
- autoload :NatoAlphabet, 'ffaker/nato_alphabet'
177
- autoload :Number, 'ffaker/number'
178
- autoload :PhoneNumber, 'ffaker/phone_number'
179
- autoload :PhoneNumberAU, 'ffaker/phone_number_au'
180
- autoload :PhoneNumberBR, 'ffaker/phone_number_br'
181
- autoload :PhoneNumberCH, 'ffaker/phone_number_ch'
182
- autoload :PhoneNumberCU, 'ffaker/phone_number_cu'
183
- autoload :PhoneNumberDA, 'ffaker/phone_number_da'
184
- autoload :PhoneNumberDE, 'ffaker/phone_number_de'
185
- autoload :PhoneNumberFR, 'ffaker/phone_number_fr'
186
- autoload :PhoneNumberID, 'ffaker/phone_number_id'
187
- autoload :PhoneNumberIT, 'ffaker/phone_number_it'
188
- autoload :PhoneNumberJA, 'ffaker/phone_number_ja'
189
- autoload :PhoneNumberKR, 'ffaker/phone_number_kr'
190
- autoload :PhoneNumberMX, 'ffaker/phone_number_mx'
191
- autoload :PhoneNumberNL, 'ffaker/phone_number_nl'
192
- autoload :PhoneNumberPL, 'ffaker/phone_number_pl'
193
- autoload :PhoneNumberSE, 'ffaker/phone_number_se'
194
- autoload :PhoneNumberSG, 'ffaker/phone_number_sg'
195
- autoload :PhoneNumberSN, 'ffaker/phone_number_sn'
196
- autoload :PhoneNumberTW, 'ffaker/phone_number_tw'
197
- autoload :PhoneNumberUA, 'ffaker/phone_number_ua'
198
- autoload :PhoneNumberRU, 'ffaker/phone_number_ru'
199
- autoload :Product, 'ffaker/product'
200
- autoload :SemVer, 'ffaker/sem_ver'
201
- autoload :Skill, 'ffaker/skill'
202
- autoload :Sport, 'ffaker/sport'
203
- autoload :SportPL, 'ffaker/sport_pl'
204
- autoload :SportUS, 'ffaker/sport_us'
205
- autoload :SportRU, 'ffaker/sport_ru'
206
- autoload :SSN, 'ffaker/ssn'
207
- autoload :SSNMX, 'ffaker/ssn_mx'
208
- autoload :SSNSE, 'ffaker/ssn_se'
209
- autoload :String, 'ffaker/string'
210
- autoload :Time, 'ffaker/time'
211
- autoload :Tweet, 'ffaker/tweet'
212
- autoload :Unit, 'ffaker/unit'
213
- autoload :UnitEnglish, 'ffaker/unit_english'
214
- autoload :UnitMetric, 'ffaker/unit_metric'
215
- autoload :VERSION, 'version'
216
- autoload :Vehicle, 'ffaker/vehicle'
217
- autoload :Venue, 'ffaker/venue'
218
- 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
+ 'vn' => 'VN'
80
+ }
81
+
82
+ directory = "#{__dir__}/ffaker"
83
+ Dir["#{directory}/*.rb"].each do |file_name|
84
+ relative_file_path = Pathname.new(file_name).relative_path_from(directory).to_s.chomp('.rb')
85
+ ## Don't consider files in sub-directories
86
+ constant_name = relative_file_path.split('_').map do |part|
87
+ autoload_acronyms.fetch(part) { part.capitalize }
88
+ end.join
89
+ autoload constant_name, file_name
90
+ end
219
91
 
220
92
  # Random Number Generator (RNG) used with ModuleUtils#fetch, #shuffle, #rand
221
93
  # in order to provide deterministic repeatability.
data/scripts/reference.rb CHANGED
@@ -11,8 +11,8 @@ ICONS = {
11
11
  warning: '❗'
12
12
  }.freeze
13
13
 
14
- UTILS_MODULES = %i[ArrayUtils ModuleUtils RandomUtils Random]
15
- UTILS_METHODS = %i[k underscore fetch_sample rand shuffle unique luhn_check]
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
16
 
17
17
  # Get a list of sections
18
18
  def faker_modules
@@ -36,12 +36,14 @@ end
36
36
  # Catch deprecation warnings.
37
37
  # This `#warn` overrides Kernel#warn
38
38
  def warn(msg)
39
- $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)
40
42
  end
41
43
 
42
44
  def catch_warnings
43
- $warnings = []
44
- [yield, $warnings]
45
+ Kernel.instance_variable_set(:@ffaker_warnings, [])
46
+ [yield, Kernel.instance_variable_get(:@ffaker_warnings)]
45
47
  end
46
48
 
47
49
  def escape(str)
@@ -70,11 +72,7 @@ sections = faker_modules.map do |mod|
70
72
  examples, warnings = catch_warnings do
71
73
  Array.new(3) { mod.unique.send meth }
72
74
  end
73
- right = if warnings.any?
74
- "#{ICONS[:warning]} *#{warnings.first}*"
75
- else
76
- (escape examples.join(', ')).to_s
77
- end
75
+ right = warnings.any? ? "#{ICONS[:warning]} *#{warnings.first}*" : (escape examples.join(', ')).to_s
78
76
  rescue StandardError => e
79
77
  right = "#{ICONS[:error]} #{e.class}: #{e.message}"
80
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])
@@ -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,
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
@@ -0,0 +1,35 @@
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
+ checksum = (
28
+ (7 * (routing_number[0].to_i + routing_number[3].to_i + routing_number[6].to_i)) +
29
+ (3 * (routing_number[1].to_i + routing_number[4].to_i + routing_number[7].to_i)) +
30
+ (9 * (routing_number[2].to_i + routing_number[5].to_i + routing_number[8].to_i))
31
+ )
32
+
33
+ assert_equal(0, checksum % 10, 'The routing number\'s checksum is not a multiple of ten')
34
+ end
35
+ end