ffaker 2.6.0 → 2.7.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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +5 -0
  3. data/README.md +8 -0
  4. data/REFERENCE.md +21 -1
  5. data/Rakefile +1 -1
  6. data/ffaker.gemspec +6 -6
  7. data/lib/ffaker.rb +2 -2
  8. data/lib/ffaker/address.rb +9 -9
  9. data/lib/ffaker/address_au.rb +2 -2
  10. data/lib/ffaker/address_br.rb +2 -2
  11. data/lib/ffaker/address_ca.rb +2 -2
  12. data/lib/ffaker/address_da.rb +2 -2
  13. data/lib/ffaker/address_de.rb +2 -2
  14. data/lib/ffaker/address_fi.rb +1 -2
  15. data/lib/ffaker/address_fr.rb +1 -1
  16. data/lib/ffaker/address_gr.rb +2 -2
  17. data/lib/ffaker/address_id.rb +1 -1
  18. data/lib/ffaker/address_in.rb +3 -5
  19. data/lib/ffaker/address_kr.rb +9 -8
  20. data/lib/ffaker/address_mx.rb +2 -2
  21. data/lib/ffaker/address_nl.rb +1 -1
  22. data/lib/ffaker/address_pl.rb +5 -5
  23. data/lib/ffaker/address_ru.rb +1 -1
  24. data/lib/ffaker/address_ua.rb +3 -3
  25. data/lib/ffaker/address_us.rb +2 -2
  26. data/lib/ffaker/avatar.rb +1 -1
  27. data/lib/ffaker/book.rb +2 -2
  28. data/lib/ffaker/boolean.rb +1 -1
  29. data/lib/ffaker/cheesy_lingo.rb +2 -2
  30. data/lib/ffaker/color.rb +2 -2
  31. data/lib/ffaker/company.rb +6 -6
  32. data/lib/ffaker/company_cn.rb +2 -2
  33. data/lib/ffaker/company_it.rb +18 -2
  34. data/lib/ffaker/company_se.rb +4 -4
  35. data/lib/ffaker/data/company_it/piva_office_codes +99 -0
  36. data/lib/ffaker/education.rb +8 -8
  37. data/lib/ffaker/filesystem.rb +3 -3
  38. data/lib/ffaker/food.rb +1 -1
  39. data/lib/ffaker/gender.rb +1 -1
  40. data/lib/ffaker/gender_br.rb +1 -1
  41. data/lib/ffaker/gender_cn.rb +1 -1
  42. data/lib/ffaker/gender_id.rb +1 -1
  43. data/lib/ffaker/gender_kr.rb +1 -1
  44. data/lib/ffaker/html_ipsum.rb +4 -4
  45. data/lib/ffaker/identification.rb +1 -1
  46. data/lib/ffaker/identification_br.rb +1 -1
  47. data/lib/ffaker/identification_es.rb +1 -1
  48. data/lib/ffaker/identification_es_cl.rb +2 -2
  49. data/lib/ffaker/identification_es_co.rb +5 -5
  50. data/lib/ffaker/identification_mx.rb +4 -4
  51. data/lib/ffaker/internet.rb +9 -9
  52. data/lib/ffaker/internet_se.rb +6 -8
  53. data/lib/ffaker/job_fr.rb +2 -2
  54. data/lib/ffaker/lorem.rb +2 -2
  55. data/lib/ffaker/lorem_ar.rb +2 -2
  56. data/lib/ffaker/lorem_cn.rb +2 -2
  57. data/lib/ffaker/lorem_fr.rb +2 -2
  58. data/lib/ffaker/lorem_kr.rb +2 -2
  59. data/lib/ffaker/lorem_ru.rb +2 -2
  60. data/lib/ffaker/lorem_ua.rb +3 -3
  61. data/lib/ffaker/movie.rb +7 -7
  62. data/lib/ffaker/name.rb +4 -11
  63. data/lib/ffaker/name_br.rb +2 -2
  64. data/lib/ffaker/name_cs.rb +13 -11
  65. data/lib/ffaker/name_da.rb +3 -3
  66. data/lib/ffaker/name_de.rb +2 -2
  67. data/lib/ffaker/name_fr.rb +2 -4
  68. data/lib/ffaker/name_ga.rb +3 -10
  69. data/lib/ffaker/name_gr.rb +3 -3
  70. data/lib/ffaker/name_id.rb +2 -2
  71. data/lib/ffaker/name_it.rb +3 -6
  72. data/lib/ffaker/name_mx.rb +8 -8
  73. data/lib/ffaker/name_nb.rb +3 -4
  74. data/lib/ffaker/name_nl.rb +5 -5
  75. data/lib/ffaker/name_ph.rb +4 -6
  76. data/lib/ffaker/name_pl.rb +4 -4
  77. data/lib/ffaker/name_ru.rb +14 -12
  78. data/lib/ffaker/name_se.rb +3 -4
  79. data/lib/ffaker/name_sn.rb +13 -19
  80. data/lib/ffaker/name_ua.rb +1 -1
  81. data/lib/ffaker/nato_alphabet.rb +2 -2
  82. data/lib/ffaker/phone_number.rb +16 -16
  83. data/lib/ffaker/phone_number_au.rb +7 -7
  84. data/lib/ffaker/phone_number_br.rb +7 -7
  85. data/lib/ffaker/phone_number_ch.rb +7 -7
  86. data/lib/ffaker/phone_number_cu.rb +10 -10
  87. data/lib/ffaker/phone_number_de.rb +2 -2
  88. data/lib/ffaker/phone_number_fr.rb +4 -4
  89. data/lib/ffaker/phone_number_id.rb +1 -1
  90. data/lib/ffaker/phone_number_kr.rb +4 -4
  91. data/lib/ffaker/phone_number_mx.rb +2 -2
  92. data/lib/ffaker/phone_number_nl.rb +3 -3
  93. data/lib/ffaker/phone_number_se.rb +3 -3
  94. data/lib/ffaker/phone_number_sg.rb +1 -1
  95. data/lib/ffaker/phone_number_sn.rb +5 -5
  96. data/lib/ffaker/product.rb +9 -9
  97. data/lib/ffaker/ssn_se.rb +4 -4
  98. data/lib/ffaker/string.rb +3 -3
  99. data/lib/ffaker/time.rb +6 -1
  100. data/lib/ffaker/utils/module_utils.rb +5 -0
  101. data/lib/ffaker/utils/unique_utils.rb +45 -0
  102. data/lib/ffaker/vehicle.rb +5 -5
  103. data/scripts/reference.rb +1 -1
  104. data/test/test_address_gr.rb +5 -5
  105. data/test/test_address_ja.rb +2 -1
  106. data/test/test_address_kr.rb +1 -0
  107. data/test/test_array_utils.rb +3 -3
  108. data/test/test_color.rb +1 -1
  109. data/test/test_company_it.rb +5 -1
  110. data/test/test_identification_es_mx.rb +1 -1
  111. data/test/test_module_utils.rb +1 -1
  112. data/test/test_name_ar.rb +4 -6
  113. data/test/test_name_cs.rb +2 -2
  114. data/test/test_name_ja.rb +2 -2
  115. data/test/test_name_ru.rb +2 -2
  116. data/test/test_phone_number.rb +2 -2
  117. data/test/test_string.rb +1 -1
  118. data/test/test_time.rb +9 -1
  119. data/test/test_unique_utils.rb +54 -0
  120. metadata +6 -2
