ffaker 2.20.0 → 2.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +163 -17
- data/Gemfile +15 -0
- data/README.md +19 -7
- data/REFERENCE.md +1479 -1395
- data/Rakefile +16 -47
- data/bin/console +9 -0
- data/ffaker.gemspec +9 -23
- data/lib/ffaker/address.rb +5 -5
- data/lib/ffaker/address_br.rb +14 -2
- data/lib/ffaker/address_fr.rb +3 -5
- data/lib/ffaker/address_it.rb +1 -5
- data/lib/ffaker/address_ua.rb +1 -1
- data/lib/ffaker/animal_br.rb +12 -0
- data/lib/ffaker/avatar.rb +11 -3
- data/lib/ffaker/bank.rb +13 -1
- data/lib/ffaker/bank_us.rb +37 -0
- data/lib/ffaker/book.rb +15 -7
- data/lib/ffaker/boolean.rb +4 -0
- data/lib/ffaker/cheesy_lingo.rb +2 -2
- data/lib/ffaker/code.rb +1 -1
- data/lib/ffaker/company.rb +5 -8
- data/lib/ffaker/company_fr.rb +2 -2
- data/lib/ffaker/crypto.rb +14 -0
- data/lib/ffaker/data/address_br/complement +3 -0
- data/lib/ffaker/data/address_br/neighborhood_prefixes +3 -0
- data/lib/ffaker/data/address_de/state +1 -0
- data/lib/ffaker/data/animal_br/common_names +423 -0
- data/lib/ffaker/data/jo_jo/first_names +356 -0
- data/lib/ffaker/data/jo_jo/full_names +225 -0
- data/lib/ffaker/data/jo_jo/last_names +153 -0
- data/lib/ffaker/data/jo_jo/stands +149 -0
- data/lib/ffaker/data/job_tw/job_nouns +201 -0
- data/lib/ffaker/data/lorem_tw/words +789 -0
- data/lib/ffaker/date.rb +40 -0
- data/lib/ffaker/filesystem.rb +12 -2
- data/lib/ffaker/geolocation.rb +2 -2
- data/lib/ffaker/guid.rb +7 -1
- data/lib/ffaker/html_ipsum.rb +7 -1
- data/lib/ffaker/identification_br.rb +3 -12
- data/lib/ffaker/identification_ec.rb +39 -0
- data/lib/ffaker/identification_es_cl.rb +2 -2
- data/lib/ffaker/identification_es_co.rb +1 -1
- data/lib/ffaker/identification_fi.rb +73 -0
- data/lib/ffaker/identification_kr.rb +11 -4
- data/lib/ffaker/identification_mx.rb +1 -1
- data/lib/ffaker/identification_pl.rb +6 -6
- data/lib/ffaker/identification_tw.rb +4 -3
- data/lib/ffaker/image.rb +28 -4
- data/lib/ffaker/jo_jo.rb +24 -0
- data/lib/ffaker/job_tw.rb +12 -0
- data/lib/ffaker/lorem_ja.rb +1 -1
- data/lib/ffaker/lorem_ru.rb +1 -1
- data/lib/ffaker/lorem_tw.rb +40 -0
- data/lib/ffaker/movie.rb +1 -1
- data/lib/ffaker/name_fr.rb +4 -3
- data/lib/ffaker/name_pl.rb +3 -3
- data/lib/ffaker/number.rb +6 -2
- data/lib/ffaker/phone_number_de.rb +3 -3
- data/lib/ffaker/skill.rb +1 -1
- data/lib/ffaker/ssn.rb +4 -2
- data/lib/ffaker/ssn_se.rb +2 -2
- data/lib/ffaker/string.rb +7 -7
- data/lib/ffaker/time.rb +4 -4
- data/lib/ffaker/tweet.rb +1 -1
- data/lib/ffaker/utils/module_utils.rb +10 -20
- data/lib/ffaker/utils/unique_utils.rb +34 -21
- data/lib/ffaker/uuid.rb +175 -0
- data/lib/ffaker/vehicle.rb +63 -1
- data/lib/{version.rb → ffaker/version.rb} +1 -1
- data/lib/ffaker.rb +64 -190
- data/scripts/reference.rb +21 -21
- data/test/helper.rb +7 -9
- data/test/test_address_br.rb +15 -2
- data/test/test_address_da.rb +3 -3
- data/test/test_address_fi.rb +2 -2
- data/test/test_address_se.rb +2 -2
- data/test/test_address_ua.rb +1 -1
- data/test/test_animal_br.rb +17 -0
- data/test/test_array_utils.rb +1 -1
- data/test/test_avatar.rb +30 -7
- data/test/test_bank.rb +15 -1
- data/test/test_bank_us.rb +37 -0
- data/test/test_book.rb +29 -0
- data/test/test_boolean.rb +32 -1
- data/test/test_cheesy_lingo.rb +1 -1
- data/test/test_color.rb +3 -3
- data/test/test_crypto.rb +15 -0
- data/test/test_date.rb +47 -0
- data/test/test_filesystem.rb +30 -4
- data/test/test_freedom_ipsum.rb +1 -1
- data/test/test_gender_it.rb +1 -1
- data/test/test_gender_ja.rb +1 -1
- data/test/test_gender_jp.rb +1 -1
- data/test/test_gender_pl.rb +1 -1
- data/test/test_guid.rb +1 -1
- data/test/test_healthcare_ru.rb +1 -1
- data/test/test_hipster_ipsum.rb +1 -1
- data/test/test_html_ipsum.rb +6 -0
- data/test/test_identification.rb +12 -2
- data/test/test_identification_ec.rb +33 -0
- data/test/test_identification_es_mx.rb +3 -1
- data/test/test_identification_fi.rb +39 -0
- data/test/test_identification_it.rb +12 -1
- data/test/test_identification_kr.rb +3 -3
- data/test/test_image.rb +51 -5
- data/test/test_internet.rb +3 -1
- data/test/test_internet_se.rb +5 -2
- data/test/test_jo_jo.rb +29 -0
- data/test/test_job_tw.rb +21 -0
- data/test/test_lorem_br.rb +3 -3
- data/test/test_lorem_cn.rb +3 -3
- data/test/test_lorem_fr.rb +3 -3
- data/test/test_lorem_ie.rb +2 -2
- data/test/test_lorem_kr.rb +3 -3
- data/test/test_lorem_pl.rb +2 -2
- data/test/test_lorem_ru.rb +3 -3
- data/test/test_lorem_tw.rb +54 -0
- data/test/test_lorem_ua.rb +3 -3
- data/test/test_module_utils.rb +42 -0
- data/test/test_music.rb +4 -4
- data/test/test_name_da.rb +1 -1
- data/test/test_name_ph.rb +1 -1
- data/test/test_name_ru.rb +2 -2
- data/test/test_name_ua.rb +2 -2
- data/test/test_number.rb +14 -2
- data/test/test_phone_number_nl.rb +1 -1
- data/test/test_phone_number_se.rb +1 -1
- data/test/test_phone_number_sg.rb +8 -8
- data/test/test_ssn_se.rb +1 -1
- data/test/test_unique_utils.rb +29 -5
- data/test/test_units.rb +6 -6
- data/test/test_units_english.rb +15 -15
- data/test/test_units_metric.rb +15 -15
- data/test/test_uuid.rb +73 -0
- data/test/test_vehicle.rb +27 -1
- metadata +41 -245
data/lib/ffaker/date.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
|
5
|
+
module FFaker
|
6
|
+
module Date
|
7
|
+
extend FFaker::ModuleUtils
|
8
|
+
extend self
|
9
|
+
|
10
|
+
# Generates a random date between 2 dates
|
11
|
+
def between(from, to)
|
12
|
+
FFaker::Time.between(from, to).to_date
|
13
|
+
end
|
14
|
+
|
15
|
+
# Generates a random date up to `days` days in the past
|
16
|
+
def backward(days = 365)
|
17
|
+
from = ::Date.today - days
|
18
|
+
to = ::Date.today - 1
|
19
|
+
|
20
|
+
between(from, to)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Generates a random date up to `days` days in the future
|
24
|
+
def forward(days = 365)
|
25
|
+
from = ::Date.today + 1
|
26
|
+
to = ::Date.today + days
|
27
|
+
|
28
|
+
between(from, to)
|
29
|
+
end
|
30
|
+
|
31
|
+
# Random birthday date (maximum age between 18 and 65)
|
32
|
+
# Keyword arguments: min_age, max_age
|
33
|
+
def birthday(min_age: 18, max_age: 65)
|
34
|
+
from = ::Date.today.prev_year(max_age + 1).next_day
|
35
|
+
to = ::Date.today.prev_year(min_age)
|
36
|
+
|
37
|
+
between(from, to)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/ffaker/filesystem.rb
CHANGED
@@ -17,8 +17,18 @@ module FFaker
|
|
17
17
|
Lorem.words.join(directory_separator)
|
18
18
|
end
|
19
19
|
|
20
|
-
def file_name(
|
21
|
-
|
20
|
+
def file_name(
|
21
|
+
*args,
|
22
|
+
dir: directory, name: Lorem.word.downcase, ext: extension, directory_separator: File::SEPARATOR
|
23
|
+
)
|
24
|
+
if args.any?
|
25
|
+
warn "Positional arguments for Filesystem##{__method__} are deprecated. Please use keyword arguments."
|
26
|
+
dir = args[0]
|
27
|
+
name = args[1] if args.size > 1
|
28
|
+
ext = args[2] if args.size > 2
|
29
|
+
directory_separator = args[3] if args.size > 3
|
30
|
+
end
|
31
|
+
|
22
32
|
"#{dir}#{directory_separator}#{name}.#{ext}"
|
23
33
|
end
|
24
34
|
end
|
data/lib/ffaker/geolocation.rb
CHANGED
@@ -51,8 +51,8 @@ module FFaker
|
|
51
51
|
latitude_range = [upper_left[0], lower_right[0]].sort
|
52
52
|
longitude_range = [upper_left[1], lower_right[1]].sort
|
53
53
|
|
54
|
-
latitude = latitude_range[0] + rand * (latitude_range[1] - latitude_range[0])
|
55
|
-
longitude = longitude_range[0] + rand * (longitude_range[1] - longitude_range[0])
|
54
|
+
latitude = latitude_range[0] + (rand * (latitude_range[1] - latitude_range[0]))
|
55
|
+
longitude = longitude_range[0] + (rand * (longitude_range[1] - longitude_range[0]))
|
56
56
|
|
57
57
|
[latitude, longitude]
|
58
58
|
end
|
data/lib/ffaker/guid.rb
CHANGED
@@ -5,8 +5,14 @@ module FFaker
|
|
5
5
|
extend ModuleUtils
|
6
6
|
extend self
|
7
7
|
|
8
|
+
# Because this method uses arbitrary hexadecimal characters it is likely to
|
9
|
+
# generate invalid UUIDs--UUIDs must have a version (1-8) at bits 48-51,
|
10
|
+
# and bits 64-65 must be 0b10.
|
11
|
+
#
|
12
|
+
# @deprecated Often generates invalid UUIDs. Use {UUID} instead.
|
8
13
|
def guid
|
9
|
-
|
14
|
+
warn '[guid] is deprecated. Use the UUID.uuidv4 method instead.'
|
15
|
+
FFaker::UUID.uuidv4.upcase
|
10
16
|
end
|
11
17
|
end
|
12
18
|
end
|
data/lib/ffaker/html_ipsum.rb
CHANGED
@@ -134,9 +134,15 @@ module FFaker
|
|
134
134
|
a = k([
|
135
135
|
content_tag_for(:strong, words(2).capitalize!),
|
136
136
|
content_tag_for(:em, paragraph),
|
137
|
+
content_tag_for(:mark, paragraph),
|
138
|
+
content_tag_for(:del, words(2)),
|
139
|
+
content_tag_for(:ins, words(2)),
|
140
|
+
content_tag_for(:sub, words(2)),
|
141
|
+
content_tag_for(:sup, words(2)),
|
137
142
|
content_tag_for(:code, words(2)),
|
143
|
+
content_tag_for(:small, words(2)),
|
138
144
|
(a 2).to_s
|
139
|
-
] + FFaker::Lorem.paragraphs(count))
|
145
|
+
] + FFaker::Lorem.paragraphs(count - 1))
|
140
146
|
fetch_sample(a, count: count).join(sep)
|
141
147
|
end
|
142
148
|
|
@@ -17,11 +17,7 @@ module FFaker
|
|
17
17
|
|
18
18
|
def pretty_cpf
|
19
19
|
cpf_numbers = cpf
|
20
|
-
|
21
|
-
cpf_numbers[0..2],
|
22
|
-
cpf_numbers[3..5],
|
23
|
-
cpf_numbers[6..8],
|
24
|
-
cpf_numbers[9..10])
|
20
|
+
"#{cpf_numbers[0..2]}.#{cpf_numbers[3..5]}.#{cpf_numbers[6..8]}-#{cpf_numbers[9..10]}"
|
25
21
|
end
|
26
22
|
|
27
23
|
def cnpj
|
@@ -32,12 +28,7 @@ module FFaker
|
|
32
28
|
|
33
29
|
def pretty_cnpj
|
34
30
|
cnpj_numbers = cnpj.to_s.rjust(14, '0')
|
35
|
-
|
36
|
-
cnpj_numbers[0..1],
|
37
|
-
cnpj_numbers[2..4],
|
38
|
-
cnpj_numbers[5..7],
|
39
|
-
cnpj_numbers[8..11],
|
40
|
-
cnpj_numbers[12..14])
|
31
|
+
"#{cnpj_numbers[0..1]}.#{cnpj_numbers[2..4]}.#{cnpj_numbers[5..7]}/#{cnpj_numbers[8..11]}-#{cnpj_numbers[12..14]}"
|
41
32
|
end
|
42
33
|
|
43
34
|
def rg
|
@@ -71,7 +62,7 @@ module FFaker
|
|
71
62
|
if document_digits.size + 1 == verification_multipliers.size && document_digits.uniq.size > 1
|
72
63
|
0.upto(1) do |i|
|
73
64
|
sum = verification_multipliers.drop(1 - i).each_with_index.inject(0) do |val, (value, j)|
|
74
|
-
val + document_digits[j] * value
|
65
|
+
val + (document_digits[j] * value)
|
75
66
|
end
|
76
67
|
validation_digits[i] = (sum %= 11) < 2 ? 0 : 11 - sum
|
77
68
|
document_digits.push(validation_digits[i])
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FFaker
|
4
|
+
module IdentificationEC
|
5
|
+
extend ModuleUtils
|
6
|
+
extend self
|
7
|
+
|
8
|
+
# https://medium.com/@bryansuarez/c%C3%B3mo-validar-c%C3%A9dula-y-ruc-en-ecuador-b62c5666186f
|
9
|
+
# Cedula de Identificacion
|
10
|
+
def ci
|
11
|
+
first_digits = ci_digits
|
12
|
+
"#{first_digits}#{last_digit(first_digits)}"
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def ci_digits
|
18
|
+
"#{FFaker.numerify('##')}#{rand(0..5)}#{FFaker.numerify('######')}"
|
19
|
+
end
|
20
|
+
|
21
|
+
def last_digit(digits)
|
22
|
+
mod = digits_sum(digits) % 10
|
23
|
+
10 - mod if mod.positive?
|
24
|
+
end
|
25
|
+
|
26
|
+
def digits_sum(digits)
|
27
|
+
sum = 0
|
28
|
+
digits.chars.each_with_index do |char, index|
|
29
|
+
if index.even?
|
30
|
+
multiple = char.to_i * 2
|
31
|
+
sum += multiple > 9 ? multiple - 9 : multiple
|
32
|
+
else
|
33
|
+
sum += char.to_i
|
34
|
+
end
|
35
|
+
end
|
36
|
+
sum
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -20,10 +20,10 @@ module FFaker
|
|
20
20
|
private
|
21
21
|
|
22
22
|
def dv(rut)
|
23
|
-
total = rut.to_s.rjust(8, '0').
|
23
|
+
total = rut.to_s.rjust(8, '0').chars.zip(%w[3 2 7 6 5 4 3 2]).sum do |a, b|
|
24
24
|
a.to_i * b.to_i
|
25
25
|
end
|
26
|
-
(11 - total % 11).to_s.gsub(
|
26
|
+
(11 - (total % 11)).to_s.gsub('10', 'k').gsub('11', '0')
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FFaker
|
4
|
+
module IdentificationFI
|
5
|
+
extend ModuleUtils
|
6
|
+
extend self
|
7
|
+
|
8
|
+
CHECK_DIGITS = '0123456789ABCDEFHJKLMNPRSTUVWXY'
|
9
|
+
# Number ranges in real use
|
10
|
+
POSSIBLY_REAL_FEMALE_INDIVIDUAL_NUMBERS = (2..898).step(2).to_a.freeze
|
11
|
+
POSSIBLY_REAL_MALE_INDIVIDUAL_NUMBERS = (3..899).step(2).to_a.freeze
|
12
|
+
# Number ranges not in real use
|
13
|
+
FAKE_FEMALE_INDIVIDUAL_NUMBERS = (900..998).step(2).to_a.freeze
|
14
|
+
FAKE_MALE_INDIVIDUAL_NUMBERS = (901..999).step(2).to_a.freeze
|
15
|
+
|
16
|
+
def identity_number(gender: FFaker::Gender.binary, birthday: FFaker::Date.birthday, fake: true)
|
17
|
+
day = fetch_formatted_day(birthday)
|
18
|
+
month = fetch_formatted_month(birthday)
|
19
|
+
year = fetch_formatted_year(birthday)
|
20
|
+
separator = fetch_separator(birthday)
|
21
|
+
individual_number = fetch_individual_number(gender, fake)
|
22
|
+
check_digit = calculate_check_digit(birthday, individual_number)
|
23
|
+
"#{day}#{month}#{year}#{separator}#{individual_number}#{check_digit}"
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def fetch_formatted_day(birthday)
|
29
|
+
format('%.2d', birthday.day)
|
30
|
+
end
|
31
|
+
|
32
|
+
def fetch_formatted_month(birthday)
|
33
|
+
format('%.2d', birthday.month)
|
34
|
+
end
|
35
|
+
|
36
|
+
def fetch_formatted_year(birthday)
|
37
|
+
check_birth_year(birthday.year)
|
38
|
+
birthday.strftime('%y')
|
39
|
+
end
|
40
|
+
|
41
|
+
def fetch_separator(birthday)
|
42
|
+
case birthday.year
|
43
|
+
when ..1899
|
44
|
+
'+'
|
45
|
+
when 1900..1999
|
46
|
+
'-'
|
47
|
+
else
|
48
|
+
'A'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def fetch_individual_number(gender, fake)
|
53
|
+
numbers_range = if gender == 'female'
|
54
|
+
fake ? FAKE_FEMALE_INDIVIDUAL_NUMBERS : POSSIBLY_REAL_FEMALE_INDIVIDUAL_NUMBERS
|
55
|
+
else
|
56
|
+
fake ? FAKE_MALE_INDIVIDUAL_NUMBERS : POSSIBLY_REAL_MALE_INDIVIDUAL_NUMBERS
|
57
|
+
end
|
58
|
+
format('%.3d', fetch_sample(numbers_range))
|
59
|
+
end
|
60
|
+
|
61
|
+
def calculate_check_digit(birthday, individual_number)
|
62
|
+
digit = "#{birthday.day}#{fetch_formatted_month(birthday)}#{fetch_formatted_year(birthday)}#{individual_number}"
|
63
|
+
.to_i % 31
|
64
|
+
CHECK_DIGITS[digit]
|
65
|
+
end
|
66
|
+
|
67
|
+
def check_birth_year(birth_year)
|
68
|
+
return if birth_year.between?(1799, 2100)
|
69
|
+
|
70
|
+
raise ArgumentError, "Birth year: #{birth_year} is not between supported 1799 and 2100 range"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -1,18 +1,25 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module FFaker
|
4
|
-
module
|
4
|
+
module IdentificationKR
|
5
5
|
extend ModuleUtils
|
6
6
|
extend self
|
7
7
|
|
8
8
|
# Resident Registration Number
|
9
9
|
# http://ko.wikipedia.org/wiki/%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EB%B2%88%ED%98%B8
|
10
10
|
def rrn
|
11
|
-
birth = fetch_sample(Date.new(1970, 1, 1)
|
11
|
+
birth = fetch_sample(::Date.new(1970, 1, 1)..::Date.new(1999, 12, 31)).strftime('%y%d%m')
|
12
12
|
sex = fetch_sample([1, 2])
|
13
13
|
loc = FFaker.numerify("#{fetch_sample(Array('00'..'95'))}###")
|
14
|
-
a, b, c, d, e, f, g, h, i, j, k, l = "#{birth}#{sex}#{loc}".
|
15
|
-
checksum = (
|
14
|
+
a, b, c, d, e, f, g, h, i, j, k, l = "#{birth}#{sex}#{loc}".chars.map(&:to_i)
|
15
|
+
checksum = (
|
16
|
+
11 - (
|
17
|
+
(
|
18
|
+
(2 * a) + (3 * b) + (4 * c) + (5 * d) + (6 * e) + (7 * f) + (8 * g) + (9 * h) +
|
19
|
+
(2 * i) + (3 * j) + (4 * k) + (5 * l)
|
20
|
+
) % 11
|
21
|
+
)
|
22
|
+
) % 10
|
16
23
|
"#{birth}-#{sex}#{loc}#{checksum}"
|
17
24
|
end
|
18
25
|
end
|
@@ -27,7 +27,7 @@ module FFaker
|
|
27
27
|
def rfc_persona_moral
|
28
28
|
consonants_n_amp = CONSONANTS + ['Ñ', '&']
|
29
29
|
all_letters = consonants_n_amp + VOWELS
|
30
|
-
[fetch_sample(all_letters, count: 3), date, fetch_sample(HOMOCLAVE, count: 3)].
|
30
|
+
[*fetch_sample(all_letters, count: 3), date, *fetch_sample(HOMOCLAVE, count: 3)].join
|
31
31
|
end
|
32
32
|
|
33
33
|
# http://es.wikipedia.org/wiki/Registro_Federal_de_Contribuyentes_(M%C3%A9xico)
|
@@ -37,8 +37,8 @@ module FFaker
|
|
37
37
|
private
|
38
38
|
|
39
39
|
def generate_valid_pesel_date
|
40
|
-
from = Date.new(1800, 1, 1)
|
41
|
-
to = [Date.today, Date.new(2299, 12, 31)].min
|
40
|
+
from = ::Date.new(1800, 1, 1)
|
41
|
+
to = [::Date.today, ::Date.new(2299, 12, 31)].min
|
42
42
|
fetch_sample(from..to)
|
43
43
|
end
|
44
44
|
|
@@ -63,15 +63,15 @@ module FFaker
|
|
63
63
|
end
|
64
64
|
|
65
65
|
def pesel_checksum(date, serial_number)
|
66
|
-
pesel_digits = "#{date}#{serial_number}".
|
66
|
+
pesel_digits = "#{date}#{serial_number}".chars.map(&:to_i)
|
67
67
|
a, b, c, d, e, f, g, h, i, j = pesel_digits
|
68
|
-
(a * 9 + b * 7 + c * 3 + d + e * 9 + f * 7 + g * 3 + h + i * 9 + j * 7) % 10
|
68
|
+
((a * 9) + (b * 7) + (c * 3) + d + (e * 9) + (f * 7) + (g * 3) + h + (i * 9) + (j * 7)) % 10
|
69
69
|
end
|
70
70
|
|
71
71
|
def identity_card_checksum(letter_part, number_part)
|
72
72
|
a, b, c = letter_part.codepoints.map { |codepoints| codepoints - 55 }
|
73
|
-
d, e, f, g, h = number_part.
|
74
|
-
(a * 7 + b * 3 + c + 7 * d + 3 * e + f + 7 * g + 3 * h) % 10
|
73
|
+
d, e, f, g, h = number_part.chars.map(&:to_i)
|
74
|
+
((a * 7) + (b * 3) + c + (7 * d) + (3 * e) + f + (7 * g) + (3 * h)) % 10
|
75
75
|
end
|
76
76
|
end
|
77
77
|
end
|
@@ -5,7 +5,8 @@ module FFaker
|
|
5
5
|
extend ModuleUtils
|
6
6
|
extend self
|
7
7
|
|
8
|
-
AREA_CODE = { a: 10, b: 11, c: 12, d: 13, e: 14, f: 15, g: 16, h: 17, i: 34, j: 18, k: 19, l: 20, m: 21, n: 22,
|
8
|
+
AREA_CODE = { a: 10, b: 11, c: 12, d: 13, e: 14, f: 15, g: 16, h: 17, i: 34, j: 18, k: 19, l: 20, m: 21, n: 22,
|
9
|
+
o: 35, p: 23, q: 24, r: 25, s: 26, t: 27, u: 28, v: 29, w: 32, x: 30, y: 31, z: 33 }.freeze
|
9
10
|
|
10
11
|
# Identity Card Number
|
11
12
|
# https://en.wikipedia.org/wiki/National_identification_card_(Taiwan)#Identity_card_number
|
@@ -14,9 +15,9 @@ module FFaker
|
|
14
15
|
code = AREA_CODE[letter.to_sym]
|
15
16
|
gender = fetch_sample([1, 2])
|
16
17
|
serial = FFaker.numerify('#######')
|
17
|
-
a, b, c, d, e, f, g, h, i, j = "#{code}#{gender}#{serial}".
|
18
|
+
a, b, c, d, e, f, g, h, i, j = "#{code}#{gender}#{serial}".chars.map(&:to_i)
|
18
19
|
|
19
|
-
checksum = (9 * a + b + 2 * c + 3 * d + 4 * e + 5 * f + 6 * g + 7 * h + 8 * i + 9 * j) % 10
|
20
|
+
checksum = ((9 * a) + b + (2 * c) + (3 * d) + (4 * e) + (5 * f) + (6 * g) + (7 * h) + (8 * i) + (9 * j)) % 10
|
20
21
|
"#{letter.upcase}#{gender}#{serial}#{checksum}"
|
21
22
|
end
|
22
23
|
end
|
data/lib/ffaker/image.rb
CHANGED
@@ -11,7 +11,18 @@ module FFaker
|
|
11
11
|
|
12
12
|
SUPPORTED_FORMATS = %w[png jpg jpeg gif].freeze
|
13
13
|
|
14
|
-
|
14
|
+
## `*args` for old format support, it will be removed with deprecation
|
15
|
+
# rubocop:disable Metrics/ParameterLists
|
16
|
+
def url(*args, size: '300x300', format: 'png', bg_color: :random, text_color: :random, text: nil)
|
17
|
+
if args.any?
|
18
|
+
warn "Positional arguments for Image##{__method__} are deprecated. Please use keyword arguments."
|
19
|
+
size = args[0]
|
20
|
+
format = args[1] if args.size > 1
|
21
|
+
bg_color = args[2] if args.size > 2
|
22
|
+
text_color = args[3] if args.size > 3
|
23
|
+
text = args[4] if args.size > 4
|
24
|
+
end
|
25
|
+
|
15
26
|
check_size!(size)
|
16
27
|
check_format!(format)
|
17
28
|
|
@@ -21,20 +32,33 @@ module FFaker
|
|
21
32
|
|
22
33
|
"https://dummyimage.com/#{size}/#{bg_color}/#{text_color}.#{format}?text=#{text}"
|
23
34
|
end
|
35
|
+
# rubocop:enable Metrics/ParameterLists
|
36
|
+
|
37
|
+
## `*args` for old format support, it will be removed with deprecation
|
38
|
+
# rubocop:disable Metrics/ParameterLists
|
39
|
+
def file(*args, size: '300x300', format: 'png', bg_color: :random, text_color: :random, text: nil)
|
40
|
+
if args.any?
|
41
|
+
warn "Positional arguments for Image##{__method__} are deprecated. Please use keyword arguments."
|
42
|
+
size = args[0]
|
43
|
+
format = args[1] if args.size > 1
|
44
|
+
bg_color = args[2] if args.size > 2
|
45
|
+
text_color = args[3] if args.size > 3
|
46
|
+
text = args[4] if args.size > 4
|
47
|
+
end
|
24
48
|
|
25
|
-
|
26
|
-
uri = URI.parse(url(size, format, bg_color, text_color, text))
|
49
|
+
uri = URI.parse(url(size: size, format: format, bg_color: bg_color, text_color: text_color, text: text))
|
27
50
|
file = Tempfile.new('ffaker_image')
|
28
51
|
file.binmode
|
29
52
|
file << uri.open.read
|
30
53
|
file.close
|
31
54
|
File.new(file.path)
|
32
55
|
end
|
56
|
+
# rubocop:enable Metrics/ParameterLists
|
33
57
|
|
34
58
|
private
|
35
59
|
|
36
60
|
def check_size!(size)
|
37
|
-
return true if size
|
61
|
+
return true if size.match?(/\A\d+x\d+\z/)
|
38
62
|
|
39
63
|
raise ArgumentError, 'Size should be specified in format 300x300'
|
40
64
|
end
|
data/lib/ffaker/jo_jo.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FFaker
|
4
|
+
module JoJo
|
5
|
+
extend ModuleUtils
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def full_name
|
9
|
+
fetch_sample(FULL_NAMES)
|
10
|
+
end
|
11
|
+
|
12
|
+
def first_name
|
13
|
+
fetch_sample(FIRST_NAMES)
|
14
|
+
end
|
15
|
+
|
16
|
+
def last_name
|
17
|
+
fetch_sample(LAST_NAMES)
|
18
|
+
end
|
19
|
+
|
20
|
+
def stand
|
21
|
+
fetch_sample(STANDS)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/ffaker/lorem_ja.rb
CHANGED
data/lib/ffaker/lorem_ru.rb
CHANGED
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module FFaker
|
4
|
+
module LoremTW
|
5
|
+
extend ModuleUtils
|
6
|
+
extend self
|
7
|
+
|
8
|
+
def word
|
9
|
+
fetch_sample(WORDS)
|
10
|
+
end
|
11
|
+
|
12
|
+
def words(num = 3)
|
13
|
+
fetch_sample(WORDS, count: num)
|
14
|
+
end
|
15
|
+
|
16
|
+
def sentence(word_count = 4)
|
17
|
+
s = words(word_count + rand(0..5))
|
18
|
+
s = s.join
|
19
|
+
"#{s},"
|
20
|
+
end
|
21
|
+
|
22
|
+
def sentences(sentence_count = 3)
|
23
|
+
s = (1..sentence_count).map { sentence }
|
24
|
+
def s.to_s
|
25
|
+
result = join(' ')
|
26
|
+
result[-1] = '。'
|
27
|
+
result
|
28
|
+
end
|
29
|
+
s
|
30
|
+
end
|
31
|
+
|
32
|
+
def paragraph(sentence_count = 3)
|
33
|
+
sentences(sentence_count + rand(0..2)).to_s
|
34
|
+
end
|
35
|
+
|
36
|
+
def paragraphs(paragraph_count = 3)
|
37
|
+
(1..paragraph_count).map { paragraph }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/ffaker/movie.rb
CHANGED
data/lib/ffaker/name_fr.rb
CHANGED
@@ -25,9 +25,10 @@ module FFaker
|
|
25
25
|
|
26
26
|
def name
|
27
27
|
case rand(0..9)
|
28
|
-
when 7
|
29
|
-
|
30
|
-
else
|
28
|
+
when 5, 7
|
29
|
+
"#{first_name} #{prefix} #{last_name}"
|
30
|
+
else
|
31
|
+
"#{first_name} #{last_name}"
|
31
32
|
end
|
32
33
|
end
|
33
34
|
end
|
data/lib/ffaker/name_pl.rb
CHANGED
@@ -11,7 +11,7 @@ module FFaker
|
|
11
11
|
GENDERS = %i[random female male].freeze
|
12
12
|
MALE_PREFIXES = %w[Pan].freeze
|
13
13
|
FEMALE_PREFIXES = %w[Pani].freeze
|
14
|
-
ACADEMIC_DEGREE_PREFIXES =
|
14
|
+
ACADEMIC_DEGREE_PREFIXES = ['lic.', 'inż.', 'mgr', 'mgr inż.', 'dr', 'dr hab.', 'prof.'].freeze
|
15
15
|
PREFIXES = (MALE_PREFIXES + FEMALE_PREFIXES + ACADEMIC_DEGREE_PREFIXES).freeze
|
16
16
|
|
17
17
|
# Generates a random full name for a given gender (random by default).
|
@@ -90,9 +90,9 @@ module FFaker
|
|
90
90
|
|
91
91
|
def name_for_gender(name_type, gender) # :nodoc:
|
92
92
|
raise(ArgumentError, "Gender must be one of: #{GENDERS}") unless GENDERS.include?(gender)
|
93
|
-
return send("#{gender}_#{name_type}") unless gender == :random
|
93
|
+
return send(:"#{gender}_#{name_type}") unless gender == :random
|
94
94
|
|
95
|
-
fetch_sample([send("female_#{name_type}"), send("male_#{name_type}")])
|
95
|
+
fetch_sample([send(:"female_#{name_type}"), send(:"male_#{name_type}")])
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
data/lib/ffaker/number.rb
CHANGED
@@ -15,12 +15,16 @@ module FFaker
|
|
15
15
|
FFaker.numerify("#{whole_part_pattern}.#{fractional_part_pattern}").to_f
|
16
16
|
end
|
17
17
|
|
18
|
+
def between(from: 1.00, to: 5000.00)
|
19
|
+
fetch_sample(from..to)
|
20
|
+
end
|
21
|
+
|
18
22
|
private
|
19
23
|
|
20
24
|
def generate_pattern(digits)
|
21
|
-
raise ArgumentError
|
25
|
+
raise ArgumentError, 'Digits cannot be less than 1' if digits < 1
|
22
26
|
|
23
|
-
"#{fetch_sample(1..9)}#{
|
27
|
+
"#{fetch_sample(1..9)}#{'#' * (digits - 1)}"
|
24
28
|
end
|
25
29
|
end
|
26
30
|
end
|
@@ -7,15 +7,15 @@ module FFaker
|
|
7
7
|
|
8
8
|
# Mobile prefixes are in the 015x, 016x, 017x ranges
|
9
9
|
def mobile_prefix(leading_zero = true)
|
10
|
-
mobile_prefix =
|
11
|
-
mobile_prefix =
|
10
|
+
mobile_prefix = "1#{rand(5..7)}#{rand(0..9)}"
|
11
|
+
mobile_prefix = "0#{mobile_prefix}" if leading_zero
|
12
12
|
mobile_prefix
|
13
13
|
end
|
14
14
|
|
15
15
|
# Region prefixes are in range 02..09 with length of 3 to 5 digits
|
16
16
|
def region_prefix(leading_zero = true)
|
17
17
|
region_prefix = rand(2..9).to_s + FFaker.numerify('#' * rand(1..3)).to_s
|
18
|
-
region_prefix =
|
18
|
+
region_prefix = "0#{region_prefix}" if leading_zero
|
19
19
|
region_prefix
|
20
20
|
end
|
21
21
|
|
data/lib/ffaker/skill.rb
CHANGED
data/lib/ffaker/ssn.rb
CHANGED
@@ -15,8 +15,10 @@ module FFaker
|
|
15
15
|
second_group = rand(1..99)
|
16
16
|
third_group = rand(1..9999)
|
17
17
|
|
18
|
-
|
19
|
-
|
18
|
+
format(
|
19
|
+
'%<first_group>.3d-%<second_group>.2d-%<third_group>.4d',
|
20
|
+
first_group: first_group, second_group: second_group, third_group: third_group
|
21
|
+
)
|
20
22
|
end
|
21
23
|
end
|
22
24
|
end
|
data/lib/ffaker/ssn_se.rb
CHANGED
@@ -54,7 +54,7 @@ module FFaker
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def random_birth_time_between(from = ::Time.local(1940, 1, 1), to = ::Time.now)
|
57
|
-
::Time.at(from + rand * (to.to_f - from.to_f))
|
57
|
+
::Time.at(from + (rand * (to.to_f - from.to_f)))
|
58
58
|
end
|
59
59
|
|
60
60
|
def random_region_for(gender)
|
@@ -70,7 +70,7 @@ module FFaker
|
|
70
70
|
end
|
71
71
|
|
72
72
|
def random_region_odd
|
73
|
-
rand(0..498) * 2 + 1
|
73
|
+
(rand(0..498) * 2) + 1
|
74
74
|
end
|
75
75
|
|
76
76
|
def three_character_string(number)
|