faker 2.15.1 → 3.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +848 -34
  3. data/README.md +225 -103
  4. data/lib/faker/blockchain/aeternity.rb +1 -1
  5. data/lib/faker/blockchain/bitcoin.rb +2 -2
  6. data/lib/faker/blockchain/ethereum.rb +1 -1
  7. data/lib/faker/blockchain/tezos.rb +31 -3
  8. data/lib/faker/books/dune.rb +2 -10
  9. data/lib/faker/books/lovecraft.rb +9 -41
  10. data/lib/faker/books/the_kingkiller_chronicle.rb +61 -0
  11. data/lib/faker/creature/bird.rb +203 -0
  12. data/lib/faker/default/address.rb +7 -27
  13. data/lib/faker/default/alphanumeric.rb +2 -8
  14. data/lib/faker/default/app.rb +1 -10
  15. data/lib/faker/default/avatar.rb +1 -12
  16. data/lib/faker/default/bank.rb +25 -17
  17. data/lib/faker/default/barcode.rb +33 -22
  18. data/lib/faker/default/boolean.rb +1 -4
  19. data/lib/faker/default/cannabis.rb +10 -0
  20. data/lib/faker/default/chile_rut.rb +25 -25
  21. data/lib/faker/default/chuck_norris.rb +1 -0
  22. data/lib/faker/default/code.rb +71 -42
  23. data/lib/faker/default/color.rb +77 -6
  24. data/lib/faker/default/commerce.rb +31 -17
  25. data/lib/faker/default/company.rb +137 -22
  26. data/lib/faker/default/crypto.rb +26 -4
  27. data/lib/faker/default/crypto_coin.rb +3 -15
  28. data/lib/faker/default/date.rb +65 -42
  29. data/lib/faker/default/demographic.rb +1 -5
  30. data/lib/faker/default/driving_licence.rb +20 -18
  31. data/lib/faker/default/drone.rb +1 -1
  32. data/lib/faker/default/educator.rb +13 -0
  33. data/lib/faker/default/emotion.rb +33 -0
  34. data/lib/faker/default/file.rb +5 -22
  35. data/lib/faker/default/finance.rb +30 -7
  36. data/lib/faker/default/food.rb +27 -1
  37. data/lib/faker/default/hipster.rb +8 -48
  38. data/lib/faker/default/hobby.rb +22 -0
  39. data/lib/faker/default/html.rb +230 -0
  40. data/lib/faker/default/id_number.rb +175 -27
  41. data/lib/faker/default/internet.rb +333 -114
  42. data/lib/faker/default/invoice.rb +4 -17
  43. data/lib/faker/default/json.rb +4 -21
  44. data/lib/faker/default/lorem.rb +175 -73
  45. data/lib/faker/default/lorem_flickr.rb +4 -37
  46. data/lib/faker/default/markdown.rb +10 -13
  47. data/lib/faker/default/marketing.rb +1 -1
  48. data/lib/faker/default/measurement.rb +16 -48
  49. data/lib/faker/default/name.rb +1 -5
  50. data/lib/faker/default/nation.rb +0 -3
  51. data/lib/faker/default/{nhs.rb → national_health_service.rb} +9 -8
  52. data/lib/faker/default/number.rb +33 -61
  53. data/lib/faker/default/omniauth.rb +55 -52
  54. data/lib/faker/default/phone_number.rb +36 -21
  55. data/lib/faker/default/placeholdit.rb +10 -20
  56. data/lib/faker/default/relationship.rb +1 -5
  57. data/lib/faker/default/religion.rb +6 -0
  58. data/lib/faker/default/science.rb +108 -0
  59. data/lib/faker/default/source.rb +3 -16
  60. data/lib/faker/default/south_africa.rb +3 -3
  61. data/lib/faker/default/string.rb +1 -7
  62. data/lib/faker/default/stripe.rb +4 -20
  63. data/lib/faker/default/tea.rb +41 -0
  64. data/lib/faker/{music/show.rb → default/theater.rb} +11 -8
  65. data/lib/faker/default/time.rb +4 -34
  66. data/lib/faker/default/twitter.rb +7 -23
  67. data/lib/faker/default/types.rb +12 -34
  68. data/lib/faker/default/vehicle.rb +44 -54
  69. data/lib/faker/default/vulnerability_identifier.rb +23 -0
  70. data/lib/faker/default/world_cup.rb +2 -11
  71. data/lib/faker/games/clash_of_clans.rb +1 -1
  72. data/lib/faker/games/dnd.rb +49 -7
  73. data/lib/faker/games/dota.rb +14 -5
  74. data/lib/faker/games/final_fantasy_xiv.rb +73 -0
  75. data/lib/faker/games/minecraft.rb +1 -1
  76. data/lib/faker/games/myst.rb +1 -1
  77. data/lib/faker/games/tarkov.rb +205 -0
  78. data/lib/faker/games/touhou.rb +75 -0
  79. data/lib/faker/games/witcher.rb +39 -0
  80. data/lib/faker/japanese_media/cowboy_bebop.rb +61 -0
  81. data/lib/faker/japanese_media/fullmetal_alchemist_brotherhood.rb +51 -0
  82. data/lib/faker/japanese_media/kamen_rider.rb +102 -0
  83. data/lib/faker/japanese_media/one_piece.rb +1 -1
  84. data/lib/faker/locations/australia.rb +52 -0
  85. data/lib/faker/movies/avatar.rb +49 -0
  86. data/lib/faker/movies/hackers.rb +48 -0
  87. data/lib/faker/movies/star_wars.rb +73 -5
  88. data/lib/faker/movies/{room.rb → the_room.rb} +4 -4
  89. data/lib/faker/movies/tron.rb +161 -0
  90. data/lib/faker/music/hiphop.rb +3 -3
  91. data/lib/faker/music/music.rb +12 -0
  92. data/lib/faker/music/rock_band.rb +12 -0
  93. data/lib/faker/music/smashing_pumpkins.rb +64 -0
  94. data/lib/faker/quotes/quote.rb +13 -0
  95. data/lib/faker/quotes/rajnikanth.rb +1 -0
  96. data/lib/faker/quotes/shakespeare.rb +34 -0
  97. data/lib/faker/religion/bible.rb +50 -0
  98. data/lib/faker/sports/chess.rb +90 -0
  99. data/lib/faker/sports/mountaineering.rb +22 -0
  100. data/lib/faker/sports/sport.rb +116 -0
  101. data/lib/faker/travel/airport.rb +43 -0
  102. data/lib/faker/travel/train_station.rb +54 -0
  103. data/lib/faker/tv_shows/archer.rb +51 -0
  104. data/lib/faker/tv_shows/big_bang_theory.rb +1 -1
  105. data/lib/faker/tv_shows/brooklyn_nine_nine.rb +38 -0
  106. data/lib/faker/tv_shows/michael_scott.rb +0 -3
  107. data/lib/faker/tv_shows/south_park.rb +15 -0
  108. data/lib/faker/tv_shows/spongebob.rb +50 -0
  109. data/lib/faker/tv_shows/suits.rb +1 -1
  110. data/lib/faker/tv_shows/supernatural.rb +48 -0
  111. data/lib/faker/tv_shows/the_office.rb +37 -0
  112. data/lib/faker/version.rb +2 -2
  113. data/lib/faker.rb +26 -67
  114. data/lib/helpers/base58.rb +1 -1
  115. data/lib/helpers/deprecator.rb +53 -0
  116. data/lib/helpers/positional_generator.rb +480 -0
  117. data/lib/helpers/unique_generator.rb +13 -14
  118. data/lib/locales/README.md +18 -2
  119. data/lib/locales/ar.yml +6 -1
  120. data/lib/locales/bg.yml +1 -2
  121. data/lib/locales/da-DK.yml +529 -35
  122. data/lib/locales/de-AT.yml +3487 -27
  123. data/lib/locales/de-CH.yml +4328 -12
  124. data/lib/locales/de.yml +7185 -99
  125. data/lib/locales/ee.yml +0 -1
  126. data/lib/locales/en/address.yml +1826 -562
  127. data/lib/locales/en/airport.yml +381 -0
  128. data/lib/locales/en/animal.yml +1 -1
  129. data/lib/locales/en/archer.yml +75 -0
  130. data/lib/locales/en/australia.yml +108 -0
  131. data/lib/locales/en/avatar.yml +31 -0
  132. data/lib/locales/en/bank.yml +1 -1
  133. data/lib/locales/en/bible.yml +90 -0
  134. data/lib/locales/en/bird.yml +1281 -0
  135. data/lib/locales/en/book.yml +487 -3
  136. data/lib/locales/en/brooklyn_nine_nine.yml +35 -0
  137. data/lib/locales/en/cat.yml +1 -1
  138. data/lib/locales/en/chess.yml +103 -0
  139. data/lib/locales/en/coffee.yml +1 -1
  140. data/lib/locales/en/commerce.yml +17 -0
  141. data/lib/locales/en/community.yml +17 -17
  142. data/lib/locales/en/company.yml +1 -0
  143. data/lib/locales/en/computer.yml +23 -4
  144. data/lib/locales/en/cowboy_bebop.yml +163 -0
  145. data/lib/locales/en/device.yml +112 -4
  146. data/lib/locales/en/dnd.yml +186 -1
  147. data/lib/locales/en/dog.yml +262 -7
  148. data/lib/locales/en/dota.yml +173 -0
  149. data/lib/locales/en/dune.yml +266 -397
  150. data/lib/locales/en/educator.yml +6 -0
  151. data/lib/locales/en/emotion.yml +480 -0
  152. data/lib/locales/en/file.yml +9 -1
  153. data/lib/locales/en/final_fantasy_xiv.yml +754 -0
  154. data/lib/locales/en/finance.yml +27 -4
  155. data/lib/locales/en/food.yml +1067 -10
  156. data/lib/locales/en/football.yml +3 -3
  157. data/lib/locales/en/fullmetal_alchemist_brotherhood.yml +78 -0
  158. data/lib/locales/en/game.yml +11 -0
  159. data/lib/locales/en/hackers.yml +53 -0
  160. data/lib/locales/en/harry_potter.yml +1 -1
  161. data/lib/locales/en/heroes.yml +2 -2
  162. data/lib/locales/en/hobby.yml +171 -0
  163. data/lib/locales/en/horse.yml +2 -2
  164. data/lib/locales/en/id_number.yml +1 -1
  165. data/lib/locales/en/internet.yml +136 -3
  166. data/lib/locales/en/kamen_rider.yml +452 -0
  167. data/lib/locales/en/kpop.yml +7 -7
  168. data/lib/locales/en/lebowski.yml +1 -1
  169. data/lib/locales/en/lovecraft.yml +76 -6
  170. data/lib/locales/en/minecraft.yml +4 -4
  171. data/lib/locales/en/mitch_hedberg.yml +46 -0
  172. data/lib/locales/en/mountain.yml +14 -1
  173. data/lib/locales/en/mountaineering.yml +14 -0
  174. data/lib/locales/en/movie.yml +2 -1
  175. data/lib/locales/en/music.yml +152 -142
  176. data/lib/locales/en/naruto.yml +2 -3
  177. data/lib/locales/en/one_piece.yml +1 -1
  178. data/lib/locales/en/opera.yml +2 -2
  179. data/lib/locales/en/overwatch.yml +5 -7
  180. data/lib/locales/en/phone_number.yml +78 -3
  181. data/lib/locales/en/rock_band.yml +1 -0
  182. data/lib/locales/en/science.yml +481 -3
  183. data/lib/locales/en/shakespeare.yml +21 -24
  184. data/lib/locales/en/smashing_pumpkins.yml +382 -0
  185. data/lib/locales/en/source.yml +5 -0
  186. data/lib/locales/en/south_park.yml +360 -2
  187. data/lib/locales/en/space.yml +1 -1
  188. data/lib/locales/en/spongebob.yml +489 -0
  189. data/lib/locales/en/sport.yml +130 -0
  190. data/lib/locales/en/star_wars.yml +1 -1
  191. data/lib/locales/en/stranger_thing.yml +1 -1
  192. data/lib/locales/en/super_smash_bros.yml +7 -2
  193. data/lib/locales/en/supernatural.yml +141 -0
  194. data/lib/locales/en/tarkov.yml +593 -0
  195. data/lib/locales/en/tea.yml +172 -0
  196. data/lib/locales/en/the_kingkiller_chronicle.yml +56 -0
  197. data/lib/locales/en/the_office.yml +86 -0
  198. data/lib/locales/en/{room.yml → the_room.yml} +1 -1
  199. data/lib/locales/en/{show.yml → theater.yml} +1 -1
  200. data/lib/locales/en/touhou.yml +839 -0
  201. data/lib/locales/en/train_station.yml +280 -0
  202. data/lib/locales/en/tron.yml +227 -0
  203. data/lib/locales/en/vehicle.yml +2809 -75
  204. data/lib/locales/en/witcher.yml +37 -0
  205. data/lib/locales/en-AU.yml +718 -47
  206. data/lib/locales/en-CA.yml +373 -18
  207. data/lib/locales/en-GB.yml +116 -8
  208. data/lib/locales/en-IND.yml +1259 -17
  209. data/lib/locales/en-KE.yml +212 -0
  210. data/lib/locales/en-MS.yml +364 -17
  211. data/lib/locales/en-NEP.yml +212 -38
  212. data/lib/locales/en-NG.yml +1 -0
  213. data/lib/locales/en-NZ.yml +1153 -123
  214. data/lib/locales/en-PAK.yml +369 -10
  215. data/lib/locales/en-SG.yml +581 -16
  216. data/lib/locales/en-UG.yml +1 -0
  217. data/lib/locales/en-US.yml +6914 -74
  218. data/lib/locales/en-ZA.yml +1 -1
  219. data/lib/locales/en-au-ocker.yml +266 -22
  220. data/lib/locales/es-AR.yml +4570 -0
  221. data/lib/locales/es-MX.yml +1 -2
  222. data/lib/locales/es.yml +2 -3
  223. data/lib/locales/fi-FI.yml +3 -1
  224. data/lib/locales/fr/address.yml +20 -0
  225. data/lib/locales/fr/adjective.yml +266 -0
  226. data/lib/locales/fr/ancient.yml +141 -0
  227. data/lib/locales/fr/animal.yml +5 -0
  228. data/lib/locales/fr/appliance.yml +4 -0
  229. data/lib/locales/fr/book.yml +7 -0
  230. data/lib/locales/fr/color.yml +4 -0
  231. data/lib/locales/fr/company.yml +17 -0
  232. data/lib/locales/fr/compass.yml +23 -0
  233. data/lib/locales/fr/demographic.yml +4 -0
  234. data/lib/locales/fr/gender.yml +6 -0
  235. data/lib/locales/fr/internet.yml +4 -0
  236. data/lib/locales/fr/lorem.yml +5 -0
  237. data/lib/locales/fr/measurement.yml +7 -0
  238. data/lib/locales/fr/name.yml +22 -0
  239. data/lib/locales/fr/phone_number.yml +7 -0
  240. data/lib/locales/fr/pokemon.yml +7 -0
  241. data/lib/locales/fr-CA.yml +2733 -44
  242. data/lib/locales/fr-CH.yml +1 -2
  243. data/lib/locales/fr.yml +2 -118
  244. data/lib/locales/hy.yml +3624 -119
  245. data/lib/locales/id.yml +839 -12
  246. data/lib/locales/it.yml +1304 -32
  247. data/lib/locales/ja/README.md +13 -0
  248. data/lib/locales/ja/address.yml +120539 -0
  249. data/lib/locales/ja/adjective.yml +148 -0
  250. data/lib/locales/ja/ancient.yml +4 -0
  251. data/lib/locales/ja/animal.yml +5 -0
  252. data/lib/locales/ja/bank.yml +4 -0
  253. data/lib/locales/ja/book.yml +7 -0
  254. data/lib/locales/ja/cat.yml +5 -0
  255. data/lib/locales/ja/coffee.yml +4 -0
  256. data/lib/locales/ja/color.yml +4 -0
  257. data/lib/locales/ja/commerce.yml +11 -0
  258. data/lib/locales/ja/company.yml +8 -0
  259. data/lib/locales/ja/dog.yml +6 -0
  260. data/lib/locales/ja/emotion.yml +51 -0
  261. data/lib/locales/ja/food.yml +4 -0
  262. data/lib/locales/ja/football.yml +115 -0
  263. data/lib/locales/ja/gender.yml +4 -0
  264. data/lib/locales/ja/lorem.yml +9 -0
  265. data/lib/locales/ja/name.yml +13 -0
  266. data/lib/locales/ja/naruto.yml +230 -0
  267. data/lib/locales/ja/overwatch.yml +5 -0
  268. data/lib/locales/ja/phone_number.yml +7 -0
  269. data/lib/locales/ja/pokemon.yml +7 -0
  270. data/lib/locales/ja/relationship.yml +10 -0
  271. data/lib/locales/ja/restaurant.yml +11 -0
  272. data/lib/locales/ja/space.yml +5 -0
  273. data/lib/locales/ja/sport.yml +130 -0
  274. data/lib/locales/ja/studio_ghibli.yml +112 -0
  275. data/lib/locales/ja/subscription.yml +8 -0
  276. data/lib/locales/ja/super_mario.yml +9 -0
  277. data/lib/locales/ja/super_smash_bros.yml +8 -0
  278. data/lib/locales/ja/touhou.yml +466 -0
  279. data/lib/locales/ja/university.yml +9 -0
  280. data/lib/locales/ja/zelda.yml +5 -0
  281. data/lib/locales/ko.yml +1361 -20
  282. data/lib/locales/lt.yml +315 -0
  283. data/lib/locales/lv.yml +1 -2
  284. data/lib/locales/mi-NZ.yml +283 -0
  285. data/lib/locales/nb-NO.yml +518 -29
  286. data/lib/locales/nl.yml +1 -1
  287. data/lib/locales/pl.yml +1 -2
  288. data/lib/locales/pt-BR.yml +8157 -660
  289. data/lib/locales/pt.yml +844 -45
  290. data/lib/locales/ru.yml +1355 -32
  291. data/lib/locales/sk.yml +4410 -43
  292. data/lib/locales/sv.yml +100 -0
  293. data/lib/locales/th.yml +76 -76
  294. data/lib/locales/tr.yml +1 -2
  295. data/lib/locales/uk.yml +1808 -44
  296. data/lib/locales/vi.yml +1 -0
  297. data/lib/locales/zh-CN/bank.yml +17 -0
  298. data/lib/locales/zh-CN.yml +1 -0
  299. data/lib/locales/zh-TW.yml +1 -0
  300. metadata +134 -133
  301. data/History.md +0 -176
  302. data/lib/faker/default/fillmurray.rb +0 -45
  303. data/lib/faker/default/lorem_pixel.rb +0 -69
  304. data/lib/locales/ja.yml +0 -105
  305. /data/lib/faker/default/{faker_adjective.rb → adjective.rb} +0 -0
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Faker
4
- class IDNumber < Base
4
+ class IdNumber < Base
5
5
  CHECKS = 'TRWAGMYFPDXBNJZSQVHLCKE'
