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.
- checksums.yaml +4 -4
- data/Changelog.md +34 -0
- data/README.md +4 -0
- data/REFERENCE.md +1153 -800
- data/Rakefile +23 -24
- data/ffaker.gemspec +12 -420
- data/lib/ffaker.rb +47 -7
- data/lib/ffaker/address.rb +11 -11
- data/lib/ffaker/address_au.rb +60 -60
- data/lib/ffaker/address_br.rb +5 -5
- data/lib/ffaker/address_ca.rb +7 -7
- data/lib/ffaker/address_ch.rb +1 -2
- data/lib/ffaker/address_ch_de.rb +1 -1
- data/lib/ffaker/address_ch_fr.rb +1 -1
- data/lib/ffaker/address_ch_it.rb +1 -1
- data/lib/ffaker/address_da.rb +5 -5
- data/lib/ffaker/address_de.rb +16 -12
- data/lib/ffaker/address_fi.rb +7 -8
- data/lib/ffaker/address_fr.rb +13 -13
- data/lib/ffaker/address_gr.rb +40 -0
- data/lib/ffaker/address_in.rb +12 -12
- data/lib/ffaker/address_kr.rb +87 -0
- data/lib/ffaker/address_mx.rb +409 -409
- data/lib/ffaker/address_nl.rb +17 -13
- data/lib/ffaker/address_ru.rb +6 -6
- data/lib/ffaker/address_se.rb +7 -8
- data/lib/ffaker/address_sn.rb +3 -3
- data/lib/ffaker/address_ua.rb +8 -8
- data/lib/ffaker/address_uk.rb +5 -5
- data/lib/ffaker/address_us.rb +9 -9
- data/lib/ffaker/airline.rb +16 -0
- data/lib/ffaker/avatar.rb +3 -3
- data/lib/ffaker/aws.rb +24 -0
- data/lib/ffaker/bacon_ipsum.rb +2 -2
- data/lib/ffaker/book.rb +45 -0
- data/lib/ffaker/boolean.rb +2 -2
- data/lib/ffaker/cheesy_lingo.rb +15 -12
- data/lib/ffaker/color.rb +54 -1
- data/lib/ffaker/color_ua.rb +1 -1
- data/lib/ffaker/company.rb +13 -11
- data/lib/ffaker/company_cn.rb +23 -0
- data/lib/ffaker/company_it.rb +4 -4
- data/lib/ffaker/company_se.rb +2 -2
- data/lib/ffaker/conference.rb +1 -1
- data/lib/ffaker/courses.rb +2 -3
- data/lib/ffaker/currency.rb +2 -2
- data/lib/ffaker/data/address_gr/city +79 -0
- data/lib/ffaker/data/address_gr/region +13 -0
- data/lib/ffaker/data/address_gr/street +100 -0
- data/lib/ffaker/data/address_kr/boroughs +29 -0
- data/lib/ffaker/data/address_kr/cities +51 -0
- data/lib/ffaker/data/airline/codes_list +209 -0
- data/lib/ffaker/data/airline/names_list +206 -0
- data/lib/ffaker/data/aws/ec2_instance_type +59 -0
- data/lib/ffaker/data/aws/ec2_reserved_instance_tenancy +3 -0
- data/lib/ffaker/data/aws/ec2_reserved_offering_type +6 -0
- data/lib/ffaker/data/aws/ec2_reserved_product_description +14 -0
- data/lib/ffaker/data/book/adj_and_adv +20 -0
- data/lib/ffaker/data/book/genres +369 -0
- data/lib/ffaker/data/book/nouns +36 -0
- data/lib/ffaker/data/book/prefixes +17 -0
- data/lib/ffaker/data/color/names_list +128 -0
- data/lib/ffaker/data/education/degree_prefix +274 -0
- data/lib/ffaker/data/education/degree_short_prefix +19 -0
- data/lib/ffaker/data/job_br/job_nouns +52 -0
- data/lib/ffaker/data/job_vn/job_nouns +191 -0
- data/lib/ffaker/data/lorem_ja/characters +101 -0
- data/lib/ffaker/data/lorem_ja/sentences +30 -0
- data/lib/ffaker/data/lorem_ja/sentences_end +21 -0
- data/lib/ffaker/data/lorem_ja/words +81 -0
- data/lib/ffaker/data/name/first_names_female +4275 -0
- data/lib/ffaker/data/name/first_names_male +1219 -0
- data/lib/ffaker/data/name_br/first_names_female +1068 -0
- data/lib/ffaker/data/name_br/first_names_male +607 -0
- data/lib/ffaker/data/name_br/last_names +52 -0
- data/lib/ffaker/data/name_gr/female_first_names +80 -0
- data/lib/ffaker/data/name_gr/female_last_names +45 -0
- data/lib/ffaker/data/name_gr/male_first_names +90 -0
- data/lib/ffaker/data/name_gr/male_last_names +57 -0
- data/lib/ffaker/data/name_kh/first_names +64 -0
- data/lib/ffaker/data/name_kh/last_names +71 -0
- data/lib/ffaker/data/name_kh/nick_names +30 -0
- data/lib/ffaker/data/name_then/first_names +292 -0
- data/lib/ffaker/data/name_then/last_names +63 -0
- data/lib/ffaker/data/name_then/nick_names +30 -0
- data/lib/ffaker/data/phone_number/phone_calling_code +205 -0
- data/lib/ffaker/data/sport/names +57 -24
- data/lib/ffaker/data/tweet/hashtag +58 -0
- data/lib/ffaker/data/youtube/video_ids +50 -0
- data/lib/ffaker/dizzle_ipsum.rb +2 -2
- data/lib/ffaker/education.rb +17 -16
- data/lib/ffaker/food.rb +5 -6
- data/lib/ffaker/gender.rb +4 -4
- data/lib/ffaker/gender_br.rb +17 -0
- data/lib/ffaker/gender_cn.rb +4 -4
- data/lib/ffaker/gender_kr.rb +4 -4
- data/lib/ffaker/geolocation.rb +26 -26
- data/lib/ffaker/healthcare_ipsum.rb +2 -2
- data/lib/ffaker/hipster_ipsum.rb +2 -2
- data/lib/ffaker/html_ipsum.rb +101 -81
- data/lib/ffaker/identification.rb +4 -4
- data/lib/ffaker/identification_br.rb +84 -0
- data/lib/ffaker/identification_es.rb +2 -2
- data/lib/ffaker/identification_es_cl.rb +7 -5
- data/lib/ffaker/identification_es_co.rb +9 -10
- data/lib/ffaker/identification_kr.rb +3 -4
- data/lib/ffaker/identification_mx.rb +27 -11
- data/lib/ffaker/internet.rb +26 -23
- data/lib/ffaker/internet_se.rb +21 -21
- data/lib/ffaker/job.rb +1 -1
- data/lib/ffaker/job_br.rb +12 -0
- data/lib/ffaker/job_cn.rb +1 -1
- data/lib/ffaker/job_fr.rb +3 -3
- data/lib/ffaker/job_ja.rb +2 -1
- data/lib/ffaker/job_kr.rb +1 -1
- data/lib/ffaker/job_vn.rb +13 -0
- data/lib/ffaker/locale.rb +2 -3
- data/lib/ffaker/lorem.rb +5 -5
- data/lib/ffaker/lorem_ar.rb +4 -4
- data/lib/ffaker/lorem_cn.rb +3 -3
- data/lib/ffaker/lorem_fr.rb +4 -4
- data/lib/ffaker/lorem_ja.rb +40 -0
- data/lib/ffaker/lorem_kr.rb +4 -4
- data/lib/ffaker/lorem_ua.rb +8 -11
- data/lib/ffaker/movie.rb +18 -20
- data/lib/ffaker/music.rb +4 -4
- data/lib/ffaker/name.rb +100 -11
- data/lib/ffaker/name_br.rb +37 -6
- data/lib/ffaker/name_cn.rb +2 -2
- data/lib/ffaker/name_cs.rb +10 -10
- data/lib/ffaker/name_da.rb +6 -6
- data/lib/ffaker/name_de.rb +5 -5
- data/lib/ffaker/name_fr.rb +4 -4
- data/lib/ffaker/name_ga.rb +4 -5
- data/lib/ffaker/name_gr.rb +60 -0
- data/lib/ffaker/name_it.rb +4 -4
- data/lib/ffaker/name_ja.rb +3 -3
- data/lib/ffaker/name_kh.rb +22 -0
- data/lib/ffaker/name_kr.rb +3 -3
- data/lib/ffaker/name_mx.rb +14 -14
- data/lib/ffaker/name_nb.rb +5 -5
- data/lib/ffaker/name_nl.rb +7 -7
- data/lib/ffaker/name_ph.rb +2 -2
- data/lib/ffaker/name_ru.rb +7 -8
- data/lib/ffaker/name_se.rb +5 -5
- data/lib/ffaker/name_sn.rb +23 -23
- data/lib/ffaker/name_th.rb +3 -3
- data/lib/ffaker/name_th_en.rb +26 -0
- data/lib/ffaker/name_ua.rb +8 -8
- data/lib/ffaker/name_vn.rb +4 -4
- data/lib/ffaker/nato_alphabet.rb +10 -10
- data/lib/ffaker/phone_number.rb +31 -21
- data/lib/ffaker/phone_number_au.rb +3 -3
- data/lib/ffaker/phone_number_br.rb +9 -8
- data/lib/ffaker/phone_number_ch.rb +7 -7
- data/lib/ffaker/phone_number_cu.rb +5 -5
- data/lib/ffaker/phone_number_de.rb +1 -1
- data/lib/ffaker/phone_number_fr.rb +4 -4
- data/lib/ffaker/phone_number_it.rb +2 -2
- data/lib/ffaker/phone_number_kr.rb +4 -4
- data/lib/ffaker/phone_number_mx.rb +4 -5
- data/lib/ffaker/phone_number_nl.rb +13 -13
- data/lib/ffaker/phone_number_se.rb +18 -19
- data/lib/ffaker/phone_number_sg.rb +8 -8
- data/lib/ffaker/phone_number_sn.rb +2 -2
- data/lib/ffaker/product.rb +18 -14
- data/lib/ffaker/skill.rb +3 -3
- data/lib/ffaker/sport.rb +1 -1
- data/lib/ffaker/ssn_se.rb +19 -20
- data/lib/ffaker/string.rb +21 -23
- data/lib/ffaker/time.rb +19 -7
- data/lib/ffaker/tweet.rb +59 -0
- data/lib/ffaker/unit.rb +12 -12
- data/lib/ffaker/unit_english.rb +34 -35
- data/lib/ffaker/unit_metric.rb +25 -25
- data/lib/ffaker/utils/array_utils.rb +12 -9
- data/lib/ffaker/utils/module_utils.rb +9 -6
- data/lib/ffaker/utils/random_utils.rb +33 -0
- data/lib/ffaker/vehicle.rb +21 -21
- data/lib/ffaker/venue.rb +1 -1
- data/lib/ffaker/youtube.rb +24 -0
- data/scripts/benchmark.rb +3 -3
- data/scripts/reference.rb +26 -23
- data/test/helper.rb +50 -0
- data/test/test_address.rb +40 -21
- data/test/test_address_au.rb +19 -9
- data/test/test_address_br.rb +9 -2
- data/test/test_address_ca.rb +7 -0
- data/test/test_address_ch.rb +6 -2
- data/test/test_address_ch_de.rb +7 -3
- data/test/test_address_ch_fr.rb +7 -3
- data/test/test_address_ch_it.rb +5 -1
- data/test/test_address_da.rb +18 -9
- data/test/test_address_de.rb +12 -5
- data/test/test_address_fi.rb +10 -3
- data/test/test_address_fr.rb +13 -0
- data/test/test_address_gr.rb +43 -0
- data/test/test_address_in.rb +20 -12
- data/test/test_address_kr.rb +14 -0
- data/test/test_address_mx.rb +12 -5
- data/test/test_address_nl.rb +11 -5
- data/test/test_address_ru.rb +11 -5
- data/test/test_address_se.rb +9 -3
- data/test/test_address_sn.rb +7 -1
- data/test/test_address_ua.rb +17 -10
- data/test/test_address_uk.rb +11 -3
- data/test/test_address_us.rb +15 -6
- data/test/test_airline.rb +17 -0
- data/test/test_array_utils.rb +51 -3
- data/test/test_avatar.rb +5 -1
- data/test/test_aws.rb +25 -0
- data/test/test_bacon_ipsum.rb +12 -6
- data/test/test_book.rb +41 -0
- data/test/test_boolean.rb +4 -0
- data/test/test_cheesy_lingo.rb +14 -10
- data/test/test_color.rb +126 -1
- data/test/test_color_ua.rb +5 -1
- data/test/test_company.rb +7 -0
- data/test/test_company_cn.rb +24 -0
- data/test/test_company_it.rb +7 -1
- data/test/test_company_se.rb +6 -0
- data/test/test_conference.rb +5 -2
- data/test/test_course_mathematiques.rb +5 -1
- data/test/test_course_philosophie.rb +5 -1
- data/test/test_currency.rb +12 -0
- data/test/test_dizzle_ipsum.rb +12 -6
- data/test/test_education.rb +9 -2
- data/test/test_faker.rb +8 -1
- data/test/test_food.rb +11 -4
- data/test/test_gender.rb +5 -1
- data/test/test_gender_br.rb +18 -0
- data/test/test_gender_cn.rb +5 -2
- data/test/test_gender_kr.rb +7 -3
- data/test/test_geolocation.rb +11 -8
- data/test/test_guid.rb +6 -1
- data/test/test_healthcare_ipsum.rb +13 -6
- data/test/test_hipster_ipsum.rb +13 -6
- data/test/test_html_ipsum.rb +28 -20
- data/test/test_identification.rb +9 -2
- data/test/test_identification_br.rb +46 -0
- data/test/test_identification_co.rb +7 -0
- data/test/test_identification_es.rb +5 -1
- data/test/test_identification_es_cl.rb +5 -1
- data/test/test_identification_es_mx.rb +7 -2
- data/test/test_identification_kr.rb +4 -0
- data/test/test_internet.rb +36 -5
- data/test/test_internet_se.rb +12 -4
- data/test/test_job.rb +4 -0
- data/test/test_job_br.rb +17 -0
- data/test/test_job_cn.rb +4 -0
- data/test/test_job_fr.rb +4 -0
- data/test/test_job_ja.rb +4 -0
- data/test/test_job_kr.rb +4 -0
- data/test/test_job_vn.rb +22 -0
- data/test/test_locale.rb +10 -4
- data/test/test_lorem.rb +18 -11
- data/test/test_lorem_ar.rb +16 -8
- data/test/test_lorem_cn.rb +9 -2
- data/test/test_lorem_fr.rb +16 -8
- data/test/test_lorem_ja.rb +81 -0
- data/test/test_lorem_kr.rb +17 -8
- data/test/test_lorem_ua.rb +15 -8
- data/test/test_module_utils.rb +2 -2
- data/test/test_movie.rb +5 -1
- data/test/test_music.rb +11 -4
- data/test/test_name.rb +114 -1
- data/test/test_name_br.rb +41 -2
- data/test/test_name_cn.rb +7 -0
- data/test/test_name_cs.rb +7 -0
- data/test/test_name_da.rb +13 -6
- data/test/test_name_de.rb +4 -0
- data/test/test_name_fr.rb +7 -0
- data/test/test_name_ga.rb +7 -0
- data/test/test_name_gr.rb +70 -0
- data/test/test_name_it.rb +7 -0
- data/test/test_name_ja.rb +7 -0
- data/test/test_name_kh.rb +32 -0
- data/test/test_name_kr.rb +7 -0
- data/test/test_name_mx.rb +9 -0
- data/test/test_name_nb.rb +8 -0
- data/test/test_name_nl.rb +4 -0
- data/test/test_name_ph.rb +7 -0
- data/test/test_name_ru.rb +10 -3
- data/test/test_name_se.rb +12 -4
- data/test/test_name_sn.rb +8 -0
- data/test/test_name_th.rb +7 -0
- data/test/test_name_th_en.rb +35 -0
- data/test/test_name_ua.rb +26 -17
- data/test/test_name_vn.rb +42 -0
- data/test/test_nato_alphabet.rb +15 -4
- data/test/test_phone_number.rb +24 -6
- data/test/test_phone_number_au.rb +17 -6
- data/test/test_phone_number_br.rb +22 -13
- data/test/test_phone_number_cu.rb +29 -18
- data/test/test_phone_number_da.rb +16 -7
- data/test/test_phone_number_de.rb +17 -9
- data/test/test_phone_number_kr.rb +9 -0
- data/test/test_phone_number_mx.rb +16 -8
- data/test/test_phone_number_nl.rb +9 -2
- data/test/test_phone_number_se.rb +12 -7
- data/test/test_phone_number_sg.rb +17 -9
- data/test/test_phone_number_sn.rb +12 -4
- data/test/test_products.rb +22 -0
- data/test/test_skill.rb +8 -2
- data/test/test_sports.rb +4 -0
- data/test/test_ssn.rb +3 -1
- data/test/test_ssn_mx.rb +6 -1
- data/test/test_ssn_se.rb +3 -0
- data/test/test_string.rb +28 -1
- data/test/test_time.rb +33 -2
- data/test/test_tweet.rb +59 -0
- data/test/test_units.rb +7 -0
- data/test/test_units_english.rb +9 -0
- data/test/test_units_metric.rb +9 -0
- data/test/test_vehicle.rb +24 -15
- data/test/test_venue.rb +5 -1
- data/test/test_youtube.rb +28 -0
- metadata +101 -5
- data/lib/ffaker/data/name/first_names +0 -3008
- data/lib/ffaker/data/name_br/first_names +0 -91
data/lib/ffaker/skill.rb
CHANGED
|
@@ -6,15 +6,15 @@ module FFaker
|
|
|
6
6
|
extend self
|
|
7
7
|
|
|
8
8
|
def tech_skill
|
|
9
|
-
TECH_SKILLS
|
|
9
|
+
fetch_sample(TECH_SKILLS)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
def tech_skills(num = 3)
|
|
13
|
-
TECH_SKILLS
|
|
13
|
+
fetch_sample(TECH_SKILLS, count: num)
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
def specialty
|
|
17
|
-
|
|
17
|
+
format('%s %s', fetch_sample(SPECIALTY_START), fetch_sample(SPECIALTY_END))
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
def specialties(num = 3)
|
data/lib/ffaker/sport.rb
CHANGED
data/lib/ffaker/ssn_se.rb
CHANGED
|
@@ -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 =
|
|
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
|
|
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(
|
|
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,
|
|
52
|
-
raise ArgumentError,
|
|
53
|
-
raise ArgumentError,
|
|
54
|
-
raise ArgumentError,
|
|
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
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
-
|
|
102
|
-
|
|
103
|
-
|
|
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
|
data/lib/ffaker/string.rb
CHANGED
|
@@ -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
|
|
48
|
+
return '' if tokens.empty?
|
|
51
49
|
|
|
52
50
|
token = tokens.shift
|
|
53
51
|
|
|
54
52
|
case token
|
|
55
|
-
when
|
|
53
|
+
when '?' then
|
|
56
54
|
# TODO: Let ? generate nothing
|
|
57
|
-
|
|
58
|
-
when
|
|
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
|
|
59
|
+
when '*' then
|
|
62
60
|
tokens.unshift(token) if rand(2) == 1 # Leave the `*` on to run again
|
|
63
|
-
return
|
|
61
|
+
return '' if rand(2) == 1 # Or maybe do nothing
|
|
64
62
|
process_token(@last_token) # Else run the last one again
|
|
65
|
-
when
|
|
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)
|
|
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
|
|
103
|
-
when 'd' then NUMBERS
|
|
104
|
-
when 's' then SPACES
|
|
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
|
''
|
data/lib/ffaker/time.rb
CHANGED
|
@@ -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
|
|
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
|
|
17
|
-
year = (rand *
|
|
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
|
-
|
|
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
|
|
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
|
data/lib/ffaker/tweet.rb
ADDED
|
@@ -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
|
data/lib/ffaker/unit.rb
CHANGED
|
@@ -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
|
|
42
|
+
OpenStruct.new(fetch_sample(TIME_UNITS))
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def temperature
|
|
46
|
-
OpenStruct.new
|
|
46
|
+
OpenStruct.new(fetch_sample(TEMPERATURE_UNITS))
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|
data/lib/ffaker/unit_english.rb
CHANGED
|
@@ -11,39 +11,39 @@ module FFaker
|
|
|
11
11
|
extend self
|
|
12
12
|
|
|
13
13
|
LENGTH_UNITS = [
|
|
14
|
-
{ name:
|
|
15
|
-
{ name:
|
|
16
|
-
{
|
|
17
|
-
{ name:
|
|
18
|
-
{ name:
|
|
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:
|
|
22
|
-
{ name:
|
|
23
|
-
{ name:
|
|
24
|
-
{ name:
|
|
25
|
-
{ name:
|
|
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:
|
|
29
|
-
{ name:
|
|
30
|
-
{ name:
|
|
31
|
-
{ name:
|
|
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:
|
|
35
|
-
{ name:
|
|
36
|
-
{ name:
|
|
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:
|
|
40
|
-
{ name:
|
|
41
|
-
{ name:
|
|
42
|
-
{ name:
|
|
43
|
-
{ name:
|
|
44
|
-
{ name:
|
|
45
|
-
{ name:
|
|
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
|
|
91
|
+
OpenStruct.new(fetch_sample(LENGTH_UNITS))
|
|
92
92
|
end
|
|
93
93
|
|
|
94
94
|
def mass
|
|
95
|
-
OpenStruct.new
|
|
95
|
+
OpenStruct.new(fetch_sample(MASS_UNITS))
|
|
96
96
|
end
|
|
97
97
|
|
|
98
98
|
def liquid
|
|
99
|
-
OpenStruct.new
|
|
99
|
+
OpenStruct.new(fetch_sample(LIQUID_UNITS))
|
|
100
100
|
end
|
|
101
101
|
|
|
102
102
|
def volume
|
|
103
|
-
OpenStruct.new
|
|
103
|
+
OpenStruct.new(fetch_sample(VOLUME_UNITS))
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
def area
|
|
107
|
-
OpenStruct.new
|
|
107
|
+
OpenStruct.new(fetch_sample(AREA_UNITS))
|
|
108
108
|
end
|
|
109
|
-
|
|
110
109
|
end
|
|
111
110
|
end
|