ffaker 2.18.0 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +25 -0
  3. data/REFERENCE.md +1463 -1352
  4. data/ffaker.gemspec +1 -4
  5. data/lib/ffaker/address_au.rb +1 -1
  6. data/lib/ffaker/address_br.rb +15 -3
  7. data/lib/ffaker/address_ca.rb +1 -1
  8. data/lib/ffaker/address_it.rb +36 -0
  9. data/lib/ffaker/address_mx.rb +2 -8
  10. data/lib/ffaker/animal_br.rb +12 -0
  11. data/lib/ffaker/company.rb +3 -6
  12. data/lib/ffaker/company_fr.rb +35 -0
  13. data/lib/ffaker/{courses.rb → courses_fr.rb} +2 -0
  14. data/lib/ffaker/data/address_br/city +0 -1
  15. data/lib/ffaker/data/address_br/complement +3 -0
  16. data/lib/ffaker/data/address_br/neighborhood_prefixes +3 -0
  17. data/lib/ffaker/data/address_br/state +1 -1
  18. data/lib/ffaker/data/address_it/city +111 -0
  19. data/lib/ffaker/data/address_it/region +20 -0
  20. data/lib/ffaker/data/animal_br/common_names +423 -0
  21. data/lib/ffaker/data/food_pl/fermented +1 -1
  22. data/lib/ffaker/data/food_pl/fruits +1 -1
  23. data/lib/ffaker/data/food_pl/herbs +1 -1
  24. data/lib/ffaker/data/food_pl/meats +1 -1
  25. data/lib/ffaker/data/food_pl/preserves +1 -1
  26. data/lib/ffaker/data/food_pl/spices +1 -1
  27. data/lib/ffaker/data/food_pl/vegetables +1 -1
  28. data/lib/ffaker/data/game/adj_and_adv +18 -0
  29. data/lib/ffaker/data/game/category +84 -0
  30. data/lib/ffaker/data/game/mechanic +182 -0
  31. data/lib/ffaker/data/game/nouns +37 -0
  32. data/lib/ffaker/data/game/prefixes +17 -0
  33. data/lib/ffaker/data/job_it/job_adj +37 -0
  34. data/lib/ffaker/data/job_it/job_noun +25 -0
  35. data/lib/ffaker/data/job_it/job_prefix +22 -0
  36. data/lib/ffaker/data/lorem_br/characters +36 -0
  37. data/lib/ffaker/data/lorem_br/words +183 -0
  38. data/lib/ffaker/data/lorem_it/words +321 -0
  39. data/lib/ffaker/data/name/pronouns +1 -1
  40. data/lib/ffaker/data/name_ga/first_names_male +286 -286
  41. data/lib/ffaker/data/sport_ru/summer +68 -0
  42. data/lib/ffaker/data/sport_ru/winter +20 -0
  43. data/lib/ffaker/freedom_ipsum.rb +1 -1
  44. data/lib/ffaker/game.rb +33 -0
  45. data/lib/ffaker/gender_it.rb +17 -0
  46. data/lib/ffaker/gender_ru.rb +22 -0
  47. data/lib/ffaker/html_ipsum.rb +7 -1
  48. data/lib/ffaker/identification_it.rb +30 -0
  49. data/lib/ffaker/identification_tw.rb +3 -2
  50. data/lib/ffaker/job_it.rb +12 -0
  51. data/lib/ffaker/lorem_br.rb +45 -0
  52. data/lib/ffaker/lorem_it.rb +39 -0
  53. data/lib/ffaker/name_th_en.rb +1 -1
  54. data/lib/ffaker/number.rb +26 -0
  55. data/lib/ffaker/phone_number_it.rb +8 -6
  56. data/lib/ffaker/sport_ru.rb +25 -0
  57. data/lib/ffaker/ssn_se.rb +0 -19
  58. data/lib/ffaker/string.rb +6 -6
  59. data/lib/ffaker/time.rb +1 -1
  60. data/lib/ffaker/utils/array_utils.rb +1 -1
  61. data/lib/ffaker/utils/module_utils.rb +23 -3
  62. data/lib/ffaker/utils/unique_utils.rb +1 -0
  63. data/lib/ffaker/vehicle.rb +63 -1
  64. data/lib/ffaker.rb +15 -3
  65. data/lib/version.rb +1 -1
  66. data/scripts/profiling.rb +1 -1
  67. data/scripts/reference.rb +16 -15
  68. data/test/helper.rb +1 -1
  69. data/test/test_address.rb +1 -1
  70. data/test/test_address_au.rb +1 -1
  71. data/test/test_address_br.rb +16 -3
  72. data/test/test_address_ca.rb +1 -1
  73. data/test/test_address_ch.rb +1 -1
  74. data/test/test_address_ch_de.rb +1 -1
  75. data/test/test_address_ch_fr.rb +1 -1
  76. data/test/test_address_ch_it.rb +1 -1
  77. data/test/test_address_da.rb +1 -1
  78. data/test/test_address_de.rb +1 -1
  79. data/test/test_address_fi.rb +1 -1
  80. data/test/test_address_fr.rb +1 -1
  81. data/test/test_address_gr.rb +1 -1
  82. data/test/test_address_id.rb +1 -1
  83. data/test/test_address_in.rb +1 -1
  84. data/test/test_address_it.rb +12 -0
  85. data/test/test_address_ja.rb +1 -1
  86. data/test/test_address_kr.rb +1 -1
  87. data/test/test_address_mx.rb +1 -1
  88. data/test/test_address_nl.rb +1 -1
  89. data/test/test_address_pl.rb +1 -1
  90. data/test/test_address_ru.rb +1 -1
  91. data/test/test_address_se.rb +1 -1
  92. data/test/test_address_sn.rb +1 -1
  93. data/test/test_address_ua.rb +1 -1
  94. data/test/test_address_uk.rb +1 -1
  95. data/test/test_address_us.rb +1 -1
  96. data/test/test_airline.rb +1 -1
  97. data/test/test_animal.rb +1 -1
  98. data/test/test_animal_br.rb +17 -0
  99. data/test/test_animal_cn.rb +1 -1
  100. data/test/test_animal_es.rb +1 -1
  101. data/test/test_animal_pl.rb +1 -1
  102. data/test/test_animal_us.rb +1 -1
  103. data/test/test_array_utils.rb +2 -1
  104. data/test/test_avatar.rb +1 -1
  105. data/test/test_aws.rb +1 -1
  106. data/test/test_bacon_ipsum.rb +1 -1
  107. data/test/test_bank.rb +1 -1
  108. data/test/test_book.rb +1 -1
  109. data/test/test_boolean.rb +1 -1
  110. data/test/test_cheesy_lingo.rb +1 -1
  111. data/test/test_code.rb +1 -1
  112. data/test/test_color.rb +1 -1
  113. data/test/test_color_pl.rb +1 -1
  114. data/test/test_color_ua.rb +1 -1
  115. data/test/test_company.rb +1 -1
  116. data/test/test_company_cn.rb +1 -1
  117. data/test/test_company_fr.rb +33 -0
  118. data/test/test_company_it.rb +1 -1
  119. data/test/test_company_ja.rb +1 -1
  120. data/test/test_company_se.rb +1 -1
  121. data/test/test_conference.rb +1 -1
  122. data/test/test_course_mathematiques.rb +1 -1
  123. data/test/test_course_philosophie.rb +1 -1
  124. data/test/test_currency.rb +1 -1
  125. data/test/test_dizzle_ipsum.rb +1 -1
  126. data/test/test_education.rb +1 -1
  127. data/test/test_education_cn.rb +1 -1
  128. data/test/test_ffaker.rb +1 -1
  129. data/test/test_filesystem.rb +1 -1
  130. data/test/test_food.rb +1 -1
  131. data/test/test_food_pl.rb +1 -1
  132. data/test/test_freedom_ipsum.rb +1 -1
  133. data/test/test_game.rb +28 -0
  134. data/test/test_gender.rb +2 -2
  135. data/test/test_gender_br.rb +1 -1
  136. data/test/test_gender_cn.rb +1 -1
  137. data/test/test_gender_id.rb +1 -1
  138. data/test/test_gender_it.rb +27 -0
  139. data/test/test_gender_ja.rb +1 -1
  140. data/test/test_gender_jp.rb +1 -1
  141. data/test/test_gender_kr.rb +1 -1
  142. data/test/test_gender_pl.rb +1 -1
  143. data/test/test_gender_ru.rb +23 -0
  144. data/test/test_geolocation.rb +1 -1
  145. data/test/test_guid.rb +1 -1
  146. data/test/test_healthcare_ipsum.rb +1 -1
  147. data/test/test_healthcare_ru.rb +1 -1
  148. data/test/test_hipster_ipsum.rb +1 -1
  149. data/test/test_html_ipsum.rb +7 -1
  150. data/test/test_identification.rb +1 -1
  151. data/test/test_identification_br.rb +1 -1
  152. data/test/test_identification_co.rb +1 -1
  153. data/test/test_identification_es.rb +1 -1
  154. data/test/test_identification_es_cl.rb +1 -1
  155. data/test/test_identification_es_mx.rb +1 -1
  156. data/test/test_identification_in.rb +1 -1
  157. data/test/test_identification_it.rb +34 -0
  158. data/test/test_identification_kr.rb +1 -1
  159. data/test/test_identification_tw.rb +1 -1
  160. data/test/test_image.rb +1 -1
  161. data/test/test_internet.rb +1 -1
  162. data/test/test_internet_se.rb +1 -1
  163. data/test/test_job.rb +1 -1
  164. data/test/test_job_br.rb +1 -1
  165. data/test/test_job_cn.rb +1 -1
  166. data/test/test_job_fr.rb +1 -1
  167. data/test/test_job_it.rb +17 -0
  168. data/test/test_job_ja.rb +1 -1
  169. data/test/test_job_kr.rb +1 -1
  170. data/test/test_job_vn.rb +1 -1
  171. data/test/test_locale.rb +1 -1
  172. data/test/test_lorem.rb +1 -1
  173. data/test/test_lorem_ar.rb +1 -1
  174. data/test/test_lorem_br.rb +62 -0
  175. data/test/test_lorem_cn.rb +1 -1
  176. data/test/test_lorem_fr.rb +1 -1
  177. data/test/test_lorem_ie.rb +1 -1
  178. data/test/test_lorem_it.rb +51 -0
  179. data/test/test_lorem_ja.rb +1 -1
  180. data/test/test_lorem_kr.rb +1 -1
  181. data/test/test_lorem_pl.rb +1 -1
  182. data/test/test_lorem_ru.rb +1 -1
  183. data/test/test_lorem_ua.rb +1 -1
  184. data/test/test_module_utils.rb +1 -1
  185. data/test/test_movie.rb +1 -1
  186. data/test/test_music.rb +1 -1
  187. data/test/test_name.rb +1 -1
  188. data/test/test_name_ar.rb +1 -1
  189. data/test/test_name_br.rb +1 -1
  190. data/test/test_name_cn.rb +1 -1
  191. data/test/test_name_cs.rb +1 -1
  192. data/test/test_name_da.rb +1 -1
  193. data/test/test_name_de.rb +1 -1
  194. data/test/test_name_es.rb +1 -1
  195. data/test/test_name_fr.rb +1 -1
  196. data/test/test_name_ga.rb +1 -1
  197. data/test/test_name_gr.rb +1 -1
  198. data/test/test_name_id.rb +1 -1
  199. data/test/test_name_it.rb +1 -1
  200. data/test/test_name_ja.rb +1 -1
  201. data/test/test_name_kh.rb +1 -1
  202. data/test/test_name_kr.rb +1 -1
  203. data/test/test_name_mx.rb +1 -1
  204. data/test/test_name_nb.rb +1 -1
  205. data/test/test_name_nl.rb +1 -1
  206. data/test/test_name_ph.rb +1 -1
  207. data/test/test_name_pl.rb +1 -1
  208. data/test/test_name_ru.rb +1 -1
  209. data/test/test_name_se.rb +1 -1
  210. data/test/test_name_sn.rb +1 -1
  211. data/test/test_name_th.rb +1 -1
  212. data/test/test_name_th_en.rb +1 -1
  213. data/test/test_name_tw.rb +1 -1
  214. data/test/test_name_ua.rb +1 -1
  215. data/test/test_name_vn.rb +1 -1
  216. data/test/test_nato_alphabet.rb +1 -1
  217. data/test/test_number.rb +45 -0
  218. data/test/test_phone_number.rb +1 -1
  219. data/test/test_phone_number_au.rb +1 -1
  220. data/test/test_phone_number_br.rb +1 -1
  221. data/test/test_phone_number_cu.rb +1 -1
  222. data/test/test_phone_number_da.rb +1 -1
  223. data/test/test_phone_number_de.rb +1 -1
  224. data/test/test_phone_number_fr.rb +1 -1
  225. data/test/test_phone_number_id.rb +1 -1
  226. data/test/test_phone_number_it.rb +12 -0
  227. data/test/test_phone_number_ja.rb +1 -1
  228. data/test/test_phone_number_kr.rb +1 -1
  229. data/test/test_phone_number_mx.rb +1 -1
  230. data/test/test_phone_number_nl.rb +1 -1
  231. data/test/test_phone_number_pl.rb +1 -1
  232. data/test/test_phone_number_se.rb +1 -1
  233. data/test/test_phone_number_sg.rb +1 -1
  234. data/test/test_phone_number_sn.rb +1 -1
  235. data/test/test_phone_number_tw.rb +1 -1
  236. data/test/test_phone_number_ua.rb +1 -1
  237. data/test/test_products.rb +1 -1
  238. data/test/test_sem_ver.rb +1 -1
  239. data/test/test_skill.rb +1 -1
  240. data/test/test_sport_pl.rb +1 -1
  241. data/test/test_sport_ru.rb +30 -0
  242. data/test/test_sport_us.rb +1 -1
  243. data/test/test_sports.rb +1 -1
  244. data/test/test_ssn.rb +1 -1
  245. data/test/test_ssn_mx.rb +1 -1
  246. data/test/test_ssn_se.rb +1 -1
  247. data/test/test_string.rb +1 -1
  248. data/test/test_time.rb +1 -1
  249. data/test/test_tweet.rb +1 -1
  250. data/test/test_unique_utils.rb +1 -1
  251. data/test/test_units.rb +2 -1
  252. data/test/test_units_english.rb +1 -1
  253. data/test/test_units_metric.rb +1 -1
  254. data/test/test_vehicle.rb +7 -2
  255. data/test/test_venue.rb +1 -1
  256. data/test/test_youtube.rb +1 -1
  257. metadata +216 -160
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module Game
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ def title
9
+ case rand(0..1)
10
+ when 0 then simple_title
11
+ when 1 then title_with_prefix
12
+ end
13
+ end
14
+
15
+ def category
16
+ fetch_sample(CATEGORY)
17
+ end
18
+
19
+ def mechanic
20
+ fetch_sample(MECHANIC)
21
+ end
22
+
23
+ private
24
+
25
+ def simple_title
26
+ "#{fetch_sample(ADJ_AND_ADV)} #{fetch_sample(NOUNS)}"
27
+ end
28
+
29
+ def title_with_prefix
30
+ "#{fetch_sample(PREFIXES)} #{simple_title}"
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module GenderIT
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ GENDERS = %w[maschio femmina].freeze
9
+
10
+ def random
11
+ fetch_sample(GENDERS)
12
+ end
13
+
14
+ alias maybe random
15
+ alias sample random
16
+ end
17
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module GenderRU
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ GENDERS = %w[мужчина женщина нонбайнари агендер].freeze
9
+ BINARY_GENDERS = %w[мужчина женщина].freeze
10
+
11
+ def random
12
+ fetch_sample(GENDERS)
13
+ end
14
+
15
+ def binary
16
+ fetch_sample(BINARY_GENDERS)
17
+ end
18
+
19
+ alias maybe random
20
+ alias sample random
21
+ end
22
+ end
@@ -134,9 +134,15 @@ module FFaker
134
134
  a = k([
135
135
  content_tag_for(:strong, words(2).capitalize!),
136
136
  content_tag_for(:em, paragraph),
137
+ content_tag_for(:mark, paragraph),
138
+ content_tag_for(:del, words(2)),
139
+ content_tag_for(:ins, words(2)),
140
+ content_tag_for(:sub, words(2)),
141
+ content_tag_for(:sup, words(2)),
137
142
  content_tag_for(:code, words(2)),
143
+ content_tag_for(:small, words(2)),
138
144
  (a 2).to_s
139
- ] + FFaker::Lorem.paragraphs(count))
145
+ ] + FFaker::Lorem.paragraphs(count - 1))
140
146
  fetch_sample(a, count: count).join(sep)
