faker 2.2.0 → 3.2.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 (482) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +1298 -24
  3. data/History.md +5 -5
  4. data/README.md +239 -104
  5. data/lib/faker/blockchain/aeternity.rb +70 -0
  6. data/lib/faker/blockchain/bitcoin.rb +28 -2
  7. data/lib/faker/blockchain/ethereum.rb +11 -1
  8. data/lib/faker/blockchain/tezos.rb +93 -9
  9. data/lib/faker/books/book.rb +36 -0
  10. data/lib/faker/books/culture_series.rb +49 -0
  11. data/lib/faker/books/dune.rb +73 -17
  12. data/lib/faker/books/lovecraft.rb +186 -57
  13. data/lib/faker/books/the_kingkiller_chronicle.rb +61 -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/default/address.rb +253 -33
  20. data/lib/faker/default/adjective.rb +35 -0
  21. data/lib/faker/default/alphanumeric.rb +27 -22
  22. data/lib/faker/default/ancient.rb +36 -0
  23. data/lib/faker/default/app.rb +46 -16
  24. data/lib/faker/default/appliance.rb +18 -0
  25. data/lib/faker/default/artist.rb +9 -0
  26. data/lib/faker/default/avatar.rb +32 -24
  27. data/lib/faker/default/bank.rb +118 -29
  28. data/lib/faker/default/barcode.rb +165 -0
  29. data/lib/faker/default/beer.rb +75 -3
  30. data/lib/faker/default/blood.rb +48 -0
  31. data/lib/faker/default/boolean.rb +13 -6
  32. data/lib/faker/default/bossa_nova.rb +18 -0
  33. data/lib/faker/default/business.rb +27 -0
  34. data/lib/faker/default/camera.rb +46 -0
  35. data/lib/faker/default/cannabis.rb +90 -0
  36. data/lib/faker/default/chile_rut.rb +62 -26
  37. data/lib/faker/default/chuck_norris.rb +13 -2
  38. data/lib/faker/default/code.rb +162 -58
  39. data/lib/faker/default/coffee.rb +45 -0
  40. data/lib/faker/default/coin.rb +18 -0
  41. data/lib/faker/default/color.rb +123 -5
  42. data/lib/faker/default/commerce.rb +105 -37
  43. data/lib/faker/default/company.rb +446 -34
  44. data/lib/faker/default/compass.rb +135 -0
  45. data/lib/faker/default/computer.rb +63 -0
  46. data/lib/faker/default/construction.rb +54 -0
  47. data/lib/faker/default/cosmere.rb +90 -0
  48. data/lib/faker/default/crypto.rb +44 -4
  49. data/lib/faker/default/crypto_coin.rb +48 -18
  50. data/lib/faker/default/currency.rb +27 -0
  51. data/lib/faker/default/date.rb +149 -52
  52. data/lib/faker/default/dc_comics.rb +45 -0
  53. data/lib/faker/default/demographic.rb +58 -6
  54. data/lib/faker/default/dessert.rb +27 -0
  55. data/lib/faker/default/device.rb +54 -0
  56. data/lib/faker/default/driving_licence.rb +85 -28
  57. data/lib/faker/default/drone.rb +332 -0
  58. data/lib/faker/default/educator.rb +73 -6
  59. data/lib/faker/default/electrical_components.rb +27 -0
  60. data/lib/faker/default/emotion.rb +33 -0
  61. data/lib/faker/default/esport.rb +45 -0
  62. data/lib/faker/default/file.rb +53 -38
  63. data/lib/faker/default/finance.rb +75 -8
  64. data/lib/faker/default/food.rb +93 -3
  65. data/lib/faker/default/funny_name.rb +45 -0
  66. data/lib/faker/default/gender.rb +31 -0
  67. data/lib/faker/default/greek_philosophers.rb +18 -0
  68. data/lib/faker/default/hacker.rb +59 -1
  69. data/lib/faker/default/hipster.rb +106 -81
  70. data/lib/faker/default/hobby.rb +22 -0
  71. data/lib/faker/default/house.rb +18 -0
  72. data/lib/faker/default/html.rb +230 -0
  73. data/lib/faker/default/id_number.rb +276 -18
  74. data/lib/faker/default/industry_segments.rb +36 -0
  75. data/lib/faker/default/internet.rb +442 -147
  76. data/lib/faker/default/internet_http.rb +48 -0
  77. data/lib/faker/default/invoice.rb +37 -29
  78. data/lib/faker/default/job.rb +36 -0
  79. data/lib/faker/default/json.rb +61 -30
  80. data/lib/faker/default/kpop.rb +54 -0
  81. data/lib/faker/default/lorem.rb +184 -121
  82. data/lib/faker/default/lorem_flickr.rb +69 -68
  83. data/lib/faker/default/markdown.rb +97 -15
  84. data/lib/faker/default/marketing.rb +9 -0
  85. data/lib/faker/default/measurement.rb +101 -50
  86. data/lib/faker/default/military.rb +71 -0
  87. data/lib/faker/default/mountain.rb +33 -0
  88. data/lib/faker/default/name.rb +99 -6
  89. data/lib/faker/default/nation.rb +45 -5
  90. data/lib/faker/default/nato_phonetic_alphabet.rb +9 -0
  91. data/lib/faker/default/nhs.rb +21 -7
  92. data/lib/faker/default/number.rb +160 -91
  93. data/lib/faker/default/omniauth.rb +199 -137
  94. data/lib/faker/default/phone_number.rb +89 -11
  95. data/lib/faker/default/placeholdit.rb +23 -25
  96. data/lib/faker/default/programming_language.rb +18 -0
  97. data/lib/faker/default/relationship.rb +47 -7
  98. data/lib/faker/default/religion.rb +6 -0
  99. data/lib/faker/default/restaurant.rb +54 -2
  100. data/lib/faker/default/science.rb +135 -0
  101. data/lib/faker/default/slack_emoji.rb +81 -0
  102. data/lib/faker/default/source.rb +46 -22
  103. data/lib/faker/default/south_africa.rb +90 -0
  104. data/lib/faker/default/space.rb +128 -1
  105. data/lib/faker/default/string.rb +18 -9
  106. data/lib/faker/default/stripe.rb +68 -27
  107. data/lib/faker/default/subscription.rb +45 -0
  108. data/lib/faker/default/superhero.rb +45 -0
  109. data/lib/faker/default/tea.rb +41 -0
  110. data/lib/faker/default/team.rb +45 -0
  111. data/lib/faker/default/time.rb +84 -68
  112. data/lib/faker/default/twitter.rb +57 -47
  113. data/lib/faker/default/types.rb +90 -41
  114. data/lib/faker/default/university.rb +45 -0
  115. data/lib/faker/default/vehicle.rb +223 -60
  116. data/lib/faker/default/verb.rb +45 -0
  117. data/lib/faker/default/vulnerability_identifier.rb +23 -0
  118. data/lib/faker/default/world_cup.rb +52 -16
  119. data/lib/faker/fantasy/tolkien.rb +67 -0
  120. data/lib/faker/games/clash_of_clans.rb +48 -0
  121. data/lib/faker/games/control.rb +113 -0
  122. data/lib/faker/games/dnd.rb +178 -0
  123. data/lib/faker/games/dota.rb +61 -6
  124. data/lib/faker/games/elder_scrolls.rb +98 -0
  125. data/lib/faker/games/fallout.rb +37 -0
  126. data/lib/faker/games/final_fantasy_xiv.rb +73 -0
  127. data/lib/faker/games/game.rb +27 -0
  128. data/lib/faker/games/half_life.rb +27 -0
  129. data/lib/faker/games/heroes.rb +40 -0
  130. data/lib/faker/games/heroes_of_the_storm.rb +48 -1
  131. data/lib/faker/games/league_of_legends.rb +54 -0
  132. data/lib/faker/games/minecraft.rb +113 -0
  133. data/lib/faker/games/myst.rb +45 -0
  134. data/lib/faker/games/overwatch.rb +27 -0
  135. data/lib/faker/games/pokemon.rb +27 -0
  136. data/lib/faker/games/sonic_the_hedgehog.rb +27 -0
  137. data/lib/faker/games/street_fighter.rb +61 -0
  138. data/lib/faker/games/super_mario.rb +48 -0
  139. data/lib/faker/games/super_smash_bros.rb +18 -0
  140. data/lib/faker/games/tarkov.rb +205 -0
  141. data/lib/faker/games/touhou.rb +75 -0
  142. data/lib/faker/games/warhammer_fantasy.rb +74 -0
  143. data/lib/faker/games/witcher.rb +93 -0
  144. data/lib/faker/games/world_of_warcraft.rb +44 -1
  145. data/lib/faker/games/zelda.rb +37 -1
  146. data/lib/faker/japanese_media/conan.rb +48 -0
  147. data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
  148. data/lib/faker/japanese_media/doraemon.rb +48 -0
  149. data/lib/faker/japanese_media/dragon_ball.rb +35 -0
  150. data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +48 -0
  151. data/lib/faker/japanese_media/kamen_rider.rb +102 -0
  152. data/lib/faker/japanese_media/naruto.rb +61 -0
  153. data/lib/faker/japanese_media/one_piece.rb +55 -1
  154. data/lib/faker/japanese_media/studio_ghibli.rb +48 -0
  155. data/lib/faker/japanese_media/sword_art_online.rb +36 -0
  156. data/lib/faker/locations/australia.rb +47 -0
  157. data/lib/faker/movies/avatar.rb +49 -0
  158. data/lib/faker/movies/back_to_the_future.rb +28 -0
  159. data/lib/faker/movies/departed.rb +49 -0
  160. data/lib/faker/movies/ghostbusters.rb +28 -0
  161. data/lib/faker/movies/hackers.rb +48 -0
  162. data/lib/faker/movies/harry_potter.rb +54 -0
  163. data/lib/faker/movies/hitchhikers_guide_to_the_galaxy.rb +69 -0
  164. data/lib/faker/movies/hobbit.rb +41 -4
  165. data/lib/faker/movies/how_to_train_your_dragon.rb +48 -0
  166. data/lib/faker/movies/lebowski.rb +27 -0
  167. data/lib/faker/movies/lord_of_the_rings.rb +31 -3
  168. data/lib/faker/movies/movie.rb +22 -0
  169. data/lib/faker/movies/princess_bride.rb +19 -0
  170. data/lib/faker/movies/room.rb +63 -0
  171. data/lib/faker/movies/star_wars.rb +170 -11
  172. data/lib/faker/movies/tron.rb +161 -0
  173. data/lib/faker/movies/v_for_vendetta.rb +29 -0
  174. data/lib/faker/music/grateful_dead.rb +18 -0
  175. data/lib/faker/music/hiphop.rb +48 -0
  176. data/lib/faker/music/music.rb +102 -4
  177. data/lib/faker/music/opera.rb +273 -1
  178. data/lib/faker/music/pearl_jam.rb +50 -0
  179. data/lib/faker/music/phish.rb +36 -1
  180. data/lib/faker/music/prince.rb +64 -0
  181. data/lib/faker/music/rock_band.rb +21 -0
  182. data/lib/faker/music/rush.rb +37 -0
  183. data/lib/faker/music/show.rb +49 -0
  184. data/lib/faker/music/smashing_pumpkins.rb +64 -0
  185. data/lib/faker/music/umphreys_mcgee.rb +9 -0
  186. data/lib/faker/quotes/chiquito.rb +80 -0
  187. data/lib/faker/quotes/quote.rb +93 -1
  188. data/lib/faker/quotes/rajnikanth.rb +27 -0
  189. data/lib/faker/quotes/shakespeare.rb +70 -0
  190. data/lib/faker/religion/bible.rb +50 -0
  191. data/lib/faker/sports/basketball.rb +36 -0
  192. data/lib/faker/sports/chess.rb +90 -0
  193. data/lib/faker/sports/football.rb +45 -0
  194. data/lib/faker/sports/mountaineering.rb +22 -0
  195. data/lib/faker/sports/sport.rb +116 -0
  196. data/lib/faker/sports/volleyball.rb +74 -0
  197. data/lib/faker/travel/airport.rb +43 -0
  198. data/lib/faker/travel/train_station.rb +54 -0
  199. data/lib/faker/tv_shows/aqua_teen_hunger_force.rb +22 -0
  200. data/lib/faker/tv_shows/archer.rb +51 -0
  201. data/lib/faker/tv_shows/big_bang_theory.rb +37 -0
  202. data/lib/faker/tv_shows/bojack_horseman.rb +28 -0
  203. data/lib/faker/tv_shows/breaking_bad.rb +18 -0
  204. data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
  205. data/lib/faker/tv_shows/buffy.rb +60 -2
  206. data/lib/faker/tv_shows/community.rb +19 -0
  207. data/lib/faker/tv_shows/dr_who.rb +78 -2
  208. data/lib/faker/tv_shows/dumb_and_dumber.rb +28 -0
  209. data/lib/faker/tv_shows/family_guy.rb +28 -0
  210. data/lib/faker/tv_shows/final_space.rb +51 -0
  211. data/lib/faker/tv_shows/friends.rb +27 -0
  212. data/lib/faker/tv_shows/futurama.rb +65 -0
  213. data/lib/faker/tv_shows/game_of_thrones.rb +46 -0
  214. data/lib/faker/tv_shows/hey_arnold.rb +27 -0
  215. data/lib/faker/tv_shows/how_i_met_your_mother.rb +37 -0
  216. data/lib/faker/tv_shows/michael_scott.rb +10 -0
  217. data/lib/faker/tv_shows/new_girl.rb +19 -0
  218. data/lib/faker/tv_shows/parks_and_rec.rb +18 -0
  219. data/lib/faker/tv_shows/rick_and_morty.rb +28 -0
  220. data/lib/faker/tv_shows/ru_paul.rb +18 -0
  221. data/lib/faker/tv_shows/seinfeld.rb +28 -0
  222. data/lib/faker/tv_shows/silicon_valley.rb +75 -0
  223. data/lib/faker/tv_shows/simpsons.rb +42 -0
  224. data/lib/faker/tv_shows/south_park.rb +34 -0
  225. data/lib/faker/tv_shows/spongebob.rb +50 -0
  226. data/lib/faker/tv_shows/star_trek.rb +36 -0
  227. data/lib/faker/tv_shows/stargate.rb +28 -0
  228. data/lib/faker/tv_shows/stranger_things.rb +19 -0
  229. data/lib/faker/tv_shows/suits.rb +37 -0
  230. data/lib/faker/tv_shows/supernatural.rb +48 -0
  231. data/lib/faker/tv_shows/the_expanse.rb +36 -0
  232. data/lib/faker/tv_shows/the_fresh_prince_of_bel_air.rb +43 -2
  233. data/lib/faker/tv_shows/the_it_crowd.rb +37 -0
  234. data/lib/faker/tv_shows/the_office.rb +37 -0
  235. data/lib/faker/tv_shows/the_thick_of_it.rb +28 -0
  236. data/lib/faker/tv_shows/twin_peaks.rb +28 -0
  237. data/lib/faker/tv_shows/venture_bros.rb +38 -0
  238. data/lib/faker/version.rb +2 -2
  239. data/lib/faker.rb +58 -58
  240. data/lib/helpers/base58.rb +1 -1
  241. data/lib/helpers/char.rb +22 -27
  242. data/lib/helpers/positional_generator.rb +480 -0
  243. data/lib/helpers/unique_generator.rb +17 -13
  244. data/lib/locales/README.md +18 -2
  245. data/lib/locales/ar.yml +6 -1
  246. data/lib/locales/bg.yml +3 -3
  247. data/lib/locales/ca.yml +0 -8
  248. data/lib/locales/da-DK.yml +6 -4
  249. data/lib/locales/de-AT.yml +7 -6
  250. data/lib/locales/de-CH.yml +6028 -9
  251. data/lib/locales/de.yml +12 -6
  252. data/lib/locales/en/address.yml +8 -3
  253. data/lib/locales/en/adjective.yml +179 -0
  254. data/lib/locales/en/airport.yml +381 -0
  255. data/lib/locales/en/animal.yml +1 -1
  256. data/lib/locales/en/aqua_teen_hunger_force.yml +33 -1
  257. data/lib/locales/en/archer.yml +75 -0
  258. data/lib/locales/en/australia.yml +107 -0
  259. data/lib/locales/en/avatar.yml +31 -0
  260. data/lib/locales/en/bank.yml +1 -1
  261. data/lib/locales/en/barcode.yml +24 -0
  262. data/lib/locales/en/bible.yml +90 -0
  263. data/lib/locales/en/big_bang_theory.yml +38 -0
  264. data/lib/locales/en/bird.yml +1281 -0
  265. data/lib/locales/en/blood.yml +13 -0
  266. data/lib/locales/en/book.yml +487 -3
  267. data/lib/locales/en/brooklyn_nine_nine.yml +35 -0
  268. data/lib/locales/en/buffy.yml +1 -1
  269. data/lib/locales/en/camera.yml +611 -0
  270. data/lib/locales/en/cat.yml +1 -1
  271. data/lib/locales/en/chess.yml +103 -0
  272. data/lib/locales/en/chiquito.yml +64 -0
  273. data/lib/locales/en/clash_of_clan.yml +101 -0
  274. data/lib/locales/en/coffee.yml +1 -1
  275. data/lib/locales/en/color.yml +1 -1
  276. data/lib/locales/en/commerce.yml +17 -0
  277. data/lib/locales/en/community.yml +17 -17
  278. data/lib/locales/en/company.yml +3 -2
  279. data/lib/locales/en/computer.yml +55 -0
  280. data/lib/locales/en/conan.yml +171 -0
  281. data/lib/locales/en/control.yml +247 -0
  282. data/lib/locales/en/cowboy_bebop.yml +163 -0
  283. data/lib/locales/en/demographic.yml +218 -5
  284. data/lib/locales/en/departed.yml +50 -0
  285. data/lib/locales/en/device.yml +112 -4
  286. data/lib/locales/en/dnd.yml +636 -0
  287. data/lib/locales/en/doraemon.yml +286 -0
  288. data/lib/locales/en/dota.yml +651 -63
  289. data/lib/locales/en/dr_who.yml +1 -1
  290. data/lib/locales/en/dragon_ball.yml +243 -1
  291. data/lib/locales/en/driving_license.yml +181 -0
  292. data/lib/locales/en/drone.yml +95 -0
  293. data/lib/locales/en/dune.yml +270 -131
  294. data/lib/locales/en/educator.yml +75 -6
  295. data/lib/locales/en/elder_scrolls.yml +583 -9
  296. data/lib/locales/en/emotion.yml +480 -0
  297. data/lib/locales/en/fallout.yml +311 -133
  298. data/lib/locales/en/file.yml +9 -1
  299. data/lib/locales/en/final_fantasy_xiv.yml +754 -0
  300. data/lib/locales/en/final_space.yml +37 -0
  301. data/lib/locales/en/finance.yml +77 -1
  302. data/lib/locales/en/fma_brotherhood.yml +78 -0
  303. data/lib/locales/en/food.yml +1066 -10
  304. data/lib/locales/en/football.yml +3 -3
  305. data/lib/locales/en/fresh_prince_of_bel_air.yml +1 -1
  306. data/lib/locales/en/futurama.yml +344 -0
  307. data/lib/locales/en/game.yml +11 -0
  308. data/lib/locales/en/gender.yml +1 -0
  309. data/lib/locales/en/hackers.yml +53 -0
  310. data/lib/locales/en/half_life.yml +84 -3
  311. data/lib/locales/en/heroes.yml +408 -3
  312. data/lib/locales/en/heroes_of_the_storm.yml +131 -4
  313. data/lib/locales/en/hobby.yml +171 -0
  314. data/lib/locales/en/horse.yml +2 -2
  315. data/lib/locales/en/house.yml +1 -1
  316. data/lib/locales/en/how_to_train_your_dragon.yml +174 -0
  317. data/lib/locales/en/internet.yml +140 -3
  318. data/lib/locales/en/jack_handey.yml +54 -0
  319. data/lib/locales/en/kamen_rider.yml +452 -0
  320. data/lib/locales/en/kpop.yml +7 -7
  321. data/lib/locales/en/league_of_legends.yml +285 -6
  322. data/lib/locales/en/lebowski.yml +1 -1
  323. data/lib/locales/en/lovecraft.yml +76 -6
  324. data/lib/locales/en/military.yml +179 -5
  325. data/lib/locales/en/minecraft.yml +663 -0
  326. data/lib/locales/en/mitch_hedberg.yml +46 -0
  327. data/lib/locales/en/mountain.yml +171 -0
  328. data/lib/locales/en/mountaineering.yml +14 -0
  329. data/lib/locales/en/movie.yml +194 -2
  330. data/lib/locales/en/music.yml +461 -29
  331. data/lib/locales/en/myst.yml +87 -31
  332. data/lib/locales/en/name.yml +6 -5
  333. data/lib/locales/en/naruto.yml +230 -0
  334. data/lib/locales/en/one_piece.yml +2 -2
  335. data/lib/locales/en/opera.yml +169 -1
  336. data/lib/locales/en/overwatch.yml +2648 -37
  337. data/lib/locales/en/pearl_jam.yml +213 -0
  338. data/lib/locales/en/phish.yml +392 -1
  339. data/lib/locales/en/phone_number.yml +1 -1
  340. data/lib/locales/en/pokemon.yml +417 -4
  341. data/lib/locales/en/prince.yml +227 -0
  342. data/lib/locales/en/quote.yml +692 -163
  343. data/lib/locales/en/rajnikanth.yml +77 -0
  344. data/lib/locales/en/rock_band.yml +1 -0
  345. data/lib/locales/en/room.yml +68 -0
  346. data/lib/locales/en/rush.yml +32 -0
  347. data/lib/locales/en/science.yml +481 -3
  348. data/lib/locales/en/shakespeare.yml +23 -26
  349. data/lib/locales/en/show.yml +597 -0
  350. data/lib/locales/en/simpsons.yml +668 -0
  351. data/lib/locales/en/smashing_pumpkins.yml +382 -0
  352. data/lib/locales/en/source.yml +35 -0
  353. data/lib/locales/en/south_park.yml +360 -2
  354. data/lib/locales/en/space.yml +1 -1
  355. data/lib/locales/en/spongebob.yml +489 -0
  356. data/lib/locales/en/sport.yml +130 -0
  357. data/lib/locales/en/star_trek.yml +1 -1
  358. data/lib/locales/en/star_wars.yml +568 -220
  359. data/lib/locales/en/stranger_thing.yml +1 -1
  360. data/lib/locales/en/street_fighter.yml +1524 -0
  361. data/lib/locales/en/stripe.yml +3 -3
  362. data/lib/locales/en/studio_ghibli.yml +107 -0
  363. data/lib/locales/en/suits.yml +45 -0
  364. data/lib/locales/en/super_mario.yml +58 -0
  365. data/lib/locales/en/super_smash_bros.yml +23 -5
  366. data/lib/locales/en/supernatural.yml +141 -0
  367. data/lib/locales/en/tarkov.yml +593 -0
  368. data/lib/locales/en/tea.yml +172 -0
  369. data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
  370. data/lib/locales/en/the_office.yml +86 -0
  371. data/lib/locales/en/tolkien.yml +2453 -0
  372. data/lib/locales/en/touhou.yml +839 -0
  373. data/lib/locales/en/train_station.yml +280 -0
  374. data/lib/locales/en/tron.yml +227 -0
  375. data/lib/locales/en/vehicle.yml +2809 -75
  376. data/lib/locales/en/volleyball.yml +501 -0
  377. data/lib/locales/en/warhammer_fantasy.yml +582 -0
  378. data/lib/locales/en/witcher.yml +426 -7
  379. data/lib/locales/en/world_of_warcraft.yml +122 -4
  380. data/lib/locales/en/zelda.yml +962 -4
  381. data/lib/locales/en-AU.yml +50 -10
  382. data/lib/locales/en-CA.yml +5 -1
  383. data/lib/locales/en-GB.yml +3 -2
  384. data/lib/locales/en-IND.yml +2 -1
  385. data/lib/locales/en-MS.yml +3 -1
  386. data/lib/locales/en-NEP.yml +5 -2
  387. data/lib/locales/en-NG.yml +1 -0
  388. data/lib/locales/en-NZ.yml +135 -8
  389. data/lib/locales/en-PAK.yml +3 -1
  390. data/lib/locales/en-SG.yml +3 -1
  391. data/lib/locales/en-TH.yml +360 -0
  392. data/lib/locales/en-UG.yml +1 -0
  393. data/lib/locales/en-US.yml +38 -12
  394. data/lib/locales/en-ZA.yml +2 -2
  395. data/lib/locales/en-au-ocker.yml +4 -1
  396. data/lib/locales/en.yml +0 -3
  397. data/lib/locales/es-AR.yml +4601 -0
  398. data/lib/locales/es-MX.yml +4 -1
  399. data/lib/locales/es.yml +58 -2
  400. data/lib/locales/fa.yml +2 -0
  401. data/lib/locales/fi-FI.yml +4 -2
  402. data/lib/locales/fr/address.yml +20 -0
  403. data/lib/locales/fr/adjective.yml +266 -0
  404. data/lib/locales/fr/ancient.yml +141 -0
  405. data/lib/locales/fr/animal.yml +5 -0
  406. data/lib/locales/fr/appliance.yml +4 -0
  407. data/lib/locales/fr/book.yml +7 -0
  408. data/lib/locales/fr/color.yml +4 -0
  409. data/lib/locales/fr/company.yml +17 -0
  410. data/lib/locales/fr/compass.yml +23 -0
  411. data/lib/locales/fr/demographic.yml +4 -0
  412. data/lib/locales/fr/gender.yml +6 -0
  413. data/lib/locales/fr/internet.yml +5 -0
  414. data/lib/locales/fr/lorem.yml +5 -0
  415. data/lib/locales/fr/measurement.yml +7 -0
  416. data/lib/locales/fr/name.yml +22 -0
  417. data/lib/locales/fr/phone_number.yml +7 -0
  418. data/lib/locales/fr/pokemon.yml +7 -0
  419. data/lib/locales/fr-CA.yml +28 -11
  420. data/lib/locales/fr-CH.yml +3 -3
  421. data/lib/locales/fr.yml +1 -112
  422. data/lib/locales/hy.yml +3 -7
  423. data/lib/locales/id.yml +5 -2
  424. data/lib/locales/it.yml +3 -1
  425. data/lib/locales/ja/README.md +13 -0
  426. data/lib/locales/ja/address.yml +120539 -0
  427. data/lib/locales/ja/adjective.yml +148 -0
  428. data/lib/locales/ja/ancient.yml +4 -0
  429. data/lib/locales/ja/animal.yml +5 -0
  430. data/lib/locales/ja/bank.yml +4 -0
  431. data/lib/locales/ja/book.yml +7 -0
  432. data/lib/locales/ja/cat.yml +5 -0
  433. data/lib/locales/ja/coffee.yml +4 -0
  434. data/lib/locales/ja/color.yml +4 -0
  435. data/lib/locales/ja/commerce.yml +11 -0
  436. data/lib/locales/ja/company.yml +8 -0
  437. data/lib/locales/ja/dog.yml +6 -0
  438. data/lib/locales/ja/emotion.yml +51 -0
  439. data/lib/locales/ja/food.yml +4 -0
  440. data/lib/locales/ja/gender.yml +4 -0
  441. data/lib/locales/ja/lorem.yml +9 -0
  442. data/lib/locales/ja/name.yml +13 -0
  443. data/lib/locales/ja/naruto.yml +230 -0
  444. data/lib/locales/ja/overwatch.yml +5 -0
  445. data/lib/locales/ja/phone_number.yml +7 -0
  446. data/lib/locales/ja/pokemon.yml +7 -0
  447. data/lib/locales/ja/relationship.yml +10 -0
  448. data/lib/locales/ja/restaurant.yml +11 -0
  449. data/lib/locales/ja/space.yml +5 -0
  450. data/lib/locales/ja/sport.yml +130 -0
  451. data/lib/locales/ja/studio_ghibli.yml +112 -0
  452. data/lib/locales/ja/subscription.yml +8 -0
  453. data/lib/locales/ja/super_mario.yml +9 -0
  454. data/lib/locales/ja/super_smash_bros.yml +8 -0
  455. data/lib/locales/ja/touhou.yml +466 -0
  456. data/lib/locales/ja/university.yml +9 -0
  457. data/lib/locales/ja/zelda.yml +5 -0
  458. data/lib/locales/ko.yml +95 -2
  459. data/lib/locales/lt.yml +34 -0
  460. data/lib/locales/lv.yml +1 -1
  461. data/lib/locales/mi-NZ.yml +283 -0
  462. data/lib/locales/nb-NO.yml +5 -2
  463. data/lib/locales/nl.yml +1 -0
  464. data/lib/locales/pl.yml +2 -2
  465. data/lib/locales/pt-BR.yml +33 -4
  466. data/lib/locales/pt.yml +6 -4
  467. data/lib/locales/ru.yml +43 -1
  468. data/lib/locales/sk.yml +5 -2
  469. data/lib/locales/sv.yml +1 -0
  470. data/lib/locales/th.yml +380 -0
  471. data/lib/locales/tr.yml +1 -0
  472. data/lib/locales/uk.yml +10 -5
  473. data/lib/locales/vi.yml +1 -0
  474. data/lib/locales/zh-CN/bank.yml +17 -0
  475. data/lib/locales/zh-CN.yml +2 -1
  476. data/lib/locales/zh-TW.yml +2 -1
  477. metadata +201 -109
  478. data/lib/faker/default/fillmurray.rb +0 -30
  479. data/lib/faker/default/lorem_pixel.rb +0 -63
  480. data/lib/locales/en/hobbit.yml +0 -19
  481. data/lib/locales/en/lord_of_the_rings.yml +0 -6
  482. data/lib/locales/ja.yml +0 -98
