faker 2.11.0 → 2.18.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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +421 -13
  3. data/History.md +4 -4
  4. data/README.md +33 -3
  5. data/lib/faker.rb +28 -23
  6. data/lib/faker/blockchain/aeternity.rb +4 -4
  7. data/lib/faker/blockchain/bitcoin.rb +2 -2
  8. data/lib/faker/blockchain/tezos.rb +30 -2
  9. data/lib/faker/books/dune.rb +15 -2
  10. data/lib/faker/books/lovecraft.rb +8 -4
  11. data/lib/faker/creature/bird.rb +203 -0
  12. data/lib/faker/default/address.rb +35 -5
  13. data/lib/faker/default/app.rb +1 -1
  14. data/lib/faker/default/avatar.rb +1 -1
  15. data/lib/faker/default/bank.rb +96 -3
  16. data/lib/faker/default/barcode.rb +165 -0
  17. data/lib/faker/default/beer.rb +3 -3
  18. data/lib/faker/default/blood.rb +48 -0
  19. data/lib/faker/default/business.rb +1 -1
  20. data/lib/faker/default/camera.rb +46 -0
  21. data/lib/faker/default/cannabis.rb +10 -0
  22. data/lib/faker/default/chile_rut.rb +47 -3
  23. data/lib/faker/default/chuck_norris.rb +1 -0
  24. data/lib/faker/default/code.rb +98 -17
  25. data/lib/faker/default/commerce.rb +74 -11
  26. data/lib/faker/default/company.rb +96 -11
  27. data/lib/faker/default/compass.rb +135 -0
  28. data/lib/faker/default/computer.rb +63 -0
  29. data/lib/faker/default/construction.rb +54 -0
  30. data/lib/faker/default/cosmere.rb +90 -0
  31. data/lib/faker/default/crypto.rb +17 -4
  32. data/lib/faker/default/crypto_coin.rb +45 -0
  33. data/lib/faker/default/date.rb +16 -12
  34. data/lib/faker/default/driving_licence.rb +67 -1
  35. data/lib/faker/default/drone.rb +332 -0
  36. data/lib/faker/default/educator.rb +13 -0
  37. data/lib/faker/default/faker_adjective.rb +35 -0
  38. data/lib/faker/default/file.rb +53 -2
  39. data/lib/faker/default/finance.rb +45 -0
  40. data/lib/faker/default/food.rb +1 -1
  41. data/lib/faker/default/gender.rb +1 -1
  42. data/lib/faker/default/hipster.rb +107 -10
  43. data/lib/faker/default/id_number.rb +122 -2
  44. data/lib/faker/default/internet.rb +266 -12
  45. data/lib/faker/default/internet_http.rb +48 -0
  46. data/lib/faker/default/invoice.rb +33 -6
  47. data/lib/faker/default/json.rb +61 -5
  48. data/lib/faker/default/lorem.rb +160 -5
  49. data/lib/faker/default/lorem_flickr.rb +67 -7
  50. data/lib/faker/default/lorem_pixel.rb +23 -0
  51. data/lib/faker/default/markdown.rb +91 -0
  52. data/lib/faker/default/measurement.rb +93 -2
  53. data/lib/faker/default/military.rb +26 -0
  54. data/lib/faker/default/mountain.rb +33 -0
  55. data/lib/faker/default/name.rb +98 -0
  56. data/lib/faker/default/nhs.rb +19 -0
  57. data/lib/faker/default/number.rb +28 -13
  58. data/lib/faker/default/omniauth.rb +62 -14
  59. data/lib/faker/default/phone_number.rb +88 -5
  60. data/lib/faker/default/placeholdit.rb +23 -1
  61. data/lib/faker/default/relationship.rb +1 -1
  62. data/lib/faker/default/science.rb +26 -0
  63. data/lib/faker/default/slack_emoji.rb +81 -0
  64. data/lib/faker/default/south_africa.rb +90 -0
  65. data/lib/faker/default/space.rb +1 -1
  66. data/lib/faker/default/string.rb +20 -3
  67. data/lib/faker/default/stripe.rb +64 -3
  68. data/lib/faker/default/tea.rb +41 -0
  69. data/lib/faker/default/twitter.rb +35 -0
  70. data/lib/faker/default/types.rb +84 -3
  71. data/lib/faker/default/university.rb +45 -0
  72. data/lib/faker/default/vehicle.rb +184 -4
  73. data/lib/faker/default/verb.rb +45 -0
  74. data/lib/faker/default/world_cup.rb +4 -4
  75. data/lib/faker/fantasy/tolkien.rb +67 -0
  76. data/lib/faker/games/clash_of_clans.rb +48 -0
  77. data/lib/faker/games/control.rb +113 -0
  78. data/lib/faker/games/dnd.rb +136 -0
  79. data/lib/faker/games/elder_scrolls.rb +26 -0
  80. data/lib/faker/games/heroes.rb +13 -0
  81. data/lib/faker/games/heroes_of_the_storm.rb +16 -5
  82. data/lib/faker/games/minecraft.rb +113 -0
  83. data/lib/faker/games/street_fighter.rb +61 -0
  84. data/lib/faker/games/super_mario.rb +48 -0
  85. data/lib/faker/games/touhou.rb +75 -0
  86. data/lib/faker/games/warhammer_fantasy.rb +74 -0
  87. data/lib/faker/games/witcher.rb +39 -0
  88. data/lib/faker/games/world_of_warcraft.rb +26 -1
  89. data/lib/faker/japanese_media/conan.rb +48 -0
  90. data/lib/faker/japanese_media/doraemon.rb +48 -0
  91. data/lib/faker/japanese_media/dragon_ball.rb +26 -0
  92. data/lib/faker/japanese_media/naruto.rb +61 -0
  93. data/lib/faker/japanese_media/studio_ghibli.rb +48 -0
  94. data/lib/faker/movies/departed.rb +49 -0
  95. data/lib/faker/movies/hobbit.rb +4 -4
  96. data/lib/faker/movies/how_to_train_your_dragon.rb +48 -0
  97. data/lib/faker/movies/lord_of_the_rings.rb +3 -3
  98. data/lib/faker/movies/movie.rb +13 -0
  99. data/lib/faker/movies/room.rb +63 -0
  100. data/lib/faker/movies/star_wars.rb +74 -2
  101. data/lib/faker/music/hiphop.rb +48 -0
  102. data/lib/faker/music/music.rb +12 -0
  103. data/lib/faker/music/opera.rb +237 -1
  104. data/lib/faker/music/pearl_jam.rb +50 -0
  105. data/lib/faker/music/phish.rb +27 -1
  106. data/lib/faker/music/prince.rb +64 -0
  107. data/lib/faker/music/rock_band.rb +12 -0
  108. data/lib/faker/music/rush.rb +37 -0
  109. data/lib/faker/music/show.rb +49 -0
  110. data/lib/faker/quotes/quote.rb +80 -1
  111. data/lib/faker/quotes/rajnikanth.rb +1 -0
  112. data/lib/faker/quotes/shakespeare.rb +70 -0
  113. data/lib/faker/sports/volleyball.rb +74 -0
  114. data/lib/faker/tv_shows/aqua_teen_hunger_force.rb +13 -0
  115. data/lib/faker/tv_shows/big_bang_theory.rb +37 -0
  116. data/lib/faker/tv_shows/buffy.rb +17 -4
  117. data/lib/faker/tv_shows/dr_who.rb +1 -1
  118. data/lib/faker/tv_shows/final_space.rb +51 -0
  119. data/lib/faker/tv_shows/futurama.rb +65 -0
  120. data/lib/faker/tv_shows/simpsons.rb +14 -0
  121. data/lib/faker/tv_shows/suits.rb +37 -0
  122. data/lib/faker/tv_shows/the_fresh_prince_of_bel_air.rb +17 -4
  123. data/lib/faker/version.rb +1 -1
  124. data/lib/helpers/base58.rb +1 -1
  125. data/lib/helpers/char.rb +22 -27
  126. data/lib/helpers/unique_generator.rb +0 -2
  127. data/lib/locales/de-AT.yml +4 -2
  128. data/lib/locales/de-CH.yml +1696 -1
  129. data/lib/locales/de.yml +4 -2
  130. data/lib/locales/en-AU.yml +50 -10
  131. data/lib/locales/en-CA.yml +2 -0
  132. data/lib/locales/en-GB.yml +1 -1
  133. data/lib/locales/en-IND.yml +2 -1
  134. data/lib/locales/en-MS.yml +2 -1
  135. data/lib/locales/en-NEP.yml +4 -1
  136. data/lib/locales/en-NZ.yml +3 -1
  137. data/lib/locales/en-PAK.yml +2 -1
  138. data/lib/locales/en-SG.yml +2 -1
  139. data/lib/locales/en-US.yml +37 -11
  140. data/lib/locales/en-au-ocker.yml +2 -1
  141. data/lib/locales/en.yml +0 -3
  142. data/lib/locales/en/address.yml +2 -0
  143. data/lib/locales/en/adjective.yml +179 -0
  144. data/lib/locales/en/animal.yml +1 -1
  145. data/lib/locales/en/aqua_teen_hunger_force.yml +33 -1
  146. data/lib/locales/en/bank.yml +1 -1
  147. data/lib/locales/en/barcode.yml +24 -0
  148. data/lib/locales/en/big_bang_theory.yml +38 -0
  149. data/lib/locales/en/bird.yml +1281 -0
  150. data/lib/locales/en/blood.yml +13 -0
  151. data/lib/locales/en/book.yml +487 -3
  152. data/lib/locales/en/buffy.yml +1 -1
  153. data/lib/locales/en/camera.yml +611 -0
  154. data/lib/locales/en/clash_of_clan.yml +101 -0
  155. data/lib/locales/en/company.yml +2 -2
  156. data/lib/locales/en/computer.yml +36 -0
  157. data/lib/locales/en/conan.yml +171 -0
  158. data/lib/locales/en/control.yml +247 -0
  159. data/lib/locales/en/demographic.yml +218 -5
  160. data/lib/locales/en/departed.yml +50 -0
  161. data/lib/locales/en/device.yml +112 -4
  162. data/lib/locales/en/dnd.yml +451 -0
  163. data/lib/locales/en/doraemon.yml +286 -0
  164. data/lib/locales/en/dota.yml +531 -63
  165. data/lib/locales/en/dragon_ball.yml +243 -1
  166. data/lib/locales/en/driving_license.yml +181 -0
  167. data/lib/locales/en/drone.yml +95 -0
  168. data/lib/locales/en/dune.yml +270 -131
  169. data/lib/locales/en/educator.yml +6 -0
  170. data/lib/locales/en/elder_scrolls.yml +583 -9
  171. data/lib/locales/en/fallout.yml +311 -133
  172. data/lib/locales/en/final_space.yml +37 -0
  173. data/lib/locales/en/finance.yml +53 -0
  174. data/lib/locales/en/football.yml +3 -3
  175. data/lib/locales/en/fresh_prince_of_bel_air.yml +1 -1
  176. data/lib/locales/en/futurama.yml +344 -0
  177. data/lib/locales/en/half_life.yml +84 -3
  178. data/lib/locales/en/heroes.yml +408 -3
  179. data/lib/locales/en/heroes_of_the_storm.yml +131 -4
  180. data/lib/locales/en/house.yml +1 -1
  181. data/lib/locales/en/how_to_train_your_dragon.yml +174 -0
  182. data/lib/locales/en/jack_handey.yml +54 -0
  183. data/lib/locales/en/league_of_legends.yml +285 -6
  184. data/lib/locales/en/lebowski.yml +1 -1
  185. data/lib/locales/en/lovecraft.yml +76 -6
  186. data/lib/locales/en/military.yml +179 -5
  187. data/lib/locales/en/minecraft.yml +663 -0
  188. data/lib/locales/en/mountain.yml +158 -0
  189. data/lib/locales/en/movie.yml +192 -1
  190. data/lib/locales/en/music.yml +461 -29
  191. data/lib/locales/en/myst.yml +87 -31
  192. data/lib/locales/en/name.yml +5 -4
  193. data/lib/locales/en/naruto.yml +231 -0
  194. data/lib/locales/en/one_piece.yml +2 -2
  195. data/lib/locales/en/opera.yml +168 -0
  196. data/lib/locales/en/overwatch.yml +2650 -2622
  197. data/lib/locales/en/pearl_jam.yml +213 -0
  198. data/lib/locales/en/phish.yml +392 -1
  199. data/lib/locales/en/pokemon.yml +417 -4
  200. data/lib/locales/en/prince.yml +227 -0
  201. data/lib/locales/en/quote.yml +692 -163
  202. data/lib/locales/en/rock_band.yml +1 -0
  203. data/lib/locales/en/room.yml +68 -0
  204. data/lib/locales/en/rush.yml +32 -0
  205. data/lib/locales/en/science.yml +355 -3
  206. data/lib/locales/en/shakespeare.yml +21 -24
  207. data/lib/locales/en/show.yml +597 -0
  208. data/lib/locales/en/simpsons.yml +668 -0
  209. data/lib/locales/en/source.yml +30 -0
  210. data/lib/locales/en/space.yml +1 -1
  211. data/lib/locales/en/star_trek.yml +1 -1
  212. data/lib/locales/en/star_wars.yml +568 -220
  213. data/lib/locales/en/street_fighter.yml +1524 -0
  214. data/lib/locales/en/studio_ghibli.yml +107 -0
  215. data/lib/locales/en/suits.yml +45 -0
  216. data/lib/locales/en/super_mario.yml +58 -0
  217. data/lib/locales/en/super_smash_bros.yml +18 -4
  218. data/lib/locales/en/tea.yml +172 -0
  219. data/lib/locales/en/tolkien.yml +2453 -0
  220. data/lib/locales/en/touhou.yml +839 -0
  221. data/lib/locales/en/volleyball.yml +501 -0
  222. data/lib/locales/en/warhammer_fantasy.yml +582 -0
  223. data/lib/locales/en/witcher.yml +426 -7
  224. data/lib/locales/en/world_of_warcraft.yml +122 -4
  225. data/lib/locales/en/zelda.yml +962 -4
  226. data/lib/locales/es-AR.yml +4603 -0
  227. data/lib/locales/es.yml +56 -0
  228. data/lib/locales/fi-FI.yml +1 -1
  229. data/lib/locales/fr-CA.yml +21 -5
  230. data/lib/locales/fr-CH.yml +2 -2
  231. data/lib/locales/fr.yml +1 -113
  232. data/lib/locales/fr/address.yml +21 -0
  233. data/lib/locales/fr/book.yml +7 -0
  234. data/lib/locales/fr/color.yml +4 -0
  235. data/lib/locales/fr/company.yml +17 -0
  236. data/lib/locales/fr/compass.yml +23 -0
  237. data/lib/locales/fr/demographic.yml +4 -0
  238. data/lib/locales/fr/gender.yml +6 -0
  239. data/lib/locales/fr/internet.yml +5 -0
  240. data/lib/locales/fr/lorem.yml +5 -0
  241. data/lib/locales/fr/measurement.yml +7 -0
  242. data/lib/locales/fr/name.yml +21 -0
  243. data/lib/locales/fr/phone_number.yml +7 -0
  244. data/lib/locales/fr/pokemon.yml +9 -0
  245. data/lib/locales/id.yml +3 -1
  246. data/lib/locales/it.yml +2 -1
  247. data/lib/locales/ja/README.md +13 -0
  248. data/lib/locales/ja/address.yml +17 -0
  249. data/lib/locales/ja/ancient.yml +4 -0
  250. data/lib/locales/ja/bank.yml +4 -0
  251. data/lib/locales/ja/book.yml +7 -0
  252. data/lib/locales/ja/coffee.yml +4 -0
  253. data/lib/locales/ja/color.yml +4 -0
  254. data/lib/locales/ja/commerce.yml +11 -0
  255. data/lib/locales/ja/company.yml +8 -0
  256. data/lib/locales/ja/creature.yml +9 -0
  257. data/lib/locales/ja/food.yml +4 -0
  258. data/lib/locales/ja/games.yml +18 -0
  259. data/lib/locales/ja/gender.yml +4 -0
  260. data/lib/locales/ja/lorem.yml +9 -0
  261. data/lib/locales/ja/name.yml +13 -0
  262. data/lib/locales/ja/phone_number.yml +7 -0
  263. data/lib/locales/ja/restaurant.yml +11 -0
  264. data/lib/locales/ja/space.yml +5 -0
  265. data/lib/locales/ja/subscription.yml +8 -0
  266. data/lib/locales/ja/university.yml +9 -0
  267. data/lib/locales/ko.yml +94 -2
  268. data/lib/locales/nb-NO.yml +4 -2
  269. data/lib/locales/pt-BR.yml +3 -1
  270. data/lib/locales/pt.yml +3 -1
  271. data/lib/locales/ru.yml +42 -1
  272. data/lib/locales/sk.yml +4 -2
  273. data/lib/locales/uk.yml +2 -0
  274. metadata +133 -24
  275. data/lib/locales/en/hobbit.yml +0 -19
  276. data/lib/locales/en/lord_of_the_rings.yml +0 -6
  277. data/lib/locales/ja.yml +0 -101