141
147
  end
142
148
 
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module IdentificationIT
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ ETHNICITIES = [
9
+ 'Afroamericano', 'Asiatico/isolano del Pacifico', 'Caucasico', 'Ispanico', 'Nativo americano',
10
+ 'Multirazziale', 'Altro', 'Preferisco non rispondere'
11
+ ].freeze
12
+ GENDERS = %w[Maschio Femmina].freeze
13
+
14
+ def drivers_license
15
+ FFaker::String.from_regexp(/U1[1-9]\d{7}[A-Z]/)
16
+ end
17
+
18
+ def ssn
19
+ FFaker.numerify('####################')
20
+ end
21
+
22
+ def ethnicity
23
+ fetch_sample(ETHNICITIES)
24
+ end
25
+
26
+ def gender
27
+ fetch_sample(GENDERS)
28
+ end
29
+ end
30
+ end
@@ -5,7 +5,8 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- AREA_CODE = { a: 10, b: 11, c: 12, d: 13, e: 14, f: 15, g: 16, h: 17, i: 34, j: 18, k: 19, l: 20, m: 21, n: 22, o: 35, p: 23, q: 24, r: 25, s: 26, t: 27, u: 28, v: 29, w: 30, x: 31, y: 32, z: 33 }.freeze
8
+ AREA_CODE = { a: 10, b: 11, c: 12, d: 13, e: 14, f: 15, g: 16, h: 17, i: 34, j: 18, k: 19, l: 20, m: 21, n: 22,
9
+ o: 35, p: 23, q: 24, r: 25, s: 26, t: 27, u: 28, v: 29, w: 32, x: 30, y: 31, z: 33 }.freeze
9
10
 
