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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +346 -7
- data/History.md +1 -1
- data/README.md +198 -104
- data/lib/faker/blockchain/aeternity.rb +1 -1
- data/lib/faker/blockchain/ethereum.rb +1 -1
- data/lib/faker/blockchain/tezos.rb +1 -1
- data/lib/faker/books/dune.rb +2 -10
- data/lib/faker/books/lovecraft.rb +7 -38
- data/lib/faker/books/the_kingkiller_chronicle.rb +61 -0
- data/lib/faker/default/address.rb +5 -25
- data/lib/faker/default/alphanumeric.rb +2 -8
- data/lib/faker/default/app.rb +1 -10
- data/lib/faker/default/avatar.rb +1 -12
- data/lib/faker/default/bank.rb +9 -17
- data/lib/faker/default/boolean.rb +1 -4
- data/lib/faker/default/chile_rut.rb +8 -14
- data/lib/faker/default/code.rb +11 -24
- data/lib/faker/default/color.rb +77 -6
- data/lib/faker/default/commerce.rb +3 -17
- data/lib/faker/default/company.rb +23 -20
- data/lib/faker/default/crypto_coin.rb +3 -15
- data/lib/faker/default/date.rb +5 -38
- data/lib/faker/default/demographic.rb +1 -5
- data/lib/faker/default/driving_licence.rb +1 -11
- data/lib/faker/default/drone.rb +1 -1
- data/lib/faker/default/file.rb +5 -24
- data/lib/faker/default/finance.rb +17 -7
- data/lib/faker/default/food.rb +14 -1
- data/lib/faker/default/hipster.rb +6 -45
- data/lib/faker/default/id_number.rb +108 -11
- data/lib/faker/default/internet.rb +168 -129
- data/lib/faker/default/invoice.rb +4 -17
- data/lib/faker/default/json.rb +2 -20
- data/lib/faker/default/lorem.rb +20 -76
- data/lib/faker/default/lorem_flickr.rb +4 -32
- data/lib/faker/default/markdown.rb +6 -11
- data/lib/faker/default/marketing.rb +1 -1
- data/lib/faker/default/measurement.rb +16 -48
- data/lib/faker/default/name.rb +1 -5
- data/lib/faker/default/nation.rb +0 -3
- data/lib/faker/default/nhs.rb +2 -6
- data/lib/faker/default/number.rb +10 -55
- data/lib/faker/default/omniauth.rb +51 -41
- data/lib/faker/default/phone_number.rb +2 -6
- data/lib/faker/default/placeholdit.rb +1 -12
- data/lib/faker/default/relationship.rb +1 -5
- data/lib/faker/default/religion.rb +6 -0
- data/lib/faker/default/source.rb +3 -16
- data/lib/faker/default/string.rb +1 -8
- data/lib/faker/default/stripe.rb +4 -20
- data/lib/faker/default/time.rb +4 -34
- data/lib/faker/default/twitter.rb +7 -23
- data/lib/faker/default/types.rb +5 -27
- data/lib/faker/default/vehicle.rb +29 -51
- data/lib/faker/default/vulnerability_identifier.rb +23 -0
- data/lib/faker/default/world_cup.rb +2 -11
- data/lib/faker/games/clash_of_clans.rb +1 -1
- data/lib/faker/games/dnd.rb +49 -7
- data/lib/faker/games/dota.rb +1 -5
- data/lib/faker/games/minecraft.rb +1 -1
- data/lib/faker/games/myst.rb +1 -1
- data/lib/faker/games/tarkov.rb +205 -0
- data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
- data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +48 -0
- data/lib/faker/japanese_media/kamen_rider.rb +102 -0
- data/lib/faker/japanese_media/one_piece.rb +1 -1
- data/lib/faker/movies/avatar.rb +49 -0
- data/lib/faker/movies/hackers.rb +48 -0
- data/lib/faker/movies/star_wars.rb +1 -5
- data/lib/faker/movies/tron.rb +161 -0
- data/lib/faker/quotes/quote.rb +13 -0
- data/lib/faker/religion/bible.rb +50 -0
- data/lib/faker/sports/chess.rb +90 -0
- data/lib/faker/sports/mountaineering.rb +22 -0
- data/lib/faker/sports/sport.rb +116 -0
- data/lib/faker/travel/airport.rb +43 -0
- data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
- data/lib/faker/tv_shows/michael_scott.rb +0 -3
- data/lib/faker/tv_shows/spongebob.rb +50 -0
- data/lib/faker/version.rb +1 -1
- data/lib/faker.rb +15 -64
- data/lib/helpers/base58.rb +1 -1
- data/lib/helpers/unique_generator.rb +13 -11
- data/lib/locales/ar.yml +6 -1
- data/lib/locales/bg.yml +1 -1
- data/lib/locales/da-DK.yml +1 -1
- data/lib/locales/de-AT.yml +3 -4
- data/lib/locales/de-CH.yml +1 -1
- data/lib/locales/de.yml +1 -1
- data/lib/locales/en/address.yml +2 -3
- data/lib/locales/en/airport.yml +381 -0
- data/lib/locales/en/australia.yml +3 -4
- data/lib/locales/en/avatar.yml +31 -0
- data/lib/locales/en/bible.yml +90 -0
- data/lib/locales/en/brooklyn_nine_nine.yml +35 -0
- data/lib/locales/en/cat.yml +1 -1
- data/lib/locales/en/chess.yml +103 -0
- data/lib/locales/en/coffee.yml +1 -1
- data/lib/locales/en/company.yml +1 -0
- data/lib/locales/en/computer.yml +23 -4
- data/lib/locales/en/cowboy_bebop.yml +163 -0
- data/lib/locales/en/dnd.yml +186 -1
- data/lib/locales/en/dota.yml +113 -0
- data/lib/locales/en/file.yml +9 -1
- data/lib/locales/en/finance.yml +3 -1
- data/lib/locales/en/fma_brotherhood.yml +78 -0
- data/lib/locales/en/food.yml +12 -0
- data/lib/locales/en/game.yml +11 -0
- data/lib/locales/en/hackers.yml +53 -0
- data/lib/locales/en/heroes.yml +2 -2
- data/lib/locales/en/internet.yml +140 -3
- data/lib/locales/en/kamen_rider.yml +452 -0
- data/lib/locales/en/mitch_hedberg.yml +46 -0
- data/lib/locales/en/mountain.yml +14 -1
- data/lib/locales/en/mountaineering.yml +14 -0
- data/lib/locales/en/movie.yml +2 -1
- data/lib/locales/en/naruto.yml +2 -3
- data/lib/locales/en/one_piece.yml +1 -1
- data/lib/locales/en/opera.yml +1 -1
- data/lib/locales/en/overwatch.yml +5 -7
- data/lib/locales/en/source.yml +5 -0
- data/lib/locales/en/spongebob.yml +489 -0
- data/lib/locales/en/sport.yml +130 -0
- data/lib/locales/en/star_wars.yml +1 -1
- data/lib/locales/en/stranger_thing.yml +1 -1
- data/lib/locales/en/super_smash_bros.yml +2 -0
- data/lib/locales/en/tarkov.yml +593 -0
- data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
- data/lib/locales/en/tron.yml +227 -0
- data/lib/locales/en/vehicle.yml +2809 -75
- data/lib/locales/en-AU.yml +2 -2
- data/lib/locales/en-CA.yml +2 -1
- data/lib/locales/en-GB.yml +2 -1
- data/lib/locales/en-MS.yml +1 -0
- data/lib/locales/en-NG.yml +1 -0
- data/lib/locales/en-NZ.yml +1 -0
- data/lib/locales/en-PAK.yml +1 -0
- data/lib/locales/en-SG.yml +1 -0
- data/lib/locales/en-UG.yml +1 -0
- data/lib/locales/en-US.yml +2 -2
- data/lib/locales/en-ZA.yml +1 -1
- data/lib/locales/en-au-ocker.yml +2 -0
- data/lib/locales/es-AR.yml +3 -2
- data/lib/locales/es-MX.yml +1 -1
- data/lib/locales/es.yml +2 -2
- data/lib/locales/fi-FI.yml +3 -1
- data/lib/locales/fr/address.yml +0 -1
- data/lib/locales/fr/adjective.yml +266 -0
- data/lib/locales/fr/ancient.yml +141 -0
- data/lib/locales/fr-CA.yml +1 -1
- data/lib/locales/fr-CH.yml +1 -1
- data/lib/locales/hy.yml +2 -1
- data/lib/locales/it.yml +1 -0
- data/lib/locales/ja/address.yml +258 -4169
- data/lib/locales/ja/adjective.yml +148 -0
- data/lib/locales/ja/dog.yml +1 -0
- data/lib/locales/ja/emotion.yml +51 -0
- data/lib/locales/ja/lorem.yml +2 -2
- data/lib/locales/ja/naruto.yml +230 -0
- data/lib/locales/ja/relationship.yml +10 -0
- data/lib/locales/ja/super_mario.yml +1 -1
- data/lib/locales/ja/super_smash_bros.yml +8 -0
- data/lib/locales/ko.yml +1 -0
- data/lib/locales/lt.yml +34 -0
- data/lib/locales/lv.yml +1 -1
- data/lib/locales/mi-NZ.yml +283 -0
- data/lib/locales/nb-NO.yml +1 -0
- data/lib/locales/nl.yml +1 -0
- data/lib/locales/pl.yml +2 -2
- data/lib/locales/pt-BR.yml +5 -0
- data/lib/locales/pt.yml +1 -1
- data/lib/locales/ru.yml +1 -0
- data/lib/locales/sk.yml +1 -0
- data/lib/locales/sv.yml +1 -0
- data/lib/locales/th.yml +76 -76
- data/lib/locales/tr.yml +1 -0
- data/lib/locales/uk.yml +1 -0
- data/lib/locales/vi.yml +1 -0
- data/lib/locales/zh-CN.yml +1 -0
- data/lib/locales/zh-TW.yml +1 -0
- metadata +96 -33
- data/lib/faker/default/fillmurray.rb +0 -45
- data/lib/faker/default/lorem_pixel.rb +0 -70
- /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(
|
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(
|
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
|
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 #=> "
|
17
|
-
# Faker::Internet.email(name: 'smith') #=> "smith@
|
18
|
-
# Faker::Internet.email(name: 'sam smith', separators: ['-']) #=> "sam
|
19
|
-
# Faker::Internet.email(name: 'sam smith', separators: ['-'], domain: '
|
20
|
-
|
21
|
-
|
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
|
-
|
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
|
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(
|
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(
|
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
|
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
|
-
# @
|
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(
|
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(
|
158
|
-
|
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
|
-
|
170
|
-
|
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
|
-
|
176
|
-
|
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
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
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
|
-
|
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
|
205
|
-
# Faker::Internet.domain_name(subdomain: true)
|
206
|
-
# Faker::Internet.domain_name(subdomain: true, domain: '
|
207
|
-
# Faker::Internet.domain_name(domain: 'faker')
|
208
|
-
|
209
|
-
|
210
|
-
|
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
|
-
|
220
|
-
|
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
|
-
|
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(
|
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
|
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
|
-
# @
|
268
|
-
# Faker::Internet.domain_suffix
|
269
|
-
# Faker::Internet.domain_suffix
|
270
|
-
|
271
|
-
|
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(
|
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
|
-
|
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
|
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://
|
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: '/
|
450
|
-
# Faker::Internet.url(host: 'faker', path: '/
|
451
|
-
def url(
|
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(
|
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
|
-
|
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(
|
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: '
|
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: '
|
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
|
-
"!#$%&'*+-/=?^_`{|}~.".
|
599
|
+
"!#$%&'*+-/=?^_`{|}~.".chars
|
561
600
|
].flatten
|
562
601
|
|
563
|
-
local_part.
|
602
|
+
local_part.chars.map do |char|
|
564
603
|
char_range.include?(char) ? char : '#'
|
565
604
|
end.join
|
566
605
|
end
|