@@ -5,6 +5,7 @@ module Faker
5
5
  flexible :chuck_norris
6
6
 
7
7
  class << self
8
+ ##
8
9
  # Produces a Chuck Norris Fact.
9
10
  # Original list of facts:
10
11
  # https://github.com/jenkinsci/chucknorris-plugin/blob/master/src/main/java/hudson/plugins/chucknorris/FactGenerator.java
@@ -4,40 +4,101 @@ module Faker
4
4
  class Code < Base
5
5
  flexible :code
6
6
  class << self
7
- # Generates a 10 digit NPI (National Provider Identifier
8
- # issued to health care providers in the United States)
7
+ ##
8
+ # Produces a random NPI (National Provider Identifer) code.
9
+ #
10
+ # @return [String]
11
+ #
12
+ # @example
13
+ # Faker::Code.npi #=> "9804062802"
14
+ #
15
+ # @faker.version 1.9.4
9
16
  def npi
10
17
  rand(10**10).to_s.rjust(10, '0')
11
18
  end
12
19
 
13
- # By default generates 10 sign isbn code in format 123456789-X
14
- # You can pass 13 to generate new 13 sign code
20
+ ##
21
+ # Produces a random ISBN (International Standard Book Number) code.
22
+ #
23
+ # @param base [Integer] the length of the code to generate (either 10 or 13)
24
+ # @return [String]
25
+ #
26
+ # @example
27
+ # Faker::Code.isbn(base: 13) #=> "896579606969-8"
28
+ # @example
29
+ # Faker::Code.isbn #=> "170366802-2"
30
+ #
31
+ # @faker.version 2.2.0
15
32
  def isbn(legacy_base = NOT_GIVEN, base: 10)
