faker 2.11.0 → 3.2.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 (380) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +810 -19
  3. data/History.md +5 -5
  4. data/README.md +232 -105
  5. data/lib/faker/blockchain/aeternity.rb +5 -5
  6. data/lib/faker/blockchain/bitcoin.rb +2 -2
  7. data/lib/faker/blockchain/ethereum.rb +1 -1
  8. data/lib/faker/blockchain/tezos.rb +31 -3
  9. data/lib/faker/books/dune.rb +17 -12
  10. data/lib/faker/books/lovecraft.rb +14 -41
  11. data/lib/faker/books/the_kingkiller_chronicle.rb +61 -0
  12. data/lib/faker/creature/bird.rb +203 -0
  13. data/lib/faker/default/address.rb +40 -30
  14. data/lib/faker/default/adjective.rb +35 -0
  15. data/lib/faker/default/alphanumeric.rb +2 -8
  16. data/lib/faker/default/app.rb +1 -10
  17. data/lib/faker/default/avatar.rb +1 -12
  18. data/lib/faker/default/bank.rb +104 -19
  19. data/lib/faker/default/barcode.rb +165 -0
  20. data/lib/faker/default/beer.rb +3 -3
  21. data/lib/faker/default/blood.rb +48 -0
  22. data/lib/faker/default/boolean.rb +1 -4
  23. data/lib/faker/default/business.rb +1 -1
  24. data/lib/faker/default/camera.rb +46 -0
  25. data/lib/faker/default/cannabis.rb +10 -0
  26. data/lib/faker/default/chile_rut.rb +54 -16
  27. data/lib/faker/default/chuck_norris.rb +1 -0
  28. data/lib/faker/default/code.rb +106 -38
  29. data/lib/faker/default/color.rb +77 -6
  30. data/lib/faker/default/commerce.rb +105 -28
  31. data/lib/faker/default/company.rb +116 -28
  32. data/lib/faker/default/compass.rb +135 -0
  33. data/lib/faker/default/computer.rb +63 -0
  34. data/lib/faker/default/construction.rb +54 -0
  35. data/lib/faker/default/cosmere.rb +90 -0
  36. data/lib/faker/default/crypto.rb +17 -4
  37. data/lib/faker/default/crypto_coin.rb +48 -15
  38. data/lib/faker/default/date.rb +21 -50
  39. data/lib/faker/default/demographic.rb +1 -5
  40. data/lib/faker/default/driving_licence.rb +66 -10
  41. data/lib/faker/default/drone.rb +332 -0
  42. data/lib/faker/default/educator.rb +13 -0
  43. data/lib/faker/default/emotion.rb +33 -0
  44. data/lib/faker/default/file.rb +53 -21
  45. data/lib/faker/default/finance.rb +75 -7
  46. data/lib/faker/default/food.rb +28 -2
  47. data/lib/faker/default/gender.rb +1 -1
  48. data/lib/faker/default/hipster.rb +106 -48
  49. data/lib/faker/default/hobby.rb +22 -0
  50. data/lib/faker/default/id_number.rb +230 -13
  51. data/lib/faker/default/internet.rb +390 -108
  52. data/lib/faker/default/internet_http.rb +48 -0
  53. data/lib/faker/default/invoice.rb +37 -23
  54. data/lib/faker/default/json.rb +61 -23
  55. data/lib/faker/default/lorem.rb +171 -72
  56. data/lib/faker/default/lorem_flickr.rb +69 -37
  57. data/lib/faker/default/markdown.rb +97 -11
  58. data/lib/faker/default/marketing.rb +1 -1
  59. data/lib/faker/default/measurement.rb +101 -42
  60. data/lib/faker/default/military.rb +26 -0
  61. data/lib/faker/default/mountain.rb +33 -0
  62. data/lib/faker/default/name.rb +99 -5
  63. data/lib/faker/default/nation.rb +0 -3
  64. data/lib/faker/default/nhs.rb +21 -6
  65. data/lib/faker/default/number.rb +38 -68
  66. data/lib/faker/default/omniauth.rb +111 -53
  67. data/lib/faker/default/phone_number.rb +89 -10
  68. data/lib/faker/default/placeholdit.rb +23 -12
  69. data/lib/faker/default/relationship.rb +2 -6
  70. data/lib/faker/default/religion.rb +6 -0
  71. data/lib/faker/default/science.rb +108 -0
  72. data/lib/faker/default/slack_emoji.rb +81 -0
  73. data/lib/faker/default/source.rb +3 -16
  74. data/lib/faker/default/south_africa.rb +90 -0
  75. data/lib/faker/default/space.rb +1 -1
  76. data/lib/faker/default/string.rb +18 -8
  77. data/lib/faker/default/stripe.rb +68 -23
  78. data/lib/faker/default/tea.rb +41 -0
  79. data/lib/faker/default/time.rb +4 -34
  80. data/lib/faker/default/twitter.rb +42 -23
  81. data/lib/faker/default/types.rb +88 -29
  82. data/lib/faker/default/university.rb +45 -0
  83. data/lib/faker/default/vehicle.rb +212 -54
  84. data/lib/faker/default/verb.rb +45 -0
  85. data/lib/faker/default/vulnerability_identifier.rb +23 -0
  86. data/lib/faker/default/world_cup.rb +6 -15
  87. data/lib/faker/fantasy/tolkien.rb +67 -0
  88. data/lib/faker/games/clash_of_clans.rb +48 -0
  89. data/lib/faker/games/control.rb +113 -0
  90. data/lib/faker/games/dnd.rb +178 -0
  91. data/lib/faker/games/dota.rb +14 -5
  92. data/lib/faker/games/elder_scrolls.rb +26 -0
  93. data/lib/faker/games/heroes.rb +13 -0
  94. data/lib/faker/games/heroes_of_the_storm.rb +16 -5
  95. data/lib/faker/games/minecraft.rb +113 -0
  96. data/lib/faker/games/myst.rb +1 -1
  97. data/lib/faker/games/street_fighter.rb +61 -0
  98. data/lib/faker/games/super_mario.rb +48 -0
  99. data/lib/faker/games/tarkov.rb +205 -0
  100. data/lib/faker/games/touhou.rb +75 -0
  101. data/lib/faker/games/warhammer_fantasy.rb +74 -0
  102. data/lib/faker/games/witcher.rb +39 -0
  103. data/lib/faker/games/world_of_warcraft.rb +26 -1
  104. data/lib/faker/japanese_media/conan.rb +48 -0
  105. data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
  106. data/lib/faker/japanese_media/doraemon.rb +48 -0
  107. data/lib/faker/japanese_media/dragon_ball.rb +26 -0
  108. data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +48 -0
  109. data/lib/faker/japanese_media/kamen_rider.rb +102 -0
  110. data/lib/faker/japanese_media/naruto.rb +61 -0
  111. data/lib/faker/japanese_media/one_piece.rb +1 -1
  112. data/lib/faker/japanese_media/studio_ghibli.rb +48 -0
  113. data/lib/faker/locations/australia.rb +47 -0
  114. data/lib/faker/movies/avatar.rb +49 -0
  115. data/lib/faker/movies/departed.rb +49 -0
  116. data/lib/faker/movies/hackers.rb +48 -0
  117. data/lib/faker/movies/hobbit.rb +4 -4
  118. data/lib/faker/movies/how_to_train_your_dragon.rb +48 -0
  119. data/lib/faker/movies/lord_of_the_rings.rb +3 -3
  120. data/lib/faker/movies/movie.rb +13 -0
  121. data/lib/faker/movies/room.rb +63 -0
  122. data/lib/faker/movies/star_wars.rb +75 -7
  123. data/lib/faker/movies/tron.rb +161 -0
  124. data/lib/faker/music/hiphop.rb +48 -0
  125. data/lib/faker/music/music.rb +12 -0
  126. data/lib/faker/music/opera.rb +237 -1
  127. data/lib/faker/music/pearl_jam.rb +50 -0
  128. data/lib/faker/music/phish.rb +27 -1
  129. data/lib/faker/music/prince.rb +64 -0
  130. data/lib/faker/music/rock_band.rb +12 -0
  131. data/lib/faker/music/rush.rb +37 -0
  132. data/lib/faker/music/show.rb +49 -0
  133. data/lib/faker/quotes/quote.rb +93 -1
  134. data/lib/faker/quotes/rajnikanth.rb +1 -0
  135. data/lib/faker/quotes/shakespeare.rb +70 -0
  136. data/lib/faker/religion/bible.rb +50 -0
  137. data/lib/faker/sports/chess.rb +90 -0
  138. data/lib/faker/sports/mountaineering.rb +22 -0
  139. data/lib/faker/sports/sport.rb +116 -0
  140. data/lib/faker/sports/volleyball.rb +74 -0
  141. data/lib/faker/travel/airport.rb +43 -0
  142. data/lib/faker/tv_shows/aqua_teen_hunger_force.rb +13 -0
  143. data/lib/faker/tv_shows/big_bang_theory.rb +37 -0
  144. data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
  145. data/lib/faker/tv_shows/buffy.rb +17 -4
  146. data/lib/faker/tv_shows/dr_who.rb +1 -1
  147. data/lib/faker/tv_shows/final_space.rb +51 -0
  148. data/lib/faker/tv_shows/futurama.rb +65 -0
  149. data/lib/faker/tv_shows/michael_scott.rb +0 -3
  150. data/lib/faker/tv_shows/simpsons.rb +14 -0
  151. data/lib/faker/tv_shows/spongebob.rb +50 -0
  152. data/lib/faker/tv_shows/suits.rb +37 -0
  153. data/lib/faker/tv_shows/supernatural.rb +48 -0
  154. data/lib/faker/tv_shows/the_fresh_prince_of_bel_air.rb +17 -4
  155. data/lib/faker/tv_shows/the_office.rb +37 -0
  156. data/lib/faker/version.rb +2 -2
  157. data/lib/faker.rb +40 -84
  158. data/lib/helpers/base58.rb +1 -1
  159. data/lib/helpers/char.rb +22 -27
  160. data/lib/helpers/unique_generator.rb +13 -13
  161. data/lib/locales/ar.yml +6 -1
  162. data/lib/locales/bg.yml +1 -1
  163. data/lib/locales/da-DK.yml +1 -1
  164. data/lib/locales/de-AT.yml +7 -6
  165. data/lib/locales/de-CH.yml +1697 -2
  166. data/lib/locales/de.yml +12 -6
  167. data/lib/locales/en/address.yml +4 -3
  168. data/lib/locales/en/adjective.yml +179 -0
  169. data/lib/locales/en/airport.yml +381 -0
  170. data/lib/locales/en/animal.yml +1 -1
  171. data/lib/locales/en/aqua_teen_hunger_force.yml +33 -1
  172. data/lib/locales/en/australia.yml +107 -0
  173. data/lib/locales/en/avatar.yml +31 -0
  174. data/lib/locales/en/bank.yml +1 -1
  175. data/lib/locales/en/barcode.yml +24 -0
  176. data/lib/locales/en/bible.yml +90 -0
  177. data/lib/locales/en/big_bang_theory.yml +38 -0
  178. data/lib/locales/en/bird.yml +1281 -0
  179. data/lib/locales/en/blood.yml +13 -0
  180. data/lib/locales/en/book.yml +487 -3
  181. data/lib/locales/en/brooklyn_nine_nine.yml +35 -0
  182. data/lib/locales/en/buffy.yml +1 -1
  183. data/lib/locales/en/camera.yml +611 -0
  184. data/lib/locales/en/cat.yml +1 -1
  185. data/lib/locales/en/chess.yml +103 -0
  186. data/lib/locales/en/clash_of_clan.yml +101 -0
  187. data/lib/locales/en/coffee.yml +1 -1
  188. data/lib/locales/en/commerce.yml +17 -0
  189. data/lib/locales/en/community.yml +17 -17
  190. data/lib/locales/en/company.yml +3 -2
  191. data/lib/locales/en/computer.yml +55 -0
  192. data/lib/locales/en/conan.yml +171 -0
  193. data/lib/locales/en/control.yml +247 -0
  194. data/lib/locales/en/cowboy_bebop.yml +163 -0
  195. data/lib/locales/en/demographic.yml +218 -5
  196. data/lib/locales/en/departed.yml +50 -0
  197. data/lib/locales/en/device.yml +112 -4
  198. data/lib/locales/en/dnd.yml +636 -0
  199. data/lib/locales/en/doraemon.yml +286 -0
  200. data/lib/locales/en/dota.yml +651 -63
  201. data/lib/locales/en/dragon_ball.yml +243 -1
  202. data/lib/locales/en/driving_license.yml +181 -0
  203. data/lib/locales/en/drone.yml +95 -0
  204. data/lib/locales/en/dune.yml +270 -131
  205. data/lib/locales/en/educator.yml +6 -0
  206. data/lib/locales/en/elder_scrolls.yml +583 -9
  207. data/lib/locales/en/emotion.yml +480 -0
  208. data/lib/locales/en/fallout.yml +311 -133
  209. data/lib/locales/en/file.yml +9 -1
  210. data/lib/locales/en/final_space.yml +37 -0
  211. data/lib/locales/en/finance.yml +77 -1
  212. data/lib/locales/en/fma_brotherhood.yml +78 -0
  213. data/lib/locales/en/food.yml +1066 -10
  214. data/lib/locales/en/football.yml +3 -3
  215. data/lib/locales/en/fresh_prince_of_bel_air.yml +1 -1
  216. data/lib/locales/en/futurama.yml +344 -0
  217. data/lib/locales/en/game.yml +11 -0
  218. data/lib/locales/en/hackers.yml +53 -0
  219. data/lib/locales/en/half_life.yml +84 -3
  220. data/lib/locales/en/heroes.yml +408 -3
  221. data/lib/locales/en/heroes_of_the_storm.yml +131 -4
  222. data/lib/locales/en/hobby.yml +171 -0
  223. data/lib/locales/en/horse.yml +2 -2
  224. data/lib/locales/en/house.yml +1 -1
  225. data/lib/locales/en/how_to_train_your_dragon.yml +174 -0
  226. data/lib/locales/en/internet.yml +140 -3
  227. data/lib/locales/en/jack_handey.yml +54 -0
  228. data/lib/locales/en/kamen_rider.yml +452 -0
  229. data/lib/locales/en/kpop.yml +7 -7
  230. data/lib/locales/en/league_of_legends.yml +285 -6
  231. data/lib/locales/en/lebowski.yml +1 -1
  232. data/lib/locales/en/lovecraft.yml +76 -6
  233. data/lib/locales/en/military.yml +179 -5
  234. data/lib/locales/en/minecraft.yml +663 -0
  235. data/lib/locales/en/mitch_hedberg.yml +46 -0
  236. data/lib/locales/en/mountain.yml +171 -0
  237. data/lib/locales/en/mountaineering.yml +14 -0
  238. data/lib/locales/en/movie.yml +194 -2
  239. data/lib/locales/en/music.yml +461 -29
  240. data/lib/locales/en/myst.yml +87 -31
  241. data/lib/locales/en/name.yml +5 -4
  242. data/lib/locales/en/naruto.yml +230 -0
  243. data/lib/locales/en/one_piece.yml +2 -2
  244. data/lib/locales/en/opera.yml +169 -1
  245. data/lib/locales/en/overwatch.yml +2648 -2622
  246. data/lib/locales/en/pearl_jam.yml +213 -0
  247. data/lib/locales/en/phish.yml +392 -1
  248. data/lib/locales/en/pokemon.yml +417 -4
  249. data/lib/locales/en/prince.yml +227 -0
  250. data/lib/locales/en/quote.yml +692 -163
  251. data/lib/locales/en/rock_band.yml +1 -0
  252. data/lib/locales/en/room.yml +68 -0
  253. data/lib/locales/en/rush.yml +32 -0
  254. data/lib/locales/en/science.yml +481 -3
  255. data/lib/locales/en/shakespeare.yml +21 -24
  256. data/lib/locales/en/show.yml +597 -0
  257. data/lib/locales/en/simpsons.yml +668 -0
  258. data/lib/locales/en/source.yml +35 -0
  259. data/lib/locales/en/space.yml +1 -1
  260. data/lib/locales/en/spongebob.yml +489 -0
  261. data/lib/locales/en/sport.yml +130 -0
  262. data/lib/locales/en/star_trek.yml +1 -1
  263. data/lib/locales/en/star_wars.yml +568 -220
  264. data/lib/locales/en/stranger_thing.yml +1 -1
  265. data/lib/locales/en/street_fighter.yml +1524 -0
  266. data/lib/locales/en/studio_ghibli.yml +107 -0
  267. data/lib/locales/en/suits.yml +45 -0
  268. data/lib/locales/en/super_mario.yml +58 -0
  269. data/lib/locales/en/super_smash_bros.yml +23 -6
  270. data/lib/locales/en/supernatural.yml +141 -0
  271. data/lib/locales/en/tarkov.yml +593 -0
  272. data/lib/locales/en/tea.yml +172 -0
  273. data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
  274. data/lib/locales/en/the_office.yml +86 -0
  275. data/lib/locales/en/tolkien.yml +2453 -0
  276. data/lib/locales/en/touhou.yml +839 -0
  277. data/lib/locales/en/tron.yml +227 -0
  278. data/lib/locales/en/vehicle.yml +2809 -75
  279. data/lib/locales/en/volleyball.yml +501 -0
  280. data/lib/locales/en/warhammer_fantasy.yml +582 -0
  281. data/lib/locales/en/witcher.yml +426 -7
  282. data/lib/locales/en/world_of_warcraft.yml +122 -4
  283. data/lib/locales/en/zelda.yml +962 -4
  284. data/lib/locales/en-AU.yml +50 -10
  285. data/lib/locales/en-CA.yml +4 -1
  286. data/lib/locales/en-GB.yml +3 -2
  287. data/lib/locales/en-IND.yml +2 -1
  288. data/lib/locales/en-MS.yml +3 -1
  289. data/lib/locales/en-NEP.yml +4 -1
  290. data/lib/locales/en-NG.yml +1 -0
  291. data/lib/locales/en-NZ.yml +4 -1
  292. data/lib/locales/en-PAK.yml +3 -1
  293. data/lib/locales/en-SG.yml +3 -1
  294. data/lib/locales/en-UG.yml +1 -0
  295. data/lib/locales/en-US.yml +38 -12
  296. data/lib/locales/en-ZA.yml +1 -1
  297. data/lib/locales/en-au-ocker.yml +4 -1
  298. data/lib/locales/en.yml +0 -3
  299. data/lib/locales/es-AR.yml +4601 -0
  300. data/lib/locales/es-MX.yml +1 -1
  301. data/lib/locales/es.yml +58 -2
  302. data/lib/locales/fi-FI.yml +4 -2
  303. data/lib/locales/fr/address.yml +20 -0
  304. data/lib/locales/fr/adjective.yml +266 -0
  305. data/lib/locales/fr/ancient.yml +141 -0
  306. data/lib/locales/fr/animal.yml +5 -0
  307. data/lib/locales/fr/appliance.yml +4 -0
  308. data/lib/locales/fr/book.yml +7 -0
  309. data/lib/locales/fr/color.yml +4 -0
  310. data/lib/locales/fr/company.yml +17 -0
  311. data/lib/locales/fr/compass.yml +23 -0
  312. data/lib/locales/fr/demographic.yml +4 -0
  313. data/lib/locales/fr/gender.yml +6 -0
  314. data/lib/locales/fr/internet.yml +5 -0
  315. data/lib/locales/fr/lorem.yml +5 -0
  316. data/lib/locales/fr/measurement.yml +7 -0
  317. data/lib/locales/fr/name.yml +21 -0
  318. data/lib/locales/fr/phone_number.yml +7 -0
  319. data/lib/locales/fr/pokemon.yml +7 -0
  320. data/lib/locales/fr-CA.yml +22 -6
  321. data/lib/locales/fr-CH.yml +3 -3
  322. data/lib/locales/fr.yml +1 -113
  323. data/lib/locales/hy.yml +2 -1
  324. data/lib/locales/id.yml +3 -1
  325. data/lib/locales/it.yml +3 -1
  326. data/lib/locales/ja/README.md +13 -0
  327. data/lib/locales/ja/address.yml +120539 -0
  328. data/lib/locales/ja/adjective.yml +148 -0
  329. data/lib/locales/ja/ancient.yml +4 -0
  330. data/lib/locales/ja/animal.yml +5 -0
  331. data/lib/locales/ja/bank.yml +4 -0
  332. data/lib/locales/ja/book.yml +7 -0
  333. data/lib/locales/ja/cat.yml +5 -0
  334. data/lib/locales/ja/coffee.yml +4 -0
  335. data/lib/locales/ja/color.yml +4 -0
  336. data/lib/locales/ja/commerce.yml +11 -0
  337. data/lib/locales/ja/company.yml +8 -0
  338. data/lib/locales/ja/dog.yml +6 -0
  339. data/lib/locales/ja/emotion.yml +51 -0
  340. data/lib/locales/ja/food.yml +4 -0
  341. data/lib/locales/ja/gender.yml +4 -0
  342. data/lib/locales/ja/lorem.yml +9 -0
  343. data/lib/locales/ja/name.yml +13 -0
  344. data/lib/locales/ja/naruto.yml +230 -0
  345. data/lib/locales/ja/overwatch.yml +5 -0
  346. data/lib/locales/ja/phone_number.yml +7 -0
  347. data/lib/locales/ja/pokemon.yml +7 -0
  348. data/lib/locales/ja/relationship.yml +10 -0
  349. data/lib/locales/ja/restaurant.yml +11 -0
  350. data/lib/locales/ja/space.yml +5 -0
  351. data/lib/locales/ja/studio_ghibli.yml +112 -0
  352. data/lib/locales/ja/subscription.yml +8 -0
  353. data/lib/locales/ja/super_mario.yml +9 -0
  354. data/lib/locales/ja/super_smash_bros.yml +8 -0
  355. data/lib/locales/ja/university.yml +9 -0
  356. data/lib/locales/ja/zelda.yml +5 -0
  357. data/lib/locales/ko.yml +95 -2
  358. data/lib/locales/lt.yml +34 -0
  359. data/lib/locales/lv.yml +1 -1
  360. data/lib/locales/mi-NZ.yml +283 -0
  361. data/lib/locales/nb-NO.yml +5 -2
  362. data/lib/locales/nl.yml +1 -0
  363. data/lib/locales/pl.yml +2 -2
  364. data/lib/locales/pt-BR.yml +10 -2
  365. data/lib/locales/pt.yml +4 -2
  366. data/lib/locales/ru.yml +43 -1
  367. data/lib/locales/sk.yml +5 -2
  368. data/lib/locales/sv.yml +1 -0
  369. data/lib/locales/th.yml +76 -76
  370. data/lib/locales/tr.yml +1 -0
  371. data/lib/locales/uk.yml +3 -0
  372. data/lib/locales/vi.yml +1 -0
  373. data/lib/locales/zh-CN.yml +1 -0
  374. data/lib/locales/zh-TW.yml +1 -0
  375. metadata +219 -29
  376. data/lib/faker/default/fillmurray.rb +0 -45
  377. data/lib/faker/default/lorem_pixel.rb +0 -47
  378. data/lib/locales/en/hobbit.yml +0 -19
  379. data/lib/locales/en/lord_of_the_rings.yml +0 -6
  380. data/lib/locales/ja.yml +0 -101
