ffaker 2.2.0 → 2.3.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 (320) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +34 -0
  3. data/README.md +4 -0
  4. data/REFERENCE.md +1153 -800
  5. data/Rakefile +23 -24
  6. data/ffaker.gemspec +12 -420
  7. data/lib/ffaker.rb +47 -7
  8. data/lib/ffaker/address.rb +11 -11
  9. data/lib/ffaker/address_au.rb +60 -60
  10. data/lib/ffaker/address_br.rb +5 -5
  11. data/lib/ffaker/address_ca.rb +7 -7
  12. data/lib/ffaker/address_ch.rb +1 -2
  13. data/lib/ffaker/address_ch_de.rb +1 -1
  14. data/lib/ffaker/address_ch_fr.rb +1 -1
  15. data/lib/ffaker/address_ch_it.rb +1 -1
  16. data/lib/ffaker/address_da.rb +5 -5
  17. data/lib/ffaker/address_de.rb +16 -12
  18. data/lib/ffaker/address_fi.rb +7 -8
  19. data/lib/ffaker/address_fr.rb +13 -13
  20. data/lib/ffaker/address_gr.rb +40 -0
  21. data/lib/ffaker/address_in.rb +12 -12
  22. data/lib/ffaker/address_kr.rb +87 -0
  23. data/lib/ffaker/address_mx.rb +409 -409
  24. data/lib/ffaker/address_nl.rb +17 -13
  25. data/lib/ffaker/address_ru.rb +6 -6
  26. data/lib/ffaker/address_se.rb +7 -8
  27. data/lib/ffaker/address_sn.rb +3 -3
  28. data/lib/ffaker/address_ua.rb +8 -8
  29. data/lib/ffaker/address_uk.rb +5 -5
  30. data/lib/ffaker/address_us.rb +9 -9
  31. data/lib/ffaker/airline.rb +16 -0
  32. data/lib/ffaker/avatar.rb +3 -3
  33. data/lib/ffaker/aws.rb +24 -0
  34. data/lib/ffaker/bacon_ipsum.rb +2 -2
  35. data/lib/ffaker/book.rb +45 -0
  36. data/lib/ffaker/boolean.rb +2 -2
  37. data/lib/ffaker/cheesy_lingo.rb +15 -12
  38. data/lib/ffaker/color.rb +54 -1
  39. data/lib/ffaker/color_ua.rb +1 -1
  40. data/lib/ffaker/company.rb +13 -11
  41. data/lib/ffaker/company_cn.rb +23 -0
  42. data/lib/ffaker/company_it.rb +4 -4
  43. data/lib/ffaker/company_se.rb +2 -2
  44. data/lib/ffaker/conference.rb +1 -1
  45. data/lib/ffaker/courses.rb +2 -3
  46. data/lib/ffaker/currency.rb +2 -2
  47. data/lib/ffaker/data/address_gr/city +79 -0
  48. data/lib/ffaker/data/address_gr/region +13 -0
  49. data/lib/ffaker/data/address_gr/street +100 -0
  50. data/lib/ffaker/data/address_kr/boroughs +29 -0
  51. data/lib/ffaker/data/address_kr/cities +51 -0
  52. data/lib/ffaker/data/airline/codes_list +209 -0
  53. data/lib/ffaker/data/airline/names_list +206 -0
  54. data/lib/ffaker/data/aws/ec2_instance_type +59 -0
  55. data/lib/ffaker/data/aws/ec2_reserved_instance_tenancy +3 -0
  56. data/lib/ffaker/data/aws/ec2_reserved_offering_type +6 -0
  57. data/lib/ffaker/data/aws/ec2_reserved_product_description +14 -0
  58. data/lib/ffaker/data/book/adj_and_adv +20 -0
  59. data/lib/ffaker/data/book/genres +369 -0
  60. data/lib/ffaker/data/book/nouns +36 -0
  61. data/lib/ffaker/data/book/prefixes +17 -0
  62. data/lib/ffaker/data/color/names_list +128 -0
  63. data/lib/ffaker/data/education/degree_prefix +274 -0
  64. data/lib/ffaker/data/education/degree_short_prefix +19 -0
  65. data/lib/ffaker/data/job_br/job_nouns +52 -0
  66. data/lib/ffaker/data/job_vn/job_nouns +191 -0
  67. data/lib/ffaker/data/lorem_ja/characters +101 -0
  68. data/lib/ffaker/data/lorem_ja/sentences +30 -0
  69. data/lib/ffaker/data/lorem_ja/sentences_end +21 -0
  70. data/lib/ffaker/data/lorem_ja/words +81 -0
  71. data/lib/ffaker/data/name/first_names_female +4275 -0
  72. data/lib/ffaker/data/name/first_names_male +1219 -0
  73. data/lib/ffaker/data/name_br/first_names_female +1068 -0
  74. data/lib/ffaker/data/name_br/first_names_male +607 -0
  75. data/lib/ffaker/data/name_br/last_names +52 -0
  76. data/lib/ffaker/data/name_gr/female_first_names +80 -0
  77. data/lib/ffaker/data/name_gr/female_last_names +45 -0
  78. data/lib/ffaker/data/name_gr/male_first_names +90 -0
  79. data/lib/ffaker/data/name_gr/male_last_names +57 -0
  80. data/lib/ffaker/data/name_kh/first_names +64 -0
  81. data/lib/ffaker/data/name_kh/last_names +71 -0
  82. data/lib/ffaker/data/name_kh/nick_names +30 -0
  83. data/lib/ffaker/data/name_then/first_names +292 -0
  84. data/lib/ffaker/data/name_then/last_names +63 -0
  85. data/lib/ffaker/data/name_then/nick_names +30 -0
  86. data/lib/ffaker/data/phone_number/phone_calling_code +205 -0
  87. data/lib/ffaker/data/sport/names +57 -24
  88. data/lib/ffaker/data/tweet/hashtag +58 -0
  89. data/lib/ffaker/data/youtube/video_ids +50 -0
  90. data/lib/ffaker/dizzle_ipsum.rb +2 -2
  91. data/lib/ffaker/education.rb +17 -16
  92. data/lib/ffaker/food.rb +5 -6
  93. data/lib/ffaker/gender.rb +4 -4
  94. data/lib/ffaker/gender_br.rb +17 -0
  95. data/lib/ffaker/gender_cn.rb +4 -4
  96. data/lib/ffaker/gender_kr.rb +4 -4
  97. data/lib/ffaker/geolocation.rb +26 -26
  98. data/lib/ffaker/healthcare_ipsum.rb +2 -2
  99. data/lib/ffaker/hipster_ipsum.rb +2 -2
  100. data/lib/ffaker/html_ipsum.rb +101 -81
  101. data/lib/ffaker/identification.rb +4 -4
  102. data/lib/ffaker/identification_br.rb +84 -0
  103. data/lib/ffaker/identification_es.rb +2 -2
  104. data/lib/ffaker/identification_es_cl.rb +7 -5
  105. data/lib/ffaker/identification_es_co.rb +9 -10
  106. data/lib/ffaker/identification_kr.rb +3 -4
  107. data/lib/ffaker/identification_mx.rb +27 -11
  108. data/lib/ffaker/internet.rb +26 -23
  109. data/lib/ffaker/internet_se.rb +21 -21
  110. data/lib/ffaker/job.rb +1 -1
  111. data/lib/ffaker/job_br.rb +12 -0
  112. data/lib/ffaker/job_cn.rb +1 -1
  113. data/lib/ffaker/job_fr.rb +3 -3
  114. data/lib/ffaker/job_ja.rb +2 -1
  115. data/lib/ffaker/job_kr.rb +1 -1
  116. data/lib/ffaker/job_vn.rb +13 -0
  117. data/lib/ffaker/locale.rb +2 -3
  118. data/lib/ffaker/lorem.rb +5 -5
  119. data/lib/ffaker/lorem_ar.rb +4 -4
  120. data/lib/ffaker/lorem_cn.rb +3 -3
  121. data/lib/ffaker/lorem_fr.rb +4 -4
  122. data/lib/ffaker/lorem_ja.rb +40 -0
  123. data/lib/ffaker/lorem_kr.rb +4 -4
  124. data/lib/ffaker/lorem_ua.rb +8 -11
  125. data/lib/ffaker/movie.rb +18 -20
  126. data/lib/ffaker/music.rb +4 -4
  127. data/lib/ffaker/name.rb +100 -11
  128. data/lib/ffaker/name_br.rb +37 -6
  129. data/lib/ffaker/name_cn.rb +2 -2
  130. data/lib/ffaker/name_cs.rb +10 -10
  131. data/lib/ffaker/name_da.rb +6 -6
  132. data/lib/ffaker/name_de.rb +5 -5
  133. data/lib/ffaker/name_fr.rb +4 -4
  134. data/lib/ffaker/name_ga.rb +4 -5
  135. data/lib/ffaker/name_gr.rb +60 -0
  136. data/lib/ffaker/name_it.rb +4 -4
  137. data/lib/ffaker/name_ja.rb +3 -3
  138. data/lib/ffaker/name_kh.rb +22 -0
  139. data/lib/ffaker/name_kr.rb +3 -3
  140. data/lib/ffaker/name_mx.rb +14 -14
  141. data/lib/ffaker/name_nb.rb +5 -5
  142. data/lib/ffaker/name_nl.rb +7 -7
  143. data/lib/ffaker/name_ph.rb +2 -2
  144. data/lib/ffaker/name_ru.rb +7 -8
  145. data/lib/ffaker/name_se.rb +5 -5
  146. data/lib/ffaker/name_sn.rb +23 -23
  147. data/lib/ffaker/name_th.rb +3 -3
  148. data/lib/ffaker/name_th_en.rb +26 -0
  149. data/lib/ffaker/name_ua.rb +8 -8
  150. data/lib/ffaker/name_vn.rb +4 -4
  151. data/lib/ffaker/nato_alphabet.rb +10 -10
  152. data/lib/ffaker/phone_number.rb +31 -21
  153. data/lib/ffaker/phone_number_au.rb +3 -3
  154. data/lib/ffaker/phone_number_br.rb +9 -8
  155. data/lib/ffaker/phone_number_ch.rb +7 -7
  156. data/lib/ffaker/phone_number_cu.rb +5 -5
  157. data/lib/ffaker/phone_number_de.rb +1 -1
  158. data/lib/ffaker/phone_number_fr.rb +4 -4
  159. data/lib/ffaker/phone_number_it.rb +2 -2
  160. data/lib/ffaker/phone_number_kr.rb +4 -4
  161. data/lib/ffaker/phone_number_mx.rb +4 -5
  162. data/lib/ffaker/phone_number_nl.rb +13 -13
  163. data/lib/ffaker/phone_number_se.rb +18 -19
  164. data/lib/ffaker/phone_number_sg.rb +8 -8
  165. data/lib/ffaker/phone_number_sn.rb +2 -2
  166. data/lib/ffaker/product.rb +18 -14
  167. data/lib/ffaker/skill.rb +3 -3
  168. data/lib/ffaker/sport.rb +1 -1
  169. data/lib/ffaker/ssn_se.rb +19 -20
  170. data/lib/ffaker/string.rb +21 -23
  171. data/lib/ffaker/time.rb +19 -7
  172. data/lib/ffaker/tweet.rb +59 -0
  173. data/lib/ffaker/unit.rb +12 -12
  174. data/lib/ffaker/unit_english.rb +34 -35
  175. data/lib/ffaker/unit_metric.rb +25 -25
  176. data/lib/ffaker/utils/array_utils.rb +12 -9
  177. data/lib/ffaker/utils/module_utils.rb +9 -6
  178. data/lib/ffaker/utils/random_utils.rb +33 -0
  179. data/lib/ffaker/vehicle.rb +21 -21
  180. data/lib/ffaker/venue.rb +1 -1
  181. data/lib/ffaker/youtube.rb +24 -0
  182. data/scripts/benchmark.rb +3 -3
  183. data/scripts/reference.rb +26 -23
  184. data/test/helper.rb +50 -0
  185. data/test/test_address.rb +40 -21
  186. data/test/test_address_au.rb +19 -9
  187. data/test/test_address_br.rb +9 -2
  188. data/test/test_address_ca.rb +7 -0
  189. data/test/test_address_ch.rb +6 -2
  190. data/test/test_address_ch_de.rb +7 -3
  191. data/test/test_address_ch_fr.rb +7 -3
  192. data/test/test_address_ch_it.rb +5 -1
  193. data/test/test_address_da.rb +18 -9
  194. data/test/test_address_de.rb +12 -5
  195. data/test/test_address_fi.rb +10 -3
  196. data/test/test_address_fr.rb +13 -0
  197. data/test/test_address_gr.rb +43 -0
  198. data/test/test_address_in.rb +20 -12
  199. data/test/test_address_kr.rb +14 -0
  200. data/test/test_address_mx.rb +12 -5
  201. data/test/test_address_nl.rb +11 -5
  202. data/test/test_address_ru.rb +11 -5
  203. data/test/test_address_se.rb +9 -3
  204. data/test/test_address_sn.rb +7 -1
  205. data/test/test_address_ua.rb +17 -10
  206. data/test/test_address_uk.rb +11 -3
  207. data/test/test_address_us.rb +15 -6
  208. data/test/test_airline.rb +17 -0
  209. data/test/test_array_utils.rb +51 -3
  210. data/test/test_avatar.rb +5 -1
  211. data/test/test_aws.rb +25 -0
  212. data/test/test_bacon_ipsum.rb +12 -6
  213. data/test/test_book.rb +41 -0
  214. data/test/test_boolean.rb +4 -0
  215. data/test/test_cheesy_lingo.rb +14 -10
  216. data/test/test_color.rb +126 -1
  217. data/test/test_color_ua.rb +5 -1
  218. data/test/test_company.rb +7 -0
  219. data/test/test_company_cn.rb +24 -0
  220. data/test/test_company_it.rb +7 -1
  221. data/test/test_company_se.rb +6 -0
  222. data/test/test_conference.rb +5 -2
  223. data/test/test_course_mathematiques.rb +5 -1
  224. data/test/test_course_philosophie.rb +5 -1
  225. data/test/test_currency.rb +12 -0
  226. data/test/test_dizzle_ipsum.rb +12 -6
  227. data/test/test_education.rb +9 -2
  228. data/test/test_faker.rb +8 -1
  229. data/test/test_food.rb +11 -4
  230. data/test/test_gender.rb +5 -1
  231. data/test/test_gender_br.rb +18 -0
  232. data/test/test_gender_cn.rb +5 -2
  233. data/test/test_gender_kr.rb +7 -3
  234. data/test/test_geolocation.rb +11 -8
  235. data/test/test_guid.rb +6 -1
  236. data/test/test_healthcare_ipsum.rb +13 -6
  237. data/test/test_hipster_ipsum.rb +13 -6
  238. data/test/test_html_ipsum.rb +28 -20
  239. data/test/test_identification.rb +9 -2
  240. data/test/test_identification_br.rb +46 -0
  241. data/test/test_identification_co.rb +7 -0
  242. data/test/test_identification_es.rb +5 -1
  243. data/test/test_identification_es_cl.rb +5 -1
  244. data/test/test_identification_es_mx.rb +7 -2
  245. data/test/test_identification_kr.rb +4 -0
  246. data/test/test_internet.rb +36 -5
  247. data/test/test_internet_se.rb +12 -4
  248. data/test/test_job.rb +4 -0
  249. data/test/test_job_br.rb +17 -0
  250. data/test/test_job_cn.rb +4 -0
  251. data/test/test_job_fr.rb +4 -0
  252. data/test/test_job_ja.rb +4 -0
  253. data/test/test_job_kr.rb +4 -0
  254. data/test/test_job_vn.rb +22 -0
  255. data/test/test_locale.rb +10 -4
  256. data/test/test_lorem.rb +18 -11
  257. data/test/test_lorem_ar.rb +16 -8
  258. data/test/test_lorem_cn.rb +9 -2
  259. data/test/test_lorem_fr.rb +16 -8
  260. data/test/test_lorem_ja.rb +81 -0
  261. data/test/test_lorem_kr.rb +17 -8
  262. data/test/test_lorem_ua.rb +15 -8
  263. data/test/test_module_utils.rb +2 -2
  264. data/test/test_movie.rb +5 -1
  265. data/test/test_music.rb +11 -4
  266. data/test/test_name.rb +114 -1
  267. data/test/test_name_br.rb +41 -2
  268. data/test/test_name_cn.rb +7 -0
  269. data/test/test_name_cs.rb +7 -0
  270. data/test/test_name_da.rb +13 -6
  271. data/test/test_name_de.rb +4 -0
  272. data/test/test_name_fr.rb +7 -0
  273. data/test/test_name_ga.rb +7 -0
  274. data/test/test_name_gr.rb +70 -0
  275. data/test/test_name_it.rb +7 -0
  276. data/test/test_name_ja.rb +7 -0
  277. data/test/test_name_kh.rb +32 -0
  278. data/test/test_name_kr.rb +7 -0
  279. data/test/test_name_mx.rb +9 -0
  280. data/test/test_name_nb.rb +8 -0
  281. data/test/test_name_nl.rb +4 -0
  282. data/test/test_name_ph.rb +7 -0
  283. data/test/test_name_ru.rb +10 -3
  284. data/test/test_name_se.rb +12 -4
  285. data/test/test_name_sn.rb +8 -0
  286. data/test/test_name_th.rb +7 -0
  287. data/test/test_name_th_en.rb +35 -0
  288. data/test/test_name_ua.rb +26 -17
  289. data/test/test_name_vn.rb +42 -0
  290. data/test/test_nato_alphabet.rb +15 -4
  291. data/test/test_phone_number.rb +24 -6
  292. data/test/test_phone_number_au.rb +17 -6
  293. data/test/test_phone_number_br.rb +22 -13
  294. data/test/test_phone_number_cu.rb +29 -18
  295. data/test/test_phone_number_da.rb +16 -7
  296. data/test/test_phone_number_de.rb +17 -9
  297. data/test/test_phone_number_kr.rb +9 -0
  298. data/test/test_phone_number_mx.rb +16 -8
  299. data/test/test_phone_number_nl.rb +9 -2
  300. data/test/test_phone_number_se.rb +12 -7
  301. data/test/test_phone_number_sg.rb +17 -9
  302. data/test/test_phone_number_sn.rb +12 -4
  303. data/test/test_products.rb +22 -0
  304. data/test/test_skill.rb +8 -2
  305. data/test/test_sports.rb +4 -0
  306. data/test/test_ssn.rb +3 -1
  307. data/test/test_ssn_mx.rb +6 -1
  308. data/test/test_ssn_se.rb +3 -0
  309. data/test/test_string.rb +28 -1
  310. data/test/test_time.rb +33 -2
  311. data/test/test_tweet.rb +59 -0
  312. data/test/test_units.rb +7 -0
  313. data/test/test_units_english.rb +9 -0
  314. data/test/test_units_metric.rb +9 -0
  315. data/test/test_vehicle.rb +24 -15
  316. data/test/test_venue.rb +5 -1
  317. data/test/test_youtube.rb +28 -0
  318. metadata +101 -5
  319. data/lib/ffaker/data/name/first_names +0 -3008
  320. data/lib/ffaker/data/name_br/first_names +0 -91