16
33
  warn_for_deprecated_arguments do |keywords|
17
34
  keywords << :base if legacy_base != NOT_GIVEN
18
35
  end
19
36
 
20
- base == 13 ? generate_base13_isbn : generate_base10_isbn
37
+ case base
38
+ when 10 then generate_base10_isbn
39
+ when 13 then generate_base13_isbn
40
+ else raise ArgumentError, 'base must be 10 or 13'
41
+ end
21
42
  end
22
43
 
23
- # By default generates 13 sign ean code in format 1234567890123
24
- # You can pass 8 to generate ean8 code
44
+ ##
45
+ # Produces a random EAN (European Article Number) code.
46
+ #
47
+ # @param base [Integer] the length of the code to generate (either 8 or 13)
48
+ # @return [String]
49
+ #
50
+ # @example
51
+ # Faker::Code.ean(base: 8) #=> "36941070"
52
+ # @example
53
+ # Faker::Code.ean #=> "9941880131907"
54
+ #
55
+ # @faker.version 2.2.0
25
56
  def ean(legacy_base = NOT_GIVEN, base: 13)
26
57
  warn_for_deprecated_arguments do |keywords|
27
58
  keywords << :base if legacy_base != NOT_GIVEN
28
59
  end
29
60
 
30
- base == 8 ? generate_base8_ean : generate_base13_ean
61
+ case base
62
+ when 8 then generate_base8_ean
63
+ when 13 then generate_base13_ean
64
+ else raise ArgumentError, 'base must be 8 or 13'
65
+ end
31
66
  end
