ffaker 2.6.0 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
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