faker 2.19.0 → 3.2.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 (185) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +346 -7
  3. data/History.md +1 -1
  4. data/README.md +198 -104
  5. data/lib/faker/blockchain/aeternity.rb +1 -1
  6. data/lib/faker/blockchain/ethereum.rb +1 -1
  7. data/lib/faker/blockchain/tezos.rb +1 -1
  8. data/lib/faker/books/dune.rb +2 -10
  9. data/lib/faker/books/lovecraft.rb +7 -38
  10. data/lib/faker/books/the_kingkiller_chronicle.rb +61 -0
  11. data/lib/faker/default/address.rb +5 -25
  12. data/lib/faker/default/alphanumeric.rb +2 -8
  13. data/lib/faker/default/app.rb +1 -10
  14. data/lib/faker/default/avatar.rb +1 -12
  15. data/lib/faker/default/bank.rb +9 -17
  16. data/lib/faker/default/boolean.rb +1 -4
  17. data/lib/faker/default/chile_rut.rb +8 -14
  18. data/lib/faker/default/code.rb +11 -24
  19. data/lib/faker/default/color.rb +77 -6
  20. data/lib/faker/default/commerce.rb +3 -17
  21. data/lib/faker/default/company.rb +23 -20
  22. data/lib/faker/default/crypto_coin.rb +3 -15
  23. data/lib/faker/default/date.rb +5 -38
  24. data/lib/faker/default/demographic.rb +1 -5
  25. data/lib/faker/default/driving_licence.rb +1 -11
  26. data/lib/faker/default/drone.rb +1 -1
  27. data/lib/faker/default/file.rb +5 -24
  28. data/lib/faker/default/finance.rb +17 -7
  29. data/lib/faker/default/food.rb +14 -1
  30. data/lib/faker/default/hipster.rb +6 -45
  31. data/lib/faker/default/id_number.rb +108 -11
  32. data/lib/faker/default/internet.rb +168 -129
  33. data/lib/faker/default/invoice.rb +4 -17
  34. data/lib/faker/default/json.rb +2 -20
  35. data/lib/faker/default/lorem.rb +20 -76
  36. data/lib/faker/default/lorem_flickr.rb +4 -32
  37. data/lib/faker/default/markdown.rb +6 -11
  38. data/lib/faker/default/marketing.rb +1 -1
  39. data/lib/faker/default/measurement.rb +16 -48
  40. data/lib/faker/default/name.rb +1 -5
  41. data/lib/faker/default/nation.rb +0 -3
  42. data/lib/faker/default/nhs.rb +2 -6
  43. data/lib/faker/default/number.rb +10 -55
  44. data/lib/faker/default/omniauth.rb +51 -41
  45. data/lib/faker/default/phone_number.rb +2 -6
  46. data/lib/faker/default/placeholdit.rb +1 -12
  47. data/lib/faker/default/relationship.rb +1 -5
  48. data/lib/faker/default/religion.rb +6 -0
  49. data/lib/faker/default/source.rb +3 -16
  50. data/lib/faker/default/string.rb +1 -8
  51. data/lib/faker/default/stripe.rb +4 -20
  52. data/lib/faker/default/time.rb +4 -34
  53. data/lib/faker/default/twitter.rb +7 -23
  54. data/lib/faker/default/types.rb +5 -27
  55. data/lib/faker/default/vehicle.rb +29 -51
  56. data/lib/faker/default/vulnerability_identifier.rb +23 -0
  57. data/lib/faker/default/world_cup.rb +2 -11
  58. data/lib/faker/games/clash_of_clans.rb +1 -1
  59. data/lib/faker/games/dnd.rb +49 -7
  60. data/lib/faker/games/dota.rb +1 -5
  61. data/lib/faker/games/minecraft.rb +1 -1
  62. data/lib/faker/games/myst.rb +1 -1
  63. data/lib/faker/games/tarkov.rb +205 -0
  64. data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
  65. data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +48 -0
  66. data/lib/faker/japanese_media/kamen_rider.rb +102 -0
  67. data/lib/faker/japanese_media/one_piece.rb +1 -1
  68. data/lib/faker/movies/avatar.rb +49 -0
  69. data/lib/faker/movies/hackers.rb +48 -0
  70. data/lib/faker/movies/star_wars.rb +1 -5
  71. data/lib/faker/movies/tron.rb +161 -0
  72. data/lib/faker/quotes/quote.rb +13 -0
  73. data/lib/faker/religion/bible.rb +50 -0
  74. data/lib/faker/sports/chess.rb +90 -0
  75. data/lib/faker/sports/mountaineering.rb +22 -0
  76. data/lib/faker/sports/sport.rb +116 -0
  77. data/lib/faker/travel/airport.rb +43 -0
  78. data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
  79. data/lib/faker/tv_shows/michael_scott.rb +0 -3
  80. data/lib/faker/tv_shows/spongebob.rb +50 -0
  81. data/lib/faker/version.rb +1 -1
  82. data/lib/faker.rb +15 -64
  83. data/lib/helpers/base58.rb +1 -1
  84. data/lib/helpers/unique_generator.rb +13 -11
  85. data/lib/locales/ar.yml +6 -1
  86. data/lib/locales/bg.yml +1 -1
  87. data/lib/locales/da-DK.yml +1 -1
  88. data/lib/locales/de-AT.yml +3 -4
  89. data/lib/locales/de-CH.yml +1 -1
  90. data/lib/locales/de.yml +1 -1
  91. data/lib/locales/en/address.yml +2 -3
  92. data/lib/locales/en/airport.yml +381 -0
  93. data/lib/locales/en/australia.yml +3 -4
  94. data/lib/locales/en/avatar.yml +31 -0
  95. data/lib/locales/en/bible.yml +90 -0
  96. data/lib/locales/en/brooklyn_nine_nine.yml +35 -0
  97. data/lib/locales/en/cat.yml +1 -1
  98. data/lib/locales/en/chess.yml +103 -0
  99. data/lib/locales/en/coffee.yml +1 -1
  100. data/lib/locales/en/company.yml +1 -0
  101. data/lib/locales/en/computer.yml +23 -4
  102. data/lib/locales/en/cowboy_bebop.yml +163 -0
  103. data/lib/locales/en/dnd.yml +186 -1
  104. data/lib/locales/en/dota.yml +113 -0
  105. data/lib/locales/en/file.yml +9 -1
  106. data/lib/locales/en/finance.yml +3 -1
  107. data/lib/locales/en/fma_brotherhood.yml +78 -0
  108. data/lib/locales/en/food.yml +12 -0
  109. data/lib/locales/en/game.yml +11 -0
  110. data/lib/locales/en/hackers.yml +53 -0
  111. data/lib/locales/en/heroes.yml +2 -2
  112. data/lib/locales/en/internet.yml +140 -3
  113. data/lib/locales/en/kamen_rider.yml +452 -0
  114. data/lib/locales/en/mitch_hedberg.yml +46 -0
  115. data/lib/locales/en/mountain.yml +14 -1
  116. data/lib/locales/en/mountaineering.yml +14 -0
  117. data/lib/locales/en/movie.yml +2 -1
  118. data/lib/locales/en/naruto.yml +2 -3
  119. data/lib/locales/en/one_piece.yml +1 -1
  120. data/lib/locales/en/opera.yml +1 -1
  121. data/lib/locales/en/overwatch.yml +5 -7
  122. data/lib/locales/en/source.yml +5 -0
  123. data/lib/locales/en/spongebob.yml +489 -0
  124. data/lib/locales/en/sport.yml +130 -0
  125. data/lib/locales/en/star_wars.yml +1 -1
  126. data/lib/locales/en/stranger_thing.yml +1 -1
  127. data/lib/locales/en/super_smash_bros.yml +2 -0
  128. data/lib/locales/en/tarkov.yml +593 -0
  129. data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
  130. data/lib/locales/en/tron.yml +227 -0
  131. data/lib/locales/en/vehicle.yml +2809 -75
  132. data/lib/locales/en-AU.yml +2 -2
  133. data/lib/locales/en-CA.yml +2 -1
  134. data/lib/locales/en-GB.yml +2 -1
  135. data/lib/locales/en-MS.yml +1 -0
  136. data/lib/locales/en-NG.yml +1 -0
  137. data/lib/locales/en-NZ.yml +1 -0
  138. data/lib/locales/en-PAK.yml +1 -0
  139. data/lib/locales/en-SG.yml +1 -0
  140. data/lib/locales/en-UG.yml +1 -0
  141. data/lib/locales/en-US.yml +2 -2
  142. data/lib/locales/en-ZA.yml +1 -1
  143. data/lib/locales/en-au-ocker.yml +2 -0
  144. data/lib/locales/es-AR.yml +3 -2
  145. data/lib/locales/es-MX.yml +1 -1
  146. data/lib/locales/es.yml +2 -2
  147. data/lib/locales/fi-FI.yml +3 -1
  148. data/lib/locales/fr/address.yml +0 -1
  149. data/lib/locales/fr/adjective.yml +266 -0
  150. data/lib/locales/fr/ancient.yml +141 -0
  151. data/lib/locales/fr-CA.yml +1 -1
  152. data/lib/locales/fr-CH.yml +1 -1
  153. data/lib/locales/hy.yml +2 -1
  154. data/lib/locales/it.yml +1 -0
  155. data/lib/locales/ja/address.yml +258 -4169
  156. data/lib/locales/ja/adjective.yml +148 -0
  157. data/lib/locales/ja/dog.yml +1 -0
  158. data/lib/locales/ja/emotion.yml +51 -0
  159. data/lib/locales/ja/lorem.yml +2 -2
  160. data/lib/locales/ja/naruto.yml +230 -0
  161. data/lib/locales/ja/relationship.yml +10 -0
  162. data/lib/locales/ja/super_mario.yml +1 -1
  163. data/lib/locales/ja/super_smash_bros.yml +8 -0
  164. data/lib/locales/ko.yml +1 -0
  165. data/lib/locales/lt.yml +34 -0
  166. data/lib/locales/lv.yml +1 -1
  167. data/lib/locales/mi-NZ.yml +283 -0
  168. data/lib/locales/nb-NO.yml +1 -0
  169. data/lib/locales/nl.yml +1 -0
  170. data/lib/locales/pl.yml +2 -2
  171. data/lib/locales/pt-BR.yml +5 -0
  172. data/lib/locales/pt.yml +1 -1
  173. data/lib/locales/ru.yml +1 -0
  174. data/lib/locales/sk.yml +1 -0
  175. data/lib/locales/sv.yml +1 -0
  176. data/lib/locales/th.yml +76 -76
  177. data/lib/locales/tr.yml +1 -0
  178. data/lib/locales/uk.yml +1 -0
  179. data/lib/locales/vi.yml +1 -0
  180. data/lib/locales/zh-CN.yml +1 -0
  181. data/lib/locales/zh-TW.yml +1 -0
  182. metadata +96 -33
  183. data/lib/faker/default/fillmurray.rb +0 -45
  184. data/lib/faker/default/lorem_pixel.rb +0 -70
  185. /data/lib/faker/default/{faker_adjective.rb → adjective.rb} +0 -0