@@ -10,8 +10,8 @@ module FFaker
10
10
  extend self
11
11
 
12
12
  ZIP_FORMATS = ['#####', '#####-####'].freeze
13
- CONTINENTAL_STATE = (STATE - %w(Hawaii Alaska))
14
- CONTINENTAL_STATE_ABBR = (STATE_ABBR - %w(HI AK))
13
+ CONTINENTAL_STATE = (STATE - %w[Hawaii Alaska])
14
+ CONTINENTAL_STATE_ABBR = (STATE_ABBR - %w[HI AK])
15
15
 
16
16
  def zip_code
17
17
  FFaker.numerify(fetch_sample(ZIP_FORMATS))
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- SUPPORTED_FORMATS = %w(png jpg bmp).freeze
8
+ SUPPORTED_FORMATS = %w[png jpg bmp].freeze
9
9
 
10
10
  def image(slug = nil, size = '300x300', format = 'png', bgset = nil)
11
11
  raise ArgumentError, 'Size should be specified in format 300x300' unless size =~ /^[0-9]+x[0-9]+$/
@@ -6,7 +6,7 @@ module FFaker
6
6
  extend self
7
7
 
8
8
  def title
9
- case rand(2)
9
+ case rand(0..1)
10
10
  when 0 then simple_title
