faker 2.11.0 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'digest'
3
+ require 'openssl'
4
4
  require 'securerandom'
5
5
 
6
6
  module Faker
@@ -88,6 +88,34 @@ module Faker
88
88
  encode_tz(:edsig, 64)
89
89
  end
90
90
 
91
+ ##
92
+ # Produces a random Tezos public key
93
+ #
94
+ # @return [String]
95
+ #
96
+ # @example
97
+ # Faker::Blockchain::Tezos.public_key
98
+ # #=> "edpkuib9x8QXRc5nWwHUg7U1dXsVmaUrUNU5sX9pVEEvwbMVdfMCeq"
99
+ #
100
+ # @faker.version 2.15.2
101
+ def public_key
102
+ encode_tz(:edpk, 32)
103
+ end
104
+
105
+ ##
106
+ # Produces a random Tezos public key
107
+ #
108
+ # @return [String]
109
+ #
110
+ # @example
111
+ # Faker::Blockchain::Tezos.secret_key
112
+ # #=> "edsk3HZCAGEGpzQPnQUwQeFY4ESanFhQCgLpKriQw8GHyhKCrjHawv"
113
+ #
114
+ # @faker.version 2.15.2
115
+ def secret_key
116
+ encode_tz(:edsk, 32)
117
+ end
118
+
91
119
  protected
92
120
 
93
121
  ##
@@ -97,8 +125,8 @@ module Faker
97
125
  # @return [String]
98
126
  def encode_tz(prefix, payload_size)
99
127
  prefix = PREFIXES.fetch(prefix)
100
- packed = prefix.map(&:chr).join('') + Faker::Config.random.bytes(payload_size)
101
- checksum = Digest::SHA2.digest(Digest::SHA2.digest(packed))[0..3]
128
+ packed = prefix.map(&:chr).join + Faker::Config.random.bytes(payload_size)
129
+ checksum = OpenSSL::Digest::SHA256.digest(OpenSSL::Digest::SHA256.digest(packed))[0..3]
102
130
  Faker::Base58.encode(packed + checksum)
103
131
  end
104
132
  end
@@ -30,6 +30,19 @@ module Faker
30
30
  fetch('dune.titles')
31
31
  end
32
32
 
33
+ ##
34
+ # Produces the name of a city from Dune
35
+ #
36
+ # @return [String]
37
+ #
38
+ # @example
39
+ # Faker::Books::Dune.city #=> "Arrakeen"
40
+ #
41
+ # @faker.version next
42
+ def city
43
+ fetch('dune.cities')
44
+ end
45
+
33
46
  ##
34
47
  # Produces the name of a planet from Dune
35
48
  #
@@ -58,11 +71,7 @@ module Faker
58
71
  # #=> "He who controls the spice, controls the universe!"
59
72
  #
60
73
  # @faker.version 1.9.3
61
- def quote(legacy_character = NOT_GIVEN, character: nil)
62
- warn_for_deprecated_arguments do |keywords|
63
- keywords << :character if legacy_character != NOT_GIVEN
64
- end
65
-
74
+ def quote(character: nil)
66
75
  quoted_characters = translate('faker.dune.quotes').keys
67
76
 
68
77
  if character.nil?
@@ -76,7 +85,7 @@ module Faker
76
85
  end
77
86
  end
78
87
 
79
- fetch('dune.quotes.' + character)
88
+ fetch("dune.quotes.#{character}")
80
89
  end
81
90
 
82
91
  ##
@@ -93,11 +102,7 @@ module Faker
93
102
  # #=> "May thy knife chip and shatter."
94
103
  #
95
104
  # @faker.version 1.9.3
96
- def saying(legacy_source = NOT_GIVEN, source: nil)
97
- warn_for_deprecated_arguments do |keywords|
98
- keywords << :source if legacy_source != NOT_GIVEN
99
- end
100
-
105
+ def saying(source: nil)
101
106
  sourced_sayings = translate('faker.dune.sayings').keys
102
107
 
103
108
  if source.nil?
@@ -111,7 +116,7 @@ module Faker
111
116
  end
112
117
  end
113
118
 
114
- fetch('dune.sayings.' + source)
119
+ fetch("dune.sayings.#{source}")
115
120
  end
116
121
  end
117
122
  end
@@ -29,11 +29,7 @@ module Faker
29
29
  # #=> "Ph'nglui mglw'nafh Cthulhu R'lyeh wgah'nagl fht...
30
30
  #