@@ -2,56 +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)
7
- if legacy_name != NOT_GIVEN
8
- warn_with_uplevel 'Passing `name` with the 1st argument of `Internet.email` is deprecated. Use keyword argument like `Internet.email(name: ...)` instead.', uplevel: 1
9
- name = legacy_name
10
- end
11
- if legacy_separators != NOT_GIVEN
12
- warn_with_uplevel 'Passing `separators` with the 2nd argument of `Internet.email` is deprecated. Use keyword argument like `Internet.email(separators: ...)` instead.', uplevel: 1
13
- separators = legacy_separators
14
- end
18
+ extend Gem::Deprecate
15
19
 
16
- if separators
17
- [username(specifier: name, separators: separators), domain_name].join('@')
18
- else
19
- [username(specifier: name), domain_name].join('@')
20
- 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)
21
51
  end
22
52
 
23
- def free_email(legacy_name = NOT_GIVEN, name: nil)
24
- if legacy_name != NOT_GIVEN
25
- warn_with_uplevel 'Passing `name` with the 1st argument of `Internet.free_email` is deprecated. Use keyword argument like `Internet.free_email(name: ...)` instead.', uplevel: 1
26
- name = legacy_name
27
- end
28
-
29
- [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
+ )
30
68
  end
69
+ deprecate :free_email, :email, 2023, 10
31
70
 