11
11
  when 1 then title_with_prefix
12
12
  end
@@ -21,7 +21,7 @@ module FFaker
21
21
  end
22
22
 
23
23
  def isbn
24
- (rand(24_000_000_000) + 1_000_000_000).to_s
24
+ rand(1_000_000_000...25_000_000_000).to_s
25
25
  end
26
26
 
27
27
  def description(sentence_count = 3)
@@ -6,7 +6,7 @@ module FFaker
6
6
  extend self
7
7
 
8
8
  def maybe
9
- case rand(2)
9
+ case rand(0..1)
10
10
  when 0 then true
11
11
  when 1 then false
12
12
  end
@@ -7,8 +7,8 @@ module FFaker
7
7
  extend ModuleUtils
8
8
  extend self
9
9
 
10
- TITLE_1 = %w(Sharp Soft Nutty Smokey Melting Cheeky Fat Dutch Grated Cheesed Milky).freeze
11
- TITLE_2 = %w(Gouda Affineurs Alpine Sheep Cows Brie Goats Coulommiers Dairy).freeze
10
+ TITLE_1 = %w[Sharp Soft Nutty Smokey Melting Cheeky Fat Dutch Grated Cheesed Milky].freeze
11
+ TITLE_2 = %w[Gouda Affineurs Alpine Sheep Cows Brie Goats Coulommiers Dairy].freeze
12
12
 
13
13
  def title
14
14
  "#{fetch_sample(TITLE_1)} #{fetch_sample(TITLE_2)}"
@@ -56,11 +56,11 @@ module FFaker
56
56
  end
57
57
 
58
58
  def random_hue_value
59
- rand(360)
59
+ rand(0..359)
60
60
  end
61
61
 
62
62
  def random_percentage_string
63
- "#{rand(100)}%"
63
+ "#{rand(0..99)}%"
64
64
  end
65
65
  end
66
66
  end
@@ -5,15 +5,15 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- SUFFIXES = %w(Inc and\ Sons LLC Group).freeze
9
- POSITION_PREFIXES = %w(Executive Assistant General Associate).freeze
10
- POSITIONS = %w(President Manager Director Secretary Consultant).freeze
8
+ SUFFIXES = %w[Inc and\ Sons LLC Group].freeze
9
+ POSITION_PREFIXES = %w[Executive Assistant General Associate].freeze
10
+ POSITIONS = %w[President Manager Director Secretary Consultant].freeze
11
11
 
12
12
  def name
13
- case rand(3)
13
+ case rand(0..2)
14
14
  when 0 then "#{Name.last_name} #{suffix}"
15
15
  when 1 then "#{Name.last_name}-#{Name.last_name}"
16
- when 2 then '%s, %s and %s' % [Name.last_name, Name.last_name, Name.last_name]
16
+ when 2 then format('%s, %s and %s', Name.last_name, Name.last_name, Name.last_name)
17
17
  end
18
18
  end
19
19
 
@@ -34,7 +34,7 @@ module FFaker
34
34
  end
35
35
 
36
36
  def position
37
- case rand(3)
37
+ case rand(0..2)
38
38
  when 0 then
39
39
  [fetch_sample(POSITION_PREFIXES), fetch_sample(POSITIONS)]
40
40
  when 1 then