@@ -6,15 +6,15 @@ module FFaker
6
6
  extend self
7
7
 
8
8
  def tech_skill
9
- TECH_SKILLS.sample
9
+ fetch_sample(TECH_SKILLS)
10
10
  end
11
11
 
12
12
  def tech_skills(num = 3)
13
- TECH_SKILLS.sample(num)
13
+ fetch_sample(TECH_SKILLS, count: num)
14
14
  end
15
15
 
16
16
  def specialty
17
- "%s %s" % [SPECIALTY_START.sample, SPECIALTY_END.sample]
17
+ format('%s %s', fetch_sample(SPECIALTY_START), fetch_sample(SPECIALTY_END))
18
18
  end
19
19
 
20
20
  def specialties(num = 3)
@@ -4,7 +4,7 @@ module FFaker
4
4
  extend self
5
5
 
6
6
  def name
7
- NAMES.sample
7
+ fetch_sample(NAMES)
8
8
  end
9
9
  end
10
10
  end
@@ -3,7 +3,6 @@
3
3
  require 'date'
4
4
 
5
5
  module FFaker
6
-
7
6
  # The Social Security number is a 12-digit number in the format:
8
7
  # "YYYYDDMM-XXXX'
9
8
  #
@@ -24,12 +23,12 @@ module FFaker
24
23
  extend ModuleUtils