@@ -5,18 +5,34 @@ module Faker
5
5
  class << self
6
6
  @last_rut = nil
7
7
 
8
- # Fixed param added for testing a specific RUT and check digit combination.
9
- def rut(legacy_min_rut = NOT_GIVEN, legacy_fixed = NOT_GIVEN, min_rut: 1, fixed: false)
10
- warn_for_deprecated_arguments do |keywords|
11
- keywords << :min_rut if legacy_min_rut != NOT_GIVEN
12
- keywords << :fixed if legacy_fixed != NOT_GIVEN
13
- end
14
-
8
+ ##
9
+ # Produces a random Chilean RUT (Rol Unico Tributario, ID with 8 digits).
10
+ #
11
+ # @param min_rut [Integer] Specifies the minimum value of the rut.
12
+ # @param fixed [Boolean] Determines if the rut is fixed (returns the min_rut value).
13
+ # @return [Number]
14
+ #
15
+ # @example
16
+ # Faker::ChileRut.rut #=> 11235813
17
+ # Faker::ChileRut.rut(min_rut: 20890156) #=> 31853211
18
+ # Faker::ChileRut.rut(min_rut: 20890156, fixed: true) #=> 20890156
19
+ #
20
+ # @faker.version 1.9.2
21
+ def rut(min_rut: 1, fixed: false)
15
22
  @last_rut = fixed ? min_rut : rand_in_range(min_rut, 99_999_999)
