faker 2.0.0 → 3.8.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 (584) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1896 -11
  3. data/README.md +140 -307
  4. data/lib/faker/blockchain/aeternity.rb +70 -0
  5. data/lib/faker/blockchain/bitcoin.rb +27 -2
  6. data/lib/faker/blockchain/ethereum.rb +11 -1
  7. data/lib/faker/blockchain/tezos.rb +92 -9
  8. data/lib/faker/blockchain.rb +9 -0
  9. data/lib/faker/books/culture_series.rb +49 -0
  10. data/lib/faker/books/dune.rb +71 -5
  11. data/lib/faker/books/lovecraft.rb +182 -7
  12. data/lib/faker/books/the_kingkiller_chronicle.rb +61 -0
  13. data/lib/faker/books.rb +9 -0
  14. data/lib/faker/creature/animal.rb +9 -0
  15. data/lib/faker/creature/bird.rb +203 -0
  16. data/lib/faker/creature/cat.rb +27 -0
  17. data/lib/faker/creature/dog.rb +72 -0
  18. data/lib/faker/creature/horse.rb +18 -0
  19. data/lib/faker/creature.rb +9 -0
  20. data/lib/faker/default/address.rb +251 -6
  21. data/lib/faker/default/adjective.rb +35 -0
  22. data/lib/faker/default/alphanumeric.rb +49 -6
  23. data/lib/faker/default/ancient.rb +36 -0
  24. data/lib/faker/default/app.rb +45 -0
  25. data/lib/faker/default/appliance.rb +18 -0
  26. data/lib/faker/default/artist.rb +9 -0
  27. data/lib/faker/default/avatar.rb +32 -1
  28. data/lib/faker/default/bank.rb +117 -22
  29. data/lib/faker/default/barcode.rb +165 -0
  30. data/lib/faker/default/beer.rb +75 -3
  31. data/lib/faker/default/blood.rb +48 -0
  32. data/lib/faker/default/book.rb +61 -0
  33. data/lib/faker/default/boolean.rb +14 -1
  34. data/lib/faker/default/business.rb +27 -0
  35. data/lib/faker/default/camera.rb +46 -0
  36. data/lib/faker/default/cannabis.rb +90 -0
  37. data/lib/faker/default/chile_rut.rb +62 -8
  38. data/lib/faker/default/chuck_norris.rb +13 -2
  39. data/lib/faker/default/code.rb +165 -38
  40. data/lib/faker/default/coffee.rb +45 -0
  41. data/lib/faker/default/coin.rb +18 -0
  42. data/lib/faker/default/color.rb +123 -5
  43. data/lib/faker/default/commerce.rb +102 -11
  44. data/lib/faker/default/company.rb +445 -23
  45. data/lib/faker/default/compass.rb +135 -0
  46. data/lib/faker/default/computer.rb +63 -0
  47. data/lib/faker/default/construction.rb +54 -0
  48. data/lib/faker/default/cosmere.rb +90 -0
  49. data/lib/faker/default/crypto.rb +52 -5
  50. data/lib/faker/default/crypto_coin.rb +45 -0
  51. data/lib/faker/default/currency.rb +27 -0
  52. data/lib/faker/default/date.rb +145 -5
  53. data/lib/faker/default/dc_comics.rb +45 -0
  54. data/lib/faker/default/demographic.rb +57 -0
  55. data/lib/faker/default/dessert.rb +27 -0
  56. data/lib/faker/default/device.rb +54 -0
  57. data/lib/faker/default/driving_licence.rb +87 -14
  58. data/lib/faker/default/drone.rb +332 -0
  59. data/lib/faker/default/educator.rb +73 -6
  60. data/lib/faker/default/electrical_components.rb +27 -0
  61. data/lib/faker/default/emotion.rb +33 -0
  62. data/lib/faker/default/esport.rb +45 -0
  63. data/lib/faker/default/file.rb +53 -4
  64. data/lib/faker/default/finance.rb +74 -2
  65. data/lib/faker/default/food.rb +93 -3
  66. data/lib/faker/default/funny_name.rb +45 -0
  67. data/lib/faker/default/game.rb +48 -0
  68. data/lib/faker/default/gender.rb +31 -0
  69. data/lib/faker/default/greek_philosophers.rb +18 -0
  70. data/lib/faker/default/hacker.rb +59 -1
  71. data/lib/faker/default/hipster.rb +103 -7
  72. data/lib/faker/default/hobby.rb +22 -0
  73. data/lib/faker/default/house.rb +18 -0
  74. data/lib/faker/default/html.rb +230 -0
  75. data/lib/faker/default/id_number.rb +313 -8
  76. data/lib/faker/default/industry_segments.rb +36 -0
  77. data/lib/faker/default/invoice.rb +34 -7
  78. data/lib/faker/default/job.rb +36 -0
  79. data/lib/faker/default/json.rb +68 -8
  80. data/lib/faker/default/kpop.rb +54 -0
  81. data/lib/faker/default/lorem.rb +194 -21
  82. data/lib/faker/default/lorem_flickr.rb +67 -2
  83. data/lib/faker/default/markdown.rb +100 -9
  84. data/lib/faker/default/marketing.rb +9 -0
  85. data/lib/faker/default/measurement.rb +93 -2
  86. data/lib/faker/default/military.rb +71 -0
  87. data/lib/faker/default/mountain.rb +33 -0
  88. data/lib/faker/default/movie.rb +33 -0
  89. data/lib/faker/default/name.rb +98 -0
  90. data/lib/faker/default/nation.rb +45 -5
  91. data/lib/faker/default/{nhs.rb → national_health_service.rb} +27 -4
  92. data/lib/faker/default/nato_phonetic_alphabet.rb +9 -0
  93. data/lib/faker/default/number.rb +151 -12
  94. data/lib/faker/default/omniauth.rb +233 -92
  95. data/lib/faker/default/phone_number.rb +113 -11
  96. data/lib/faker/default/placeholdit.rb +24 -3
  97. data/lib/faker/default/programming_language.rb +18 -0
  98. data/lib/faker/default/quote.rb +124 -0
  99. data/lib/faker/default/relationship.rb +46 -1
  100. data/lib/faker/default/restaurant.rb +54 -2
  101. data/lib/faker/default/science.rb +135 -0
  102. data/lib/faker/default/slack_emoji.rb +81 -0
  103. data/lib/faker/default/source.rb +43 -0
  104. data/lib/faker/default/south_africa.rb +93 -3
  105. data/lib/faker/default/space.rb +128 -1
  106. data/lib/faker/default/sport.rb +116 -0
  107. data/lib/faker/default/string.rb +18 -4
  108. data/lib/faker/default/stripe.rb +64 -3
  109. data/lib/faker/default/subscription.rb +45 -0
  110. data/lib/faker/default/superhero.rb +45 -0
  111. data/lib/faker/default/tea.rb +41 -0
  112. data/lib/faker/default/team.rb +45 -0
  113. data/lib/faker/default/theater.rb +49 -0
  114. data/lib/faker/default/time.rb +80 -0
  115. data/lib/faker/default/types.rb +91 -11
  116. data/lib/faker/default/university.rb +45 -0
  117. data/lib/faker/default/vehicle.rb +225 -42
  118. data/lib/faker/default/verb.rb +45 -0
  119. data/lib/faker/default/vulnerability_identifier.rb +23 -0
  120. data/lib/faker/default/world_cup.rb +50 -0
  121. data/lib/faker/default/x.rb +189 -0
  122. data/lib/faker/default.rb +9 -0
  123. data/lib/faker/fantasy/tolkien.rb +67 -0
  124. data/lib/faker/fantasy.rb +9 -0
  125. data/lib/faker/games/clash_of_clans.rb +48 -0
  126. data/lib/faker/games/control.rb +113 -0
  127. data/lib/faker/games/dnd.rb +178 -0
  128. data/lib/faker/games/dota.rb +60 -0
  129. data/lib/faker/games/elder_scrolls.rb +98 -0
  130. data/lib/faker/games/fallout.rb +37 -0
  131. data/lib/faker/games/final_fantasy_xiv.rb +73 -0
  132. data/lib/faker/games/half_life.rb +27 -0
  133. data/lib/faker/games/heroes.rb +40 -0
  134. data/lib/faker/games/heroes_of_the_storm.rb +38 -2
  135. data/lib/faker/games/league_of_legends.rb +54 -0
  136. data/lib/faker/games/minecraft.rb +113 -0
  137. data/lib/faker/games/myst.rb +45 -0
  138. data/lib/faker/games/overwatch.rb +27 -0
  139. data/lib/faker/games/pokemon.rb +27 -0
  140. data/lib/faker/games/sonic_the_hedgehog.rb +27 -0
  141. data/lib/faker/games/street_fighter.rb +61 -0
  142. data/lib/faker/games/super_mario.rb +48 -0
  143. data/lib/faker/games/super_smash_bros.rb +18 -0
  144. data/lib/faker/games/tarkov.rb +205 -0
  145. data/lib/faker/games/touhou.rb +75 -0
  146. data/lib/faker/games/warhammer_fantasy.rb +74 -0
  147. data/lib/faker/games/witcher.rb +93 -0
  148. data/lib/faker/games/world_of_warcraft.rb +44 -1
  149. data/lib/faker/games/zelda.rb +37 -1
  150. data/lib/faker/games.rb +9 -0
  151. data/lib/faker/internet/http.rb +48 -0
  152. data/lib/faker/internet.rb +582 -0
  153. data/lib/faker/japanese_media/conan.rb +48 -0
  154. data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
  155. data/lib/faker/japanese_media/doraemon.rb +48 -0
  156. data/lib/faker/japanese_media/dragon_ball.rb +35 -0
  157. data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +48 -0
  158. data/lib/faker/japanese_media/kamen_rider.rb +102 -0
  159. data/lib/faker/japanese_media/naruto.rb +61 -0
  160. data/lib/faker/japanese_media/one_piece.rb +55 -1
  161. data/lib/faker/japanese_media/studio_ghibli.rb +48 -0
  162. data/lib/faker/japanese_media/sword_art_online.rb +36 -0
  163. data/lib/faker/japanese_media.rb +9 -0
  164. data/lib/faker/locations/australia.rb +49 -0
  165. data/lib/faker/locations.rb +9 -0
  166. data/lib/faker/movies/avatar.rb +49 -0
  167. data/lib/faker/movies/back_to_the_future.rb +28 -0
  168. data/lib/faker/movies/departed.rb +49 -0
  169. data/lib/faker/movies/ghostbusters.rb +28 -0
  170. data/lib/faker/movies/hackers.rb +48 -0
  171. data/lib/faker/movies/harry_potter.rb +54 -0
  172. data/lib/faker/movies/hitchhikers_guide_to_the_galaxy.rb +69 -0
  173. data/lib/faker/movies/hobbit.rb +41 -4
  174. data/lib/faker/movies/how_to_train_your_dragon.rb +48 -0
  175. data/lib/faker/movies/lebowski.rb +27 -0
  176. data/lib/faker/movies/lord_of_the_rings.rb +31 -3
  177. data/lib/faker/movies/princess_bride.rb +19 -0
  178. data/lib/faker/movies/star_wars.rb +169 -5
  179. data/lib/faker/movies/the_room.rb +63 -0
  180. data/lib/faker/movies/tron.rb +161 -0
  181. data/lib/faker/movies/v_for_vendetta.rb +29 -0
  182. data/lib/faker/movies.rb +9 -0
  183. data/lib/faker/music/bossa_nova.rb +35 -0
  184. data/lib/faker/music/grateful_dead.rb +18 -2
  185. data/lib/faker/music/hiphop.rb +48 -0
  186. data/lib/faker/music/opera.rb +273 -1
  187. data/lib/faker/music/pearl_jam.rb +48 -0
  188. data/lib/faker/music/phish.rb +36 -1
  189. data/lib/faker/music/prince.rb +64 -0
  190. data/lib/faker/music/rock_band.rb +21 -0
  191. data/lib/faker/music/rush.rb +35 -0
  192. data/lib/faker/music/smashing_pumpkins.rb +62 -0
  193. data/lib/faker/music/umphreys_mcgee.rb +9 -0
  194. data/lib/faker/music.rb +149 -0
  195. data/lib/faker/quotes/chiquito.rb +80 -0
  196. data/lib/faker/quotes/rajnikanth.rb +27 -0
  197. data/lib/faker/quotes/shakespeare.rb +70 -0
  198. data/lib/faker/quotes.rb +9 -0
  199. data/lib/faker/religion/bible.rb +50 -0
  200. data/lib/faker/religion.rb +9 -0
  201. data/lib/faker/sports/basketball.rb +36 -0
  202. data/lib/faker/sports/chess.rb +90 -0
  203. data/lib/faker/sports/football.rb +45 -0
  204. data/lib/faker/sports/mountaineering.rb +22 -0
  205. data/lib/faker/sports/volleyball.rb +74 -0
  206. data/lib/faker/sports.rb +9 -0
  207. data/lib/faker/travel/airport.rb +43 -0
  208. data/lib/faker/travel/train_station.rb +54 -0
  209. data/lib/faker/travel.rb +9 -0
  210. data/lib/faker/tv_shows/aqua_teen_hunger_force.rb +22 -0
  211. data/lib/faker/tv_shows/archer.rb +51 -0
  212. data/lib/faker/tv_shows/big_bang_theory.rb +37 -0
  213. data/lib/faker/tv_shows/bojack_horseman.rb +28 -0
  214. data/lib/faker/tv_shows/breaking_bad.rb +18 -0
  215. data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
  216. data/lib/faker/tv_shows/buffy.rb +47 -2
  217. data/lib/faker/tv_shows/community.rb +19 -0
  218. data/lib/faker/tv_shows/dr_who.rb +65 -2
  219. data/lib/faker/tv_shows/dumb_and_dumber.rb +28 -0
  220. data/lib/faker/tv_shows/family_guy.rb +28 -0
  221. data/lib/faker/tv_shows/final_space.rb +51 -0
  222. data/lib/faker/tv_shows/friends.rb +27 -0
  223. data/lib/faker/tv_shows/futurama.rb +65 -0
  224. data/lib/faker/tv_shows/game_of_thrones.rb +46 -0
  225. data/lib/faker/tv_shows/hey_arnold.rb +27 -0
  226. data/lib/faker/tv_shows/how_i_met_your_mother.rb +37 -0
  227. data/lib/faker/tv_shows/michael_scott.rb +10 -0
  228. data/lib/faker/tv_shows/new_girl.rb +19 -0
  229. data/lib/faker/tv_shows/parks_and_rec.rb +18 -0
  230. data/lib/faker/tv_shows/rick_and_morty.rb +28 -0
  231. data/lib/faker/tv_shows/ru_paul.rb +18 -0
  232. data/lib/faker/tv_shows/seinfeld.rb +28 -0
  233. data/lib/faker/tv_shows/silicon_valley.rb +75 -0
  234. data/lib/faker/tv_shows/simpsons.rb +42 -0
  235. data/lib/faker/tv_shows/south_park.rb +34 -0
  236. data/lib/faker/tv_shows/spongebob.rb +50 -0
  237. data/lib/faker/tv_shows/star_trek.rb +36 -0
  238. data/lib/faker/tv_shows/stargate.rb +28 -0
  239. data/lib/faker/tv_shows/stranger_things.rb +19 -0
  240. data/lib/faker/tv_shows/suits.rb +37 -0
  241. data/lib/faker/tv_shows/supernatural.rb +48 -0
  242. data/lib/faker/tv_shows/the_expanse.rb +36 -0
  243. data/lib/faker/tv_shows/the_fresh_prince_of_bel_air.rb +30 -2
  244. data/lib/faker/tv_shows/the_it_crowd.rb +37 -0
  245. data/lib/faker/tv_shows/the_office.rb +37 -0
  246. data/lib/faker/tv_shows/the_thick_of_it.rb +28 -0
  247. data/lib/faker/tv_shows/twin_peaks.rb +28 -0
  248. data/lib/faker/tv_shows/venture_bros.rb +38 -0
  249. data/lib/faker/tv_shows.rb +9 -0
  250. data/lib/faker/version.rb +2 -2
  251. data/lib/faker.rb +125 -45
  252. data/lib/helpers/base58.rb +1 -1
  253. data/lib/helpers/char.rb +22 -27
  254. data/lib/helpers/deprecator.rb +118 -0
  255. data/lib/helpers/positional_generator.rb +478 -0
  256. data/lib/helpers/unique_generator.rb +18 -14
  257. data/lib/locales/README.md +18 -2
  258. data/lib/locales/ar.yml +1608 -46
  259. data/lib/locales/bg.yml +937 -21
  260. data/lib/locales/ca-CAT.yml +347 -12
  261. data/lib/locales/ca.yml +580 -15
  262. data/lib/locales/da-DK.yml +530 -36
  263. data/lib/locales/de-AT.yml +3487 -25
  264. data/lib/locales/de-CH.yml +6051 -9
  265. data/lib/locales/de.yml +7185 -97
  266. data/lib/locales/ee.yml +1185 -27
  267. data/lib/locales/en/address.yml +1829 -559
  268. data/lib/locales/en/adjective.yml +179 -0
  269. data/lib/locales/en/airport.yml +381 -0
  270. data/lib/locales/en/ancient.yml +128 -4
  271. data/lib/locales/en/animal.yml +141 -2
  272. data/lib/locales/en/app.yml +89 -2
  273. data/lib/locales/en/appliance.yml +81 -2
  274. data/lib/locales/en/aqua_teen_hunger_force.yml +33 -1
  275. data/lib/locales/en/archer.yml +75 -0
  276. data/lib/locales/en/artist.yml +43 -1
  277. data/lib/locales/en/australia.yml +108 -0
  278. data/lib/locales/en/avatar.yml +57 -0
  279. data/lib/locales/en/back_to_the_future.yml +145 -117
  280. data/lib/locales/en/bank.yml +92 -3
  281. data/lib/locales/en/barcode.yml +24 -0
  282. data/lib/locales/en/beer.yml +232 -6
  283. data/lib/locales/en/bible.yml +87 -0
  284. data/lib/locales/en/big_bang_theory.yml +37 -0
  285. data/lib/locales/en/bird.yml +1280 -0
  286. data/lib/locales/en/blood.yml +13 -0
  287. data/lib/locales/en/bojack_horseman.yml +63 -3
  288. data/lib/locales/en/book.yml +486 -3
  289. data/lib/locales/en/bossa_nova.yml +110 -3
  290. data/lib/locales/en/breaking_bad.yml +110 -25
  291. data/lib/locales/en/brooklyn_nine_nine.yml +34 -0
  292. data/lib/locales/en/buffy.yml +239 -257
  293. data/lib/locales/en/business.yml +18 -2
  294. data/lib/locales/en/camera.yml +611 -0
  295. data/lib/locales/en/cannabis.yml +344 -10
  296. data/lib/locales/en/cat.yml +155 -3
  297. data/lib/locales/en/chess.yml +102 -0
  298. data/lib/locales/en/chiquito.yml +63 -0
  299. data/lib/locales/en/chuck_norris.yml +78 -79
  300. data/lib/locales/en/clash_of_clan.yml +99 -0
  301. data/lib/locales/en/code.yml +501 -1
  302. data/lib/locales/en/coffee.yml +450 -25
  303. data/lib/locales/en/color.yml +73 -1
  304. data/lib/locales/en/commerce.yml +117 -6
  305. data/lib/locales/en/community.yml +55 -30
  306. data/lib/locales/en/company.yml +1756 -13
  307. data/lib/locales/en/compass.yml +108 -12
  308. data/lib/locales/en/computer.yml +55 -0
  309. data/lib/locales/en/conan.yml +169 -0
  310. data/lib/locales/en/construction.yml +416 -422
  311. data/lib/locales/en/control.yml +247 -0
  312. data/lib/locales/en/cosmere.yml +219 -54
  313. data/lib/locales/en/cowboy_bebop.yml +160 -0
  314. data/lib/locales/en/culture_series.yml +298 -298
  315. data/lib/locales/en/currency.yml +358 -3
  316. data/lib/locales/en/dc_comics.yml +178 -49
  317. data/lib/locales/en/demographic.yml +218 -5
  318. data/lib/locales/en/departed.yml +46 -0
  319. data/lib/locales/en/dessert.yml +78 -3
  320. data/lib/locales/en/device.yml +112 -4
  321. data/lib/locales/en/dnd.yml +636 -0
  322. data/lib/locales/en/dog.yml +262 -7
  323. data/lib/locales/en/doraemon.yml +284 -0
  324. data/lib/locales/en/dota.yml +704 -63
  325. data/lib/locales/en/dr_who.yml +468 -93
  326. data/lib/locales/en/dragon_ball.yml +243 -1
  327. data/lib/locales/en/driving_license.yml +181 -0
  328. data/lib/locales/en/drone.yml +95 -0
  329. data/lib/locales/en/dumb_and_dumber.yml +72 -56
  330. data/lib/locales/en/dune.yml +270 -131
  331. data/lib/locales/en/educator.yml +75 -6
  332. data/lib/locales/en/elder_scrolls.yml +582 -9
  333. data/lib/locales/en/electrical_components.yml +49 -3
  334. data/lib/locales/en/emotion.yml +480 -0
  335. data/lib/locales/en/esport.yml +58 -5
  336. data/lib/locales/en/fallout.yml +311 -133
  337. data/lib/locales/en/family_guy.yml +54 -4
  338. data/lib/locales/en/file.yml +109 -2
  339. data/lib/locales/en/final_fantasy_xiv.yml +754 -0
  340. data/lib/locales/en/final_space.yml +35 -0
  341. data/lib/locales/en/finance.yml +80 -4
  342. data/lib/locales/en/food.yml +1067 -10
  343. data/lib/locales/en/football.yml +121 -5
  344. data/lib/locales/en/fresh_prince_of_bel_air.yml +119 -70
  345. data/lib/locales/en/friends.yml +162 -3
  346. data/lib/locales/en/fullmetal_alchemist_brotherhood.yml +78 -0
  347. data/lib/locales/en/funny_name.yml +752 -1
  348. data/lib/locales/en/futurama.yml +336 -0
  349. data/lib/locales/en/game.yml +11 -0
  350. data/lib/locales/en/game_of_thrones.yml +2487 -5
  351. data/lib/locales/en/gender.yml +15 -2
  352. data/lib/locales/en/ghostbusters.yml +101 -88
  353. data/lib/locales/en/grateful_dead.yml +47 -45
  354. data/lib/locales/en/greek_philosophers.yml +44 -23
  355. data/lib/locales/en/hacker.yml +110 -5
  356. data/lib/locales/en/hackers.yml +53 -0
  357. data/lib/locales/en/half_life.yml +84 -3
  358. data/lib/locales/en/harry_potter.yml +323 -6
  359. data/lib/locales/en/heroes.yml +408 -3
  360. data/lib/locales/en/heroes_of_the_storm.yml +131 -4
  361. data/lib/locales/en/hey_arnold.yml +104 -21
  362. data/lib/locales/en/hipster.yml +203 -1
  363. data/lib/locales/en/hitchhikers_guide_to_the_galaxy.yml +243 -42
  364. data/lib/locales/en/hobby.yml +170 -0
  365. data/lib/locales/en/horse.yml +446 -2
  366. data/lib/locales/en/house.yml +34 -2
  367. data/lib/locales/en/how_i_met_your_mother.yml +97 -25
  368. data/lib/locales/en/how_to_train_your_dragon.yml +173 -0
  369. data/lib/locales/en/id_number.yml +7 -2
  370. data/lib/locales/en/industry_segments.yml +188 -4
  371. data/lib/locales/en/internet.yml +136 -3
  372. data/lib/locales/en/jack_handey.yml +54 -0
  373. data/lib/locales/en/job.yml +98 -7
  374. data/lib/locales/en/kamen_rider.yml +718 -0
  375. data/lib/locales/en/kpop.yml +954 -80
  376. data/lib/locales/en/league_of_legends.yml +285 -6
  377. data/lib/locales/en/lebowski.yml +58 -40
  378. data/lib/locales/en/lorem.yml +1095 -6
  379. data/lib/locales/en/lovecraft.yml +76 -6
  380. data/lib/locales/en/markdown.yml +12 -2
  381. data/lib/locales/en/marketing.yml +54 -1
  382. data/lib/locales/en/measurement.yml +42 -8
  383. data/lib/locales/en/michael_scott.yml +41 -42
  384. data/lib/locales/en/military.yml +179 -5
  385. data/lib/locales/en/minecraft.yml +663 -0
  386. data/lib/locales/en/mitch_hedberg.yml +46 -0
  387. data/lib/locales/en/mountain.yml +171 -0
  388. data/lib/locales/en/mountaineering.yml +14 -0
  389. data/lib/locales/en/movie.yml +206 -2
  390. data/lib/locales/en/music.yml +461 -29
  391. data/lib/locales/en/myst.yml +87 -31
  392. data/lib/locales/en/name.yml +6068 -5
  393. data/lib/locales/en/naruto.yml +230 -0
  394. data/lib/locales/en/nato_phonetic_alphabet.yml +27 -1
  395. data/lib/locales/en/new_girl.yml +35 -37
  396. data/lib/locales/en/one_piece.yml +359 -6
  397. data/lib/locales/en/opera.yml +169 -1
  398. data/lib/locales/en/overwatch.yml +2648 -37
  399. data/lib/locales/en/parks_and_rec.yml +33 -4
  400. data/lib/locales/en/pearl_jam.yml +213 -0
  401. data/lib/locales/en/phish.yml +391 -1
  402. data/lib/locales/en/phone_number.yml +78 -3
  403. data/lib/locales/en/pokemon.yml +417 -4
  404. data/lib/locales/en/prince.yml +227 -0
  405. data/lib/locales/en/princess_bride.yml +48 -2
  406. data/lib/locales/en/programming_language.yml +753 -3
  407. data/lib/locales/en/quote.yml +606 -163
  408. data/lib/locales/en/rajnikanth.yml +77 -0
  409. data/lib/locales/en/relationship.yml +29 -6
  410. data/lib/locales/en/restaurant.yml +31 -31
  411. data/lib/locales/en/rick_and_morty.yml +116 -3
  412. data/lib/locales/en/rock_band.yml +228 -1
  413. data/lib/locales/en/rupaul.yml +120 -122
  414. data/lib/locales/en/rush.yml +32 -0
  415. data/lib/locales/en/science.yml +481 -3
  416. data/lib/locales/en/seinfeld.yml +110 -3
  417. data/lib/locales/en/shakespeare.yml +46 -53
  418. data/lib/locales/en/silicon_valley.yml +122 -50
  419. data/lib/locales/en/simpsons.yml +897 -23
  420. data/lib/locales/en/slack_emoji.yml +874 -8
  421. data/lib/locales/en/smashing_pumpkins.yml +382 -0
  422. data/lib/locales/en/source.yml +35 -0
  423. data/lib/locales/en/south_park.yml +360 -2
  424. data/lib/locales/en/space.yml +373 -14
  425. data/lib/locales/en/spongebob.yml +489 -0
  426. data/lib/locales/en/sport.yml +130 -0
  427. data/lib/locales/en/star_trek.yml +105 -4
  428. data/lib/locales/en/star_wars.yml +564 -219
  429. data/lib/locales/en/stargate.yml +65 -18
  430. data/lib/locales/en/stranger_thing.yml +31 -33
  431. data/lib/locales/en/street_fighter.yml +1524 -0
  432. data/lib/locales/en/stripe.yml +3 -3
  433. data/lib/locales/en/studio_ghibli.yml +107 -0
  434. data/lib/locales/en/subscription.yml +47 -5
  435. data/lib/locales/en/suits.yml +45 -0
  436. data/lib/locales/en/super_mario.yml +58 -0
  437. data/lib/locales/en/super_smash_bros.yml +23 -5
  438. data/lib/locales/en/superhero.yml +574 -4
  439. data/lib/locales/en/supernatural.yml +141 -0
  440. data/lib/locales/en/sword_art_online.yml +327 -331
  441. data/lib/locales/en/tarkov.yml +593 -0
  442. data/lib/locales/en/tea.yml +172 -0
  443. data/lib/locales/en/team.yml +125 -3
  444. data/lib/locales/en/the_expanse.yml +92 -4
  445. data/lib/locales/en/the_it_crowd.yml +148 -152
  446. data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
  447. data/lib/locales/en/the_office.yml +82 -0
  448. data/lib/locales/en/the_room.yml +68 -0
  449. data/lib/locales/en/the_thick_of_it.yml +83 -3
  450. data/lib/locales/en/theater.yml +597 -0
  451. data/lib/locales/en/tolkien.yml +2453 -0
  452. data/lib/locales/en/touhou.yml +839 -0
  453. data/lib/locales/en/train_station.yml +280 -0
  454. data/lib/locales/en/tron.yml +227 -0
  455. data/lib/locales/en/twin_peaks.yml +130 -3
  456. data/lib/locales/en/umphreys_mcgee.yml +266 -1
  457. data/lib/locales/en/university.yml +15 -2
  458. data/lib/locales/en/v_for_vendetta.yml +157 -160
  459. data/lib/locales/en/vehicle.yml +2809 -75
  460. data/lib/locales/en/venture_bros.yml +225 -4
  461. data/lib/locales/en/verbs.yml +3785 -5
  462. data/lib/locales/en/volleyball.yml +501 -0
  463. data/lib/locales/en/warhammer_fantasy.yml +549 -0
  464. data/lib/locales/en/witcher.yml +426 -7
  465. data/lib/locales/en/world_cup.yml +1132 -235
  466. data/lib/locales/en/world_of_warcraft.yml +122 -4
  467. data/lib/locales/en/yoda.yml +38 -1
  468. data/lib/locales/en/zelda.yml +962 -4
  469. data/lib/locales/en-AU.yml +728 -17
  470. data/lib/locales/en-BORK.yml +104 -1
  471. data/lib/locales/en-CA.yml +373 -15
  472. data/lib/locales/en-GB.yml +118 -8
  473. data/lib/locales/en-IND.yml +1259 -16
  474. data/lib/locales/en-KE.yml +212 -0
  475. data/lib/locales/en-MS.yml +364 -16
  476. data/lib/locales/en-NEP.yml +213 -36
  477. data/lib/locales/en-NG.yml +737 -65
  478. data/lib/locales/en-NZ.yml +1183 -27
  479. data/lib/locales/en-PAK.yml +392 -9
  480. data/lib/locales/en-SG.yml +581 -15
  481. data/lib/locales/en-TH.yml +360 -0
  482. data/lib/locales/en-UG.yml +374 -75
  483. data/lib/locales/en-US.yml +6937 -71
  484. data/lib/locales/en-ZA.yml +1394 -13
  485. data/lib/locales/en-au-ocker.yml +266 -21
  486. data/lib/locales/en.yml +0 -50
  487. data/lib/locales/es-AR.yml +4570 -0
  488. data/lib/locales/es-MX.yml +1910 -41
  489. data/lib/locales/es.yml +2172 -52
  490. data/lib/locales/fa.yml +1624 -3
  491. data/lib/locales/fi-FI.yml +316 -16
  492. data/lib/locales/fr/address.yml +773 -0
  493. data/lib/locales/fr/adjective.yml +266 -0
  494. data/lib/locales/fr/ancient.yml +141 -0
  495. data/lib/locales/fr/animal.yml +122 -0
  496. data/lib/locales/fr/appliance.yml +69 -0
  497. data/lib/locales/fr/book.yml +31 -0
  498. data/lib/locales/fr/color.yml +34 -0
  499. data/lib/locales/fr/company.yml +497 -0
  500. data/lib/locales/fr/compass.yml +71 -0
  501. data/lib/locales/fr/demographic.yml +6 -0
  502. data/lib/locales/fr/gender.yml +21 -0
  503. data/lib/locales/fr/internet.yml +15 -0
  504. data/lib/locales/fr/lorem.yml +1094 -0
  505. data/lib/locales/fr/measurement.yml +34 -0
  506. data/lib/locales/fr/name.yml +1193 -0
  507. data/lib/locales/fr/phone_number.yml +38 -0
  508. data/lib/locales/fr/pokemon.yml +421 -0
  509. data/lib/locales/fr-CA.yml +2756 -44
  510. data/lib/locales/fr-CH.yml +2455 -42
  511. data/lib/locales/fr.yml +2 -111
  512. data/lib/locales/he.yml +255 -9
  513. data/lib/locales/hy.yml +3630 -124
  514. data/lib/locales/id.yml +840 -10
  515. data/lib/locales/it.yml +1310 -31
  516. data/lib/locales/ja/README.md +13 -0
  517. data/lib/locales/ja/address.yml +363 -0
  518. data/lib/locales/ja/adjective.yml +148 -0
  519. data/lib/locales/ja/ancient.yml +18 -0
  520. data/lib/locales/ja/animal.yml +87 -0
  521. data/lib/locales/ja/artist.yml +46 -0
  522. data/lib/locales/ja/bank.yml +139 -0
  523. data/lib/locales/ja/book.yml +496 -0
  524. data/lib/locales/ja/cat.yml +79 -0
  525. data/lib/locales/ja/coffee.yml +22 -0
  526. data/lib/locales/ja/color.yml +35 -0
  527. data/lib/locales/ja/commerce.yml +103 -0
  528. data/lib/locales/ja/company.yml +26 -0
  529. data/lib/locales/ja/dog.yml +339 -0
  530. data/lib/locales/ja/emotion.yml +49 -0
  531. data/lib/locales/ja/food.yml +41 -0
  532. data/lib/locales/ja/football.yml +115 -0
  533. data/lib/locales/ja/gender.yml +6 -0
  534. data/lib/locales/ja/lorem.yml +1020 -0
  535. data/lib/locales/ja/name.yml +213 -0
  536. data/lib/locales/ja/naruto.yml +230 -0
  537. data/lib/locales/ja/overwatch.yml +37 -0
  538. data/lib/locales/ja/phone_number.yml +13 -0
  539. data/lib/locales/ja/pokemon.yml +441 -0
  540. data/lib/locales/ja/relationship.yml +33 -0
  541. data/lib/locales/ja/restaurant.yml +82 -0
  542. data/lib/locales/ja/space.yml +23 -0
  543. data/lib/locales/ja/sport.yml +130 -0
  544. data/lib/locales/ja/studio_ghibli.yml +112 -0
  545. data/lib/locales/ja/subscription.yml +50 -0
  546. data/lib/locales/ja/super_mario.yml +73 -0
  547. data/lib/locales/ja/super_smash_bros.yml +8 -0
  548. data/lib/locales/ja/touhou.yml +466 -0
  549. data/lib/locales/ja/university.yml +22 -0
  550. data/lib/locales/ja/zelda.yml +19 -0
  551. data/lib/locales/ko.yml +1450 -17
  552. data/lib/locales/lt.yml +315 -0
  553. data/lib/locales/lv.yml +1221 -27
  554. data/lib/locales/mi-NZ.yml +283 -0
  555. data/lib/locales/nb-NO.yml +518 -27
  556. data/lib/locales/nl.yml +33514 -55
  557. data/lib/locales/pl.yml +4008 -38
  558. data/lib/locales/pt-BR.yml +8210 -641
  559. data/lib/locales/pt.yml +846 -45
  560. data/lib/locales/ru.yml +1355 -30
  561. data/lib/locales/sk.yml +4416 -41
  562. data/lib/locales/sv.yml +731 -41
  563. data/lib/locales/th.yml +380 -0
  564. data/lib/locales/tr.yml +77 -19
  565. data/lib/locales/uk.yml +1814 -48
  566. data/lib/locales/vi.yml +392 -48
  567. data/lib/locales/zh-CN/bank.yml +17 -0
  568. data/lib/locales/zh-CN.yml +541 -19
  569. data/lib/locales/zh-TW.yml +1031 -15
  570. metadata +230 -125
  571. data/History.md +0 -176
  572. data/lib/faker/books/book.rb +0 -25
  573. data/lib/faker/default/bossa_nova.rb +0 -15
  574. data/lib/faker/default/fillmurray.rb +0 -15
  575. data/lib/faker/default/internet.rb +0 -207
  576. data/lib/faker/default/lorem_pixel.rb +0 -38
  577. data/lib/faker/default/twitter.rb +0 -174
  578. data/lib/faker/games/game.rb +0 -21
  579. data/lib/faker/movies/movie.rb +0 -11
  580. data/lib/faker/music/music.rb +0 -47
  581. data/lib/faker/quotes/quote.rb +0 -32
  582. data/lib/locales/en/hobbit.yml +0 -19
  583. data/lib/locales/en/lord_of_the_rings.yml +0 -6
  584. data/lib/locales/ja.yml +0 -98