@@ -5,8 +5,8 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- TYPES = %w(科技 食品 电器 教育 咨询 网络).freeze
9
- SUFFIXES = %w(有限公司 公司).freeze
8
+ TYPES = %w[科技 食品 电器 教育 咨询 网络].freeze
9
+ SUFFIXES = %w[有限公司 公司].freeze
10
10
 
11
11
  def name
12
12
  "#{NameCN.first_name}#{type}#{suffix}"
@@ -6,10 +6,10 @@ module FFaker
6
6
  extend self
7
7
 
8
8
  PREFIXES = ['Studio Legale', 'Studio Tecnico', 'Laboratorio'].freeze
9
- SUFFIXES = %w(S.p.a. s.r.l. s.n.c. Avvocati Architetti Ingegneri).freeze
9
+ SUFFIXES = %w[S.p.a. s.r.l. s.n.c. Avvocati Architetti Ingegneri].freeze
10
10
 
11
11
  def name
12
- case rand(2)
12
+ case rand(0..2)
13
13
  when 0 then "#{NameIT.last_name} #{suffix}"
14
14
  when 1 then "#{NameIT.last_name} e #{NameIT.last_name} #{suffix}"
15
15
  when 2 then "#{prefix} #{NameIT.last_name}"
@@ -23,5 +23,21 @@ module FFaker
23
23
  def prefix
24
24
  fetch_sample(PREFIXES)
25
25
  end
26
+
27
+ # Calculated using the algorithm at https://it.wikipedia.org/wiki/Partita_IVA
28
+ # to return a valid Partita IVA (Italian VAT number)
29
+ # @return a valid Italian VAT number (Partita IVA)
30
+ def partita_iva
31
+ matricola = Array.new(7) { rand(0..9) }
32
+ office_code = fetch_sample(PIVA_OFFICE_CODES)
33
+ base = matricola + office_code.chars.map(&:to_i)
34
+
35
+ # Thanks https://stackoverflow.com/a/9189731/1627766
36
+ sum = base.reverse.each_slice(2).flat_map { |x, y| [(x * 2).divmod(10), y || 0] }.flatten.reduce(:+)
37
+
38
+ control_digit = (10 - (sum % 10)) % 10
39
+
40
+ (base << control_digit).join
41
+ end
26
42
  end
27
43
  end
@@ -5,14 +5,14 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- SUFFIXES = %w(AB Aktiebolag Ab).freeze
8
+ SUFFIXES = %w[AB Aktiebolag Ab].freeze
9
9
 
10
10
  def name
11
- case rand(3)
11
+ case rand(0..3)
12
12
  when 0 then "#{NameSE.last_name} #{suffix}"
13
13
  when 1 then "#{NameSE.last_name}-#{NameSE.last_name}"