25
24
  extend self
26
25
 
27
- GENDERS = ["female", "male"]
26
+ GENDERS = %w(female male).freeze
28
27
 
29
28
  def ssn(opts = {})
30
29
  from = opts[:from] || ::Time.local(1940, 1, 1)
31
30
  to = opts[:to] || ::Time.now
32
- gender = (opts[:gender] || GENDERS.sample).to_s
31
+ gender = (opts[:gender] || fetch_sample(GENDERS)).to_s
33
32
 
34
33
  raise_error_on_bad_arguments(from, to, gender)
35
34
 
@@ -40,7 +39,7 @@ module FFaker
40
39
 
41
40
  def generate_ssn(from, to, gender)
42
41
  birth_date = random_birth_time_between(from, to)
43
- birth_date_str = birth_date.strftime("%Y%m%d") # "19800228"
42
+ birth_date_str = birth_date.strftime('%Y%m%d') # "19800228"
44
43
  region = get_random_region_for(gender) # "413"
45
44
  ssn_without_check_digit = birth_date_str + region # "19800228413"
46
45
  check_digit = luhn_check(ssn_without_check_digit) # "9"
@@ -48,20 +47,20 @@ module FFaker
48
47
  end
49
48
 
50
49
  def raise_error_on_bad_arguments(from, to, gender)