@@ -146,11 +146,7 @@ module Faker
146
146
  # Faker::IDNumber.brazilian_citizen_number(formatted: true) #=> "535.405.422-21"
147
147
  #
148
148
  # @faker.version 1.9.2
149
- def brazilian_citizen_number(legacy_formatted = NOT_GIVEN, formatted: false)
150
- warn_for_deprecated_arguments do |keywords|
151
- keywords << :formatted if legacy_formatted != NOT_GIVEN
152
- end
153
-
149
+ def brazilian_citizen_number(formatted: false)
154
150
  digits = Faker::Number.leading_zero_number(digits: 9) until digits&.match(/(\d)((?!\1)\d)+/)
155
151
  first_digit = brazilian_citizen_number_checksum_digit(digits)
156
152
  second_digit = brazilian_citizen_number_checksum_digit(digits + first_digit)
@@ -171,11 +167,7 @@ module Faker
171
167
  # Faker::IDNumber.brazilian_id(formatted: true) #=> "49.305.402-9"
172
168
  #
173
169
  # @faker.version 2.1.2
174
- def brazilian_id(legacy_formatted = NOT_GIVEN, formatted: false)
175
- warn_for_deprecated_arguments do |keywords|
176
- keywords << :formatted if legacy_formatted != NOT_GIVEN
177
- end
178
-
170
+ def brazilian_id(formatted: false)
179
171
  digits = Faker::Number.between(to: BRAZILIAN_ID_FROM, from: BRAZILIAN_ID_TO).to_s