14
- when 1 then "#{NameSE.last_name}-#{NameSE.last_name} #{suffix}"
15
- when 2 then "#{NameSE.last_name}, #{NameSE.last_name} och #{NameSE.last_name}"
14
+ when 2 then "#{NameSE.last_name}-#{NameSE.last_name} #{suffix}"
15
+ when 3 then "#{NameSE.last_name}, #{NameSE.last_name} och #{NameSE.last_name}"
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,99 @@
1
+ 084
2
+ 006
3
+ 042
4
+ 007
5
+ 051
6
+ 044
7
+ 005
8
+ 064
9
+ 072
10
+ 025
11
+ 062
12
+ 016
13
+ 021
14
+ 017
15
+ 098
16
+ 074
17
+ 092
18
+ 085
19
+ 070
20
+ 061
21
+ 087
22
+ 079
23
+ 069
24
+ 013
25
+ 078
26
+ 019
27
+ 004
28
+ 086
29
+ 038
30
+ 048
31
+ 097
32
+ 071
33
+ 040
34
+ 060
35
+ 010
36
+ 099
37
+ 031
38
+ 053
39
+ 008
40
+ 094
41
+ 011
42
+ 059
43
+ 075
44
+ 049
45
+ 046
46
+ 043
47
+ 020
48
+ 045
49
+ 077
50
+ 083
51
+ 015
52
+ 096
53
+ 036
54
+ 063
55
+ 121
56
+ 003
57
+ 091
58
+ 028
59
+ 082
60
+ 034
61
+ 018
62
+ 054
63
+ 041
64
+ 068
65
+ 033
66
+ 050
67
+ 047
68
+ 093
69
+ 076
70
+ 088
71
+ 039
72
+ 080
73
+ 035
74
+ 058
75
+ 100
76
+ 029
77
+ 065
78
+ 090
79
+ 009
80
+ 052
81
+ 089
82
+ 014
83
+ 073
84
+ 067
85
+ 055
86
+ 001
87
+ 081
88
+ 022
89
+ 026
90
+ 032
91
+ 030
92
+ 012
93
+ 027
94
+ 002
95
+ 023
96
+ 024
97
+ 056
98
+ 888
99
+ 999
@@ -5,11 +5,11 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- MAJOR_ADJ = %w(Business Systems Industrial Medical Financial Marketing Political Social) + ['Human Resource']
9
- SCHOOL_PREFIX = %w(Green South North Wind Lake Hill Lark River Red White).freeze
10
- SCHOOL_ADJ = %w(International Global Polytechnic National).freeze
11
- SCHOOL_TYPE = %w(School University College Institution Academy).freeze
12
- SCHOOL_UNI = %w(University College).freeze
8
+ MAJOR_ADJ = %w[Business Systems Industrial Medical Financial Marketing Political Social] + ['Human Resource']
9
+ SCHOOL_PREFIX = %w[Green South North Wind Lake Hill Lark River Red White].freeze
10
+ SCHOOL_ADJ = %w[International Global Polytechnic National].freeze
11
+ SCHOOL_TYPE = %w[School University College Institution Academy].freeze
12
+ SCHOOL_UNI = %w[University College].freeze
13
13
 
14
14
  def degree_short
15
15
  "#{fetch_sample(DEGREE_SHORT_PREFIX)} in #{major}"
@@ -28,15 +28,15 @@ module FFaker
28
28
  end
29
29
 
30
30
  def school_generic_name
31
- case rand(2)
31
+ case rand(0..1)
32
32
  when 0 then fetch_sample(AddressUS::STATE)
33
33
  when 1 then school_name
34
34
  end
35
35
  end
36
36
 
37
37
  def school
38
- case rand(5)
39
- when (0..1) then
38
+ case rand(0..4)
39
+ when 0, 1 then
40
40
  "#{school_name} #{fetch_sample(SCHOOL_TYPE)}"
41
41
  when 2 then
42
42
  "#{school_generic_name} #{fetch_sample(SCHOOL_ADJ)} #{fetch_sample(SCHOOL_TYPE)}"
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- SLUG_DELIMITERS = %w(- _ .).freeze
8
+ SLUG_DELIMITERS = %w[- _ .].freeze
9
9
 
10
10
  def extension
11
11
  fetch_sample(EXTENSION)
@@ -16,8 +16,8 @@ module FFaker
16
16
  end
17
17
 
18
18
  def file_name(dir = nil, name = nil, ext = nil, directory_separator = '/')
19
- dir = Internet.slug unless dir
20
- name = Lorem.word.downcase unless name
19
+ dir ||= Internet.slug
20
+ name ||= Lorem.word.downcase
21
21
  ext ||= extension
22
22
  [dir, name].join(directory_separator) + ".#{ext}"
23
23
  end
@@ -4,7 +4,7 @@ module FFaker
4
4
  extend self
5
5
 
6
6
  def ingredient
7
- send(%w(vegetable fruit meat herb_or_spice)[rand 4])
7
+ send(%w[vegetable fruit meat herb_or_spice][rand 4])
8
8
  end
9
9
 
10
10
  def vegetable
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- GENDERS = %w(male female).freeze
8
+ GENDERS = %w[male female].freeze
9
9
 
10
10
  def random
11
11
  fetch_sample(GENDERS)
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- GENDERS = %w(feminino masculino).freeze
8
+ GENDERS = %w[feminino masculino].freeze
9
9
 