32
67
 
68
+ ##
69
+ # Produces a random RUT (Rol Unico Nacional) code.
70
+ #
71
+ # @return [String]
72
+ #
73
+ # @example
74
+ # Faker::Code.rut #=> "91611842-2"
75
+ #
76
+ # @faker.version 1.9.4
33
77
  def rut
34
78
  value = Number.number(digits: 8).to_s
35
79
  vd = rut_verificator_digit(value)
36
80
  value << "-#{vd}"
37
81
  end
38
82
 
83
+ ##
84
+ # Produces a random NRIC (National Registry Identity Card) code.
39
85
  # By default generates a Singaporean NRIC ID for someone
40
86
  # who is born between the age of 18 and 65.
87
+ #
88
+ # @param min_age [Integer] the min age of the person in years
89
+ # @param max_age [Integer] the max age of the person in years
90
+ # @return [String]
91
+ #
92
+ # @example
93
+ # Faker::Code.nric(min_age: 25, max_age: 50) #=> "S9347283G"
94
+ # @example
95
+ # Faker::Code.nric(max_age: 55) #=> "S7876903C"
96
+ # @example
97
+ # Faker::Code.nric(min_age: 25) #=> "S6281697Z"
98
+ # @example
99
+ # Faker::Code.nric #=> "S6372958B"
100
+ #
101
+ # @faker.version 2.2.0
41
102
  def nric(legacy_min_age = NOT_GIVEN, legacy_max_age = NOT_GIVEN, min_age: 18, max_age: 65)
