ffaker 2.18.0 → 2.19.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 (241) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +10 -0
  3. data/REFERENCE.md +1406 -1302
  4. data/ffaker.gemspec +2 -4
  5. data/lib/ffaker.rb +13 -3
  6. data/lib/ffaker/address_au.rb +1 -1
  7. data/lib/ffaker/address_br.rb +1 -1
  8. data/lib/ffaker/address_ca.rb +1 -1
  9. data/lib/ffaker/address_it.rb +37 -0
  10. data/lib/ffaker/address_mx.rb +2 -8
  11. data/lib/ffaker/company_fr.rb +35 -0
  12. data/lib/ffaker/{courses.rb → courses_fr.rb} +2 -0
  13. data/lib/ffaker/data/address_br/city +0 -1
  14. data/lib/ffaker/data/address_br/state +1 -1
  15. data/lib/ffaker/data/address_it/city +111 -0
  16. data/lib/ffaker/data/address_it/region +20 -0
  17. data/lib/ffaker/data/food_pl/fermented +1 -1
  18. data/lib/ffaker/data/food_pl/fruits +1 -1
  19. data/lib/ffaker/data/food_pl/herbs +1 -1
  20. data/lib/ffaker/data/food_pl/meats +1 -1
  21. data/lib/ffaker/data/food_pl/preserves +1 -1
  22. data/lib/ffaker/data/food_pl/spices +1 -1
  23. data/lib/ffaker/data/food_pl/vegetables +1 -1
  24. data/lib/ffaker/data/game/adj_and_adv +18 -0
  25. data/lib/ffaker/data/game/category +84 -0
  26. data/lib/ffaker/data/game/mechanic +182 -0
  27. data/lib/ffaker/data/game/nouns +37 -0
  28. data/lib/ffaker/data/game/prefixes +17 -0
  29. data/lib/ffaker/data/job_it/job_adj +37 -0
  30. data/lib/ffaker/data/job_it/job_noun +25 -0
  31. data/lib/ffaker/data/job_it/job_prefix +22 -0
  32. data/lib/ffaker/data/lorem_br/characters +36 -0
  33. data/lib/ffaker/data/lorem_br/words +183 -0
  34. data/lib/ffaker/data/lorem_it/words +321 -0
  35. data/lib/ffaker/data/name/pronouns +1 -1
  36. data/lib/ffaker/data/name_ga/first_names_male +286 -286
  37. data/lib/ffaker/data/sport_ru/summer +68 -0
  38. data/lib/ffaker/data/sport_ru/winter +20 -0
  39. data/lib/ffaker/freedom_ipsum.rb +1 -1
  40. data/lib/ffaker/game.rb +33 -0
  41. data/lib/ffaker/gender_it.rb +17 -0
  42. data/lib/ffaker/gender_ru.rb +22 -0
  43. data/lib/ffaker/identification_it.rb +30 -0
  44. data/lib/ffaker/job_it.rb +12 -0
  45. data/lib/ffaker/lorem_br.rb +45 -0
  46. data/lib/ffaker/lorem_it.rb +39 -0
  47. data/lib/ffaker/name_th_en.rb +1 -1
  48. data/lib/ffaker/sport_ru.rb +25 -0
  49. data/lib/ffaker/ssn_se.rb +0 -19
  50. data/lib/ffaker/utils/array_utils.rb +1 -1
  51. data/lib/ffaker/utils/module_utils.rb +23 -3
  52. data/lib/version.rb +1 -1
  53. data/scripts/profiling.rb +1 -1
  54. data/scripts/reference.rb +2 -3
  55. data/test/helper.rb +1 -1
  56. data/test/test_address.rb +1 -1
  57. data/test/test_address_au.rb +1 -1
  58. data/test/test_address_br.rb +1 -1
  59. data/test/test_address_ca.rb +1 -1
  60. data/test/test_address_ch.rb +1 -1
  61. data/test/test_address_ch_de.rb +1 -1
  62. data/test/test_address_ch_fr.rb +1 -1
  63. data/test/test_address_ch_it.rb +1 -1
  64. data/test/test_address_da.rb +1 -1
  65. data/test/test_address_de.rb +1 -1
  66. data/test/test_address_fi.rb +1 -1
  67. data/test/test_address_fr.rb +1 -1
  68. data/test/test_address_gr.rb +1 -1
  69. data/test/test_address_id.rb +1 -1
  70. data/test/test_address_in.rb +1 -1
  71. data/test/test_address_it.rb +12 -0
  72. data/test/test_address_ja.rb +1 -1
  73. data/test/test_address_kr.rb +1 -1
  74. data/test/test_address_mx.rb +1 -1
  75. data/test/test_address_nl.rb +1 -1
  76. data/test/test_address_pl.rb +1 -1
  77. data/test/test_address_ru.rb +1 -1
  78. data/test/test_address_se.rb +1 -1
  79. data/test/test_address_sn.rb +1 -1
  80. data/test/test_address_ua.rb +1 -1
  81. data/test/test_address_uk.rb +1 -1
  82. data/test/test_address_us.rb +1 -1
  83. data/test/test_airline.rb +1 -1
  84. data/test/test_animal.rb +1 -1
  85. data/test/test_animal_cn.rb +1 -1
  86. data/test/test_animal_es.rb +1 -1
  87. data/test/test_animal_pl.rb +1 -1
  88. data/test/test_animal_us.rb +1 -1
  89. data/test/test_array_utils.rb +2 -1
  90. data/test/test_avatar.rb +1 -1
  91. data/test/test_aws.rb +1 -1
  92. data/test/test_bacon_ipsum.rb +1 -1
  93. data/test/test_bank.rb +1 -1
  94. data/test/test_book.rb +1 -1
  95. data/test/test_boolean.rb +1 -1
  96. data/test/test_cheesy_lingo.rb +1 -1
  97. data/test/test_code.rb +1 -1
  98. data/test/test_color.rb +1 -1
  99. data/test/test_color_pl.rb +1 -1
  100. data/test/test_color_ua.rb +1 -1
  101. data/test/test_company.rb +1 -1
  102. data/test/test_company_cn.rb +1 -1
  103. data/test/test_company_fr.rb +33 -0
  104. data/test/test_company_it.rb +1 -1
  105. data/test/test_company_ja.rb +1 -1
  106. data/test/test_company_se.rb +1 -1
  107. data/test/test_conference.rb +1 -1
  108. data/test/test_course_mathematiques.rb +1 -1
  109. data/test/test_course_philosophie.rb +1 -1
  110. data/test/test_currency.rb +1 -1
  111. data/test/test_dizzle_ipsum.rb +1 -1
  112. data/test/test_education.rb +1 -1
  113. data/test/test_education_cn.rb +1 -1
  114. data/test/test_ffaker.rb +1 -1
  115. data/test/test_filesystem.rb +1 -1
  116. data/test/test_food.rb +1 -1
  117. data/test/test_food_pl.rb +1 -1
  118. data/test/test_freedom_ipsum.rb +1 -1
  119. data/test/test_game.rb +28 -0
  120. data/test/test_gender.rb +2 -2
  121. data/test/test_gender_br.rb +1 -1
  122. data/test/test_gender_cn.rb +1 -1
  123. data/test/test_gender_id.rb +1 -1
  124. data/test/test_gender_it.rb +27 -0
  125. data/test/test_gender_ja.rb +1 -1
  126. data/test/test_gender_jp.rb +1 -1
  127. data/test/test_gender_kr.rb +1 -1
  128. data/test/test_gender_pl.rb +1 -1
  129. data/test/test_gender_ru.rb +23 -0
  130. data/test/test_geolocation.rb +1 -1
  131. data/test/test_guid.rb +1 -1
  132. data/test/test_healthcare_ipsum.rb +1 -1
  133. data/test/test_healthcare_ru.rb +1 -1
  134. data/test/test_hipster_ipsum.rb +1 -1
  135. data/test/test_html_ipsum.rb +1 -1
  136. data/test/test_identification.rb +1 -1
  137. data/test/test_identification_br.rb +1 -1
  138. data/test/test_identification_co.rb +1 -1
  139. data/test/test_identification_es.rb +1 -1
  140. data/test/test_identification_es_cl.rb +1 -1
  141. data/test/test_identification_es_mx.rb +1 -1
  142. data/test/test_identification_in.rb +1 -1
  143. data/test/test_identification_it.rb +34 -0
  144. data/test/test_identification_kr.rb +1 -1
  145. data/test/test_identification_tw.rb +1 -1
  146. data/test/test_image.rb +1 -1
  147. data/test/test_internet.rb +1 -1
  148. data/test/test_internet_se.rb +1 -1
  149. data/test/test_job.rb +1 -1
  150. data/test/test_job_br.rb +1 -1
  151. data/test/test_job_cn.rb +1 -1
  152. data/test/test_job_fr.rb +1 -1
  153. data/test/test_job_it.rb +17 -0
  154. data/test/test_job_ja.rb +1 -1
  155. data/test/test_job_kr.rb +1 -1
  156. data/test/test_job_vn.rb +1 -1
  157. data/test/test_locale.rb +1 -1
  158. data/test/test_lorem.rb +1 -1
  159. data/test/test_lorem_ar.rb +1 -1
  160. data/test/test_lorem_br.rb +62 -0
  161. data/test/test_lorem_cn.rb +1 -1
  162. data/test/test_lorem_fr.rb +1 -1
  163. data/test/test_lorem_ie.rb +1 -1
  164. data/test/test_lorem_it.rb +51 -0
  165. data/test/test_lorem_ja.rb +1 -1
  166. data/test/test_lorem_kr.rb +1 -1
  167. data/test/test_lorem_pl.rb +1 -1
  168. data/test/test_lorem_ru.rb +1 -1
  169. data/test/test_lorem_ua.rb +1 -1
  170. data/test/test_module_utils.rb +1 -1
  171. data/test/test_movie.rb +1 -1
  172. data/test/test_music.rb +1 -1
  173. data/test/test_name.rb +1 -1
  174. data/test/test_name_ar.rb +1 -1
  175. data/test/test_name_br.rb +1 -1
  176. data/test/test_name_cn.rb +1 -1
  177. data/test/test_name_cs.rb +1 -1
  178. data/test/test_name_da.rb +1 -1
  179. data/test/test_name_de.rb +1 -1
  180. data/test/test_name_es.rb +1 -1
  181. data/test/test_name_fr.rb +1 -1
  182. data/test/test_name_ga.rb +1 -1
  183. data/test/test_name_gr.rb +1 -1
  184. data/test/test_name_id.rb +1 -1
  185. data/test/test_name_it.rb +1 -1
  186. data/test/test_name_ja.rb +1 -1
  187. data/test/test_name_kh.rb +1 -1
  188. data/test/test_name_kr.rb +1 -1
  189. data/test/test_name_mx.rb +1 -1
  190. data/test/test_name_nb.rb +1 -1
  191. data/test/test_name_nl.rb +1 -1
  192. data/test/test_name_ph.rb +1 -1
  193. data/test/test_name_pl.rb +1 -1
  194. data/test/test_name_ru.rb +1 -1
  195. data/test/test_name_se.rb +1 -1
  196. data/test/test_name_sn.rb +1 -1
  197. data/test/test_name_th.rb +1 -1
  198. data/test/test_name_th_en.rb +1 -1
  199. data/test/test_name_tw.rb +1 -1
  200. data/test/test_name_ua.rb +1 -1
  201. data/test/test_name_vn.rb +1 -1
  202. data/test/test_nato_alphabet.rb +1 -1
  203. data/test/test_phone_number.rb +1 -1
  204. data/test/test_phone_number_au.rb +1 -1
  205. data/test/test_phone_number_br.rb +1 -1
  206. data/test/test_phone_number_cu.rb +1 -1
  207. data/test/test_phone_number_da.rb +1 -1
  208. data/test/test_phone_number_de.rb +1 -1
  209. data/test/test_phone_number_fr.rb +1 -1
  210. data/test/test_phone_number_id.rb +1 -1
  211. data/test/test_phone_number_ja.rb +1 -1
  212. data/test/test_phone_number_kr.rb +1 -1
  213. data/test/test_phone_number_mx.rb +1 -1
  214. data/test/test_phone_number_nl.rb +1 -1
  215. data/test/test_phone_number_pl.rb +1 -1
  216. data/test/test_phone_number_se.rb +1 -1
  217. data/test/test_phone_number_sg.rb +1 -1
  218. data/test/test_phone_number_sn.rb +1 -1
  219. data/test/test_phone_number_tw.rb +1 -1
  220. data/test/test_phone_number_ua.rb +1 -1
  221. data/test/test_products.rb +1 -1
  222. data/test/test_sem_ver.rb +1 -1
  223. data/test/test_skill.rb +1 -1
  224. data/test/test_sport_pl.rb +1 -1
  225. data/test/test_sport_ru.rb +30 -0
  226. data/test/test_sport_us.rb +1 -1
  227. data/test/test_sports.rb +1 -1
  228. data/test/test_ssn.rb +1 -1
  229. data/test/test_ssn_mx.rb +1 -1
  230. data/test/test_ssn_se.rb +1 -1
  231. data/test/test_string.rb +1 -1
  232. data/test/test_time.rb +1 -1
  233. data/test/test_tweet.rb +1 -1
  234. data/test/test_unique_utils.rb +1 -1
  235. data/test/test_units.rb +2 -1
  236. data/test/test_units_english.rb +1 -1
  237. data/test/test_units_metric.rb +1 -1
  238. data/test/test_vehicle.rb +1 -1
  239. data/test/test_venue.rb +1 -1
  240. data/test/test_youtube.rb +1 -1
  241. metadata +206 -161