180
172
  check_digit = brazilian_id_checksum_digit(digits)
181
173
  number = [digits, check_digit].join
@@ -219,6 +211,72 @@ module Faker
219
211
  "#{prefix}#{digits}#{checksum_digit}"
220
212
  end
221
213
 
214
+ ##
215
+ # Produces a random Danish ID Number (CPR number).
216
+ # CPR number is 10 digits. Digit 1-6 is the birthdate (format "DDMMYY").
217
+ # Digit 7-10 is a sequence number.
218
+ # Digit 7 digit is a control digit that determines the century of birth.
219
+ # Digit 10 reveals the gender: # even is female, odd is male.
220
+ #
221
+ # @param formatted [Boolean] Specifies if the number is formatted with dividers.
222
+ # @param birthday [Date] Specifies the birthday for the id number.
223
+ # @param gender [Symbol] Specifies the gender for the id number. Must be one :male or :female if present.
224
+ # @return [String]
225
+ #
226
+ # @example
227
+ # Faker::IDNumber.danish_id_number #=> "0503909980"
228
+ # Faker::IDNumber.danish_id_number(formatted: true) #=> "050390-9980"
229
+ # Faker::IDNumber.danish_id_number(birthday: Date.new(1990, 3, 5)) #=> "0503909980"
230
+ # Faker::IDNumber.danish_id_number(gender: :female) #=> "0503909980"
231
+ #
232
+ # @faker.version next
233
+ def danish_id_number(formatted: false, birthday: Faker::Date.birthday, gender: nil)
234
+ valid_control_digits = danish_control_digits(birthday)
235
+ control_digit = sample(valid_control_digits)
236
+ digits = (0..9).to_a
237
+ gender = gender.to_sym if gender.respond_to?(:to_sym)
238
+ gender_digit = case gender
239
+ when nil
240
+ sample(digits)
241
+ when :male
242
+ sample(digits.select(&:odd?))
243
+ when :female
244
+ sample(digits.select(&:even?))
245
+ else
246
+ raise ArgumentError, "Invalid gender #{gender}. Must be one of male, female, or be omitted."
247
+ end
248
+
249
+ [
250
+ birthday.strftime('%d%m%y'),
251
+ formatted ? '-' : '',
252
+ control_digit,
253
+ Faker::Number.number(digits: 2),
254
+ gender_digit
255
+ ].join
256
+ end
257
+
258
+ ##
259
+ # Produces a random French social security number (INSEE number).
260
+ #
261
+ # @return [String]
262
+ #
263
+ # @example
264
+ # Faker::IDNumber.french_insee_number #=> "53290236-H"
265
+ #
266
+ # @faker.version next
267
+ def french_insee_number
268
+ num = [
269
+ [1, 2].sample(random: Faker::Config.random), # gender
270
+ Faker::Number.between(from: 0, to: 99).to_s.rjust(2, '0'), # year of birth
271
+ Faker::Number.between(from: 1, to: 12).to_s.rjust(2, '0'), # month of birth
272
+ Faker::Number.number(digits: 5), # place of birth
273
+ Faker::Number.number(digits: 3) # order number
274
+ ].join
275
+ mod = num.to_i % 97
276
+ check = (97 - mod).to_s.rjust(2, '0')
277
+ "#{num}#{check}"
278
+ end
279
+
222
280
  private
223
281
 
224
282
  def croatian_id_checksum_digit(digits)
@@ -266,7 +324,7 @@ module Faker
266
324
  .with_index { |_, i| (i + 1).odd? }
267
325
 
