faker 1.2.0 → 1.3.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 +7 -0
- data/History.txt +3 -0
- data/README.md +279 -2
- data/lib/faker.rb +11 -2
- data/lib/faker/avatar.rb +10 -0
- data/lib/faker/bitcoin.rb +36 -0
- data/lib/faker/commerce.rb +5 -0
- data/lib/faker/company.rb +4 -4
- data/lib/faker/finance.rb +26 -0
- data/lib/faker/internet.rb +16 -6
- data/lib/faker/lorem.rb +5 -2
- data/lib/faker/name.rb +4 -4
- data/lib/faker/number.rb +7 -1
- data/lib/faker/phone_number.rb +36 -1
- data/lib/faker/team.rb +20 -0
- data/lib/faker/version.rb +1 -1
- data/lib/locales/de-at.yml +49 -0
- data/lib/locales/en-au.yml +2 -2
- data/lib/locales/en-gb.yml +1 -1
- data/lib/locales/en-ind.yml +1 -1
- data/lib/locales/en-nep.yml +39 -0
- data/lib/locales/en-us.yml +24 -0
- data/lib/locales/en.yml +56 -3
- data/lib/locales/es.yml +3 -3
- data/lib/locales/fa.yml +6 -0
- data/lib/locales/fr.yml +1 -1
- data/lib/locales/it.yml +59 -0
- data/lib/locales/ko.yml +37 -0
- data/lib/locales/pl.yml +3 -3
- data/lib/locales/ru.yml +43 -0
- data/test/test_avatar.rb +15 -0
- data/test/test_en_locale.rb +18 -0
- data/test/test_en_us_locale.rb +43 -0
- data/test/test_faker_bitcoin.rb +9 -0
- data/test/test_faker_commerce.rb +28 -0
- data/test/test_faker_internet.rb +31 -0
- data/test/test_faker_lorem.rb +10 -0
- data/test/test_faker_number.rb +12 -3
- data/test/test_faker_team.rb +13 -0
- data/test/test_pl_locale.rb +24 -0
- metadata +38 -24
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 3d19e0ae93b8e3a78433a69f98761d341068c3b4
|
4
|
+
data.tar.gz: 36db9a564fafae8bc5a93470dbe2204f5fdc63ea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a3e8c0b6aaed5907213c3632fecc7c34d72fb4c38c4c28d67e11c1f2af5c9d205ffd91460ee03b7d8b17b55946394ba4a83b6a219ebdf49251c84608879abcaf
|
7
|
+
data.tar.gz: b27e7a2d35c183f968a313de2667850e75aff6f849f6846d48f892767b800a7dc788beceb2e462b3295dcccecf52d400342f75bcadb70429a49b46330ded0a1b
|
data/History.txt
CHANGED
data/README.md
CHANGED
@@ -11,10 +11,10 @@ development.
|
|
11
11
|
Installing
|
12
12
|
----------
|
13
13
|
```bash
|
14
|
-
|
14
|
+
gem install faker
|
15
15
|
```
|
16
16
|
|
17
|
-
Usage
|
17
|
+
##Usage
|
18
18
|
-----
|
19
19
|
```ruby
|
20
20
|
Faker::Name.name #=> "Christophe Bartell"
|
@@ -22,6 +22,283 @@ Faker::Name.name #=> "Christophe Bartell"
|
|
22
22
|
Faker::Internet.email #=> "kirsten.greenholt@corkeryfisher.info"
|
23
23
|
```
|
24
24
|
|
25
|
+
###Faker::Address
|
26
|
+
-----------------
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Faker::Address.city #=> "Imogeneborough"
|
30
|
+
|
31
|
+
Faker::Address.street_name #=> "Larkin Fork"
|
32
|
+
|
33
|
+
Faker::Address.street_address #=> "282 Kevin Brook"
|
34
|
+
|
35
|
+
Faker::Address.secondary_address #=> "Apt. 672"
|
36
|
+
|
37
|
+
Faker::Address.building_number #=> "7304"
|
38
|
+
|
39
|
+
Faker::Address.zip_code #=> "58517"
|
40
|
+
|
41
|
+
Faker::Address.zip #=> "58517"
|
42
|
+
|
43
|
+
Faker::Address.postcode #=> "58517"
|
44
|
+
|
45
|
+
Faker::Address.time_zone #=> "Asia/Yakutsk"
|
46
|
+
|
47
|
+
Faker::Address.street_suffix #=> "Street"
|
48
|
+
|
49
|
+
Faker::Address.city_suffix #=> "fort"
|
50
|
+
|
51
|
+
Faker::Address.city_prefix #=> "Lake"
|
52
|
+
|
53
|
+
Faker::Address.state_abbr #=> "AP"
|
54
|
+
|
55
|
+
Faker::Address.state #=> "California"
|
56
|
+
|
57
|
+
Faker::Address.country #=> "French Guiana"
|
58
|
+
|
59
|
+
Faker::Address.latitude #=> "-58.17256227443719"
|
60
|
+
|
61
|
+
Faker::Address.longitude #=> "-156.65548382095133"
|
62
|
+
|
63
|
+
|
64
|
+
```
|
65
|
+
|
66
|
+
###Faker::Bitcoin
|
67
|
+
-----------------
|
68
|
+
|
69
|
+
```ruby
|
70
|
+
|
71
|
+
Faker::Bitcoin.address #=> "1HUoGjmgChmnxxYhz87YytV4gVjfPaExmh"
|
72
|
+
|
73
|
+
```
|
74
|
+
|
75
|
+
###Faker::Business
|
76
|
+
------------------
|
77
|
+
|
78
|
+
```ruby
|
79
|
+
|
80
|
+
Faker::Business.credit_card_number #=> "1228-1221-1221-1431"
|
81
|
+
|
82
|
+
Faker::Business.credit_card_expiry_date #=> <Date: 2015-11-11 ((2457338j,0s,0n),+0s,2299161j)>
|
83
|
+
|
84
|
+
Faker::Business.credit_card_type #=> "visa"
|
85
|
+
|
86
|
+
```
|
87
|
+
|
88
|
+
###Faker::Code
|
89
|
+
--------------
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
|
93
|
+
Faker::Code.isbn #=> "759021701-8"
|
94
|
+
|
95
|
+
```
|
96
|
+
|
97
|
+
###Faker::Commerce
|
98
|
+
------------------
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
|
102
|
+
Faker::Commerce.color #=> "lavender"
|
103
|
+
|
104
|
+
Faker::Commerce.department #=> "Grocery, Health & Beauty"
|
105
|
+
|
106
|
+
Faker::Commerce.product_name #=> "Practical Granite Shirt"
|
107
|
+
|
108
|
+
```
|
109
|
+
|
110
|
+
###Faker::Company
|
111
|
+
-----------------
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
|
115
|
+
Faker::Company.name #=> "Hirthe-Ritchie"
|
116
|
+
|
117
|
+
Faker::Company.suffix #=> "Group"
|
118
|
+
|
119
|
+
# Generate a buzzword-laden catch phrase.
|
120
|
+
Faker::Company.catch_phrase #=> "Business-focused coherent parallelism"
|
121
|
+
|
122
|
+
# When a straight answer won't do, BS to the rescue!
|
123
|
+
Faker::Company.bs #=> "empower one-to-one web-readiness"
|
124
|
+
|
125
|
+
Faker::Company.duns_number #=> "08-341-3736"
|
126
|
+
|
127
|
+
```
|
128
|
+
|
129
|
+
|
130
|
+
###Faker::Internet
|
131
|
+
---------------
|
132
|
+
|
133
|
+
```ruby
|
134
|
+
# Optional argument name=nil
|
135
|
+
Faker::Internet.email #=> "eliza@mann.net"
|
136
|
+
|
137
|
+
Faker::Internet.email('Nancy') #=> "nancy@terry.biz"
|
138
|
+
|
139
|
+
# Optional argument name=nil
|
140
|
+
Faker::Internet.free_email #=> "freddy@gmail.com"
|
141
|
+
|
142
|
+
Faker::Internet.free_email('Nancy') #=> "nancy@yahoo.com"
|
143
|
+
|
144
|
+
# Optional argument name=nil
|
145
|
+
Faker::Internet.safe_email #=> "christelle@example.org"
|
146
|
+
|
147
|
+
Faker::Internet.safe_email('Nancy') #=> "nancy@example.net"
|
148
|
+
|
149
|
+
# Optional arguments specifier=nil, separators=%w(. _)
|
150
|
+
Faker::Internet.user_name #=> "alexie"
|
151
|
+
|
152
|
+
Faker::Internet.user_name('Nancy') #=> "nancy"
|
153
|
+
|
154
|
+
Faker::Internet.user_name('Nancy Johnson', %w(. _ -)) #=> "johnson-nancy"
|
155
|
+
|
156
|
+
# Optional argument min_length=0
|
157
|
+
Faker::Internet.password #=> "doloremquealiquidrerum"
|
158
|
+
|
159
|
+
Faker::Internet.password(8) #=> "consecteturadasperiores"
|
160
|
+
|
161
|
+
Faker::Internet.domain_name #=> "effertz.info"
|
162
|
+
|
163
|
+
Faker::Internet.fix_umlauts('äöüß') #=> "aeoeuess"
|
164
|
+
|
165
|
+
Faker::Internet.domain_word #=> "haleyziemann"
|
166
|
+
|
167
|
+
Faker::Internet.domain_suffix #=> "info"
|
168
|
+
|
169
|
+
Faker::Internet.ip_v4_address #=> "24.29.18.175"
|
170
|
+
|
171
|
+
Faker::Internet.ip_v6_address #=> "ac5f:d696:3807:1d72:2eb5:4e81:7d2b:e1df"
|
172
|
+
|
173
|
+
# Optional arguments: host=domain_name, path="/#{user_name}"
|
174
|
+
Faker::Internet.url #=> "http://thiel.com/chauncey_simonis"
|
175
|
+
Faker::Internet.url('example.com') #=> "http://example.com/clotilde.swift"
|
176
|
+
Faker::Internet.url('example.com', '/foobar.html') #=> "http://example.com/foobar.html"
|
177
|
+
|
178
|
+
# Optional arguments: words=nil, glue=nil
|
179
|
+
Faker::Internet.slug #=> "pariatur_laudantium"
|
180
|
+
Faker::Internet.slug('foo bar') #=> "foo.bar"
|
181
|
+
Faker::Internet.slug('foo bar', '-') #=> "foo-bar"
|
182
|
+
|
183
|
+
|
184
|
+
```
|
185
|
+
|
186
|
+
###Faker::Lorem
|
187
|
+
---------------
|
188
|
+
|
189
|
+
```ruby
|
190
|
+
|
191
|
+
Faker::Lorem.word #=> "repellendus"
|
192
|
+
|
193
|
+
# Optional arguments: num=3, supplemental=false
|
194
|
+
Faker::Lorem.words #=> ["dolores", "adipisci", "nesciunt"]
|
195
|
+
Faker::Lorem.words(4) #=> ["culpa", "recusandae", "aut", "omnis"]
|
196
|
+
Faker::Lorem.words(4, true) #=> ["colloco", "qui", "vergo", "deporto"]
|
197
|
+
|
198
|
+
# Optional arguments: char_count=255
|
199
|
+
Faker::Lorem.characters #=> "uw1ep04lhs0c4d931n1jmrspprf5wrj85fefue0y7y6m56b6omquh7br7dhqijwlawejpl765nb1716idmp3xnfo85v349pzy2o9rir23y2qhflwr71c1585fnynguiphkjm8p0vktwitcsm16lny7jzp9t4drwav3qmhz4yjq4k04x14gl6p148hulyqioo72tf8nwrxxcclfypz2lc58lsibgfe5w5p0xv95peafjjmm2frkhdc6duoky0aha"
|
200
|
+
Faker::Lorem.characters(10) #=> "ang9cbhoa8"
|
201
|
+
|
202
|
+
# Optional arguments: word_count=4, supplemental=false, random_words_to_add=6
|
203
|
+
Faker::Lorem.sentence #=> "Dolore illum animi et neque accusantium."
|
204
|
+
Faker::Lorem.sentence(3) #=> "Commodi qui minus deserunt sed vero quia."
|
205
|
+
Faker::Lorem.sentence(3, true) #=> "Inflammatio denego necessitatibus caelestis autus illum."
|
206
|
+
Faker::Lorem.sentence(3, false, 4) #=> "Aut voluptatem illum fugit ut sit."
|
207
|
+
Faker::Lorem.sentence(3, true, 4) #=> "Accusantium tantillus dolorem timor."
|
208
|
+
|
209
|
+
# Optional arguments: sentence_count=3, supplemental=false
|
210
|
+
Faker::Lorem.sentences #=> ["Vero earum commodi soluta.", "Quaerat fuga cumque et vero eveniet omnis ut.", "Cumque sit dolor ut est consequuntur."]
|
211
|
+
Faker::Lorem.sentences(1) #=> ["Ut perspiciatis explicabo possimus doloribus enim quia."]
|
212
|
+
Faker::Lorem.sentences(1, true) #=> ["Quis capillus curo ager veritatis voro et ipsum."]
|
213
|
+
|
214
|
+
# Optional arguments: sentence_count=3, supplemental=false, random_sentences_to_add=3
|
215
|
+
Faker::Lorem.paragraph #=> "Neque dicta enim quasi. Qui corrupti est quisquam. Facere animi quod aut. Qui nulla consequuntur consectetur sapiente."
|
216
|
+
Faker::Lorem.paragraph(2) #=> "Illo qui voluptas. Id sit quaerat enim aut cupiditate voluptates dolorum. Porro necessitatibus numquam dolor quia earum."
|
217
|
+
Faker::Lorem.paragraph(2, true) #=> ""
|
218
|
+
Faker::Lorem.paragraph(2, false, 4) #=> ""
|
219
|
+
Faker::Lorem.paragraph(2, true, 4) #=> ""
|
220
|
+
|
221
|
+
# Optional arguments: paragraph_count=3, supplemental=false
|
222
|
+
Faker::Lorem.paragraphs #=> ""
|
223
|
+
Faker::Lorem.paragraphs(1) #=> ""
|
224
|
+
Faker::Lorem.paragraphs(1, true) #=> ""
|
225
|
+
|
226
|
+
```
|
227
|
+
|
228
|
+
###Faker::Name
|
229
|
+
--------------
|
230
|
+
|
231
|
+
```ruby
|
232
|
+
|
233
|
+
Faker::Name.name #=> "Tyshawn Johns Sr."
|
234
|
+
|
235
|
+
Faker::Name.first_name #=> "Kaci"
|
236
|
+
|
237
|
+
Faker::Name.last_name #=> "Ernser"
|
238
|
+
|
239
|
+
Faker::Name.prefix #=> "Mr."
|
240
|
+
|
241
|
+
Faker::Name.suffix #=> "IV"
|
242
|
+
|
243
|
+
Faker::Name.title #=> "Legacy Creative Director"
|
244
|
+
|
245
|
+
```
|
246
|
+
|
247
|
+
###Faker::Number
|
248
|
+
----------------
|
249
|
+
|
250
|
+
```ruby
|
251
|
+
|
252
|
+
# Required parameter: digits
|
253
|
+
Faker::Number.number(10) #=> "1968353479"
|
254
|
+
|
255
|
+
Faker::Number.digit #=> "1"
|
256
|
+
|
257
|
+
```
|
258
|
+
|
259
|
+
###Faker::PhoneNumber
|
260
|
+
---------------------
|
261
|
+
|
262
|
+
Phone numbers may be in any of the following formats:
|
263
|
+
|
264
|
+
* 333-333-3333
|
265
|
+
* (333) 333-3333
|
266
|
+
* 1-333-333-3333
|
267
|
+
* 333.333.3333
|
268
|
+
* 333-333-3333
|
269
|
+
* 333-333-3333 x3333
|
270
|
+
* (333) 333-3333 x3333
|
271
|
+
* 1-333-333-3333 x3333
|
272
|
+
* 333.333.3333 x3333
|
273
|
+
|
274
|
+
(Don't let the example output below fool you - any format can be returned at random.)
|
275
|
+
|
276
|
+
```ruby
|
277
|
+
|
278
|
+
Faker::PhoneNumber.phone_number #=> "397.693.1309"
|
279
|
+
|
280
|
+
Faker::PhoneNumber.cell_phone #=> "(186)285-7925"
|
281
|
+
|
282
|
+
# NOTE NOTE NOTE NOTE
|
283
|
+
# For the 'US only' methods below, first you must do the following:
|
284
|
+
Faker::Config.locale = 'en-us'
|
285
|
+
|
286
|
+
# US only
|
287
|
+
Faker::PhoneNumber.area_code #=> "201"
|
288
|
+
|
289
|
+
# US only
|
290
|
+
Faker::PhoneNumber.exchange_code #=> "208"
|
291
|
+
|
292
|
+
# Optional parameter: length=4
|
293
|
+
Faker::PhoneNumber.subscriber_number #=> "3873"
|
294
|
+
|
295
|
+
Faker::PhoneNumber.subscriber_number(2) #=> "39"
|
296
|
+
|
297
|
+
Faker::PhoneNumber.extension #=> "3764"
|
298
|
+
|
299
|
+
```
|
300
|
+
|
301
|
+
|
25
302
|
Customization
|
26
303
|
------------
|
27
304
|
Since you may want to make addresses and other types of data look different
|
data/lib/faker.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
1
2
|
mydir = File.expand_path(File.dirname(__FILE__))
|
2
3
|
|
3
4
|
begin
|
@@ -91,14 +92,18 @@ module Faker
|
|
91
92
|
# into method calls that can be used to generate a
|
92
93
|
# formatted translation: e.g., "#{first_name} #{last_name}".
|
93
94
|
def parse(key)
|
94
|
-
fetch(key).scan(
|
95
|
+
fetch(key).scan(/(\(?)#\{([A-Za-z]+\.)?([^\}]+)\}([^#]+)?/).map {|prefix, kls, meth, etc|
|
95
96
|
# If the token had a class Prefix (e.g., Name.first_name)
|
96
97
|
# grab the constant, otherwise use self
|
97
98
|
cls = kls ? Faker.const_get(kls.chop) : self
|
98
99
|
|
100
|
+
# If an optional leading parentheses is not present, prefix.should == "", otherwise prefix.should == "("
|
101
|
+
# In either case the information will be retained for reconstruction of the string.
|
102
|
+
text = prefix
|
103
|
+
|
99
104
|
# If the class has the method, call it, otherwise
|
100
105
|
# fetch the transation (i.e., faker.name.first_name)
|
101
|
-
text
|
106
|
+
text += cls.respond_to?(meth) ? cls.send(meth) : fetch("#{(kls || self).to_s.split('::').last.downcase}.#{meth.downcase}")
|
102
107
|
|
103
108
|
# And tack on spaces, commas, etc. left over in the string
|
104
109
|
text += etc.to_s
|
@@ -146,14 +151,18 @@ end
|
|
146
151
|
require 'faker/address'
|
147
152
|
require 'faker/code'
|
148
153
|
require 'faker/company'
|
154
|
+
require 'faker/finance'
|
149
155
|
require 'faker/internet'
|
150
156
|
require 'faker/lorem'
|
151
157
|
require 'faker/name'
|
158
|
+
require 'faker/team'
|
152
159
|
require 'faker/phone_number'
|
153
160
|
require 'faker/business'
|
154
161
|
require 'faker/commerce'
|
155
162
|
require 'faker/version'
|
156
163
|
require 'faker/number'
|
164
|
+
require 'faker/bitcoin'
|
165
|
+
require 'faker/avatar'
|
157
166
|
|
158
167
|
require 'extensions/array'
|
159
168
|
require 'extensions/symbol'
|
data/lib/faker/avatar.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
module Faker
|
4
|
+
class Bitcoin < Base
|
5
|
+
class << self
|
6
|
+
|
7
|
+
def address
|
8
|
+
hash = rand(2**160).to_s(16)
|
9
|
+
version = 0
|
10
|
+
packed = version.chr + [hash].pack("H*")
|
11
|
+
checksum = Digest::SHA2.digest(Digest::SHA2.digest(packed))[0..3]
|
12
|
+
base58(packed + checksum)
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def base58(str)
|
18
|
+
alphabet = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
|
19
|
+
base = alphabet.size
|
20
|
+
|
21
|
+
lv = 0
|
22
|
+
str.split('').reverse.each_with_index { |v,i| lv += v.unpack('C')[0] * 256**i }
|
23
|
+
|
24
|
+
ret = ''
|
25
|
+
while lv > 0 do
|
26
|
+
lv, mod = lv.divmod(base)
|
27
|
+
ret << alphabet[mod]
|
28
|
+
end
|
29
|
+
|
30
|
+
npad = str.match(/^#{0.chr}*/)[0].to_s.size
|
31
|
+
'1'*npad + ret.reverse
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
data/lib/faker/commerce.rb
CHANGED
@@ -13,6 +13,11 @@ module Faker
|
|
13
13
|
def product_name
|
14
14
|
fetch('commerce.product_name.adjective') + ' ' + fetch('commerce.product_name.material') + ' ' + fetch('commerce.product_name.product')
|
15
15
|
end
|
16
|
+
|
17
|
+
def price
|
18
|
+
random = Random.new
|
19
|
+
(random.rand(0..100.0) * 100).floor/100.0
|
20
|
+
end
|
16
21
|
end
|
17
22
|
end
|
18
23
|
end
|
data/lib/faker/company.rb
CHANGED
@@ -6,16 +6,16 @@ module Faker
|
|
6
6
|
def name
|
7
7
|
parse('company.name')
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
def suffix
|
11
11
|
fetch('company.suffix')
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
# Generate a buzzword-laden catch phrase.
|
15
15
|
def catch_phrase
|
16
16
|
translate('faker.company.buzzwords').collect {|list| list.sample }.join(' ')
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
# When a straight answer won't do, BS to the rescue!
|
20
20
|
def bs
|
21
21
|
translate('faker.company.bs').collect {|list| list.sample }.join(' ')
|
@@ -25,6 +25,6 @@ module Faker
|
|
25
25
|
('%09d' % rand(10 ** 9)).gsub(/(\d\d)(\d\d\d)(\d\d\d\d)/, '\\1-\\2-\\3')
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
end
|
30
30
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Faker
|
2
|
+
class Finance < Base
|
3
|
+
CREDIT_CARD_TYPES = [ :visa, :mastercard, :discover, :american_express, :diners_club, :jcb, :switch, :solo, :dankort, :maestro, :forbrugsforeningen, :laser ]
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def credit_card(*types)
|
7
|
+
types = CREDIT_CARD_TYPES if types.empty?
|
8
|
+
type = types.sample
|
9
|
+
template = numerify(fetch("credit_card.#{type}"))
|
10
|
+
|
11
|
+
# calculate the luhn checksum digit
|
12
|
+
multiplier = 1
|
13
|
+
luhn_sum = template.gsub(/[^0-9]/, '').split('').reverse.map(&:to_i).inject(0) do |sum, digit|
|
14
|
+
multiplier = (multiplier == 2 ? 1 : 2)
|
15
|
+
sum + (digit * multiplier).to_s.split('').map(&:to_i).inject(0) { |digit_sum, cur| digit_sum + cur }
|
16
|
+
end
|
17
|
+
# the sum plus whatever the last digit is must be a multiple of 10. So, the
|
18
|
+
# last digit must be 10 - the last digit of the sum.
|
19
|
+
luhn_digit = (10 - (luhn_sum % 10)) % 10
|
20
|
+
|
21
|
+
template.gsub! 'L', luhn_digit.to_s
|
22
|
+
template
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|