@@ -0,0 +1,478 @@
1
+ # frozen_string_literal: true
2
+
3
+ ##
4
+ # A high level way to generate a list of generated values that fit a specific
5
+ # format, such as an ID, postal code, or phone number.
6
+ #
7
+ # It provides generators for random digits and letters, hardcoded literal
8
+ # strings, computed values based on previously-generated values, union (one-of)
9
+ # selectors, and grouped generators.
10
+ #
11
+ # The generation allows for dependencies on previously generated values -- most
12
+ # useful for computations -- and this object knows how to build that dependency
13
+ # graph.
14
+ #
15
+ # See {PositionalGenerator::Builder} for more.
16
+ class PositionalGenerator
17
+ ##
18
+ # @param as_type [Symbol] +:string+ to generate a String
19
+ # @param block [Method] a function that interacts with the {Builder}
20
+ def initialize(as_type, &block)
21
+ @block = block
22
+ @generator_builder = Builder.new(as_type)
23
+ end
24
+
25
+ ##
26
+ # @return [String] if +as_type+ is +:string+
27
+ def generate
28
+ @block.call(@generator_builder)
29
+ @generator_builder.build
30
+ end
31
+
32
+ Component = Struct.new(:position, :name, :deps, :generator)
33
+
34
+ class Builder
35
+ attr_reader :as_type
36
+
37
+ def initialize(as_type)
38
+ @components = []
39
+ @as_type = as_type
40
+ end
41
+
42
+ ##
43
+ # Generate a value in the range of 0..9.
44
+ #
45
+ # @param name [Symbol] the name for this node in the group
46
+ # @param length [Integer] how many digits to generate
47
+ # @param ranges [Array<Range, Array, Set>] an array of limitations on the
48
+ # generation. Elements can be a Range to select from within that range,
49
+ # or an Array or Set to select an element from within the list.
50
+ # @return [void]
51
+ #
52
+ # @example a digit
53
+ # int
54
+ #
55
+ # @example five digits named :a
56
+ # int(name: :a, length: 5)
57
+ #
58
+ # @example digits of any length between 4 to 10
59
+ # int(ranges: [1_000 .. 9_999_999_999)
60
+ def int(name: nil, length: 1, ranges: nil)
61
+ @components << Component.new(@components.count, name, [], Int.new(length, ranges))
62
+ end
63
+
64
+ ##
65
+ # Generate a value in the range of 'a'..'Z'.
66
+ #
67
+ # @param name [Symbol] the name for this node in the group
68
+ # @param length [Integer, Range] how many letters to generate
69
+ # @param ranges [Array<Range, Array, Set>] an array of limitations on the
70
+ # generation. Elements can be a Range to select from within that range,
71
+ # or an Array or Set to select an element from within the list.
72
+ # @return [void]
73
+ #
74
+ # @example Generate a letter
75
+ # letter
76
+ #
77
+ # @example Generate five uppercase letters named :b
78
+ # letter(name: :b, length: 5, ranges: ['A'..'Z'])
79
+ #
80
+ # @example Generate three-letter strings from within specific values
81
+ # letter(ranges: ['700'..'799', '7A0'..'7F9'])
82
+ def letter(name: nil, length: 1, ranges: ['a'..'z', 'A'..'Z'])
83
+ @components << Component.new(@components.count, name, [], Letter.new(length, ranges))
84
+ end
85
+
86
+ ##
87
+ # Generate a literal String
88
+ #
89
+ # @param value [String]
90
+ # @param name [Symbol] the name for this node in the group
91
+ # @return [void]
92
+ # @example
93
+ # lit("-")
94
+ def lit(value, name: nil)
95
+ @components << Component.new(@components.count, name, [], Literal.new(value))
96
+ end
97
+
98
+ ##
99
+ # Fill the position with an arbitrary value.
100
+ #
101
+ # @param name [Symbol] the name for this node in the group
102
+ # @param deps [Array<Symbol>] the name of other fields that this one depends on
103
+ # @param block [Method] the block that yields the arbitrary value. Its
104
+ # arguments are the deps.
105
+ # @return [void]
106
+ #
107
+ # @example Today's date
108
+ # computed do
109
+ # Date.today
110
+ # end
111
+ #
112
+ # @example A check digit
113
+ # int(name: :a, length: 5)
114
+ # computed(deps: [:a]) do |a|
115
+ # a.to_s.bytes.sum % 10
116
+ # end
117
+ def computed(name: nil, deps: [], &block)
118
+ @components << Component.new(@components.count, name, deps, Computed.new(block))
119
+ end
120
+
121
+ ##
122
+ # Fill the position with one of the results from the given generators.
123
+ #
124
+ # @param name [Symbol] the name for this node in the group
125
+ # @param block [Method] subgenerator block
126
+ # @return [void]
127
+ #
128
+ # @example Either five digits, or two letters
129
+ # oneof do |or_else|
130
+ # or_else.int(length: 5)
131
+ # or_else.letter(length: 2)
132
+ # end
133
+ #
134
+ # @example Either one letter; or a slash, five digits, then a slash.
135
+ # oneof do |or_else|
136
+ # or_else.letter
137
+ # or_else.group do |g_|
138
+ # g_.lit("/")
139
+ # g_.digit(length: 5)
140
+ # g_.lit("/")
141
+ # end
142
+ # end
143
+ def oneof(name: nil, &block)
144
+ @components << Component.new(@components.count, name, [], Oneof.new(self, block))
145
+ end
146
+
147
+ ##
148
+ # A group of generators. Useful for {#oneof}.
149
+ #
150
+ # @param name [Symbol] the name for this node in the group
151
+ # @param block [Method] a subgenerator block
152
+ # @return [void]
153
+ def group(name: nil, &block)
154
+ @components << Component.new(@components.count, name, [], Group.new(@as_type, block))
155
+ end
156
+
157
+ ##
158
+ # Generate the value.
159
+ #
160
+ # @return [String] if +as_type+ is +:string+
161
+ def build
162
+ graph = build_graph
163
+ stack = build_stack(graph)
164
+ values = generate_values(stack)
165
+ convert(values)
166
+ end
167
+
168
+ private
169
+
170
+ ##
171
+ # Turn the components into a graph following dependencies.
172
+ #
173
+ # @return [Array<(Integer, Integer)>]
174
+ #
175
+ # Components can have dependencies. Here's one where a computation (b)
176
+ # depends on a value generated after it (c):
177
+ #
178
+ # @components = [
179
+ # Int.new(0, :a, 1, nil),
180
+ # Computed.new(1, :b, [:c]) { |c| c + 1 },
181
+ # Int.new(2, :c, 1, nil),
182
+ # ]
183
+ #
184
+ # We can think of a graph like so:
185
+ #
186
+ # (a) (c)
187
+ # | |
188
+ # | (b)
189
+ # \ /
190
+ # end
191
+ #
192
+ # Or in Mermaid:
193
+ #
194
+ # ```mermaid
195
+ # stateDiagram-v2
196
+ # a --> [*]
197
+ # c --> b
198
+ # b --> [*]
199
+ # ```
200
+ #
201
+ # This method builds that graph, using their positional locations as the
202
+ # ID. The end state is represented as +nil+. So continuing the example
203
+ # above, it will give this output:
204
+ #
205
+ # [
206
+ # [0, nil],
207
+ # [2, 1],
208
+ # [1, nil],
209
+ # ]
210
+ #
211
+ # Later we can look up the appropriate component by indexing into the
212
+ # +@components+ array.
213
+ def build_graph
214
+ graph = []
215
+
216
+ # rubocop:disable Style/CombinableLoops
217
+ @components.each do |component|
218
+ component.deps.each do |dep|
219
+ dep_component = @components.detect { |c| c.name == dep }
220
+ raise if dep_component.nil?
221
+
222
+ graph.push([dep_component.position, component.position])
223
+ end
224
+ end
225
+
226
+ @components.each do |component|
227
+ graph.push([component.position, nil]) if graph.none? { |(from, _to)| from == component.position }
228
+ end
229
+ # rubocop:enable Style/CombinableLoops
230
+
231
+ graph
232
+ end
233
+
234
+ ##
235
+ # Produce a stack of components to evaluate in sequence.
236
+ #
237
+ # @param graph [Array<(Integer, Integer)>]
238
+ # @return [Array<Array<Int>>]
239
+ #
240
+ # Now that we have a graph, we know enough to determine how to traverse the
241
+ # generators such that all dependencies are met.
242
+ #
243
+ # The initial stack is an array of all the free traversals to the goal
244
+ # (where the +to+ is +nil+).
245
+ #
246
+ # Loop over the top of the stack:
247
+ # - The next array is all the nodes that lead into the nodes atop the
248
+ # stack.
249
+ # - If the next array has values, push that onto the top of the stack.
250
+ # - If the next array is empty, we are done.
251
+ #
252
+ # For example, given the graph:
253
+ #
254
+ # [
255
+ # [0, nil],
256
+ # [2, 1],
257
+ # [1, nil],
258
+ # ]
259
+ #
260
+ # The initial stack is:
261
+ #
262
+ # [
263
+ # [0, 1]
264
+ # ]
265
+ #
266
+ # We loop over the top of the stack, +[0, 1]+, and find all the nodes of
267
+ # the graph that lead there. Nothing leads to +0+, and +2+ leads to +1+.
268
+ #
269
+ # Therefore, push +[2]+ to the top of the stack.
270
+ #
271
+ # Repeat for +[2]+. Nothing leads to +2+, so our new goal is +[]+. This is
272
+ # empty, so don't push it onto the stack. We are done.
273
+ #
274
+ # The final stack is:
275
+ #
276
+ # [
277
+ # [0, 1],
278
+ # [2]
279
+ # ]
280
+ def build_stack(graph)
281
+ terminals = graph.filter_map { |(from, to)| to.nil? && from }
282
+ stack = [terminals]
283
+ seen = Set.new(terminals)
284
+ deps = []
285
+
286
+ loop do
287
+ stack[-1].each do |e|
288
+ deps = graph.select { |(from, to)| to == e && !seen.include?(from) }.map do |from, _to|
289
+ seen << from
290
+ from
291
+ end
292
+ stack << deps if deps.any?
293
+ end
294
+
295
+ break if deps.empty?
296
+ end
297
+
298
+ stack
299
+ end
300
+
301
+ ##
302
+ # Turn a stack into a list of generated values.
303
+ #
304
+ # @param stack [Array<Array<Int>>]
305
+ # @return [Array<Object>] values sorted by desired order
306
+ #
307
+ # We start with a stack of components we need evaluated. We have been
308
+ # tracking these components by position, so first we need to look up the
309
+ # component in our list.
310
+ #
311
+ # From there we can get a list of all the dependencies for the component.
312
+ # These have already been evaluated, since +stack+ is sorted, so we fetch
313
+ # them.
314
+ #
315
+ # Since the stack was sorted by computation order, we must re-sort them
316
+ # into positional order at the end.
317
+ def generate_values(stack)
318
+ result = []
319
+
320
+ while (top = stack.pop)
321
+ top.each do |component_id|
322
+ component = @components[component_id]
323
+ raise if component.nil?
324
+
325
+ values = result.filter_map do |(_id, name, value)|
326
+ value if component.deps.include?(name)
327
+ end
328
+
329
+ result << [component.position, component.name, component.generator.generate(values)]
330
+ end
331
+ end
332
+
333
+ result.sort_by do |component_position, _, _|
334
+ component_position
335
+ end
336
+ end
337
+
338
+ ##
339
+ # @param values [Array<Object>]
340
+ # @return [String] if +@as_type+ is +:string+
341
+ # @raise [ArgumentError] if +@as_type+ is unsupported
342
+ def convert(values)
343
+ case @as_type
344
+ when :string
345
+ values.inject('') do |acc, (_, _, v)|
346
+ "#{acc}#{v}"
347
+ end
348
+ else
349
+ raise ArgumentError, "unknown return type: #{@as_type}"
350
+ end
351
+ end
352
+
353
+ class Group
354
+ def initialize(as_type, block)
355
+ @as_type = as_type
356
+ @block = block
357
+ end
358
+
359
+ def generate(_)
360
+ builder = Builder.new(@as_type)
361
+ @block.call(builder)
362
+ builder.build
363
+ end
364
+ end
365
+
366
+ class Oneof
367
+ def initialize(builder, block)
368
+ @block = block
369
+ @builder = builder
370
+ end
371
+
372
+ def generate(...)
373
+ subgens = OneofSelector.new(@builder)
374
+ @block.call(subgens)
375
+ subgens.sample
376
+ subgens.generate(...)
377
+ end
378
+
379
+ class OneofSelector
380
+ def initialize(builder)
381
+ @subgens = []
382
+ @builder = Builder.new(builder.as_type)
383
+ end
384
+
385
+ def method_missing(meth, *args, **kwargs, &block)
386
+ @subgens << [meth, args, kwargs, block]
387
+ end
388
+
389
+ def respond_to_missing?(method_name, include_private = false)
390
+ @builder.respond_to?(method_name, include_private)
391
+ end
392
+
393
+ def sample
394
+ (meth, args, kwargs, block) = Faker::Base.sample(@subgens)
395
+ @builder.send(meth, *args, **kwargs, &block)
396
+ end
397
+
398
+ def generate(...)
399
+ @builder.build
400
+ end
401
+ end
402
+ end
403
+
404
+ class Int
405
+ def initialize(length, ranges)
406
+ # Internally we store only an Enumerable of Range values. So if we are
407
+ # not given any Ranges but are given a length, we need to convert the
408
+ # length to a Range.
409
+ #
410
+ # If the length is `5`, that means we should compute the Range `10000..99999`.
411
+ # We can compute the lower end with a simple exponent: 10^4 = 10000.
412
+ # The upper end is one less than an exponent: 10^5 - 1 = 99999.
413
+ if ranges.nil?
414
+ lower = 10**(length - 1)
415
+ upper = (10**length) - 1
416
+ ranges = [lower..upper]
417
+ end
418
+
419
+ @ranges = ranges
420
+ end
421
+
422
+ def generate(_)
423
+ Faker::Base.rand(@ranges.sample(random: Faker::Config.random))
424
+ end
425
+ end
426
+
427
+ class Letter
428
+ def initialize(length, ranges)
429
+ @length = length
430
+ @ranges = ranges
431
+ end
432
+
433
+ def generate(_)
434
+ @length.times.inject('') do |acc, _index|
435
+ generated_character = char
436
+ "#{acc}#{generated_character}"
437
+ end
438
+ end
439
+
440
+ private
441
+
442
+ def char
443
+ if @ranges
444
+ case s = @ranges.sample(random: Faker::Config.random)
445
+ when Range
446
+ s.to_a.sample(random: Faker::Config.random)
447
+ when Array, Set
448
+ s.sample(random: Faker::Config.random)
449
+ else
450
+ raise ArgumentError, "unsupported range type: #{s.inspect}"
451
+ end
452
+ else
453
+ Faker::Base.sample(Faker::Base::Letters)
454
+ end
455
+ end
456
+ end
457
+
458
+ class Literal
459
+ def initialize(value)
460
+ @value = value
461
+ end
462
+
463
+ def generate(_)
464
+ @value
465
+ end
466
+ end
467
+
468
+ class Computed
469
+ def initialize(block)
470
+ @block = block
471
+ end
472
+
473
+ def generate(args)
474
+ @block.call(*args)
475
+ end
476
+ end
477
+ end
478
+ end
@@ -2,43 +2,47 @@
2
2
 