32
- def safe_email(legacy_name = NOT_GIVEN, name: nil)
33
- if legacy_name != NOT_GIVEN
34
- warn_with_uplevel 'Passing `name` with the 1st argument of `Internet.safe_email` is deprecated. Use keyword argument like `Internet.safe_email(name: ...)` instead.', uplevel: 1
35
- name = legacy_name
36
- end
37
-
38
- [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
+ )
39
86
  end
87
+ deprecate :safe_email, :email, 2023, 10
40
88
 
41
- def username(legacy_specifier = NOT_GIVEN, legacy_separators = NOT_GIVEN, specifier: nil, separators: %w[. _])
42
- if legacy_specifier != NOT_GIVEN
43
- warn_with_uplevel 'Passing `specifier` with the 1st argument of `Internet.username` is deprecated. Use keyword argument like `Internet.username(specifier: ...)` instead.', uplevel: 1
44
- specifier = legacy_specifier
45
- end
46
- if legacy_separators != NOT_GIVEN
47
- warn_with_uplevel 'Passing `separators` with the 2nd argument of `Internet.username` is deprecated. Use keyword argument like `Internet.username(separators: ...)` instead.', uplevel: 1
48
- separators = legacy_separators
49
- end
50
-
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[. _])
51
103
  with_locale(:en) do