31
31
  # @faker.version 1.9.3
32
- def fhtagn(legacy_number = NOT_GIVEN, number: 1)
33
- warn_for_deprecated_arguments do |keywords|
34
- keywords << :number if legacy_number != NOT_GIVEN
35
- end
36
-
32
+ def fhtagn(number: 1)
37
33
  Array.new(number) { fetch('lovecraft.fhtagn') }.join('. ')
38
34
  end
39
35
 
@@ -68,6 +64,7 @@ module Faker
68
64
  #
69
65
  # @param word_count [Integer] The number of words to have in the sentence
70
66
  # @param random_words_to_add [Integer]
67
+ # @param open_compounds_allowed [Boolean] If true, generated sentence can contain words having additional spaces
71
68
  #
72
69
  # @return [String]
73
70
  #
@@ -80,15 +77,13 @@ module Faker
80
77
  # @example
81
78
  # Faker::Books::Lovecraft.sentence(word_count: 3, random_words_to_add: 1)
82
79
  # #=> "Amorphous indescribable tenebrous."
80
+ # @example
81
+ # Faker::Books::Lovecraft.sentence(word_count: 3, random_words_to_add: 0, open_compounds_allowed: true)
82
+ # #=> "Effulgence unmentionable gambrel."
83
83
  #
84
84
  # @faker.version 1.9.3
85
- def sentence(legacy_word_count = NOT_GIVEN, legacy_random_words_to_add = NOT_GIVEN, word_count: 4, random_words_to_add: 6)
86
- warn_for_deprecated_arguments do |keywords|
87
- keywords << :word_count if legacy_word_count != NOT_GIVEN
88
- keywords << :random_words_to_add if legacy_random_words_to_add != NOT_GIVEN
89
- end
90
-
91
- words(number: word_count + rand(random_words_to_add.to_i).to_i, spaces_allowed: true).join(' ').capitalize + '.'
85
+ def sentence(word_count: 4, random_words_to_add: 6, open_compounds_allowed: true)
86
+ "#{words(number: word_count + rand(random_words_to_add.to_i).to_i, spaces_allowed: open_compounds_allowed).join(' ').capitalize}."
92
87
  end
93
88
 
94
89
  ##
@@ -134,12 +129,7 @@ module Faker
134
129
  # # ]
135
130
  #
136
131
  # @faker.version 1.9.3
137
- def words(legacy_number = NOT_GIVEN, legacy_spaces_allowed = NOT_GIVEN, number: 3, spaces_allowed: false)
138
- warn_for_deprecated_arguments do |keywords|
139
- keywords << :number if legacy_number != NOT_GIVEN
140
- keywords << :spaces_allowed if legacy_spaces_allowed != NOT_GIVEN
141
- end
142
-
132
+ def words(number: 3, spaces_allowed: false)
143
133
  resolved_num = resolve(number)
144
134
  word_list = translate('faker.lovecraft.words')
145
135
  word_list *= ((resolved_num / word_list.length) + 1)
@@ -172,11 +162,7 @@ module Faker
172
162
  # # ]
173
163
  #
174
164
  # @faker.version 1.9.3
175
- def sentences(legacy_number = NOT_GIVEN, number: 3)
176
- warn_for_deprecated_arguments do |keywords|
177
- keywords << :number if legacy_number != NOT_GIVEN
178
- end
179
-
165
+ def sentences(number: 3)
180
166
  [].tap do |sentences|
181
167
  1.upto(resolve(number)) do
182
168
  sentences << sentence(word_count: 3)
@@ -203,12 +189,7 @@ module Faker
203
189
  # #=> "Stench cyclopean fainted antiquarian nameless. Antiquarian ululate tenebrous non-euclidean effulgence."
204
190
  #
205
191
  # @faker.version 1.9.3
206
- def paragraph(legacy_sentence_count = NOT_GIVEN, legacy_random_sentences_to_add = NOT_GIVEN, sentence_count: 3, random_sentences_to_add: 3)
207
- warn_for_deprecated_arguments do |keywords|
208
- keywords << :sentence_count if legacy_sentence_count != NOT_GIVEN
209
- keywords << :random_sentences_to_add if legacy_random_sentences_to_add != NOT_GIVEN
210
- end
211
-
192
+ def paragraph(sentence_count: 3, random_sentences_to_add: 3)
212
193
  sentences(number: resolve(sentence_count) + rand(random_sentences_to_add.to_i).to_i).join(' ')
