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
@@ -2,46 +2,109 @@
2
2
 
3
3
  module Faker
4
4
  class Internet < Base
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
16
+
5
17
  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
18
+ extend Gem::Deprecate
11
19
 
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
20
+ ##
21
+ # Returns the email address
22
+ #
23
+ # @return [String]
24
+ #
25
+ # @param name [String]
26
+ # @param separators [Array]
27
+ # @param domain [String]
28
+ #
29
+ # @example
30
+ # Faker::Internet.email #=> "renee@zieme.test"
31
+ # Faker::Internet.email(name: 'smith') #=> "smith@bergnaum.test"
32
+ # Faker::Internet.email(name: 'sam smith', separators: ['-']) #=> "smith-sam@tromp.example"
33
+ # Faker::Internet.email(name: 'sam smith', separators: ['-'], domain: 'test') #=> "sam-smith@test.example"
34
+ # Faker::Internet.email(domain: 'gmail.com') #=> "foo@gmail.com"
35
+ def email(name: nil, separators: nil, domain: nil)
36
+ local_part = if separators
37
+ username(specifier: name, separators: separators)
38
+ else
39
+ username(specifier: name)
40
+ end
41
+
42
+ sanitized_local_part = sanitize_email_local_part(local_part)
43
+
44
+ generate_domain = if domain.nil?
45
+ domain_name
46
+ else
47
+ domain_name(domain: domain)
48
+ end
49
+
50
+ construct_email(sanitized_local_part, generate_domain)
17
51
  end
18
52
 
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('@')
53
+ ##
54
+ # Returns the email address with domain either gmail.com, yahoo.com or hotmail.com
55
+ #
56
+ # @return [String]
57
+ #
58
+ # @param name [String]
59
+ #
60
+ # @example
61
+ # Faker::Internet.free_email #=> "samsmith@gmail.com"
62
+ # Faker::Internet.free_email(name: 'smith') #=> "smith@yahoo.com"
63
+ def free_email(name: nil)
64
+ construct_email(
65
+ sanitize_email_local_part(username(specifier: name)),
66
+ fetch('internet.free_email')
67
+ )
25
68
  end
69
+ deprecate :free_email, :email, 2023, 10
26
70
 
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
31
-
32
- [username(specifier: name), 'example.' + sample(%w[org com net])].join('@')
71
+ ##
72
+ # Returns the email address with fixed domain name as 'example'
73
+ #
74
+ # @return [String]
75
+ #
76
+ # @param name [String]
77
+ #
78
+ # @example
79
+ # Faker::Internet.safe_email #=> "samsmith@example.com"
80
+ # Faker::Internet.safe_email(name: 'smith') #=> "smith@example.net"
81
+ def safe_email(name: nil)
82
+ construct_email(
83
+ sanitize_email_local_part(username(specifier: name)),
84
+ "example.#{sample(%w[org com net])}"
85
+ )
33
86
  end
87
+ deprecate :safe_email, :email, 2023, 10
34
88
 
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
-
89
+ ##
90
+ # Returns the username
91
+ #
92
+ # @return [String]
93
+ #
94
+ # @param specifier [Integer, Range, String] When int value passed it returns the username longer than specifier. Max value can be 10^6
95
+ # @param separators [Array]
96
+ #
97
+ # @example
98
+ # Faker::Internet.username(specifier: 10) #=> "lulu.goodwin"
99
+ # Faker::Internet.username(specifier: 5..10) #=> "morris"
100
+ # Faker::Internet.username(specifier: 5..10) #=> "berryberry"
101
+ # Faker::Internet.username(specifier: 20, separators: ['-']) #=> "nikki_sawaynnikki_saway"
102
+ def username(specifier: nil, separators: %w[. _])
41
103
  with_locale(:en) do
42
104
  return shuffle(specifier.scan(/[[:word:]]+/)).join(sample(separators)).downcase if specifier.respond_to?(:scan)
43
105
 
44
- if specifier.is_a?(Integer)
106
+ case specifier
107
+ when Integer
45
108
  # If specifier is Integer and has large value, Argument error exception is raised to overcome memory full error
46
109
  raise ArgumentError, 'Given argument is too large' if specifier > 10**6
47
110
 
@@ -53,7 +116,7 @@ module Faker
53
116
  break unless result.length < specifier && tries < 7
54
117
  end
55
118
  return result * (specifier / result.length + 1) if specifier.positive?
