ffaker 2.20.0 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +163 -17
  3. data/Gemfile +15 -0
  4. data/README.md +19 -7
  5. data/REFERENCE.md +1479 -1395
  6. data/Rakefile +16 -47
  7. data/bin/console +9 -0
  8. data/ffaker.gemspec +9 -23
  9. data/lib/ffaker/address.rb +5 -5
  10. data/lib/ffaker/address_br.rb +14 -2
  11. data/lib/ffaker/address_fr.rb +3 -5
  12. data/lib/ffaker/address_it.rb +1 -5
  13. data/lib/ffaker/address_ua.rb +1 -1
  14. data/lib/ffaker/animal_br.rb +12 -0
  15. data/lib/ffaker/avatar.rb +11 -3
  16. data/lib/ffaker/bank.rb +13 -1
  17. data/lib/ffaker/bank_us.rb +37 -0
  18. data/lib/ffaker/book.rb +15 -7
  19. data/lib/ffaker/boolean.rb +4 -0
  20. data/lib/ffaker/cheesy_lingo.rb +2 -2
  21. data/lib/ffaker/code.rb +1 -1
  22. data/lib/ffaker/company.rb +5 -8
  23. data/lib/ffaker/company_fr.rb +2 -2
  24. data/lib/ffaker/crypto.rb +14 -0
  25. data/lib/ffaker/data/address_br/complement +3 -0
  26. data/lib/ffaker/data/address_br/neighborhood_prefixes +3 -0
  27. data/lib/ffaker/data/address_de/state +1 -0
  28. data/lib/ffaker/data/animal_br/common_names +423 -0
  29. data/lib/ffaker/data/jo_jo/first_names +356 -0
  30. data/lib/ffaker/data/jo_jo/full_names +225 -0
  31. data/lib/ffaker/data/jo_jo/last_names +153 -0
  32. data/lib/ffaker/data/jo_jo/stands +149 -0
  33. data/lib/ffaker/data/job_tw/job_nouns +201 -0
  34. data/lib/ffaker/data/lorem_tw/words +789 -0
  35. data/lib/ffaker/date.rb +40 -0
  36. data/lib/ffaker/filesystem.rb +12 -2
  37. data/lib/ffaker/geolocation.rb +2 -2
  38. data/lib/ffaker/guid.rb +7 -1
  39. data/lib/ffaker/html_ipsum.rb +7 -1
  40. data/lib/ffaker/identification_br.rb +3 -12
  41. data/lib/ffaker/identification_ec.rb +39 -0
  42. data/lib/ffaker/identification_es_cl.rb +2 -2
  43. data/lib/ffaker/identification_es_co.rb +1 -1
  44. data/lib/ffaker/identification_fi.rb +73 -0
  45. data/lib/ffaker/identification_kr.rb +11 -4
  46. data/lib/ffaker/identification_mx.rb +1 -1
  47. data/lib/ffaker/identification_pl.rb +6 -6
  48. data/lib/ffaker/identification_tw.rb +4 -3
  49. data/lib/ffaker/image.rb +28 -4
  50. data/lib/ffaker/jo_jo.rb +24 -0
  51. data/lib/ffaker/job_tw.rb +12 -0
  52. data/lib/ffaker/lorem_ja.rb +1 -1
  53. data/lib/ffaker/lorem_ru.rb +1 -1
  54. data/lib/ffaker/lorem_tw.rb +40 -0
  55. data/lib/ffaker/movie.rb +1 -1
  56. data/lib/ffaker/name_fr.rb +4 -3
  57. data/lib/ffaker/name_pl.rb +3 -3
  58. data/lib/ffaker/number.rb +6 -2
  59. data/lib/ffaker/phone_number_de.rb +3 -3
  60. data/lib/ffaker/skill.rb +1 -1
  61. data/lib/ffaker/ssn.rb +4 -2
  62. data/lib/ffaker/ssn_se.rb +2 -2
  63. data/lib/ffaker/string.rb +7 -7
  64. data/lib/ffaker/time.rb +4 -4
  65. data/lib/ffaker/tweet.rb +1 -1
  66. data/lib/ffaker/utils/module_utils.rb +10 -20
  67. data/lib/ffaker/utils/unique_utils.rb +34 -21
  68. data/lib/ffaker/uuid.rb +175 -0
  69. data/lib/ffaker/vehicle.rb +63 -1
  70. data/lib/{version.rb → ffaker/version.rb} +1 -1
  71. data/lib/ffaker.rb +64 -190
  72. data/scripts/reference.rb +21 -21
  73. data/test/helper.rb +7 -9
  74. data/test/test_address_br.rb +15 -2
  75. data/test/test_address_da.rb +3 -3
  76. data/test/test_address_fi.rb +2 -2
  77. data/test/test_address_se.rb +2 -2
  78. data/test/test_address_ua.rb +1 -1
  79. data/test/test_animal_br.rb +17 -0
  80. data/test/test_array_utils.rb +1 -1
  81. data/test/test_avatar.rb +30 -7
  82. data/test/test_bank.rb +15 -1
  83. data/test/test_bank_us.rb +37 -0
  84. data/test/test_book.rb +29 -0
  85. data/test/test_boolean.rb +32 -1
  86. data/test/test_cheesy_lingo.rb +1 -1
  87. data/test/test_color.rb +3 -3
  88. data/test/test_crypto.rb +15 -0
  89. data/test/test_date.rb +47 -0
  90. data/test/test_filesystem.rb +30 -4
  91. data/test/test_freedom_ipsum.rb +1 -1
  92. data/test/test_gender_it.rb +1 -1
  93. data/test/test_gender_ja.rb +1 -1
  94. data/test/test_gender_jp.rb +1 -1
  95. data/test/test_gender_pl.rb +1 -1
  96. data/test/test_guid.rb +1 -1
  97. data/test/test_healthcare_ru.rb +1 -1
  98. data/test/test_hipster_ipsum.rb +1 -1
  99. data/test/test_html_ipsum.rb +6 -0
  100. data/test/test_identification.rb +12 -2
  101. data/test/test_identification_ec.rb +33 -0
  102. data/test/test_identification_es_mx.rb +3 -1
  103. data/test/test_identification_fi.rb +39 -0
  104. data/test/test_identification_it.rb +12 -1
  105. data/test/test_identification_kr.rb +3 -3
  106. data/test/test_image.rb +51 -5
  107. data/test/test_internet.rb +3 -1
  108. data/test/test_internet_se.rb +5 -2
  109. data/test/test_jo_jo.rb +29 -0
  110. data/test/test_job_tw.rb +21 -0
  111. data/test/test_lorem_br.rb +3 -3
  112. data/test/test_lorem_cn.rb +3 -3
  113. data/test/test_lorem_fr.rb +3 -3
  114. data/test/test_lorem_ie.rb +2 -2
  115. data/test/test_lorem_kr.rb +3 -3
  116. data/test/test_lorem_pl.rb +2 -2
  117. data/test/test_lorem_ru.rb +3 -3
  118. data/test/test_lorem_tw.rb +54 -0
  119. data/test/test_lorem_ua.rb +3 -3
  120. data/test/test_module_utils.rb +42 -0
  121. data/test/test_music.rb +4 -4
  122. data/test/test_name_da.rb +1 -1
  123. data/test/test_name_ph.rb +1 -1
  124. data/test/test_name_ru.rb +2 -2
  125. data/test/test_name_ua.rb +2 -2
  126. data/test/test_number.rb +14 -2
  127. data/test/test_phone_number_nl.rb +1 -1
  128. data/test/test_phone_number_se.rb +1 -1
  129. data/test/test_phone_number_sg.rb +8 -8
  130. data/test/test_ssn_se.rb +1 -1
  131. data/test/test_unique_utils.rb +29 -5
  132. data/test/test_units.rb +6 -6
  133. data/test/test_units_english.rb +15 -15
  134. data/test/test_units_metric.rb +15 -15
  135. data/test/test_uuid.rb +73 -0
  136. data/test/test_vehicle.rb +27 -1
  137. metadata +41 -245