16
23
  end
17
24
 
25
+ ##
26
+ # Produces a random Chilean digito verificador (check-digit).
27
+ #
28
+ # @return [String]
29
+ #
30
+ # @example
31
+ # Faker::ChileRut.dv #=> "k"
32
+ #
33
+ # @faker.version 1.9.2
18
34
  def dv
19
- split_reversed_rut = @last_rut.to_s.reverse.split('')
35
+ split_reversed_rut = @last_rut.to_s.reverse.chars
20
36
  seq = [2, 3, 4, 5, 6, 7]
21
37
  i = 0
22
38
  digit_sum = split_reversed_rut.reduce(0) do |sum, n|
@@ -25,27 +41,49 @@ module Faker
25
41
  partial_result
26
42
  end
27
43
  partial_check_digit = 11 - (digit_sum % 11)
28
- if partial_check_digit == 11
44
+ case partial_check_digit
45
+ when 11
29
46
  '0'
30
- elsif partial_check_digit == 10
47
+ when 10
31
48
  'k'
32
49
  else
33
50
  partial_check_digit.to_s
34
51
  end
35
52
  end
36
53
 
54
+ ##
55
+ # Produces a random Chilean digito verificador (check-digit).
37
56
  # Alias for english speaking devs.
57
+ #
58
+ # @return [String]
59
+ #
60
+ # @example
61
+ # Faker::ChileRut.check_digit #=> "5"
62
+ #
63
+ # @faker.version 1.9.2
38
64
  def check_digit