@@ -0,0 +1,68 @@
1
+ Бадминтон
2
+ Баскетбол
3
+ Бейсбол
4
+ Бокс
5
+ Борьба
6
+ Велоспорт
7
+ Водное поло
8
+ Волейбол
9
+ Гандбол
10
+ Гольф
11
+ Гребля на байдарках и каноэ
12
+ Гребной слалом
13
+ Гребной спорт
14
+ Дзюдо
15
+ Каратэ
16
+ Конный спорт
17
+ Легкая атлетика
18
+ Настольный теннис
19
+ Парусный спорт
20
+ Плавание
21
+ Пляжный волейбол
22
+ Прыжки в воду
23
+ Прыжки на батуте
24
+ Регби
25
+ Серфинг
26
+ Синхронное плавание
27
+ Скалолазание
28
+ Скейтбординг
29
+ Пятиборье
30
+ Софтбол
31
+ Спортивная гимнастика
32
+ Стрельба
33
+ Стрельба из лука
34
+ Теннис
35
+ Триатлон
36
+ Тхэквондо
37
+ Тяжелая атлетика
38
+ Фехтование
39
+ Футбол
40
+ Хоккей на траве
41
+ Художественная гимнастика
42
+ Крикет
43
+ Шахматы
44
+ Лакросс
45
+ Футбол
46
+ Толкание ядра
47
+ Поло
48
+ Покер
49
+ Метание диска
50
+ Метание копья
51
+ Прыжок с шестом
52
+ Дайвинг
53
+ Прыжки в воду
54
+ Прыжки в длину
55
+ Прыжки в высоту
56
+ Рыбалка
57
+ Греко-римская борьба
58
+ Кудо
59
+ Бильярд
60
+ Айкидо
61
+ Дрессура
62
+ Конкур
63
+ Дартс
64
+ Джиу-джитсу
65
+ Самбо
66
+ Сумо
67
+ Скандинавская ходьба
68
+ Фитнес
@@ -0,0 +1,20 @@
1
+ Биатлон
2
+ Бобслей
3
+ Горнолыжный спорт
4
+ Керлинг
5
+ Конькобежный спорт
6
+ Лыжное двоеборье
7
+ Лыжные гонки
8
+ Прыжки на лыжах с трамплина
9
+ Санный спорт
10
+ Скелетон
11
+ Сноуборд
12
+ Фигурное катание на коньках
13
+ Фристайл
14
+ Хоккей
15
+ Шорт-трек
16
+ Юкигассен
17
+ Ледолазание
18
+ Мотогонки на льду
19
+ Гонки на собачьих упряжках
20
+ Катание на ледяных глыбах
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffaker/lorem'
3
+ require_relative 'lorem'
4
4
 
5
5
  module FFaker
6
6
  module FreedomIpsum
@@ -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
@@ -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
@@ -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,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
@@ -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
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.19.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
 
data/scripts/reference.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- $LOAD_PATH << File.dirname(__FILE__) + '/../lib'
4
- require 'ffaker'
3
+ require_relative '../lib/ffaker'
5
4
 
6
5
  ICONS = {
7
6
  error: '‼️',
@@ -25,7 +24,7 @@ end
25
24
  # Returns faker methods for a given module
26
25
  def faker_methods(mod)
27
26
  methods = mod.methods - Module.methods -
28
- %i[k underscore fetch_sample rand shuffle unique]
27
+ %i[k underscore fetch_sample rand shuffle unique luhn_check]
29
28
 
30
29
  # For Company.name (et al), don't discard :name if it was reimplemented
31
30
  methods << :name if mod.send(:name) != mod.to_s