51
- raise ArgumentError, "Invalid from argument: from" unless to.is_a? ::Time
52
- raise ArgumentError, "Invalid from argument: from" unless from.is_a? ::Time
53
- raise ArgumentError, "Invalid argument: from > to" if from > to
54
- raise ArgumentError, "Invalid argument: gender" unless GENDERS.include?(gender.to_s)
50
+ raise ArgumentError, 'Invalid from argument: from' unless to.is_a? ::Time
51
+ raise ArgumentError, 'Invalid from argument: from' unless from.is_a? ::Time
52
+ raise ArgumentError, 'Invalid argument: from > to' if from > to
53
+ raise ArgumentError, 'Invalid argument: gender' unless GENDERS.include?(gender.to_s)
55
54
  end
56
55
 
57
- def random_birth_time_between(from=::Time.local(1940, 1, 1), to=::Time.now)
56
+ def random_birth_time_between(from = ::Time.local(1940, 1, 1), to = ::Time.now)
58
57
  ::Time.at(from + rand * (to.to_f - from.to_f))
59
58
  end
60
59
 
61
60
  def get_random_region_for(gender)
62
61
  region_number = case gender
63
- when "female" then get_random_region_even
64
- when "male" then get_random_region_odd
62
+ when 'female' then get_random_region_even
63
+ when 'male' then get_random_region_odd
65
64
  end