@@ -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
@@ -17,8 +17,18 @@ module FFaker
17
17
  Lorem.words.join(directory_separator)
18
18
  end
19
19
 
20
- def file_name(dir = directory, name = Lorem.word.downcase,
21
- ext = extension, directory_separator = File::SEPARATOR)
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
@@ -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
- FFaker.hexify('########-####-####-####-############')
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
@@ -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
- format('%s.%s.%s-%s',
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
- format('%s.%s.%s/%s-%s',
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').split(//).zip(%w[3 2 7 6 5 4 3 2]).sum do |a, b|
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(/10/, 'k').gsub(/11/, '0')
26
+ (11 - (total % 11)).to_s.gsub('10', 'k').gsub('11', '0')
27
27
  end
28
28
  end
29
29
  end
@@ -32,7 +32,7 @@ module FFaker
32
32
  end
33
33
 
34
34
  def expedition_date
35
- today = Date.today
35
+ today = ::Date.today
36
36
  today - rand(today.year)
37
37
  end
38
38
  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 IdentificationKr
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)..Date.new(1999, 12, 31)).strftime('%y%d%m')
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}".split(//).map(&:to_i)
15
- checksum = (11 - (2 * a + 3 * b + 4 * c + 5 * d + 6 * e + 7 * f + 8 * g + 9 * h + 2 * i + 3 * j + 4 * k + 5 * l) % 11) % 10
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)].flatten.join
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}".split('').map(&:to_i)
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.split('').map(&:to_i)
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, o: 35, p: 23, q: 24, r: 25, s: 26, t: 27, u: 28, v: 29, w: 30, x: 31, y: 32, z: 33 }.freeze
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}".split(//).map(&:to_i)
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
- def url(size = '300x300', format = 'png', bg_color = :random, text_color = :random, text = nil)
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
- def file(size = '300x300', format = 'png', bg_color = :random, text_color = :random, text = nil)
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 =~ /\A\d+x\d+\z/
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
@@ -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
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module JobTW
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ def title
9
+ fetch_sample(JOB_NOUNS)
10
+ end
11
+ end
12
+ end
@@ -30,7 +30,7 @@ module FFaker
30
30
  end
