faker 1.6.3 → 1.6.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/History.txt +13 -0
  3. data/README.md +185 -23
  4. data/lib/faker.rb +20 -0
  5. data/lib/faker/app.rb +1 -1
  6. data/lib/faker/beer.rb +1 -1
  7. data/lib/faker/chuck_norris.rb +16 -0
  8. data/lib/faker/code.rb +59 -0
  9. data/lib/faker/company.rb +19 -0
  10. data/lib/faker/crypto.rb +19 -0
  11. data/lib/faker/date.rb +30 -2
  12. data/lib/faker/educator.rb +23 -0
  13. data/lib/faker/file.rb +23 -0
  14. data/lib/faker/internet.rb +24 -15
  15. data/lib/faker/lorem.rb +21 -7
  16. data/lib/faker/music.rb +21 -0
  17. data/lib/faker/name.rb +7 -0
  18. data/lib/faker/placeholdit.rb +3 -3
  19. data/lib/faker/space.rb +54 -0
  20. data/lib/faker/time.rb +7 -18
  21. data/lib/faker/vehicle.rb +37 -0
  22. data/lib/faker/version.rb +1 -1
  23. data/lib/faker/yoda.rb +10 -0
  24. data/lib/locales/de.yml +26 -8
  25. data/lib/locales/en-GB.yml +1 -1
  26. data/lib/locales/en-PAK.yml +17 -0
  27. data/lib/locales/en.yml +195 -4
  28. data/lib/locales/es-MX.yml +82 -0
  29. data/lib/locales/es.yml +4 -0
  30. data/lib/locales/fr.yml +7 -4
  31. data/lib/locales/pt-BR.yml +51 -23
  32. metadata +13 -103
  33. data/test/test_array_sample_method_compat.rb +0 -56
  34. data/test/test_avatar.rb +0 -43
  35. data/test/test_ca_cat_locale.rb +0 -35
  36. data/test/test_ca_locale.rb +0 -22
  37. data/test/test_da_dk_locale.rb +0 -32
  38. data/test/test_en_au_locale.rb +0 -24
  39. data/test/test_en_au_ocker_locale.rb +0 -25
  40. data/test/test_en_ca_locale.rb +0 -18
  41. data/test/test_en_locale.rb +0 -35
  42. data/test/test_en_nz_locale.rb +0 -33
  43. data/test/test_en_ug_locale.rb +0 -23
  44. data/test/test_en_us_locale.rb +0 -89
  45. data/test/test_es_locale.rb +0 -34
  46. data/test/test_faker.rb +0 -29
  47. data/test/test_faker_app.rb +0 -12
  48. data/test/test_faker_beer.rb +0 -41
  49. data/test/test_faker_bitcoin.rb +0 -14
  50. data/test/test_faker_book.rb +0 -24
  51. data/test/test_faker_boolean.rb +0 -23
  52. data/test/test_faker_business.rb +0 -34
  53. data/test/test_faker_cat.rb +0 -20
  54. data/test/test_faker_city.rb +0 -52
  55. data/test/test_faker_code.rb +0 -35
  56. data/test/test_faker_color.rb +0 -50
  57. data/test/test_faker_commerce.rb +0 -84
  58. data/test/test_faker_company.rb +0 -34
  59. data/test/test_faker_date.rb +0 -89
  60. data/test/test_faker_hacker_talk.rb +0 -37
  61. data/test/test_faker_hipster.rb +0 -78
  62. data/test/test_faker_internet.rb +0 -190
  63. data/test/test_faker_lorem.rb +0 -87
  64. data/test/test_faker_name.rb +0 -20
  65. data/test/test_faker_number.rb +0 -107
  66. data/test/test_faker_shakespeare.rb +0 -53
  67. data/test/test_faker_slack_emoji.rb +0 -45
  68. data/test/test_faker_star_wars.rb +0 -74
  69. data/test/test_faker_street.rb +0 -58
  70. data/test/test_faker_superhero.rb +0 -16
  71. data/test/test_faker_team.rb +0 -25
  72. data/test/test_faker_time.rb +0 -93
  73. data/test/test_faker_university.rb +0 -20
  74. data/test/test_fi_locale.rb +0 -33
  75. data/test/test_flexible.rb +0 -62
  76. data/test/test_helper.rb +0 -12
  77. data/test/test_locale.rb +0 -47
  78. data/test/test_pl_locale.rb +0 -24
  79. data/test/test_placeholdit.rb +0 -92
  80. data/test/test_pt_locale.rb +0 -27
  81. data/test/test_sv_locale.rb +0 -28
  82. data/test/test_uk_locale.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60e8a82dac923a23a59ecf9c9d5393f47871839a
