faker 2.11.0 → 3.4.2

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 (404) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1131 -19
  3. data/README.md +249 -105
  4. data/lib/faker/blockchain/aeternity.rb +5 -5
  5. data/lib/faker/blockchain/bitcoin.rb +2 -2
  6. data/lib/faker/blockchain/ethereum.rb +1 -1
  7. data/lib/faker/blockchain/tezos.rb +31 -3
  8. data/lib/faker/books/dune.rb +17 -12
  9. data/lib/faker/books/lovecraft.rb +16 -44
  10. data/lib/faker/books/the_kingkiller_chronicle.rb +61 -0
  11. data/lib/faker/creature/bird.rb +203 -0
  12. data/lib/faker/default/address.rb +42 -32
  13. data/lib/faker/default/adjective.rb +35 -0
  14. data/lib/faker/default/alphanumeric.rb +2 -8
  15. data/lib/faker/default/app.rb +1 -10
  16. data/lib/faker/default/avatar.rb +1 -12
  17. data/lib/faker/default/bank.rb +104 -19
  18. data/lib/faker/default/barcode.rb +165 -0
  19. data/lib/faker/default/beer.rb +3 -3
  20. data/lib/faker/default/blood.rb +48 -0
  21. data/lib/faker/default/boolean.rb +1 -4
  22. data/lib/faker/default/business.rb +1 -1
  23. data/lib/faker/default/camera.rb +46 -0
  24. data/lib/faker/default/cannabis.rb +10 -0
  25. data/lib/faker/default/chile_rut.rb +62 -18
  26. data/lib/faker/default/chuck_norris.rb +1 -0
  27. data/lib/faker/default/code.rb +162 -52
  28. data/lib/faker/default/color.rb +77 -6
  29. data/lib/faker/default/commerce.rb +105 -28
  30. data/lib/faker/default/company.rb +210 -28
  31. data/lib/faker/default/compass.rb +135 -0
  32. data/lib/faker/default/computer.rb +63 -0
  33. data/lib/faker/default/construction.rb +54 -0
  34. data/lib/faker/default/cosmere.rb +90 -0
  35. data/lib/faker/default/crypto.rb +26 -4
  36. data/lib/faker/default/crypto_coin.rb +48 -15
  37. data/lib/faker/default/date.rb +81 -54
  38. data/lib/faker/default/demographic.rb +1 -5
  39. data/lib/faker/default/driving_licence.rb +85 -18
  40. data/lib/faker/default/drone.rb +332 -0
  41. data/lib/faker/default/educator.rb +13 -0
  42. data/lib/faker/default/emotion.rb +33 -0
  43. data/lib/faker/default/file.rb +53 -21
  44. data/lib/faker/default/finance.rb +75 -7
  45. data/lib/faker/default/food.rb +28 -2
  46. data/lib/faker/default/gender.rb +1 -1
  47. data/lib/faker/default/hipster.rb +108 -51
  48. data/lib/faker/default/hobby.rb +22 -0
  49. data/lib/faker/default/html.rb +230 -0
  50. data/lib/faker/default/id_number.rb +251 -17
  51. data/lib/faker/default/internet.rb +361 -113
  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 +63 -25
  55. data/lib/faker/default/lorem.rb +177 -75
  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 → national_health_service.rb} +26 -6
  65. data/lib/faker/default/number.rb +39 -69
  66. data/lib/faker/default/omniauth.rb +115 -57
  67. data/lib/faker/default/phone_number.rb +112 -14
  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 +93 -3
  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/theater.rb +52 -0
  80. data/lib/faker/default/time.rb +4 -34
  81. data/lib/faker/default/twitter.rb +42 -23
  82. data/lib/faker/default/types.rb +92 -34
  83. data/lib/faker/default/university.rb +45 -0
  84. data/lib/faker/default/vehicle.rb +227 -57
  85. data/lib/faker/default/verb.rb +45 -0
  86. data/lib/faker/default/vulnerability_identifier.rb +23 -0
  87. data/lib/faker/default/world_cup.rb +6 -15
  88. data/lib/faker/fantasy/tolkien.rb +67 -0
  89. data/lib/faker/games/clash_of_clans.rb +48 -0
  90. data/lib/faker/games/control.rb +113 -0
  91. data/lib/faker/games/dnd.rb +178 -0
  92. data/lib/faker/games/dota.rb +14 -5
  93. data/lib/faker/games/elder_scrolls.rb +26 -0
  94. data/lib/faker/games/final_fantasy_xiv.rb +73 -0
  95. data/lib/faker/games/heroes.rb +13 -0
  96. data/lib/faker/games/heroes_of_the_storm.rb +16 -5
  97. data/lib/faker/games/minecraft.rb +113 -0
  98. data/lib/faker/games/myst.rb +1 -1
  99. data/lib/faker/games/street_fighter.rb +61 -0
  100. data/lib/faker/games/super_mario.rb +48 -0
  101. data/lib/faker/games/tarkov.rb +205 -0
  102. data/lib/faker/games/touhou.rb +75 -0
  103. data/lib/faker/games/warhammer_fantasy.rb +74 -0
  104. data/lib/faker/games/witcher.rb +39 -0
  105. data/lib/faker/games/world_of_warcraft.rb +26 -1
  106. data/lib/faker/japanese_media/conan.rb +48 -0
  107. data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
  108. data/lib/faker/japanese_media/doraemon.rb +48 -0
  109. data/lib/faker/japanese_media/dragon_ball.rb +26 -0
  110. data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +51 -0
  111. data/lib/faker/japanese_media/kamen_rider.rb +102 -0
  112. data/lib/faker/japanese_media/naruto.rb +61 -0
  113. data/lib/faker/japanese_media/one_piece.rb +1 -1
  114. data/lib/faker/japanese_media/studio_ghibli.rb +48 -0
  115. data/lib/faker/locations/australia.rb +52 -0
  116. data/lib/faker/movies/avatar.rb +49 -0
  117. data/lib/faker/movies/departed.rb +49 -0
  118. data/lib/faker/movies/hackers.rb +48 -0
  119. data/lib/faker/movies/hobbit.rb +4 -4
  120. data/lib/faker/movies/how_to_train_your_dragon.rb +48 -0
  121. data/lib/faker/movies/lord_of_the_rings.rb +3 -3
  122. data/lib/faker/movies/movie.rb +13 -0
  123. data/lib/faker/movies/star_wars.rb +75 -7
  124. data/lib/faker/movies/the_room.rb +63 -0
  125. data/lib/faker/movies/tron.rb +161 -0
  126. data/lib/faker/music/hiphop.rb +48 -0
  127. data/lib/faker/music/music.rb +12 -0
  128. data/lib/faker/music/opera.rb +237 -1
  129. data/lib/faker/music/pearl_jam.rb +50 -0
  130. data/lib/faker/music/phish.rb +27 -1
  131. data/lib/faker/music/prince.rb +64 -0
  132. data/lib/faker/music/rock_band.rb +12 -0
  133. data/lib/faker/music/rush.rb +37 -0
  134. data/lib/faker/music/smashing_pumpkins.rb +64 -0
  135. data/lib/faker/quotes/quote.rb +93 -1
  136. data/lib/faker/quotes/rajnikanth.rb +1 -0
  137. data/lib/faker/quotes/shakespeare.rb +70 -0
  138. data/lib/faker/religion/bible.rb +50 -0
  139. data/lib/faker/sports/chess.rb +90 -0
  140. data/lib/faker/sports/mountaineering.rb +22 -0
  141. data/lib/faker/sports/sport.rb +116 -0
  142. data/lib/faker/sports/volleyball.rb +74 -0
  143. data/lib/faker/travel/airport.rb +43 -0
  144. data/lib/faker/travel/train_station.rb +54 -0
  145. data/lib/faker/tv_shows/aqua_teen_hunger_force.rb +13 -0
  146. data/lib/faker/tv_shows/archer.rb +51 -0
  147. data/lib/faker/tv_shows/big_bang_theory.rb +37 -0
  148. data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
  149. data/lib/faker/tv_shows/buffy.rb +17 -4
  150. data/lib/faker/tv_shows/dr_who.rb +1 -1
  151. data/lib/faker/tv_shows/final_space.rb +51 -0
  152. data/lib/faker/tv_shows/futurama.rb +65 -0
  153. data/lib/faker/tv_shows/michael_scott.rb +0 -3
  154. data/lib/faker/tv_shows/simpsons.rb +14 -0
  155. data/lib/faker/tv_shows/south_park.rb +15 -0
  156. data/lib/faker/tv_shows/spongebob.rb +50 -0
  157. data/lib/faker/tv_shows/suits.rb +37 -0
  158. data/lib/faker/tv_shows/supernatural.rb +48 -0
  159. data/lib/faker/tv_shows/the_fresh_prince_of_bel_air.rb +17 -4
  160. data/lib/faker/tv_shows/the_office.rb +37 -0
  161. data/lib/faker/version.rb +2 -2
  162. data/lib/faker.rb +51 -87
  163. data/lib/helpers/base58.rb +1 -1
  164. data/lib/helpers/char.rb +22 -27
  165. data/lib/helpers/deprecator.rb +53 -0
  166. data/lib/helpers/positional_generator.rb +480 -0
  167. data/lib/helpers/unique_generator.rb +13 -13
  168. data/lib/locales/README.md +18 -2
  169. data/lib/locales/ar.yml +6 -1
  170. data/lib/locales/bg.yml +1 -2
  171. data/lib/locales/da-DK.yml +529 -35
  172. data/lib/locales/de-AT.yml +3487 -25
  173. data/lib/locales/de-CH.yml +6020 -9
  174. data/lib/locales/de.yml +7185 -97
  175. data/lib/locales/ee.yml +0 -1
  176. data/lib/locales/en/address.yml +1828 -562
  177. data/lib/locales/en/adjective.yml +179 -0
  178. data/lib/locales/en/airport.yml +381 -0
  179. data/lib/locales/en/animal.yml +1 -1
  180. data/lib/locales/en/aqua_teen_hunger_force.yml +33 -1
  181. data/lib/locales/en/archer.yml +75 -0
  182. data/lib/locales/en/australia.yml +108 -0
  183. data/lib/locales/en/avatar.yml +31 -0
  184. data/lib/locales/en/bank.yml +2 -2
  185. data/lib/locales/en/barcode.yml +24 -0
  186. data/lib/locales/en/bible.yml +90 -0
  187. data/lib/locales/en/big_bang_theory.yml +38 -0
  188. data/lib/locales/en/bird.yml +1281 -0
  189. data/lib/locales/en/blood.yml +13 -0
  190. data/lib/locales/en/book.yml +487 -3
  191. data/lib/locales/en/brooklyn_nine_nine.yml +35 -0
  192. data/lib/locales/en/buffy.yml +1 -1
  193. data/lib/locales/en/camera.yml +611 -0
  194. data/lib/locales/en/cat.yml +1 -1
  195. data/lib/locales/en/chess.yml +103 -0
  196. data/lib/locales/en/clash_of_clan.yml +101 -0
  197. data/lib/locales/en/coffee.yml +1 -1
  198. data/lib/locales/en/commerce.yml +17 -0
  199. data/lib/locales/en/community.yml +17 -17
  200. data/lib/locales/en/company.yml +3 -2
  201. data/lib/locales/en/computer.yml +55 -0
  202. data/lib/locales/en/conan.yml +171 -0
  203. data/lib/locales/en/control.yml +247 -0
  204. data/lib/locales/en/cowboy_bebop.yml +163 -0
  205. data/lib/locales/en/demographic.yml +218 -5
  206. data/lib/locales/en/departed.yml +50 -0
  207. data/lib/locales/en/device.yml +112 -4
  208. data/lib/locales/en/dnd.yml +636 -0
  209. data/lib/locales/en/dog.yml +262 -7
  210. data/lib/locales/en/doraemon.yml +286 -0
  211. data/lib/locales/en/dota.yml +704 -63
  212. data/lib/locales/en/dragon_ball.yml +243 -1
  213. data/lib/locales/en/driving_license.yml +181 -0
  214. data/lib/locales/en/drone.yml +95 -0
  215. data/lib/locales/en/dune.yml +270 -131
  216. data/lib/locales/en/educator.yml +6 -0
  217. data/lib/locales/en/elder_scrolls.yml +583 -9
  218. data/lib/locales/en/emotion.yml +480 -0
  219. data/lib/locales/en/fallout.yml +311 -133
  220. data/lib/locales/en/file.yml +9 -1
  221. data/lib/locales/en/final_fantasy_xiv.yml +754 -0
  222. data/lib/locales/en/final_space.yml +37 -0
  223. data/lib/locales/en/finance.yml +80 -4
  224. data/lib/locales/en/food.yml +1067 -10
  225. data/lib/locales/en/football.yml +3 -3
  226. data/lib/locales/en/fresh_prince_of_bel_air.yml +1 -1
  227. data/lib/locales/en/fullmetal_alchemist_brotherhood.yml +78 -0
  228. data/lib/locales/en/futurama.yml +344 -0
  229. data/lib/locales/en/game.yml +11 -0
  230. data/lib/locales/en/hackers.yml +53 -0
  231. data/lib/locales/en/half_life.yml +84 -3
  232. data/lib/locales/en/harry_potter.yml +1 -1
  233. data/lib/locales/en/heroes.yml +408 -3
  234. data/lib/locales/en/heroes_of_the_storm.yml +131 -4
  235. data/lib/locales/en/hobby.yml +171 -0
  236. data/lib/locales/en/horse.yml +2 -2
  237. data/lib/locales/en/house.yml +1 -1
  238. data/lib/locales/en/how_to_train_your_dragon.yml +174 -0
  239. data/lib/locales/en/id_number.yml +1 -1
  240. data/lib/locales/en/internet.yml +136 -3
  241. data/lib/locales/en/jack_handey.yml +54 -0
  242. data/lib/locales/en/kamen_rider.yml +452 -0
  243. data/lib/locales/en/kpop.yml +7 -7
  244. data/lib/locales/en/league_of_legends.yml +285 -6
  245. data/lib/locales/en/lebowski.yml +1 -1
  246. data/lib/locales/en/lovecraft.yml +76 -6
  247. data/lib/locales/en/military.yml +179 -5
  248. data/lib/locales/en/minecraft.yml +663 -0
  249. data/lib/locales/en/mitch_hedberg.yml +46 -0
  250. data/lib/locales/en/mountain.yml +171 -0
  251. data/lib/locales/en/mountaineering.yml +14 -0
  252. data/lib/locales/en/movie.yml +194 -2
  253. data/lib/locales/en/music.yml +461 -29
  254. data/lib/locales/en/myst.yml +87 -31
  255. data/lib/locales/en/name.yml +5 -4
  256. data/lib/locales/en/naruto.yml +230 -0
  257. data/lib/locales/en/one_piece.yml +2 -2
  258. data/lib/locales/en/opera.yml +169 -1
  259. data/lib/locales/en/overwatch.yml +2648 -2622
  260. data/lib/locales/en/pearl_jam.yml +213 -0
  261. data/lib/locales/en/phish.yml +392 -1
  262. data/lib/locales/en/phone_number.yml +78 -3
  263. data/lib/locales/en/pokemon.yml +417 -4
  264. data/lib/locales/en/prince.yml +227 -0
  265. data/lib/locales/en/quote.yml +692 -163
  266. data/lib/locales/en/rock_band.yml +1 -0
  267. data/lib/locales/en/rush.yml +32 -0
  268. data/lib/locales/en/science.yml +481 -3
  269. data/lib/locales/en/shakespeare.yml +21 -24
  270. data/lib/locales/en/simpsons.yml +668 -0
  271. data/lib/locales/en/smashing_pumpkins.yml +382 -0
  272. data/lib/locales/en/source.yml +35 -0
  273. data/lib/locales/en/south_park.yml +360 -2
  274. data/lib/locales/en/space.yml +1 -1
  275. data/lib/locales/en/spongebob.yml +489 -0
  276. data/lib/locales/en/sport.yml +130 -0
  277. data/lib/locales/en/star_trek.yml +1 -1
  278. data/lib/locales/en/star_wars.yml +568 -220
  279. data/lib/locales/en/stranger_thing.yml +1 -1
  280. data/lib/locales/en/street_fighter.yml +1524 -0
  281. data/lib/locales/en/studio_ghibli.yml +107 -0
  282. data/lib/locales/en/suits.yml +45 -0
  283. data/lib/locales/en/super_mario.yml +58 -0
  284. data/lib/locales/en/super_smash_bros.yml +23 -6
  285. data/lib/locales/en/supernatural.yml +141 -0
  286. data/lib/locales/en/tarkov.yml +593 -0
  287. data/lib/locales/en/tea.yml +172 -0
  288. data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
  289. data/lib/locales/en/the_office.yml +86 -0
  290. data/lib/locales/en/the_room.yml +68 -0
  291. data/lib/locales/en/theater.yml +597 -0
  292. data/lib/locales/en/tolkien.yml +2453 -0
  293. data/lib/locales/en/touhou.yml +839 -0
  294. data/lib/locales/en/train_station.yml +280 -0
  295. data/lib/locales/en/tron.yml +227 -0
  296. data/lib/locales/en/vehicle.yml +2809 -75
  297. data/lib/locales/en/volleyball.yml +501 -0
  298. data/lib/locales/en/warhammer_fantasy.yml +582 -0
  299. data/lib/locales/en/witcher.yml +426 -7
  300. data/lib/locales/en/world_of_warcraft.yml +122 -4
  301. data/lib/locales/en/zelda.yml +962 -4
  302. data/lib/locales/en-AU.yml +728 -17
  303. data/lib/locales/en-CA.yml +373 -16
  304. data/lib/locales/en-GB.yml +116 -8
  305. data/lib/locales/en-IND.yml +1259 -16
  306. data/lib/locales/en-KE.yml +212 -0
  307. data/lib/locales/en-MS.yml +364 -16
  308. data/lib/locales/en-NEP.yml +212 -35
  309. data/lib/locales/en-NG.yml +1 -0
  310. data/lib/locales/en-NZ.yml +1153 -121
  311. data/lib/locales/en-PAK.yml +369 -9
  312. data/lib/locales/en-SG.yml +581 -15
  313. data/lib/locales/en-UG.yml +1 -0
  314. data/lib/locales/en-US.yml +6937 -71
  315. data/lib/locales/en-ZA.yml +1 -1
  316. data/lib/locales/en-au-ocker.yml +266 -21
  317. data/lib/locales/en.yml +0 -3
  318. data/lib/locales/es-AR.yml +4570 -0
  319. data/lib/locales/es-MX.yml +1 -2
  320. data/lib/locales/es.yml +58 -3
  321. data/lib/locales/fi-FI.yml +4 -2
  322. data/lib/locales/fr/address.yml +20 -0
  323. data/lib/locales/fr/adjective.yml +266 -0
  324. data/lib/locales/fr/ancient.yml +141 -0
  325. data/lib/locales/fr/animal.yml +5 -0
  326. data/lib/locales/fr/appliance.yml +4 -0
  327. data/lib/locales/fr/book.yml +7 -0
  328. data/lib/locales/fr/color.yml +4 -0
  329. data/lib/locales/fr/company.yml +17 -0
  330. data/lib/locales/fr/compass.yml +23 -0
  331. data/lib/locales/fr/demographic.yml +4 -0
  332. data/lib/locales/fr/gender.yml +6 -0
  333. data/lib/locales/fr/internet.yml +4 -0
  334. data/lib/locales/fr/lorem.yml +5 -0
  335. data/lib/locales/fr/measurement.yml +7 -0
  336. data/lib/locales/fr/name.yml +22 -0
  337. data/lib/locales/fr/phone_number.yml +7 -0
  338. data/lib/locales/fr/pokemon.yml +7 -0
  339. data/lib/locales/fr-CA.yml +2748 -43
  340. data/lib/locales/fr-CH.yml +3 -4
  341. data/lib/locales/fr.yml +2 -112
  342. data/lib/locales/hy.yml +3624 -119
  343. data/lib/locales/id.yml +839 -10
  344. data/lib/locales/it.yml +1304 -31
  345. data/lib/locales/ja/README.md +13 -0
  346. data/lib/locales/ja/address.yml +120539 -0
  347. data/lib/locales/ja/adjective.yml +148 -0
  348. data/lib/locales/ja/ancient.yml +4 -0
  349. data/lib/locales/ja/animal.yml +5 -0
  350. data/lib/locales/ja/bank.yml +4 -0
  351. data/lib/locales/ja/book.yml +7 -0
  352. data/lib/locales/ja/cat.yml +5 -0
  353. data/lib/locales/ja/coffee.yml +4 -0
  354. data/lib/locales/ja/color.yml +4 -0
  355. data/lib/locales/ja/commerce.yml +11 -0
  356. data/lib/locales/ja/company.yml +8 -0
  357. data/lib/locales/ja/dog.yml +6 -0
  358. data/lib/locales/ja/emotion.yml +51 -0
  359. data/lib/locales/ja/food.yml +4 -0
  360. data/lib/locales/ja/football.yml +115 -0
  361. data/lib/locales/ja/gender.yml +4 -0
  362. data/lib/locales/ja/lorem.yml +9 -0
  363. data/lib/locales/ja/name.yml +13 -0
  364. data/lib/locales/ja/naruto.yml +230 -0
  365. data/lib/locales/ja/overwatch.yml +5 -0
  366. data/lib/locales/ja/phone_number.yml +7 -0
  367. data/lib/locales/ja/pokemon.yml +7 -0
  368. data/lib/locales/ja/relationship.yml +10 -0
  369. data/lib/locales/ja/restaurant.yml +11 -0
  370. data/lib/locales/ja/space.yml +5 -0
  371. data/lib/locales/ja/sport.yml +130 -0
  372. data/lib/locales/ja/studio_ghibli.yml +112 -0
  373. data/lib/locales/ja/subscription.yml +8 -0
  374. data/lib/locales/ja/super_mario.yml +9 -0
  375. data/lib/locales/ja/super_smash_bros.yml +8 -0
  376. data/lib/locales/ja/touhou.yml +466 -0
  377. data/lib/locales/ja/university.yml +9 -0
  378. data/lib/locales/ja/zelda.yml +5 -0
  379. data/lib/locales/ko.yml +1450 -17
  380. data/lib/locales/lt.yml +315 -0
  381. data/lib/locales/lv.yml +1 -2
  382. data/lib/locales/mi-NZ.yml +283 -0
  383. data/lib/locales/nb-NO.yml +518 -27
  384. data/lib/locales/nl.yml +1 -1
  385. data/lib/locales/pl.yml +1 -2
  386. data/lib/locales/pt-BR.yml +8157 -659
  387. data/lib/locales/pt.yml +844 -43
  388. data/lib/locales/ru.yml +1355 -30
  389. data/lib/locales/sk.yml +4410 -41
  390. data/lib/locales/sv.yml +100 -0
  391. data/lib/locales/th.yml +76 -76
  392. data/lib/locales/tr.yml +1 -2
  393. data/lib/locales/uk.yml +1810 -44
  394. data/lib/locales/vi.yml +1 -0
  395. data/lib/locales/zh-CN/bank.yml +17 -0
  396. data/lib/locales/zh-CN.yml +1 -0
  397. data/lib/locales/zh-TW.yml +1 -0
  398. metadata +192 -127
  399. data/History.md +0 -176
  400. data/lib/faker/default/fillmurray.rb +0 -45
  401. data/lib/faker/default/lorem_pixel.rb +0 -47
  402. data/lib/locales/en/hobbit.yml +0 -19
  403. data/lib/locales/en/lord_of_the_rings.yml +0 -6
  404. data/lib/locales/ja.yml +0 -101