213
194
  end
214
195
 
@@ -234,11 +215,7 @@ module Faker
234
215
  # # ]
235
216
  #
236
217
  # @faker.version 1.9.3
237
- def paragraphs(legacy_number = NOT_GIVEN, number: 3)
238
- warn_for_deprecated_arguments do |keywords|
239
- keywords << :number if legacy_number != NOT_GIVEN
240
- end
241
-
218
+ def paragraphs(number: 3)
242
219
  [].tap do |paragraphs|
243
220
  1.upto(resolve(number)) do
244
221
  paragraphs << paragraph(sentence_count: 3)
@@ -259,16 +236,12 @@ module Faker
259
236
  # #=> "Effulgence madness noisome. Fungus stygian mortal madness amorphous dank. Decadent noisome hideous effulgence. Tentacles charne."
260
237
  #
261
238
  # @faker.version 1.9.3
262
- def paragraph_by_chars(legacy_characters = NOT_GIVEN, characters: 256)
263
- warn_for_deprecated_arguments do |keywords|
264
- keywords << :characters if legacy_characters != NOT_GIVEN
265
- end
266
-
239
+ def paragraph_by_chars(characters: 256)
267
240
  paragraph = paragraph(sentence_count: 3)
268
241
 
269
- paragraph += ' ' + paragraph(sentence_count: 3) while paragraph.length < characters
242
+ paragraph += " #{paragraph(sentence_count: 3)}" while paragraph.length < characters
270
243
 
271
- paragraph[0...characters - 1] + '.'
244
+ "#{paragraph[0...characters - 1]}."
272
245
  end
273
246
  end