3
3
  module Faker
4
4
  class UniqueGenerator
5
- @marked_unique = Set.new # Holds names of generators with unique values
6
-
7
- class << self
8
- attr_reader :marked_unique
9
- end
10
-
11
5
  def initialize(generator, max_retries)
12
6
  @generator = generator
13
7
  @max_retries = max_retries
14
- @previous_results = Hash.new { |hash, key| hash[key] = Set.new }
15
8
  end
16
9
 
17
- # rubocop:disable Style/MethodMissingSuper
18
10
  def method_missing(name, *arguments)
19
11
  self.class.marked_unique.add(self)
20
12
 
21
13
  @max_retries.times do
22
14
  result = @generator.public_send(name, *arguments)
23
15
 
24
- next if @previous_results[[name, arguments]].include?(result)
16
+ next if previous_results[[name, arguments]].include?(result)
25
17
 
26
- @previous_results[[name, arguments]] << result
18
+ previous_results[[name, arguments]] << result
27
19
  return result
28
20
  end
29
21
 
30
22
  raise RetryLimitExceeded, "Retry limit exceeded for #{name}"
31
23
  end
32
- # rubocop:enable Style/MethodMissingSuper
24
+ # Have method_missing use ruby 2.x keywords if the method exists.
25
+ # This is necessary because the syntax for passing arguments (`...`)
26
+ # is invalid on versions before Ruby 2.7, so it can't be used.
27
+ ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true)
33
28
 