4
- data.tar.gz: b5c3a57051bb7fd13ca97a51a7a687ebe6b5c128
3
+ metadata.gz: ed2ee70ea2d6aaca6b29368c96662c4719cb8ae1
4
+ data.tar.gz: c5b4ed33812b75c33da0d94e204cd42aa2d4b347
5
5
  SHA512:
6
- metadata.gz: 56d14ef1ac946cdab85cadf2c2eb2f38d2477da48fdcd1323d8e1313c34c38861421d7505ba57f01e01e18925cf2fe1648bf2ac438874a5f016ac5fb800275cc
7
- data.tar.gz: 61dca68c941316bfa157da3163aea701074e5a1fa200f63a94d5e63551680795d87aa3bab9d3173d6db83c56034253d7177115ab39eea3cfb9241bc2ff0610f6
6
+ metadata.gz: 3af9b9aec025fb8991e1b0af57105dee42ad6e83e6771b99dee333613235bb5b48cc17428117fe45f968636708bf1f6d3cdf0cd8e9b7b3cb885533da79a3b89b
7
+ data.tar.gz: d300551f4b629cdf6894710f681af489f871fe2835937a312b74fb1c0d37263a42e44bc8e7eebb63c8e0dd06e059c7b822ef6a712689f39ddd948f220e01cb72
@@ -1,3 +1,16 @@
1
+ == 1.6.4 2016-07-06
2
+ * Removed support for Ruby 1.9.3
3
+ * Added Faker::ChuckNorris, Faker::Crypto, Faker::Educator, Faker::File, Faker::Music, Faker::Space, Faker::Vehicle, and Faker::Yoda
4
+ * Fixed bug with credit card types
5
+ * DST fixes in Faker::Time
6
+ * Added Faker::Name.name_with_middle
7
+ * Added Faker::Code.imei
8
+ * Added Faker::Code.asin
9
+ * Added Faker::Lorem.question and Faker::Lorem.questions
10
+ * Added Faker::Internet.private_ip_v4_address
11
+ * Added Faker::Company.australian_business_number
12
+ * Other miscellaneous fixes and locale updates
13
+
1
14
  == 1.6.3 2016-02-23
2
15
  * Fix for UTF problem in Ruby 1.9.3
3
16
  * Fix for Faker::StarWars.character
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
- Faker
2
- =====
1
+ # Faker [![Build Status](https://travis-ci.org/stympy/faker.svg?branch=master)](https://travis-ci.org/stympy/faker) [![Gem Version](https://badge.fury.io/rb/faker.svg)](https://badge.fury.io/rb/faker)
2
+
3
+
3
4
  This gem is a port of Perl's Data::Faker library that generates fake data.
4
5
 