274
247
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faker
4
+ class Books
5
+ class TheKingkillerChronicle < Base
6
+ class << self
7
+ ##
8
+ # Produces the name of a The Kingkiller Chronicle book.
9
+ #
10
+ # @return [String]
11
+ #
12
+ # @example
13
+ # Faker::Books::TheKingkillerChronicle.book #=> "The Name of the Wind"
14
+ #
15
+ # @faker.version next
16
+ def book
17
+ fetch('books.the_kingkiller_chronicle.books')
18
+ end
19
+
20
+ ##
21
+ # Produces the name of a The Kingkiller Chronicle character.
22
+ #
23
+ # @return [String]
24
+ #
25
+ # @example
26
+ # Faker::Books::TheKingkillerChronicle.character #=> "Kvothe"
27
+ #
28
+ # @faker.version next
29
+ def character
30
+ fetch('books.the_kingkiller_chronicle.characters')
31
+ end
32
+
33
+ ##
34
+ # Produces the name of a The Kingkiller Chronicle creature.
35
+ #
36
+ # @return [String]
37
+ #
38
+ # @example
39
+ # Faker::Books::TheKingkillerChronicle.creature #=> "Scrael"
40
+ #
41
+ # @faker.version next
42
+ def creature
43
+ fetch('books.the_kingkiller_chronicle.creatures')
44
+ end
45
+
46
+ ##
47
+ # Produces the name of a The Kingkiller Chronicle location.
48
+ #
49
+ # @return [String]
50
+ #
51
+ # @example
52
+ # Faker::Books::TheKingkillerChronicle.location #=> "Tarbean"
53
+ #
54
+ # @faker.version next
55
+ def location
56
+ fetch('books.the_kingkiller_chronicle.locations')
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,203 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faker
4
+ class Creature
5
+ class Bird < Base
6
+ flexible :bird
7
+
8
+ class << self
9
+ ##
10
+ # Produces a random common family name of a bird.
11
+ #
12
+ # @return [String]
13
+ #
14
+ # @example
15
+ # Faker::Creature::Bird.common_family_name #=> "Owls"
16
+ #
17
+ # @faker.version next
18
+ def common_family_name
19
+ fetch('creature.bird.common_family_name')
20
+ end
21
+
22
+ ##
23
+ # Produces a random common taxonomic order from the class Aves
24
+ #
25
+ # @return [String]
26
+ #
27
+ # @example
28
+ # Faker::Creature::Bird.order #=> "Passeriformes"
29
+ #
30
+ # @faker.version next
31
+ def order
32
+ orders = I18n.translate('faker.creature.bird.order_common_map').keys
33
+ sample(orders).to_s
34
+ end
35
+
36
+ ##
37
+ # Produces a random bird anatomy word
38
+ #
39
+ # @return [String]
40
+ #
41
+ # @example
42
+ # Faker::Creature::Bird.anatomy #=> "rump"
43
+ #
44
+ # @faker.version next
45
+ def anatomy
46
+ fetch('creature.bird.anatomy')
47
+ end
48
+
49
+ ##
50
+ # Produces a random, past tensed bird anatomy word
51
+ #
52
+ # @return [String]
53
+ #
54
+ # @example
55
+ # Faker::Creature::Bird.anatomy #=> "breasted"
56
+ #
57
+ # @faker.version next
58
+ def anatomy_past_tense
59
+ fetch('creature.bird.anatomy_past_tense')
60
+ end
61
+
62
+ ##
63
+ # Produces a random geographical word used in describing birds
64
+ #
65
+ # @return [String]
66
+ #
67
+ # @example
68
+ # Faker::Creature::Bird.geo #=> "Eurasian"
69
+ #
70
+ # @faker.version next
71
+ def geo
72
+ fetch('creature.bird.geo')
73
+ end
74
+
75
+ ##
76
+ # Produces a random color word used in describing birds
77
+ #
78
+ # @return [String]
79
+ #
80
+ # @example
81
+ # Faker::Creature::Bird.color #=> "ferruginous"
82
+ #
83
+ # @faker.version next
84
+ def color
85
+ fetch('creature.bird.colors')
86
+ end
87
+
88
+ ##
89
+ # Produces a random adjective used to described birds
90
+ #
91
+ # @return [String]
92
+ #
93
+ # @example
94
+ # Faker::Creature::Bird.adjective #=> 'common'
95
+ #
96
+ # @faker.version next
97
+ def adjective
98
+ fetch('creature.bird.adjectives')
99
+ end
100
+
101
+ ##
102
+ # Produces a random emotional adjective NOT used to described birds
103
+ # ...but could be
104
+ #
105
+ # @return [String]
106
+ #
107
+ # @example
108
+ # Faker::Creature::Bird.emotional_adjective #=> 'cantankerous'
109
+ #
110
+ # @faker.version next
111
+ def emotional_adjective
112
+ fetch('creature.bird.emotional_adjectives')
113
+ end
114
+
115
+ ##
116
+ # Produces a random adjective NOT used to described birds
117
+ # ...but probably shouldn't
118
+ #
119
+ # @return [String]
120
+ #
121
+ # @example
122
+ # Faker::Creature::Bird.silly_adjective #=> 'drunk'
123
+ #
124
+ # @faker.version next
125
+ def silly_adjective
126
+ fetch('creature.bird.silly_adjectives')
127
+ end
128
+
129
+ ##
130
+ # Produces a random common name for a bird
131
+ #
132
+ # @param [String | Symbol | nil] tax_order Tax
133
+ # @return [String]
134
+ # @raises TypeError If `tax_order` cannot be converted into a Symbol
135
+ # @raises ArgumentError If `tax_order` is not a valid taxonomic order
136
+ #
137
+ # @example
138
+ # Faker::Creature::Bird.common_name #=> 'wren'
139
+ #
140
+ # @faker.version next
141
+ def common_name(tax_order = nil)
142
+ map = translate('faker.creature.bird.order_common_map')
143
+ if tax_order.nil?
144
+ sample(map.values.flatten).downcase
145
+ else
146
+ raise TypeError, 'tax_order parameter must be symbolizable' \
147
+ unless tax_order.respond_to?(:to_sym)
148
+ raise ArgumentError, "#{tax_order} is not a valid taxonomic order" \
149
+ unless map.keys.include?(tax_order.to_sym)
150
+
151
+ the_order = translate('faker.creature.bird.order_common_map')[tax_order.to_sym]
152
+ sample(the_order).downcase
153
+ end
154
+ end
155
+
156
+ ##
157
+ # Produces a random and plausible common name for a bird
158
+ #
159
+ # @return [String]
160
+ #
161
+ # @example
162
+ # Faker::Creature::Bird.plausible_common_name #=> 'Hellinger's Wren'
163
+ #
164
+ # @faker.version next
165
+ def plausible_common_name
166
+ parse('creature.bird.plausible_common_names').capitalize
167
+ end
168
+
169
+ ##
170
+ # Produces a random and IMplausible common name for a bird
171
+ #
172
+ # @return [String]
173
+ #
174
+ # @example
175
+ # Faker::Creature::Bird.implausible_common_name #=> 'Hellinger's Cantankerous Chickadee'
176
+ #
177
+ # @faker.version next
178
+ def implausible_common_name
179
+ parse('creature.bird.implausible_common_names').capitalize
180
+ end
181
+
182
+ ##
183
+ # Produces a hash entry with a random order and a random common name
184
+ # that is of that order
185
+ #
186
+ # @return [Hash<order,common_name>]
187
+ #
188
+ # @example
189
+ # Faker::Creature::Bird.order_with_common_name #=> {
190
+ # order: ''Accipitriformes',
191
+ # common_name: 'Osprey'
192
+ # }
193
+ #
194
+ # @faker.version next
195
+ def order_with_common_name(tax_order = nil)
196
+ map = I18n.translate('faker.creature.bird.order_common_map')
197
+ o = tax_order.nil? ? order : tax_order
198
+ { order: o, common_name: sample(map[o.to_sym]) }
199
+ end
200
+ end
201
+ end
202
+ end
203
+ end
@@ -18,11 +18,7 @@ module Faker
18
18
  # #=> "Northfort, California"