34
29
  def respond_to_missing?(method_name, include_private = false)
35
30
  method_name.to_s.start_with?('faker_') || super
36
31
  end
37
32
 
38
- RetryLimitExceeded = Class.new(StandardError)
33
+ class RetryLimitExceeded < StandardError; end
34
+
35
+ def previous_results
36
+ Thread.current[:faker_unique_generator_previous_results] ||= {}
37
+ Thread.current[:faker_unique_generator_previous_results][@generator] ||= Hash.new { |hash, key| hash[key] = Set.new }
38
+ end
39
39
 
40
40
  def clear
41
- @previous_results.clear
41
+ previous_results.clear
42
+ end
43
+
44
+ def self.marked_unique
45
+ Thread.current[:faker_unique_generator_marked_unique] ||= Set.new
42
46
  end
43
47
 
44
48
  def self.clear
@@ -49,7 +53,7 @@ module Faker
49
53
  def exclude(name, arguments, values)
50
54
  values ||= []
51
55
  values.each do |value|
52
- @previous_results[[name, arguments]] << value
56
+ previous_results[[name, arguments]] << value
53
57
  end
54
58
  end
55
59
  end
@@ -9,7 +9,7 @@ Here's how to set it:
9
9
  Faker::Config.locale = 'zh-CN'