39
65
  dv
40
66
  end
41
67
 
42
- def full_rut(legacy_min_rut = NOT_GIVEN, legacy_fixed = NOT_GIVEN, min_rut: 0, fixed: false)
43
- warn_for_deprecated_arguments do |keywords|
44
- keywords << :min_rut if legacy_min_rut != NOT_GIVEN
45
- keywords << :fixed if legacy_fixed != NOT_GIVEN
68
+ ##
69
+ # Produces a random Chilean RUT (Rol Unico Tributario, ID with 8 digits) with a dv (digito verificador, check-digit).
70
+ #
71
+ # @param min_rut [Integer] Specifies the minimum value of the rut.
72
+ # @param fixed [Boolean] Determines if the rut is fixed (returns the min_rut value).
73
+ # @return [String]
74
+ #
75
+ # @example
76
+ # Faker::ChileRut.full_rut #=> "30686957-4"
77
+ # Faker::ChileRut.full_rut(min_rut: 20890156) #=> "30686957-4"
78
+ # Faker::ChileRut.full_rut(min_rut: 30686957, fixed: true) #=> "30686957-4"
79
+ #
80
+ # @faker.version next
81
+ def full_rut(min_rut: 0, fixed: false, formatted: false)
82
+ if formatted
83
+ "#{rut(min_rut: min_rut, fixed: fixed).to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1.').reverse}-#{dv}"
84
+ else
85
+ "#{rut(min_rut: min_rut, fixed: fixed)}-#{dv}"
46
86
  end