52
104
  return shuffle(specifier.scan(/[[:word:]]+/)).join(sample(separators)).downcase if specifier.respond_to?(:scan)
53
105
 
54
- if specifier.is_a?(Integer)
106
+ case specifier
107
+ when Integer
55
108
  # If specifier is Integer and has large value, Argument error exception is raised to overcome memory full error
56
109
  raise ArgumentError, 'Given argument is too large' if specifier > 10**6
57
110
 
@@ -63,7 +116,7 @@ module Faker
63
116
  break unless result.length < specifier && tries < 7
64
117
  end
65
118
  return result * (specifier / result.length + 1) if specifier.positive?
66
- elsif specifier.is_a?(Range)
119
+ when Range
67
120
  tries = 0
68
121
  result = nil
69
122
  loop do
@@ -84,125 +137,205 @@ module Faker
84
137
  end
85
138
 
86
139
  ##
87
- # Produces a randomized string of characters
140
+ # Produces a randomized string of characters suitable for passwords
88
141
  #
89
- # @param [Integer] min_length
90
- # @param [Integer] max_length
91
- # @param [Boolean] mix_case
92
- # @param [Boolean] special_characters
142
+ # @param min_length [Integer] The minimum length of the password
143
+ # @param max_length [Integer] The maximum length of the password
144
+ # @param mix_case [Boolean] Toggles if uppercased letters are allowed. If true, at least one will be added.
145
+ # @param special_characters [Boolean] Toggles if special characters are allowed. If true, at least one will be added.
93
146
  #