268
326
  sum_of_odd_digits = odd_digits_without_last_character.map(&:to_i).reduce(:+)
269
- even_digits_times_two = (even_digits.join('').to_i * 2).to_s
327
+ even_digits_times_two = (even_digits.join.to_i * 2).to_s
270
328
  sum_of_even_digits = even_digits_times_two.chars.map(&:to_i).reduce(:+)
271
329
 
272
330
  total_sum = sum_of_odd_digits + sum_of_even_digits
@@ -305,6 +363,45 @@ module Faker
305
363
  digits.include?(subtraction) ? digits[subtraction] : subtraction.to_s
306
364
  end
307
365
 
366
+ def danish_control_digits(birthday)
367
+ year = birthday.year
368
+ century = year.to_s.slice(0, 2).to_i
369
+ year_digits = year.to_s.slice(2, 2).to_i
370
+ error_message = "Invalid birthday: #{birthday}. Danish CPR numbers are only distributed to persons born between 1858 and 2057."
371
+
372
+ case century
373
+ when 18
374
+ # If 5, 6, 7 or 8 and the year numbers are greater than or equal to 58, you were born in 18XX.
375
+ case year_digits
376
+ when 58..99
377
+ [5, 6, 7, 8]
378
+ else
379
+ raise ArgumentError, error_message
380
+ end
381
+ when 19
382
+ # If 0, 1, 2 or 3, you are always born in 19XX.
383
+ # If 4 or 9, you are born in 19XX if the year digits are greater than 36.
384
+
385
+ case year_digits
386
+ when 0..36
387
+ [0, 1, 2, 3]
388
+ else # 37..99
389
+ [0, 1, 2, 3, 4, 9]
390
+ end
391
+ else
392
+ # If 4, 5, 6, 7, 8 or 9 and the year digits are less than or equal to 36, you were born in 20XX.
393
+ # 5, 6, 7 and 8 are not distributed to persons, with year digits from and including 37 to and including 57.
394
+ case year_digits
395
+ when 0..36
396
+ [4, 5, 6, 7, 8, 9]
397
+ when 37..57
398
+ [5, 6, 7, 8]
399
+ else
400
+ raise ArgumentError, error_message
401
+ end
402
+ end
403
+ end
404
+
308
405
  def _translate(key)
309
406
  parse("id_number.#{key}")
310
407
  end
@@ -2,7 +2,21 @@
2
2
 
3
3
  module Faker
4
4
  class Internet < Base
5
+ # Private, Host, and Link-Local network address blocks as defined in https://en.wikipedia.org/wiki/IPv4#Special-use_addresses
6
+ PRIVATE_IPV4_ADDRESS_RANGES = [
7
+ [10..10, 0..255, 0..255, 1..255], # 10.0.0.0/8 - Used for local communications within a private network
8
+ [100..100, 64..127, 0..255, 1..255], # 100.64.0.0/10 - Shared address space for communications between an ISP and its subscribers
9
+ [127..127, 0..255, 0..255, 1..255], # 127.0.0.0/8 - Used for loopback addresses to the local host
10
+ [169..169, 254..254, 0..255, 1..255], # 169.254.0.0/16 - Used for link-local addresses between two hosts on a single link when
11
+ [172..172, 16..31, 0..255, 1..255], # 172.16.0.0/12 - Used for local communications within a private network
12
+ [192..192, 0..0, 0..0, 1..255], # 192.0.0.0/24 - IETF Protocol Assignments
13
+ [192..192, 168..168, 0..255, 1..255], # 192.168.0.0/16 - Used for local communications within a private network
14
+ [198..198, 18..19, 0..255, 1..255] # 198.18.0.0/15 - Used for benchmark testing of inter-network communications between subnets
15
+ ].each(&:freeze).freeze
16
+
5
17
  class << self
18
+ extend Gem::Deprecate
19
+
6
20
  ##
7
21
  # Returns the email address
8
22
  #
@@ -13,16 +27,12 @@ module Faker
13
27
  # @param domain [String]
14
28
  #
15
29
  # @example
16
- # Faker::Internet.email #=> "samsmith@faker.com"
17
- # Faker::Internet.email(name: 'smith') #=> "smith@faker.com"
18
- # Faker::Internet.email(name: 'sam smith', separators: ['-']) #=> "sam-smith@faker.com"
19
- # Faker::Internet.email(name: 'sam smith', separators: ['-'], domain: 'gmail') #=> "sam-smith@gmail.com"
20
- def email(legacy_name = NOT_GIVEN, legacy_separators = NOT_GIVEN, name: nil, separators: nil, domain: nil)
21
- warn_for_deprecated_arguments do |keywords|
22
- keywords << :name if legacy_name != NOT_GIVEN
23
- keywords << :separators if legacy_separators != NOT_GIVEN
24
- end
25
-
30
+ # Faker::Internet.email #=> "renee@zieme.test"
31
+ # Faker::Internet.email(name: 'smith') #=> "smith@bergnaum.test"
32
+ # Faker::Internet.email(name: 'sam smith', separators: ['-']) #=> "smith-sam@tromp.example"
33
+ # Faker::Internet.email(name: 'sam smith', separators: ['-'], domain: 'test') #=> "sam-smith@test.example"
34
+ # Faker::Internet.email(domain: 'gmail.com') #=> "foo@gmail.com"
35
+ def email(name: nil, separators: nil, domain: nil)
26
36
  local_part = if separators
27
37
  username(specifier: name, separators: separators)
28
38
  else