47
-
48
- "#{rut(min_rut: min_rut, fixed: fixed)}-#{dv}"
49
87
  end
50
88
 
51
89
  attr_reader :last_rut
@@ -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,67 +4,137 @@ 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 Identifier) 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
15
- def isbn(legacy_base = NOT_GIVEN, base: 10)
16
- warn_for_deprecated_arguments do |keywords|
17
- keywords << :base if legacy_base != NOT_GIVEN
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
32
+ def isbn(base: 10)
33
+ case base
34
+ when 10 then generate_base10_isbn
35
+ when 13 then generate_base13_isbn
36
+ else raise ArgumentError, 'base must be 10 or 13'
18
37
  end
19
-
20
- base == 13 ? generate_base13_isbn : generate_base10_isbn
21
38
  end
22
39
 
23
- # By default generates 13 sign ean code in format 1234567890123
24
- # You can pass 8 to generate ean8 code
25
- def ean(legacy_base = NOT_GIVEN, base: 13)
26
- warn_for_deprecated_arguments do |keywords|
27
- keywords << :base if legacy_base != NOT_GIVEN
40
+ ##
41
+ # Produces a random EAN (European Article Number) code.
42
+ #
43
+ # @param base [Integer] the length of the code to generate (either 8 or 13)
44
+ # @return [String]
45
+ #
46
+ # @example
47
+ # Faker::Code.ean(base: 8) #=> "36941070"
48
+ # @example
49
+ # Faker::Code.ean #=> "9941880131907"
50
+ #
51
+ # @faker.version 2.2.0
52
+ def ean(base: 13)
53
+ case base
54
+ when 8 then generate_base8_ean
55
+ when 13 then generate_base13_ean
56
+ else raise ArgumentError, 'base must be 8 or 13'
28
57
  end