94
147
  # @return [String]
95
148
  #
96
- # @example Faker::Internet.password #=> "Vg5mSvY1UeRg7"
97
- # @example Faker::Internet.password(min_length: 8) #=> "YfGjIk0hGzDqS0"
98
- # @example Faker::Internet.password(min_length: 10, max_length: 20) #=> "EoC9ShWd1hWq4vBgFw"
99
- # @example Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true) #=> "3k5qS15aNmG"
100
- # @example Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true, special_characters: true) #=> "*%NkOnJsH4"
149
+ # @example
150
+ # Faker::Internet.password #=> "Vg5mSvY1UeRg7"
151
+ # @example
152
+ # Faker::Internet.password(min_length: 8) #=> "YfGjIk0hGzDqS0"
153
+ # @example
154
+ # Faker::Internet.password(min_length: 10, max_length: 20) #=> "EoC9ShWd1hWq4vBgFw"
155
+ # @example
156
+ # Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true) #=> "3k5qS15aNmG"
157
+ # @example
158
+ # Faker::Internet.password(min_length: 10, max_length: 20, mix_case: true, special_characters: true) #=> "*%NkOnJsH4"
101
159
  #
102
160
  # @faker.version 2.1.3
103
- # rubocop:disable Metrics/ParameterLists
104
- 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)
105
- if legacy_min_length != NOT_GIVEN
106
- warn_with_uplevel 'Passing `min_length` with the 1st argument of `Internet.password` is deprecated. Use keyword argument like `Internet.password(min_length: ...)` instead.', uplevel: 1
107
- min_length = legacy_min_length
108
- end
109
- if legacy_max_length != NOT_GIVEN
110
- warn_with_uplevel 'Passing `max_length` with the 2nd argument of `Internet.password` is deprecated. Use keyword argument like `Internet.password(max_length: ...)` instead.', uplevel: 1
111
- max_length = legacy_max_length
112
- end
113
- if legacy_mix_case != NOT_GIVEN
114
- warn_with_uplevel 'Passing `mix_case` with the 3rd argument of `Internet.password` is deprecated. Use keyword argument like `Internet.password(mix_case: ...)` instead.', uplevel: 1
115
- mix_case = legacy_mix_case
161
+ def password(min_length: 8, max_length: 16, mix_case: true, special_characters: false)
162
+ raise ArgumentError, 'min_length and max_length must be greater than or equal to one' if min_length < 1 || max_length < 1
163
+ raise ArgumentError, 'min_length must be smaller than or equal to max_length' unless min_length <= max_length
164
+
165
+ character_types = []
166
+ required_min_length = 0
167
+
168
+ if mix_case
169
+ character_types << :mix_case
170
+ required_min_length += 2
116
171
  end