5
6
  It comes in very handy for taking screenshots (taking screenshots for my
@@ -15,6 +16,49 @@ development.
15
16
  Please refer the README of your version for the available methods.
16
17
  List of all versions is [available here](https://github.com/stympy/faker/releases).
17
18
 
19
+ Contents
20
+ --------
21
+
22
+ - [Installing](#installing)
23
+ - [Usage](#usage)
24
+ - [Faker::Address](#fakeraddress)
25
+ - [Faker::Bitcoin](#fakerbitcoin)
26
+ - [Faker::Business](#fakerbusiness)
27
+ - [Faker::Code](#fakercode)
28
+ - [Faker::Color](#fakercolor)
29
+ - [Faker::Commerce](#fakercommerce)
30
+ - [Faker::Company](#fakercompany)
31
+ - [Faker::Date](#fakerdate)
32
+ - [Faker::Internet](#fakerinternet)
33
+ - [Faker::File](#fakerfile)
34
+ - [Faker::Lorem](#fakerlorem)
35
+ - [Faker::Name](#fakername)
36
+ - [Faker::Number](#fakernumber)
37
+ - [Faker::Boolean](#fakerboolean)
38
+ - [Faker::PhoneNumber](#fakerphonenumber)
39
+ - [Faker::Time](#fakertime)
40
+ - [Faker::Hacker](#fakerhacker)
41
+ - [Faker::Crypto](#fakercrypto)
42
+ - [Faker::App](#fakerapp)
43
+ - [Faker::SlackEmoji](#fakerslackemoji)
44
+ - [Faker::Team](#fakerteam)
45
+ - [Faker::Book](#fakerbook)
46
+ - [Faker::University](#fakeruniversity)
47
+ - [Faker::Placeholdit](#fakerplaceholdit)
48
+ - [Faker::Hipster](#fakerhipster)
49
+ - [Faker::Superhero](#fakersuperhero)
50
+ - [Faker::StarWars](#fakerstarwars)
51
+ - [Faker::Beer](#fakerbeer)
52
+ - [Faker::ChuckNorris](#fakerchucknorris)
53
+ - [Faker::Educator](#fakereducator)
54
+ - [Faker::Space](#fakerspace)
55
+ - [Faker::Music](#fakermusic)
56
+ - [Faker::Vehicle](#fakervehicle)
57
+ - [Customization](#customization)
58
+ - [Contributing](#contributing)
59
+ - [Contact](#contact)
60
+ - [License](#license)
61
+
18
62
  Installing
19
63
  ----------
20
64
  ```bash
@@ -29,7 +73,7 @@ Faker::Name.name #=> "Christophe Bartell"
29
73
  Faker::Internet.email #=> "kirsten.greenholt@corkeryfisher.info"
30
74
  ```
31
75
 
32
- ###Faker::Address
76
+ ### Faker::Address
33
77
  -----------------
34
78
 
35
79
  ```ruby
@@ -78,7 +122,7 @@ Faker::Address.longitude #=> "-156.65548382095133"
78
122
  ```ruby
79
123
 
80
124
  Faker::Bitcoin.address #=> "1HUoGjmgChmnxxYhz87YytV4gVjfPaExmh"
81
- Faker::Bitcoin.testnet_address #=> ""msHGunDvoEwmVFXvd2Bub1SNw5RP1YHJaf""
125
+ Faker::Bitcoin.testnet_address #=> "msHGunDvoEwmVFXvd2Bub1SNw5RP1YHJaf"
82
126
 
83
127
  ```
84
128
 
@@ -104,6 +148,10 @@ Faker::Code.isbn #=> "759021701-8"
104
148
 
105
149
  Faker::Code.ean #=> "4600051000057"
106
150
 
151
+ Faker::Code.imei #= "546327785982623"
152
+
153
+ Faker::Code.asin #=> "B00000IGGJ"
154
+
107
155
  ```
108
156
 
109
157
  ###Faker::Color
@@ -167,6 +215,9 @@ Faker::Company.logo #=> "https://pigment.github.com/fake-logos/logos/medium/colo
167
215
 
168
216
  Faker::Company.swedish_organisation_number #=> "7718797652"
169
217
 
218
+ # Generate an Australian Business Number
219
+ Faker::Company.australian_business_number #=> "81137773602"
220
+
170
221
  # Get a random profession
171
222
  Faker::Company.profession #=> "firefighter"
172
223
 
@@ -179,7 +230,7 @@ Faker::Company.profession #=> "firefighter"
179
230
  # Random date between dates
180
231
  Faker::Date.between(2.days.ago, Date.today) #=> "Wed, 24 Sep 2014"
181
232
 
182
- # Randome date between dates except for certain date
233
+ # Random date between dates except for certain date
183
234
  Faker::Date.between_except(1.year.ago, 1.year.from_now, Date.today) #=> "Wed, 24 Sep 2014"
184
235
 
185
236
  # Random date in the future (up to maximum of N days)
@@ -236,8 +287,10 @@ Faker::Internet.domain_suffix #=> "info"
236
287
 
237
288
  Faker::Internet.ip_v4_address #=> "24.29.18.175"
238
289
 
239
- # Guaranteed not to be in 10.0.0.0/8, 127.0.0.0/8, 169.254.0.0/16,
240
- # 172.16.0.0/12, or 192.168.0.0/16
290
+ # Private IP range according to RFC 1918 and 127.0.0.0/8 and 169.254.0.0/16.
291
+ Faker::Internet.private_ip_v4_address #=> "10.0.0.1"
292
+
293
+ # Guaranteed not to be in the ip range from the private_ip_v4_address method.
241
294
  Faker::Internet.public_ip_v4_address #=> "24.29.18.175"
242
295
 
243
296
  Faker::Internet.ip_v4_cidr #=> "24.29.18.175/21"
@@ -263,6 +316,18 @@ Faker::Internet.slug('foo bar', '-') #=> "foo-bar"
263
316
 
264
317
  ```
265
318
 
319
+ ###Faker::File
320
+ ---------------
321
+ ```ruby
322
+ Faker::File.extension #=> "mp3"
323
+ Faker::File.mime_type #=> "application/pdf"
324
+ # Optional arguments: dir, name, extension, directory_separator
325
+ Faker::File.file_name('path/to') #=> "path/to/something_random.jpg"
326
+ Faker::File.file_name('foo/bar', 'baz') #=> "foo/bar/baz.zip"
327
+ Faker::File.file_name('foo/bar', 'baz', 'doc') #=> "foo/bar/baz.doc"
328
+ Faker::File.file_name('foo/bar', 'baz', 'mp3', '\') #=> "foo\bar\baz.mp3"
329
+ ```
330
+
266
331
  ###Faker::Lorem
267
332
  ---------------
268
333
 
@@ -270,7 +335,7 @@ Faker::Internet.slug('foo bar', '-') #=> "foo-bar"
270
335
 
271
336
  Faker::Lorem.word #=> "repellendus"
272
337
 
273
- # Optional arguments: num=3, supplemental=false
338
+ # Optional arguments: num=3, supplemental=false (words from a supplementary list of Lorem-like words)
274
339
  Faker::Lorem.words #=> ["dolores", "adipisci", "nesciunt"]
275
340
  Faker::Lorem.words(4) #=> ["culpa", "recusandae", "aut", "omnis"]
276
341
  Faker::Lorem.words(4, true) #=> ["colloco", "qui", "vergo", "deporto"]
@@ -310,17 +375,19 @@ Faker::Lorem.paragraphs(1, true) #=> ["Depulso animi cunctatio amicitia adficio.
310
375
 
311
376
  ```ruby
312
377
 
313
- Faker::Name.name #=> "Tyshawn Johns Sr."
378
+ Faker::Name.name #=> "Tyshawn Johns Sr."
379
+
380
+ Faker::Name.name_with_middle #=> "Aditya Elton Douglas"
314
381
 
315
- Faker::Name.first_name #=> "Kaci"
382
+ Faker::Name.first_name #=> "Kaci"
316
383
 
317
- Faker::Name.last_name #=> "Ernser"
384
+ Faker::Name.last_name #=> "Ernser"
318
385
 
319
- Faker::Name.prefix #=> "Mr."
386
+ Faker::Name.prefix #=> "Mr."
320
387
 
321
- Faker::Name.suffix #=> "IV"
388
+ Faker::Name.suffix #=> "IV"
322
389
 
323
- Faker::Name.title #=> "Legacy Creative Director"
390
+ Faker::Name.title #=> "Legacy Creative Director"
324
391
 
325
392
  ```
326
393
 
@@ -430,15 +497,16 @@ Faker::PhoneNumber.extension #=> "3764"
430
497
  Faker::Time.between(DateTime.now - 1, DateTime.now) #=> "2014-09-18 12:30:59 -0700"
431
498
 
432
499
  # Random date between dates (within specified part of the day)
433
- # You can install the active_support gem to facilitate time manipulation like 45.minutes + 2.hours
434
- require "as-duration"
435
- Faker::Time.between(2.days.ago, Time.now, :all) #=> "2014-09-19 07:03:30 -0700"
436
- Faker::Time.between(2.days.ago, Time.now, :day) #=> "2014-09-18 16:28:13 -0700"
437
- Faker::Time.between(2.days.ago, Time.now, :night) #=> "2014-09-20 19:39:38 -0700"
438
- Faker::Time.between(2.days.ago, Time.now, :morning) #=> "2014-09-19 08:07:52 -0700"
439
- Faker::Time.between(2.days.ago, Time.now, :afternoon) #=> "2014-09-18 12:10:34 -0700"
440
- Faker::Time.between(2.days.ago, Time.now, :evening) #=> "2014-09-19 20:21:03 -0700"
441
- Faker::Time.between(2.days.ago, Time.now, :midnight) #=> "2014-09-20 00:40:14 -0700"
500
+ # You can install the as-duration gem to facilitate time manipulation like 45.minutes + 2.hours
501
+ # (not needed if you already have activesupport, which is included with Rails)
502
+ require 'as-duration'
503
+ Faker::Time.between(2.days.ago, Date.today, :all) #=> "2014-09-19 07:03:30 -0700"
504
+ Faker::Time.between(2.days.ago, Date.today, :day) #=> "2014-09-18 16:28:13 -0700"
505
+ Faker::Time.between(2.days.ago, Date.today, :night) #=> "2014-09-20 19:39:38 -0700"
506
+ Faker::Time.between(2.days.ago, Date.today, :morning) #=> "2014-09-19 08:07:52 -0700"
507
+ Faker::Time.between(2.days.ago, Date.today, :afternoon) #=> "2014-09-18 12:10:34 -0700"
508
+ Faker::Time.between(2.days.ago, Date.today, :evening) #=> "2014-09-19 20:21:03 -0700"
509
+ Faker::Time.between(2.days.ago, Date.today, :midnight) #=> "2014-09-20 00:40:14 -0700"
442
510
 
443
511
  # Random time in the future (up to maximum of N days)
444
512
  Faker::Time.forward(23, :morning) # => "2014-09-26 06:54:47 -0700"
@@ -472,6 +540,19 @@ Faker::Hacker.verb #=> "bypass"
472
540
  Faker::Hacker.ingverb #=> "synthesizing"
473
541
  ```
474
542
 
543
+ ###Faker::Crypto
544
+ ---------------------
545
+
546
+ ```ruby
547
+
548
+ Faker::Crypto.md5 #=> "6b5ed240042e8a65c55ddb826c3408e6"
549
+
550
+ Faker::Crypto.sha1 #=> "4e99e31c51eef8b2d290e709f757f92e558a503f"
551
+
552
+ Faker::Crypto.sha256 #=> "51e4dbb424cd9db1ec5fb989514f2a35652ececef33f21c8dd1fd61bb8e3929d"
553
+
554
+ ```
555
+
475
556
  ###Faker::App
476
557
  -----------------
477
558
 
@@ -676,7 +757,88 @@ Faker::Beer.alcohol #=> "6.3%"
676
757
  Faker::Beer.blg #=> "18.5°Blg"
677
758
  ```
678
759
 
760
+ ###Faker::ChuckNorris
761
+ ----------------
762
+
763
+ ```ruby
764
+ Faker::ChuckNorris.fact #=> "Chuck Norris can solve the Towers of Hanoi in one move."
765
+ ```
766
+
767
+ ###Faker::Educator
768
+ -------------------
769
+
770
+ ```ruby
771
+ Faker::Educator.university #=> "Mallowtown Technical College"
772
+
773
+ Faker::Educator.secondary_school #=> "Iceborough Secodary College"
774
+
775
+ Faker::Educator.course #=> "Associate Degree in Criminology"
776
+
777
+ Faker::Educator.campus #=> "Vertapple Campus"
778
+ ```
779
+
780
+ ###Faker::Space
781
+ ----------------
782
+
783
+ ```ruby
784
+ # Random planet from our Solar System
785
+ Faker::Space.planet #=> "Venus"
786
+
787
+ # Random moon from our Solar System
788
+ Faker::Space.moon #=> "Europa"
789
+
790
+ # Random galaxy
791
+ Faker::Space.galaxy #=> "Andromeda"
792
+
793
+ # Random nebula name
794
+ Faker::Space.nebula #=> "Triffid Nebula"
795
+
796
+ # Random star cluster
797
+ Faker::Space.star_cluster #=> "Messier 70"
798
+
799
+ # Random constellation
800
+ Faker::Space.constellation #=> "Orion"
801
+
802
+ # Random star
803
+ Faker::Space.star #=> "Proxima Centauri"
804
+
805
+ # Random national space agency
806
+ Faker::Space.agency #=> "Japan Aerospace Exploration Agency"
807
+
808
+ # Random space agency abbreviation
809
+ Faker::Space.agency_abv #=> "NASA"
810
+
811
+ # Random spacecraft name (limited to NASA)
812
+ Faker::Space.nasa_space_craft #=> "Endeavour"
813
+
814
+ # Random private space company title
815
+ Faker::Space.company #=> "SpaceX"
816
+
817
+ # Random unit of stellar distance with number
818
+ Faker::Space.distance_measurement #=> "15 parsecs"
819
+ ```
820
+
679
821
 
822
+ ###Faker::Music
823
+ -------------------
824
+
825
+ ```ruby
826
+ Faker::Music.key #=> "C"
827
+
828
+ Faker::Music.instrument #=> "Ukelele"
829
+ ```
830
+
831
+ ###Faker::Vehicle
832
+ ------------------
833
+
834
+ ```ruby
835
+
836
+ # Generate vehicle identification number
837
+ Faker::Vehicle.vin #=> "LLDWXZLG77VK2LUUF"
838
+
839
+ # Random vehicle manufacturer
840
+ Faker::Vehicle.manufacture #=> "JAGUAR CARS LTD"
841
+ ```
680
842
 
681
843
  Customization
682
844
  ------------
@@ -97,6 +97,18 @@ module Faker
97
97
  end
98
98
  end
99
99
 
100
+ # Helper for the common approach of grabbing a translation
101
+ # with an array of values and returning all of them.
102
+ def fetch_all(key)
103
+ fetched = translate("faker.#{key}")
104
+ fetched = fetched.last if fetched.size <= 1
105
+ if !fetched.respond_to?(:sample) && fetched.match(/^\//) and fetched.match(/\/$/) # A regex
106
+ regexify(fetched)
107
+ else
108
+ fetched
109
+ end
110
+ end
111
+
100
112
  # Load formatted strings from the locale, "parsing" them
101
113
  # into method calls that can be used to generate a
102
114
  # formatted translation: e.g., "#{first_name} #{last_name}".
@@ -182,6 +194,7 @@ require 'faker/company'
182
194
  require 'faker/university'
183
195
  require 'faker/finance'
184
196
  require 'faker/internet'
197
+ require 'faker/file'
185
198
  require 'faker/lorem'
186
199
  require 'faker/name'
187
200
  require 'faker/team'
@@ -207,6 +220,13 @@ require 'faker/superhero'
207
220
  require 'faker/beer'
208
221
  require 'faker/boolean'
209
222
  require 'faker/star_wars'
223
+ require 'faker/chuck_norris'
224
+ require 'faker/crypto'
225
+ require 'faker/educator'
226
+ require 'faker/space'
227
+ require 'faker/yoda'
228
+ require 'faker/music'
229
+ require 'faker/vehicle'
210
230
 
211
231
  require 'extensions/array'
212
232
  require 'extensions/symbol'
@@ -7,7 +7,7 @@ module Faker
7
7
  end
8
8
 
9
9
  def version
10
- if parse('app.version') == ""
10
+ if parse('app.version') == ''
11
11
  numerify(fetch('app.version'))
12
12
  else
13
13
  parse('app.version')
@@ -37,4 +37,4 @@ module Faker
37
37
  end
38
38
  end
39
39
  end
40
- end
40
+ end
@@ -0,0 +1,16 @@
1
+ module Faker
2
+ class ChuckNorris < Base
3
+ flexible :name
4
+
5
+ class << self
6
+
7
+ def name
8
+ parse('chuck_norris')
9
+ end
10
+
11
+ # from: https://github.com/jenkinsci/chucknorris-plugin/blob/master/src/main/java/hudson/plugins/chucknorris/FactGenerator.java
12
+ def fact; fetch('chuck_norris.fact'); end
13
+
14
+ end
15
+ end
16
+ end
@@ -1,5 +1,6 @@
1
1
  module Faker
2
2
  class Code < Base
3
+ flexible :code
3
4
  class << self
4
5
 
5
6
  # Generates a 10 digit NPI (National Provider Identifier
@@ -37,8 +38,66 @@ module Faker
37
38
  "#{prefix}#{values}#{check_alpha}"
38
39
  end
39
40
 
41
+ # Generate GSM modem, device or mobile phone 15 digit IMEI number.
42
+ def imei
43
+ generate_imei
44
+ end
45
+
46
+ # Retrieves a real Amazon ASIN code list taken from
47
+ # https://archive.org/details/asin_listing
48
+ def asin
49
+ fetch('code.asin')
50
+ end
51
+
40
52
  private
41
53
 
54
+ # Reporting body identifier
55
+ RBI = %w(01 10 30 33 35 44 45 49 50 51 52 53 54 86 91 98 99).freeze
56
+
57
+ def generate_imei
58
+ pos = 0
59
+ str = Array.new(15, 0)
60
+ sum = 0
61
+ t = 0
62
+ len_offset = 0
63
+ len = 15
64
+
65
+ # Fill in the first two values of the string based with the specified prefix.
66
+ # Reporting Body Identifier list: http://en.wikipedia.org/wiki/Reporting_Body_Identifier
67
+ arr = RBI.sample
68
+ str[0] = arr[0].to_i
69
+ str[1] = arr[1].to_i
70
+ pos = 2
71
+
72
+ # Fill all the remaining numbers except for the last one with random values.
73
+ while pos < (len - 1)
74
+ str[pos] = rand(0..9)
75
+ pos += 1
76
+ end
77
+
78
+ # Calculate the Luhn checksum of the values thus far
79
+ len_offset = (len + 1) % 2
80
+ for pos in (0..(len - 1))
81
+ if (pos + len_offset) % 2 != 0
82
+ t = str[pos] * 2
83
+
84
+ if t > 9
85
+ t -= 9
86
+ end
87
+
88
+ sum += t
89
+ else
90
+ sum += str[pos]
91
+ end
92
+ end
93
+
94
+ # Choose the last digit so that it causes the entire string to pass the checksum.
95
+ str[len - 1] = (10 - (sum % 10)) % 10
96
+
97
+ # Output the IMEI value.
98
+ str.join('')
99
+ end
100
+
42
101
  def generate_base10_isbn
43
102
  values = regexify(/\d{9}/)
44
103
  remainder = sum(values) { |value, index| (index + 1) * value.to_i } % 11