42
103
  warn_for_deprecated_arguments do |keywords|
43
104
  keywords << :min_age if legacy_min_age != NOT_GIVEN
@@ -52,19 +113,41 @@ module Faker
52
113
  "#{prefix}#{values}#{check_alpha}"
53
114
  end
54
115
 
55
- # Generate GSM modem, device or mobile phone 15 digit IMEI number.
116
+ ##
117
+ # Produces a random IMEI (International Mobile Equipment Number) code.
118
+ #
119
+ # @return [String]
120
+ #
121
+ # @example
122
+ # Faker::Code.imei #=> "492033129092256"
123
+ #
124
+ # @faker.version 1.9.4
56
125
  def imei
57
126
  generate_imei
58
127
  end
59
128
 
60
- # Retrieves a real Amazon ASIN code list taken from
61
- # https://archive.org/details/asin_listing
129
+ ##
130
+ # Retrieves a real Amazon ASIN code from https://archive.org/details/asin_listing
131
+ #
132
+ # @return [String]
133
+ #
134
+ # @example
135
+ # Faker::Code.asin #=> "B000MZW1GE"
136
+ #
137
+ # @faker.version 1.9.4
62
138
  def asin
63
139
  fetch('code.asin')
64
140
  end
65
141
 
66
- # Generates Social Insurance Number issued in Canada
67
- # https://en.wikipedia.org/wiki/Social_Insurance_Number
142
+ ##
143
+ # Produces a random SIN (Social Insurance Number for Canada) code.
144
+ #
145
+ # @return [String]
146
+ #
147
+ # @example
148
+ # Faker::Code.sin #=> "996586962"
149
+ #
150
+ # @faker.version 1.9.4
68
151
  def sin
