ffaker 2.18.0 → 2.19.0

Sign up to get free protection for your applications and to get access to all the features.
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