@@ -2,46 +2,74 @@
2
2
 
3
3
  module Faker
4
4
  class Internet < Base
5
- class << self
6
- def email(legacy_name = NOT_GIVEN, legacy_separators = NOT_GIVEN, name: nil, separators: nil, domain: nil)
7
- warn_for_deprecated_arguments do |keywords|
8
- keywords << :name if legacy_name != NOT_GIVEN
9
- keywords << :separators if legacy_separators != NOT_GIVEN
10
- end
11
-
12
- if separators
13
- [username(specifier: name, separators: separators), domain_name(domain: domain)].join('@')
14
- else
15
- [username(specifier: name), domain_name(domain: domain)].join('@')
16
- end
17
- end
18
-
19
- def free_email(legacy_name = NOT_GIVEN, name: nil)
20
- warn_for_deprecated_arguments do |keywords|
21
- keywords << :name if legacy_name != NOT_GIVEN
22
- end
23
-
24
- [username(specifier: name), fetch('internet.free_email')].join('@')
25
- end
26
-
27
- def safe_email(legacy_name = NOT_GIVEN, name: nil)
28
- warn_for_deprecated_arguments do |keywords|
29
- keywords << :name if legacy_name != NOT_GIVEN
30
- end
5
+ # Private, Host, and Link-Local network address blocks as defined in https://en.wikipedia.org/wiki/IPv4#Special-use_addresses
6
+ PRIVATE_IPV4_ADDRESS_RANGES = [
7
+ [10..10, 0..255, 0..255, 1..255], # 10.0.0.0/8 - Used for local communications within a private network
8
+ [100..100, 64..127, 0..255, 1..255], # 100.64.0.0/10 - Shared address space for communications between an ISP and its subscribers
9
+ [127..127, 0..255, 0..255, 1..255], # 127.0.0.0/8 - Used for loopback addresses to the local host
10
+ [169..169, 254..254, 0..255, 1..255], # 169.254.0.0/16 - Used for link-local addresses between two hosts on a single link when
11
+ [172..172, 16..31, 0..255, 1..255], # 172.16.0.0/12 - Used for local communications within a private network
12
+ [192..192, 0..0, 0..0, 1..255], # 192.0.0.0/24 - IETF Protocol Assignments
13
+ [192..192, 168..168, 0..255, 1..255], # 192.168.0.0/16 - Used for local communications within a private network
14
+ [198..198, 18..19, 0..255, 1..255] # 198.18.0.0/15 - Used for benchmark testing of inter-network communications between subnets
15
+ ].each(&:freeze).freeze
31
16
 