@@ -30,11 +40,18 @@ module Faker
30
40
  end
31
41
 
32
42
  sanitized_local_part = sanitize_email_local_part(local_part)
33
- construct_email(sanitized_local_part, domain_name(domain: domain))
43
+
44
+ generate_domain = if domain.nil?
45
+ domain_name
46
+ else
47
+ domain_name(domain: domain)
48
+ end
49
+
50
+ construct_email(sanitized_local_part, generate_domain)
34
51
  end
35
52
 
36
53
  ##
37
- # Returns the email address with doamin either gmail.com, yahoo.com or hotmail.com
54
+ # Returns the email address with domain either gmail.com, yahoo.com or hotmail.com
38
55
  #
39
56
  # @return [String]
40
57
  #
@@ -43,16 +60,13 @@ module Faker
43
60
  # @example
44
61
  # Faker::Internet.free_email #=> "samsmith@gmail.com"
45
62
  # Faker::Internet.free_email(name: 'smith') #=> "smith@yahoo.com"
46
- def free_email(legacy_name = NOT_GIVEN, name: nil)
47
- warn_for_deprecated_arguments do |keywords|
48
- keywords << :name if legacy_name != NOT_GIVEN
49
- end
50
-
63
+ def free_email(name: nil)
51
64
  construct_email(
52
65
  sanitize_email_local_part(username(specifier: name)),
53
66
  fetch('internet.free_email')
54
67
  )
55
68
  end
69
+ deprecate :free_email, :email, 2023, 10
56
70
 
57
71
  ##
58
72
  # Returns the email address with fixed domain name as 'example'
@@ -64,36 +78,28 @@ module Faker
64
78
  # @example
65
79
  # Faker::Internet.safe_email #=> "samsmith@example.com"
66
80
  # Faker::Internet.safe_email(name: 'smith') #=> "smith@example.net"
67
- def safe_email(legacy_name = NOT_GIVEN, name: nil)
68
- warn_for_deprecated_arguments do |keywords|
69
- keywords << :name if legacy_name != NOT_GIVEN
70
- end
71
-
81
+ def safe_email(name: nil)
72
82
  construct_email(
73
83
  sanitize_email_local_part(username(specifier: name)),
74
84
  "example.#{sample(%w[org com net])}"
75
85
  )
76
86
  end
87
+ deprecate :safe_email, :email, 2023, 10
77
88
 
78
89
  ##
79
90
  # Returns the username
80
91
  #
81
92
  # @return [String]
82
93
  #
83
- # @param specifier [Integer, Range] When int value passed it returns the username longer than specifier. Max value can be 10^6
84
- # @param separator [Array]
94
+ # @param specifier [Integer, Range, String] When int value passed it returns the username longer than specifier. Max value can be 10^6
95
+ # @param separators [Array]
85
96
  #
86
- # @wxample
97
+ # @example
87
98
  # Faker::Internet.username(specifier: 10) #=> "lulu.goodwin"
88
99
  # Faker::Internet.username(specifier: 5..10) #=> "morris"
89
100
  # Faker::Internet.username(specifier: 5..10) #=> "berryberry"
90
101
  # Faker::Internet.username(specifier: 20, separators: ['-']) #=> "nikki_sawaynnikki_saway"
91
- def username(legacy_specifier = NOT_GIVEN, legacy_separators = NOT_GIVEN, specifier: nil, separators: %w[. _])
92
- warn_for_deprecated_arguments do |keywords|
93
- keywords << :specifier if legacy_specifier != NOT_GIVEN
94
- keywords << :separators if legacy_separators != NOT_GIVEN
95
- end
96
-
102
+ def username(specifier: nil, separators: %w[. _])
97
103
  with_locale(:en) do
98
104
  return shuffle(specifier.scan(/[[:word:]]+/)).join(sample(separators)).downcase if specifier.respond_to?(:scan)
99
105
 
@@ -130,8 +136,6 @@ module Faker
130
136
  end
131
137
  end
132
138
 
133
- # rubocop:disable Metrics/ParameterLists
134
-
135
139
  ##
136
140
  # Produces a randomized string of characters suitable for passwords
137
141
  #
@@ -154,43 +158,54 @@ module Faker
154
158
  # Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true, special_characters: true) #=> "*%NkOnJsH4"
155
159
  #
156
160
  # @faker.version 2.1.3
157
- def password(legacy_min_length = NOT_GIVEN, legacy_max_length = NOT_GIVEN, legacy_mix_case = NOT_GIVEN, legacy_special_characters = NOT_GIVEN, min_length: 8, max_length: 16, mix_case: true, special_characters: false)
158
- warn_for_deprecated_arguments do |keywords|
159
- keywords << :min_length if legacy_min_length != NOT_GIVEN
160
- keywords << :max_length if legacy_max_length != NOT_GIVEN
161
- keywords << :mix_case if legacy_mix_case != NOT_GIVEN
162
- keywords << :special_characters if legacy_special_characters != NOT_GIVEN
163
- end
164
-
165
- min_alpha = mix_case && min_length > 1 ? 2 : 0
166
- temp = Lorem.characters(number: min_length, min_alpha: min_alpha)
167
- diff_length = max_length - min_length
161
+ def password(min_length: 8, max_length: 16, mix_case: true, special_characters: false)
162
+ raise ArgumentError, 'max_length must be more than min_length' if max_length < min_length
168
163
 