69
152
  # 1 - province or temporary resident
70
153
  # 2-8 - random numbers
@@ -77,7 +160,7 @@ module Faker
77
160
  partial = Array.new(7) { Faker::Config.random.rand(0..9) }.join
78
161
 
79
162
  # Generate 9th digit
80
- check_digit = generate_sin_check_digit(registry + partial + '0').to_s
163
+ check_digit = generate_sin_check_digit("#{registry}#{partial}0").to_s
81
164
 
82
165
  registry + partial + check_digit
83
166
  end
@@ -90,8 +173,6 @@ module Faker
90
173
  def generate_imei
91
174
  str = Array.new(15, 0)
92
175
  sum = 0
93
- t = 0
94
- len_offset = 0
95
176
  len = 15
96
177
 
97
178
  # Fill in the first two values of the string based with the specified prefix.
@@ -137,7 +218,7 @@ module Faker
137
218
  def generate_base13_isbn
138
219
  values = regexify(/\d{12}/)
139
220
  remainder = sum(values) { |value, index| index.even? ? value.to_i : value.to_i * 3 } % 10
140
- values << "-#{((10 - remainder) % 10)}"
221
+ values << "-#{(10 - remainder) % 10}"
141
222
  end
142
223
 
143
224
  def sum(values)
@@ -3,10 +3,30 @@
3
3
  module Faker
4
4
  class Commerce < Base
5
5
  class << self
6
+ ##
7
+ # Produces a random color.
8
+ #
9
+ # @return [String]
10
+ #
11
+ # @example
12
+ # Faker::Commerce.color #=> "lavender"
13
+ #
14
+ # @faker.version 1.2.0
6
15
  def color
7
16
  fetch('color.name')
8
17
  end
9
18
 
19
+ ##
20
+ # Produces a random promotion code.
21
+ #
22
+ # @param digits [Integer] Updates the number of numerical digits used to generate the promotion code.
23
+ # @return [String]
24
+ #
25
+ # @example
26
+ # Faker::Commerce.promotion_code #=> "AmazingDeal829102"
27
+ # Faker::Commerce.promotion_code(digits: 2) #=> "AmazingPrice57"
28
+ #
29
+ # @faker.version 1.7.0
10
30
  def promotion_code(legacy_digits = NOT_GIVEN, digits: 6)
11
31
  warn_for_deprecated_arguments do |keywords|
12
32
  keywords << :digits if legacy_digits != NOT_GIVEN
@@ -19,6 +39,19 @@ module Faker
19
39
  ].join
20
40
  end
21
41
 