32
- [username(specifier: name), 'example.' + sample(%w[org com net])].join('@')
17
+ class << self
18
+ ##
19
+ # Returns the email address
20
+ #
21
+ # @return [String]
22
+ #
23
+ # @param name [String]
24
+ # @param separators [Array]
25
+ # @param domain [String]
26
+ #
27
+ # @example
28
+ # Faker::Internet.email #=> "renee@zieme.test"
29
+ # Faker::Internet.email(name: 'smith') #=> "smith@bergnaum.test"
30
+ # Faker::Internet.email(name: 'sam smith', separators: ['-']) #=> "smith-sam@tromp.example"
31
+ # Faker::Internet.email(name: 'sam smith', separators: ['-'], domain: 'test') #=> "sam-smith@test.example"
32
+ # Faker::Internet.email(domain: 'gmail.com') #=> "foo@gmail.com"
33
+ def email(name: nil, separators: nil, domain: nil)
34
+ local_part = if separators
35
+ username(specifier: name, separators: separators)
36
+ else
37
+ username(specifier: name)
38
+ end
39
+
40
+ sanitized_local_part = sanitize_email_local_part(local_part)
41
+
42
+ generate_domain = if domain.nil?
43
+ domain_name
44
+ else
45
+ domain_name(domain: domain)
46
+ end
47
+
48
+ construct_email(sanitized_local_part, generate_domain)
33
49
  end