19
19
  #
20
20
  # @faker.version 0.3.0
21
- def city(legacy_options = NOT_GIVEN, options: {})
22
- warn_for_deprecated_arguments do |keywords|
23
- keywords << :options if legacy_options != NOT_GIVEN
24
- end
25
-
21
+ def city(options: {})
26
22
  parse(options[:with_state] ? 'address.city_with_state' : 'address.city')
27
23
  end
28
24
 
@@ -49,12 +45,8 @@ module Faker
49
45
  # Faker::Address.street_address #=> "282 Kevin Brook"
50
46
  #
51
47
  # @faker.version 0.3.0
52
- def street_address(legacy_include_secondary = NOT_GIVEN, include_secondary: false)
53
- warn_for_deprecated_arguments do |keywords|
54
- keywords << :include_secondary if legacy_include_secondary != NOT_GIVEN
55
- end
56
-
57
- numerify(parse('address.street_address') + (include_secondary ? ' ' + secondary_address : ''))
48
+ def street_address(include_secondary: false)
49
+ numerify(parse('address.street_address') + (include_secondary ? " #{secondary_address}" : ''))
58
50
  end
59
51
 
60
52
  ##
@@ -102,7 +94,7 @@ module Faker
102
94
  # @return [String]
103
95
  #
104
96
  # @example
105
- # Faker::Address.mail_box #=> "PO Box 123"
97
+ # Faker::Address.mail_box #=> "PO Box 123"
106
98
  #
107
99
  # @faker.version 2.9.1
108
100
  def mail_box
@@ -121,11 +113,7 @@ module Faker
121
113
  # Faker::Address.zip_code(state_abbreviation: 'CO') #=> "80011"
122
114
  #
123
115
  # @faker.version 0.3.0
124
- def zip_code(legacy_state_abbreviation = NOT_GIVEN, state_abbreviation: '')
125
- warn_for_deprecated_arguments do |keywords|
126
- keywords << :state_abbreviation if legacy_state_abbreviation != NOT_GIVEN
127
- end
128
-
116
+ def zip_code(state_abbreviation: '')
129
117
  if state_abbreviation.empty?
130
118
  letterified_string = letterify(fetch('address.postcode'))
131
119
  return numerify(letterified_string, leading_zero: true)
@@ -133,7 +121,7 @@ module Faker
133
121
 
134
122
  # provide a zip code that is valid for the state provided
135
123
  # see http://www.fincen.gov/forms/files/us_state_territory_zip_codes.pdf
136
- bothify(fetch('address.postcode_by_state.' + state_abbreviation))
124
+ bothify(fetch("address.postcode_by_state.#{state_abbreviation}"))
137
125
  end
138
126
 
139
127
  ##
@@ -242,12 +230,8 @@ module Faker
242
230
  # Faker::Address.country_by_code(code: 'NL') #=> "Netherlands"
243
231
  #
244
232
  # @faker.version 1.9.2
245
- def country_by_code(legacy_code = NOT_GIVEN, code: 'US')
246
- warn_for_deprecated_arguments do |keywords|
247
- keywords << :code if legacy_code != NOT_GIVEN
248
- end
249
-
250
- fetch('address.country_by_code.' + code)
233
+ def country_by_code(code: 'US')
234
+ fetch("address.country_by_code.#{code}")
251
235
  end
252
236
 
253
237
  ##
@@ -260,12 +244,8 @@ module Faker
260
244
  # Faker::Address.country_name_to_code(name: 'united_states') #=> "US"