42
+ ##
43
+ # Produces a random department.
44
+ #
45
+ # @param max [Integer] Updates the maximum number of names used to generate the department name.
46
+ # @param fixed_amount [Boolean] Fixes the amount of departments to use instead of using a range.
47
+ # @return [String]
48
+ #
49
+ # @example
50
+ # Faker::Commerce.department #=> "Grocery, Health & Beauty"
51
+ # Faker::Commerce.department(max: 5) #=> "Grocery, Books, Health & Beauty"
52
+ # Faker::Commerce.department(max: 2, fixed_amount: true) #=> "Books & Tools"
53
+ #
54
+ # @faker.version 1.2.0
22
55
  def department(legacy_max = NOT_GIVEN, legacy_fixed_amount = NOT_GIVEN, max: 3, fixed_amount: false)
23
56
  warn_for_deprecated_arguments do |keywords|
24
57
  keywords << :max if legacy_max != NOT_GIVEN
@@ -30,19 +63,55 @@ module Faker
30
63
 
31
64
  categories = categories(num)
32
65
 
33
- return merge_categories(categories) if num > 1
34
-
35
- categories[0]
66
+ if categories.is_a?(Array)
67
+ if categories.length > 1
68
+ merge_categories(categories)
69
+ else
70
+ categories[0]
71
+ end
72
+ else
73
+ categories
74
+ end
36
75
  end
37
76
 
77
+ ##
78
+ # Produces a random product name.
79
+ #
80
+ # @return [String]
81
+ #
82
+ # @example
83
+ # Faker::Commerce.product_name #=> "Practical Granite Shirt"
84
+ #
85
+ # @faker.version 1.2.0
38
86
  def product_name
39
87
  "#{fetch('commerce.product_name.adjective')} #{fetch('commerce.product_name.material')} #{fetch('commerce.product_name.product')}"
40
88
  end
41
89
 
90
+ ##
91
+ # Produces a random material.
92
+ #
93
+ # @return [String]
94
+ #
95
+ # @example
96
+ # Faker::Commerce.material #=> "Plastic"
97
+ #
98
+ # @faker.version 1.5.0
42
99
  def material
43
100
  fetch('commerce.product_name.material')
44
101
  end
45
102
 
103
+ ##
104
+ # Produces a random product price.
105
+ #
106
+ # @param range [Range] A range to generate the random number within.
107
+ # @param as_string [Boolean] Changes the return value to [String].
108
+ # @return [Float]
109
+ #
110
+ # @example
111
+ # Faker::Commerce.price #=> 44.6
112
+ # Faker::Commerce.price(range: 0..10.0, as_string: true) #=> "2.18"
113
+ #
114
+ # @faker.version 1.2.0
46
115
  def price(legacy_range = NOT_GIVEN, legacy_as_string = NOT_GIVEN, range: 0..100.0, as_string: false)
47
116
  warn_for_deprecated_arguments do |keywords|
48
117
  keywords << :range if legacy_range != NOT_GIVEN
@@ -52,7 +121,7 @@ module Faker
52
121
  price = (rand(range) * 100).floor / 100.0
53
122
  if as_string
54
123
  price_parts = price.to_s.split('.')
55
- price = price_parts[0] + '.' + price_parts[-1].ljust(2, '0')
124
+ price = "#{price_parts[0]}.#{price_parts[-1].ljust(2, '0')}"
56
125
  end
57
126
  price
58
127
  end
@@ -60,13 +129,7 @@ module Faker
60
129
  private
61
130
 
62
131
  def categories(num)
63
- categories = []
64
- while categories.length < num
65
- category = fetch('commerce.department')
66
- categories << category unless categories.include?(category)
67
- end
68
-
69
- categories
132
+ sample(fetch_all('commerce.department'), num)
70
133
  end
71
134
 
72
135
  def merge_categories(categories)
@@ -162,12 +162,17 @@ module Faker
162
162
  # @faker.version 1.8.5
163
163
  #
164
164
  # Get a random Spanish organization number. See more here https://es.wikipedia.org/wiki/N%C3%BAmero_de_identificaci%C3%B3n_fiscal
165
- def spanish_organisation_number
165
+ def spanish_organisation_number(organization_type: nil)
166
166
  # Valid leading character: A, B, C, D, E, F, G, H, J, N, P, Q, R, S, U, V, W
167
- # 7 digit numbers
167
+ # format: 1 digit letter (organization type) + 7 digit numbers + 1 digit control (letter or number based on
168
+ # organization type)
168
169
  letters = %w[A B C D E F G H J N P Q R S U V W]
169
- base = [sample(letters), format('%07d', rand(10**7))].join
170
- base
170
+
171
+ organization_type = sample(letters) unless letters.include?(organization_type)
172
+ code = format('%07d', rand(10**7))
173
+ control = spanish_cif_control_digit(organization_type, code)
174
+
175
+ [organization_type, code, control].join
171
176
  end