34
50
 
35
- def username(legacy_specifier = NOT_GIVEN, legacy_separators = NOT_GIVEN, specifier: nil, separators: %w[. _])
36
- warn_for_deprecated_arguments do |keywords|
37
- keywords << :specifier if legacy_specifier != NOT_GIVEN
38
- keywords << :separators if legacy_separators != NOT_GIVEN
39
- end
40
-
51
+ ##
52
+ # Returns the username
53
+ #
54
+ # @return [String]
55
+ #
56
+ # @param specifier [Integer, Range, String] When int value passed it returns the username longer than specifier. Max value can be 10^6
57
+ # @param separators [Array]
58
+ #
59
+ # @example
60
+ # Faker::Internet.username(specifier: 10) #=> "lulu.goodwin"
61
+ # Faker::Internet.username(specifier: 5..10) #=> "morris"
62
+ # Faker::Internet.username(specifier: 5..10) #=> "berryberry"
63
+ # Faker::Internet.username(specifier: 20, separators: ['_']) #=> "nikki_sawaynnikki_saway"
64
+ def username(specifier: nil, separators: %w[. _])
41
65
  with_locale(:en) do
42
- return shuffle(specifier.scan(/[[:word:]]+/)).join(sample(separators)).downcase if specifier.respond_to?(:scan)
66
+ case specifier
67
+ when ::String
68
+ names = specifier.gsub("'", '').scan(/[[:word:]]+/)
69
+ shuffled_names = shuffle(names)
43
70
 