66
65
  three_character_string(region_number)
67
66
  end
@@ -75,7 +74,7 @@ module FFaker
75
74
  end
76
75
 
77
76
  def three_character_string(number)
78
- "%03d" % number
77
+ '%03d' % number
79
78
  end
80
79
 
81
80
  # http://en.wikipedia.org/wiki/Luhn_algorithm
@@ -83,10 +82,10 @@ module FFaker
83
82
  multiplications = []
84
83
 
85
84
  number.split(//).each_with_index do |digit, i|
86
- if i % 2 == 0
87
- multiplications << digit.to_i * 2
88
- else
89
- multiplications << digit.to_i
85
+ multiplications << if i.even?
86
+ digit.to_i * 2
87
+ else
88
+ digit.to_i
90
89
  end
91
90
  end
92
91
 
@@ -97,10 +96,10 @@ module FFaker
97
96
  end
98
97
  end
99
98
 
100
- if sum % 10 == 0
101
- control_digit = 0
102
- else
103
- control_digit = (sum / 10 + 1) * 10 - sum
99
+ control_digit = if sum % 10 == 0
100
+ 0
101
+ else
102
+ (sum / 10 + 1) * 10 - sum
104
103
  end
105
104
 
106
105
  control_digit.to_s
@@ -5,16 +5,16 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- BACKSLASH = '\\'
9
- DASH = '-'
8
+ BACKSLASH = '\\'.freeze
9
+ DASH = '-'.freeze
10
10
 
11
- LOWERS = [*'a'..'z']
12
- UPPERS = [*'A'..'Z']
11
+ LOWERS = [*'a'..'z'].freeze
12
+ UPPERS = [*'A'..'Z'].freeze
13
13
  LETTERS = LOWERS + UPPERS
14
- NUMBERS = [*'0'..'9']
14
+ NUMBERS = [*'0'..'9'].freeze
15
15
  WORD_CHARS = LETTERS + NUMBERS + ['_']
16
- SPACES = [' ', "\t"]
17
- ESCAPEABLE_CHARS = '\\', '/', '.', '(', ')', '[', ']', '{', '}'
16
+ SPACES = [' ', "\t"].freeze
17
+ ESCAPEABLE_CHARS = ['\\', '/', '.', '(', ')', '[', ']', '{', '}'].freeze
18
18
 
19
19
  def from_regexp(exp)
20
20
  result = ''
@@ -22,9 +22,7 @@ module FFaker
22
22
 
23
23
  # Drop surrounding /'s and split into characters
24
24
  tokens = exp.inspect[1...-1].split(//)
25
- until tokens.empty?
26
- result << process_token(tokens)
27
- end
25
+ result << process_token(tokens) until tokens.empty?
28
26
 
29
27
  result
30
28
  end
@@ -47,24 +45,24 @@ module FFaker
47
45
  end
48
46
 
49
47
  def process_token(tokens)
50
- return "" if tokens.empty?
48
+ return '' if tokens.empty?
51
49
 
52
50
  token = tokens.shift
53
51
 
54
52
  case token
55
- when "?" then
53
+ when '?' then
56
54
  # TODO: Let ? generate nothing
57
- "" # We already printed its target
58
- when "+" then
55
+ '' # We already printed its target
56
+ when '+' then
59
57
  tokens.unshift(token) if rand(2) == 1 # Leave the `+` on to run again
60
58
  process_token(@last_token) # Run the last one at least once
61
- when "*" then
59
+ when '*' then
62
60
  tokens.unshift(token) if rand(2) == 1 # Leave the `*` on to run again
63
- return "" if rand(2) == 1 # Or maybe do nothing
61
+ return '' if rand(2) == 1 # Or maybe do nothing
64
62
  process_token(@last_token) # Else run the last one again
65
- when "{" then
66
- number = ""
67
- while (ch = tokens.shift) != "}"
63
+ when '{' then
64
+ number = ''
65
+ while (ch = tokens.shift) != '}'
68
66
  number << ch
69
67
  end
70
68
  number = number.to_i - 1
@@ -91,7 +89,7 @@ module FFaker
91
89
  end
92
90
  @last_token = ['['] + set + [']']
93
91
 
94
- process_token([generate_range(set).sample])
92
+ process_token([fetch_sample(generate_range(set))])
95
93
  else
96
94
  token
97
95
  end
@@ -99,9 +97,9 @@ module FFaker
99
97
 
100
98
  def special(token)
101
99
  case token
102
- when 'w' then WORD_CHARS.sample
103
- when 'd' then NUMBERS.sample
104
- when 's' then SPACES.sample
100
+ when 'w' then fetch_sample(WORD_CHARS)
101
+ when 'd' then fetch_sample(NUMBERS)
102
+ when 's' then fetch_sample(SPACES)
105
103
  when *ESCAPEABLE_CHARS then token
106
104
  else
107
105
  ''
@@ -5,26 +5,38 @@ module FFaker
5
5
  extend ModuleUtils
6
6
  extend self
7
7
 
8
- MONTHS = %w(January February March April May June July August September October November December)
8
+ MONTHS = %w(January February March April May June July August September October November December).freeze
9
9
 
10
10
  def month
11
- MONTHS.sample
11
+ fetch_sample(MONTHS)
12
12
  end
13
13
 
14
- def date(params={})
14
+ def date(params = {})
15
15
  years_back = params[:year_range] || 5
16
- latest_year = params [:year_latest] || 0
17
- year = (rand * (years_back)).ceil + (::Time.now.year - latest_year - years_back)
16
+ latest_year = params [:year_latest] || 0
17
+ year = (rand * years_back).ceil + (::Time.now.year - latest_year - years_back)
18
18
  month = (rand * 12).ceil
19
19
  day = (rand * 31).ceil
20
- series = [date = ::Time.local(year, month, day)]
20
+ hours = params[:hours] || 0
21
+ minutes = params[:minutes] || 0
22
+ series = [date = ::Time.local(year, month, day, hours, minutes)]
21
23
  if params[:series]
22
24
  params[:series].each do |some_time_after|
23
25
  series << series.last + (rand * some_time_after).ceil
24
26
  end
25
27
  return series
26
28
  end
27
- date.strftime "%Y-%m-%d %T %z"
29
+ date.strftime '%Y-%m-%d %T %z'
30
+ end
31
+
32
+ def datetime(params = {})
33
+ hours = params[:hours] || (rand * 12).ceil
34
+ minutes = params[:minutes] || (rand * 59).ceil
35
+ date(params.merge(hours: hours, minutes: minutes))
36
+ end
37
+
38
+ def between(from, to)
39
+ ::Time.at(from + rand * (to.to_f - from.to_f))
28
40
  end
29
41
  end
30
42
  end
@@ -0,0 +1,59 @@
1
+ # encoding: utf-8
2
+
3
+ module FFaker
4
+ module Tweet
5
+ extend ModuleUtils
6
+ extend self
7
+
8
+ # Options
9
+ # num_hashtags: How many hashtags (default: (skewed (40%) 1-4))
10
+ # num_mentions: How many mentions (default: (skewed (20% 1-2))
11
+ # reply: Add reply? (default: (random 10%)
12
+ # body_length: Target length (rand(20..140)) (will be <= target)
13
+ def tweet(args = {})
14
+ options = {
15
+ num_hashtags: [0, rand(1..10) - 6].max,
16
+ num_mentions: [0, rand(1..10) - 8].max,
17
+ reply: (rand(1..10) == 1),
18
+ body_length: rand(20..140)
19
+ }.merge(args)
20
+
21
+ my_reply = options[:reply] ? "#{mention} " : ''
22
+ my_mentions = options[:num_mentions] > 0 ? "#{mentions(options[:num_mentions])} " : ''
23
+ my_tags = tags(options[:num_hashtags])
24
+
25
+ remaining = [
26
+ options[:body_length],
27
+ 140 - (my_reply.size + my_mentions.size + my_tags.size)
28
+ ].min
29
+
30
+ "#{my_reply}#{body(remaining)}#{my_mentions}#{my_tags}"
31
+ end
32
+
33
+ def mention
34
+ "@#{FFaker::Internet.user_name}"
35
+ end
36
+
37
+ def mentions(num = 2)
38
+ mention_names = []
39
+ num.times{ mention_names << mention }
40
+ mention_names.join(' ')
41
+ end
42
+
43
+ def body(required_length = 140)
44
+ required_length = [required_length, 20].max
45
+ body = ''
46
+ prefix = ''
47
+ until body.size > required_length
48
+ body += "#{prefix}#{FFaker::Lorem.sentence}"
49
+ prefix = ' '
50
+ end
51
+ body[required_length - 1] = '#'
52
+ body.gsub(/\s\S*\#.*$/, '.')
53
+ end
54
+
55
+ def tags(num_tags = 2)
56
+ fetch_sample(HASHTAG, count: num_tags).join(' ')
57
+ end
58
+ end
59
+ end
@@ -8,17 +8,17 @@ module FFaker
8
8
  extend self
9
9
 
10
10
  TIME_UNITS = [
11
- {name: 'Years', abbreviation: 'yr'},
12
- {name: 'Days', abbreviation: 'd'},
13
- {name: 'Hours', abbreviation: 'Minutes'},
14
- {name: 'Seconds', abbreviation: 's'},
15
- {name: 'Milliseconds', abbreviation: 'msec'}
16
- ]
11
+ { name: 'Years', abbreviation: 'yr' },
12
+ { name: 'Days', abbreviation: 'd' },
13
+ { name: 'Hours', abbreviation: 'Minutes' },
14
+ { name: 'Seconds', abbreviation: 's' },
15
+ { name: 'Milliseconds', abbreviation: 'msec' }
16
+ ].freeze
17
17
  TEMPERATURE_UNITS = [
18
- {name: 'Kelvin', abbreviation: 'K'},
19
- {name: 'Celsius', abbreviation: 'C'},
20
- {name: 'Fahrenheit', abbreviation: 'F'}
21
- ]
18
+ { name: 'Kelvin', abbreviation: 'K' },
19
+ { name: 'Celsius', abbreviation: 'C' },
20
+ { name: 'Fahrenheit', abbreviation: 'F' }
21
+ ].freeze
22
22
 
23
23
  def time_name
24
24
  time.name
@@ -39,11 +39,11 @@ module FFaker
39
39
  private
40
40
 
41
41
  def time
42
- OpenStruct.new TIME_UNITS.sample
42
+ OpenStruct.new(fetch_sample(TIME_UNITS))
43
43
  end
44
44
 
45
45
  def temperature
46
- OpenStruct.new TEMPERATURE_UNITS.sample
46
+ OpenStruct.new(fetch_sample(TEMPERATURE_UNITS))
47
47
  end
48
48
  end
49
49
  end
@@ -11,39 +11,39 @@ module FFaker
11
11
  extend self
12
12
 
13
13
  LENGTH_UNITS = [
14
- { name: "inch", abbreviation: "in"},
15
- { name: "foot", abbreviation: "ft"},
16
- { name: "yard", abbreviation: "yd"},
17
- { name: "furlong", abbreviation: "fur"},
18
- { name: "mile", abbreviation: "m"}
19
- ]
14
+ { name: 'inch', abbreviation: 'in' },
15
+ { name: 'foot', abbreviation: 'ft' },
16
+ { name: 'yard', abbreviation: 'yd' },
17
+ { name: 'furlong', abbreviation: 'fur' },
18
+ { name: 'mile', abbreviation: 'm' }
19
+ ].freeze
20
20
  MASS_UNITS = [
21
- { name: "grains", abbreviation: "gr"},
22
- { name: "ounces", abbreviation: "oz"},
23
- { name: "pounds", abbreviation: "lb" },
24
- { name: "hundredweight", abbreviation: "cwt"},
25
- { name: "ton", abbreviation: "t" }
26
- ]
21
+ { name: 'grains', abbreviation: 'gr' },
22
+ { name: 'ounces', abbreviation: 'oz' },
23
+ { name: 'pounds', abbreviation: 'lb' },
24
+ { name: 'hundredweight', abbreviation: 'cwt' },
25
+ { name: 'ton', abbreviation: 't' }
26
+ ].freeze
27
27
  LIQUID_UNITS = [
28
- { name: "fluid ounce", abbreviation: "fl oz"},
29
- { name: "gill", abbreviation: "gi"},
30
- { name: "pint", abbreviation: "pt"},
31
- { name: "quart", abbreviation: "qt"}
32
- ]
28
+ { name: 'fluid ounce', abbreviation: 'fl oz' },
29
+ { name: 'gill', abbreviation: 'gi' },
30
+ { name: 'pint', abbreviation: 'pt' },
31
+ { name: 'quart', abbreviation: 'qt' }
32
+ ].freeze
33
33
  VOLUME_UNITS = [
34
- { name: "cubic inch", abbreviation: "CI"},
35
- { name: "cubic foot", abbreviation: "CFT"},
36
- { name: "cubic yard", abbreviation: "CY"}
37
- ]
34
+ { name: 'cubic inch', abbreviation: 'CI' },
35
+ { name: 'cubic foot', abbreviation: 'CFT' },
36
+ { name: 'cubic yard', abbreviation: 'CY' }
37
+ ].freeze
38
38
  AREA_UNITS = [
39
- { name: "square inch", abbreviation: "sq. in"},
40
- { name: "square foot", abbreviation: "sq ft"},
41
- { name: "square yard", abbreviation: "sq yd"},
42
- { name: "acre", abbreviation: "ac"},
43
- { name: "section", abbreviation: "s"},
44
- { name: "square mile", abbreviation: "sq mi"},
45
- { name: "township", abbreviation: "Twp"}
46
- ]
39
+ { name: 'square inch', abbreviation: 'sq. in' },
40
+ { name: 'square foot', abbreviation: 'sq ft' },
41
+ { name: 'square yard', abbreviation: 'sq yd' },
42
+ { name: 'acre', abbreviation: 'ac' },
43
+ { name: 'section', abbreviation: 's' },
44
+ { name: 'square mile', abbreviation: 'sq mi' },
45
+ { name: 'township', abbreviation: 'Twp' }
46
+ ].freeze
47
47
 
48
48
  def mass_name
49
49
  mass.name
@@ -88,24 +88,23 @@ module FFaker
88
88
  private
89
89
 
90
90
  def length
91
- OpenStruct.new LENGTH_UNITS.sample
91
+ OpenStruct.new(fetch_sample(LENGTH_UNITS))
92
92
  end
93
93
 
94
94
  def mass
95
- OpenStruct.new MASS_UNITS.sample
95
+ OpenStruct.new(fetch_sample(MASS_UNITS))
96
96
  end
97
97
 
98
98
  def liquid
99
- OpenStruct.new LIQUID_UNITS.sample
99
+ OpenStruct.new(fetch_sample(LIQUID_UNITS))
100
100
  end
101
101
 
102
102
  def volume
103
- OpenStruct.new VOLUME_UNITS.sample
103
+ OpenStruct.new(fetch_sample(VOLUME_UNITS))
104
104
  end
105
105
 
106
106
  def area
107
- OpenStruct.new AREA_UNITS.sample
107
+ OpenStruct.new(fetch_sample(AREA_UNITS))
108
108
  end
109
-
110
109
  end
111
110
  end