172
177
 
173
178
  ##
@@ -399,6 +404,22 @@ module Faker
399
404
  formatted ? format('%s.%s.%s/%s-%s', *number.scan(/(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})/).flatten) : number
400
405
  end
401
406
 
407
+ ##
408
+ # Get a random Russian tax number.
409
+ # @param region [String] Any region string
410
+ # @param type [Symbol] Legeal or not, defaults to :legal
411
+ #
412
+ # @return [String]
413
+ # @example
414
+ # Faker::Company.russian_tax_number #=> "0415584064"
415
+ # Faker::Company.russian_tax_number(region: 'AZ') #=> "AZ50124562"
416
+ # Faker::Company.russian_tax_number(region: 'AZ', type: false) #=> "AZ8802315465"
417
+ #
418
+ # @faker.version 1.9.4
419
+ def russian_tax_number(region: nil, type: :legal)
420
+ inn_number(region, type)
421
+ end
422
+
402
423
  ##
403
424
  # Produces a company sic code.
404
425
  #
@@ -454,13 +475,11 @@ module Faker
454
475
  end
455
476
  end
456
477
 
457
- control_digit = if (sum % 10).zero?
458
- 0
459
- else
460
- (sum / 10 + 1) * 10 - sum
461
- end
462
-
463
- control_digit
478
+ if (sum % 10).zero?
479
+ 0
480
+ else
481
+ (sum / 10 + 1) * 10 - sum
482
+ end
464
483
  end
465
484
 
466
485
  def abn_checksum(abn)
@@ -491,6 +510,72 @@ module Faker
491
510
  end
492
511
  sum
493
512
  end
513
+
514
+ # rubocop:disable Style/AsciiComments
515
+ #
516
+ # For more on Russian tax number algorithm here:
517
+ # https://ru.wikipedia.org/wiki/Идентификационный_номер_налогоплательщика#Вычисление_контрольных_цифр
518
+ #
519
+ # Range of regions:
520
+ # https://ru.wikipedia.org/wiki/Коды_субъектов_Российской_Федерации
521
+ # region [String] Any region string
522
+ # @param type [Symbol] Legeal or not, defaults to :legal
523
+ #
524
+ # @return [String]
525
+ # @example
526
+ # Faker::Comnpany.russian_tax_number
527
+ # Faker::Comnpany.russian_tax_number(region: 'AZ')
528
+ # Faker::Comnpany.russian_tax_number(region: 'AZ', type: false)
529
+ # rubocop:enable Style/AsciiComments
530
+ def inn_number(region, type)
531
+ n10 = [2, 4, 10, 3, 5, 9, 4, 6, 8]
532
+ n11 = [7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
533
+ n12 = [3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8]
534
+
535
+ region = format('%.2d', rand(0o1..92)) if region.nil?
536
+ checksum = if type == :legal
537
+ number = region.to_s + rand(1_000_000..9_999_999).to_s
538
+ inn_checksum(n10, number)
539
+ else
540
+ number = region.to_s + rand(10_000_000..99_999_999).to_s
541
+ inn_checksum(n11, number) + inn_checksum(n12, number + inn_checksum(n11, number))
542
+ end
543
+
544
+ number + checksum
545
+ end
546
+
547
+ def inn_checksum(factor, number)
548
+ (
549
+ factor.map.with_index.reduce(0) do |v, i|
550
+ v + i[0] * number[i[1]].to_i
551
+ end % 11 % 10
552
+ ).to_s
553
+ end
554
+
555
+ def spanish_cif_control_digit(organization_type, code)
556
+ letters = %w[J A B C D E F G H]
557
+
558
+ control = code.split('').each_with_index.inject(0) do |sum, (value, index)|
559
+ if (index + 1).even?
560
+ sum + value.to_i
561
+ else
562
+ sum + spanish_b_algorithm(value.to_i)
563
+ end
564
+ end
565
+
566
+ control = control.to_s[-1].to_i
567
+ control = control.zero? ? control : 10 - control
568
+
569
+ %w[A B C D E F G H J U V].include?(organization_type) ? control : letters[control]
570
+ end
571
+
572
+ def spanish_b_algorithm(value)
573
+ result = value.to_i * 2
574
+
575
+ return result if result < 10
576
+
577
+ result.to_s[0].to_i + result.to_s[1].to_i
578
+ end
494
579
  end
495
580
  end
496
581
  end