44
- if specifier.is_a?(Integer)
71
+ return shuffled_names.join(sample(separators)).downcase
72
+ when Integer
45
73
  # If specifier is Integer and has large value, Argument error exception is raised to overcome memory full error
46
74
  raise ArgumentError, 'Given argument is too large' if specifier > 10**6
47
75
 
@@ -53,7 +81,7 @@ module Faker
53
81
  break unless result.length < specifier && tries < 7
54
82
  end
55
83
  return result * (specifier / result.length + 1) if specifier.positive?
56
- elsif specifier.is_a?(Range)
84
+ when Range
57
85
  tries = 0
58
86
  result = nil
59
87
  loop do
@@ -73,8 +101,6 @@ module Faker
73
101
  end
74
102
  end
75
103
 
76
- # rubocop:disable Metrics/ParameterLists
77
-
78
104
  ##
79
105
  # Produces a randomized string of characters suitable for passwords
80
106
  #
@@ -97,106 +123,184 @@ module Faker
97
123
  # Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true, special_characters: true) #=> "*%NkOnJsH4"
98
124
  #
99
125
  # @faker.version 2.1.3
100
- def password(legacy_min_length = NOT_GIVEN, legacy_max_length = NOT_GIVEN, legacy_mix_case = NOT_GIVEN, legacy_special_characters = NOT_GIVEN, min_length: 8, max_length: 16, mix_case: true, special_characters: false)
101
- # rubocop:enable Metrics/ParameterLists
102
- warn_for_deprecated_arguments do |keywords|
103
- keywords << :min_length if legacy_min_length != NOT_GIVEN
104
- keywords << :max_length if legacy_max_length != NOT_GIVEN
105
- keywords << :mix_case if legacy_mix_case != NOT_GIVEN
106
- keywords << :special_characters if legacy_special_characters != NOT_GIVEN
107
- end
126
+ def password(min_length: 8, max_length: 16, mix_case: true, special_characters: false)
127
+ raise ArgumentError, 'min_length and max_length must be greater than or equal to one' if min_length < 1 || max_length < 1
128
+ raise ArgumentError, 'min_length must be smaller than or equal to max_length' unless min_length <= max_length
129
+
130
+ character_types = []
131
+ required_min_length = 0
108
132
 
109
- min_alpha = mix_case ? 2 : 0
110
- temp = Lorem.characters(number: min_length, min_alpha: min_alpha)
111
- diff_length = max_length - min_length
133
+ if mix_case
134
+ character_types << :mix_case
135
+ required_min_length += 2
136
+ end
112
137
 
113
- if diff_length.positive?
114
- diff_rand = rand(diff_length + 1)
115
- temp += Lorem.characters(number: diff_rand)
138
+ if special_characters
139
+ character_types << :special_characters
140
+ required_min_length += 1
116
141
  end
117
142
 
143
+ raise ArgumentError, "min_length should be at least #{required_min_length} to enable #{character_types.join(', ')} configuration" if min_length < required_min_length
144
+
145
+ target_length = rand(min_length..max_length)
146
+
147
+ password = []
148
+ character_bag = []
149
+
150
+ # use lower_chars by default and add upper_chars if mix_case
151
+ lower_chars = self::LLetters
152
+ password << sample(lower_chars)
153
+ character_bag += lower_chars
154
+
155
+ digits = ('0'..'9').to_a
156
+ password << sample(digits)
157
+ character_bag += digits
158
+
118
159
  if mix_case
119
- alpha_count = 0
120
- temp.chars.each_with_index do |char, index|
121
- if char =~ /[[:alpha:]]/
122
- temp[index] = char.upcase if alpha_count.even?
123
- alpha_count += 1
124
- end
125
- end
160
+ upper_chars = self::ULetters
161
+ password << sample(upper_chars)
162
+ character_bag += upper_chars
126
163
  end
127
164
 
128
165
  if special_characters