56
- elsif specifier.is_a?(Range)
119
+ when Range
57
120
  tries = 0
58
121
  result = nil
59
122
  loop do
@@ -73,8 +136,6 @@ module Faker
73
136
  end
74
137
  end
75
138
 
76
- # rubocop:disable Metrics/ParameterLists
77
-
78
139
  ##
79
140
  # Produces a randomized string of characters suitable for passwords
80
141
  #
@@ -97,106 +158,183 @@ module Faker
97
158
  # Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true, special_characters: true) #=> "*%NkOnJsH4"
98
159
  #
99
160
  # @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
108
-
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
161
+ def password(min_length: 8, max_length: 16, mix_case: true, special_characters: false)
162
+ raise ArgumentError, 'max_length must be more than min_length' if max_length < min_length
112
163
 
113
- if diff_length.positive?
114
- diff_rand = rand(diff_length + 1)
115
- temp += Lorem.characters(number: diff_rand)
116
- end
164
+ character_types = []
165
+ required_min_length = 0
117
166
 
118
167
  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
168
+ character_types << :mix_case
169
+ required_min_length += 2
126
170
  end
127
171
 
128
172
  if special_characters
129
- chars = %w[! @ # $ % ^ & *]
130
- rand(1..min_length).times do |i|
131
- temp[i] = chars[rand(chars.length)]
132
- end
173
+ character_types << :special_characters
174
+ required_min_length += 1
133
175
  end
134
176
 
135
- temp
136
- end
177
+ raise ArgumentError, "min_length should be at least #{required_min_length} to enable #{character_types.join(', ')} configuration" if min_length < required_min_length
178
+
179
+ target_length = rand(min_length..max_length)
180
+
181
+ password = []
182
+ character_bag = []
137
183
 
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
184
+ # use lower_chars by default and add upper_chars if mix_case
185
+ lower_chars = ('a'..'z').to_a
186
+ password << lower_chars[rand(lower_chars.count - 1)]
187
+ character_bag += lower_chars
188
+
189
+ digits = ('1'..'9').to_a
190
+ password << digits[rand(digits.count - 1)]
191
+ character_bag += digits
192
+
193
+ if character_types.include?(:mix_case)
194
+ upper_chars = ('A'..'Z').to_a
195
+ password << upper_chars[rand(upper_chars.count - 1)]
196
+ character_bag += upper_chars
197
+ end
198
+
199
+ if character_types.include?(:special_characters)
200
+ special_chars = %w[! @ # $ % ^ & *]
201
+ password << special_chars[rand(special_chars.count - 1)]
202
+ character_bag += special_chars
141
203
  end
142
204
 
205
+ password << character_bag[rand(character_bag.count - 1)] while password.length < target_length
206
+
207
+ shuffle(password).join
208
+ end
209
+
210
+ ##
211
+ # Returns the domain name
212
+ #
213
+ # @return [String]
214
+ #
215
+ # @param subdomain [Bool] If true passed adds a subdomain in response
216
+ # @param domain [String]
217
+ #
218
+ # @example
219
+ # Faker::Internet.domain_name #=> "altenwerth-gerhold.example"
220
+ # Faker::Internet.domain_name(subdomain: true) #=> "metz.mclaughlin-brekke.test"
221
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker') #=> "foo.faker.test"
222
+ # Faker::Internet.domain_name(domain: 'faker-ruby.org') #=> "faker-ruby.org"
223
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker-ruby.org') #=> "foo.faker-ruby.org"
224
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker.faker-ruby.org') #=> "faker.faker-ruby.org"
225
+ def domain_name(subdomain: false, domain: nil)
143
226
  with_locale(:en) do
144
227
  if domain
145
228
  domain
146
229
  .split('.')
147
230
  .map { |domain_part| Char.prepare(domain_part) }
148
231
  .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
232
+ if domain_elements.length < 2
233
+ domain_elements << domain_suffix(safe: true)
234
+ end
235
+ if subdomain && domain_elements.length < 3
236
+ domain_elements.unshift(Char.prepare(domain_word))
237
+ end
151
238
  end.join('.')
152
239
  else
153
- [domain_word, domain_suffix].tap do |domain_elements|
154
- domain_elements.unshift(Char.prepare(domain_word)) if subdomain
240
+ [domain_word, domain_suffix(safe: true)].tap do |domain_elements|
241
+ if subdomain
242
+ domain_elements.unshift(Char.prepare(domain_word))
243
+ end
155
244
  end.join('.')
156
245
  end
157
246
  end
158
247
  end
159
248
 
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
-
249
+ ##
250
+ # Fixes ä, ö, ü, ß characters in string passed with ae, oe, ue, ss resp.
251
+ #
252
+ # @return [String]
253
+ #
254
+ # @param string [String]
255
+ #
256
+ # @example
257
+ # Faker::Internet.fix_umlauts #=> ""
258
+ # Faker::Internet.fix_umlauts(string: 'faker') #=> "faker"
259
+ # Faker::Internet.fix_umlauts(string: 'faküer') #=> "fakueer"
260
+ def fix_umlauts(string: '')
165
261
  Char.fix_umlauts(string)
166
262
  end
167
263
 
264
+ ##
265
+ # Returns the domain word for internet
266
+ #
267
+ # @return [String]
268
+ #
269
+ # @example
270
+ # Faker::Internet.domain_word #=> "senger"
168
271
  def domain_word
169
- with_locale(:en) { Char.prepare(Company.name.split(' ').first) }
170
- end
171
-
172
- def domain_suffix
173
- fetch('internet.domain_suffix')
272
+ with_locale(:en) { Char.prepare(Company.name.split.first) }
174
273
  end
175
274
 
176
- def mac_address(legacy_prefix = NOT_GIVEN, prefix: '')
177
- warn_for_deprecated_arguments do |keywords|
178
- keywords << :prefix if legacy_prefix != NOT_GIVEN
275
+ ## Returns the domain suffix e.g. com, org, co, biz, info etc.
276
+ #
277
+ # @return [String]
278
+ #
279
+ # @example
280
+ # Faker::Internet.domain_suffix #=> "com"
281
+ # Faker::Internet.domain_suffix #=> "biz"
282
+ # Faker::Internet.domain_suffix(safe: true) #=> "example"
283
+ # Faker::Internet.domain_suffix(safe: true) #=> "test"
284
+ def domain_suffix(safe: nil)
285
+ if safe
286
+ fetch('internet.safe_domain_suffix')
287
+ else
288
+ fetch('internet.domain_suffix')
179
289
  end
290
+ end
180
291
 
292
+ ##
293
+ # Returns the MAC address
294
+ #
295
+ # @return [String]
296
+ #
297
+ # @example
298
+ # Faker::Internet.mac_address #=> "74:d0:c9:22:95:12"
299
+ # Faker::Internet.mac_address(prefix: 'a') #=> "0a:91:ce:24:89:3b"
300
+ # Faker::Internet.mac_address(prefix: 'aa') #=> "aa:38:a0:3e:e8:41"
301
+ # Faker::Internet.mac_address(prefix: 'aa:44') #=> "aa:44:30:88:6e:95"
302
+ def mac_address(prefix: '')
181
303
  prefix_digits = prefix.split(':').map { |d| d.to_i(16) }
182
304
  address_digits = Array.new((6 - prefix_digits.size)) { rand(256) }
183
305
  (prefix_digits + address_digits).map { |d| format('%02x', d) }.join(':')
184
306
  end
185
307
 
308
+ ##
309
+ # Returns the IPv4 address
310
+ #
311
+ # @return [String]
312
+ #
313
+ # @example
314
+ # Faker::Internet.ip_v4_address #=> "97.117.128.93"
186
315
  def ip_v4_address
187
316
  [rand_in_range(0, 255), rand_in_range(0, 255),
188
317
  rand_in_range(0, 255), rand_in_range(0, 255)].join('.')
189
318
  end
190
319
 
320
+ ##
321
+ # Returns the private IPv4 address
322
+ #
323
+ # @return [String]
324
+ #
325
+ # @example
326
+ # Faker::Internet.private_ip_v4_address #=> "127.120.80.42"
191
327
  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
328
+ sample(PRIVATE_IPV4_ADDRESS_RANGES).map { |range| rand(range) }.join('.')
198
329
  end
199
330
 
331
+ ##
332
+ # Returns the public IPv4 address
333
+ #
334
+ # @return [String]
335
+ #
336
+ # @example
337
+ # Faker::Internet.public_ip_v4_address #=> "127.120.80.42"
200
338
  def public_ip_v4_address
201
339
  addr = nil
202
340
  loop do
@@ -206,6 +344,13 @@ module Faker
206
344
  addr
207
345
  end
208
346
 
347
+ ##
348
+ # Returns the private network regular expressions
349
+ #
350
+ # @return [Array]
351
+ #
352
+ # @example
353
+ # 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
354
  def private_nets_regex
210
355
  [
211
356
  /^10\./, # 10.0.0.0 - 10.255.255.255
@@ -219,10 +364,25 @@ module Faker
219
364
  ]
220
365
  end
221
366
 
367
+ ##
368
+ # Returns lambda to check if address passed is private or not
369
+ #
370
+ # @return [Lambda]
371
+ #
372
+ # @example
373
+ # Faker::Internet.private_net_checker.call("127.120.80.42") #=> true
374
+ # Faker::Internet.private_net_checker.call("148.120.80.42") #=> false
222
375
  def private_net_checker
223
376
  ->(addr) { private_nets_regex.any? { |net| net =~ addr } }
224
377
  end
225
378
 
379
+ ##
380
+ # Returns the reserved network regular expressions
381
+ #
382
+ # @return [Array]
383
+ #
384
+ # @example
385
+ # 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
386
  def reserved_nets_regex
227
387
  [
228
388
  /^0\./, # 0.0.0.0 - 0.255.255.255
@@ -235,58 +395,143 @@ module Faker
235
395
  ]
236
396
  end
237
397
 
398
+ ##
399
+ # Returns lambda function to check address passed is reserved or not
400
+ #
401
+ # @return [Lambda]
402
+ #
403
+ # @example
404
+ # Faker::Internet.reserved_net_checker.call('192.88.99.255') #=> true
405
+ # Faker::Internet.reserved_net_checker.call('192.88.199.255') #=> false
238
406
  def reserved_net_checker
239
407
  ->(addr) { (private_nets_regex + reserved_nets_regex).any? { |net| net =~ addr } }
240
408
  end
241
409
 
410
+ ##
411
+ # Returns Ipv4 address with CIDR, range from 1 to 31
412
+ #
413
+ # @return [String]
414
+ #
415
+ # @example
416
+ # Faker::Internet.ip_v4_cidr #=> "129.162.99.74/16"
417
+ # Faker::Internet.ip_v4_cidr #=> "129.162.99.74/24"
242
418
  def ip_v4_cidr
243
419
  "#{ip_v4_address}/#{rand(1..31)}"
244
420
  end
245
421
 
422
+ ##
423
+ # Returns Ipv6 address
424
+ #
425
+ # @return [String]
426
+ #
427
+ # @example
428
+ # Faker::Internet.ip_v6_address #=> "7754:76d4:c7aa:7646:ea68:1abb:4055:4343"
246
429
  def ip_v6_address
247
430
  (1..8).map { rand(65_536).to_s(16) }.join(':')
248
431
  end
249
432
 
433
+ ##
434
+ # Returns Ipv6 address with CIDR, range between 1 to 127
435
+ #
436
+ # @return [String]
437
+ #
438
+ # @example
439
+ # Faker::Internet.ip_v6_cidr #=> "beca:9b99:4bb6:9712:af2f:516f:8507:96e1/99"
250
440
  def ip_v6_cidr
251
441
  "#{ip_v6_address}/#{rand(1..127)}"
252
442
  end
253
443
 
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
-
444
+ ##
445
+ # Returns URL
446
+ #
447
+ # @return [String]
448
+ #
449
+ # @param host [String]
450
+ # @param path [String]
451
+ # @param scheme [String]
452
+ #
453
+ # @example
454
+ # Faker::Internet.url #=> "http://treutel.test/demarcus"
455
+ # Faker::Internet.url(host: 'faker') #=> "http://faker/shad"
456
+ # Faker::Internet.url(host: 'faker', path: '/docs') #=> "http://faker/docs"
457
+ # Faker::Internet.url(host: 'faker', path: '/docs', scheme: 'https') #=> "https://faker/docs"
458
+ def url(host: domain_name, path: "/#{username}", scheme: 'http')
263
459
  "#{scheme}://#{host}#{path}"
264
460
  end
265
461
 
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
-
462
+ ##
463
+ # Returns unique string in URL
464
+ #
465
+ # @return [String]
466
+ #
467
+ # @param words [String] Comma or period separated words list
468
+ # @param glue [String] Separator to add between words passed, default used are '-' or '_'
469
+ #
470
+ # @example
471
+ # Faker::Internet.slug #=> "repudiandae-sed"
472
+ # Faker::Internet.slug(words: 'test, faker') #=> "test-faker"
473
+ # Faker::Internet.slug(words: 'test. faker') #=> "test-faker"
474
+ # Faker::Internet.slug(words: 'test. faker', glue: '$') #=> "test$faker"
475
+ def slug(words: nil, glue: nil)
272
476
  glue ||= sample(%w[- _])
273
- (words || Faker::Lorem.words(number: 2).join(' ')).delete(',.').gsub(' ', glue).downcase
477
+ return words.delete(',.').gsub(' ', glue).downcase unless words.nil?
478
+
479
+ sample(translate('faker.internet.slug'), 2).join(glue)
274
480
  end
275
481
 
482
+ ##
483
+ # Generates random token
484
+ #
485
+ # @return[String]
486
+ #
487
+ # @example
488
+ # Faker::Internet.device_token #=> "749f535671cf6b34d8e794d212d00c703b96274e07161b18b082d0d70ef1052f"
276
489
  def device_token
277
490
  shuffle(rand(16**64).to_s(16).rjust(64, '0').chars.to_a).join
278
491
  end
279
492
 
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
-
493
+ ##
494
+ # Generates the random browser identifier
495
+ #
496
+ # @return [String]
497
+ #
498
+ # @param vendor [String] Name of vendor, supported vendors are aol, chrome, firefox, internet_explorer, netscape, opera, safari
499
+ #
500
+ # @example
501
+ # 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"
502
+ # 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"
503
+ # 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"
504
+ # 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"
505
+ def user_agent(vendor: nil)
285
506
  agent_hash = translate('faker.internet.user_agent')
286
507
  agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
287
508
  sample(agents)
288
509
  end
289
510
 
511
+ ##
512
+ # Generate Web Crawler's user agents
513
+ #
514
+ # @return [String]
515
+ #
516
+ # @param vendor [String] Name of vendor, supported vendors are googlebot, bingbot, duckduckbot, baiduspider, yandexbot
517
+ #
518
+ # @example
519
+ # Faker::Internet.bot_user_agent #=> "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
520
+ # 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"
521
+ # 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"
522
+ def bot_user_agent(vendor: nil)
523
+ agent_hash = translate('faker.internet.bot_user_agent')
524
+ agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
525
+ sample(agents)
526
+ end
527
+
528
+ ##
529
+ # Generated universally unique identifier
530
+ #
531
+ # @return [String]
532
+ #
533
+ # @example
534
+ # Faker::Internet.uuid #=> "8a6cdd40-6d78-4fdb-912b-190e3057197f"
290
535
  def uuid
291
536
  # borrowed from: https://github.com/ruby/ruby/blob/d48783bb0236db505fe1205d1d9822309de53a36/lib/securerandom.rb#L250
292
537
  ary = Faker::Config.random.bytes(16).unpack('NnnnnN')
@@ -324,7 +569,44 @@ module Faker
324
569
  s
325
570
  end
326
571
 
572
+ ##
573
+ # Produces a randomized hash of internet user details
574
+ # @example
575
+ # Faker::Internet.user #=> { username: 'alexie', email: 'trudie@grant.test' }
576
+ #
577
+ # @example
578
+ # Faker::Internet.user('username', 'email', 'password') #=> { username: 'alexie', email: 'gayle@kohler.test', password: 'DtEf9P8wS31iMyC' }
579
+ #
580
+ # @return [hash]
581
+ #
582
+ # @faker.version next
583
+ def user(*args)
584
+ user_hash = {}
585
+ args = %w[username email] if args.empty?
586
+ args.each { |arg| user_hash[:"#{arg}"] = send(arg) }
587
+ user_hash
588
+ end
589
+
327
590
  alias user_name username
591
+
592
+ private
593
+
594
+ def sanitize_email_local_part(local_part)
595
+ char_range = [
596
+ Array('0'..'9'),
597
+ Array('A'..'Z'),
598
+ Array('a'..'z'),
599
+ "!#$%&'*+-/=?^_`{|}~.".chars
600
+ ].flatten
601
+
602
+ local_part.chars.map do |char|
603
+ char_range.include?(char) ? char : '#'
604
+ end.join
605
+ end
606
+
607
+ def construct_email(local_part, domain_name)
608
+ [local_part, domain_name].join('@')
609
+ end
328
610
  end
329
611
  end
330
612
  end