29
-
30
- base == 8 ? generate_base8_ean : generate_base13_ean
31
58
  end
32
59
 
60
+ ##
61
+ # Produces a random RUT (Rol Unico Nacional) code.
62
+ #
63
+ # @return [String]
64
+ #
65
+ # @example
66
+ # Faker::Code.rut #=> "91611842-2"
67
+ #
68
+ # @faker.version 1.9.4
33
69
  def rut
34
70
  value = Number.number(digits: 8).to_s
35
71
  vd = rut_verificator_digit(value)
36
72
  value << "-#{vd}"
37
73
  end
38
74
 
75
+ ##
76
+ # Produces a random NRIC (National Registry Identity Card) code.
39
77
  # By default generates a Singaporean NRIC ID for someone
40
78
  # who is born between the age of 18 and 65.
41
- def nric(legacy_min_age = NOT_GIVEN, legacy_max_age = NOT_GIVEN, min_age: 18, max_age: 65)
42
- warn_for_deprecated_arguments do |keywords|
43
- keywords << :min_age if legacy_min_age != NOT_GIVEN
44
- keywords << :max_age if legacy_max_age != NOT_GIVEN
45
- end
46
-
79
+ #
80
+ # @param min_age [Integer] the min age of the person in years
81
+ # @param max_age [Integer] the max age of the person in years
82
+ # @return [String]
83
+ #
84
+ # @example
85
+ # Faker::Code.nric(min_age: 25, max_age: 50) #=> "S9347283G"
86
+ # @example
87
+ # Faker::Code.nric(max_age: 55) #=> "S7876903C"
88
+ # @example
89
+ # Faker::Code.nric(min_age: 25) #=> "S6281697Z"
90
+ # @example
91
+ # Faker::Code.nric #=> "S6372958B"
92
+ #
93
+ # @faker.version 2.2.0
94
+ def nric(min_age: 18, max_age: 65)
47
95
  birthyear = Date.birthday(min_age: min_age, max_age: max_age).year
48
96
  prefix = birthyear < 2000 ? 'S' : 'T'
49
- values = birthyear.to_s[-2..-1]
97
+ values = birthyear.to_s[-2..]
50
98
  values << regexify(/\d{5}/)
51
99
  check_alpha = generate_nric_check_alphabet(values, prefix)
52
100
  "#{prefix}#{values}#{check_alpha}"
53
101
  end
54
102
 
55
- # Generate GSM modem, device or mobile phone 15 digit IMEI number.
103
+ ##
104
+ # Produces a random IMEI (International Mobile Equipment Number) code.
105
+ #
106
+ # @return [String]
107
+ #
108
+ # @example
109
+ # Faker::Code.imei #=> "492033129092256"
110
+ #
111
+ # @faker.version 1.9.4
56
112
  def imei
57
113
  generate_imei
58
114
  end
59
115
 
60
- # Retrieves a real Amazon ASIN code list taken from
61
- # https://archive.org/details/asin_listing
116
+ ##
117
+ # Retrieves a real Amazon ASIN code from https://archive.org/details/asin_listing
118
+ #
119
+ # @return [String]
120
+ #
121
+ # @example
122
+ # Faker::Code.asin #=> "B000MZW1GE"
123
+ #
124
+ # @faker.version 1.9.4
62
125
  def asin
63
126
  fetch('code.asin')
64
127
  end
65
128
 
66
- # Generates Social Insurance Number issued in Canada
67
- # https://en.wikipedia.org/wiki/Social_Insurance_Number
129
+ ##
130
+ # Produces a random SIN (Social Insurance Number for Canada) code.
131
+ #
132
+ # @return [String]
133
+ #
134
+ # @example
135
+ # Faker::Code.sin #=> "996586962"
136
+ #
137
+ # @faker.version 1.9.4
68
138
  def sin
69
139
  # 1 - province or temporary resident
70
140
  # 2-8 - random numbers
@@ -77,7 +147,7 @@ module Faker
77
147
  partial = Array.new(7) { Faker::Config.random.rand(0..9) }.join
78
148
 
79
149
  # Generate 9th digit
80
- check_digit = generate_sin_check_digit(registry + partial + '0').to_s
150
+ check_digit = generate_sin_check_digit("#{registry}#{partial}0").to_s
81
151
 
82
152
  registry + partial + check_digit
83
153
  end
@@ -90,8 +160,6 @@ module Faker
90
160
  def generate_imei
91
161
  str = Array.new(15, 0)
92
162
  sum = 0
93
- t = 0
94
- len_offset = 0
95
163
  len = 15
96
164
 
97
165
  # Fill in the first two values of the string based with the specified prefix.
@@ -125,7 +193,7 @@ module Faker
125
193
  str[len - 1] = (10 - (sum % 10)) % 10
126
194
 
127
195
  # Output the IMEI value.
128
- str.join('')
196
+ str.join
129
197
  end
130
198
 
131
199
  def generate_base10_isbn
@@ -137,24 +205,24 @@ module Faker
137
205
  def generate_base13_isbn
138
206
  values = regexify(/\d{12}/)
139
207
  remainder = sum(values) { |value, index| index.even? ? value.to_i : value.to_i * 3 } % 10
140
- values << "-#{((10 - remainder) % 10)}"
208
+ values << "-#{(10 - remainder) % 10}"
141
209
  end
142
210
 
143
211
  def sum(values)