31
31
 
32
32
  def paragraph(sentence_count = 3)
33
- sentences(sentence_count).join('、') + '、' + fetch_sample(SENTENCES_END) + ''
33
+ "#{sentences(sentence_count).join('、')}、#{fetch_sample(SENTENCES_END)}"
34
34
  end
35
35
 
36
36
  def paragraphs(count = 3)
@@ -50,7 +50,7 @@ module FFaker
50
50
  if CAPITAL_CHARS.include?(string[0])
51
51
  string
52
52
  else
53
- CAPITAL_CHARS[CHARS.index(string[0])] + string[1..-1]
53
+ CAPITAL_CHARS[CHARS.index(string[0])] + string[1..]
54
54
  end
55
55
  end
56
56
  end
@@ -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
@@ -37,7 +37,7 @@ module FFaker
37
37
  end
38
38
 
39
39
  def maybe_adj_or_adv
40
- fetch_sample(ADJ_AND_ADV) + ' ' if rand(0..1) == 1
40
+ "#{fetch_sample(ADJ_AND_ADV)} " if rand(0..1) == 1
41
41
  end
42
42
 
43
43
  def simple_title
@@ -25,9 +25,10 @@ module FFaker
25
25
 
26
26
  def name
27
27
  case rand(0..9)
28
- when 7 then "#{first_name} #{prefix} #{last_name}"
29
- when 5 then "#{first_name} #{prefix} #{last_name}"
30
- else "#{first_name} #{last_name}"
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
@@ -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 = %w[lic. inż. mgr mgr\ inż. dr dr\ hab. prof.].freeze
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.new('Digits cannot be less than 1') if digits < 1
25
+ raise ArgumentError, 'Digits cannot be less than 1' if digits < 1
22
26
 
23
- "#{fetch_sample(1..9)}#{"#" * (digits - 1)}"
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 = '1' + rand(5..7).to_s + rand(0..9).to_s
11
- mobile_prefix = '0' + mobile_prefix if leading_zero
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 = '0' + region_prefix if leading_zero
18
+ region_prefix = "0#{region_prefix}" if leading_zero
19
19
  region_prefix
20
20
  end
21
21
 
data/lib/ffaker/skill.rb CHANGED
@@ -14,7 +14,7 @@ module FFaker
14
14
  end
15
15
 
16
16
  def specialty
17
- format('%s %s', fetch_sample(SPECIALTY_START), fetch_sample(SPECIALTY_END))
17
+ "#{fetch_sample(SPECIALTY_START)} #{fetch_sample(SPECIALTY_END)}"
18
18
  end
19
19
 
20
20
  def specialties(num = 3)
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
- group_numbers = [first_group, second_group, third_group]
19
- format('%.3d-%.2d-%.4d', *group_numbers)
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)