129
- chars = %w[! @ # $ % ^ & *]
130
- rand(1..min_length).times do |i|
131
- temp[i] = chars[rand(chars.length)]
132
- end
166
+ special_chars = %w[! @ # $ % ^ & *]
167
+ password << sample(special_chars)
168
+ character_bag += special_chars
133
169
  end
134
170
 
135
- temp
136
- end
171
+ password << sample(character_bag) while password.length < target_length
137
172
 
138
- def domain_name(legacy_subdomain = NOT_GIVEN, subdomain: false, domain: nil)
139
- warn_for_deprecated_arguments do |keywords|
140
- keywords << :subdomain if legacy_subdomain != NOT_GIVEN
141
- end
173
+ shuffle(password).join
174
+ end
142
175
 
176
+ ##
177
+ # Returns the domain name
178
+ #
179
+ # @return [String]
180
+ #
181
+ # @param subdomain [Bool] If true passed adds a subdomain in response
182
+ # @param domain [String]
183
+ #
184
+ # @example
185
+ # Faker::Internet.domain_name #=> "altenwerth-gerhold.example"
186
+ # Faker::Internet.domain_name(subdomain: true) #=> "metz.mclaughlin-brekke.test"
187
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker') #=> "foo.faker.test"
188
+ # Faker::Internet.domain_name(domain: 'faker-ruby.org') #=> "faker-ruby.org"
189
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker-ruby.org') #=> "foo.faker-ruby.org"
190
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker.faker-ruby.org') #=> "faker.faker-ruby.org"
191
+ def domain_name(subdomain: false, domain: nil)
143
192
  with_locale(:en) do
144
193
  if domain
145
194
  domain
146
195
  .split('.')
147
196
  .map { |domain_part| Char.prepare(domain_part) }
148
197
  .tap do |domain_elements|
149
- domain_elements << domain_suffix if domain_elements.length < 2
150
- domain_elements.unshift(Char.prepare(domain_word)) if subdomain && domain_elements.length < 3
198
+ if domain_elements.length < 2
199
+ domain_elements << domain_suffix(safe: true)
200
+ end
201
+ if subdomain && domain_elements.length < 3
202
+ domain_elements.unshift(Char.prepare(domain_word))
203
+ end
151
204
  end.join('.')
152
205
  else
153
- [domain_word, domain_suffix].tap do |domain_elements|
154
- domain_elements.unshift(Char.prepare(domain_word)) if subdomain
206
+ [domain_word, domain_suffix(safe: true)].tap do |domain_elements|
207
+ if subdomain
208
+ domain_elements.unshift(Char.prepare(domain_word))
209
+ end
155
210
  end.join('.')
156
211
  end
157
212
  end
158
213
  end
159
214
 
160
- def fix_umlauts(legacy_string = NOT_GIVEN, string: '')
161
- warn_for_deprecated_arguments do |keywords|
162
- keywords << :string if legacy_string != NOT_GIVEN
163
- end
164
-
215
+ ##
216
+ # Fixes ä, ö, ü, ß characters in string passed with ae, oe, ue, ss resp.
217
+ #
218
+ # @return [String]
219
+ #
220
+ # @param string [String]
221
+ #
222
+ # @example
223
+ # Faker::Internet.fix_umlauts #=> ""
224
+ # Faker::Internet.fix_umlauts(string: 'faker') #=> "faker"
225
+ # Faker::Internet.fix_umlauts(string: 'faküer') #=> "fakueer"
226
+ def fix_umlauts(string: '')
165
227
  Char.fix_umlauts(string)
166
228
  end
167
229
 
230
+ ##
231
+ # Returns the domain word for internet
232
+ #
233
+ # @return [String]
234
+ #
235
+ # @example
236
+ # Faker::Internet.domain_word #=> "senger"
168
237
  def domain_word
169
- with_locale(:en) { Char.prepare(Company.name.split(' ').first) }
238
+ with_locale(:en) { Char.prepare(Company.name.split.first) }
170
239
  end
171
240
 
172
- def domain_suffix
173
- fetch('internet.domain_suffix')
174
- end
175
-
176
- def mac_address(legacy_prefix = NOT_GIVEN, prefix: '')
177
- warn_for_deprecated_arguments do |keywords|
178
- keywords << :prefix if legacy_prefix != NOT_GIVEN
241
+ ## Returns the domain suffix e.g. com, org, co, biz, info etc.
242
+ #
243
+ # @return [String]
244
+ #
245
+ # @example
246
+ # Faker::Internet.domain_suffix #=> "com"
247
+ # Faker::Internet.domain_suffix #=> "biz"
248
+ # Faker::Internet.domain_suffix(safe: true) #=> "example"
249
+ # Faker::Internet.domain_suffix(safe: true) #=> "test"
250
+ def domain_suffix(safe: nil)
251
+ if safe
252
+ fetch('internet.safe_domain_suffix')
253
+ else
254
+ fetch('internet.domain_suffix')
179
255
  end
256
+ end
180
257
 
258
+ ##
259
+ # Returns the MAC address
260
+ #
261
+ # @return [String]
262
+ #
263
+ # @example
264
+ # Faker::Internet.mac_address #=> "74:d0:c9:22:95:12"
265
+ # Faker::Internet.mac_address(prefix: 'a') #=> "0a:91:ce:24:89:3b"
266
+ # Faker::Internet.mac_address(prefix: 'aa') #=> "aa:38:a0:3e:e8:41"
267
+ # Faker::Internet.mac_address(prefix: 'aa:44') #=> "aa:44:30:88:6e:95"
268
+ def mac_address(prefix: '')
181
269
  prefix_digits = prefix.split(':').map { |d| d.to_i(16) }
182
270
  address_digits = Array.new((6 - prefix_digits.size)) { rand(256) }
183
271
  (prefix_digits + address_digits).map { |d| format('%02x', d) }.join(':')
184
272
  end
185
273
 
274
+ ##
275
+ # Returns the IPv4 address
276
+ #
277
+ # @return [String]
278
+ #
279
+ # @example
280
+ # Faker::Internet.ip_v4_address #=> "97.117.128.93"
186
281
  def ip_v4_address
187
282
  [rand_in_range(0, 255), rand_in_range(0, 255),
188
283
  rand_in_range(0, 255), rand_in_range(0, 255)].join('.')
189
284
  end
190
285
 
286
+ ##
287
+ # Returns the private IPv4 address
288
+ #
289
+ # @return [String]
290
+ #
291
+ # @example
292
+ # Faker::Internet.private_ip_v4_address #=> "127.120.80.42"
191
293
  def private_ip_v4_address
192
- addr = nil
193
- loop do
194
- addr = ip_v4_address
195
- break if private_net_checker[addr]
196
- end
197
- addr
294
+ sample(PRIVATE_IPV4_ADDRESS_RANGES).map { |range| rand(range) }.join('.')
198
295
  end
199
296
 
297
+ ##
298
+ # Returns the public IPv4 address
299
+ #
300
+ # @return [String]
301
+ #
302
+ # @example
303
+ # Faker::Internet.public_ip_v4_address #=> "127.120.80.42"
200
304
  def public_ip_v4_address
201
305
  addr = nil
202
306
  loop do
@@ -206,6 +310,13 @@ module Faker
206
310
  addr
207
311
  end
208
312
 
313
+ ##
314
+ # Returns the private network regular expressions
315
+ #
316
+ # @return [Array]
317
+ #
318
+ # @example
319
+ # Faker::Internet.private_nets_regex #=> [/^10\./, /^100\.(6[4-9]|[7-9]\d|1[0-1]\d|12[0-7])\./, /^127\./, /^169\.254\./, /^172\.(1[6-9]|2\d|3[0-1])\./, /^192\.0\.0\./, /^192\.168\./, /^198\.(1[8-9])\./]
209
320
  def private_nets_regex
210
321
  [
211
322
  /^10\./, # 10.0.0.0 - 10.255.255.255
@@ -219,10 +330,25 @@ module Faker
219
330
  ]
220
331
  end
221
332
 
333
+ ##
334
+ # Returns lambda to check if address passed is private or not
335
+ #
336
+ # @return [Lambda]
337
+ #
338
+ # @example
339
+ # Faker::Internet.private_net_checker.call("127.120.80.42") #=> true
340
+ # Faker::Internet.private_net_checker.call("148.120.80.42") #=> false
222
341
  def private_net_checker
223
342
  ->(addr) { private_nets_regex.any? { |net| net =~ addr } }
224
343
  end
225
344
 
345
+ ##
346
+ # Returns the reserved network regular expressions
347
+ #
348
+ # @return [Array]
349
+ #
350
+ # @example
351
+ # Faker::Internet.reserved_nets_regex #=> [/^0\./, /^192\.0\.2\./, /^192\.88\.99\./, /^198\.51\.100\./, /^203\.0\.113\./, /^(22[4-9]|23\d)\./, /^(24\d|25[0-5])\./]
226
352
  def reserved_nets_regex
227
353
  [
228
354
  /^0\./, # 0.0.0.0 - 0.255.255.255
@@ -235,58 +361,143 @@ module Faker
235
361
  ]
236
362
  end
237
363
 
364
+ ##
365
+ # Returns lambda function to check address passed is reserved or not
366
+ #
367
+ # @return [Lambda]
368
+ #
369
+ # @example
370
+ # Faker::Internet.reserved_net_checker.call('192.88.99.255') #=> true
371
+ # Faker::Internet.reserved_net_checker.call('192.88.199.255') #=> false
238
372
  def reserved_net_checker
239
373
  ->(addr) { (private_nets_regex + reserved_nets_regex).any? { |net| net =~ addr } }
240
374
  end
241
375
 
376
+ ##
377
+ # Returns Ipv4 address with CIDR, range from 1 to 31
378
+ #
379
+ # @return [String]
380
+ #
381
+ # @example
382
+ # Faker::Internet.ip_v4_cidr #=> "129.162.99.74/16"
383
+ # Faker::Internet.ip_v4_cidr #=> "129.162.99.74/24"
242
384
  def ip_v4_cidr
243
385
  "#{ip_v4_address}/#{rand(1..31)}"
244
386
  end
245
387
 
388
+ ##
389
+ # Returns Ipv6 address
390
+ #
391
+ # @return [String]
392
+ #
393
+ # @example
394
+ # Faker::Internet.ip_v6_address #=> "7754:76d4:c7aa:7646:ea68:1abb:4055:4343"
246
395
  def ip_v6_address
247
396
  (1..8).map { rand(65_536).to_s(16) }.join(':')
248
397
  end
249
398
 
399
+ ##
400
+ # Returns Ipv6 address with CIDR, range between 1 to 127
401
+ #
402
+ # @return [String]
403
+ #
404
+ # @example
405
+ # Faker::Internet.ip_v6_cidr #=> "beca:9b99:4bb6:9712:af2f:516f:8507:96e1/99"
250
406
  def ip_v6_cidr
251
407
  "#{ip_v6_address}/#{rand(1..127)}"
252
408
  end
253
409
 
254
- # rubocop:disable Metrics/ParameterLists
255
- def url(legacy_host = NOT_GIVEN, legacy_path = NOT_GIVEN, legacy_scheme = NOT_GIVEN, host: domain_name, path: "/#{username}", scheme: 'http')
256
- # rubocop:enable Metrics/ParameterLists
257
- warn_for_deprecated_arguments do |keywords|
258
- keywords << :host if legacy_host != NOT_GIVEN
259
- keywords << :path if legacy_path != NOT_GIVEN
260
- keywords << :scheme if legacy_scheme != NOT_GIVEN
261
- end
262
-
410
+ ##
411
+ # Returns URL
412
+ #
413
+ # @return [String]
414
+ #
415
+ # @param host [String]
416
+ # @param path [String]
417
+ # @param scheme [String]
418
+ #
419
+ # @example
420
+ # Faker::Internet.url #=> "http://treutel.test/demarcus"
421
+ # Faker::Internet.url(host: 'faker') #=> "http://faker/shad"
422
+ # Faker::Internet.url(host: 'faker', path: '/docs') #=> "http://faker/docs"
423
+ # Faker::Internet.url(host: 'faker', path: '/docs', scheme: 'https') #=> "https://faker/docs"
424
+ def url(host: domain_name, path: "/#{username}", scheme: 'http')
263
425
  "#{scheme}://#{host}#{path}"
264
426
  end
265
427
 
266
- def slug(legacy_words = NOT_GIVEN, legacy_glue = NOT_GIVEN, words: nil, glue: nil)
267
- warn_for_deprecated_arguments do |keywords|
268
- keywords << :words if legacy_words != NOT_GIVEN
269
- keywords << :glue if legacy_glue != NOT_GIVEN
270
- end
271
-
428
+ ##
429
+ # Returns unique string in URL
430
+ #
431
+ # @return [String]
432
+ #
433
+ # @param words [String] Comma or period separated words list
434
+ # @param glue [String] Separator to add between words passed, default used are '-' or '_'
435
+ #
436
+ # @example
437
+ # Faker::Internet.slug #=> "repudiandae-sed"
438
+ # Faker::Internet.slug(words: 'test, faker') #=> "test-faker"
439
+ # Faker::Internet.slug(words: 'test. faker') #=> "test-faker"
440
+ # Faker::Internet.slug(words: 'test. faker', glue: '$') #=> "test$faker"
441
+ def slug(words: nil, glue: nil)
272
442
  glue ||= sample(%w[- _])
273
- (words || Faker::Lorem.words(number: 2).join(' ')).delete(',.').gsub(' ', glue).downcase
443
+ return words.delete(',.').gsub(' ', glue).downcase unless words.nil?
444
+
445
+ sample(translate('faker.internet.slug'), 2).join(glue)
274
446
  end
275
447
 
448
+ ##
449
+ # Generates random token
450
+ #
451
+ # @return[String]
452
+ #
453
+ # @example
454
+ # Faker::Internet.device_token #=> "749f535671cf6b34d8e794d212d00c703b96274e07161b18b082d0d70ef1052f"
276
455
  def device_token
277
456
  shuffle(rand(16**64).to_s(16).rjust(64, '0').chars.to_a).join
278
457
  end
279
458
 
280
- def user_agent(legacy_vendor = NOT_GIVEN, vendor: nil)
281
- warn_for_deprecated_arguments do |keywords|
282
- keywords << :vendor if legacy_vendor != NOT_GIVEN
283
- end
284
-
459
+ ##
460
+ # Generates the random browser identifier
461
+ #
462
+ # @return [String]
463
+ #
464
+ # @param vendor [String] Name of vendor, supported vendors are aol, chrome, firefox, internet_explorer, netscape, opera, safari
465
+ #
466
+ # @example
467
+ # Faker::Internet.user_agent #=> "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
468
+ # Faker::Internet.user_agent(vendor: 'chrome') #=> "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36"
469
+ # Faker::Internet.user_agent(vendor: 'safari') #=> "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"
470
+ # Faker::Internet.user_agent(vendor: 'faker') #=> "Mozilla/5.0 (Windows; U; Win 9x 4.90; SG; rv:1.9.2.4) Gecko/20101104 Netscape/9.1.0285"
471
+ def user_agent(vendor: nil)
285
472
  agent_hash = translate('faker.internet.user_agent')
286
473
  agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
287
474
  sample(agents)
288
475
  end
289
476
 
477
+ ##
478
+ # Generate Web Crawler's user agents
479
+ #
480
+ # @return [String]
481
+ #
482
+ # @param vendor [String] Name of vendor, supported vendors are googlebot, bingbot, duckduckbot, baiduspider, yandexbot
483
+ #
484
+ # @example
485
+ # Faker::Internet.bot_user_agent #=> "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
486
+ # Faker::Internet.bot_user_agent(vendor: 'googlebot') #=> "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Googlebot/2.1; +http://www.google.com/bot.html) Chrome/99.0.4844.84 Safari/537.36"
487
+ # Faker::Internet.bot_user_agent(vendor: 'bingbot') #=> "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm) Chrome/86.0.4240.68 Safari/537.36 Edg/86.0.622.31"
488
+ def bot_user_agent(vendor: nil)
489
+ agent_hash = translate('faker.internet.bot_user_agent')
490
+ agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
491
+ sample(agents)
492
+ end
493
+
494
+ ##
495
+ # Generated universally unique identifier
496
+ #
497
+ # @return [String]
498
+ #
499
+ # @example
500
+ # Faker::Internet.uuid #=> "8a6cdd40-6d78-4fdb-912b-190e3057197f"
290
501
  def uuid
291
502
  # borrowed from: https://github.com/ruby/ruby/blob/d48783bb0236db505fe1205d1d9822309de53a36/lib/securerandom.rb#L250
292
503
  ary = Faker::Config.random.bytes(16).unpack('NnnnnN')
@@ -324,7 +535,44 @@ module Faker
324
535
  s
325
536
  end
326
537
 
538
+ ##
539
+ # Produces a randomized hash of internet user details
540
+ # @example
541
+ # Faker::Internet.user #=> { username: 'alexie', email: 'trudie@grant.test' }
542
+ #
543
+ # @example
544
+ # Faker::Internet.user('username', 'email', 'password') #=> { username: 'alexie', email: 'gayle@kohler.test', password: 'DtEf9P8wS31iMyC' }
545
+ #
546
+ # @return [hash]
547
+ #
548
+ # @faker.version next
549
+ def user(*args)
550
+ user_hash = {}
551
+ args = %w[username email] if args.empty?
552
+ args.each { |arg| user_hash[:"#{arg}"] = send(arg) }
553
+ user_hash
554
+ end
555
+
327
556
  alias user_name username
557
+
558
+ private
559
+
560
+ def sanitize_email_local_part(local_part)
561
+ char_range = [
562
+ Array('0'..'9'),
563
+ Array('A'..'Z'),
564
+ Array('a'..'z'),
565
+ "!#$%&'*+-/=?^_`{|}~.".chars
566
+ ].flatten
567
+
568
+ local_part.chars.map do |char|
569
+ char_range.include?(char) ? char : '#'
570
+ end.join
571
+ end
572
+
573
+ def construct_email(local_part, domain_name)
574
+ [local_part, domain_name].join('@')
575
+ end
328
576
  end
329
577
  end
330
578
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faker
4
+ class Internet
5
+ class HTTP < Base
6
+ STATUS_CODES = {
7
+ information: [100, 101, 102, 103],
8
+ successful: [200, 201, 202, 203, 204, 205, 206, 207, 208, 226],
9
+ redirect: [300, 301, 302, 303, 304, 305, 306, 307, 308],
10
+ client_error: [400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412,
11
+ 413, 414, 415, 416, 417, 418, 421, 422, 423, 424, 425, 426, 428,
12
+ 429, 431, 451],
13
+ server_error: [500, 501, 502, 503, 504, 505, 506, 507, 508, 510, 511]
14
+ }.freeze
15
+
16
+ STATUS_CODES_GROUPS = STATUS_CODES.keys.freeze
17
+
18
+ class << self
19
+ ##
20
+ # Produces an HTTP status code
21
+ #
22
+ # @return [Integer]
23
+ #
24
+ # @example
25
+ # Faker::Internet::HTTP.status_code #=> 418
26
+ # @example
27
+ # Faker::Internet::HTTP.status_code(group: :information) #=> 102
28
+ # @example
29
+ # Faker::Internet::HTTP.status_code(group: :successful) #=> 200
30
+ # @example
31
+ # Faker::Internet::HTTP.status_code(group: :redirect) #=> 306
32
+ # @example
33
+ # Faker::Internet::HTTP.status_code(group: :client_error) #=> 451
34
+ # @example
35
+ # Faker::Internet::HTTP.status_code(group: :server_error) #=> 502
36
+ #
37
+ # @faker.version 2.13.0
38
+ def status_code(group: nil)
39
+ return STATUS_CODES[STATUS_CODES_GROUPS.sample].sample unless group
40
+
41
+ raise ArgumentError, 'Invalid HTTP status code group' unless STATUS_CODES_GROUPS.include?(group)
42
+
43
+ STATUS_CODES[group].sample
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end