117
- if legacy_special_characters != NOT_GIVEN
118
- warn_with_uplevel 'Passing `special_characters` with the 4th argument of `Internet.password` is deprecated. Use keyword argument like `Internet.password(special_characters: ...)` instead.', uplevel: 1
119
- special_characters = legacy_special_characters
172
+
173
+ if special_characters
174
+ character_types << :special_characters
175
+ required_min_length += 1
120
176
  end
121
177
 
122
- min_alpha = mix_case ? 2 : 0
123
- temp = Lorem.characters(number: min_length, min_alpha: min_alpha)
124
- diff_length = max_length - min_length
178
+ raise ArgumentError, "min_length should be at least #{required_min_length} to enable #{character_types.join(', ')} configuration" if min_length < required_min_length
125
179
 
126
- if diff_length.positive?
127
- diff_rand = rand(diff_length + 1)
128
- temp += Lorem.characters(number: diff_rand)
129
- end
180
+ target_length = rand(min_length..max_length)
181
+
182
+ password = []
183
+ character_bag = []
184
+
185
+ # use lower_chars by default and add upper_chars if mix_case
186
+ lower_chars = self::LLetters
187
+ password << sample(lower_chars)
188
+ character_bag += lower_chars
189
+
190
+ digits = ('0'..'9').to_a
191
+ password << sample(digits)
192
+ character_bag += digits
130
193
 
131
194
  if mix_case
132
- alpha_count = 0
133
- temp.chars.each_with_index do |char, index|
134
- if char =~ /[[:alpha:]]/
135
- temp[index] = char.upcase if alpha_count.even?
136
- alpha_count += 1
137
- end
138
- end
195
+ upper_chars = self::ULetters
196
+ password << sample(upper_chars)
197
+ character_bag += upper_chars
139
198
  end
140
199
 
141
200
  if special_characters