261
245
  #
262
246
  # @faker.version 1.9.2
263
- def country_name_to_code(legacy_name = NOT_GIVEN, name: 'united_states')
264
- warn_for_deprecated_arguments do |keywords|
265
- keywords << :name if legacy_name != NOT_GIVEN
266
- end
267
-
268
- fetch('address.country_by_name.' + name)
247
+ def country_name_to_code(name: 'united_states')
248
+ fetch("address.country_by_name.#{name}")
269
249
  end
270
250
 
271
251
  ##
@@ -333,6 +313,36 @@ module Faker
333
313
  def full_address
334
314
  parse('address.full_address')
335
315
  end
316
+
317
+ ##
318
+ # Produces Address hash of required fields
319
+ #
320
+ # @return [Hash]
321
+ #
322
+ # @example
323
+ # Faker::Address.full_address_as_hash(:longitude,
324
+ # :latitude,
325
+ # :country_name_to_code,
326
+ # country_name_to_code: {name: 'united_states'})
327
+ # #=> {:longitude=>-101.74428917174603, :latitude=>-37.40056749089944, :country_name_to_code=>"US"}
328
+ #
329
+ # Faker::Address.full_address_as_hash(:full_address)
330
+ # #=> {:full_address=>"87635 Rice Street, Lake Brentonton, OR 61896-5968"}
331
+ #
332
+ # Faker::Address.full_address_as_hash(:city, :time_zone)
333
+ # #=> {:city=>"East Faustina", :time_zone=>"America/Mexico_City"}
334
+ #
335
+ # Faker::Address.full_address_as_hash(:street_address, street_address: {include_secondary: true})
336
+ # #=> {:street_address=>"29423 Kenneth Causeway Suite 563"}
337
+ #
338
+ # @faker.version 2.13.0
339
+ def full_address_as_hash(*attrs, **attrs_params)
340
+ attrs.map!(&:to_sym)
341
+ attrs_params.transform_keys!(&:to_sym)
342
+ attrs.map do |attr|
343
+ { "#{attr}": attrs_params[attr] ? send(attr, **attrs_params[attr]) : send(attr) }
344
+ end.reduce({}, :merge)
345
+ end
336
346
  end
337
347
  end
338
348
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Faker
4
+ class Adjective < Base
5
+ flexible :adjective
6
+
7
+ class << self
8
+ ##
9
+ # Produces a positive adjective.
10
+ #
11
+ # @return [String]
12
+ #
13
+ # @example
14
+ # Faker::Adjective.positive #=> "Kind"
15
+ #
16
+ # @faker.version next
17
+ def positive
18
+ fetch('adjective.positive')
19
+ end
20
+
21
+ ##
22
+ # Produces a negative adjective.
23
+ #
24
+ # @return [String]
25
+ #
26
+ # @example
27
+ # Faker::Adjective.negative #=> "Creepy"
28
+ #
29
+ # @faker.version next
30
+ def negative
31
+ fetch('adjective.negative')
32
+ end
33
+ end
34
+ end
35
+ end
@@ -19,10 +19,7 @@ module Faker
19
19
  # Faker::Alphanumeric.alpha(number: 10) #=> "zlvubkrwga"
20
20
  #
21
21
  # @faker.version 1.9.2
22
- def alpha(legacy_number = NOT_GIVEN, number: 32)
23
- warn_for_deprecated_arguments do |keywords|
24
- keywords << :number if legacy_number != NOT_GIVEN
25
- end
22
+ def alpha(number: 32)
26
23
  char_count = resolve(number)
27
24
  return '' if char_count.to_i < 1
28
25
 
@@ -46,10 +43,7 @@ module Faker
46
43
  # Faker::Alphanumeric.alphanumeric(number: 10, min_alpha: 3, min_numeric: 3) #=> "3yfq2phx8b"
47
44
  #
48
45
  # @faker.version 2.1.3
49
- def alphanumeric(legacy_number = NOT_GIVEN, number: 32, min_alpha: 0, min_numeric: 0)
50
- warn_for_deprecated_arguments do |keywords|
51
- keywords << :number if legacy_number != NOT_GIVEN
52
- end
46
+ def alphanumeric(number: 32, min_alpha: 0, min_numeric: 0)
53
47
  char_count = resolve(number)
54
48
  return '' if char_count.to_i < 1
55
49
  raise ArgumentError, 'min_alpha must be greater than or equal to 0' if min_alpha&.negative?