144
- values.split(//).each_with_index.inject(0) do |sum, (value, index)|
212
+ values.chars.each_with_index.inject(0) do |sum, (value, index)|
145
213
  sum + yield(value, index)
146
214
  end
147
215
  end
148
216
 
149
217
  def generate_base8_ean
150
218
  values = regexify(/\d{7}/)
151
- check_digit = 10 - values.split(//).each_with_index.inject(0) { |s, (v, i)| s + v.to_i * EAN_CHECK_DIGIT8[i] } % 10
219
+ check_digit = 10 - values.chars.each_with_index.inject(0) { |s, (v, i)| s + v.to_i * EAN_CHECK_DIGIT8[i] } % 10
152
220
  values << (check_digit == 10 ? 0 : check_digit).to_s
153
221
  end
154
222
 
155
223
  def generate_base13_ean
156
224
  values = regexify(/\d{12}/)
157
- check_digit = 10 - values.split(//).each_with_index.inject(0) { |s, (v, i)| s + v.to_i * EAN_CHECK_DIGIT13[i] } % 10
225
+ check_digit = 10 - values.chars.each_with_index.inject(0) { |s, (v, i)| s + v.to_i * EAN_CHECK_DIGIT13[i] } % 10
158
226
  values << (check_digit == 10 ? 0 : check_digit).to_s
159
227
  end
160
228
 
@@ -162,13 +230,13 @@ module Faker
162
230
  EAN_CHECK_DIGIT13 = [1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3].freeze
163
231
 
164
232
  def rut_verificator_digit(rut)
165
- 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(:+)
233
+ total = rut.to_s.rjust(8, '0').chars.zip(%w[3 2 7 6 5 4 3 2]).collect { |a, b| a.to_i * b.to_i }.inject(:+)
166
234
  (11 - total % 11).to_s.gsub(/10/, 'k').gsub(/11/, '0')
167
235
  end
168
236
 
169
237
  def generate_nric_check_alphabet(values, prefix)
170
238
  weight = %w[2 7 6 5 4 3 2]
171
- total = values.split(//).zip(weight).collect { |a, b| a.to_i * b.to_i }.inject(:+)
239
+ total = values.chars.zip(weight).collect { |a, b| a.to_i * b.to_i }.inject(:+)
172
240
  total += 4 if prefix == 'T'
173
241
  %w[A B C D E F G H I Z J][10 - total % 11]
174
242
  end
@@ -3,17 +3,34 @@
3
3
  module Faker
4
4
  class Color < Base
5
5
  class << self
6
+ LIGHTNESS_LOOKUP = {
7
+ light: 0.8,
8
+ dark: 0.2
9
+ }.freeze
6
10
  ##
7
11
  # Produces a hex color code.
12
+ # Clients are able to specify the hue, saturation, or lightness of the required color.
13
+ # Alternatively a client can simply specify that they need a light or dark color.
14
+ #
15
+ # @param args [Hash, Symbol] Allows the client to specify what color should be return
8
16
  #
9
17
  # @return [String]
10
18
  #
11
19
  # @example
12
20
  # Faker::Color.hex_color #=> "#31a785"
21
+ # @example
22
+ # Faker::Color.hex_color(hue: 118, saturation: 1, lightness: 0.53) #=> "#048700"
23
+ # @example
24
+ # Faker::Color.hex_color(:light) #=> "#FFEE99"
25
+ # @example
26
+ # Faker::Color.hex_color(:dark) #=> "#665500"
13
27
  #
14
- # @faker.version 1.5.0
15
- def hex_color
16
- format('#%06x', (rand * 0xffffff))
28
+ # @faker.version next
29
+ def hex_color(args = nil)
30
+ hsl_hash = {}
31
+ hsl_hash = { lightness: LIGHTNESS_LOOKUP[args] } if %i[dark light].include?(args)
32
+ hsl_hash = args if args.is_a?(Hash)
33
+ hsl_to_hex(hsl_color(**hsl_hash))
17
34
  end
18
35
 
19
36
  ##
@@ -51,14 +68,28 @@ module Faker
51
68
  # Produces an array of floats representing an HSL color.
52
69
  # The array is in the form of `[hue, saturation, lightness]`.
53
70
  #
71
+ # @param hue [FLoat] Optional value to use for hue
72
+ # @param saturation [Float] Optional value to use for saturation
73
+ # @param lightness [Float] Optional value to use for lightness
54
74
  # @return [Array(Float, Float, Float)]
55
75
  #
56
76
  # @example
57
77
  # Faker::Color.hsl_color #=> [69.87, 0.66, 0.3]
78
+ # @example
79
+ # Faker::Color.hsl_color(hue: 70, saturation: 0.5, lightness: 0.8) #=> [70, 0.5, 0.8]
80
+ # @example
81
+ # Faker::Color.hsl_color(hue: 70) #=> [70, 0.66, 0.6]
82
+ # @example
83
+ # Faker::Color.hsl_color(saturation: 0.2) #=> [54, 0.2, 0.3]
84
+ # @example
85
+ # Faker::Color.hsl_color(lightness: 0.6) #=> [69.87, 0.66, 0.6]
58
86
  #
59
- # @faker.version 1.5.0
60
- def hsl_color
61
- [sample((0..360).to_a), rand.round(2), rand.round(2)]
87
+ # @faker.version next
88
+ def hsl_color(hue: nil, saturation: nil, lightness: nil)
89
+ valid_hue = hue || sample((0..360).to_a)
90
+ valid_saturation = saturation&.clamp(0, 1) || rand.round(2)
91
+ valid_lightness = lightness&.clamp(0, 1) || rand.round(2)
92
+ [valid_hue, valid_saturation, valid_lightness]
62
93
  end
63
94
 
64
95
  ##
@@ -74,6 +105,46 @@ module Faker
74
105
  def hsla_color
75
106
  hsl_color << rand.round(1)
76
107
  end
108
+
109
+ private
110
+
111
+ ##
112
+ # Produces a hex code representation of an HSL color
113
+ #
114
+ # @param a_hsl_color [Array(Float, Float, Float)] The array that represents the HSL color
115
+ #
116
+ # @return [String]
117
+ #
118
+ # @example
119
+ # hsl_to_hex([50, 100,80]) #=> #FFEE99
120
+ #
121
+ # @see https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB
122
+ # @see https://github.com/jpmckinney/color-generator/blob/master/lib/color-generator.rb
123
+ #
124
+ def hsl_to_hex(a_hsl_color)
125
+ h, s, l = a_hsl_color
126
+ c = (1 - (2 * l - 1).abs) * s
127
+ h_prime = h / 60
128
+ x = c * (1 - (h_prime % 2 - 1).abs)
129
+ m = l - 0.5 * c
130
+
131
+ rgb = case h_prime.to_i
132
+ when 0 # 0 <= H' < 1
133
+ [c, x, 0]
134
+ when 1 # 1 <= H' < 2
135
+ [x, c, 0]
136
+ when 2 # 2 <= H' < 3
137
+ [0, c, x]
138
+ when 3 # 3 <= H' < 4
139
+ [0, x, c]
140
+ when 4 # 4 <= H' < 5
141
+ [x, 0, c]
142
+ else # 5 <= H' < 6
143
+ [c, 0, x]
144
+ end.map { |value| ((value + m) * 255).round }
145
+
146
+ format('#%02x%02x%02x', rgb[0], rgb[1], rgb[2])
147
+ end
77
148
  end
78
149
  end
79
150
  end
@@ -3,15 +3,31 @@
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
 
10
- def promotion_code(legacy_digits = NOT_GIVEN, digits: 6)
11
- warn_for_deprecated_arguments do |keywords|
12
- keywords << :digits if legacy_digits != NOT_GIVEN
13
- end
14
-
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
30
+ def promotion_code(digits: 6)
15
31
  [
16
32
  fetch('commerce.promotion_code.adjective'),
17
33
  fetch('commerce.promotion_code.noun'),
@@ -19,54 +35,115 @@ module Faker
19
35
  ].join
20
36
  end
21
37
 
22
- def department(legacy_max = NOT_GIVEN, legacy_fixed_amount = NOT_GIVEN, max: 3, fixed_amount: false)
23
- warn_for_deprecated_arguments do |keywords|
24
- keywords << :max if legacy_max != NOT_GIVEN
25
- keywords << :fixed_amount if legacy_fixed_amount != NOT_GIVEN
26
- end
27
-
38
+ ##
39
+ # Produces a random department.
40
+ #
41
+ # @param max [Integer] Updates the maximum number of names used to generate the department name.
42
+ # @param fixed_amount [Boolean] Fixes the amount of departments to use instead of using a range.
43
+ # @return [String]
44
+ #
45
+ # @example
46
+ # Faker::Commerce.department #=> "Grocery, Health & Beauty"
47
+ # Faker::Commerce.department(max: 5) #=> "Grocery, Books, Health & Beauty"
48
+ # Faker::Commerce.department(max: 2, fixed_amount: true) #=> "Books & Tools"
49
+ #
50
+ # @faker.version 1.2.0
51
+ def department(max: 3, fixed_amount: false)
28
52
  num = max if fixed_amount
29
53
  num ||= 1 + rand(max)
30
54
 
31
55
  categories = categories(num)
32
56
 
33
- return merge_categories(categories) if num > 1
34
-
35
- categories[0]
57
+ if categories.is_a?(Array)
58
+ if categories.length > 1
59
+ merge_categories(categories)
60
+ else
61
+ categories[0]
62
+ end
63
+ else
64
+ categories
65
+ end
36
66
  end
37
67
 
68
+ ##
69
+ # Produces a random product name.
70
+ #
71
+ # @return [String]
72
+ #
73
+ # @example
74
+ # Faker::Commerce.product_name #=> "Practical Granite Shirt"
75
+ #
76
+ # @faker.version 1.2.0
38
77
  def product_name
39
78
  "#{fetch('commerce.product_name.adjective')} #{fetch('commerce.product_name.material')} #{fetch('commerce.product_name.product')}"
40
79
  end
41
80
 
81
+ ##
82
+ # Produces a random material.
83
+ #
84
+ # @return [String]
85
+ #
86
+ # @example
87
+ # Faker::Commerce.material #=> "Plastic"
88
+ #
89
+ # @faker.version 1.5.0
42
90
  def material
43
91
  fetch('commerce.product_name.material')
44
92
  end
45
93
 
46
- def price(legacy_range = NOT_GIVEN, legacy_as_string = NOT_GIVEN, range: 0..100.0, as_string: false)
47
- warn_for_deprecated_arguments do |keywords|
48
- keywords << :range if legacy_range != NOT_GIVEN
49
- keywords << :as_string if legacy_as_string != NOT_GIVEN
50
- end
51
-
94
+ ##
95
+ # Produces a random product price.
96
+ #
97
+ # @param range [Range] A range to generate the random number within.
98
+ # @param as_string [Boolean] Changes the return value to [String].
99
+ # @return [Float]
100
+ #
101
+ # @example
102
+ # Faker::Commerce.price #=> 44.6
103
+ # Faker::Commerce.price(range: 0..10.0, as_string: true) #=> "2.18"
104
+ #
105
+ # @faker.version 1.2.0
106
+ def price(range: 0..100.0, as_string: false)
52
107
  price = (rand(range) * 100).floor / 100.0
53
108
  if as_string
54
109
  price_parts = price.to_s.split('.')
55
- price = price_parts[0] + '.' + price_parts[-1].ljust(2, '0')
110
+ price = "#{price_parts[0]}.#{price_parts[-1].ljust(2, '0')}"
56
111
  end
57
112
  price
58
113
  end
59
114
 
115
+ ##
116
+ # Produces a randomized string of a brand name
117
+ # @example
118
+ # Faker::Commerce.brand #=> 'Apple'
119
+ #
120
+ # @return [string]
121
+ #
122
+ # @faker.version next
123
+ #
124
+ ##
125
+ def brand
126
+ fetch('commerce.brand')
127
+ end
128
+
129
+ ##
130
+ # Produces a randomized string of a vendor name
131
+ # @example
132
+ # Faker::Commerce.vendor #=> 'Dollar General'
133
+ #
134
+ # @return [string]
135
+ #
136
+ # @faker.version next
137
+ #
138
+ ##
139
+ def vendor
140
+ fetch('commerce.vendor')
141
+ end
142
+
60
143
  private
61
144
 
62
145
  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
146
+ sample(fetch_all('commerce.department'), num)
70
147
  end
71
148
 
72
149
  def merge_categories(categories)