142
- chars = %w[! @ # $ % ^ & *]
143
- rand(1..min_length).times do |i|
144
- temp[i] = chars[rand(chars.length)]
145
- end
201
+ special_chars = %w[! @ # $ % ^ & *]
202
+ password << sample(special_chars)
203
+ character_bag += special_chars
146
204
  end
147
205
 
148
- temp
149
- end
206
+ password << sample(character_bag) while password.length < target_length
150
207
 
151
- def domain_name(legacy_subdomain = NOT_GIVEN, subdomain: false)
152
- if legacy_subdomain != NOT_GIVEN
153
- warn_with_uplevel 'Passing `subdomain` with the 1st argument of `Internet.domain_name` is deprecated. Use keyword argument like `Internet.domain_name(subdomain: ...)` instead.', uplevel: 1
154
- subdomain = legacy_subdomain
155
- end
208
+ shuffle(password).join
209
+ end
156
210
 
211
+ ##
212
+ # Returns the domain name
213
+ #
214
+ # @return [String]
215
+ #
216
+ # @param subdomain [Bool] If true passed adds a subdomain in response
217
+ # @param domain [String]
218
+ #
219
+ # @example
220
+ # Faker::Internet.domain_name #=> "altenwerth-gerhold.example"
221
+ # Faker::Internet.domain_name(subdomain: true) #=> "metz.mclaughlin-brekke.test"
222
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker') #=> "foo.faker.test"
223
+ # Faker::Internet.domain_name(domain: 'faker-ruby.org') #=> "faker-ruby.org"
224
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker-ruby.org') #=> "foo.faker-ruby.org"
225
+ # Faker::Internet.domain_name(subdomain: true, domain: 'faker.faker-ruby.org') #=> "faker.faker-ruby.org"
226
+ def domain_name(subdomain: false, domain: nil)
157
227
  with_locale(:en) do
158
- domain_elements = [Char.prepare(domain_word), domain_suffix]
159
- domain_elements.unshift(Char.prepare(domain_word)) if subdomain
160
- domain_elements.join('.')
228
+ if domain
229
+ domain
230
+ .split('.')
231
+ .map { |domain_part| Char.prepare(domain_part) }
232
+ .tap do |domain_elements|
233
+ if domain_elements.length < 2
234
+ domain_elements << domain_suffix(safe: true)
235
+ end
236
+ if subdomain && domain_elements.length < 3
237
+ domain_elements.unshift(Char.prepare(domain_word))
238
+ end
239
+ end.join('.')
240
+ else
241
+ [domain_word, domain_suffix(safe: true)].tap do |domain_elements|
242
+ if subdomain
243
+ domain_elements.unshift(Char.prepare(domain_word))
244
+ end
245
+ end.join('.')
246
+ end
161
247
  end
162
248
  end
163
249
 
164
- def fix_umlauts(legacy_string = NOT_GIVEN, string: '')
165
- if legacy_string != NOT_GIVEN
166
- warn_with_uplevel 'Passing `string` with the 1st argument of `Internet.fix_umlauts` is deprecated. Use keyword argument like `Internet.fix_umlauts(string: ...)` instead.', uplevel: 1
167
- string = legacy_string
168
- end
169
-
250
+ ##
251
+ # Fixes ä, ö, ü, ß characters in string passed with ae, oe, ue, ss resp.
252
+ #
253
+ # @return [String]
254
+ #
255
+ # @param string [String]
256
+ #
257
+ # @example
258
+ # Faker::Internet.fix_umlauts #=> ""
259
+ # Faker::Internet.fix_umlauts(string: 'faker') #=> "faker"
260
+ # Faker::Internet.fix_umlauts(string: 'faküer') #=> "fakueer"
261
+ def fix_umlauts(string: '')
170
262
  Char.fix_umlauts(string)
171
263
  end
172
264
 
265
+ ##
266
+ # Returns the domain word for internet
267
+ #
268
+ # @return [String]
269
+ #
270
+ # @example
271
+ # Faker::Internet.domain_word #=> "senger"
173
272
  def domain_word
174
- with_locale(:en) { Char.prepare(Company.name.split(' ').first) }
175
- end
176
-
177
- def domain_suffix
178
- fetch('internet.domain_suffix')
273
+ with_locale(:en) { Char.prepare(Company.name.split.first) }
179
274
  end
180
275
 
181
- def mac_address(legacy_prefix = NOT_GIVEN, prefix: '')
182
- if legacy_prefix != NOT_GIVEN
183
- warn_with_uplevel 'Passing `prefix` with the 1st argument of `Internet.mac_address` is deprecated. Use keyword argument like `Internet.mac_address(prefix: ...)` instead.', uplevel: 1
184
- prefix = legacy_prefix
276
+ ## Returns the domain suffix e.g. com, org, co, biz, info etc.
277
+ #
278
+ # @return [String]
279
+ #
280
+ # @example
281
+ # Faker::Internet.domain_suffix #=> "com"
282
+ # Faker::Internet.domain_suffix #=> "biz"
283
+ # Faker::Internet.domain_suffix(safe: true) #=> "example"
284
+ # Faker::Internet.domain_suffix(safe: true) #=> "test"
285
+ def domain_suffix(safe: nil)
286
+ if safe
287
+ fetch('internet.safe_domain_suffix')
288
+ else
289
+ fetch('internet.domain_suffix')
185
290
  end
291
+ end
186
292
 
293
+ ##
294
+ # Returns the MAC address
295
+ #
296
+ # @return [String]
297
+ #
298
+ # @example
299
+ # Faker::Internet.mac_address #=> "74:d0:c9:22:95:12"
300
+ # Faker::Internet.mac_address(prefix: 'a') #=> "0a:91:ce:24:89:3b"
301
+ # Faker::Internet.mac_address(prefix: 'aa') #=> "aa:38:a0:3e:e8:41"
302
+ # Faker::Internet.mac_address(prefix: 'aa:44') #=> "aa:44:30:88:6e:95"
303
+ def mac_address(prefix: '')
187
304
  prefix_digits = prefix.split(':').map { |d| d.to_i(16) }
188
305
  address_digits = Array.new((6 - prefix_digits.size)) { rand(256) }
189
306
  (prefix_digits + address_digits).map { |d| format('%02x', d) }.join(':')
190
307
  end
191
308
 
309
+ ##
310
+ # Returns the IPv4 address
311
+ #
312
+ # @return [String]
313
+ #
314
+ # @example
315
+ # Faker::Internet.ip_v4_address #=> "97.117.128.93"
192
316
  def ip_v4_address
193
317
  [rand_in_range(0, 255), rand_in_range(0, 255),
194
318
  rand_in_range(0, 255), rand_in_range(0, 255)].join('.')
195
319
  end
196
320
 
321
+ ##
322
+ # Returns the private IPv4 address
323
+ #
324
+ # @return [String]
325
+ #
326
+ # @example
327
+ # Faker::Internet.private_ip_v4_address #=> "127.120.80.42"
197
328
  def private_ip_v4_address
198
- addr = nil
199
- loop do
200
- addr = ip_v4_address
201
- break if private_net_checker[addr]
202
- end
203
- addr
329
+ sample(PRIVATE_IPV4_ADDRESS_RANGES).map { |range| rand(range) }.join('.')
204
330
  end
205
331
 
332
+ ##
333
+ # Returns the public IPv4 address
334
+ #
335
+ # @return [String]
336
+ #
337
+ # @example
338
+ # Faker::Internet.public_ip_v4_address #=> "127.120.80.42"
206
339
  def public_ip_v4_address
207
340
  addr = nil
208
341
  loop do
@@ -212,6 +345,13 @@ module Faker
212
345
  addr
213
346
  end
214
347
 
348
+ ##
349
+ # Returns the private network regular expressions
350
+ #
351
+ # @return [Array]
352
+ #
353
+ # @example
354
+ # 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])\./]
215
355
  def private_nets_regex
216
356
  [
217
357
  /^10\./, # 10.0.0.0 - 10.255.255.255
@@ -225,10 +365,25 @@ module Faker
225
365
  ]
226
366
  end
227
367
 
368
+ ##
369
+ # Returns lambda to check if address passed is private or not
370
+ #
371
+ # @return [Lambda]
372
+ #
373
+ # @example
374
+ # Faker::Internet.private_net_checker.call("127.120.80.42") #=> true
375
+ # Faker::Internet.private_net_checker.call("148.120.80.42") #=> false
228
376
  def private_net_checker
229
377
  ->(addr) { private_nets_regex.any? { |net| net =~ addr } }
230
378
  end
231
379
 
380
+ ##
381
+ # Returns the reserved network regular expressions
382
+ #
383
+ # @return [Array]
384
+ #
385
+ # @example
386
+ # 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])\./]
232
387
  def reserved_nets_regex
233
388
  [
234
389
  /^0\./, # 0.0.0.0 - 0.255.255.255
@@ -241,69 +396,143 @@ module Faker
241
396
  ]
242
397
  end
243
398
 
399
+ ##
400
+ # Returns lambda function to check address passed is reserved or not
401
+ #
402
+ # @return [Lambda]
403
+ #
404
+ # @example
405
+ # Faker::Internet.reserved_net_checker.call('192.88.99.255') #=> true
406
+ # Faker::Internet.reserved_net_checker.call('192.88.199.255') #=> false
244
407
  def reserved_net_checker
245
408
  ->(addr) { (private_nets_regex + reserved_nets_regex).any? { |net| net =~ addr } }
246
409
  end
247
410
 
411
+ ##
412
+ # Returns Ipv4 address with CIDR, range from 1 to 31
413
+ #
414
+ # @return [String]
415
+ #
416
+ # @example
417
+ # Faker::Internet.ip_v4_cidr #=> "129.162.99.74/16"
418
+ # Faker::Internet.ip_v4_cidr #=> "129.162.99.74/24"
248
419
  def ip_v4_cidr
249
420
  "#{ip_v4_address}/#{rand(1..31)}"
250
421
  end
251
422
 
423
+ ##
424
+ # Returns Ipv6 address
425
+ #
426
+ # @return [String]
427
+ #
428
+ # @example
429
+ # Faker::Internet.ip_v6_address #=> "7754:76d4:c7aa:7646:ea68:1abb:4055:4343"
252
430
  def ip_v6_address
253
431
  (1..8).map { rand(65_536).to_s(16) }.join(':')
254
432
  end
255
433
 
434
+ ##
435
+ # Returns Ipv6 address with CIDR, range between 1 to 127
436
+ #
437
+ # @return [String]
438
+ #
439
+ # @example
440
+ # Faker::Internet.ip_v6_cidr #=> "beca:9b99:4bb6:9712:af2f:516f:8507:96e1/99"
256
441
  def ip_v6_cidr
257
442
  "#{ip_v6_address}/#{rand(1..127)}"
258
443
  end
259
444
 
260
- def url(legacy_host = NOT_GIVEN, legacy_path = NOT_GIVEN, legacy_scheme = NOT_GIVEN, host: domain_name, path: "/#{username}", scheme: 'http')
261
- # rubocop:enable Metrics/ParameterLists
262
- if legacy_host != NOT_GIVEN
263
- warn_with_uplevel 'Passing `host` with the 1st argument of `Internet.url` is deprecated. Use keyword argument like `Internet.url(host: ...)` instead.', uplevel: 1
264
- host = legacy_host
265
- end
266
- if legacy_path != NOT_GIVEN
267
- warn_with_uplevel 'Passing `path` with the 2nd argument of `Internet.url` is deprecated. Use keyword argument like `Internet.url(path: ...)` instead.', uplevel: 1
268
- path = legacy_path
269
- end
270
- if legacy_scheme != NOT_GIVEN
271
- warn_with_uplevel 'Passing `scheme` with the 3rd argument of `Internet.url` is deprecated. Use keyword argument like `Internet.url(scheme: ...)` instead.', uplevel: 1
272
- scheme = legacy_scheme
273
- end
274
-
445
+ ##
446
+ # Returns URL
447
+ #
448
+ # @return [String]
449
+ #
450
+ # @param host [String]
451
+ # @param path [String]
452
+ # @param scheme [String]
453
+ #
454
+ # @example
455
+ # Faker::Internet.url #=> "http://treutel.test/demarcus"
456
+ # Faker::Internet.url(host: 'faker') #=> "http://faker/shad"
457
+ # Faker::Internet.url(host: 'faker', path: '/docs') #=> "http://faker/docs"
458
+ # Faker::Internet.url(host: 'faker', path: '/docs', scheme: 'https') #=> "https://faker/docs"
459
+ def url(host: domain_name, path: "/#{username}", scheme: 'http')
275
460
  "#{scheme}://#{host}#{path}"
276
461
  end
277
462
 
278
- def slug(legacy_words = NOT_GIVEN, legacy_glue = NOT_GIVEN, words: nil, glue: nil)
279
- if legacy_words != NOT_GIVEN
280
- warn_with_uplevel 'Passing `words` with the 1st argument of `Internet.slug` is deprecated. Use keyword argument like `Internet.slug(words: ...)` instead.', uplevel: 1
281
- words = legacy_words
282
- end
283
- if legacy_glue != NOT_GIVEN
284
- warn_with_uplevel 'Passing `glue` with the 2nd argument of `Internet.slug` is deprecated. Use keyword argument like `Internet.slug(glue: ...)` instead.', uplevel: 1
285
- glue = legacy_glue
286
- end
287
-
463
+ ##
464
+ # Returns unique string in URL
465
+ #
466
+ # @return [String]
467
+ #
468
+ # @param words [String] Comma or period separated words list
469
+ # @param glue [String] Separator to add between words passed, default used are '-' or '_'
470
+ #
471
+ # @example
472
+ # Faker::Internet.slug #=> "repudiandae-sed"
473
+ # Faker::Internet.slug(words: 'test, faker') #=> "test-faker"
474
+ # Faker::Internet.slug(words: 'test. faker') #=> "test-faker"
475
+ # Faker::Internet.slug(words: 'test. faker', glue: '$') #=> "test$faker"
476
+ def slug(words: nil, glue: nil)
288
477
  glue ||= sample(%w[- _])
289
- (words || Faker::Lorem.words(number: 2).join(' ')).delete(',.').gsub(' ', glue).downcase
478
+ return words.delete(',.').gsub(' ', glue).downcase unless words.nil?
479
+
480
+ sample(translate('faker.internet.slug'), 2).join(glue)
290
481
  end
291
482
 
483
+ ##
484
+ # Generates random token
485
+ #
486
+ # @return[String]
487
+ #
488
+ # @example
489
+ # Faker::Internet.device_token #=> "749f535671cf6b34d8e794d212d00c703b96274e07161b18b082d0d70ef1052f"
292
490
  def device_token
293
491
  shuffle(rand(16**64).to_s(16).rjust(64, '0').chars.to_a).join
294
492
  end
295
493
 
296
- def user_agent(legacy_vendor = NOT_GIVEN, vendor: nil)
297
- if legacy_vendor != NOT_GIVEN
298
- warn_with_uplevel 'Passing `vendor` with the 1st argument of `Internet.user_agent` is deprecated. Use keyword argument like `Internet.user_agent(vendor: ...)` instead.', uplevel: 1
299
- vendor = legacy_vendor
300
- end
301
-
494
+ ##
495
+ # Generates the random browser identifier
496
+ #
497
+ # @return [String]
498
+ #
499
+ # @param vendor [String] Name of vendor, supported vendors are aol, chrome, firefox, internet_explorer, netscape, opera, safari
500
+ #
501
+ # @example
502
+ # 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"
503
+ # 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"
504
+ # 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"
505
+ # 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"
506
+ def user_agent(vendor: nil)
302
507
  agent_hash = translate('faker.internet.user_agent')
303
508
  agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
304
509
  sample(agents)
305
510
  end
306
511
 
512
+ ##
513
+ # Generate Web Crawler's user agents
514
+ #
515
+ # @return [String]
516
+ #
517
+ # @param vendor [String] Name of vendor, supported vendors are googlebot, bingbot, duckduckbot, baiduspider, yandexbot
518
+ #
519
+ # @example
520
+ # Faker::Internet.bot_user_agent #=> "Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)"
521
+ # 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"
522
+ # 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"
523
+ def bot_user_agent(vendor: nil)
524
+ agent_hash = translate('faker.internet.bot_user_agent')
525
+ agents = vendor.respond_to?(:to_sym) && agent_hash[vendor.to_sym] || agent_hash[sample(agent_hash.keys)]
526
+ sample(agents)
527
+ end
528
+
529
+ ##
530
+ # Generated universally unique identifier
531
+ #
532
+ # @return [String]
533
+ #
534
+ # @example
535
+ # Faker::Internet.uuid #=> "8a6cdd40-6d78-4fdb-912b-190e3057197f"
307
536
  def uuid
308
537
  # borrowed from: https://github.com/ruby/ruby/blob/d48783bb0236db505fe1205d1d9822309de53a36/lib/securerandom.rb#L250
309
538
  ary = Faker::Config.random.bytes(16).unpack('NnnnnN')
@@ -312,7 +541,73 @@ module Faker
312
541
  '%08x-%04x-%04x-%04x-%04x%08x' % ary # rubocop:disable Style/FormatString
313
542
  end
314
543
 
544
+ ##
545
+ # Produces a random string of alphabetic characters, (no digits)
546
+ #
547
+ # @param length [Integer] The length of the string to generate
548
+ # @param padding [Boolean] Toggles if a final equal '=' will be added.
549
+ # @param urlsafe [Boolean] Toggles charset to '-' and '_' instead of '+' and '/'.
550
+ #
551
+ # @return [String]
552
+ #
553
+ # @example
554
+ # Faker::Internet.base64
555
+ # #=> "r_hbZ2DSD-ZACzZT"
556
+ # @example
557
+ # Faker::Internet.base64(length: 4, padding: true, urlsafe: false)
558
+ # #=> "x1/R="
559
+ #
560
+ # @faker.version 2.11.0
561
+ def base64(length: 16, padding: false, urlsafe: true)
562
+ char_range = [
563
+ Array('0'..'9'),
564
+ Array('A'..'Z'),
565
+ Array('a'..'z'),
566
+ urlsafe ? %w[- _] : %w[+ /]
567
+ ].flatten
568
+ s = Array.new(length) { sample(char_range) }.join
569
+ s += '=' if padding
570
+ s
571
+ end
572
+
573
+ ##
574
+ # Produces a randomized hash of internet user details
575
+ # @example
576
+ # Faker::Internet.user #=> { username: 'alexie', email: 'trudie@grant.test' }
577
+ #
578
+ # @example
579
+ # Faker::Internet.user('username', 'email', 'password') #=> { username: 'alexie', email: 'gayle@kohler.test', password: 'DtEf9P8wS31iMyC' }
580
+ #
581
+ # @return [hash]
582
+ #
583
+ # @faker.version next
584
+ def user(*args)
585
+ user_hash = {}
586
+ args = %w[username email] if args.empty?
587
+ args.each { |arg| user_hash[:"#{arg}"] = send(arg) }
588
+ user_hash
589
+ end
590
+
315
591
  alias user_name username
592
+
593
+ private
594
+
595
+ def sanitize_email_local_part(local_part)
596
+ char_range = [
597
+ Array('0'..'9'),
598
+ Array('A'..'Z'),
599
+ Array('a'..'z'),
600
+ "!#$%&'*+-/=?^_`{|}~.".chars
601
+ ].flatten
602
+
603
+ local_part.chars.map do |char|
604
+ char_range.include?(char) ? char : '#'
605
+ end.join
606
+ end
607
+
608
+ def construct_email(local_part, domain_name)
609
+ [local_part, domain_name].join('@')
610
+ end
316
611
  end
317
612
  end
318
613
  end