10
10
  ```
11
11
 
12
- It works so that once the Faker locale is set to a different location, the translate method will check that .yml file for an equivalent and use that data. If it doesn't exist, it defaults back to English. It uses the "i18n" gem to do this.
12
+ It works so that once the Faker locale is set to a different location, the translate method will check that `.yml` file for an equivalent and use that data. If it doesn't exist, it defaults back to English. It uses the [I18n](https://github.com/ruby-i18n/i18n) gem to do this.
13
13
 
14
14
  Using Chinese as an example, when the locale is set to Chinese and you attempt to call for hipster ipsem (which doesn't exist at the time of this writing), you will get English back. It checks the "zh-CH.yml" file, does not find "hipster" and then checks the "en.yml" file and returns a word from that array.
15
15
 
@@ -18,7 +18,9 @@ Faker::Config.locale = 'zh-CN'
18
18
  Faker::Hipster.word #=> "kogi"
19
19
  ```
20
20
 
21
- In order to update a locale with more translation features, simply add a new field to the .yml file that corresponds to an existing piece of functionality in the "en.yml" file. In this example, that would mean providing Chinese hipster words.
21
+ ## How to update a locale with more translations
22
+
23
+ To update a locale with more translation features, simply add a new field to the `.yml` file that corresponds to an existing piece of functionality in the "en.yml" file. In this example, that would mean providing Chinese hipster words.
22
24
 
23
25
  ```yaml
24
26
  # /lib/locales/zh-CN.yml
@@ -38,3 +40,17 @@ In our hypothetical example here, one would add something like this to the "test
38
40
  ```ruby
39
41
  assert Faker::Hipster.word.is_a? String
40
42
  ```
43
+
44
+ ## How to set the default locale for in threaded server environments
45
+
46
+ If you want to modify the default locale that will be used in new threads, set it in your configuration:
47
+
48
+ ```ruby
49
+ Faker::Config.default_locale = :pt
50
+ ```
51
+
52
+ In threaded server environments, e.g., Puma, locale per thread can be set as the following:
53
+
54
+ ```ruby
55
+ Faker::Config.locale = :es
56
+ ```