169
- if diff_length.positive?
170
- diff_rand = rand(diff_length + 1)
171
- temp += Lorem.characters(number: diff_rand)
172
- end
164
+ character_types = []
165
+ required_min_length = 0
173
166
 
174
167
  if mix_case
175
- alpha_count = 0
176
- temp.chars.each_with_index do |char, index|
177
- if char =~ /[[:alpha:]]/
178
- temp[index] = char.upcase if alpha_count.even?
179
- alpha_count += 1
180
- end
181
- end
168
+ character_types << :mix_case
169
+ required_min_length += 2
182
170
  end
183
171
 
184
172
  if special_characters
185
- chars = %w[! @ # $ % ^ & *]
186
- rand(1..min_length).times do |i|
187
- temp[i] = chars[rand(chars.length)]
188
- end
173
+ character_types << :special_characters
174
+ required_min_length += 1
175
+ end
176
+
177
+ raise ArgumentError, "min_length should be at least #{required_min_length} to enable #{character_types.join(', ')} configuration" if min_length < required_min_length
178
+
179
+ target_length = rand(min_length..max_length)
180
+
181
+ password = []
182
+ character_bag = []
183
+
184
+ # use lower_chars by default and add upper_chars if mix_case
185
+ lower_chars = ('a'..'z').to_a
186
+ password << lower_chars[rand(lower_chars.count - 1)]
187
+ character_bag += lower_chars
188
+
189
+ digits = ('1'..'9').to_a
190
+ password << digits[rand(digits.count - 1)]
191
+ character_bag += digits
192
+
193
+ if character_types.include?(:mix_case)
194
+ upper_chars = ('A'..'Z').to_a
195
+ password << upper_chars[rand(upper_chars.count - 1)]
196
+ character_bag += upper_chars
197
+ end
198
+
199
+ if character_types.include?(:special_characters)
200
+ special_chars = %w[! @ # $ % ^ & *]
201
+ password << special_chars[rand(special_chars.count - 1)]
202
+ character_bag += special_chars
189
203
  end
190
204
 
191
- temp
205
+ password << character_bag[rand(character_bag.count - 1)] while password.length < target_length
206
+
207
+ shuffle(password).join
192
208
  end
193
- # rubocop:enable Metrics/ParameterLists
194
209
 
195
210
  ##
196
211
  # Returns the domain name
@@ -201,34 +216,36 @@ module Faker
201
216
  # @param domain [String]
202
217
  #
203
218
  # @example
204
- # Faker::Internet.domain_name #=> "test.net"
205
- # Faker::Internet.domain_name(subdomain: true) #=> "test.faker.io"
206
- # Faker::Internet.domain_name(subdomain: true, domain: 'example') #=> "faker.example.com"
207
- # Faker::Internet.domain_name(domain: 'faker') #=> "faker.org"
208
- def domain_name(legacy_subdomain = NOT_GIVEN, subdomain: false, domain: nil)
209
- warn_for_deprecated_arguments do |keywords|
210
- keywords << :subdomain if legacy_subdomain != NOT_GIVEN
211
- end
212
-
219
+ # Faker::Internet.domain_name #=> "altenwerth-gerhold.example"
220
+ # Faker::Internet.domain_name(subdomain: true) #=> "metz.mclaughlin-brekke.test"
221
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker') #=> "foo.faker.test"
222
+ # Faker::Internet.domain_name(domain: 'faker-ruby.org') #=> "faker-ruby.org"
223
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker-ruby.org') #=> "foo.faker-ruby.org"
224
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker.faker-ruby.org') #=> "faker.faker-ruby.org"
225
+ def domain_name(subdomain: false, domain: nil)
213
226
  with_locale(:en) do
214
227
  if domain
215
228
  domain
216
229
  .split('.')
217
230
  .map { |domain_part| Char.prepare(domain_part) }
218
231
  .tap do |domain_elements|
219
- domain_elements << domain_suffix if domain_elements.length < 2
220
- domain_elements.unshift(Char.prepare(domain_word)) if subdomain && domain_elements.length < 3
232
+ if domain_elements.length < 2
233
+ domain_elements << domain_suffix(safe: true)
234
+ end
235
+ if subdomain && domain_elements.length < 3
236
+ domain_elements.unshift(Char.prepare(domain_word))
237
+ end
221
238
  end.join('.')
222
239
  else
223
- [domain_word, domain_suffix].tap do |domain_elements|
224
- domain_elements.unshift(Char.prepare(domain_word)) if subdomain
240
+ [domain_word, domain_suffix(safe: true)].tap do |domain_elements|
241
+ if subdomain
242
+ domain_elements.unshift(Char.prepare(domain_word))
243
+ end
225
244
  end.join('.')
226
245
  end
227
246
  end
228
247
  end
229
248
 
230
- # rubocop:disable Style/AsciiComments
231
-
232
249
  ##
233
250
  # Fixes ä, ö, ü, ß characters in string passed with ae, oe, ue, ss resp.
234
251
  #
@@ -240,14 +257,9 @@ module Faker
240
257
  # Faker::Internet.fix_umlauts #=> ""
241
258
  # Faker::Internet.fix_umlauts(string: 'faker') #=> "faker"
242
259
  # Faker::Internet.fix_umlauts(string: 'faküer') #=> "fakueer"
243
- def fix_umlauts(legacy_string = NOT_GIVEN, string: '')
244
- warn_for_deprecated_arguments do |keywords|
245
- keywords << :string if legacy_string != NOT_GIVEN
246
- end
247
-
260
+ def fix_umlauts(string: '')
248
261
  Char.fix_umlauts(string)
249
262
  end
250
- # rubocop:enable Style/AsciiComments
251
263
 
252
264
  ##
253
265
  # Returns the domain word for internet
@@ -257,18 +269,24 @@ module Faker
257
269
  # @example
258
270
  # Faker::Internet.domain_word #=> "senger"
259
271
  def domain_word
260
- with_locale(:en) { Char.prepare(Company.name.split(' ').first) }
272
+ with_locale(:en) { Char.prepare(Company.name.split.first) }
261
273
  end
262
274
 
263
275
  ## Returns the domain suffix e.g. com, org, co, biz, info etc.
264
276
  #
265
277
  # @return [String]
266
278
  #
267
- # @wxample
268
- # Faker::Internet.domain_suffix #=> "com"
269
- # Faker::Internet.domain_suffix #=> "biz"
270
- def domain_suffix
271
- fetch('internet.domain_suffix')
279
+ # @example
280
+ # Faker::Internet.domain_suffix #=> "com"
281
+ # Faker::Internet.domain_suffix #=> "biz"
282
+ # Faker::Internet.domain_suffix(safe: true) #=> "example"
283
+ # Faker::Internet.domain_suffix(safe: true) #=> "test"
284
+ def domain_suffix(safe: nil)
285
+ if safe
286
+ fetch('internet.safe_domain_suffix')
287
+ else
288
+ fetch('internet.domain_suffix')
289
+ end
272
290
  end
273
291
 
274
292
  ##
@@ -281,11 +299,7 @@ module Faker
281
299
  # Faker::Internet.mac_address(prefix: 'a') #=> "0a:91:ce:24:89:3b"
282
300
  # Faker::Internet.mac_address(prefix: 'aa') #=> "aa:38:a0:3e:e8:41"
283
301
  # Faker::Internet.mac_address(prefix: 'aa:44') #=> "aa:44:30:88:6e:95"
284
- def mac_address(legacy_prefix = NOT_GIVEN, prefix: '')
285
- warn_for_deprecated_arguments do |keywords|
286
- keywords << :prefix if legacy_prefix != NOT_GIVEN
287
- end
288
-
302
+ def mac_address(prefix: '')
289
303
  prefix_digits = prefix.split(':').map { |d| d.to_i(16) }
290
304
  address_digits = Array.new((6 - prefix_digits.size)) { rand(256) }
291
305
  (prefix_digits + address_digits).map { |d| format('%02x', d) }.join(':')
@@ -311,12 +325,7 @@ module Faker
311
325
  # @example
312
326
  # Faker::Internet.private_ip_v4_address #=> "127.120.80.42"
313
327
  def private_ip_v4_address
314
- addr = nil
315
- loop do
316
- addr = ip_v4_address
317
- break if private_net_checker[addr]
318
- end
319
- addr
328
+ sample(PRIVATE_IPV4_ADDRESS_RANGES).map { |range| rand(range) }.join('.')
320
329
  end
321
330
 
322
331
  ##
@@ -387,7 +396,7 @@ module Faker
387
396
  end
388
397
 
389
398
  ##
390
- # Returns lambda function to check address passed is reserverd or not
399
+ # Returns lambda function to check address passed is reserved or not
391
400
  #
392
401
  # @return [Lambda]
393
402
  #
@@ -432,8 +441,6 @@ module Faker
432
441
  "#{ip_v6_address}/#{rand(1..127)}"
433
442
  end
434
443
 
435
- # rubocop:disable Metrics/ParameterLists
436
-
437
444
  ##
438
445
  # Returns URL
439
446
  #
@@ -444,20 +451,13 @@ module Faker
444
451
  # @param scheme [String]
445
452
  #
446
453
  # @example
447
- # Faker::Internet.url #=> "http://sipes-okon.com/hung.macejkovic"
454
+ # Faker::Internet.url #=> "http://treutel.test/demarcus"
448
455
  # Faker::Internet.url(host: 'faker') #=> "http://faker/shad"
449
- # Faker::Internet.url(host: 'faker', path: '/fake_test_path') #=> "http://faker/fake_test_path"
450
- # Faker::Internet.url(host: 'faker', path: '/fake_test_path', scheme: 'https') #=> "https://faker/fake_test_path"
451
- def url(legacy_host = NOT_GIVEN, legacy_path = NOT_GIVEN, legacy_scheme = NOT_GIVEN, host: domain_name, path: "/#{username}", scheme: 'http')
452
- warn_for_deprecated_arguments do |keywords|
453
- keywords << :host if legacy_host != NOT_GIVEN
454
- keywords << :path if legacy_path != NOT_GIVEN
455
- keywords << :scheme if legacy_scheme != NOT_GIVEN
456
- end
457
-
456
+ # Faker::Internet.url(host: 'faker', path: '/docs') #=> "http://faker/docs"
457
+ # Faker::Internet.url(host: 'faker', path: '/docs', scheme: 'https') #=> "https://faker/docs"
458
+ def url(host: domain_name, path: "/#{username}", scheme: 'http')
458
459
  "#{scheme}://#{host}#{path}"
459
460
  end
460
- # rubocop:enable Metrics/ParameterLists
461
461
 
462
462
  ##
463
463
  # Returns unique string in URL
@@ -472,14 +472,11 @@ module Faker
472
472
  # Faker::Internet.slug(words: 'test, faker') #=> "test-faker"
473
473
  # Faker::Internet.slug(words: 'test. faker') #=> "test-faker"
474
474
  # Faker::Internet.slug(words: 'test. faker', glue: '$') #=> "test$faker"
475
- def slug(legacy_words = NOT_GIVEN, legacy_glue = NOT_GIVEN, words: nil, glue: nil)
476
- warn_for_deprecated_arguments do |keywords|
477
- keywords << :words if legacy_words != NOT_GIVEN
478
- keywords << :glue if legacy_glue != NOT_GIVEN
479
- end
480
-
475
+ def slug(words: nil, glue: nil)
481
476
  glue ||= sample(%w[- _])
482
- (words || Faker::Lorem.words(number: 2).join(' ')).delete(',.').gsub(' ', glue).downcase
477
+ return words.delete(',.').gsub(' ', glue).downcase unless words.nil?
478
+
479
+ sample(translate('faker.internet.slug'), 2).join(glue)
483
480
  end
484
481
 
485
482
  ##
@@ -505,16 +502,29 @@ module Faker
505
502
  # Faker::Internet.user_agent(vendor: 'chrome') #=> "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
506
503
  # Faker::Internet.user_agent(vendor: 'safari') #=> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"
507
504
  # Faker::Internet.user_agent(vendor: 'faker') #=> "Mozilla/5.0 (Windows; U; Win 9x 4.90; SG; rv:1.9.2.4) Gecko/20101104 Netscape/9.1.0285"
508
- def user_agent(legacy_vendor = NOT_GIVEN, vendor: nil)
509
- warn_for_deprecated_arguments do |keywords|
510
- keywords << :vendor if legacy_vendor != NOT_GIVEN
511
- end
512
-
505
+ def user_agent(vendor: nil)
513
506
  agent_hash = translate('faker.internet.user_agent')
514
507
  agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
515
508
  sample(agents)
516
509
  end
517
510
 
511
+ ##
512
+ # Generate Web Crawler's user agents
513
+ #
514
+ # @return [String]
515
+ #
516
+ # @param vendor [String] Name of vendor, supported vendors are googlebot, bingbot, duckduckbot, baiduspider, yandexbot
517
+ #
518
+ # @example
519
+ # Faker::Internet.bot_user_agent #=> "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
520
+ # Faker::Internet.bot_user_agent(vendor: 'googlebot') #=> "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/99.0.4844.84 Safari/537.36"
521
+ # Faker::Internet.bot_user_agent(vendor: 'bingbot') #=> "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/86.0.4240.68 Safari/537.36 Edg/86.0.622.31"
522
+ def bot_user_agent(vendor: nil)
523
+ agent_hash = translate('faker.internet.bot_user_agent')
524
+ agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
525
+ sample(agents)
526
+ end
527
+
518
528
  ##
519
529
  # Generated universally unique identifier
520
530
  #
@@ -530,13 +540,42 @@ module Faker
530
540
  '%08x-%04x-%04x-%04x-%04x%08x' % ary # rubocop:disable Style/FormatString
531
541
  end
532
542
 
543
+ ##
544
+ # Produces a random string of alphabetic characters, (no digits)
545
+ #
546
+ # @param length [Integer] The length of the string to generate
547
+ # @param padding [Boolean] Toggles if a final equal '=' will be added.
548
+ # @param urlsafe [Boolean] Toggles charset to '-' and '_' instead of '+' and '/'.
549
+ #
550
+ # @return [String]
551
+ #
552
+ # @example
553
+ # Faker::Internet.base64
554
+ # #=> "r_hbZ2DSD-ZACzZT"
555
+ # @example
556
+ # Faker::Internet.base64(length: 4, padding: true, urlsafe: false)
557
+ # #=> "x1/R="
558
+ #
559
+ # @faker.version 2.11.0
560
+ def base64(length: 16, padding: false, urlsafe: true)
561
+ char_range = [
562
+ Array('0'..'9'),
563
+ Array('A'..'Z'),
564
+ Array('a'..'z'),
565
+ urlsafe ? %w[- _] : %w[+ /]
566
+ ].flatten
567
+ s = Array.new(length) { sample(char_range) }.join
568
+ s += '=' if padding
569
+ s
570
+ end
571
+
533
572
  ##
534
573
  # Produces a randomized hash of internet user details
535
574
  # @example
536
- # Faker::Internet.user #=> { username: 'alexie', email: 'alexie@example.net' }
575
+ # Faker::Internet.user #=> { username: 'alexie', email: 'trudie@grant.test' }
537
576
  #
538
577
  # @example
539
- # Faker::Internet.user('username', 'email', 'password') #=> { username: 'alexie', email: 'alexie@example.net', password: 'DtEf9P8wS31iMyC' }
578
+ # Faker::Internet.user('username', 'email', 'password') #=> { username: 'alexie', email: 'gayle@kohler.test', password: 'DtEf9P8wS31iMyC' }
540
579
  #
541
580
  # @return [hash]
542
581
  #
@@ -557,10 +596,10 @@ module Faker
557
596
  Array('0'..'9'),
558
597
  Array('A'..'Z'),
559
598
  Array('a'..'z'),
560
- "!#$%&'*+-/=?^_`{|}~.".split(//)
599
+ "!#$%&'*+-/=?^_`{|}~.".chars
561
600
  ].flatten
562
601
 
563
- local_part.split(//).map do |char|
602
+ local_part.chars.map do |char|
564
603
  char_range.include?(char) ? char : '#'
565
604
  end.join
566
605
  end