6
6
  INVALID_SSN = [
7
7
  /0{3}-\d{2}-\d{4}/,
@@ -25,7 +25,7 @@ module Faker
25
25
  # @return [String]
26
26
  #
27
27
  # @example
28
- # Faker::IDNumber.valid #=> "552-56-3593"
28
+ # Faker::IdNumber.valid #=> "552-56-3593"
29
29
  #
30
30
  # @faker.version 1.6.0
31
31
  def valid
@@ -38,7 +38,7 @@ module Faker
38
38
  # @return [String]
39
39
  #
40
40
  # @example
41
- # Faker::IDNumber.invalid #=> "311-72-0000"
41
+ # Faker::IdNumber.invalid #=> "311-72-0000"
42
42
  #
43
43
  # @faker.version 1.6.0
44
44
  def invalid
@@ -46,9 +46,23 @@ module Faker
46
46
  end
47
47
 
48
48
  def ssn_valid
49
- ssn = regexify(/[0-8]\d{2}-\d{2}-\d{4}/)
50
- # We could still have all 0s in one segment or another
51
- INVALID_SSN.any? { |regex| regex =~ ssn } ? ssn_valid : ssn
49
+ generate(:string) do |g|
50
+ g.computed(name: :first) do
51
+ range = [1..665, 667..899].sample(random: Faker::Config.random)
52
+ n = Faker::Base.rand(range)
53
+ format('%03d', n)
54
+ end
55
+ g.lit('-')
56
+ g.computed(name: :second) do
57
+ n = Faker::Base.rand(1..99)
58
+ format('%02d', n)
59
+ end
60
+ g.lit('-')
61
+ g.computed(name: :third) do
62
+ n = Faker::Base.rand(1..9999)
63
+ format('%04d', n)
64
+ end
65
+ end
52
66
  end
53
67
 
54
68
  ##
@@ -57,7 +71,7 @@ module Faker
57
71
  # @return [String]
58
72
  #
59
73
  # @example
60
- # Faker::IDNumber.spanish_citizen_number #=> "53290236-H"
74
+ # Faker::IdNumber.spanish_citizen_number #=> "53290236-H"
61
75
  #
62
76
  # @faker.version 1.9.0
63
77
  def spanish_citizen_number
@@ -73,7 +87,7 @@ module Faker
73
87
  # @return [String]
74
88
  #
75
89
  # @example
76
- # Faker::IDNumber.spanish_foreign_citizen_number #=> "Z-1600870-Y"
90
+ # Faker::IdNumber.spanish_foreign_citizen_number #=> "Z-1600870-Y"
77
91
  #
78
92
  # @faker.version 1.9.0
79
93
  def spanish_foreign_citizen_number
@@ -92,8 +106,8 @@ module Faker
92
106
  # @return [String]
93
107
  #
94
108
  # @example
95
- # Faker::IDNumber.south_african_id_number #=> "8105128870184"
96
- # Faker::IDNumber.valid_south_african_id_number #=> "8105128870184"
109
+ # Faker::IdNumber.south_african_id_number #=> "8105128870184"
110
+ # Faker::IdNumber.valid_south_african_id_number #=> "8105128870184"
97
111
  #
98
112
  # @faker.version 1.9.2
99
113
  def valid_south_african_id_number
@@ -115,7 +129,7 @@ module Faker
115
129
  # @return [String]
116
130
  #
117
131
  # @example
118
- # Faker::IDNumber.invalid_south_african_id_number #=> "1642972065088"
132
+ # Faker::IdNumber.invalid_south_african_id_number #=> "1642972065088"
119
133
  #
120
134
  # @faker.version 1.9.2
121
135
  def invalid_south_african_id_number
@@ -142,15 +156,11 @@ module Faker
142
156
  # @return [String]
143
157
  #
144
158
  # @example
145
- # Faker::IDNumber.brazilian_citizen_number #=> "53540542221"
146
- # Faker::IDNumber.brazilian_citizen_number(formatted: true) #=> "535.405.422-21"
159
+ # Faker::IdNumber.brazilian_citizen_number #=> "53540542221"
160
+ # Faker::IdNumber.brazilian_citizen_number(formatted: true) #=> "535.405.422-21"
147
161
  #
148
162
  # @faker.version 1.9.2
149
- def brazilian_citizen_number(legacy_formatted = NOT_GIVEN, formatted: false)
150
- warn_for_deprecated_arguments do |keywords|
151
- keywords << :formatted if legacy_formatted != NOT_GIVEN
152
- end
153
-
163
+ def brazilian_citizen_number(formatted: false)
154
164
  digits = Faker::Number.leading_zero_number(digits: 9) until digits&.match(/(\d)((?!\1)\d)+/)
155
165
  first_digit = brazilian_citizen_number_checksum_digit(digits)
156
166
  second_digit = brazilian_citizen_number_checksum_digit(digits + first_digit)
@@ -167,15 +177,11 @@ module Faker
167
177
  # @return [String]
168
178
  #
169
179
  # @example
170
- # Faker::IDNumber.brazilian_id #=> "493054029"
171
- # Faker::IDNumber.brazilian_id(formatted: true) #=> "49.305.402-9"
180
+ # Faker::IdNumber.brazilian_id #=> "493054029"
181
+ # Faker::IdNumber.brazilian_id(formatted: true) #=> "49.305.402-9"
172
182
  #
173
183
  # @faker.version 2.1.2
174
- def brazilian_id(legacy_formatted = NOT_GIVEN, formatted: false)
175
- warn_for_deprecated_arguments do |keywords|
176
- keywords << :formatted if legacy_formatted != NOT_GIVEN
177
- end
178
-
184
+ def brazilian_id(formatted: false)
179
185
  digits = Faker::Number.between(to: BRAZILIAN_ID_FROM, from: BRAZILIAN_ID_TO).to_s
180
186
  check_digit = brazilian_id_checksum_digit(digits)
181
187
  number = [digits, check_digit].join
@@ -190,7 +196,7 @@ module Faker
190
196
  # @return [String]
191
197
  #
192
198
  # @example
193
- # Faker::IDNumber.chilean_id #=> "15620613-K"
199
+ # Faker::IdNumber.chilean_id #=> "15620613-K"
194
200
  #
195
201
  # @faker.version 2.1.2
196
202
  def chilean_id
@@ -200,8 +206,108 @@ module Faker
200
206
  "#{digits}-#{verification_code}"
201
207
  end
202
208
 
209
+ ##
210
+ # Produces a random Croatian ID number (OIB).
211
+ #
212
+ # @param international [Boolean] Specifies whether to add international prefix.
213
+ # @return [String]
214
+ #
215
+ # @example
216
+ # Faker::IdNumber.croatian_id #=> "88467617508"
217
+ # Faker::IdNumber.croatian_id(international: true) #=> "HR88467617508"
218
+ #
219
+ # @faker.version next
220
+ def croatian_id(international: false)
221
+ prefix = international ? 'HR' : ''
222
+ digits = Faker::Number.number(digits: 10).to_s
223
+ checksum_digit = croatian_id_checksum_digit(digits)
224
+
225
+ "#{prefix}#{digits}#{checksum_digit}"
226
+ end
227
+
228
+ ##
229
+ # Produces a random Danish ID Number (CPR number).
230
+ # CPR number is 10 digits. Digit 1-6 is the birthdate (format "DDMMYY").
231
+ # Digit 7-10 is a sequence number.
232
+ # Digit 7 digit is a control digit that determines the century of birth.
233
+ # Digit 10 reveals the gender: # even is female, odd is male.
234
+ #
235
+ # @param formatted [Boolean] Specifies if the number is formatted with dividers.
236
+ # @param birthday [Date] Specifies the birthday for the id number.
237
+ # @param gender [Symbol] Specifies the gender for the id number. Must be one :male or :female if present.
238
+ # @return [String]
239
+ #
240
+ # @example
241
+ # Faker::IdNumber.danish_id_number #=> "0503909980"
242
+ # Faker::IdNumber.danish_id_number(formatted: true) #=> "050390-9980"
243
+ # Faker::IdNumber.danish_id_number(birthday: Date.new(1990, 3, 5)) #=> "0503909980"
244
+ # Faker::IdNumber.danish_id_number(gender: :female) #=> "0503909980"
245
+ #
246
+ # @faker.version next
247
+ def danish_id_number(formatted: false, birthday: Faker::Date.birthday, gender: nil)
248
+ valid_control_digits = danish_control_digits(birthday)
249
+ control_digit = sample(valid_control_digits)
250
+ digits = (0..9).to_a
251
+ gender = gender.to_sym if gender.respond_to?(:to_sym)
252
+ gender_digit = case gender
253
+ when nil
254
+ sample(digits)
255
+ when :male
256
+ sample(digits.select(&:odd?))
257
+ when :female
258
+ sample(digits.select(&:even?))
259
+ else
260
+ raise ArgumentError, "Invalid gender #{gender}. Must be one of male, female, or be omitted."
261
+ end
262
+
263
+ [
264
+ birthday.strftime('%d%m%y'),
265
+ formatted ? '-' : '',
266
+ control_digit,
267
+ Faker::Number.number(digits: 2),
268
+ gender_digit
269
+ ].join
270
+ end
271
+
272
+ ##
273
+ # Produces a random French social security number (INSEE number).
274
+ #
275
+ # @return [String]
276
+ #
277
+ # @example
278
+ # Faker::IdNumber.french_insee_number #=> "53290236-H"
279
+ #
280
+ # @faker.version next
281
+ def french_insee_number
282
+ num = [
283
+ [1, 2].sample(random: Faker::Config.random), # gender
284
+ Faker::Number.between(from: 0, to: 99).to_s.rjust(2, '0'), # year of birth
285
+ Faker::Number.between(from: 1, to: 12).to_s.rjust(2, '0'), # month of birth
286
+ Faker::Number.number(digits: 5), # place of birth
287
+ Faker::Number.number(digits: 3) # order number
288
+ ].join
289
+ mod = num.to_i % 97
290
+ check = (97 - mod).to_s.rjust(2, '0')
291
+ "#{num}#{check}"
292
+ end
293
+
203
294
  private
204
295
 
296
+ def croatian_id_checksum_digit(digits)
297
+ control_sum = 10
298
+
299
+ digits.chars.map(&:to_i).each do |digit|
300
+ control_sum += digit
301
+ control_sum %= 10
302
+ control_sum = 10 if control_sum.zero?
303
+ control_sum *= 2
304
+ control_sum %= 11
305
+ end
306
+
307
+ control_sum = 11 - control_sum
308
+ control_sum % 10
309
+ end
310
+
205
311
  def chilean_verification_code(digits)
206
312
  # First digit is multiplied by 3, second by 2, and so on
207
313
  multiplication_rule = [3, 2, 7, 6, 5, 4, 3, 2]
@@ -232,7 +338,7 @@ module Faker
232
338
  .with_index { |_, i| (i + 1).odd? }
233
339
 
234
340
  sum_of_odd_digits = odd_digits_without_last_character.map(&:to_i).reduce(:+)
235
- even_digits_times_two = (even_digits.join('').to_i * 2).to_s
341
+ even_digits_times_two = (even_digits.join.to_i * 2).to_s
236
342
  sum_of_even_digits = even_digits_times_two.chars.map(&:to_i).reduce(:+)
237
343
 
238
344
  total_sum = sum_of_odd_digits + sum_of_even_digits
@@ -271,9 +377,51 @@ module Faker
271
377
  digits.include?(subtraction) ? digits[subtraction] : subtraction.to_s
272
378
  end
273
379
 
380
+ def danish_control_digits(birthday)
381
+ year = birthday.year
382
+ century = year.to_s.slice(0, 2).to_i
383
+ year_digits = year.to_s.slice(2, 2).to_i
384
+ error_message = "Invalid birthday: #{birthday}. Danish CPR numbers are only distributed to persons born between 1858 and 2057."
385
+
386
+ case century
387
+ when 18
388
+ # If 5, 6, 7 or 8 and the year numbers are greater than or equal to 58, you were born in 18XX.
389
+ case year_digits
390
+ when 58..99
391
+ [5, 6, 7, 8]
392
+ else
393
+ raise ArgumentError, error_message
394
+ end
395
+ when 19
396
+ # If 0, 1, 2 or 3, you are always born in 19XX.
397
+ # If 4 or 9, you are born in 19XX if the year digits are greater than 36.
398
+
399
+ case year_digits
400
+ when 0..36
401
+ [0, 1, 2, 3]
402
+ else # 37..99
403
+ [0, 1, 2, 3, 4, 9]
404
+ end
405
+ else
406
+ # If 4, 5, 6, 7, 8 or 9 and the year digits are less than or equal to 36, you were born in 20XX.
407
+ # 5, 6, 7 and 8 are not distributed to persons, with year digits from and including 37 to and including 57.
408
+ case year_digits
409
+ when 0..36
410
+ [4, 5, 6, 7, 8, 9]
411
+ when 37..57
412
+ [5, 6, 7, 8]
413
+ else
414
+ raise ArgumentError, error_message
415
+ end
416
+ end
417
+ end
418
+
274
419
  def _translate(key)
275
420
  parse("id_number.#{key}")
276
421
  end
277
422
  end
278
423
  end
424
+
425
+ include Faker::Deprecator
426
+ deprecate_generator('IDNumber', IdNumber)
279
427
  end