10
11
  # Identity Card Number
11
12
  # https://en.wikipedia.org/wiki/National_identification_card_(Taiwan)#Identity_card_number
@@ -14,7 +15,7 @@ module FFaker
14
15
  code = AREA_CODE[letter.to_sym]
15
16
  gender = fetch_sample([1, 2])
16
17
  serial = FFaker.numerify('#######')
17
- a, b, c, d, e, f, g, h, i, j = "#{code}#{gender}#{serial}".split(//).map(&:to_i)
18
+ a, b, c, d, e, f, g, h, i, j = "#{code}#{gender}#{serial}".chars.map(&:to_i)
18
19
 
19
20
  checksum = (9 * a + b + 2 * c + 3 * d + 4 * e + 5 * f + 6 * g + 7 * h + 8 * i + 9 * j) % 10
20
21
  "#{letter.upcase}#{gender}#{serial}#{checksum}"
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module JobIT
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ def title
9
+ "#{fetch_sample(JOB_PREFIX)} #{fetch_sample(JOB_ADJ)} #{fetch_sample(JOB_NOUN)}"
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ # Based on Perl's Text::Lorem
5
+ module LoremBR
6
+ extend ModuleUtils
7
+ extend self
8
+
9
+ def characters(character_count = 255)
10
+ character_count = 0 if character_count.negative?
11
+ Array.new(character_count).map { fetch_sample(CHARACTERS) }.join
12
+ end
13
+
14
+ def word
15
+ fetch_sample(WORDS)
16
+ end
17
+
18
+ def words(num = 3)
19
+ fetch_sample(WORDS, count: num)
20
+ end
21
+
22
+ def sentence(word_count = 4)
23
+ first_word, *last_words = words(word_count + rand(1..5))
24
+ return "#{first_word.capitalize} #{last_words.join(' ')}." if last_words
25
+
26
+ first_word.capitalize
27
+ end
28
+
29
+ alias phrase sentence
30
+
31
+ def sentences(sentence_count = 3)
32
+ (1..sentence_count).map { sentence }
33
+ end
34
+
35
+ alias phrases sentences
36
+
37
+ def paragraph(sentence_count = 3)
38
+ sentences(sentence_count + rand(0..2)).join(' ')
39
+ end
40
+
41
+ def paragraphs(paragraph_count = 3)
42
+ (1..paragraph_count).map { paragraph }
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module LoremIT
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ def word
9
+ fetch_sample(WORDS)
10
+ end
11
+
12
+ def words(num = 3)
13
+ fetch_sample(WORDS, count: num)
14
+ end
15
+
16
+ def sentence(word_count = 4)
17
+ s = words(word_count + rand(0..5))
18
+ s = s.join(' ')
19
+ s.capitalize!
20
+ "#{s}."
21
+ end
22
+
23
+ alias phrase sentence
24
+
25
+ def sentences(sentence_count = 3)
26
+ (1..sentence_count).map { sentence }
27
+ end
28
+
29
+ alias phrases sentences
30
+
31
+ def paragraph(sentence_count = 3)
32
+ sentences(sentence_count + rand(0..2)).join(' ')
33
+ end
34
+
35
+ def paragraphs(paragraph_count = 3)
36
+ (1..paragraph_count).map { paragraph }
37
+ end
38
+ end
39
+ end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffaker/name_th'
3
+ require_relative 'name_th'
4
4
 
5
5
  module FFaker
6
6
  module NameTHEN
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ module Number
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ def number(digits: 1)
9
+ FFaker.numerify(generate_pattern(digits)).to_i
10
+ end
11
+
12
+ def decimal(whole_digits: 1, fractional_digits: 1)
13
+ whole_part_pattern = generate_pattern(whole_digits)
14
+ fractional_part_pattern = generate_pattern(fractional_digits).reverse
15
+ FFaker.numerify("#{whole_part_pattern}.#{fractional_part_pattern}").to_f
16
+ end
17
+
18
+ private
19
+
20
+ def generate_pattern(digits)
21
+ raise ArgumentError.new('Digits cannot be less than 1') if digits < 1
22
+
23
+ "#{fetch_sample(1..9)}#{"#" * (digits - 1)}"
24
+ end
25
+ end
26
+ end
@@ -24,15 +24,17 @@ module FFaker
24
24
  number MOBILE_PHONE_PREFIXES
25
25
  end
26
26
 
27
+ private
28
+
27
29
  def number(prefixes)
28
- p = [
29
- COUNTRY_PREFIX.sample,
30
- prefixes.sample,
30
+ pattern = [
31
+ fetch_sample(COUNTRY_PREFIX),
32
+ fetch_sample(prefixes),
31
33
  random_space,
32
- PHONE_NUMBER.sample
33
- ].join('')
34
+ fetch_sample(PHONE_NUMBER)
35
+ ].join
34
36
 
35
- FFaker.numerify p
37
+ FFaker.numerify(pattern)
36
38
  end
37
39
 
38
40
  def random_space
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module FFaker
4
+ # Inspirations:
5
+ # https://olympic.ru/team/sport/
6
+ # http://ru.sport-wiki.org/vidy-sporta/
7
+ module SportRU
8
+ extend ModuleUtils
9
+ extend self
10
+
11
+ ALL = SUMMER + WINTER
12
+
13
+ def name
14
+ fetch_sample(ALL)
15
+ end
16
+
17
+ def summer
18
+ fetch_sample(SUMMER)
19
+ end
20
+
21
+ def winter
22
+ fetch_sample(WINTER)
23
+ end
24
+ end
25
+ end
data/lib/ffaker/ssn_se.rb CHANGED
@@ -76,24 +76,5 @@ module FFaker
76
76
  def three_character_string(number)
77
77
  format('%03d', number)
78
78
  end
79
-
80
- # http://en.wikipedia.org/wiki/Luhn_algorithm
81
- def luhn_check(number)
82
- multiplications = []
83
-
84
- number.split(//).each_with_index do |digit, i|
85
- multiplications << i.even? ? digit.to_i * 2 : digit.to_i
86
- end
87
-
88
- sum = 0
89
- multiplications.each do |num|
90
- num.to_s.each_byte do |character|
91
- sum += character.chr.to_i
92
- end
93
- end
94
-
95
- control_digit = (sum % 10).zero? ? 0 : (sum / 10 + 1) * 10 - sum
96
- control_digit.to_s
97
- end
98
79
  end
99
80
  end
data/lib/ffaker/string.rb CHANGED
@@ -53,15 +53,15 @@ module FFaker
53
53
  when '?'
54
54
  # TODO: Let ? generate nothing
55
55
  '' # We already printed its target
56
- when '+' then
56
+ when '+'
57
57
  tokens.unshift(token) if rand(0..1) == 1 # Leave the `+` on to run again
58
58
  process_token(@last_token) # Run the last one at least once
59
- when '*' then
59
+ when '*'
60
60
  tokens.unshift(token) if rand(0..1) == 1 # Leave the `*` on to run again
61
61
  return '' if rand(0..1) == 1 # Or maybe do nothing
62
62
 
63
63
  process_token(@last_token) # Else run the last one again
64
- when '{' then
64
+ when '{'
65
65
  number = +''
66
66
  while (ch = tokens.shift) != '}'
67
67
  number << ch
@@ -76,14 +76,14 @@ module FFaker
76
76
 
77
77
  def generate_token(token, tokens)
78
78
  case token
79
- when /\w/ then
79
+ when /\w/
80
80
  @last_token = [token]
81
81
  token
82
- when BACKSLASH then
82
+ when BACKSLASH
83
83
  token = tokens.shift
84
84
  @last_token = ['\\', token]
85
85
  special(token)
86
- when '[' then
86
+ when '['
87
87
  set = []
88
88
  while (ch = tokens.shift) != ']'
89
89
  set << ch
data/lib/ffaker/time.rb CHANGED
@@ -22,7 +22,7 @@ module FFaker
22
22
 
23
23
  def datetime(params = {})
24
24
  years_back = params[:year_range] || 5
25
- latest_year = params [:year_latest] || 0
25
+ latest_year = params[:year_latest] || 0
26
26
  year = (rand * years_back).ceil + (::DateTime.now.year - latest_year - years_back)
27
27
  month = rand(1..12)
28
28
  day = rand(1..Date.new(year, month, -1).day)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffaker/utils/random_utils'
3
+ require_relative 'random_utils'
4
4
 
5
5
  module FFaker
6
6
  module ArrayUtils
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffaker/utils/array_utils'
4
- require 'ffaker/utils/random_utils'
5
- require 'ffaker/utils/unique_utils'
3
+ require_relative 'array_utils'
4
+ require_relative 'random_utils'
5
+ require_relative 'unique_utils'
6
6
 
7
7
  module FFaker
8
8
  module ModuleUtils
@@ -35,5 +35,25 @@ module FFaker
35
35
  def unique(max_retries = 10_000)
36
36
  @unique_generator ||= FFaker::UniqueUtils.new(self, max_retries)
37
37
  end
38
+
39
+ # http://en.wikipedia.org/wiki/Luhn_algorithm
40
+ def luhn_check(number)
41
+ multiplications = []
42
+
43
+ number.split(//).each_with_index do |digit, i|
44
+ multiplications << i.even? ? digit.to_i * 2 : digit.to_i
45
+ end
46
+
47
+ sum = 0
48
+ multiplications.each do |num|
49
+ num.to_s.each_byte do |character|
50
+ sum += character.chr.to_i
51
+ end
52
+ end
53
+
54
+ control_digit = (sum % 10).zero? ? 0 : (sum / 10 + 1) * 10 - sum
55
+ control_digit.to_s
56
+ end
57
+
38
58
  end
39
59
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'set'
2
3
 
3
4
  module FFaker
4
5
  class UniqueUtils
@@ -2,6 +2,68 @@
2
2
 
3
3
  module FFaker
4
4
  module Vehicle
5
+ module VIN
6
+ extend ModuleUtils
7
+ extend self
8
+
9
+ # https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/World_Manufacturer_Identifier_(WMI)
10
+ VALID_WMI_REGIONS = [*'A'..'C', *'J'..'Z', *'1'..'9'].freeze
11
+
12
+ VALID_YEAR_CHARS = %w[
13
+ 5 6 7 8 9 A B C D E F G H J K L M N P R S T V W X Y 1 2 3 4 5 6 7 8 9
14
+ ].freeze # 2005-2039
15
+
16
+ # https://en.wikibooks.org/wiki/Vehicle_Identification_Numbers_(VIN_codes)/Check_digit
17
+ TRANSLITERATION_VALUES = {
18
+ 'A' => 1, 'B' => 2, 'C' => 3, 'D' => 4, 'E' => 5, 'F' => 6, 'G' => 7, 'H' => 8,
19
+ 'J' => 1, 'K' => 2, 'L' => 3, 'M' => 4, 'N' => 5, 'P' => 7, 'R' => 9,
20
+ 'S' => 2, 'T' => 3, 'U' => 4, 'V' => 5, 'W' => 6, 'X' => 7, 'Y' => 8, 'Z' => 9
21
+ }.freeze
22
+ POSITION_WEIGHTS = [8, 7, 6, 5, 4, 3, 2, 10, 0, 9, 8, 7, 6, 5, 4, 3, 2].freeze
23
+
24
+ VALID_ALPHA = TRANSLITERATION_VALUES.keys
25
+ VALID_ALPHANUMERIC = [*VALID_ALPHA, *'1'..'9'].freeze
26
+
27
+ # Generate a VIN that is compliant with specifications of US Title 49 Section 565.15
28
+ # https://www.govinfo.gov/content/pkg/CFR-2019-title49-vol6/xml/CFR-2019-title49-vol6-part565.xml#seqnum565.15
29
+ #
30
+ # Position Meaning
31
+ # 1-3 Manufacturer ID aka WMI (alpha and digits)
32
+ # 4-8 Vehicle Description ("For passenger cars ..[position 7].. shall be alphabetic")
33
+ # 9 Check Digit (0-9 or "X")
34
+ # 10 Year (see VIN_VALID_YEARS)
35
+ # 11 Plant of manufacture (alpha and digits)
36
+ # 12-17 Serial number (digits only)
37
+ #
38
+ # I, O and Q are NOT allowed. VIN_VALID_ALPHA has valid alpha characters.
39
+ def vin
40
+ generated_vin = [
41
+ # Manufacturer ID / WMI
42
+ fetch_sample(VALID_WMI_REGIONS),
43
+ fetch_sample(VALID_ALPHANUMERIC, count: 2),
44
+ # Vehicle Description
45
+ fetch_sample(VALID_ALPHANUMERIC, count: 3),
46
+ fetch_sample(VALID_ALPHA),
47
+ fetch_sample(VALID_ALPHANUMERIC),
48
+ '0', # check digit placeholder
49
+ fetch_sample(VALID_YEAR_CHARS), # Year of Manufacture
50
+ fetch_sample(VALID_ALPHANUMERIC), # Plant ID
51
+ FFaker.numerify('######') # Serial Number
52
+ ].join
53
+
54
+ # Calculate the Check Digit
55
+ weighted_sum = generated_vin.chars.each_with_index.sum do |char, idx|
56
+ (TRANSLITERATION_VALUES[char.to_sym] || char).to_i * POSITION_WEIGHTS[idx]
57
+ end
58
+
59
+ check_digit = weighted_sum % 11
60
+ check_digit = 'X' if check_digit == 10
61
+ generated_vin[8] = check_digit.to_s
62
+
63
+ generated_vin
64
+ end
65
+ end
66
+
5
67
  extend ModuleUtils
6
68
  extend self
7
69
 
@@ -37,7 +99,7 @@ module FFaker
37
99
  end
38
100
 
39
101
  def vin
40
- FFaker.bothify('1#???#####?######').upcase
102
+ VIN.vin
41
103
  end
42
104
 
43
105
  def year
data/lib/ffaker.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FFaker
4
- require 'ffaker/utils/array_utils'
5
- require 'ffaker/utils/module_utils'
4
+ require_relative 'ffaker/utils/array_utils'
5
+ require_relative 'ffaker/utils/module_utils'
6
6
 
7
7
  extend ModuleUtils
8
8
 
@@ -43,6 +43,7 @@ module FFaker
43
43
  autoload :AddressGR, 'ffaker/address_gr'
44
44
  autoload :AddressID, 'ffaker/address_id'
45
45
  autoload :AddressIN, 'ffaker/address_in'
46
+ autoload :AddressIT, 'ffaker/address_it'
46
47
  autoload :AddressJA, 'ffaker/address_ja'
47
48
  autoload :AddressKR, 'ffaker/address_kr'
48
49
  autoload :AddressMX, 'ffaker/address_mx'
@@ -56,6 +57,7 @@ module FFaker
56
57
  autoload :AddressUS, 'ffaker/address_us'
57
58
  autoload :Airline, 'ffaker/airline'
58
59
  autoload :Animal, 'ffaker/animal'
60
+ autoload :AnimalBR, 'ffaker/animal_br'
59
61
  autoload :AnimalCN, 'ffaker/animal_cn'
60
62
  autoload :AnimalES, 'ffaker/animal_es'
61
63
  autoload :AnimalPL, 'ffaker/animal_pl'
@@ -73,11 +75,12 @@ module FFaker
73
75
  autoload :ColorUA, 'ffaker/color_ua'
74
76
  autoload :Company, 'ffaker/company'
75
77
  autoload :CompanyCN, 'ffaker/company_cn'
78
+ autoload :CompanyFR, 'ffaker/company_fr'
76
79
  autoload :CompanyIT, 'ffaker/company_it'
77
80
  autoload :CompanyJA, 'ffaker/company_ja'
78
81
  autoload :CompanySE, 'ffaker/company_se'
79
82
  autoload :Conference, 'ffaker/conference'
80
- autoload :CoursesFR, 'ffaker/courses'
83
+ autoload :CoursesFR, 'ffaker/courses_fr'
81
84
  autoload :Currency, 'ffaker/currency'
82
85
  autoload :DizzleIpsum, 'ffaker/dizzle_ipsum'
83
86
  autoload :Education, 'ffaker/education'
@@ -86,14 +89,17 @@ module FFaker
86
89
  autoload :Food, 'ffaker/food'
87
90
  autoload :FoodPL, 'ffaker/food_pl'
88
91
  autoload :FreedomIpsum, 'ffaker/freedom_ipsum'
92
+ autoload :Game, 'ffaker/game'
89
93
  autoload :Gender, 'ffaker/gender'
90
94
  autoload :GenderBR, 'ffaker/gender_br'
91
95
  autoload :GenderCN, 'ffaker/gender_cn'
92
96
  autoload :GenderID, 'ffaker/gender_id'
97
+ autoload :GenderIT, 'ffaker/gender_it'
93
98
  autoload :GenderJA, 'ffaker/gender_ja'
94
99
  autoload :GenderJP, 'ffaker/gender_jp'
95
100
  autoload :GenderKR, 'ffaker/gender_kr'
96
101
  autoload :GenderPL, 'ffaker/gender_pl'
102
+ autoload :GenderRU, 'ffaker/gender_ru'
97
103
  autoload :Geolocation, 'ffaker/geolocation'
98
104
  autoload :Guid, 'ffaker/guid'
99
105
  autoload :HealthcareIpsum, 'ffaker/healthcare_ipsum'
@@ -106,6 +112,7 @@ module FFaker
106
112
  autoload :IdentificationESCL, 'ffaker/identification_es_cl'
107
113
  autoload :IdentificationESCO, 'ffaker/identification_es_co'
108
114
  autoload :IdentificationIN, 'ffaker/identification_in'
115
+ autoload :IdentificationIT, 'ffaker/identification_it'
109
116
  autoload :IdentificationKr, 'ffaker/identification_kr'
110
117
  autoload :IdentificationMX, 'ffaker/identification_mx'
111
118
  autoload :IdentificationPL, 'ffaker/identification_pl'
@@ -117,15 +124,18 @@ module FFaker
117
124
  autoload :JobBR, 'ffaker/job_br'
118
125
  autoload :JobCN, 'ffaker/job_cn'
119
126
  autoload :JobFR, 'ffaker/job_fr'
127
+ autoload :JobIT, 'ffaker/job_it'
120
128
  autoload :JobJA, 'ffaker/job_ja'
121
129
  autoload :JobKR, 'ffaker/job_kr'
122
130
  autoload :JobVN, 'ffaker/job_vn'
123
131
  autoload :Locale, 'ffaker/locale'
124
132
  autoload :Lorem, 'ffaker/lorem'
125
133
  autoload :LoremAR, 'ffaker/lorem_ar'
134
+ autoload :LoremBR, 'ffaker/lorem_br'
126
135
  autoload :LoremCN, 'ffaker/lorem_cn'
127
136
  autoload :LoremFR, 'ffaker/lorem_fr'
128
137
  autoload :LoremIE, 'ffaker/lorem_ie'
138
+ autoload :LoremIT, 'ffaker/lorem_it'
129
139
  autoload :LoremJA, 'ffaker/lorem_ja'
130
140
  autoload :LoremKR, 'ffaker/lorem_kr'
131
141
  autoload :LoremPL, 'ffaker/lorem_pl'
@@ -164,6 +174,7 @@ module FFaker
164
174
  autoload :NameUA, 'ffaker/name_ua'
165
175
  autoload :NameVN, 'ffaker/name_vn'
166
176
  autoload :NatoAlphabet, 'ffaker/nato_alphabet'
177
+ autoload :Number, 'ffaker/number'
167
178
  autoload :PhoneNumber, 'ffaker/phone_number'
168
179
  autoload :PhoneNumberAU, 'ffaker/phone_number_au'
169
180
  autoload :PhoneNumberBR, 'ffaker/phone_number_br'
@@ -191,6 +202,7 @@ module FFaker
191
202
  autoload :Sport, 'ffaker/sport'
192
203
  autoload :SportPL, 'ffaker/sport_pl'
193
204
  autoload :SportUS, 'ffaker/sport_us'
205
+ autoload :SportRU, 'ffaker/sport_ru'
194
206
  autoload :SSN, 'ffaker/ssn'
195
207
  autoload :SSNMX, 'ffaker/ssn_mx'
196
208
  autoload :SSNSE, 'ffaker/ssn_se'
data/lib/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module FFaker
4
- VERSION = '2.18.0'
4
+ VERSION = '2.21.0'
5
5
  end
data/scripts/profiling.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require File.dirname(__FILE__) + '/../lib/faker'
3
+ require_relative '../lib/faker'
4
4
 
5
5
  N = 1_000_000
6
6