10
10
  def random
11
11
  fetch_sample(GENDERS)
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- GENDERS = %w(男 女).freeze
8
+ GENDERS = %w[男 女].freeze
9
9
 
10
10
  def random
11
11
  fetch_sample(GENDERS)
@@ -6,7 +6,7 @@ module FFaker
6
6
  extend ModuleUtils
7
7
  extend self
8
8
 
9
- GENDERS = %w(laki-laki perempuan).freeze
9
+ GENDERS = %w[laki-laki perempuan].freeze
10
10
 
11
11
  def random
12
12
  fetch_sample(GENDERS)
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- GENDERS = %w(남 녀).freeze
8
+ GENDERS = %w[남 녀].freeze
9
9
 
10
10
  def random
11
11
  fetch_sample(GENDERS)
@@ -96,13 +96,13 @@ module FFaker
96
96
 
97
97
  def body
98
98
  body = content_tag_for(:h1, words(2).capitalize)
99
- rand(4).times do
99
+ rand(0..3).times do
100
100
  body << content_tag_for(:p, fancy_string)
101
101
  end
102
- body << table(rand(4))
102
+ body << table(rand(0..3))
103
103
  body << content_tag_for(:h2, words(2).capitalize)
104
104
  body << content_tag_for(:ol) do |ol|
105
- rand(4).times do
105
+ rand(0..3).times do
106
106
  ol << content_tag_for(:li, paragraph(1))
107
107
  end
108
108
  end
@@ -111,7 +111,7 @@ module FFaker
111
111
  end
112
112
  body << content_tag_for(:h3, words(2).capitalize!)
113
113
  body << content_tag_for(:ul) do |ul|
114
- rand(4).times do
114
+ rand(0..3).times do
115
115
  ul << content_tag_for(:li, paragraph(1))
116
116
  end
117
117
  end
@@ -6,7 +6,7 @@ module FFaker
6
6
  extend self
7
7
 
8
8
  ETHNICITIES = ['African American', 'Asian/Pacific Islander', 'Caucasian', 'Hispanic', 'Native American', 'Multiracial', 'Other', 'Prefer not to respond'].freeze
9
- GENDERS = %w(Male Female).freeze
9
+ GENDERS = %w[Male Female].freeze
10
10
 
11
11
  def drivers_license
12
12
  FFaker.bothify('?###-###-##-###-#').upcase
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- GENDERS = %w(Feminino Masculino).freeze
8
+ GENDERS = %w[Feminino Masculino].freeze
9
9
  CPF_VERIFICATION_MULTIPLIERS = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2].freeze
10
10
  CNPJ_VERIFICATION_MULTIPLIERS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2].freeze
11
11
 
@@ -5,7 +5,7 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- GENDERS = %w(Hombre Mujer).freeze
8
+ GENDERS = %w[Hombre Mujer].freeze
9
9
 
10
10
  def gender
11
11
  fetch_sample(GENDERS)
@@ -14,14 +14,14 @@ module FFaker
14
14
  # The last Y is a modulo 11 validation code. In the case the result is 10, it will be replaced by a 'K' character
15
15
  def rut
16
16
  # Rut is gonna be between 1.000.000 and 24.999.999
17
- n = rand(24_000_000) + 1_000_000
17
+ n = rand(1_000_000...25_000_000)
18
18
  "#{n}-#{dv(n)}"
19
19
  end
20
20
 
21
21
  private
22
22
 
23
23
  def dv(rut)
24
- total = rut.to_s.rjust(8, '0').split(//).zip(%w(3 2 7 6 5 4 3 2)).collect { |a, b| a.to_i * b.to_i }.inject(:+)
24
+ total = rut.to_s.rjust(8, '0').split(//).zip(%w[3 2 7 6 5 4 3 2]).collect { |a, b| a.to_i * b.to_i }.inject(:+)
25
25
  (11 - total % 11).to_s.gsub(/10/, 'k').gsub(/11/, '0')
26
26
  end
27
27
  end